@ukic/web-components 3.29.0 → 3.31.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/components/ic-accordion.js +53 -38
  2. package/components/ic-accordion.js.map +1 -1
  3. package/components/ic-button2.js +1 -1
  4. package/components/ic-button2.js.map +1 -1
  5. package/components/ic-link2.js +1 -1
  6. package/components/ic-link2.js.map +1 -1
  7. package/components/ic-menu-item2.js +1 -1
  8. package/components/ic-menu-item2.js.map +1 -1
  9. package/components/ic-menu2.js +276 -37
  10. package/components/ic-menu2.js.map +1 -1
  11. package/components/ic-navigation-button.js +8 -5
  12. package/components/ic-navigation-button.js.map +1 -1
  13. package/components/ic-navigation-group.js +9 -5
  14. package/components/ic-navigation-group.js.map +1 -1
  15. package/components/ic-radio-group.js +3 -3
  16. package/components/ic-radio-group.js.map +1 -1
  17. package/components/ic-side-navigation.js.map +1 -1
  18. package/components/ic-switch.js.map +1 -1
  19. package/dist/cjs/ic-accordion.cjs.entry.js +53 -38
  20. package/dist/cjs/ic-accordion.cjs.entry.js.map +1 -1
  21. package/dist/cjs/ic-button_3.cjs.entry.js +1 -1
  22. package/dist/cjs/ic-button_3.cjs.entry.js.map +1 -1
  23. package/dist/cjs/ic-input-component-container_3.cjs.entry.js +276 -37
  24. package/dist/cjs/ic-input-component-container_3.cjs.entry.js.map +1 -1
  25. package/dist/cjs/ic-link.cjs.entry.js +1 -1
  26. package/dist/cjs/ic-link.cjs.entry.js.map +1 -1
  27. package/dist/cjs/ic-menu-item.cjs.entry.js +1 -1
  28. package/dist/cjs/ic-menu-item.cjs.entry.js.map +1 -1
  29. package/dist/cjs/ic-navigation-button.cjs.entry.js +8 -5
  30. package/dist/cjs/ic-navigation-button.cjs.entry.js.map +1 -1
  31. package/dist/cjs/ic-navigation-group.cjs.entry.js +9 -5
  32. package/dist/cjs/ic-navigation-group.cjs.entry.js.map +1 -1
  33. package/dist/cjs/ic-radio-group.cjs.entry.js +3 -3
  34. package/dist/cjs/ic-radio-group.cjs.entry.js.map +1 -1
  35. package/dist/cjs/ic-section-container.cjs.entry.js.map +1 -1
  36. package/dist/collection/components/ic-accordion/ic-accordion.js +53 -38
  37. package/dist/collection/components/ic-accordion/ic-accordion.js.map +1 -1
  38. package/dist/collection/components/ic-button/ic-button.css +6 -0
  39. package/dist/collection/components/ic-link/ic-link.css +4 -0
  40. package/dist/collection/components/ic-menu/ic-menu.css +14 -5
  41. package/dist/collection/components/ic-menu-item/ic-menu-item.css +13 -6
  42. package/dist/collection/components/ic-navigation-button/ic-navigation-button.js +8 -5
  43. package/dist/collection/components/ic-navigation-button/ic-navigation-button.js.map +1 -1
  44. package/dist/collection/components/ic-navigation-group/ic-navigation-group.js +9 -5
  45. package/dist/collection/components/ic-navigation-group/ic-navigation-group.js.map +1 -1
  46. package/dist/collection/components/ic-radio-group/ic-radio-group.js +3 -3
  47. package/dist/collection/components/ic-radio-group/ic-radio-group.js.map +1 -1
  48. package/dist/collection/utils/common-helpers.js +1 -1
  49. package/dist/collection/utils/common-helpers.js.map +1 -1
  50. package/dist/components/ic-accordion.js +53 -38
  51. package/dist/components/ic-accordion.js.map +1 -1
  52. package/dist/components/ic-button2.js +1 -1
  53. package/dist/components/ic-button2.js.map +1 -1
  54. package/dist/components/ic-hero.js.map +1 -1
  55. package/dist/components/ic-link2.js +1 -1
  56. package/dist/components/ic-link2.js.map +1 -1
  57. package/dist/components/ic-menu-item2.js +1 -1
  58. package/dist/components/ic-menu-item2.js.map +1 -1
  59. package/dist/components/ic-menu2.js +276 -37
  60. package/dist/components/ic-menu2.js.map +1 -1
  61. package/dist/components/ic-navigation-button.js +8 -5
  62. package/dist/components/ic-navigation-button.js.map +1 -1
  63. package/dist/components/ic-navigation-group.js +9 -5
  64. package/dist/components/ic-navigation-group.js.map +1 -1
  65. package/dist/components/ic-radio-group.js +3 -3
  66. package/dist/components/ic-radio-group.js.map +1 -1
  67. package/dist/components/ic-switch.js.map +1 -1
  68. package/dist/core/core.esm.js +1 -1
  69. package/dist/core/{p-9ced00a7.entry.js → p-41bbdc4c.entry.js} +2 -2
  70. package/dist/core/{p-9ced00a7.entry.js.map → p-41bbdc4c.entry.js.map} +1 -1
  71. package/dist/core/p-51fc7809.entry.js +2 -0
  72. package/dist/core/p-51fc7809.entry.js.map +1 -0
  73. package/dist/core/{p-e5266c19.entry.js → p-67048b2e.entry.js} +2 -2
  74. package/dist/core/{p-e5266c19.entry.js.map → p-67048b2e.entry.js.map} +1 -1
  75. package/dist/core/p-756b4cb3.entry.js +2 -0
  76. package/dist/core/p-756b4cb3.entry.js.map +1 -0
  77. package/dist/core/p-78e56db1.entry.js +2 -0
  78. package/dist/core/p-78e56db1.entry.js.map +1 -0
  79. package/dist/core/{p-1cfaa962.entry.js → p-95849ac2.entry.js} +2 -2
  80. package/dist/core/p-95849ac2.entry.js.map +1 -0
  81. package/dist/core/{p-fc4b7d2b.entry.js → p-9cf35c23.entry.js} +2 -2
  82. package/dist/core/p-9cf35c23.entry.js.map +1 -0
  83. package/dist/core/p-a8d98164.entry.js.map +1 -1
  84. package/dist/core/p-e5178830.entry.js +3 -0
  85. package/dist/core/p-e5178830.entry.js.map +1 -0
  86. package/dist/esm/ic-accordion.entry.js +53 -38
  87. package/dist/esm/ic-accordion.entry.js.map +1 -1
  88. package/dist/esm/ic-button_3.entry.js +1 -1
  89. package/dist/esm/ic-button_3.entry.js.map +1 -1
  90. package/dist/esm/ic-input-component-container_3.entry.js +276 -37
  91. package/dist/esm/ic-input-component-container_3.entry.js.map +1 -1
  92. package/dist/esm/ic-link.entry.js +1 -1
  93. package/dist/esm/ic-link.entry.js.map +1 -1
  94. package/dist/esm/ic-menu-item.entry.js +1 -1
  95. package/dist/esm/ic-menu-item.entry.js.map +1 -1
  96. package/dist/esm/ic-navigation-button.entry.js +8 -5
  97. package/dist/esm/ic-navigation-button.entry.js.map +1 -1
  98. package/dist/esm/ic-navigation-group.entry.js +9 -5
  99. package/dist/esm/ic-navigation-group.entry.js.map +1 -1
  100. package/dist/esm/ic-radio-group.entry.js +3 -3
  101. package/dist/esm/ic-radio-group.entry.js.map +1 -1
  102. package/dist/esm/ic-section-container.entry.js.map +1 -1
  103. package/dist/types/components/ic-accordion/ic-accordion.d.ts +2 -0
  104. package/dist/types/components/ic-navigation-group/ic-navigation-group.d.ts +1 -0
  105. package/hydrate/index.js +351 -90
  106. package/hydrate/index.mjs +351 -90
  107. package/package.json +4 -2
  108. package/dist/core/p-1cfaa962.entry.js.map +0 -1
  109. package/dist/core/p-305d9639.entry.js +0 -3
  110. package/dist/core/p-305d9639.entry.js.map +0 -1
  111. package/dist/core/p-98dee727.entry.js +0 -2
  112. package/dist/core/p-98dee727.entry.js.map +0 -1
  113. package/dist/core/p-be8bbed8.entry.js +0 -2
  114. package/dist/core/p-be8bbed8.entry.js.map +0 -1
  115. package/dist/core/p-c0b70c08.entry.js +0 -2
  116. package/dist/core/p-c0b70c08.entry.js.map +0 -1
  117. package/dist/core/p-fc4b7d2b.entry.js.map +0 -1
@@ -97,7 +97,7 @@ var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof win
97
97
 
98
98
  var purify = {exports: {}};
99
99
 
100
- /*! @license DOMPurify 3.4.11 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.4.11/LICENSE */
100
+ /*! @license DOMPurify 3.4.13 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.4.13/LICENSE */
101
101
 
