shadow-css-SEB4SDQE.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347
  1. import "./chunk-A5ICIBVI.js";
  2. // node_modules/@stencil/core/internal/client/shadow-css.js
  3. var safeSelector = (selector) => {
  4. const placeholders = [];
  5. let index = 0;
  6. let content;
  7. selector = selector.replace(/(\[[^\]]*\])/g, (_, keep) => {
  8. const replaceBy = `__ph-${index}__`;
  9. placeholders.push(keep);
  10. index++;
  11. return replaceBy;
  12. });
  13. content = selector.replace(/(:nth-[-\w]+)(\([^)]+\))/g, (_, pseudo, exp) => {
  14. const replaceBy = `__ph-${index}__`;
  15. placeholders.push(exp);
  16. index++;
  17. return pseudo + replaceBy;
  18. });
  19. const ss = {
  20. content,
  21. placeholders
  22. };
  23. return ss;
  24. };
  25. var restoreSafeSelector = (placeholders, content) => {
  26. return content.replace(/__ph-(\d+)__/g, (_, index) => placeholders[+index]);
  27. };
  28. var _polyfillHost = "-shadowcsshost";
  29. var _polyfillSlotted = "-shadowcssslotted";
  30. var _polyfillHostContext = "-shadowcsscontext";
  31. var _parenSuffix = ")(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))?([^,{]*)";
  32. var _cssColonHostRe = new RegExp("(" + _polyfillHost + _parenSuffix, "gim");
  33. var _cssColonHostContextRe = new RegExp("(" + _polyfillHostContext + _parenSuffix, "gim");
  34. var _cssColonSlottedRe = new RegExp("(" + _polyfillSlotted + _parenSuffix, "gim");
  35. var _polyfillHostNoCombinator = _polyfillHost + "-no-combinator";
  36. var _polyfillHostNoCombinatorRe = /-shadowcsshost-no-combinator([^\s]*)/;
  37. var _shadowDOMSelectorsRe = [/::shadow/g, /::content/g];
  38. var _selectorReSuffix = "([>\\s~+[.,{:][\\s\\S]*)?$";
  39. var _polyfillHostRe = /-shadowcsshost/gim;
  40. var _colonHostRe = /:host/gim;
  41. var _colonSlottedRe = /::slotted/gim;
  42. var _colonHostContextRe = /:host-context/gim;
  43. var _commentRe = /\/\*\s*[\s\S]*?\*\//g;
  44. var stripComments = (input) => {
  45. return input.replace(_commentRe, "");
  46. };
  47. var _commentWithHashRe = /\/\*\s*#\s*source(Mapping)?URL=[\s\S]+?\*\//g;
  48. var extractCommentsWithHash = (input) => {
  49. return input.match(_commentWithHashRe) || [];
  50. };
  51. var _ruleRe = /(\s*)([^;\{\}]+?)(\s*)((?:{%BLOCK%}?\s*;?)|(?:\s*;))/g;
  52. var _curlyRe = /([{}])/g;
  53. var _selectorPartsRe = /(^.*?[^\\])??((:+)(.*)|$)/;
  54. var OPEN_CURLY = "{";
  55. var CLOSE_CURLY = "}";
  56. var BLOCK_PLACEHOLDER = "%BLOCK%";
  57. var processRules = (input, ruleCallback) => {
  58. const inputWithEscapedBlocks = escapeBlocks(input);
  59. let nextBlockIndex = 0;
  60. return inputWithEscapedBlocks.escapedString.replace(_ruleRe, (...m) => {
  61. const selector = m[2];
  62. let content = "";
  63. let suffix = m[4];
  64. let contentPrefix = "";
  65. if (suffix && suffix.startsWith("{" + BLOCK_PLACEHOLDER)) {
  66. content = inputWithEscapedBlocks.blocks[nextBlockIndex++];
  67. suffix = suffix.substring(BLOCK_PLACEHOLDER.length + 1);
  68. contentPrefix = "{";
  69. }
  70. const cssRule = {
  71. selector,
  72. content
  73. };
  74. const rule = ruleCallback(cssRule);
  75. return `${m[1]}${rule.selector}${m[3]}${contentPrefix}${rule.content}${suffix}`;
  76. });
  77. };
  78. var escapeBlocks = (input) => {
  79. const inputParts = input.split(_curlyRe);
  80. const resultParts = [];
  81. const escapedBlocks = [];
  82. let bracketCount = 0;
  83. let currentBlockParts = [];
  84. for (let partIndex = 0; partIndex < inputParts.length; partIndex++) {
  85. const part = inputParts[partIndex];
  86. if (part === CLOSE_CURLY) {
  87. bracketCount--;
  88. }
  89. if (bracketCount > 0) {
  90. currentBlockParts.push(part);
  91. } else {
  92. if (currentBlockParts.length > 0) {
  93. escapedBlocks.push(currentBlockParts.join(""));
  94. resultParts.push(BLOCK_PLACEHOLDER);
  95. currentBlockParts = [];
  96. }
  97. resultParts.push(part);
  98. }
  99. if (part === OPEN_CURLY) {
  100. bracketCount++;
  101. }
  102. }
  103. if (currentBlockParts.length > 0) {
  104. escapedBlocks.push(currentBlockParts.join(""));
  105. resultParts.push(BLOCK_PLACEHOLDER);
  106. }
  107. const strEscapedBlocks = {
  108. escapedString: resultParts.join(""),
  109. blocks: escapedBlocks
  110. };
  111. return strEscapedBlocks;
  112. };
  113. var insertPolyfillHostInCssText = (selector) => {
  114. selector = selector.replace(_colonHostContextRe, _polyfillHostContext).replace(_colonHostRe, _polyfillHost).replace(_colonSlottedRe, _polyfillSlotted);
  115. return selector;
  116. };
  117. var convertColonRule = (cssText, regExp, partReplacer) => {
  118. return cssText.replace(regExp, (...m) => {
  119. if (m[2]) {
  120. const parts = m[2].split(",");
  121. const r = [];
  122. for (let i = 0; i < parts.length; i++) {
  123. const p = parts[i].trim();
  124. if (!p)
  125. break;
  126. r.push(partReplacer(_polyfillHostNoCombinator, p, m[3]));
  127. }
  128. return r.join(",");
  129. } else {
  130. return _polyfillHostNoCombinator + m[3];
  131. }
  132. });
  133. };
  134. var colonHostPartReplacer = (host, part, suffix) => {
  135. return host + part.replace(_polyfillHost, "") + suffix;
  136. };
  137. var convertColonHost = (cssText) => {
  138. return convertColonRule(cssText, _cssColonHostRe, colonHostPartReplacer);
  139. };
  140. var colonHostContextPartReplacer = (host, part, suffix) => {
  141. if (part.indexOf(_polyfillHost) > -1) {
  142. return colonHostPartReplacer(host, part, suffix);
  143. } else {
  144. return host + part + suffix + ", " + part + " " + host + suffix;
  145. }
  146. };
  147. var convertColonSlotted = (cssText, slotScopeId) => {
  148. const slotClass = "." + slotScopeId + " > ";
  149. const selectors = [];
  150. cssText = cssText.replace(_cssColonSlottedRe, (...m) => {
  151. if (m[2]) {
  152. const compound = m[2].trim();
  153. const suffix = m[3];
  154. const slottedSelector = slotClass + compound + suffix;
  155. let prefixSelector = "";
  156. for (let i = m[4] - 1; i >= 0; i--) {
  157. const char = m[5][i];
  158. if (char === "}" || char === ",") {
  159. break;
  160. }
  161. prefixSelector = char + prefixSelector;
  162. }
  163. const orgSelector = prefixSelector + slottedSelector;
  164. const addedSelector = `${prefixSelector.trimRight()}${slottedSelector.trim()}`;
  165. if (orgSelector.trim() !== addedSelector.trim()) {
  166. const updatedSelector = `${addedSelector}, ${orgSelector}`;
  167. selectors.push({
  168. orgSelector,
  169. updatedSelector
  170. });
  171. }
  172. return slottedSelector;
  173. } else {
  174. return _polyfillHostNoCombinator + m[3];
  175. }
  176. });
  177. return {
  178. selectors,
  179. cssText
  180. };
  181. };
  182. var convertColonHostContext = (cssText) => {
  183. return convertColonRule(cssText, _cssColonHostContextRe, colonHostContextPartReplacer);
  184. };
  185. var convertShadowDOMSelectors = (cssText) => {
  186. return _shadowDOMSelectorsRe.reduce((result, pattern) => result.replace(pattern, " "), cssText);
  187. };
  188. var makeScopeMatcher = (scopeSelector2) => {
  189. const lre = /\[/g;
  190. const rre = /\]/g;
  191. scopeSelector2 = scopeSelector2.replace(lre, "\\[").replace(rre, "\\]");
  192. return new RegExp("^(" + scopeSelector2 + ")" + _selectorReSuffix, "m");
  193. };
  194. var selectorNeedsScoping = (selector, scopeSelector2) => {
  195. const re = makeScopeMatcher(scopeSelector2);
  196. return !re.test(selector);
  197. };
  198. var injectScopingSelector = (selector, scopingSelector) => {
  199. return selector.replace(_selectorPartsRe, (_, before = "", _colonGroup, colon = "", after = "") => {
  200. return before + scopingSelector + colon + after;
  201. });
  202. };
  203. var applySimpleSelectorScope = (selector, scopeSelector2, hostSelector) => {
  204. _polyfillHostRe.lastIndex = 0;
  205. if (_polyfillHostRe.test(selector)) {
  206. const replaceBy = `.${hostSelector}`;
  207. return selector.replace(_polyfillHostNoCombinatorRe, (_, selector2) => injectScopingSelector(selector2, replaceBy)).replace(_polyfillHostRe, replaceBy + " ");
  208. }
  209. return scopeSelector2 + " " + selector;
  210. };
  211. var applyStrictSelectorScope = (selector, scopeSelector2, hostSelector) => {
  212. const isRe = /\[is=([^\]]*)\]/g;
  213. scopeSelector2 = scopeSelector2.replace(isRe, (_, ...parts) => parts[0]);
  214. const className = "." + scopeSelector2;
  215. const _scopeSelectorPart = (p) => {
  216. let scopedP = p.trim();
  217. if (!scopedP) {
  218. return "";
  219. }
  220. if (p.indexOf(_polyfillHostNoCombinator) > -1) {
  221. scopedP = applySimpleSelectorScope(p, scopeSelector2, hostSelector);
  222. } else {
  223. const t = p.replace(_polyfillHostRe, "");
  224. if (t.length > 0) {
  225. scopedP = injectScopingSelector(t, className);
  226. }
  227. }
  228. return scopedP;
  229. };
  230. const safeContent = safeSelector(selector);
  231. selector = safeContent.content;
  232. let scopedSelector = "";
  233. let startIndex = 0;
  234. let res;
  235. const sep = /( |>|\+|~(?!=))\s*/g;
  236. const hasHost = selector.indexOf(_polyfillHostNoCombinator) > -1;
  237. let shouldScope = !hasHost;
  238. while ((res = sep.exec(selector)) !== null) {
  239. const separator = res[1];
  240. const part2 = selector.slice(startIndex, res.index).trim();
  241. shouldScope = shouldScope || part2.indexOf(_polyfillHostNoCombinator) > -1;
  242. const scopedPart = shouldScope ? _scopeSelectorPart(part2) : part2;
  243. scopedSelector += `${scopedPart} ${separator} `;
  244. startIndex = sep.lastIndex;
  245. }
  246. const part = selector.substring(startIndex);
  247. shouldScope = shouldScope || part.indexOf(_polyfillHostNoCombinator) > -1;
  248. scopedSelector += shouldScope ? _scopeSelectorPart(part) : part;
  249. return restoreSafeSelector(safeContent.placeholders, scopedSelector);
  250. };
  251. var scopeSelector = (selector, scopeSelectorText, hostSelector, slotSelector) => {
  252. return selector.split(",").map((shallowPart) => {
  253. if (slotSelector && shallowPart.indexOf("." + slotSelector) > -1) {
  254. return shallowPart.trim();
  255. }
  256. if (selectorNeedsScoping(shallowPart, scopeSelectorText)) {
  257. return applyStrictSelectorScope(shallowPart, scopeSelectorText, hostSelector).trim();
  258. } else {
  259. return shallowPart.trim();
  260. }
  261. }).join(", ");
  262. };
  263. var scopeSelectors = (cssText, scopeSelectorText, hostSelector, slotSelector, commentOriginalSelector) => {
  264. return processRules(cssText, (rule) => {
  265. let selector = rule.selector;
  266. let content = rule.content;
  267. if (rule.selector[0] !== "@") {
  268. selector = scopeSelector(rule.selector, scopeSelectorText, hostSelector, slotSelector);
  269. } else if (rule.selector.startsWith("@media") || rule.selector.startsWith("@supports") || rule.selector.startsWith("@page") || rule.selector.startsWith("@document")) {
  270. content = scopeSelectors(rule.content, scopeSelectorText, hostSelector, slotSelector);
  271. }
  272. const cssRule = {
  273. selector: selector.replace(/\s{2,}/g, " ").trim(),
  274. content
  275. };
  276. return cssRule;
  277. });
  278. };
  279. var scopeCssText = (cssText, scopeId, hostScopeId, slotScopeId, commentOriginalSelector) => {
  280. cssText = insertPolyfillHostInCssText(cssText);
  281. cssText = convertColonHost(cssText);
  282. cssText = convertColonHostContext(cssText);
  283. const slotted = convertColonSlotted(cssText, slotScopeId);
  284. cssText = slotted.cssText;
  285. cssText = convertShadowDOMSelectors(cssText);
  286. if (scopeId) {
  287. cssText = scopeSelectors(cssText, scopeId, hostScopeId, slotScopeId);
  288. }
  289. cssText = cssText.replace(/-shadowcsshost-no-combinator/g, `.${hostScopeId}`);
  290. cssText = cssText.replace(/>\s*\*\s+([^{, ]+)/gm, " $1 ");
  291. return {
  292. cssText: cssText.trim(),
  293. slottedSelectors: slotted.selectors
  294. };
  295. };
  296. var scopeCss = (cssText, scopeId, commentOriginalSelector) => {
  297. const hostScopeId = scopeId + "-h";
  298. const slotScopeId = scopeId + "-s";
  299. const commentsWithHash = extractCommentsWithHash(cssText);
  300. cssText = stripComments(cssText);
  301. const orgSelectors = [];
  302. if (commentOriginalSelector) {
  303. const processCommentedSelector = (rule) => {
  304. const placeholder = `/*!@___${orgSelectors.length}___*/`;
  305. const comment = `/*!@${rule.selector}*/`;
  306. orgSelectors.push({ placeholder, comment });
  307. rule.selector = placeholder + rule.selector;
  308. return rule;
  309. };
  310. cssText = processRules(cssText, (rule) => {
  311. if (rule.selector[0] !== "@") {
  312. return processCommentedSelector(rule);
  313. } else if (rule.selector.startsWith("@media") || rule.selector.startsWith("@supports") || rule.selector.startsWith("@page") || rule.selector.startsWith("@document")) {
  314. rule.content = processRules(rule.content, processCommentedSelector);
  315. return rule;
  316. }
  317. return rule;
  318. });
  319. }
  320. const scoped = scopeCssText(cssText, scopeId, hostScopeId, slotScopeId);
  321. cssText = [scoped.cssText, ...commentsWithHash].join("\n");
  322. if (commentOriginalSelector) {
  323. orgSelectors.forEach(({ placeholder, comment }) => {
  324. cssText = cssText.replace(placeholder, comment);
  325. });
  326. }
  327. scoped.slottedSelectors.forEach((slottedSelector) => {
  328. cssText = cssText.replace(slottedSelector.orgSelector, slottedSelector.updatedSelector);
  329. });
  330. return cssText;
  331. };
  332. export {
  333. scopeCss
  334. };
  335. /**
  336. * @license
  337. * Copyright Google Inc. All Rights Reserved.
  338. *
  339. * Use of this source code is governed by an MIT-style license that can be
  340. * found in the LICENSE file at https://angular.io/license
  341. *
  342. * This file is a port of shadowCSS from webcomponents.js to TypeScript.
  343. * https://github.com/webcomponents/webcomponentsjs/blob/4efecd7e0e/src/ShadowCSS/ShadowCSS.js
  344. * https://github.com/angular/angular/blob/master/packages/compiler/src/shadow_css.ts
  345. */
  346. //# sourceMappingURL=shadow-css-SEB4SDQE.js.map