UNPKG

@ant-design/icons

Version:

[![NPM version](https://img.shields.io/npm/v/@ant-design/icons.svg?style=flat)](https://npmjs.org/package/@ant-design/icons) [![NPM downloads](http://img.shields.io/npm/dm/@ant-design/icons.svg?style=flat)](https://npmjs.org/package/@ant-design/icons)

162 lines (161 loc) 4.39 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getShadowRoot = getShadowRoot; exports.updateCSS = updateCSS; exports.warningOnce = warningOnce; const APPEND_ORDER = 'data-rc-order'; const APPEND_PRIORITY = 'data-rc-priority'; const MARK_KEY = 'rc-util-key'; const containerCache = new Map(); function canUseDom() { return !!(typeof window !== 'undefined' && window.document && window.document.createElement); } function contains(root, node) { if (!root || !node) { return false; } if (root.contains) { return root.contains(node); } let current = node; while (current) { if (current === root) { return true; } current = current.parentNode; } return false; } function getMark({ mark } = {}) { if (mark) { return mark.startsWith('data-') ? mark : `data-${mark}`; } return MARK_KEY; } function getContainer(option) { if (option.attachTo) { return option.attachTo; } const head = document.querySelector('head'); return head || document.body; } function getOrder(prepend) { if (prepend === 'queue') { return 'prependQueue'; } return prepend ? 'prepend' : 'append'; } function findStyles(container) { return Array.from((containerCache.get(container) || container).children).filter(node => node.tagName === 'STYLE'); } function injectCSS(css, option = {}) { if (!canUseDom()) { return null; } const { csp, prepend, priority = 0 } = option; const mergedOrder = getOrder(prepend); const isPrependQueue = mergedOrder === 'prependQueue'; const styleNode = document.createElement('style'); styleNode.setAttribute(APPEND_ORDER, mergedOrder); if (isPrependQueue && priority) { styleNode.setAttribute(APPEND_PRIORITY, `${priority}`); } if (csp?.nonce) { styleNode.nonce = csp.nonce; } styleNode.innerHTML = css; const container = getContainer(option); const { firstChild } = container; if (prepend) { if (isPrependQueue) { const existStyle = (option.styles || findStyles(container)).filter(node => { if (!['prepend', 'prependQueue'].includes(node.getAttribute(APPEND_ORDER))) { return false; } const nodePriority = Number(node.getAttribute(APPEND_PRIORITY) || 0); return priority >= nodePriority; }); if (existStyle.length) { container.insertBefore(styleNode, existStyle[existStyle.length - 1].nextSibling); return styleNode; } } container.insertBefore(styleNode, firstChild); } else { container.appendChild(styleNode); } return styleNode; } function findExistNode(key, option = {}) { let { styles } = option; styles ||= findStyles(getContainer(option)); return styles.find(node => node.getAttribute(getMark(option)) === key); } function syncRealContainer(container, option) { const cachedRealContainer = containerCache.get(container); if (!cachedRealContainer || !contains(document, cachedRealContainer)) { const placeholderStyle = injectCSS('', option); if (!placeholderStyle) { return; } const { parentNode } = placeholderStyle; containerCache.set(container, parentNode); container.removeChild(placeholderStyle); } } function updateCSS(css, key, originOption = {}) { if (!canUseDom()) { return null; } const container = getContainer(originOption); const styles = findStyles(container); const option = { ...originOption, styles }; syncRealContainer(container, option); const existNode = findExistNode(key, option); if (existNode) { if (option.csp?.nonce && existNode.nonce !== option.csp.nonce) { existNode.nonce = option.csp.nonce; } if (existNode.innerHTML !== css) { existNode.innerHTML = css; } return existNode; } const newNode = injectCSS(css, option); newNode?.setAttribute(getMark(option), key); return newNode; } function getRoot(ele) { return ele?.getRootNode?.(); } function getShadowRoot(ele) { const root = getRoot(ele); return typeof ShadowRoot !== 'undefined' && root instanceof ShadowRoot ? root : null; } const warned = {}; function warningOnce(valid, message) { if (valid || warned[message]) { return; } if (process.env.NODE_ENV !== 'production' && typeof console !== 'undefined') { console.error(`Warning: ${message}`); } warned[message] = true; }