102
102
  (function (module, exports) {
103
103
  (function (global, factory) {
@@ -414,7 +414,7 @@ var purify = {exports: {}};
414
414
  const text = freeze(['#text']);
415
415
 
416
416
  const html = freeze(['accept', 'action', 'align', 'alt', 'autocapitalize', 'autocomplete', 'autopictureinpicture', 'autoplay', 'background', 'bgcolor', 'border', 'capture', 'cellpadding', 'cellspacing', 'checked', 'cite', 'class', 'clear', 'color', 'cols', 'colspan', 'command', 'commandfor', 'controls', 'controlslist', 'coords', 'crossorigin', 'datetime', 'decoding', 'default', 'dir', 'disabled', 'disablepictureinpicture', 'disableremoteplayback', 'download', 'draggable', 'enctype', 'enterkeyhint', 'exportparts', 'face', 'for', 'headers', 'height', 'hidden', 'high', 'href', 'hreflang', 'id', 'inert', 'inputmode', 'integrity', 'ismap', 'kind', 'label', 'lang', 'list', 'loading', 'loop', 'low', 'max', 'maxlength', 'media', 'method', 'min', 'minlength', 'multiple', 'muted', 'name', 'nonce', 'noshade', 'novalidate', 'nowrap', 'open', 'optimum', 'part', 'pattern', 'placeholder', 'playsinline', 'popover', 'popovertarget', 'popovertargetaction', 'poster', 'preload', 'pubdate', 'radiogroup', 'readonly', 'rel', 'required', 'rev', 'reversed', 'role', 'rows', 'rowspan', 'spellcheck', 'scope', 'selected', 'shape', 'size', 'sizes', 'slot', 'span', 'srclang', 'start', 'src', 'srcset', 'step', 'style', 'summary', 'tabindex', 'title', 'translate', 'type', 'usemap', 'valign', 'value', 'width', 'wrap', 'xmlns']);
417
- const svg = freeze(['accent-height', 'accumulate', 'additive', 'alignment-baseline', 'amplitude', 'ascent', 'attributename', 'attributetype', 'azimuth', 'basefrequency', 'baseline-shift', 'begin', 'bias', 'by', 'class', 'clip', 'clippathunits', 'clip-path', 'clip-rule', 'color', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'cx', 'cy', 'd', 'dx', 'dy', 'diffuseconstant', 'direction', 'display', 'divisor', 'dur', 'edgemode', 'elevation', 'end', 'exponent', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'filterunits', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'fx', 'fy', 'g1', 'g2', 'glyph-name', 'glyphref', 'gradientunits', 'gradienttransform', 'height', 'href', 'id', 'image-rendering', 'in', 'in2', 'intercept', 'k', 'k1', 'k2', 'k3', 'k4', 'kerning', 'keypoints', 'keysplines', 'keytimes', 'lang', 'lengthadjust', 'letter-spacing', 'kernelmatrix', 'kernelunitlength', 'lighting-color', 'local', 'marker-end', 'marker-mid', 'marker-start', 'markerheight', 'markerunits', 'markerwidth', 'maskcontentunits', 'maskunits', 'max', 'mask', 'mask-type', 'media', 'method', 'mode', 'min', 'name', 'numoctaves', 'offset', 'operator', 'opacity', 'order', 'orient', 'orientation', 'origin', 'overflow', 'paint-order', 'path', 'pathlength', 'patterncontentunits', 'patterntransform', 'patternunits', 'points', 'preservealpha', 'preserveaspectratio', 'primitiveunits', 'r', 'rx', 'ry', 'radius', 'refx', 'refy', 'repeatcount', 'repeatdur', 'restart', 'result', 'rotate', 'scale', 'seed', 'shape-rendering', 'slope', 'specularconstant', 'specularexponent', 'spreadmethod', 'startoffset', 'stddeviation', 'stitchtiles', 'stop-color', 'stop-opacity', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke', 'stroke-width', 'style', 'surfacescale', 'systemlanguage', 'tabindex', 'tablevalues', 'targetx', 'targety', 'transform', 'transform-origin', 'text-anchor', 'text-decoration', 'text-rendering', 'textlength', 'type', 'u1', 'u2', 'unicode', 'values', 'viewbox', 'visibility', 'version', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'width', 'word-spacing', 'wrap', 'writing-mode', 'xchannelselector', 'ychannelselector', 'x', 'x1', 'x2', 'xmlns', 'y', 'y1', 'y2', 'z', 'zoomandpan']);
417
+ const svg = freeze(['accent-height', 'accumulate', 'additive', 'alignment-baseline', 'amplitude', 'ascent', 'attributename', 'attributetype', 'azimuth', 'basefrequency', 'baseline-shift', 'begin', 'bias', 'by', 'class', 'clip', 'clippathunits', 'clip-path', 'clip-rule', 'color', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'cx', 'cy', 'd', 'dx', 'dy', 'diffuseconstant', 'direction', 'display', 'divisor', 'dominant-baseline', 'dur', 'edgemode', 'elevation', 'end', 'exponent', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'filterunits', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'fx', 'fy', 'g1', 'g2', 'glyph-name', 'glyphref', 'gradientunits', 'gradienttransform', 'height', 'href', 'id', 'image-rendering', 'in', 'in2', 'intercept', 'k', 'k1', 'k2', 'k3', 'k4', 'kerning', 'keypoints', 'keysplines', 'keytimes', 'lang', 'lengthadjust', 'letter-spacing', 'kernelmatrix', 'kernelunitlength', 'lighting-color', 'local', 'marker-end', 'marker-mid', 'marker-start', 'markerheight', 'markerunits', 'markerwidth', 'maskcontentunits', 'maskunits', 'max', 'mask', 'mask-type', 'media', 'method', 'mode', 'min', 'name', 'numoctaves', 'offset', 'operator', 'opacity', 'order', 'orient', 'orientation', 'origin', 'overflow', 'paint-order', 'path', 'pathlength', 'patterncontentunits', 'patterntransform', 'patternunits', 'points', 'preservealpha', 'preserveaspectratio', 'primitiveunits', 'r', 'rx', 'ry', 'radius', 'refx', 'refy', 'repeatcount', 'repeatdur', 'restart', 'result', 'rotate', 'scale', 'seed', 'shape-rendering', 'slope', 'specularconstant', 'specularexponent', 'spreadmethod', 'startoffset', 'stddeviation', 'stitchtiles', 'stop-color', 'stop-opacity', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke', 'stroke-width', 'style', 'surfacescale', 'systemlanguage', 'tabindex', 'tablevalues', 'targetx', 'targety', 'transform', 'transform-origin', 'text-anchor', 'text-decoration', 'text-orientation', 'text-rendering', 'textlength', 'type', 'u1', 'u2', 'unicode', 'values', 'viewbox', 'visibility', 'version', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'width', 'word-spacing', 'wrap', 'writing-mode', 'xchannelselector', 'ychannelselector', 'x', 'x1', 'x2', 'xmlns', 'y', 'y1', 'y2', 'z', 'zoomandpan']);
418
418
  const mathMl = freeze(['accent', 'accentunder', 'align', 'bevelled', 'close', 'columnalign', 'columnlines', 'columnspacing', 'columnspan', 'denomalign', 'depth', 'dir', 'display', 'displaystyle', 'encoding', 'fence', 'frame', 'height', 'href', 'id', 'largeop', 'length', 'linethickness', 'lquote', 'lspace', 'mathbackground', 'mathcolor', 'mathsize', 'mathvariant', 'maxsize', 'minsize', 'movablelimits', 'notation', 'numalign', 'open', 'rowalign', 'rowlines', 'rowspacing', 'rowspan', 'rspace', 'rquote', 'scriptlevel', 'scriptminsize', 'scriptsizemultiplier', 'selection', 'separator', 'separators', 'stretchy', 'subscriptshift', 'supscriptshift', 'symmetric', 'voffset', 'width', 'xmlns']);
419
419
  const xml = freeze(['xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:xlink']);
420
420
 
@@ -527,7 +527,7 @@ var purify = {exports: {}};
527
527
  function createDOMPurify() {
528
528
  let window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();
529
529
  const DOMPurify = root => createDOMPurify(root);
530
- DOMPurify.version = '3.4.11';
530
+ DOMPurify.version = '3.4.13';
531
531
  DOMPurify.removed = [];
532
532
  if (!window || !window.document || window.document.nodeType !== NODE_TYPE.document || !window.Element) {
533
533
  // Not running in a browser, provide a factory function
@@ -554,6 +554,7 @@ var purify = {exports: {}};
554
554
  const getAttributes = lookupGetter(ElementPrototype, 'attributes');
555
555
  const getNodeType = Node && Node.prototype ? lookupGetter(Node.prototype, 'nodeType') : null;
556
556
  const getNodeName = Node && Node.prototype ? lookupGetter(Node.prototype, 'nodeName') : null;
557
+ const getOwnerDocument = Node && Node.prototype ? lookupGetter(Node.prototype, 'ownerDocument') : null;
557
558
  // As per issue #47, the web-components registry is inherited by a
558
559
  // new document created via createHTMLDocument. As per the spec
559
560
  // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries)
@@ -1205,6 +1206,13 @@ var purify = {exports: {}};
1205
1206
  * @param root the in-place root to empty
1206
1207
  */
1207
1208
  const _neutralizeRoot = function _neutralizeRoot(root) {
1209
+ /* Strip every disallowed attribute (on* handlers included) off the whole
1210
+ subtree BEFORE detaching anything. Detaching first would hand back
1211
+ handler-bearing originals (e.g. an already-loading `<img onerror>`)
1212
+ whose queued resource event still fires in page scope after we throw.
1213
+ Clobber-safe reads; a doomed clobbered node's own attributes are
1214
+ irrelevant while its non-clobbered descendants are reached and scrubbed. */
1215
+ _neutralizeSubtree(root);
1208
1216
  const childNodes = getChildNodes(root);
1209
1217
  if (childNodes) {
1210
1218
  const snapshot = [];
@@ -1332,6 +1340,82 @@ var purify = {exports: {}};
1332
1340
  }
1333
1341
  }
1334
1342
  };
1343
+ /**
1344
+ * _neutralizePatchLinkage
1345
+ *
1346
+ * IN_PLACE entry pre-pass (declarative-partial-updates / streaming
1347
+ * hardening, https://github.com/WICG/declarative-partial-updates).
1348
+ *
1349
+ * The main walk strips patch linkage (`for`/`patchsrc`) and removes range
1350
+ * markers (PIs / markup comments) node-by-node, in document order, AS it
1351
+ * reaches each node. On a live in-place root that leaves a window: from the
1352
+ * moment the root is connected until the walk arrives at a given node, that
1353
+ * node's linkage is live. A patch applied on connection/stream can fire as
1354
+ * a microtask during the walk and inject or teleport an unsanitized DOM
1355
+ * range into a region the iterator has already passed and will not revisit,
1356
+ * so the post-return "tree is sanitized" contract is violated. Sweep the
1357
+ * whole tree once up front and sever every linkage before the walk begins,
1358
+ * closing that window.
1359
+ *
1360
+ * This CANNOT undo a patch that already fired before sanitize ran — that is
1361
+ * the irreducible "do not IN_PLACE a live-connected attacker tree" caveat —
1362
+ * but it closes everything from sanitize-start onward. Gated on SAFE_FOR_XML
1363
+ * to group with the rest of the declarative-partial-updates handling and
1364
+ * stay overridable, consistent with the codebase.
1365
+ *
1366
+ * Clobber-safe traversal (cached childNodes getter); per-node try/catch so a
1367
+ * clobbered root cannot defeat the sweep of its non-clobbered descendants.
1368
+ *
1369
+ * NOTE (pending real-Chrome confirmation, see test/declarative-patch-probe
1370
+ * .html Q1): this mirrors the existing policy of keeping `for` on
1371
+ * <label>/<output>. If the shipping feature can drive a patch through a
1372
+ * surviving `for`-on-label/output + `id` pair, this pre-pass and the
1373
+ * attribute check at _isBasicCustomElement's caller must additionally drop
1374
+ * that pair on the IN_PLACE path. Left as-is until the taxonomy is verified.
1375
+ *
1376
+ * @param root the in-place root to sweep
1377
+ */
1378
+ const _neutralizePatchLinkage = function _neutralizePatchLinkage(root) {
1379
+ if (!SAFE_FOR_XML) {
1380
+ return;
1381
+ }
1382
+ const stack = [root];
1383
+ while (stack.length > 0) {
1384
+ const node = stack.pop();
1385
+ const nodeType = getNodeType ? getNodeType(node) : node.nodeType;
1386
+ /* Remove range markers (the target side of a patch linkage): every
1387
+ processing instruction, and any markup-bearing comment. */
1388
+ if (nodeType === NODE_TYPE.processingInstruction || nodeType === NODE_TYPE.comment && regExpTest(COMMENT_MARKUP_PROBE, node.data)) {
1389
+ try {
1390
+ remove(node);
1391
+ } catch (_) {
1392
+ /* Best-effort */
1393
+ }
1394
+ continue;
1395
+ }
1396
+ /* Strip patch-source attributes (the source side) off elements. */
1397
+ if (nodeType === NODE_TYPE.element) {
1398
+ const element = node;
1399
+ const lcTag = transformCaseFunc(getNodeName ? getNodeName(node) : node.nodeName);
1400
+ try {
1401
+ if (element.hasAttribute && element.hasAttribute('patchsrc')) {
1402
+ element.removeAttribute('patchsrc');
1403
+ }
1404
+ if (element.hasAttribute && element.hasAttribute('for') && lcTag !== 'label' && lcTag !== 'output') {
1405
+ element.removeAttribute('for');
1406
+ }
1407
+ } catch (_) {
1408
+ /* Clobbered removeAttribute/hasAttribute on a doomed node — ignore */
1409
+ }
1410
+ }
1411
+ const childNodes = getChildNodes(node);
1412
+ if (childNodes) {
1413
+ for (let i = childNodes.length - 1; i >= 0; --i) {
1414
+ stack.push(childNodes[i]);
1415
+ }
1416
+ }
1417
+ }
1418
+ };
1335
1419
  /**
1336
1420
  * _initDocument
1337
1421
  *
@@ -1389,7 +1473,17 @@ var purify = {exports: {}};
1389
1473
  * @return The created NodeIterator
1390
1474
  */
1391
1475
  const _createNodeIterator = function _createNodeIterator(root) {
1392
- return createNodeIterator.call(root.ownerDocument || root, root,
1476
+ /* Read ownerDocument through the cached Node.prototype getter, never the
1477
+ direct property. HTMLFormElement has [LegacyOverrideBuiltIns], so a
1478
+ clobbering child (<input name="ownerDocument"> or a form-associated
1479
+ external input) shadows the prototype getter and makes a direct read
1480
+ return that <input>. createNodeIterator.call(<input>, ...) then throws
1481
+ "Illegal invocation", and on the IN_PLACE path that throw lands before
1482
+ the walk's fail-closed barrier - leaving the caller's live tree, with
1483
+ any already-armed handler in it, un-neutralized. The cached getter
1484
+ returns the real Document regardless of the clobber. */
1485
+ const doc = getOwnerDocument ? getOwnerDocument(root) : root.ownerDocument;
1486
+ return createNodeIterator.call(doc || root, root,
1393
1487
  // eslint-disable-next-line no-bitwise
1394
1488
  NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT | NodeFilter.SHOW_PROCESSING_INSTRUCTION | NodeFilter.SHOW_CDATA_SECTION, null);
1395
1489
  };
@@ -1429,7 +1523,11 @@ var purify = {exports: {}};
1429
1523
  const _scrubTemplateExpressions2 = function _scrubTemplateExpressions(node) {
1430
1524
  var _node$querySelectorAl;
1431
1525
  node.normalize();
1432
- const walker = createNodeIterator.call(node.ownerDocument || node, node,
1526
+ /* Clobber-safe ownerDocument read, same reasoning as _createNodeIterator:
1527
+ under SAFE_FOR_TEMPLATES this runs on the live IN_PLACE root, which may
1528
+ carry a form-named-getter override of ownerDocument. */
1529
+ const doc = getOwnerDocument ? getOwnerDocument(node) : node.ownerDocument;
1530
+ const walker = createNodeIterator.call(doc || node, node,
1433
1531
  // eslint-disable-next-line no-bitwise
1434
1532
  NodeFilter.SHOW_TEXT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_CDATA_SECTION | NodeFilter.SHOW_PROCESSING_INSTRUCTION, null);
1435
1533
  let currentNode = walker.nextNode();
@@ -1582,15 +1680,21 @@ var purify = {exports: {}};
1582
1680
  /**
1583
1681
  * Handle a node whose tag is forbidden or not allowlisted: keep
1584
1682
  * allowed custom elements (false return exits _sanitizeElements
1585
- * early - namespace/fallback checks and the afterSanitizeElements
1586
- * hook are intentionally skipped for kept custom elements), else
1587
- * hoist content per KEEP_CONTENT and remove.
1683
+ * early - the namespace and fallback-tag removal checks are
1684
+ * intentionally skipped for kept custom elements), else hoist
1685
+ * content per KEEP_CONTENT and remove.
1686
+ *
1687
+ * A kept custom element is the ONLY case in which this function
1688
+ * returns false, so the caller uses that return value to run the
1689
+ * afterSanitizeElements hook on the kept element and keep the
1690
+ * element-hook lifecycle consistent with normal allowlisted
1691
+ * elements (GHSA-c2j3-45gr-mqc4).
1588
1692
  *
1589
1693
  * @param currentNode the disallowed node
1590
1694
  * @param tagName the node's transformCaseFunc'd tag name
1591
1695
  * @return true if the node was removed, false if kept
1592
1696
  */
1593
- const _sanitizeDisallowedNode = function _sanitizeDisallowedNode(currentNode, tagName) {
1697
+ const _sanitizeDisallowedNode = function _sanitizeDisallowedNode(currentNode, tagName, root) {
1594
1698
  /* Check if we have a custom element to handle */
1595
1699
  if (!FORBID_TAGS[tagName] && _isBasicCustomElement(tagName)) {
1596
1700
  if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName)) {
@@ -1613,27 +1717,26 @@ var purify = {exports: {}};
1613
1717
  const childNodes = getChildNodes(currentNode);
1614
1718
  if (childNodes && parentNode) {
1615
1719
  const childCount = childNodes.length;
1616
- /* In-place: hoist the *original* children so the iterator visits
1617
- and sanitises them through the same allowlist pass as every other
1618
- node. The caller built the tree in the live document, so the
1619
- originals carry already-queued resource events (`<img onerror>`,
1620
- `<video>`/`<audio>` error, lazy/`onload`, …); cloning would leave
1621
- those originals detached but still armed, firing in page scope
1622
- while the returned tree looked clean. Moving is safe in-place: the
1623
- root is pre-validated as an allowed tag and so is never the node
1624
- being removed, which keeps `parentNode` inside the iterator root
1625
- and the relocated child inside the serialised tree.
1626
- Otherwise (string / DOM-copy paths): clone. The iterator is rooted
1627
- at — and the result serialised from — `body`, so a restrictive
1628
- ALLOWED_TAGS that removes `body` itself must leave its content in
1629
- place, which only cloning does; and those paths parse into an
1630
- inert document, so their discarded originals never had a queued
1631
- event to neutralise.
1720
+ /* Hoist by moving each child up one level rather than deep-cloning
1721
+ it. Moving transfers every descendant exactly once, so a chain of
1722
+ nested disallowed elements costs O(n) instead of the O(n^2) that
1723
+ re-cloning the shrinking subtree at each level produced; it also
1724
+ empties the removed original, so `DOMPurify.removed` no longer
1725
+ pins whole subtrees. Moving preserves the in-place guarantee too:
1726
+ an original carrying already-queued resource events (`<img
1727
+ onerror>`, `<video>`/`<audio>` error, lazy/`onload`, …) is
1728
+ relocated and sanitised rather than left detached but still armed.
1729
+ The sole case that must clone is removing the walk root itself.
1730
+ The result is serialised from the root's subtree, so a restrictive
1731
+ ALLOWED_TAGS that strips the root (`body` on the string path) must
1732
+ leave the content inside it, which only cloning does. In IN_PLACE
1733
+ the root is pre-validated as an allowed tag and so is never removed
1734
+ here, so that path always takes the move branch.
1632
1735
  `childNodes` is live; a tail-to-head walk keeps `childNodes[i]`
1633
1736
  valid whether we move (drops the trailing entry) or clone (leaves
1634
1737
  the list intact). */
1635
1738
  for (let i = childCount - 1; i >= 0; --i) {
1636
- const hoisted = IN_PLACE ? childNodes[i] : cloneNode(childNodes[i], true);
1739
+ const hoisted = currentNode === root ? cloneNode(childNodes[i], true) : childNodes[i];
1637
1740
  parentNode.insertBefore(hoisted, getNextSibling(currentNode));
1638
1741
  }
1639
1742
  }
@@ -1641,6 +1744,26 @@ var purify = {exports: {}};
1641
1744
  _forceRemove(currentNode);
1642
1745
  return true;
1643
1746
  };
1747
+ /**
1748
+ * Fork a hook-mutable allowlist off its shared binding the first time a
1749
+ * (possibly lazily-installed) uponSanitize* hook is about to see it, so the
1750
+ * hook cannot widen the per-instance default or the setConfig binding by
1751
+ * reference and leak past the call. Returns the set unchanged once it is
1752
+ * already call-local, so repeated calls across elements are idempotent.
1753
+ *
1754
+ * @param hookList the uponSanitize* hook array for this event
1755
+ * @param set the current ALLOWED_TAGS / ALLOWED_ATTR binding
1756
+ * @param defaultSet the per-instance DEFAULT_ALLOWED_* constant
1757
+ * @param setConfigSet the captured setConfig() binding, or null
1758
+ * @return a call-local clone if a hook is present and set is still shared,
1759
+ * else set unchanged
1760
+ */
1761
+ const _forkSharedAllowlist = function _forkSharedAllowlist(hookList, set, defaultSet, setConfigSet) {
1762
+ if (hookList.length === 0) {
1763
+ return set;
1764
+ }
1765
+ return set === defaultSet || set === setConfigSet ? clone(set) : set;
1766
+ };
1644
1767
  /**
1645
1768
  * _sanitizeElements
1646
1769
  *
@@ -1650,9 +1773,20 @@ var purify = {exports: {}};
1650
1773
  * @param currentNode to check for permission to exist
1651
1774
  * @return true if node was killed, false if left alive
1652
1775
  */
1653
- const _sanitizeElements = function _sanitizeElements(currentNode) {
1776
+ // eslint-disable-next-line complexity
1777
+ const _sanitizeElements = function _sanitizeElements(currentNode, root) {
1654
1778
  /* Execute a hook if present */
1655
1779
  _executeHooks(hooks.beforeSanitizeElements, currentNode, null);
1780
+ /* A hook may have detached the node - treat it as removed (see the
1781
+ detached-node comment after the uponSanitizeElement hook below). On
1782
+ the IN_PLACE path, neutralize the detached subtree first so a queued
1783
+ resource handler on it cannot fire in page scope after we return. */
1784
+ if (currentNode !== root && getParentNode(currentNode) === null) {
1785
+ if (IN_PLACE) {
1786
+ _neutralizeSubtree(currentNode);
1787
+ }
1788
+ return true;
1789
+ }
1656
1790
  /* Check if element is clobbered or can clobber */
1657
1791
  if (_isClobbered(currentNode)) {
1658
1792
  _forceRemove(currentNode);
@@ -1660,11 +1794,47 @@ var purify = {exports: {}};
1660
1794
  }
1661
1795
  /* Now let's check the element's type and name */
1662
1796
  const tagName = transformCaseFunc(getNodeName ? getNodeName(currentNode) : currentNode.nodeName);
1797
+ /* Close the pre-walk clone-guard's timing gap: an uponSanitizeElement
1798
+ hook may have been installed after that guard sampled the hook arrays
1799
+ (e.g. lazily from beforeSanitizeElements), leaving ALLOWED_TAGS still
1800
+ aliasing a shared binding that a widening hook would mutate by
1801
+ reference. Fork it before exposing it to the hook. */
1802
+ ALLOWED_TAGS = _forkSharedAllowlist(hooks.uponSanitizeElement, ALLOWED_TAGS, DEFAULT_ALLOWED_TAGS, SET_CONFIG_ALLOWED_TAGS);
1663
1803
  /* Execute a hook if present */
1664
1804
  _executeHooks(hooks.uponSanitizeElement, currentNode, {
1665
1805
  tagName,
1666
1806
  allowedTags: ALLOWED_TAGS
1667
1807
  });
1808
+ /* A hook may have detached the node from the tree — a long-standing
1809
+ user pattern (issue #469; draw.io-style foreignObject filtering).
1810
+ Per the cached, unclobberable parentNode getter the node is
1811
+ genuinely out of the tree, so it can reach neither the serialized
1812
+ output nor an IN_PLACE live tree; treat it as removed and stop
1813
+ processing it. Without this guard, the unsafe-node / namespace
1814
+ checks below would call _forceRemove on a parentless node and hit
1815
+ the REPORT-3 fail-closed throw — which exists for nodes DOMPurify
1816
+ wants gone but *cannot* detach (clobbered / parentless roots), the
1817
+ opposite of a node that is already safely gone. The walk root is
1818
+ exempt: a detached IN_PLACE root is legitimate input and must still
1819
+ be fully sanitized, and a kill-decision on it must keep hitting the
1820
+ REPORT-3 throw. Nodes detached by hooks stay the hook's
1821
+ responsibility for placement: they are not recorded in
1822
+ DOMPurify.removed, so the post-walk IN_PLACE pass (which iterates
1823
+ DOMPurify.removed) does not reach them. But a hook-detached subtree
1824
+ can still hold a queued resource-event handler - e.g. an <img onload>
1825
+ that began loading when the caller built the live tree - which fires
1826
+ in page scope after sanitize returns even though the handler never
1827
+ reached the returned tree. That is the audit-5 F1 hazard, and the
1828
+ documented node.remove() hook pattern walks straight into it. So on
1829
+ the IN_PLACE path we neutralize the detached subtree inline here,
1830
+ stripping its non-allow-listed attributes before returning, exactly
1831
+ as the post-walk pass does for _forceRemove'd subtrees. */
1832
+ if (currentNode !== root && getParentNode(currentNode) === null) {
1833
+ if (IN_PLACE) {
1834
+ _neutralizeSubtree(currentNode);
1835
+ }
1836
+ return true;
1837
+ }
1668
1838
  /* Remove mXSS vectors, processing instructions and risky comments */
1669
1839
  if (_isUnsafeNode(currentNode, tagName)) {
1670
1840
  _forceRemove(currentNode);
@@ -1672,7 +1842,22 @@ var purify = {exports: {}};
1672
1842
  }
1673
1843
  /* Remove element if anything forbids its presence */
1674
1844
  if (FORBID_TAGS[tagName] || !(EXTRA_ELEMENT_HANDLING.tagCheck instanceof Function && EXTRA_ELEMENT_HANDLING.tagCheck(tagName)) && !ALLOWED_TAGS[tagName]) {
1675
- return _sanitizeDisallowedNode(currentNode, tagName);
1845
+ const removed = _sanitizeDisallowedNode(currentNode, tagName, root);
1846
+ /* A false return means the node is a custom element kept via
1847
+ CUSTOM_ELEMENT_HANDLING - the only keep path through
1848
+ _sanitizeDisallowedNode. Run afterSanitizeElements on it so the
1849
+ element-hook lifecycle matches normal allowlisted elements: a
1850
+ security policy applied in this hook (e.g. stripping an attribute
1851
+ from every surviving element) must not silently skip kept custom
1852
+ elements (GHSA-c2j3-45gr-mqc4). This mirrors the normal-element
1853
+ tail below - the hook runs, then the walker's subsequent
1854
+ _sanitizeAttributes pass sanitizes the element's attributes. The
1855
+ deliberately skipped namespace and fallback-tag removal checks stay
1856
+ skipped; they are removal decisions, not the hook contract. */
1857
+ if (removed === false) {
1858
+ _executeHooks(hooks.afterSanitizeElements, currentNode, null);
1859
+ }
1860
+ return removed;
1676
1861
  }
1677
1862
  /* Check whether element has a valid namespace.
1678
1863
  Realm-safe check (GHSA-hpcv-96wg-7vj8): use the cached Node.prototype
@@ -1719,6 +1904,33 @@ var purify = {exports: {}};
1719
1904
  if (FORBID_ATTR[lcName]) {
1720
1905
  return false;
1721
1906
  }
1907
+ /* Reject declarative-partial-updates patch-linkage attributes
1908
+ (https://github.com/WICG/declarative-partial-updates).
1909
+ Empirical note (Chrome 150, verified — see
1910
+ test/declarative-patch-probe-v3.html): expansion is NOT applied after
1911
+ sanitization. For the string path it fires during sanitize()'s own
1912
+ parse, so the walk sees and sanitizes the fully materialized expanded
1913
+ tree — teleports into MathML/SVG integration points included; a
1914
+ weaponized `<template for>`->`<img onerror>` comes back with the handler
1915
+ stripped. For the IN_PLACE path it fires on connection, before the walk.
1916
+ Either way DOMPurify is NOT blind to the patch.
1917
+ This removal is therefore defense-in-depth rather than the sole barrier:
1918
+ it prevents live linkage from surviving into the OUTPUT and re-expanding
1919
+ in the caller's context, and keeps behaviour deterministic if a future
1920
+ engine defers expansion. `for` is legitimate only on <label>/<output>;
1921
+ anywhere else (notably <template for>) it links the element to a patch
1922
+ target and teleports or removes an arbitrary DOM range by id/marker name.
1923
+ `patchsrc` fetches remote markup and is treated as a script-loading
1924
+ mechanism (CSP). Gated on SAFE_FOR_XML so the removal groups with the
1925
+ other structural-threat checks and stays overridable, consistent with
1926
+ the rest of the codebase. PI range markers are already removed by
1927
+ _isUnsafeNode. */
1928
+ if (SAFE_FOR_XML && lcName === 'patchsrc') {
1929
+ return false;
1930
+ }
1931
+ if (SAFE_FOR_XML && lcName === 'for' && lcTag !== 'label' && lcTag !== 'output') {
1932
+ return false;
1933
+ }
1722
1934
  /* Make sure attribute cannot clobber */
1723
1935
  if (SANITIZE_DOM && (lcName === 'id' || lcName === 'name') && (value in document || value in formElement)) {
1724
1936
  return false;
@@ -1835,6 +2047,9 @@ var purify = {exports: {}};
1835
2047
  if (!attributes || _isClobbered(currentNode)) {
1836
2048
  return;
1837
2049
  }
2050
+ /* Same lazy-install guard as uponSanitizeElement (see there): fork the
2051
+ attribute allowlist off its shared binding before a hook can see it. */
2052
+ ALLOWED_ATTR = _forkSharedAllowlist(hooks.uponSanitizeAttribute, ALLOWED_ATTR, DEFAULT_ALLOWED_ATTR, SET_CONFIG_ALLOWED_ATTR);
1838
2053
  const hookEvent = {
1839
2054
  attrName: '',
1840
2055
  attrValue: '',
@@ -1928,7 +2143,7 @@ var purify = {exports: {}};
1928
2143
  /* Execute a hook if present */
1929
2144
  _executeHooks(hooks.uponSanitizeShadowNode, shadowNode, null);
1930
2145
  /* Sanitize tags and elements */
1931
- _sanitizeElements(shadowNode);
2146
+ _sanitizeElements(shadowNode, fragment);
1932
2147
  /* Check attributes next */
1933
2148
  _sanitizeAttributes(shadowNode);
1934
2149
  /* Deep shadow DOM detected.
@@ -2119,6 +2334,11 @@ var purify = {exports: {}};
2119
2334
  keep using and whose return value they ignore — unsanitized. REPORT-2. */
2120
2335
  const inPlace = IN_PLACE && typeof dirty !== 'string' && _isNode(dirty);
2121
2336
  if (inPlace) {
2337
+ /* Declarative-partial-updates / streaming pre-pass: sever every patch
2338
+ linkage across the live tree BEFORE the walk, so no patch can fire
2339
+ mid-walk and inject into an already-processed region. Runs first, so
2340
+ it also covers the forbidden/clobbered roots that throw below. */
2341
+ _neutralizePatchLinkage(dirty);
2122
2342
  /* Do some early pre-sanitization to avoid unsafe root nodes.
2123
2343
  Read nodeName through the cached prototype getter — a clobbering
2124
2344
  child named "nodeName" on the form root would otherwise shadow
@@ -2128,6 +2348,9 @@ var purify = {exports: {}};
2128
2348
  if (typeof nn === 'string') {
2129
2349
  const tagName = transformCaseFunc(nn);
2130
2350
  if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {
2351
+ /* Fail closed on a live root: neutralize handlers/children before
2352
+ throwing, exactly as the mid-walk abort path does. */
2353
+ _neutralizeRoot(dirty);
2131
2354
  throw typeErrorCreate('root node is forbidden and cannot be sanitized in-place');
2132
2355
  }
2133
2356
  }
@@ -2142,6 +2365,10 @@ var purify = {exports: {}};
2142
2365
  the application unsanitized. Refuse to sanitize such a root
2143
2366
  the same way we refuse a forbidden tag. GHSA-r47g-fvhr-h676. */
2144
2367
  if (_isClobbered(dirty)) {
2368
+ /* Fail closed on a live clobbered root before throwing.
2369
+ _neutralizeRoot's reads are clobber-safe (cached getters); the
2370
+ form's non-clobbered descendants, e.g. an armed <img>, are scrubbed. */
2371
+ _neutralizeRoot(dirty);
2145
2372
  throw typeErrorCreate('root node is clobbered and cannot be sanitized in-place');
2146
2373
  }
2147
2374
  /* Sanitize attached shadow roots before the main iterator runs.
@@ -2194,20 +2421,24 @@ var purify = {exports: {}};
2194
2421
  _forceRemove(body.firstChild);
2195
2422
  }
2196
2423
  /* Get node iterator */
2197
- const nodeIterator = _createNodeIterator(inPlace ? dirty : body);
2424
+ const walkRoot = inPlace ? dirty : body;
2198
2425
  /* Now start iterating over the created document.
2199
2426
  The walk runs inside an exception barrier (campaign-3 F2): a re-entrant
2200
2427
  engine/custom-element mutation can detach a node mid-walk so
2201
2428
  `_forceRemove`'s parentless guard throws, aborting the loop. Without the
2202
2429
  barrier the caller's in-place tree would be left half-sanitized with the
2203
- unvisited tail still armed. On any throw we fail closed — strip the
2204
- in-place root bare — then rethrow so the existing throw contract is
2205
- preserved. (String/DOM-copy paths never return the partial body, so the
2206
- propagating throw is already fail-closed there.) */
2430
+ unvisited tail still armed. _createNodeIterator itself is inside the
2431
+ barrier too: constructing the iterator dereferences the root's document,
2432
+ and any failure there (e.g. an exotic/clobbered root) must still fail
2433
+ closed rather than skip the neutralize. On any throw we fail closed -
2434
+ strip the in-place root bare - then rethrow so the existing throw
2435
+ contract is preserved. (String/DOM-copy paths never return the partial
2436
+ body, so the propagating throw is already fail-closed there.) */
2207
2437
  try {
2438
+ const nodeIterator = _createNodeIterator(walkRoot);
2208
2439
  while (currentNode = nodeIterator.nextNode()) {
2209
2440
  /* Sanitize tags and elements */
2210
- _sanitizeElements(currentNode);
2441
+ _sanitizeElements(currentNode, walkRoot);
2211
2442
  /* Check attributes next */
2212
2443
  _sanitizeAttributes(currentNode);
2213
2444
  /* Shadow DOM detected, sanitize it.
@@ -2221,6 +2452,14 @@ var purify = {exports: {}};
2221
2452
  } catch (error) {
2222
2453
  if (inPlace) {
2223
2454
  _neutralizeRoot(dirty);
2455
+ /* Nodes _forceRemove'd earlier in the aborted walk are already
2456
+ detached from the root, so _neutralizeRoot's subtree pass does not
2457
+ reach them. Defuse them too, mirroring the success-path loop below. */
2458
+ arrayForEach(DOMPurify.removed, entry => {
2459
+ if (entry.element) {
2460
+ _neutralizeSubtree(entry.element);
2461
+ }
2462
+ });
2224
2463
  }
2225
2464
  throw error;
2226
2465
  }
@@ -2357,7 +2596,7 @@ const getCustomElementHandling = (allowICPrefix) => ({
2357
2596
  CUSTOM_ELEMENT_HANDLING: {
2358
2597
  tagNameCheck: (tagName) => (allowICPrefix && tagName.startsWith("ic-")) ||
2359
2598
  IC_CUSTOM_ALLOWED_COMPONENTS.includes(tagName),
2360
- attributeNameCheck: /.*/,
2599
+ attributeNameCheck: /^(?!on).+$/i,
2361
2600
  },
2362
2601
  });
2363
2602
  const sanitizeHTMLString = (html) => {
@@ -2367,7 +2606,7 @@ const sanitizeHTMLIconString = (html) => {
2367
2606
  return purifier.sanitize(html, getCustomElementHandling(false));
2368
2607
  };
2369
2608
 
2370
- const icMenuCss = "html.sc-ic-menu{line-height:1.15;-webkit-text-size-adjust:100%}body.sc-ic-menu{margin:0}main.sc-ic-menu{display:block}h1.sc-ic-menu{font-size:2em;margin:0.67em 0}hr.sc-ic-menu{box-sizing:content-box;height:0;overflow:visible}pre.sc-ic-menu{font-family:monospace, monospace;font-size:1em}a.sc-ic-menu{background-color:transparent}abbr[title].sc-ic-menu{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b.sc-ic-menu,strong.sc-ic-menu{font-weight:bolder}code.sc-ic-menu,kbd.sc-ic-menu,samp.sc-ic-menu{font-family:monospace, monospace;font-size:1em}small.sc-ic-menu{font-size:80%}sub.sc-ic-menu,sup.sc-ic-menu{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub.sc-ic-menu{bottom:-0.25em}sup.sc-ic-menu{top:-0.5em}img.sc-ic-menu{border-style:none}button.sc-ic-menu,input.sc-ic-menu,optgroup.sc-ic-menu,select.sc-ic-menu,textarea.sc-ic-menu{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button.sc-ic-menu,input.sc-ic-menu{overflow:visible}button.sc-ic-menu,select.sc-ic-menu{text-transform:none}button.sc-ic-menu,[type=\"button\"].sc-ic-menu,[type=\"reset\"].sc-ic-menu,[type=\"submit\"].sc-ic-menu{-webkit-appearance:button}button.sc-ic-menu::-moz-focus-inner,[type=\"button\"].sc-ic-menu::-moz-focus-inner,[type=\"reset\"].sc-ic-menu::-moz-focus-inner,[type=\"submit\"].sc-ic-menu::-moz-focus-inner{border-style:none;padding:0}button.sc-ic-menu:-moz-focusring,[type=\"button\"].sc-ic-menu:-moz-focusring,[type=\"reset\"].sc-ic-menu:-moz-focusring,[type=\"submit\"].sc-ic-menu:-moz-focusring{outline:1px dotted ButtonText}fieldset.sc-ic-menu{padding:0.35em 0.75em 0.625em}legend.sc-ic-menu{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress.sc-ic-menu{vertical-align:baseline}textarea.sc-ic-menu{overflow:auto}[type=\"checkbox\"].sc-ic-menu,[type=\"radio\"].sc-ic-menu{box-sizing:border-box;padding:0}[type=\"number\"].sc-ic-menu::-webkit-inner-spin-button,[type=\"number\"].sc-ic-menu::-webkit-outer-spin-button{height:auto}[type=\"search\"].sc-ic-menu{-webkit-appearance:textfield;outline-offset:-2px}[type=\"search\"].sc-ic-menu::-webkit-search-decoration{-webkit-appearance:none}.sc-ic-menu::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details.sc-ic-menu{display:block}summary.sc-ic-menu{display:list-item}template.sc-ic-menu{display:none}[hidden].sc-ic-menu{display:none}html.sc-ic-menu,body.sc-ic-menu,div.sc-ic-menu,span.sc-ic-menu,applet.sc-ic-menu,object.sc-ic-menu,iframe.sc-ic-menu,h1.sc-ic-menu,h2.sc-ic-menu,h3.sc-ic-menu,h4.sc-ic-menu,h5.sc-ic-menu,h6.sc-ic-menu,p.sc-ic-menu,blockquote.sc-ic-menu,pre.sc-ic-menu,a.sc-ic-menu,abbr.sc-ic-menu,acronym.sc-ic-menu,address.sc-ic-menu,big.sc-ic-menu,cite.sc-ic-menu,code.sc-ic-menu,del.sc-ic-menu,dfn.sc-ic-menu,em.sc-ic-menu,img.sc-ic-menu,ins.sc-ic-menu,kbd.sc-ic-menu,q.sc-ic-menu,s.sc-ic-menu,samp.sc-ic-menu,small.sc-ic-menu,strike.sc-ic-menu,strong.sc-ic-menu,sub.sc-ic-menu,sup.sc-ic-menu,tt.sc-ic-menu,var.sc-ic-menu,b.sc-ic-menu,u.sc-ic-menu,i.sc-ic-menu,center.sc-ic-menu,dl.sc-ic-menu,dt.sc-ic-menu,dd.sc-ic-menu,ol.sc-ic-menu,ul.sc-ic-menu,li.sc-ic-menu,fieldset.sc-ic-menu,form.sc-ic-menu,label.sc-ic-menu,legend.sc-ic-menu,table.sc-ic-menu,caption.sc-ic-menu,tbody.sc-ic-menu,tfoot.sc-ic-menu,thead.sc-ic-menu,tr.sc-ic-menu,th.sc-ic-menu,td.sc-ic-menu,article.sc-ic-menu,aside.sc-ic-menu,canvas.sc-ic-menu,details.sc-ic-menu,embed.sc-ic-menu,figure.sc-ic-menu,figcaption.sc-ic-menu,footer.sc-ic-menu,header.sc-ic-menu,hgroup.sc-ic-menu,menu.sc-ic-menu,nav.sc-ic-menu,output.sc-ic-menu,ruby.sc-ic-menu,section.sc-ic-menu,summary.sc-ic-menu,time.sc-ic-menu,mark.sc-ic-menu,audio.sc-ic-menu,video.sc-ic-menu{margin:0;padding:0;border:0;font-size:100%;font-style:inherit;vertical-align:baseline}@media (prefers-reduced-motion: no-preference){.ic-menu-open.sc-ic-menu-h .menu.sc-ic-menu{transition:max-height var(--ic-transition-duration-slow)}}.sc-ic-menu-h{max-height:0;width:var(--menu-width, var(--input-width, 20rem));color:var(--menu-item-text-color, var(--ic-menu-list-option-text-color));--ic-typography-color:var(\n --menu-item-text-color,\n var(--ic-menu-list-option-text-color)\n );background-color:var(\n --menu-bg-color,\n var(--ic-menu-list-option-background-color)\n );position:relative;z-index:var(--ic-z-index-menu);box-sizing:border-box;box-shadow:var(--ic-elevation-overlay);border-radius:var(--ic-border-radius)}.ic-menu-open.sc-ic-menu-h:not(.ic-menu-no-focus):focus-within{box-shadow:var(--ic-border-focus);outline:var(--ic-hc-focus-outline)}.ic-select-select-all-focused.sc-ic-menu-h{box-shadow:var(--ic-elevation-overlay) !important}#retry-button.sc-ic-menu::part(button){height:var(--ic-space-lg)}.small.sc-ic-menu #retry-button.sc-ic-menu::part(button){height:var(--ic-space-md)}.on-dialog.sc-ic-menu-h{inset:auto !important}.menu.sc-ic-menu{text-decoration:none;list-style-type:none;border-radius:1px;background-color:var(\n --menu-bg-color,\n var(--ic-menu-list-option-background-color)\n );visibility:hidden;max-height:0;overflow-y:hidden}.menu.sc-ic-menu:has(+.option-bar).sc-ic-menu{border-radius:0 0 1px 1px}.menu-scroll.sc-ic-menu{overflow-y:auto}.menu.sc-ic-menu:focus-visible{outline:none}.ic-menu-open.sc-ic-menu-h{max-height:none;display:flex;flex-direction:column-reverse;border:var(--ic-border-width) solid\n var(--menu-border-color, var(--ic-menu-border-color));transition:box-shadow var(--ic-easing-transition-fast)}.ic-menu-open.sc-ic-menu-h .menu.sc-ic-menu{visibility:visible;max-height:calc(var(--ic-space-xl) * 10 + var(--ic-space-xxxs))}.ic-menu-open.sc-ic-menu-h .option-bar.sc-ic-menu{visibility:visible}.ic-menu-open.sc-ic-menu-h .select-all-button.sc-ic-menu{display:block}.ic-menu-full-width.sc-ic-menu-h{width:100%}.option.sc-ic-menu{padding:var(--ic-space-xs) calc(var(--ic-space-xs) - var(--ic-space-1px));cursor:pointer;display:flex;align-items:center;gap:var(--ic-space-xs)}.loading-option.sc-ic-menu p.sc-ic-menu{margin-bottom:0 !important}.option.sc-ic-menu:not(.loading-option){justify-content:space-between}.ic-menu-small.sc-ic-menu-h .option.sc-ic-menu{padding:var(--ic-space-xxs) calc(var(--ic-space-xs) - var(--ic-space-1px))}.ic-menu-large.sc-ic-menu-h .option.sc-ic-menu{padding:var(--ic-space-sm) calc(var(--ic-space-xs) - var(--ic-space-1px))}.option.sc-ic-menu:last-child{border-radius:0 0 1px 1px}.sc-ic-menu:not(.menu:has(+.option-bar)).sc-ic-menu .option.sc-ic-menu:first-child{border-radius:1px 1px 0 0}.option.sc-ic-menu:not(.disabled-option):hover{background-color:var(--ic-menu-list-option-hover-background-color)}.option.sc-ic-menu:not(.disabled-option):active{background-color:var(--ic-menu-list-option-pressed-background-color)}.option.sc-ic-menu:focus-visible{outline:var(--ic-hc-focus-outline)}.option.sc-ic-menu:not(.disabled-option) .option-description.sc-ic-menu{--ic-typography-color:var(\n --menu-item-desc-text-color,\n var(--ic-menu-list-option-description-text-color)\n )}.option.sc-ic-menu .option-label.sc-ic-menu{display:flex;flex-direction:row;align-items:top}.option.sc-ic-menu .option-label.sc-ic-menu ic-typography.sc-ic-menu{max-width:100%;word-wrap:break-word}.option.sc-ic-menu .option-element.sc-ic-menu{margin-top:var(--ic-space-xxs)}.option.sc-ic-menu .option-icon.sc-ic-menu{height:var(--ic-space-md);width:var(--ic-space-md);margin-top:var(--ic-space-xxs);margin-right:var(--ic-space-xxs)}.option-text-container.sc-ic-menu{pointer-events:none;width:100%}.option-text-container.show-check-icon.sc-ic-menu{flex-grow:1}.option.loading-option.sc-ic-menu .option-text-container.sc-ic-menu{margin-left:calc(var(--ic-space-xs) + var(--ic-space-xxxs));color:var(--ic-menu-loading-list-option-text-color);--ic-typography-color:var(--ic-menu-loading-list-option-text-color)}.error-icon-svg.sc-ic-menu{height:var(--ic-space-md);width:var(--ic-space-md);fill:var(--ic-atoms-status-icon-error);align-self:center;display:flex;margin-right:calc(var(--ic-space-xxs) * 1.2)}.loading-error-info.sc-ic-menu{display:flex}.check-icon.sc-ic-menu{height:var(--ic-space-lg);min-width:var(--ic-space-lg);width:var(--ic-space-lg);pointer-events:none}.focused-option.sc-ic-menu .check-icon.sc-ic-menu *.sc-ic-menu{fill:currentcolor}.sc-ic-menu:first-child>.option-group-title.sc-ic-menu{padding:var(--ic-space-xs) calc(var(--ic-space-xs) - var(--ic-space-1px))\n var(--ic-space-xs)}.option-group-title.sc-ic-menu{padding:var(--ic-space-lg) calc(var(--ic-space-xs) - var(--ic-space-1px))\n var(--ic-space-xs);--ic-typography-color:var(--ic-menu-option-group-label-text-color)}.ic-menu-small.sc-ic-menu-h .option-group-title.sc-ic-menu{padding:var(--ic-space-sm) calc(var(--ic-space-xs) - var(--ic-space-1px))\n var(--ic-space-xxs)}.last-recommended-option.sc-ic-menu{border-bottom:var(--ic-menu-last-recommended-option-border)}.disabled-option.sc-ic-menu{color:var(--ic-atoms-list-option-text-disabled-light);--ic-typography-color:var(--ic-atoms-list-option-text-disabled-light);cursor:default;pointer-events:none}.focus-border.sc-ic-menu{border-radius:var(--ic-border-radius);padding:var(--ic-space-xxs);border:var(--ic-space-xxxs) dashed transparent;border-color:var(--ic-popover-menu-border);background-color:var(--ic-color-focus-inner) !important;--icon-height:auto}.focus-disabled.sc-ic-menu{background-color:var(--ic-color-focus-inner) !important;padding:calc(var(--ic-space-xs) - var(--ic-space-xxxs) - var(--ic-space-xxs))\n calc(\n var(--ic-space-xs) - var(--ic-space-1px) - var(--ic-space-xxxs) -\n var(--ic-space-xxs)\n )}.focused-option.sc-ic-menu,.focused-option.sc-ic-menu .option-description.sc-ic-menu{background-color:var(--ic-color-focus-inner) !important;color:var(--ic-atoms-list-option-text-focused-light) !important;--ic-typography-color:var(\n --ic-atoms-list-option-text-focused-light\n ) !important}.no-results.sc-ic-menu-h li.sc-ic-menu{cursor:no-drop}.no-results.sc-ic-menu-h li.sc-ic-menu:hover{background-color:transparent}.option-bar.sc-ic-menu{padding:var(--ic-space-xxs) var(--ic-space-xs);display:flex;align-items:center;justify-content:space-between;background-color:var(--ic-menu-option-bar-background-color);visibility:hidden;border-bottom:var(--ic-border-width) solid\n var(--ic-menu-option-bar-divider-color);border-radius:1px 1px 0 0}.option-bar.sc-ic-menu p.sc-ic-menu{margin-bottom:0 !important}.ic-menu-large.sc-ic-menu-h .option-bar.sc-ic-menu{padding:var(--ic-space-xs)}.select-all-button.sc-ic-menu{display:none}.select-all-button.sc-ic-menu:focus{z-index:calc(var(--ic-z-index-menu) + 1)}@media (forced-colors: active){.focused-option.sc-ic-menu{outline:none;border:0.125rem solid transparent}.disabled-option.sc-ic-menu{color:GrayText;--ic-typography-color:GrayText}}@media screen AND (max-width: 22rem){.sc-ic-menu-h{max-width:var(--menu-width, var(--input-width, 20rem));width:100%}}@media (prefers-reduced-motion: reduce){.ic-menu-open.sc-ic-menu-h{transition:none}}";
2609
+ const icMenuCss = "html.sc-ic-menu{line-height:1.15;-webkit-text-size-adjust:100%}body.sc-ic-menu{margin:0}main.sc-ic-menu{display:block}h1.sc-ic-menu{font-size:2em;margin:0.67em 0}hr.sc-ic-menu{box-sizing:content-box;height:0;overflow:visible}pre.sc-ic-menu{font-family:monospace, monospace;font-size:1em}a.sc-ic-menu{background-color:transparent}abbr[title].sc-ic-menu{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b.sc-ic-menu,strong.sc-ic-menu{font-weight:bolder}code.sc-ic-menu,kbd.sc-ic-menu,samp.sc-ic-menu{font-family:monospace, monospace;font-size:1em}small.sc-ic-menu{font-size:80%}sub.sc-ic-menu,sup.sc-ic-menu{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub.sc-ic-menu{bottom:-0.25em}sup.sc-ic-menu{top:-0.5em}img.sc-ic-menu{border-style:none}button.sc-ic-menu,input.sc-ic-menu,optgroup.sc-ic-menu,select.sc-ic-menu,textarea.sc-ic-menu{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button.sc-ic-menu,input.sc-ic-menu{overflow:visible}button.sc-ic-menu,select.sc-ic-menu{text-transform:none}button.sc-ic-menu,[type=\"button\"].sc-ic-menu,[type=\"reset\"].sc-ic-menu,[type=\"submit\"].sc-ic-menu{-webkit-appearance:button}button.sc-ic-menu::-moz-focus-inner,[type=\"button\"].sc-ic-menu::-moz-focus-inner,[type=\"reset\"].sc-ic-menu::-moz-focus-inner,[type=\"submit\"].sc-ic-menu::-moz-focus-inner{border-style:none;padding:0}button.sc-ic-menu:-moz-focusring,[type=\"button\"].sc-ic-menu:-moz-focusring,[type=\"reset\"].sc-ic-menu:-moz-focusring,[type=\"submit\"].sc-ic-menu:-moz-focusring{outline:1px dotted ButtonText}fieldset.sc-ic-menu{padding:0.35em 0.75em 0.625em}legend.sc-ic-menu{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress.sc-ic-menu{vertical-align:baseline}textarea.sc-ic-menu{overflow:auto}[type=\"checkbox\"].sc-ic-menu,[type=\"radio\"].sc-ic-menu{box-sizing:border-box;padding:0}[type=\"number\"].sc-ic-menu::-webkit-inner-spin-button,[type=\"number\"].sc-ic-menu::-webkit-outer-spin-button{height:auto}[type=\"search\"].sc-ic-menu{-webkit-appearance:textfield;outline-offset:-2px}[type=\"search\"].sc-ic-menu::-webkit-search-decoration{-webkit-appearance:none}.sc-ic-menu::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details.sc-ic-menu{display:block}summary.sc-ic-menu{display:list-item}template.sc-ic-menu{display:none}[hidden].sc-ic-menu{display:none}html.sc-ic-menu,body.sc-ic-menu,div.sc-ic-menu,span.sc-ic-menu,applet.sc-ic-menu,object.sc-ic-menu,iframe.sc-ic-menu,h1.sc-ic-menu,h2.sc-ic-menu,h3.sc-ic-menu,h4.sc-ic-menu,h5.sc-ic-menu,h6.sc-ic-menu,p.sc-ic-menu,blockquote.sc-ic-menu,pre.sc-ic-menu,a.sc-ic-menu,abbr.sc-ic-menu,acronym.sc-ic-menu,address.sc-ic-menu,big.sc-ic-menu,cite.sc-ic-menu,code.sc-ic-menu,del.sc-ic-menu,dfn.sc-ic-menu,em.sc-ic-menu,img.sc-ic-menu,ins.sc-ic-menu,kbd.sc-ic-menu,q.sc-ic-menu,s.sc-ic-menu,samp.sc-ic-menu,small.sc-ic-menu,strike.sc-ic-menu,strong.sc-ic-menu,sub.sc-ic-menu,sup.sc-ic-menu,tt.sc-ic-menu,var.sc-ic-menu,b.sc-ic-menu,u.sc-ic-menu,i.sc-ic-menu,center.sc-ic-menu,dl.sc-ic-menu,dt.sc-ic-menu,dd.sc-ic-menu,ol.sc-ic-menu,ul.sc-ic-menu,li.sc-ic-menu,fieldset.sc-ic-menu,form.sc-ic-menu,label.sc-ic-menu,legend.sc-ic-menu,table.sc-ic-menu,caption.sc-ic-menu,tbody.sc-ic-menu,tfoot.sc-ic-menu,thead.sc-ic-menu,tr.sc-ic-menu,th.sc-ic-menu,td.sc-ic-menu,article.sc-ic-menu,aside.sc-ic-menu,canvas.sc-ic-menu,details.sc-ic-menu,embed.sc-ic-menu,figure.sc-ic-menu,figcaption.sc-ic-menu,footer.sc-ic-menu,header.sc-ic-menu,hgroup.sc-ic-menu,menu.sc-ic-menu,nav.sc-ic-menu,output.sc-ic-menu,ruby.sc-ic-menu,section.sc-ic-menu,summary.sc-ic-menu,time.sc-ic-menu,mark.sc-ic-menu,audio.sc-ic-menu,video.sc-ic-menu{margin:0;padding:0;border:0;font-size:100%;font-style:inherit;vertical-align:baseline}@media (prefers-reduced-motion: no-preference){.ic-menu-open.sc-ic-menu-h .menu.sc-ic-menu{transition:max-height var(--ic-transition-duration-slow)}}.sc-ic-menu-h{max-height:0;width:var(--menu-width, var(--input-width, 20rem));color:var(--menu-item-text-color, var(--ic-menu-list-option-text-color));--ic-typography-color:var(\n --menu-item-text-color,\n var(--ic-menu-list-option-text-color)\n );background-color:var(\n --menu-bg-color,\n var(--ic-menu-list-option-background-color)\n );position:relative;z-index:var(--ic-z-index-menu);box-sizing:border-box;box-shadow:var(--ic-elevation-overlay);border-radius:var(--ic-border-radius)}.ic-menu-open.sc-ic-menu-h:not(.ic-menu-no-focus):focus-within{box-shadow:var(--ic-border-focus);outline:var(--ic-hc-focus-outline)}.ic-select-select-all-focused.sc-ic-menu-h{box-shadow:var(--ic-elevation-overlay) !important}#retry-button.sc-ic-menu::part(button){height:var(--ic-space-lg)}.small.sc-ic-menu #retry-button.sc-ic-menu::part(button){height:var(--ic-space-md)}.on-dialog.sc-ic-menu-h{inset:auto !important}.menu.sc-ic-menu{text-decoration:none;list-style-type:none;border-radius:1px;background-color:var(\n --menu-bg-color,\n var(--ic-menu-list-option-background-color)\n );visibility:hidden;max-height:0;overflow-y:hidden}.menu.sc-ic-menu:has(+.option-bar).sc-ic-menu{border-radius:0 0 1px 1px}.menu-scroll.sc-ic-menu{overflow-y:auto}.menu.sc-ic-menu:focus-visible{outline:none}.ic-menu-open.sc-ic-menu-h{max-height:none;display:flex;flex-direction:column-reverse;border:var(--ic-border-width) solid\n var(--menu-border-color, var(--ic-menu-border-color));transition:box-shadow var(--ic-easing-transition-fast)}.ic-menu-open.sc-ic-menu-h .menu.sc-ic-menu{visibility:visible;max-height:calc(var(--ic-space-xl) * 10 + var(--ic-space-xxxs))}.ic-menu-open.sc-ic-menu-h .option-bar.sc-ic-menu{visibility:visible}.ic-menu-open.sc-ic-menu-h .select-all-button.sc-ic-menu{display:block}.ic-menu-full-width.sc-ic-menu-h{width:100%}.option.sc-ic-menu{padding:var(--ic-space-xs) calc(var(--ic-space-xs) - var(--ic-space-1px));cursor:pointer;display:flex;align-items:center;gap:var(--ic-space-xs)}.loading-option.sc-ic-menu p.sc-ic-menu{margin-bottom:0 !important}.option.sc-ic-menu:not(.loading-option){justify-content:space-between}.ic-menu-small.sc-ic-menu-h .option.sc-ic-menu{padding:var(--ic-space-xxs) calc(var(--ic-space-xs) - var(--ic-space-1px))}.ic-menu-large.sc-ic-menu-h .option.sc-ic-menu{padding:var(--ic-space-sm) calc(var(--ic-space-xs) - var(--ic-space-1px))}.option.sc-ic-menu:last-child{border-radius:0 0 1px 1px}.sc-ic-menu:not(.menu:has(+.option-bar)).sc-ic-menu .option.sc-ic-menu:first-child{border-radius:1px 1px 0 0}.option.sc-ic-menu:not(.disabled-option):hover{background-color:var(--ic-menu-list-option-hover-background-color)}.option.sc-ic-menu:not(.disabled-option):active{background-color:var(--ic-menu-list-option-pressed-background-color)}.option.sc-ic-menu:focus-visible{outline:var(--ic-hc-focus-outline)}.option.sc-ic-menu:not(.disabled-option) .option-description.sc-ic-menu{--ic-typography-color:var(\n --menu-item-desc-text-color,\n var(--ic-menu-list-option-description-text-color)\n )}.option.sc-ic-menu .option-label.sc-ic-menu{display:flex;flex-direction:row;align-items:flex-start;gap:var(--ic-space-xs)}.option.sc-ic-menu .option-label.sc-ic-menu ic-typography.sc-ic-menu{max-width:100%;word-wrap:break-word}.option.sc-ic-menu .option-element.sc-ic-menu{margin-top:var(--ic-space-xxs)}.option.sc-ic-menu .option-icon.sc-ic-menu{height:var(--ic-space-lg);width:var(--ic-space-lg);min-width:var(--ic-space-lg)}.option.sc-ic-menu .option-icon.sc-ic-menu>svg.sc-ic-menu{height:100%;width:100%}.option-label.sc-ic-menu:has(.option-icon)+.option-description.sc-ic-menu{margin-left:calc(var(--ic-space-lg) + var(--ic-space-xs))}.option-text-container.sc-ic-menu{pointer-events:none;width:100%}.option-text-container.show-check-icon.sc-ic-menu{flex-grow:1}.option.loading-option.sc-ic-menu .option-text-container.sc-ic-menu{margin-left:calc(var(--ic-space-xs) + var(--ic-space-xxxs));color:var(--ic-menu-loading-list-option-text-color);--ic-typography-color:var(--ic-menu-loading-list-option-text-color)}.error-icon-svg.sc-ic-menu{height:var(--ic-space-md);width:var(--ic-space-md);fill:var(--ic-atoms-status-icon-error);align-self:center;display:flex;margin-right:calc(var(--ic-space-xxs) * 1.2)}.loading-error-info.sc-ic-menu{display:flex}.check-icon.sc-ic-menu{height:var(--ic-space-lg);min-width:var(--ic-space-lg);width:var(--ic-space-lg);pointer-events:none}.focused-option.sc-ic-menu .check-icon.sc-ic-menu *.sc-ic-menu{fill:currentcolor}.sc-ic-menu:first-child>.option-group-title.sc-ic-menu{padding:var(--ic-space-xs) calc(var(--ic-space-xs) - var(--ic-space-1px))\n var(--ic-space-xs)}.option-group-title.sc-ic-menu{padding:var(--ic-space-lg) calc(var(--ic-space-xs) - var(--ic-space-1px))\n var(--ic-space-xs);--ic-typography-color:var(--ic-menu-option-group-label-text-color)}.ic-menu-small.sc-ic-menu-h .option-group-title.sc-ic-menu{padding:var(--ic-space-sm) calc(var(--ic-space-xs) - var(--ic-space-1px))\n var(--ic-space-xxs)}.last-recommended-option.sc-ic-menu{border-bottom:var(--ic-menu-last-recommended-option-border)}.disabled-option.sc-ic-menu{color:var(--ic-atoms-list-option-text-disabled-light);--ic-typography-color:var(--ic-atoms-list-option-text-disabled-light);cursor:default;pointer-events:none}.focus-border.sc-ic-menu{border-radius:var(--ic-border-radius);padding:var(--ic-space-xxs);border:var(--ic-space-xxxs) dashed transparent;border-color:var(--ic-popover-menu-border);background-color:var(--ic-color-focus-inner) !important;--icon-height:auto}.focus-disabled.sc-ic-menu{background-color:var(--ic-color-focus-inner) !important;padding:calc(var(--ic-space-xs) - var(--ic-space-xxxs) - var(--ic-space-xxs))\n calc(\n var(--ic-space-xs) - var(--ic-space-1px) - var(--ic-space-xxxs) -\n var(--ic-space-xxs)\n )}.focused-option.sc-ic-menu,.focused-option.sc-ic-menu .option-description.sc-ic-menu{background-color:var(--ic-color-focus-inner) !important;color:var(--ic-atoms-list-option-text-focused-light) !important;--ic-typography-color:var(\n --ic-atoms-list-option-text-focused-light\n ) !important}.no-results.sc-ic-menu-h li.sc-ic-menu{cursor:no-drop}.no-results.sc-ic-menu-h li.sc-ic-menu:hover{background-color:transparent}.option-bar.sc-ic-menu{padding:var(--ic-space-xxs) var(--ic-space-xs);display:flex;align-items:center;justify-content:space-between;background-color:var(--ic-menu-option-bar-background-color);visibility:hidden;border-bottom:var(--ic-border-width) solid\n var(--ic-menu-option-bar-divider-color);border-radius:1px 1px 0 0}.option-bar.sc-ic-menu p.sc-ic-menu{margin-bottom:0 !important}.ic-menu-large.sc-ic-menu-h .option-bar.sc-ic-menu{padding:var(--ic-space-xs)}.select-all-button.sc-ic-menu{display:none}.select-all-button.sc-ic-menu:focus{z-index:calc(var(--ic-z-index-menu) + 1)}@media (forced-colors: active){.focused-option.sc-ic-menu{outline:none;border:0.125rem solid transparent}.disabled-option.sc-ic-menu{color:GrayText;--ic-typography-color:GrayText}}@media screen AND (max-width: 22rem){.sc-ic-menu-h{max-width:var(--menu-width, var(--input-width, 20rem));width:100%}}@media (prefers-reduced-motion: reduce){.ic-menu-open.sc-ic-menu-h{transition:none}}";
2371
2610
  const IcMenuStyle0 = icMenuCss;
2372
2611
 
2373
2612
  const Menu = class {