@shortfuse/materialdesignweb 0.7.6 → 0.8.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 (114) hide show
  1. package/README.md +57 -68
  2. package/components/Badge.js +2 -2
  3. package/components/BottomAppBar.js +3 -5
  4. package/components/Box.js +33 -3
  5. package/components/Button.js +48 -21
  6. package/components/Button.md +9 -9
  7. package/components/Card.js +9 -16
  8. package/components/Checkbox.js +45 -36
  9. package/components/CheckboxIcon.js +2 -2
  10. package/components/Chip.js +1 -1
  11. package/components/Dialog.js +228 -359
  12. package/components/DialogActions.js +2 -2
  13. package/components/Divider.js +3 -3
  14. package/components/ExtendedFab.js +4 -8
  15. package/components/Fab.js +1 -2
  16. package/components/FilterChip.js +4 -4
  17. package/components/Headline.js +1 -1
  18. package/components/Icon.js +8 -8
  19. package/components/IconButton.js +9 -14
  20. package/components/Input.js +273 -1
  21. package/components/Layout.js +485 -16
  22. package/components/List.js +6 -4
  23. package/components/ListItem.js +12 -12
  24. package/components/ListOption.js +21 -5
  25. package/components/Listbox.js +239 -0
  26. package/components/Menu.js +77 -526
  27. package/components/MenuItem.js +12 -14
  28. package/components/Nav.js +0 -2
  29. package/components/NavBar.js +8 -79
  30. package/components/NavDrawer.js +12 -11
  31. package/components/NavDrawerItem.js +2 -1
  32. package/components/NavItem.js +18 -8
  33. package/components/NavRail.js +15 -7
  34. package/components/NavRailItem.js +3 -1
  35. package/components/Popup.js +20 -0
  36. package/components/Progress.js +24 -23
  37. package/components/Radio.js +42 -35
  38. package/components/RadioIcon.js +3 -3
  39. package/components/Ripple.js +2 -3
  40. package/components/Search.js +85 -0
  41. package/components/SegmentedButton.js +1 -10
  42. package/components/SegmentedButtonGroup.js +16 -10
  43. package/components/Select.js +4 -4
  44. package/components/Shape.js +1 -1
  45. package/components/Slider.js +43 -50
  46. package/components/Snackbar.js +4 -5
  47. package/components/Surface.js +3 -3
  48. package/components/Switch.js +55 -21
  49. package/components/SwitchIcon.js +10 -8
  50. package/components/Tab.js +11 -9
  51. package/components/TabContent.js +4 -3
  52. package/components/TabList.js +2 -2
  53. package/components/TabPanel.js +11 -8
  54. package/components/TextArea.js +38 -35
  55. package/components/Tooltip.js +2 -2
  56. package/components/TopAppBar.js +65 -147
  57. package/core/Composition.js +985 -628
  58. package/core/CompositionAdapter.js +315 -0
  59. package/core/CustomElement.js +153 -90
  60. package/core/DomAdapter.js +586 -0
  61. package/core/ICustomElement.d.ts +2 -2
  62. package/core/css.js +8 -7
  63. package/core/customTypes.js +53 -31
  64. package/{utils → core}/jsonMergePatch.js +36 -14
  65. package/core/observe.js +111 -57
  66. package/core/optimizations.js +23 -0
  67. package/core/template.js +17 -11
  68. package/core/test.js +126 -0
  69. package/core/typings.d.ts +11 -5
  70. package/core/uid.js +13 -0
  71. package/dist/index.min.js +83 -152
  72. package/dist/index.min.js.map +4 -4
  73. package/dist/meta.json +1 -1
  74. package/mixins/AriaReflectorMixin.js +1 -2
  75. package/mixins/AriaToolbarMixin.js +2 -3
  76. package/mixins/ControlMixin.js +25 -17
  77. package/mixins/DensityMixin.js +0 -1
  78. package/mixins/FlexableMixin.js +1 -2
  79. package/mixins/FormAssociatedMixin.js +13 -10
  80. package/mixins/InputMixin.js +2 -9
  81. package/mixins/KeyboardNavMixin.js +14 -1
  82. package/mixins/PopupMixin.js +757 -0
  83. package/mixins/RTLObserverMixin.js +0 -1
  84. package/mixins/ResizeObserverMixin.js +0 -1
  85. package/mixins/RippleMixin.js +3 -4
  86. package/mixins/ScrollListenerMixin.js +41 -32
  87. package/mixins/SemiStickyMixin.js +151 -0
  88. package/mixins/ShapeMixin.js +29 -24
  89. package/mixins/StateMixin.js +11 -6
  90. package/mixins/SurfaceMixin.js +3 -57
  91. package/mixins/TextFieldMixin.js +57 -65
  92. package/mixins/ThemableMixin.js +78 -156
  93. package/mixins/TooltipTriggerMixin.js +7 -13
  94. package/mixins/TouchTargetMixin.js +4 -3
  95. package/package.json +9 -5
  96. package/theming/index.js +1 -1
  97. package/theming/themableMixinLoader.js +12 -0
  98. package/utils/{hct → material-color}/blend.js +8 -10
  99. package/utils/{hct → material-color/hct}/Cam16.js +196 -69
  100. package/utils/{hct → material-color/hct}/Hct.js +61 -19
  101. package/utils/{hct → material-color/hct}/ViewingConditions.js +3 -3
  102. package/utils/{hct → material-color/hct}/hctSolver.js +9 -16
  103. package/utils/{hct → material-color}/helper.js +11 -18
  104. package/utils/{hct → material-color/palettes}/CorePalette.js +79 -19
  105. package/utils/{hct → material-color/palettes}/TonalPalette.js +12 -4
  106. package/utils/material-color/scheme/Scheme.js +376 -0
  107. package/utils/{hct/colorUtils.js → material-color/utils/color.js} +61 -1
  108. package/utils/popup.js +46 -25
  109. package/components/ListSelect.js +0 -220
  110. package/components/Option.js +0 -91
  111. package/components/Pane.js +0 -281
  112. package/core/identify.js +0 -40
  113. package/utils/hct/Scheme.js +0 -587
  114. /package/utils/{hct/mathUtils.js → material-color/utils/math.js} +0 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../core/css.js", "../core/identify.js", "../utils/jsonMergePatch.js", "../core/dom.js", "../core/observe.js", "../core/template.js", "../core/Composition.js", "../core/ICustomElement.js", "../core/CustomElement.js", "../mixins/DensityMixin.js", "../mixins/ShapeMixin.js", "../mixins/ThemableMixin.js", "../components/Badge.js", "../mixins/FlexableMixin.js", "../components/Box.js", "../components/Body.js", "../mixins/AriaReflectorMixin.js", "../mixins/KeyboardNavMixin.js", "../mixins/AriaToolbarMixin.js", "../mixins/SurfaceMixin.js", "../components/Surface.js", "../components/BottomAppBar.js", "../components/Icon.js", "../mixins/FormAssociatedMixin.js", "../mixins/ControlMixin.js", "../mixins/InputMixin.js", "../core/customTypes.js", "../components/Ripple.js", "../mixins/RippleMixin.js", "../mixins/StateMixin.js", "../components/Button.js", "../components/Card.js", "../components/CheckboxIcon.js", "../mixins/TouchTargetMixin.js", "../components/Checkbox.js", "../components/Chip.js", "../components/Divider.js", "../components/DialogActions.js", "../aria/modal.js", "../components/Dialog.js", "../components/ExtendedFab.js", "../components/Tooltip.js", "../utils/popup.js", "../mixins/TooltipTriggerMixin.js", "../components/Fab.js", "../components/FilterChip.js", "../components/Headline.js", "../components/IconButton.js", "../mixins/TextFieldMixin.js", "../components/Input.js", "../components/Label.js", "../components/Layout.js", "../components/List.js", "../components/RadioIcon.js", "../components/ListItem.js", "../components/ListOption.js", "../dom/HTMLOptionsCollectionProxy.js", "../components/ListSelect.js", "../components/Menu.js", "../components/MenuItem.js", "../mixins/ScrollListenerMixin.js", "../components/NavItem.js", "../components/Nav.js", "../components/NavBar.js", "../components/NavBarItem.js", "../components/NavRail.js", "../components/NavDrawer.js", "../components/NavDrawerItem.js", "../components/NavRailItem.js", "../components/Pane.js", "../components/Progress.js", "../components/Radio.js", "../components/SegmentedButton.js", "../components/SegmentedButtonGroup.js", "../components/Select.js", "../components/Slider.js", "../components/Snackbar.js", "../components/Shape.js", "../components/SwitchIcon.js", "../components/Switch.js", "../components/Tab.js", "../mixins/RTLObserverMixin.js", "../mixins/ResizeObserverMixin.js", "../components/TabList.js", "../components/TabPanel.js", "../components/TabContent.js", "../components/TextArea.js", "../components/Title.js", "../components/TopAppBar.js", "../theming/loader.js", "../theming/index.js", "../utils/color_keywords.js", "../utils/hct/mathUtils.js", "../utils/hct/colorUtils.js", "../utils/hct/ViewingConditions.js", "../utils/hct/Cam16.js", "../utils/hct/hctSolver.js", "../utils/hct/Hct.js", "../utils/hct/TonalPalette.js", "../utils/hct/CorePalette.js", "../utils/hct/Scheme.js", "../utils/hct/blend.js", "../utils/hct/helper.js", "../utils/svg.js"],
4
- "sourcesContent": ["/**\n * @param {Iterable<HTMLStyleElement|CSSStyleSheet>} styles\n * @yields composed CSSStyleSheet\n * @return {Generator<CSSStyleSheet>} composed CSSStyleSheet\n */\nexport function* generateCSSStyleSheets(styles) {\n for (const style of styles) {\n if (style instanceof HTMLStyleElement) {\n const sheet = new CSSStyleSheet();\n sheet.replaceSync(style.textContent);\n yield sheet;\n } else if (style.ownerNode) {\n console.warn('Stylesheet is part of style');\n const sheet = new CSSStyleSheet();\n sheet.replaceSync([...style.cssRules].map((r) => r.cssText).join(''));\n yield sheet;\n } else {\n yield style;\n }\n }\n}\n\n/** @type {WeakMap<CSSStyleSheet, HTMLStyleElement>} */\nconst styleElementWrappers = new WeakMap();\n\n/**\n * @param {Iterable<HTMLStyleElement|CSSStyleSheet>} styles\n * @yields composed HTMLStyleElement\n * @return {Generator<HTMLStyleElement>} composed CSSStyleSheet\n */\nexport function* generateHTMLStyleElements(styles) {\n for (const style of styles) {\n if (style instanceof HTMLStyleElement) {\n yield style;\n } else if (style.ownerNode instanceof HTMLStyleElement) {\n // console.log('Cloning parent HTMLStyleElement instead');\n // @ts-ignore Skip cast\n yield style.ownerNode.cloneNode(true);\n } else {\n let styleElement = styleElementWrappers.get(style);\n if (!styleElement) {\n console.warn('Manually constructing HTMLStyleElement', [...style.cssRules].map((r) => r.cssText).join('\\n'));\n styleElement = document.createElement('style');\n styleElement.textContent = [...style.cssRules].map((r) => r.cssText).join('');\n styleElementWrappers.set(style, styleElement);\n }\n // @ts-ignore Skip cast\n yield styleElement.cloneNode(true);\n }\n }\n}\n", "const PREFIX = '_mdw-';\n\n/** @type {Set<string>} */\nconst generatedUIDs = new Set();\n\n/** @return {string} */\nexport function generateUID() {\n const id = Math.random().toString(36).slice(2, 10);\n if (generatedUIDs.has(id)) {\n return generateUID();\n }\n generatedUIDs.add(id);\n return id;\n}\n\n/**\n * @param {Element} element\n * @param {boolean} [mutate=false]\n * @return {string}\n */\nexport function identifierFromElement(element, mutate) {\n if (element.id) {\n return element.id;\n }\n if (!mutate) {\n return null;\n }\n const id = PREFIX + generateUID();\n element.id = id;\n return id;\n}\n\n/**\n * @param {string} identifier\n * @param {Element} element\n * @return {boolean}\n */\nexport function identifierMatchesElement(identifier, element) {\n return element.id === identifier;\n}\n", "/** @link https://www.rfc-editor.org/rfc/rfc7396 */\n\n/**\n * @template T1\n * @template T2\n * @param {T1} target\n * @param {T2} patch\n * @return {T1|T2|(T1 & T2)}\n */\nexport function applyMergePatch(target, patch) {\n if (target === patch) return target;\n if (patch == null || typeof patch !== 'object') return patch;\n if (target != null && typeof target !== 'object') {\n target = {};\n }\n for (const [key, value] of Object.entries(patch)) {\n if (value == null) {\n if (key in target) {\n delete target[key];\n }\n } else {\n target[key] = applyMergePatch(target[key], value);\n }\n }\n return target;\n}\n\n/**\n * Creates a JSON Merge patch based\n * Allows different strategies for arrays\n * - `clone`: Per spec, clones all entries with no inspection.\n * - `object`: Convert to flattened, array-like objects. Requires\n * consumer of patch to be aware of the schema beforehand.\n * @param {object|number|string|boolean} previous\n * @param {object|number|string|boolean} current\n * @param {'clone'|'object'} [arrayStrategy='clone']\n * @return {any} Patch\n */\nexport function buildMergePatch(previous, current, arrayStrategy = 'clone') {\n if (previous === current) return null;\n if (current == null || typeof current !== 'object') return current;\n if (previous == null || typeof previous !== 'object') {\n return structuredClone(current);\n }\n const isArray = Array.isArray(current);\n if (isArray && arrayStrategy === 'clone') {\n return structuredClone(current);\n }\n\n const patch = {};\n const previousKeys = new Set(Object.keys(previous));\n for (const [key, value] of Object.entries(current)) {\n previousKeys.delete(key);\n if (value == null) {\n console.warn('Nullish value found at', key);\n continue;\n }\n const changes = buildMergePatch(previous[key], value, arrayStrategy);\n if (changes === null) {\n console.log('keeping', key);\n } else {\n patch[key] = changes;\n }\n }\n for (const key of previousKeys) {\n patch[key] = null;\n console.log('removing', key);\n }\n\n if (isArray && arrayStrategy === 'object' && current.length !== previous.length) {\n patch.length = current.length;\n }\n\n return patch;\n}\n\n/**\n * Short-circuited JSON Merge Patch evaluation\n * @template T\n * @param {T} target\n * @param {Partial<T>} patch\n * @return {boolean}\n */\nexport function hasMergePatch(target, patch) {\n if (target === patch) return false;\n if (patch == null || typeof patch !== 'object') return true;\n if (target != null && typeof target !== 'object') {\n return true;\n }\n for (const [key, value] of Object.entries(patch)) {\n if (value == null) {\n if (key in target) {\n return true;\n }\n } else if (hasMergePatch(target[key], value)) {\n return true;\n }\n }\n return false;\n}\n", "/* eslint-disable no-bitwise */\n\n/**\n * @param {any} value\n * @return {?string}\n */\nexport function attrValueFromDataValue(value) {\n switch (value) {\n case undefined:\n case null:\n case false:\n return null;\n case true:\n return '';\n default:\n return `${value}`;\n }\n}\n\n/**\n * Converts property name to attribute name\n * (Similar to DOMStringMap)\n * @param {string} name\n * @return {string}\n */\nexport function attrNameFromPropName(name) {\n const attrNameWords = name.split(/([A-Z])/);\n if (attrNameWords.length === 1) return name;\n return attrNameWords.reduce((prev, curr) => {\n if (prev == null) return curr;\n if (curr.length === 1 && curr.toUpperCase() === curr) {\n return `${prev}-${curr.toLowerCase()}`;\n }\n return prev + curr;\n });\n}\n\nconst IS_FIREFOX = globalThis?.navigator?.userAgent.includes('Firefox');\n\n/**\n * @param {Element} element\n * @return {boolean}\n */\nexport function isFocused(element) {\n if (!element) return false;\n if (IS_FIREFOX && element.constructor.formAssociated && element.hasAttribute('disabled')) {\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1818287\n console.warn('Firefox bug 1818287: Disabled form associated custom element cannot receive focus.');\n return false;\n }\n if (document.activeElement === element) return true;\n if (!element.isConnected) return false;\n if (element?.getRootNode() === document) return false; // isInLightDOM\n // console.debug('checking shadowdom', element, element.matches(':focus'));\n return element.matches(':focus');\n}\n\n/**\n * @param {HTMLElement|Element} element\n * @param {Parameters<HTMLElement['focus']>} [options]\n * @return {boolean} Focus was successful\n */\nexport function attemptFocus(element, ...options) {\n if (!element) return false;\n try {\n // @ts-expect-error Use catch if not HTMLElement\n element.focus(...options);\n } catch (e) {\n console.error(e);\n return false;\n // Ignore error.\n }\n return isFocused(element);\n}\n\n/**\n * @param {Element} element\n * @return {boolean}\n */\nexport function isRtl(element) {\n return getComputedStyle(element).direction === 'rtl';\n}\n", "import { buildMergePatch, hasMergePatch } from '../utils/jsonMergePatch.js';\n\nimport { attrNameFromPropName } from './dom.js';\n\n/** @typedef {import('./typings.js').ObserverPropertyType} ObserverPropertyType */\n\n/** @return {null} */\nconst DEFAULT_NULL_PARSER = () => null;\n\n/**\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean#boolean_coercion\n * @param {any} v\n * @return {boolean}\n */\nconst DEFAULT_BOOLEAN_PARSER = (v) => !!v;\n\n/**\n * Doesn't support `BigInt` types\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number#number_coercion\n * @param {any} v\n * @return {number}\n */\nconst DEFAULT_NUMBER_PARSER = (v) => +v;\n\n/**\n * Doesn't support `Symbol` types\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String#string_coercion\n * @param {any} v\n * @return {string}\n */\nconst DEFAULT_STRING_PARSER = (v) => `${v}`;\n\n/**\n * @template T\n * @param {T} o\n * @return {T}\n */\nconst DEFAULT_OBJECT_PARSER = (o) => o;\n\n/**\n * @template T\n * @param {T} a\n * @param {T} b\n * @return {boolean} true if equal\n */\nexport const DEFAULT_OBJECT_COMPARATOR = (a, b) => !hasMergePatch(a, b);\n\n/**\n * @template T\n * @param {T} a\n * @param {T} b\n * @return {boolean} true if equal\n */\nexport const DEFAULT_OBJECT_DIFF = (a, b) => buildMergePatch(a, b, 'object');\n\n/**\n * @param {ObserverPropertyType} type\n * @return {any}\n */\nfunction emptyFromType(type) {\n switch (type) {\n case 'boolean':\n return false;\n case 'integer':\n case 'float':\n return 0;\n case 'map':\n return new Map();\n case 'set':\n return new Set();\n case 'array':\n return [];\n case 'object':\n return null;\n default:\n case 'string':\n return '';\n }\n}\n\n/**\n * @param {ObserverPropertyType} type\n * @return {any}\n */\nfunction defaultParserFromType(type) {\n switch (type) {\n case 'boolean':\n return DEFAULT_BOOLEAN_PARSER;\n case 'integer':\n // Calls ToNumber(x)\n return Math.round;\n case 'float':\n return DEFAULT_NUMBER_PARSER;\n case 'map':\n return Map;\n case 'set':\n return Set;\n case 'object':\n return DEFAULT_OBJECT_PARSER;\n case 'array':\n return Array.from;\n default:\n case 'string':\n return DEFAULT_STRING_PARSER;\n }\n}\n\n/**\n * @template {string} K\n * @template {ObserverPropertyType} [T1=any]\n * @template {any} [T2=import('./typings.js').ParsedObserverPropertyType<T1>]\n * @param {K} name\n * @param {T1|import('./typings.js').ObserverOptions<T1,T2>} [typeOrOptions='string']\n * @param {any} object\n * @return {import('./typings.js').ObserverConfiguration<T1,T2,K> & import('./typings.js').ObserverOptions<T1,T2>}\n */\nexport function parseObserverOptions(name, typeOrOptions, object) {\n /** @type {Partial<import('./typings.js').ObserverOptions<T1,T2>>} */\n const options = {\n ...((typeof typeOrOptions === 'string') ? { type: typeOrOptions } : typeOrOptions),\n };\n\n let { enumerable, attr, reflect } = options;\n const { type, empty, changedCallback } = options;\n\n /** @type {ObserverPropertyType} */\n let parsedType = type;\n if (parsedType == null) {\n // Use .value or .get() to parse type\n const value = options.value ?? empty ?? options.get?.call(object ?? {}, object ?? {});\n if (value == null) {\n parsedType = 'string';\n } else {\n const parsed = typeof value;\n parsedType = (parsed === 'number')\n ? (Number.isInteger(value) ? 'integer' : 'number')\n : parsed;\n }\n }\n\n enumerable ??= name[0] !== '_';\n reflect ??= enumerable ? parsedType !== 'object' : (attr ? 'write' : false);\n attr ??= (reflect ? attrNameFromPropName(name) : null);\n\n // if defined ? value\n // else if boolean ? false\n // else if onNullish ? false\n // else if empty == null\n const parser = options.parser ?? defaultParserFromType(parsedType);\n let nullParser = options.nullParser;\n let parsedEmpty = empty ?? null;\n if (!nullParser) {\n const nullable = options.nullable ?? (\n parsedType === 'boolean'\n ? false\n : (empty == null));\n if (nullable) {\n nullParser = DEFAULT_NULL_PARSER;\n } else {\n parsedEmpty ??= emptyFromType(parsedType);\n nullParser = parsedEmpty === null ? () => emptyFromType(parsedType) : () => parsedEmpty;\n }\n }\n\n let isFn = options.is;\n if (!isFn) {\n isFn = parsedType === 'object'\n ? DEFAULT_OBJECT_COMPARATOR\n : Object.is;\n }\n\n const diff = 'diff' in options\n ? options.diff\n : ((parsedType === 'object') ? DEFAULT_OBJECT_DIFF : null);\n\n return {\n ...options,\n type: parsedType,\n is: isFn,\n diff,\n attr,\n reflect,\n readonly: options.readonly ?? false,\n enumerable,\n value: options.value ?? parsedEmpty,\n parser,\n nullParser,\n key: name,\n changedCallback,\n watchers: options.watchers ?? [],\n values: options.values ?? new WeakMap(),\n computedValues: options.computedValues ?? new WeakMap(),\n attributeChangedCallback: options.attributeChangedCallback,\n needsSelfInvalidation: options.needsSelfInvalidation ?? new WeakSet(),\n };\n}\n\nconst INIT_SYMBOL = Symbol('PROP_INIT');\n\n/** @type {Partial<import('./typings.js').ObserverConfiguration<?,?,?>>} */\nconst DEFAULT_OBSERVER_CONFIGURATION = {\n nullParser: DEFAULT_NULL_PARSER,\n is: Object.is,\n INIT_SYMBOL,\n};\n\n/**\n * @this {import('./typings.js').ObserverConfiguration<?,?,?>}\n * @param {*} value\n */\nexport function parsePropertyValue(value) {\n let newValue = value;\n newValue = value == null\n ? this.nullParser.call(this, value)\n : this.parser.call(this, newValue);\n}\n\n/**\n * @param {(data: Partial<any>) => any} fn\n * @param {any} arg0\n * @param {any} args[]\n * @param {...any} args\n * @this {any}\n * @return {{props:Set<string>, defaultValue:any, reusable: boolean}}\n */\nexport function observeFunction(fn, arg0, ...args) {\n const argPoked = new Set();\n const thisPoked = new Set();\n\n /**\n * @template {Object} T\n * @param {T} proxyTarget\n * @param {Set<string>} set\n * @param {string} [prefix]\n * @return {T}\n */\n function buildProxy(proxyTarget, set, prefix) {\n return new Proxy(proxyTarget, {\n get(target, p) {\n const arg = prefix ? `${prefix}.${p}` : p;\n set.add(arg);\n const value = Reflect.get(target, p);\n if (typeof value === 'object' && value != null) {\n console.debug('tried to arg poke object get', p, value);\n return buildProxy(value, set, arg);\n }\n return value;\n },\n has(target, p) {\n const arg = prefix ? `${prefix}.p` : p;\n set.add(arg);\n const value = Reflect.has(target, p);\n return value;\n },\n });\n }\n\n const argProxy = buildProxy(arg0, argPoked);\n const thisProxy = buildProxy(this ?? arg0, thisPoked);\n const defaultValue = fn.call(thisProxy, argProxy, ...args);\n /* Arrow functions can reused if they don't poke `this` */\n const reusable = fn.name ? true : !thisPoked.size;\n\n const props = new Set([\n ...argPoked,\n ...thisPoked,\n ]);\n\n return {\n props,\n defaultValue,\n reusable,\n };\n}\n\n/**\n * @template {ObserverPropertyType} T1\n * @template {any} T2\n * @template {string} K\n * @template [C=any]\n * @param {C} object\n * @param {K} key\n * @param {import('./typings.js').ObserverOptions<T1, T2, C>} options\n * @return {import('./typings.js').ObserverConfiguration<T1,T2,K,C>}\n */\nexport function defineObservableProperty(object, key, options) {\n /** @type {import('./typings.js').ObserverConfiguration<T1,T2,K,C>} */\n const config = {\n ...DEFAULT_OBSERVER_CONFIGURATION,\n ...parseObserverOptions(key, options, object),\n changedCallback: options.changedCallback,\n };\n\n /**\n * @param {T2} oldValue\n * @param {T2} value\n * @return {boolean} changed\n */\n function detectChange(oldValue, value) {\n if (oldValue === value) return false;\n if (config.get) {\n // TODO: Custom getter vs parser\n }\n let newValue = value;\n newValue = (value == null)\n ? config.nullParser.call(this, value)\n : config.parser.call(this, newValue);\n\n let changes = newValue;\n if (oldValue == null) {\n if (newValue == null) return false; // Both nullish\n } else if (newValue != null) {\n if (oldValue === newValue) return false;\n if (config.diff) {\n changes = config.diff.call(this, oldValue, newValue);\n if (changes == null) return false;\n }\n if (config.is.call(this, oldValue, newValue)) return false;\n }\n\n config.values.set(this, newValue);\n // console.log(key, 'value.set', newValue);\n config.propChangedCallback?.call(this, key, oldValue, newValue, changes);\n config.changedCallback?.call(this, oldValue, newValue, changes);\n return true;\n }\n /**\n * @this {C}\n * @return {T2}\n */\n function internalGet() {\n return config.values.has(this) ? config.values.get(this) : config.value;\n }\n\n /**\n * @this {C}\n * @param {T2} value\n * @return {void}\n */\n function internalSet(value) {\n const oldValue = this[key];\n // console.log(key, 'internalSet', oldValue, '=>', value);\n detectChange.call(this, oldValue, value);\n }\n\n /** @return {void} */\n function onInvalidate() {\n // Current value is now invalidated. Recompute and check if changed\n const oldValue = config.computedValues.get(this);\n const newValue = this[key];\n // console.debug('observe: onInvalidate called for', key, oldValue, '=>', newValue, this);\n config.needsSelfInvalidation.delete(this);\n detectChange.call(this, oldValue, newValue);\n }\n\n if (config.get) {\n // Custom `get` uses computed values.\n // Invalidate computed value when dependent `prop` changes\n const { props } = observeFunction(config.get.bind(object), object, internalGet.bind(object));\n config.watchers.push(\n ...[...props].map((prop) => [prop, onInvalidate]),\n );\n // TODO: May be able to cache value if props are present\n }\n /** @type {Partial<PropertyDescriptor>} */\n const descriptor = {\n enumerable: config.enumerable,\n /**\n * @this {C}\n * @return {T2}\n */\n get() {\n if (config.get) {\n const newValue = config.get.call(this, this, internalGet.bind(this));\n // Store computed value internally. Used by onInvalidate to get previous value\n config.computedValues.set(this, newValue);\n return newValue;\n }\n return internalGet.call(this);\n },\n /**\n * @this {C}\n * @param {T2} value\n * @return {void}\n */\n set(value) {\n if (value === INIT_SYMBOL) {\n // console.log(key, 'returning due to INIT');\n return;\n }\n if (config.set) {\n config.needsSelfInvalidation.add(this);\n const oldValue = this[key];\n config.set.call(this, value, internalSet.bind(this));\n const newValue = this[key];\n if (!config.needsSelfInvalidation.has(this)) return;\n config.needsSelfInvalidation.delete(this);\n detectChange.call(this, oldValue, newValue);\n } else {\n internalSet.call(this, value);\n }\n },\n };\n\n Object.defineProperty(object, key, descriptor);\n\n return config;\n}\n", "import { generateUID } from './identify.js';\n\n/**\n * Property are bound to an ID+Node\n * Values are either getter or via an function\n * @template {any} T\n * @typedef {Object} InlineFunctionEntry\n * @prop {(data:T) => any} fn\n * @prop {Set<keyof T & string>} [props]\n * @prop {T} [defaultValue]\n */\n\n/** @type {Document} */\nlet _inactiveDocument;\n\n/** @type {boolean} */\nlet _cssStyleSheetConstructable;\n\n/**\n * @param {string} [fromString]\n * @return {DocumentFragment}\n */\nexport function generateFragment(fromString) {\n _inactiveDocument ??= document.implementation.createHTMLDocument();\n if (fromString == null) {\n return _inactiveDocument.createDocumentFragment();\n }\n return _inactiveDocument.createRange().createContextualFragment(fromString);\n}\n\n/** @type {Map<string, InlineFunctionEntry<?>>} */\nexport const inlineFunctions = new Map();\n\n/**\n * @template T\n * @typedef {Object} RenderOptions\n * @prop {Object} context\n * @prop {ParentNode} root\n * @prop {Object<string, HTMLElement>} refs\n */\n\n/**\n * @param {(data: Partial<any>) => any} fn\n * @return {string}\n */\nexport function addInlineFunction(fn) {\n const internalName = `#${generateUID()}`;\n inlineFunctions.set(internalName, { fn });\n return `{${internalName}}`;\n}\n\n/** @type {Map<string, CSSStyleSheet>} */\nconst cssStyleSheetsCache = new Map();\n\n/** @type {Map<string, HTMLStyleElement>} */\nconst styleElementCache = new Map();\n\n/**\n * @param {TemplateStringsArray} array\n * @param {...(string)} substitutions\n * @return {HTMLStyleElement|CSSStyleSheet}\n */\nexport function css(array, ...substitutions) {\n const content = String.raw({ raw: array }, ...substitutions);\n\n if (_cssStyleSheetConstructable == null) {\n try {\n const sheet = new CSSStyleSheet();\n _cssStyleSheetConstructable = true;\n sheet.replaceSync(content);\n cssStyleSheetsCache.set(content, sheet);\n return sheet;\n } catch {\n _cssStyleSheetConstructable = false;\n }\n }\n\n if (_cssStyleSheetConstructable) {\n let sheet = cssStyleSheetsCache.get(content);\n if (!sheet) {\n sheet = new CSSStyleSheet();\n _cssStyleSheetConstructable = true;\n sheet.replaceSync(content);\n cssStyleSheetsCache.set(content, sheet);\n }\n return sheet;\n }\n\n let style = styleElementCache.get(content);\n if (!style) {\n _inactiveDocument ??= document.implementation.createHTMLDocument();\n style = _inactiveDocument.createElement('style');\n style.textContent = content;\n styleElementCache.set(content, style);\n }\n return /** @type {HTMLStyleElement} */ (style.cloneNode(true));\n}\n\n/** @type {Map<string, DocumentFragment>} */\nconst fragmentCache = new Map();\n/**\n * @template T1\n * @template T2\n * @param {TemplateStringsArray} strings\n * @param {...(string|DocumentFragment|Element|((this:T1, data:T2) => any))} substitutions\n * @return {DocumentFragment}\n */\nexport function html(strings, ...substitutions) {\n /** @type {Map<string, DocumentFragment|Element>} */\n let tempSlots;\n const replacements = substitutions.map((sub) => {\n switch (typeof sub) {\n case 'string': return sub;\n case 'function': return addInlineFunction(sub);\n case 'object': {\n if (sub == null) {\n console.warn(sub, 'is null', strings);\n return '';\n }\n // Assume Element\n const tempId = generateUID();\n tempSlots ??= new Map();\n tempSlots.set(tempId, sub);\n return `<div id=\"${tempId}\"></div>`;\n }\n default:\n throw new Error(`Unexpected substitution: ${sub}`);\n }\n });\n const compiledString = String.raw({ raw: strings }, ...replacements);\n\n if (tempSlots) {\n const fragment = generateFragment(compiledString);\n for (const [id, element] of tempSlots) {\n const slot = fragment.getElementById(id);\n slot.replaceWith(element);\n }\n return fragment;\n }\n\n let fragment = fragmentCache.get(compiledString);\n if (!fragment) {\n fragment = generateFragment(compiledString);\n fragmentCache.set(compiledString, fragment);\n }\n\n return /** @type {DocumentFragment} */ (fragment.cloneNode(true));\n}\n", "/* eslint-disable sort-class-members/sort-class-members */\nimport { generateCSSStyleSheets, generateHTMLStyleElements } from './css.js';\nimport { identifierFromElement } from './identify.js';\nimport { observeFunction } from './observe.js';\nimport { generateFragment, inlineFunctions } from './template.js';\n\n/**\n * @template T\n * @typedef {Composition<?>|HTMLStyleElement|CSSStyleSheet|DocumentFragment|((this:T, changes:T) => any)|string} CompositionPart\n */\n\n/**\n * @template {any} T\n * @callback Compositor\n * @param {...(CompositionPart<T>)} parts source for interpolation (not mutated)\n * @return {Composition<T>}\n */\n\n/**\n * @template T\n * @typedef {Object} WatcherBindEntry\n * @prop {Function} fn\n * @prop {Set<keyof T & string>} props\n */\n\n/**\n * @template {any} T\n * @typedef {Object} NodeBindEntry\n * @prop {string} id\n * @prop {number} nodeType\n * @prop {string} node\n * @prop {boolean} [negate]\n * @prop {boolean} [doubleNegate]\n * @prop {Function} [fn]\n * @prop {Set<keyof T & string>} props\n * @prop {T} defaultValue\n */\n\n/** Splits: `{template}text{template}` as `['', 'template', 'text', 'template', '']` */\nconst STRING_INTERPOLATION_REGEX = /{([^}]*)}/g;\n\n/**\n * Returns event listener bound to shadow root host.\n * Use this function to avoid generating extra closures\n * @this {HTMLElement}\n * @param {Function} fn\n */\nfunction buildShadowRootChildListener(fn) {\n /** @param {Event & {currentTarget:{getRootNode: () => ShadowRoot}}} event */\n return function onShadowRootChildEvent(event) {\n const host = event.currentTarget.getRootNode().host;\n fn.call(host, event);\n };\n}\n\n/**\n *\n * @param {Object} object\n * @param {'dot'|'bracket'} [syntax]\n * @param {Object} [target]\n * @param {string} [scope]\n * @return {Object}\n */\nfunction flattenObject(object, syntax = 'dot', target = {}, scope = '') {\n for (const [key, value] of Object.entries(object)) {\n if (!key) continue; // Blank keys are not supported;\n const scopedKey = scope ? `${scope}.${key}` : key;\n target[scopedKey] = value;\n if (value != null && typeof value === 'object') {\n flattenObject(value, syntax, target, scopedKey);\n }\n }\n if (Array.isArray(object)) {\n const scopedKey = scope ? `${scope}.length` : 'length';\n target[scopedKey] = object.length;\n }\n return target;\n}\n\n/**\n * @example\n * entryFromPropName(\n * 'address.home.houseNumber',\n * {\n * address: {\n * home: {\n * houseNumber:35,\n * },\n * }\n * }\n * ) === {value:35}\n * @param {string} prop\n * @param {any} source\n * @return {null|[string, any]}\n */\nfunction entryFromPropName(prop, source) {\n let value = source;\n let child;\n for (child of prop.split('.')) {\n if (!child) throw new Error(`Invalid property: ${prop}`);\n if (child in value === false) return null;\n // @ts-ignore Skip cast\n value = value[child];\n }\n if (value === source) return null;\n return [child, value];\n}\n\n/**\n * @param {string} prop\n * @param {any} source\n * @return {any}\n */\nfunction valueFromPropName(prop, source) {\n let value = source;\n for (const child of prop.split('.')) {\n if (!child) return null;\n // @ts-ignore Skip cast\n value = value[child];\n if (value == null) return null;\n }\n if (value === source) return null;\n return value;\n}\n\n/** @template T */\nexport default class Composition {\n /**\n * Collection of property bindings.\n * @type {Map<keyof T & string, Set<NodeBindEntry<?>>>}\n */\n bindings = new Map();\n\n /**\n * Data of arrays used in templates\n * Usage of a [_for] will create an ArrayLike expectation based on key\n * Only store metadata, not actual data. Currently only needs length.\n * TBD if more is needed later\n * Referenced by property key (string)\n * @type {Map<keyof T & string, ArrayMetadata<T>}\n */\n arrayMetadata = new Map();\n\n /**\n * Collection of events to bind.\n * Indexed by ID\n * @type {Map<string, Set<import('./typings.js').CompositionEventListener<any>>>}\n */\n events = new Map();\n\n /**\n * Snapshot of composition at initial state.\n * This fragment can be cloned for first rendering, instead of calling\n * of using `render()` to construct the initial DOM tree.\n * @type {DocumentFragment}\n */\n cloneable;\n\n /**\n * Result of interpolation of the composition template.\n * Includes all DOM elements, which is used to reference for adding and\n * removing DOM elements during render.\n * @type {DocumentFragment}\n */\n interpolation;\n\n /** @type {(HTMLStyleElement|CSSStyleSheet)[]} */\n styles = [];\n\n /** @type {CSSStyleSheet[]} */\n adoptedStyleSheets = [];\n\n /** @type {DocumentFragment} */\n stylesFragment;\n\n /** @type {((this:T, changes:T) => any)[]} */\n watchers = [];\n\n /**\n * Maintains a reference list of elements used by render target (root).\n * When root is garbage collected, references are released.\n * This includes disconnected elements.\n * @type {WeakMap<Element|DocumentFragment, Map<string,HTMLElement>>}\n */\n referenceCache = new WeakMap();\n\n /**\n * Part of interpolation phase.\n * Maintains a reference list of conditional elements that were removed from\n * `cloneable` due to default state. Used to reconstruct conditional elements\n * with conditional children in default state as well (unlike `interpolation`).\n * @type {Map<string, {element: Element, id: string, parentId: string, commentCache: WeakMap<Element|DocumentFragment,Comment>}>}\n */\n conditionalElementMetadata = new Map();\n\n /** Flag set when template and styles have been interpolated */\n interpolated = false;\n\n /**\n * @param {(CompositionPart<T>)[]} parts\n */\n constructor(...parts) {\n /**\n * Template used to build interpolation and cloneable\n */\n this.template = generateFragment();\n this.append(...parts);\n }\n\n * [Symbol.iterator]() {\n for (const part of this.styles) {\n yield part;\n }\n yield this.template;\n for (const part of this.watchers) {\n yield part;\n }\n }\n\n /**\n * @param {CompositionPart<T>[]} parts\n */\n append(...parts) {\n for (const part of parts) {\n if (typeof part === 'string') {\n this.append(generateFragment(part.trim()));\n } else if (typeof part === 'function') {\n this.watchers.push(part);\n } else if (part instanceof Composition) {\n this.append(...part);\n } else if (part instanceof DocumentFragment) {\n this.template.append(part);\n } else if (part instanceof CSSStyleSheet || part instanceof HTMLStyleElement) {\n this.styles.push(part);\n }\n }\n // Allow chaining\n return this;\n }\n\n /** @param {import('./typings.js').CompositionEventListener<T>} listener */\n addCompositionEventListener(listener) {\n const key = listener.id ?? '';\n let set = this.events.get(key);\n if (!set) {\n set = new Set();\n this.events.set(key, set);\n }\n set.add(listener);\n return this;\n }\n\n /**\n * Updates component nodes based on data.\n * Expects data in JSON Merge Patch format\n * @see https://www.rfc-editor.org/rfc/rfc7386\n * @param {DocumentFragment|ShadowRoot} root where\n * @param {Partial<?>} changes what\n * @param {any} [context] who\n * @param {Partial<?>} [store] If needed, where to grab extra props\n * @return {void}\n */\n render(root, changes, context, store) {\n if (!this.initiallyRendered) this.initialRender(root, changes);\n\n if (!changes) return;\n\n const fnResults = new WeakMap();\n /** @type {WeakMap<Element, Set<string>>} */\n const modifiedNodes = new WeakMap();\n\n // Iterate data instead of bindings.\n // TODO: Avoid double iteration and flatten on-the-fly\n const flattened = flattenObject(changes);\n\n for (const [key, rawValue] of Object.entries(flattened)) {\n const entries = this.bindings.get(key);\n if (!entries) continue;\n for (const { id, node, nodeType, fn, props, negate, doubleNegate } of entries) {\n /* 1. Find Element */\n\n // TODO: Avoid unnecessary element creation.\n // If element can be fully reconstructed with internal properties,\n // skip recreation of element unless it actually needs to added to DOM.\n // Requires tracing of all properties used by conditional elements.\n const ref = this.getElement(root, id);\n if (!ref) {\n console.warn('Non existent id', id);\n continue;\n }\n if (!ref) continue;\n if (modifiedNodes.get(ref)?.has(node)) {\n // console.warn('Node already modified. Skipping', id, node);\n continue;\n }\n\n // if (!ref.parentElement && node !== '_if') {\n // if (ref.parentNode === root) {\n // console.debug('Offscreen? root? rendering', ref, node, ref.id, root.host.outerHTML);\n // } else {\n // console.debug('Offscreen rendering', ref, node, ref.id, root.host.outerHTML);\n // }\n // }\n\n /* 2. Compute value */\n let value;\n if (fn) {\n if (fnResults.has(fn)) {\n value = fnResults.get(fn);\n } else {\n const args = structuredClone(changes);\n for (const prop of props) {\n if (prop in flattened) continue;\n let lastIndexOfDot = prop.lastIndexOf('.');\n if (lastIndexOfDot === -1) {\n // console.debug('injected shallow', prop);\n args[prop] = store[prop];\n } else {\n // Relying on props being sorted...\n console.debug('need deep', prop);\n let entry;\n let propSearchKey = prop;\n let lastPropSearchKey = prop;\n while (!entry) {\n entry = entryFromPropName(propSearchKey, args);\n if (entry) {\n const propName = lastPropSearchKey.slice(propSearchKey.length + 1);\n entry[1][propName] = valueFromPropName(lastPropSearchKey, store);\n break;\n }\n if (lastIndexOfDot === -1) break;\n lastPropSearchKey = prop;\n propSearchKey = prop.slice(0, lastIndexOfDot);\n lastIndexOfDot = propSearchKey.lastIndexOf(',');\n }\n if (!entry) {\n console.warn('what do?');\n }\n }\n }\n value = fn.call(context, args);\n fnResults.set(fn, value);\n }\n } else {\n value = rawValue;\n }\n\n /* 3. Operate on value */\n if (doubleNegate) {\n value = !!value;\n } else if (negate) {\n value = !value;\n }\n\n /* 4. Find Target Node */\n if (nodeType === Node.TEXT_NODE) {\n const index = (node === '#text')\n ? 0\n : Number.parseInt(node.slice('#text'.length), 10);\n let nodesFound = 0;\n for (const childNode of ref.childNodes) {\n if (childNode.nodeType !== Node.TEXT_NODE) continue;\n if (index !== nodesFound++) continue;\n childNode.nodeValue = value ?? '';\n break;\n }\n if (index > nodesFound) {\n console.warn('Node not found, adding?');\n ref.append(value);\n }\n } else if (node === '_if') {\n const attached = root.contains(ref);\n const orphaned = ref.parentElement == null && ref.parentNode !== root;\n const shouldShow = value !== null && value !== false;\n if (orphaned && ref.parentNode) {\n console.warn('Orphaned with parent node?', id, { attached, orphaned, shouldShow }, ref.parentNode);\n }\n if (attached !== !orphaned) {\n console.warn('Conditional state', id, { attached, orphaned, shouldShow });\n console.warn('Not attached and not orphaned. Should do nothing?', ref, ref.parentElement);\n }\n if (shouldShow) {\n if (orphaned) {\n const metadata = this.conditionalElementMetadata.get(id);\n if (!metadata) {\n console.error(id);\n throw new Error('Could not find conditional element metadata');\n }\n\n let comment = metadata.commentCache.get(root);\n if (!comment) {\n console.debug('Composition: Comment not cached, building first time');\n const parent = metadata.parentId\n ? this.getElement(root, metadata.parentId)\n : root;\n if (!parent) {\n console.error(id);\n throw new Error('Could not find reference parent!');\n }\n\n const commentText = `{#${id}}`;\n for (const child of parent.childNodes) {\n if (child.nodeType !== Node.COMMENT_NODE) continue;\n if ((/** @type {Comment} */child).nodeValue === commentText) {\n comment = child;\n break;\n }\n }\n metadata.commentCache.set(this, comment);\n }\n if (comment) {\n console.debug('Composition: Add', id, 'back', ref.outerHTML);\n comment.replaceWith(ref);\n } else {\n console.warn('Could not add', id, 'back to parent');\n }\n }\n } else if (!orphaned) {\n const metadata = this.conditionalElementMetadata.get(id);\n if (!metadata) {\n console.error(id);\n throw new Error(`Could not find conditional element metadata for ${id}`);\n }\n let comment = metadata.commentCache.get(root);\n if (!comment) {\n comment = new Comment(`{#${id}}`);\n metadata.commentCache.set(this, comment);\n }\n console.debug('Composition: Remove', id, ref.outerHTML);\n ref.replaceWith(comment);\n }\n } else if (value === false || value == null) {\n ref.removeAttribute(node);\n } else {\n ref.setAttribute(node, value === true ? '' : value);\n }\n\n /* 5. Mark Node as modified */\n let set = modifiedNodes.get(ref);\n if (!set) {\n set = new Set();\n modifiedNodes.set(ref, set);\n }\n set.add(node);\n }\n }\n }\n\n /**\n * @param {Attr|Text} node\n * @param {Element} element\n * @param {Object} [defaults]\n * @param {string} [parsedValue]\n * @return {boolean} Remove node\n */\n #interpolateNode(node, element, defaults, parsedValue) {\n const { nodeValue, nodeName, nodeType } = node;\n\n if (parsedValue == null) {\n if (!nodeValue) return false;\n const trimmed = nodeValue.trim();\n if (!trimmed) return false;\n if (nodeType === Node.ATTRIBUTE_NODE) {\n if (trimmed[0] !== '{') return false;\n const { length } = trimmed;\n if (trimmed[length - 1] !== '}') return false;\n parsedValue = trimmed.slice(1, -1);\n } else {\n // Split text node into segments\n // TODO: Benchmark indexOf pre-check vs regex\n\n const segments = trimmed.split(STRING_INTERPOLATION_REGEX);\n if (segments.length < 3) return false;\n if (segments.length === 3 && !segments[0] && !segments[2]) {\n parsedValue = segments[1];\n } else {\n segments.forEach((segment, index) => {\n // is even = is template string\n if (index % 2) {\n const newNode = new Text();\n node.before(newNode);\n this.#interpolateNode(newNode, element, defaults, segment);\n } else {\n if (!segment) return; // blank\n node.before(segment);\n }\n });\n // node.remove();\n return true;\n }\n }\n }\n\n const negate = parsedValue[0] === '!';\n let doubleNegate = false;\n if (negate) {\n parsedValue = parsedValue.slice(1);\n doubleNegate = parsedValue[0] === '!';\n if (doubleNegate) {\n parsedValue = parsedValue.slice(1);\n }\n }\n\n let isEvent;\n let textNodeIndex;\n\n if (nodeType === Node.TEXT_NODE) {\n // eslint-disable-next-line unicorn/consistent-destructuring\n if (element !== node.parentElement) {\n console.warn('mismatch?');\n element = node.parentElement;\n }\n textNodeIndex = 0;\n let prev = node;\n while ((prev = prev.previousSibling)) {\n if (prev.nodeType === Node.TEXT_NODE) {\n textNodeIndex++;\n }\n }\n } else {\n // @ts-ignore Skip cast\n // eslint-disable-next-line unicorn/consistent-destructuring\n if (element !== node.ownerElement) {\n console.warn('mismatch?');\n element = node.ownerElement;\n }\n if (nodeName.startsWith('on')) {\n // Do not interpolate inline event listeners\n if (nodeName[2] !== '-') return false;\n isEvent = true;\n }\n }\n\n const id = identifierFromElement(element, true);\n\n if (isEvent) {\n const eventType = nodeName.slice(3);\n const [, flags, type] = eventType.match(/^([*1~]+)?(.*)$/);\n const options = {\n once: flags?.includes('1'),\n passive: flags?.includes('~'),\n capture: flags?.includes('*'),\n };\n\n element.removeAttribute(nodeName);\n\n let set = this.events.get(id);\n if (!set) {\n set = new Set();\n this.events.set(id, set);\n }\n if (parsedValue.startsWith('#')) {\n set.add({ type, handleEvent: inlineFunctions.get(parsedValue).fn, ...options });\n } else {\n set.add({ type, prop: parsedValue, ...options });\n }\n return false;\n }\n\n /** @type {Function} */\n let fn;\n /** @type {Set<string>} */\n let props;\n\n /** @type {any} */\n let defaultValue;\n let inlineFunctionOptions;\n // Is Inline Function?\n if (parsedValue.startsWith('#')) {\n inlineFunctionOptions = inlineFunctions.get(parsedValue);\n if (!inlineFunctionOptions) {\n console.warn(`Invalid interpolation value: ${parsedValue}`);\n return false;\n }\n if (inlineFunctionOptions.props) {\n console.log('This function has already been called. Reuse props', inlineFunctionOptions, this);\n props = inlineFunctionOptions.props;\n defaultValue = inlineFunctionOptions.defaultValue ?? null;\n } else {\n defaultValue = inlineFunctionOptions.fn;\n }\n } else {\n defaultValue = valueFromPropName(parsedValue, defaults);\n }\n\n if (!props) {\n if (typeof defaultValue === 'function') {\n // Value must be reinterpolated and function observed\n const observeResult = observeFunction.call(this, defaultValue, defaults);\n fn = defaultValue;\n defaultValue = observeResult.defaultValue;\n props = observeResult.props;\n // console.log(this.static.name, fn.name || parsedValue, combinedSet);\n } else {\n props = new Set([parsedValue]);\n }\n }\n\n if (typeof defaultValue === 'symbol') {\n console.warn(': Invalid binding:', parsedValue);\n defaultValue = null;\n }\n\n if (doubleNegate) {\n defaultValue = !!defaultValue;\n } else if (negate) {\n defaultValue = !defaultValue;\n }\n\n if (inlineFunctionOptions) {\n inlineFunctionOptions.defaultValue = defaultValue;\n inlineFunctionOptions.props = props;\n }\n\n // Bind\n const parsedNodeName = textNodeIndex ? nodeName + textNodeIndex : nodeName;\n const entry = { id, node: parsedNodeName, fn, props, nodeType, defaultValue, negate, doubleNegate };\n for (const prop of props) {\n let set = this.bindings.get(prop);\n if (!set) {\n set = new Set();\n this.bindings.set(prop, set);\n }\n set.add(entry);\n }\n\n // Mutate\n\n if (nodeType === Node.TEXT_NODE) {\n node.nodeValue = defaultValue ?? '';\n } else if (nodeName === '_if') {\n element.removeAttribute(nodeName);\n if (defaultValue == null || defaultValue === false) {\n // If default state is removed, mark for removal\n return true;\n }\n } else if (defaultValue == null || defaultValue === false) {\n element.removeAttribute(nodeName);\n } else {\n element.setAttribute(nodeName, defaultValue === true ? '' : defaultValue);\n }\n return false;\n }\n\n /**\n * @param {Object} [defaults]\n */\n interpolate(defaults) {\n // console.log('Template', [...this.template.children].map((child) => child.outerHTML).join('\\n'));\n\n // Copy template before working on it\n // Store into `cloneable` to split later into `interpolation`\n this.cloneable = /** @type {DocumentFragment} */ (this.template.cloneNode(true));\n\n /**\n * Track elements to be removed before using for cloning\n * @type {Element[]}\n */\n const removalList = [];\n\n const TREE_WALKER_FILTER = 5; /* NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT */\n\n const treeWalker = document.createTreeWalker(this.cloneable, TREE_WALKER_FILTER);\n let node = treeWalker.nextNode();\n while (node) {\n /** @type {Element} */\n let element = null;\n let removeElement = false;\n switch (node.nodeType) {\n case Node.ELEMENT_NODE:\n element = node;\n if (element instanceof HTMLTemplateElement) {\n node = treeWalker.nextSibling();\n continue;\n }\n if (node instanceof HTMLStyleElement) {\n // Move style elements out of cloneable\n if (node.parentNode === this.cloneable) {\n this.styles.push(node);\n node.remove();\n node = treeWalker.nextSibling();\n continue;\n }\n console.warn('<style> element not moved');\n }\n if (node instanceof HTMLScriptElement) {\n console.warn('<script> element found.');\n node.remove();\n node = treeWalker.nextSibling();\n continue;\n }\n for (const attr of [...element.attributes].reverse()) {\n if (attr.nodeName === '_if') {\n // Ensure elements to be removed has identifiable parent\n const id = identifierFromElement(element, true);\n const parentId = element.parentElement\n ? identifierFromElement(element.parentElement, true)\n : null;\n this.conditionalElementMetadata.set(id, {\n element,\n id,\n parentId,\n commentCache: new WeakMap(),\n });\n }\n removeElement ||= this.#interpolateNode(attr, element, defaults);\n }\n\n break;\n case Node.TEXT_NODE:\n element = node.parentNode;\n if (this.#interpolateNode(/** @type {Text} */ (node), element, defaults)) {\n const nextNode = treeWalker.nextNode();\n node.remove();\n node = nextNode;\n continue;\n }\n\n break;\n default:\n throw new Error(`Unexpected node type: ${node.nodeType}`);\n }\n if (removeElement) {\n removalList.push(element);\n }\n node = treeWalker.nextNode();\n }\n\n // Split into `interpolation` before removing elements\n /** @type {DocumentFragment} */\n this.interpolation = /** @type {DocumentFragment} */ (this.cloneable.cloneNode(true));\n\n // console.debug('Interpolated', [...this.interpolation.children].map((child) => child.outerHTML).join('\\n'));\n\n // Remove elements from `cloneable` and place comment placeholders\n // Remove in reverse so conditionals within conditionals are properly isolated\n for (const element of [...removalList].reverse()) {\n const { id } = element;\n element.replaceWith(new Comment(`{#${id}}`));\n }\n\n for (const watcher of this.watchers) {\n this.bindWatcher(watcher, defaults);\n }\n\n if ('adoptedStyleSheets' in document) {\n this.adoptedStyleSheets = [\n ...generateCSSStyleSheets(this.styles),\n ];\n } else {\n this.stylesFragment = generateFragment();\n this.stylesFragment.append(\n ...generateHTMLStyleElements(this.styles),\n );\n }\n\n this.interpolated = true;\n\n // console.log('Cloneable', [...this.cloneable.children].map((child) => child.outerHTML).join('\\n'));\n }\n\n /**\n * Updates component nodes based on data\n * Expects data in JSON Merge Patch format\n * @see https://www.rfc-editor.org/rfc/rfc7386\n * @param {DocumentFragment|ShadowRoot} root where\n * @param {Partial<?>} data what\n * @return {void}\n */\n initialRender(root, data) {\n if (!this.interpolated) this.interpolate(data);\n\n if ('adoptedStyleSheets' in root) {\n root.adoptedStyleSheets = [\n ...root.adoptedStyleSheets,\n ...this.adoptedStyleSheets,\n ];\n } else if (root instanceof ShadowRoot) {\n root.append(this.stylesFragment.cloneNode(true));\n } else {\n // TODO: Support document styles\n // console.warn('Cannot apply styles to singular element');\n }\n\n root.append(this.cloneable.cloneNode(true));\n\n // console.log('Initial render', [...root.children].map((child) => child.outerHTML).join('\\n'));\n\n /** @type {EventTarget} */\n const rootEventTarget = root instanceof ShadowRoot ? root.host : root;\n // Bind events in reverse order to support stopImmediatePropagation\n for (const [id, events] of [...this.events].reverse()) {\n // Prepare all event listeners first\n for (const entry of [...events].reverse()) {\n let listener = entry.listener;\n if (!listener) {\n if (root instanceof ShadowRoot) {\n listener = entry.handleEvent ?? valueFromPropName(entry.prop, data);\n if (id) {\n // Wrap to retarget this\n listener = buildShadowRootChildListener(listener);\n }\n // Cache and reuse\n entry.listener = listener;\n // console.log('caching listener', entry);\n } else {\n throw new TypeError('Anonymous event listeners cannot be used in templates');\n // console.warn('creating new listener', entry);\n // listener = entry.handleEvent ?? ((event) => {\n // valueFromPropName(entry.prop, data)(event);\n // });\n }\n }\n const eventTarget = id ? root.getElementById(id) : rootEventTarget;\n if (!eventTarget) {\n // Element is not available yet. Bind on reference\n console.debug('Composition: Skip bind events for', id);\n continue;\n }\n eventTarget.addEventListener(entry.type, listener, entry);\n }\n }\n\n this.initiallyRendered = true;\n }\n\n /**\n * @param {string} id\n * @param {Element} element\n */\n attachEventListeners(id, element) {\n const events = this.events.get(id);\n if (events) {\n console.debug('attaching events for', id);\n } else {\n // console.log('no events for', id);\n return;\n }\n for (const entry of [...this.events.get(id)].reverse()) {\n const { listener } = entry;\n if (!listener) {\n throw new Error('Template must be interpolated before attaching events');\n }\n element.addEventListener(entry.type, listener, entry);\n }\n }\n\n /**\n * @param {Element|DocumentFragment} root\n * @return {Map<string,Element>}\n */\n getReferences(root) {\n let references = this.referenceCache.get(root);\n if (!references) {\n references = new Map();\n this.referenceCache.set(root, references);\n }\n return references;\n }\n\n /**\n * @param {ShadowRoot|DocumentFragment} root\n * @param {string} id\n * @return {Element}\n */\n getElement(root, id) {\n const references = this.getReferences(root);\n let element = references.get(id);\n if (element) {\n // console.log('Returning from cache', id);\n return element;\n }\n if (element === null) return null; // Cached null response\n\n // Undefined\n\n // console.log('Search in DOM', id);\n element = root.getElementById(id);\n\n if (element) {\n // console.log('Found in DOM', id);\n references.set(id, element);\n return element;\n }\n\n // Element not in DOM means child of conditional element\n /** @type {Element} */\n let anchorElement;\n\n // Check if element is conditional\n let cloneTarget = this.conditionalElementMetadata.get(id)?.element;\n\n if (!cloneTarget) {\n // Check if element even exists in interpolation\n // Check interpolation (full-tree) first\n const interpolatedElement = this.interpolation.getElementById(id);\n if (!interpolatedElement) {\n console.warn('Not in full-tree', id);\n // Cache not in full composition\n references.set(id, null);\n return null;\n }\n // Iterate backgrounds until closest conditional element\n // const anchorElementId = this.template.getElementById(id).closest('[_if]').id;\n // anchorElement = this.references.get(anchorElementId) this.interpolation.getElementById(anchorElementId).cloneNode(true);\n let parentElement = interpolatedElement;\n while ((parentElement = parentElement.parentElement) != null) {\n const parentId = parentElement.id;\n if (!parentId) {\n console.warn('Parent does not have ID!');\n cloneTarget = parentElement;\n continue;\n }\n\n // Parent already referenced\n const referencedParent = references.get(parentId);\n if (referencedParent) {\n // Element may have been removed without ever tree-walking\n console.debug('Parent already referenced', parentId, '>', id);\n anchorElement = referencedParent;\n break;\n }\n\n const liveElement = root.getElementById(parentId);\n if (liveElement) {\n console.warn('Parent in DOM and not referenced', parentId, '>', id);\n // Parent already in DOM. Cache reference\n references.set(parentId, liveElement);\n anchorElement = referencedParent;\n break;\n }\n\n const conditionalParent = this.conditionalElementMetadata.get(parentId)?.element;\n if (conditionalParent) {\n console.debug('Found parent conditional element', parentId, '>', id);\n cloneTarget = conditionalParent;\n break;\n }\n\n cloneTarget = parentElement;\n }\n }\n\n anchorElement ??= /** @type {Element} */ (cloneTarget.cloneNode(true));\n\n // Iterate downwards and cache all references\n let node = anchorElement;\n const iterator = document.createTreeWalker(anchorElement, NodeFilter.SHOW_ELEMENT);\n do {\n const nodeIdentifier = node.id;\n if (!element && nodeIdentifier === id) {\n element = node;\n }\n\n if (nodeIdentifier) {\n // console.debug('Caching element', nodeIdentifier);\n references.set(nodeIdentifier, node);\n if (cloneTarget) {\n // Attach events regardless of DOM state.\n // EventTargets should still fire even if not part of live document\n this.attachEventListeners(id, element);\n }\n } else {\n console.warn('Could not cache node', node);\n }\n } while ((node = iterator.nextNode()));\n return element;\n }\n\n /**\n * @param {*} fn\n * @param {any} defaults\n * @return {boolean} reusable\n */\n bindWatcher(fn, defaults) {\n const { props, defaultValue, reusable } = observeFunction(fn, defaults);\n const entry = { fn, props, defaultValue };\n for (const prop of props) {\n let set = this.bindings.get(prop);\n if (!set) {\n set = new Set();\n this.bindings.set(prop, set);\n }\n set.add(entry);\n }\n return reusable;\n }\n}\n", "export class ICustomElement extends HTMLElement {}\n", "/* eslint-disable max-classes-per-file */\n\nimport Composition from './Composition.js';\nimport { ICustomElement } from './ICustomElement.js';\nimport { attrNameFromPropName, attrValueFromDataValue } from './dom.js';\nimport { defineObservableProperty } from './observe.js';\nimport { addInlineFunction, css, html } from './template.js';\n\n/**\n * @template {abstract new (...args: any) => unknown} T\n * @param {InstanceType<T>} instance\n */\nfunction superOf(instance) {\n const staticContext = instance.constructor;\n const superOfStatic = Object.getPrototypeOf(staticContext);\n return superOfStatic.prototype;\n}\n\n/**\n * Clone attribute\n * @param {string} name\n * @param {string} target\n * @return {(oldValue:string, newValue:string, element: CustomElement) => void}\n */\nexport function cloneAttributeCallback(name, target) {\n return (oldValue, newValue, element) => {\n if (newValue == null) {\n element.refs[target].removeAttribute(name);\n } else {\n element.refs[target].setAttribute(name, newValue);\n }\n };\n}\n\nconst EVENT_PREFIX_REGEX = /^([*1~]+)?(.*)$/;\n\n/**\n * Web Component that can cache templates for minification or performance\n */\nexport default class CustomElement extends ICustomElement {\n /** @type {string} */\n static elementName;\n\n /** @return {Iterable<string>} */\n static get observedAttributes() {\n const s = new Set();\n for (const config of this.propList.values()) {\n if (config.reflect === true || config.reflect === 'read') {\n s.add(config.attr);\n }\n }\n return s;\n }\n\n /** @type {import('./Composition.js').Compositor<?>} */\n compose() {\n if (this.#composition) {\n console.warn('Already composed. Generating *new* composition...');\n }\n this.#composition = new Composition();\n return this.#composition;\n }\n\n /** @type {Composition<?>} */\n static _composition = null;\n\n /** @type {Map<string, import('./typings.js').ObserverConfiguration<?,?,?>>} */\n static _props = new Map();\n\n /** @type {Map<string, Function[]>} */\n static _propChangedCallbacks = new Map();\n\n /** @type {Map<string, Function[]>} */\n static _attributeChangedCallbacks = new Map();\n\n /** @type {typeof ICustomElement._onComposeCallbacks} */\n static _onComposeCallbacks = [];\n\n /** @type {typeof ICustomElement._onConnectedCallbacks} */\n static _onConnectedCallbacks = [];\n\n /** @type {typeof ICustomElement._onDisconnectedCallbacks} */\n static _onDisconnectedCallbacks = [];\n\n /** @type {typeof ICustomElement._onConstructedCallbacks} */\n static _onConstructedCallbacks = [];\n\n static interpolatesTemplate = true;\n\n static supportsElementInternals = 'attachInternals' in HTMLElement.prototype;\n\n static supportsElementInternalsRole = CustomElement.supportsElementInternals\n && 'role' in ElementInternals.prototype;\n\n /** @type {boolean} */\n static templatable = null;\n\n static defined = false;\n\n static autoRegistration = true;\n\n /** @type {Map<string, typeof CustomElement>} */\n static registrations = new Map();\n\n /** @type {typeof ICustomElement.expressions} */\n static expressions = this.set;\n\n /** @type {typeof ICustomElement.methods} */\n static methods = this.set;\n\n /** @type {typeof ICustomElement.overrides} */\n static overrides = this.set;\n\n /** @type {typeof ICustomElement.props} */\n static props = this.observe;\n\n /**\n * @template {typeof CustomElement} T\n * @this T\n * @template {keyof T} K\n * @param {K} collection\n * @param {T[K] extends (infer R)[] ? R : never} callback\n */\n static _addCallback(collection, callback) {\n if (!this.hasOwnProperty(collection)) {\n this[collection] = [\n ...this[collection],\n ];\n }\n this[collection].push(callback);\n }\n\n /**\n * Append parts to composition\n * @type {typeof ICustomElement.append}\n */\n static append(...parts) {\n this.on({\n composed({ composition }) {\n // console.debug('onComposed:append', ...parts);\n composition.append(...parts);\n },\n });\n // @ts-expect-error Can't cast T\n return this;\n }\n\n /**\n * Appends styles to composition\n * @type {typeof ICustomElement.css}\n */\n static css(array, ...substitutions) {\n if (Array.isArray(array)) {\n // @ts-expect-error Complex cast\n this.append(css(array, ...substitutions));\n } else {\n // @ts-expect-error Complex cast\n this.append(array, ...substitutions);\n }\n // @ts-expect-error Can't cast T\n return this;\n }\n\n /** @type {typeof ICustomElement['setSchema']} */\n static setSchema(schema) {\n this.schema = schema;\n // @ts-expect-error Can't cast T\n return this;\n }\n\n /**\n * Registers class asynchronously at end of current event loop cycle\n * via `queueMicrotask`. If class is registered before then,\n * does nothing.\n * @type {typeof ICustomElement['autoRegister']}\n */\n static autoRegister(elementName) {\n if (elementName) {\n this.elementName = elementName;\n }\n queueMicrotask(() => {\n if (this.autoRegistration) {\n this.register();\n }\n });\n // @ts-expect-error Can't cast T\n return this;\n }\n\n /**\n * Appends DocumentFragment to composition\n * @type {typeof ICustomElement.html}\n */\n static html(strings, ...substitutions) {\n this.on({\n composed({ composition }) {\n // console.log('onComposed:html', strings);\n composition.append(html(strings, ...substitutions));\n },\n });\n // @ts-expect-error Can't cast T\n return this;\n }\n\n /**\n * Extends base class into a new class.\n * Use to avoid mutating base class.\n * TODO: Add constructor arguments typing\n * @type {typeof ICustomElement.extend}\n */\n static extend() {\n // @ts-expect-error Can't cast T\n return class extends this {};\n }\n\n /**\n * Extends base class into a new class.\n * Use to avoid mutating base class.\n * TODO: Add constructor arguments typing\n * @type {typeof ICustomElement.tsClassFix}\n */\n static tsClassFix() {\n // @ts-expect-error Can't cast T\n return this;\n }\n\n /**\n * Assigns static values to class\n * @type {typeof ICustomElement.setStatic}\n */\n static setStatic(source) {\n Object.assign(this, source);\n // @ts-expect-error Can't cast T\n return this;\n }\n\n /**\n * Assigns values directly to all instances (via prototype)\n * @type {typeof ICustomElement.set}\n */\n static readonly(source, options) {\n // @ts-expect-error Can't cast T\n return this.set(source, { ...options, writable: false });\n }\n\n /**\n * Assigns values directly to all instances (via prototype)\n * @type {typeof ICustomElement.set}\n */\n static set(source, options) {\n Object.defineProperties(\n this.prototype,\n Object.fromEntries(\n Object.entries(source).map(([name, value]) => {\n // Tap into .map() to avoid double iteration\n // Property may be redefined observable\n this.undefine(name);\n return [\n name,\n {\n enumerable: name[0] !== '_',\n configurable: true,\n value,\n writable: true,\n ...options,\n },\n ];\n }),\n ),\n );\n // @ts-expect-error Can't cast T\n return this;\n }\n\n /**\n * Returns result of calling mixin with current class\n * @type {typeof ICustomElement.mixin}\n */\n static mixin(mixin) {\n return mixin(this);\n }\n\n /**\n * Registers class with window.customElements synchronously\n * @type {typeof ICustomElement['register']}\n */\n static register(elementName, force = false) {\n if (this.hasOwnProperty('defined') && this.defined && !force) {\n console.warn(this.elementName, 'already registered.');\n // @ts-expect-error Can't cast T\n return this;\n }\n\n if (elementName) {\n this.elementName = elementName;\n }\n\n customElements.define(this.elementName, this);\n CustomElement.registrations.set(this.elementName, this);\n this.defined = true;\n // @ts-expect-error Can't cast T\n return this;\n }\n\n static get propList() {\n if (!this.hasOwnProperty('_props')) {\n this._props = new Map(this._props);\n }\n return this._props;\n }\n\n static get propChangedCallbacks() {\n if (!this.hasOwnProperty('_propChangedCallbacks')) {\n // structuredClone()\n this._propChangedCallbacks = new Map(\n [\n ...this._propChangedCallbacks,\n ].map(([name, array]) => [name, array.slice()]),\n );\n }\n return this._propChangedCallbacks;\n }\n\n static get attributeChangedCallbacks() {\n if (!this.hasOwnProperty('_attributeChangedCallbacks')) {\n this._attributeChangedCallbacks = new Map(\n [\n ...this._attributeChangedCallbacks,\n ].map(([name, array]) => [name, array.slice()]),\n );\n }\n return this._attributeChangedCallbacks;\n }\n\n /**\n * Creates observable property on instances (via prototype)\n * @template {import('./typings.js').ObserverPropertyType} [T1=null]\n * @template {import('./typings.js').ObserverPropertyType} [T2=null]\n * @template {any} [T3=null]\n * @param {string} name\n * @param {T1|import('./typings.js').ObserverOptions<T2,T3>} [typeOrOptions='string']\n * @return {(\n * T3 extends null ?\n * T2 extends null ?\n * T1 extends null ?\n * string\n * : import('./typings.js').ParsedObserverPropertyType<T1>\n * : import('./typings.js').ParsedObserverPropertyType<T2>\n * : T3\n * )}\n */\n static prop(name, typeOrOptions) {\n // TODO: Cache and save configuration for reuse (mixins)\n /** @type {import('./typings.js').ObserverOptions<?,?>} */\n const options = {\n ...((typeof typeOrOptions === 'string') ? { type: typeOrOptions } : typeOrOptions),\n };\n\n const customCallback = options.changedCallback;\n\n if (customCallback) {\n // Move callback to later in stack for attribute-based changes as well\n this.onPropChanged({ [name]: customCallback });\n }\n\n // TODO: Inspect possible closure bloat\n options.changedCallback = function wrappedChangedCallback(oldValue, newValue, changes) {\n this._onObserverPropertyChanged.call(this, name, oldValue, newValue, changes);\n };\n\n const config = defineObservableProperty(this.prototype, name, options);\n\n this.propList.set(name, config);\n for (const [prop, callback] of config.watchers) {\n this.on(`${prop}Changed`, callback);\n }\n\n return config.INIT_SYMBOL;\n }\n\n /**\n * Define properties on instances via Object.defineProperties().\n * Automatically sets property non-enumerable if name begins with `_`.\n * Functions will be remapped as getters\n * @type {typeof ICustomElement.define}\n */\n static define(props) {\n Object.defineProperties(\n this.prototype,\n Object.fromEntries(\n Object.entries(props).map(([name, options]) => {\n // Tap into .map() to avoid double iteration\n // Property may be redefined observable\n this.undefine(name);\n return [\n name,\n {\n enumerable: name[0] !== '_',\n configurable: true,\n ...(\n typeof options === 'function'\n ? { get: options }\n : options\n ),\n },\n ];\n }),\n ),\n );\n\n // @ts-expect-error Can't cast T\n return this;\n }\n\n static undefine(name) {\n Reflect.deleteProperty(this.prototype, name);\n const config = this.propList.get(name);\n if (config && config.watchers.length) {\n const propWatchers = this.propChangedCallbacks.get(name);\n if (propWatchers) {\n for (const watcher of config.watchers) {\n const index = propWatchers.indexOf(watcher);\n if (index !== -1) {\n console.warn('Unwatching', name);\n propWatchers.splice(index, 1);\n }\n }\n }\n }\n this.propList.delete(name);\n return this;\n }\n\n /**\n * Creates observable properties on instances\n * @type {typeof ICustomElement.observe}\n */\n static observe(props) {\n for (const [name, typeOrOptions] of Object.entries(props ?? {})) {\n if (typeof typeOrOptions === 'function') {\n this.prop(name, {\n reflect: false,\n get: typeOrOptions,\n });\n } else {\n this.prop(name, typeOrOptions);\n }\n }\n // @ts-expect-error Can't cast T\n return this;\n }\n\n /** @type {typeof ICustomElement.defineStatic} */\n static defineStatic(props) {\n for (const [name, typeOrOptions] of Object.entries(props ?? {})) {\n const options = (typeof typeOrOptions === 'function')\n ? { get: typeOrOptions }\n : (typeof typeOrOptions === 'string'\n ? { type: typeOrOptions }\n : typeOrOptions);\n defineObservableProperty(this, name, {\n reflect: false,\n ...options,\n });\n }\n // @ts-expect-error Can't cast T\n return this;\n }\n\n /** @type {typeof ICustomElement.events} */\n static events(listeners, options) {\n this.on({\n composed({ composition }) {\n for (const [key, listenerOptions] of Object.entries(listeners)) {\n const [, flags, type] = key.match(EVENT_PREFIX_REGEX);\n composition.addCompositionEventListener({\n type,\n once: flags?.includes('1'),\n passive: flags?.includes('~'),\n capture: flags?.includes('*'),\n ...(\n typeof listenerOptions === 'function'\n ? { handleEvent: listenerOptions }\n : (typeof listenerOptions === 'string'\n ? { prop: listenerOptions }\n : listenerOptions)\n ),\n ...(\n options\n )\n ,\n });\n }\n },\n });\n\n // @ts-expect-error Can't cast T\n return this;\n }\n\n /** @type {typeof ICustomElement.childEvents} */\n static childEvents(listenerMap, options) {\n for (const [id, listeners] of Object.entries(listenerMap)) {\n this.events(listeners, {\n id,\n ...options,\n });\n }\n\n // @ts-expect-error Can't cast T\n return this;\n }\n\n /** @type {typeof ICustomElement['on']} */\n static on(nameOrCallbacks, callback) {\n const callbacks = typeof nameOrCallbacks === 'string'\n ? { [nameOrCallbacks]: callback }\n : nameOrCallbacks;\n for (const [name, fn] of Object.entries(callbacks)) {\n /** @type {keyof (typeof CustomElement)} */\n let arrayPropName;\n switch (name) {\n case 'composed': arrayPropName = '_onComposeCallbacks'; break;\n case 'constructed': arrayPropName = '_onConstructedCallbacks'; break;\n case 'connected': arrayPropName = '_onConnectedCallbacks'; break;\n case 'disconnected': arrayPropName = '_onDisconnectedCallbacks'; break;\n case 'props':\n this.onPropChanged(fn);\n continue;\n case 'attrs':\n this.onAttributeChanged(fn);\n continue;\n default:\n if (name.endsWith('Changed')) {\n const prop = name.slice(0, name.length - 'Changed'.length);\n this.onPropChanged({ [prop]: fn });\n continue;\n }\n throw new Error('Invalid callback name');\n }\n this._addCallback(arrayPropName, fn);\n }\n\n // @ts-expect-error Can't cast T\n return this;\n }\n\n /** @type {typeof ICustomElement['onPropChanged']} */\n static onPropChanged(options) {\n for (const [prop, callback] of Object.entries(options)) {\n let array = this.propChangedCallbacks.get(prop);\n if (!array) {\n array = [];\n this.propChangedCallbacks.set(prop, array);\n }\n array.push(callback);\n }\n\n // @ts-expect-error Can't cast T\n return this;\n }\n\n /** @type {typeof ICustomElement['onAttributeChanged']} */\n static onAttributeChanged(options) {\n for (const [name, callback] of Object.entries(options)) {\n const lcName = name.toLowerCase();\n let array = this.attributeChangedCallbacks.get(lcName);\n if (!array) {\n array = [];\n this.attributeChangedCallbacks.set(lcName, array);\n }\n array.push(callback);\n }\n\n // @ts-expect-error Can't cast T\n return this;\n }\n\n /** @type {Record<string, HTMLElement>}} */\n #refsProxy;\n\n /** @type {Map<string, WeakRef<HTMLElement>>}} */\n #refsCache = new Map();\n\n /** @type {Map<string, WeakRef<HTMLElement>>}} */\n #refsCompositionCache = new Map();\n\n /** @type {Composition<?>} */\n #composition;\n\n /** @type {Map<string,null|[string,any]>} */\n _propAttributeCache;\n\n /** @type {import('./ICustomElement.js').CallbackArguments} */\n _callbackArguments = null;\n\n /** @param {any[]} args */\n constructor(...args) {\n super();\n\n if (CustomElement.supportsElementInternals) {\n this.elementInternals = this.attachInternals();\n }\n\n this.attachShadow({ mode: 'open', delegatesFocus: this.delegatesFocus });\n\n this.composition.initialRender(this.shadowRoot, this);\n\n for (const callback of this.static._onConstructedCallbacks) {\n callback.call(this, this.callbackArguments);\n }\n }\n\n /**\n * Updates nodes based on data\n * Expects data in JSON Merge Patch format\n * @see https://www.rfc-editor.org/rfc/rfc7386\n * @param {?} data\n * @param {?} [store]\n * @return {void}\n */\n render(data, store) {\n // console.log('render', data);\n this.composition.render(this.shadowRoot, data, this, store ? { ...this, store } : this);\n }\n\n /** @type {InstanceType<typeof ICustomElement>['propChangedCallback']} */\n propChangedCallback(name, oldValue, newValue, changes = newValue) {\n this.render({ [name]: changes });\n\n const callbacks = this.static.propChangedCallbacks.get(name);\n if (callbacks) {\n for (const callback of callbacks) {\n callback.call(this, oldValue, newValue, changes, this);\n }\n }\n }\n\n /**\n * @param {string} name\n * @param {string|null} oldValue\n * @param {string|null} newValue\n */\n attributeChangedCallback(name, oldValue, newValue) {\n const callbacks = this.static.attributeChangedCallbacks.get(name.toLowerCase());\n if (callbacks) {\n for (const callback of callbacks) {\n callback.call(this, oldValue, newValue, this);\n }\n }\n\n // Array.find\n for (const config of this.static.propList.values()) {\n if (config.attr !== name) continue;\n\n if (config.reflect !== true && config.reflect !== 'read') return;\n\n if (config.attributeChangedCallback) {\n config.attributeChangedCallback.call(this, name, oldValue, newValue);\n return;\n }\n\n const [stringValue] = this.attributeCache.get(name) ?? [null, null];\n if (stringValue === newValue) {\n // Attribute was changed via data change event. Ignore.\n return;\n }\n\n // @ts-expect-error any\n const previousDataValue = this[config.key];\n const parsedValue = newValue === null\n ? config.nullParser(/** @type {null} */ (newValue))\n // Avoid Boolean('') === false\n : (config.type === 'boolean' ? true : config.parser(newValue));\n\n if (parsedValue === previousDataValue) {\n // No internal value change\n return;\n }\n // \"Remember\" that this attrValue equates to this data value\n // Avoids rewriting attribute later on data change event\n this.attributeCache.set(name, [newValue, parsedValue]);\n // @ts-expect-error any\n this[config.key] = parsedValue;\n return;\n }\n }\n\n get #template() {\n return this.#composition?.template;\n }\n\n /**\n * @param {string} name\n * @param {any} oldValue\n * @param {any} newValue\n * @param {any} changes\n */\n _onObserverPropertyChanged(name, oldValue, newValue, changes) {\n const { reflect, attr } = this.static.propList.get(name);\n if (attr && (reflect === true || reflect === 'write')) {\n const [, dataValue] = this.attributeCache.get(attr) ?? [null, null];\n // Don't change attribute if data value is equivalent\n // (eg: Boolean('foo') === true; Number(\"1.0\") === 1)\n if (dataValue !== newValue) {\n const attrValue = attrValueFromDataValue(newValue);\n // Cache attrValue to ignore attributeChangedCallback later\n this.attributeCache.set(attr, [attrValue, newValue]);\n if (attrValue == null) {\n this.removeAttribute(attr);\n } else {\n this.setAttribute(attr, attrValue);\n }\n }\n }\n\n // Invoke change => render\n this.propChangedCallback(name, oldValue, newValue, changes);\n }\n\n /**\n * Proxy object that returns shadow DOM elements by ID.\n * If called before interpolation (eg: on composed), returns from template\n * @return {Record<string,HTMLElement>}\n */\n get refs() {\n // eslint-disable-next-line no-return-assign\n return (this.#refsProxy ??= new Proxy({}, {\n /**\n * @param {any} target\n * @param {string} id\n * @return {Element}\n */\n get: (target, id) => {\n if (!this.#composition) {\n console.warn(this.static.name, 'Attempted to access references before composing!');\n }\n const composition = this.composition;\n if (!composition.interpolated) {\n let element = this.#refsCompositionCache.get(id)?.deref();\n if (element) return element;\n const formattedId = attrNameFromPropName(id);\n // console.warn(this.tagName, 'Returning template reference');\n element = composition.template.getElementById(formattedId);\n if (!element) return null;\n this.#refsCompositionCache.set(id, new WeakRef(element));\n return element;\n }\n let element = this.#refsCache.get(id)?.deref();\n if (element) {\n return element;\n }\n const formattedId = attrNameFromPropName(id);\n element = composition.getElement(this.shadowRoot, formattedId);\n if (!element) return null;\n this.#refsCache.set(id, new WeakRef(element));\n return element;\n },\n }));\n }\n\n get attributeCache() {\n this._propAttributeCache ??= new Map();\n return this._propAttributeCache;\n }\n\n get tabIndex() {\n return super.tabIndex;\n }\n\n set tabIndex(value) {\n if (value === super.tabIndex && value !== -1) {\n // Non -1 value already set\n return;\n }\n\n if (this.delegatesFocus && document.activeElement === this) {\n if (this.getAttribute('tabindex') === value.toString()) {\n // Skip if possible\n return;\n }\n\n // Chrome blurs on tabindex changes with delegatesFocus\n // Fixed in Chrome 111\n // Remove this code ~June 2023\n // https://bugs.chromium.org/p/chromium/issues/detail?id=1346606\n /** @type {EventListener} */\n const listener = (e) => {\n e.stopImmediatePropagation();\n e.stopPropagation();\n if (e.type === 'blur') {\n console.warn('Chromium bug 1346606: Tabindex change caused blur. Giving focusing back.', this);\n this.focus();\n } else {\n console.warn('Chromium bug 1346606: Blocking focus event.', this);\n }\n };\n this.addEventListener('blur', listener, { capture: true, once: true });\n this.addEventListener('focus', listener, { capture: true, once: true });\n super.tabIndex = value;\n this.removeEventListener('blur', listener, { capture: true });\n this.removeEventListener('focus', listener, { capture: true });\n return;\n }\n\n super.tabIndex = value;\n }\n\n get static() { return /** @type {typeof CustomElement} */ (/** @type {unknown} */ (this.constructor)); }\n\n get unique() { return false; }\n\n get callbackArguments() {\n // eslint-disable-next-line no-return-assign\n return this._callbackArguments ??= {\n composition: this.#composition,\n html: html.bind(this),\n inline: addInlineFunction,\n template: this.#template,\n element: this,\n };\n }\n\n /** @return {Composition<?>} */\n get composition() {\n if (this.#composition) return this.#composition;\n\n if (!this.unique && this.static.hasOwnProperty('_composition')) {\n this.#composition = this.static._composition;\n return this.static._composition;\n }\n\n // TODO: Use Composition to track uniqueness\n // console.log('composing', this.static.elementName);\n this.compose();\n for (const callback of this.static._onComposeCallbacks) {\n // console.log(this.static.elementName, 'composition callback');\n callback.call(this, this.callbackArguments);\n }\n\n if (!this.unique) {\n // Cache compilation into static property\n this.static._composition = this.#composition;\n }\n\n return this.#composition;\n }\n\n connectedCallback() {\n for (const callbacks of this.static._onConnectedCallbacks) {\n callbacks.call(this, this.callbackArguments);\n }\n }\n\n disconnectedCallback() {\n for (const callbacks of this.static._onDisconnectedCallbacks) {\n callbacks.call(this, this.callbackArguments);\n }\n }\n}\n\nCustomElement.prototype.delegatesFocus = false;\n", "/** @param {typeof import('../core/CustomElement.js').default} Base */\nexport default function DensityMixin(Base) {\n return Base\n .extend()\n .observe({\n density: 'integer',\n })\n .css`\n :host {\n --mdw-density: var(--mdw-density__default, 0);\n }\n \n /* Reset */\n :host([density]) { --mdw-density: 0; }\n \n :host([density=\"-1\"]) { --mdw-density: -1; }\n :host([density=\"-2\"]) { --mdw-density: -2; }\n :host([density=\"-3\"]) { --mdw-density: -2; }\n :host([density=\"-4\"]) { --mdw-density: -4; }\n :host([density=\"1\"]) { --mdw-density: 1; }\n :host([density=\"2\"]) { --mdw-density: 2; }\n :host([density=\"3\"]) { --mdw-density: 3; }\n :host([density=\"4\"]) { --mdw-density: 3; }\n `;\n}\n", "/**\n * @param {ReturnType<import('./StateMixin.js').default> & ReturnType<import('./ThemableMixin.js').default>} Base\n */\nexport default function ShapeMixin(Base) {\n return Base\n .extend()\n .observe({\n shapeTop: 'boolean',\n shapeBottom: 'boolean',\n shapeStart: 'boolean',\n shapeEnd: 'boolean',\n shapeStyle: 'string',\n outlined: 'boolean',\n })\n .html/* html */`\n <div id=shape part=shape class=shape elevated={elevated} shape-top={shapeTop} shape-bottom={shapeBottom} shape-start={shapeStart} shape-end={shapeEnd} shape-style={shapeStyle} color={color} outlined={outlined} disabled={disabledState}>\n <div id=outline _if={outlined} class=outline disabled={disabledState} focused={focusedState} pressed={pressedState} hovered={hoveredState}>\n <div id=outline-left class=\"outline-section outline-left\"></div>\n <div id=outline-right class=\"outline-section outline-right\"></div>\n </div>\n </div>\n `\n .css`\n :host {\n --mdw-shape__size: 0px;\n --mdw-shape__bg: transparent;\n --mdw-surface__will-change: none;\n --mdw-shape__size__top-start-size: var(--mdw-shape__size);\n --mdw-shape__size__top-end-size: var(--mdw-shape__size);\n --mdw-shape__size__bottom-start-size: var(--mdw-shape__size);\n --mdw-shape__size__bottom-end-size: var(--mdw-shape__size);\n \n /* (1/2n + 1/2)L + (-1/2n + 1/2)R */\n --mdw-shape__ltr: calc(0.5 * var(--mdw-dir, 1) + 0.5); /* 1 if LTR, 0 if RTL */\n --mdw-shape__rtl: calc(-0.5 * var(--mdw-dir, 1) + 0.5); /* 0 if LTR, 1 if RTL */\n --mdw-shape__size__top-left-size: calc((var(--mdw-shape__ltr) * var(--mdw-shape__size__top-start-size)) + (var(--mdw-shape__rtl) * var(--mdw-shape__size__top-end-size)));\n --mdw-shape__size__top-right-size: calc((var(--mdw-shape__rtl) * var(--mdw-shape__size__top-start-size)) + (var(--mdw-shape__ltr) * var(--mdw-shape__size__top-end-size)));\n --mdw-shape__size__bottom-left-size: calc((var(--mdw-shape__ltr) * var(--mdw-shape__size__bottom-start-size)) + (var(--mdw-shape__rtl) * var(--mdw-shape__size__bottom-end-size)));\n --mdw-shape__size__bottom-right-size: calc((var(--mdw-shape__rtl) * var(--mdw-shape__size__bottom-start-size)) + (var(--mdw-shape__ltr) * var(--mdw-shape__size__bottom-end-size)));\n \n /** By default, fallback to border-radius */\n --mdw-shape__rounded: 1;\n --mdw-shape__inline-start-deg: calc(var(--mdw-dir, 1) * -90deg);\n z-index: 0;\n }\n\n :host([shape-style=\"none\"]) {\n --mdw-shape__size: 0px;\n }\n \n :host([shape-style=\"extra-small\"]) {\n --mdw-shape__size: var(--mdw-shape__extra-small);\n }\n \n :host([shape-style=\"small\"]) {\n --mdw-shape__size: var(--mdw-shape__small);\n }\n \n :host([shape-style=\"medium\"]) {\n --mdw-shape__size: var(--mdw-shape__medium);\n }\n \n :host([shape-style=\"large\"]) {\n --mdw-shape__size: var(--mdw-shape__large);\n }\n \n :host([shape-style=\"extra-large\"]) {\n --mdw-shape__size: var(--mdw-shape__extra-large);\n }\n \n :host([shape-style=\"full\"]) {\n --mdw-shape__size: var(--mdw-shape__full);\n }\n \n :host([shape-style=\"inherit\"]) {\n --mdw-shape__size: inherit;\n }\n \n :host([shape-top]) {\n --mdw-shape__size__bottom-start-size: 0px;\n --mdw-shape__size__bottom-end-size: 0px;\n --mdw-shape__mask: linear-gradient(transparent 50%, black 50%);\n \n }\n \n :host([shape-bottom]) {\n --mdw-shape__size__top-start-size: 0px;\n --mdw-shape__size__top-end-size: 0px;\n --mdw-shape__mask: linear-gradient(black 50%, transparent 50%);\n }\n \n :host([shape-start]) {\n --mdw-shape__size__top-end-size: 0px;\n --mdw-shape__size__bottom-end-size: 0px;\n --mdw-shape__mask: linear-gradient(var(--mdw-shape__inline-start-deg), black 50%, transparent 50%);\n }\n \n :host([shape-end]) {\n --mdw-shape__size__top-start-size: 0px;\n --mdw-shape__size__bottom-start-size: 0px;\n --mdw-shape__mask: linear-gradient(var(--mdw-shape__inline-start-deg), transparent 50%, black 50%);\n }\n \n @supports(-webkit-mask-box-image: none) {\n :host {\n /* Inherit all the way up to :root */\n --mdw-shape__rounded: inherit;\n }\n }\n `\n .css`\n .shape {\n position: absolute;\n inset: 0;\n \n overflow: hidden;\n \n z-index: -1;\n \n background-color: var(--mdw-shape__bg, transparent);\n \n border-start-start-radius: calc(var(--mdw-shape__rounded) * var(--mdw-shape__size__top-start-size));\n border-start-end-radius: calc(var(--mdw-shape__rounded) * var(--mdw-shape__size__top-end-size));\n border-end-start-radius: calc(var(--mdw-shape__rounded) * var(--mdw-shape__size__bottom-start-size));\n border-end-end-radius: calc(var(--mdw-shape__rounded) * var(--mdw-shape__size__bottom-end-size));\n \n transition-delay: 1ms;\n transition-duration: 200ms;\n transition-property: background-color, color;\n will-change: background-color, color;\n \n }\n \n .shape[outlined] {\n background-color: transparent;\n }\n \n .shape[color] {\n background-color: rgb(var(--mdw-bg));\n color: rgb(var(--mdw-ink));\n }\n \n .shape:is([color=\"none\"], [color=\"transparent\"]) {\n background-color: transparent;\n }\n\n @supports(-webkit-mask-box-image: none) {\n .shape {\n -webkit-mask-box-image: var(--mdw-shape__mask-border-source)\n 8 fill /\n var(--mdw-shape__size)\n stretch;\n \n -webkit-mask: var(--mdw-shape__mask);\n\n transition-duration: 200ms, 200ms, 200ms;\n transition-property: background-color, color, -webkit-mask-box-image-width;\n will-change: background-color, color, -webkit-mask-box-image;\n }\n }\n `\n .css`\n .outline {\n position: absolute;\n inset: 0;\n \n pointer-events: none;\n \n border-color: currentColor;\n border-radius: inherit;\n color: rgb(var(--mdw-color__outline));\n }\n \n .outline:is([pressed],[focused]) {\n color: rgb(var(--mdw-ink));\n \n transition-delay: 0;\n transition-duration: 0;\n }\n \n .outline[disabled] {\n color: rgba(var(--mdw-color__on-surface), 0.12);\n }\n \n .outline::before {\n content: '';\n \n position: absolute;\n inset: 0;\n \n border-style: solid;\n border-width: 1px;\n \n border-radius: inherit;\n }\n \n @supports(-webkit-mask-box-image: none) {\n .outline::before {\n content: none;\n }\n \n .outline::after {\n content: '';\n \n position: absolute;\n inset: 0;\n \n -webkit-mask-box-image: var(--mdw-shape__mask-image__edges)\n 8 fill /\n auto\n stretch;\n \n background-color: currentColor;\n }\n \n .outline-section {\n position: absolute;\n inset: 0;\n }\n \n .outline-section::before,\n .outline-section::after {\n content: \"\";\n \n position: absolute;\n \n max-block-size: 50%;\n max-inline-size: 50%;\n \n -webkit-mask-repeat: no-repeat;\n -webkit-mask-size: contain;\n \n background-color: currentColor;\n \n transition-duration: 200ms;\n /* stylelint-disable-next-line liberty/use-logical-spec */\n transition-property: width, height;\n }\n \n .outline-left::before {\n /* stylelint-disable-next-line liberty/use-logical-spec */\n left: calc(-1px * var(--mdw-shape__convex));\n inset-block-start: calc(-1px * var(--mdw-shape__convex));\n \n block-size: calc(var(--mdw-shape__size__top-left-size));\n inline-size: calc(var(--mdw-shape__size__top-left-size));\n /* stylelint-disable-next-line liberty/use-logical-spec */\n padding-right: calc(2px * var(--mdw-shape__convex));\n padding-block-end: calc(2px * var(--mdw-shape__convex));\n \n -webkit-mask-image: var(--mdw-shape__mask-image__top-left);\n }\n \n .outline-left::after {\n /* stylelint-disable-next-line liberty/use-logical-spec */\n left: calc(-1px * var(--mdw-shape__convex));\n inset-block-end: calc(-1px * var(--mdw-shape__convex));\n \n block-size: var(--mdw-shape__size__bottom-left-size);\n inline-size: var(--mdw-shape__size__bottom-left-size);\n /* stylelint-disable-next-line liberty/use-logical-spec */\n padding-right: calc(2px * var(--mdw-shape__convex));\n padding-block-start: calc(2px * var(--mdw-shape__convex));\n \n -webkit-mask-image: var(--mdw-shape__mask-image__bottom-left);\n -webkit-mask-position-y: 100%;\n }\n \n .outline-right::before {\n /* stylelint-disable-next-line liberty/use-logical-spec */\n right: calc(-1px * var(--mdw-shape__convex));\n inset-block-start: calc(-1px * var(--mdw-shape__convex));\n \n block-size: var(--mdw-shape__size__top-right-size);\n inline-size: var(--mdw-shape__size__top-right-size);\n /* stylelint-disable-next-line liberty/use-logical-spec */\n padding-left: calc(2px * var(--mdw-shape__convex));\n padding-block-end: calc(2px * var(--mdw-shape__convex));\n \n -webkit-mask-image: var(--mdw-shape__mask-image__top-right);\n -webkit-mask-position-x: 100%;\n }\n\n .outline-right::after {\n /* stylelint-disable-next-line liberty/use-logical-spec */\n right: calc(-1px * var(--mdw-shape__convex));\n inset-block-end: calc(-1px * var(--mdw-shape__convex));\n \n block-size: var(--mdw-shape__size__bottom-right-size);\n inline-size: var(--mdw-shape__size__bottom-right-size);\n /* stylelint-disable-next-line liberty/use-logical-spec */\n padding-left: calc(2px * var(--mdw-shape__convex));\n padding-block-start: calc(2px * var(--mdw-shape__convex));\n \n -webkit-mask-image: var(--mdw-shape__mask-image__bottom-right);\n -webkit-mask-position-x: 100%;\n -webkit-mask-position-y: 100%;\n }\n }\n `;\n}\n", "/**\n * @param {typeof import('../core/CustomElement.js').default} Base\n */\nexport default function ThemableMixin(Base) {\n return Base\n .extend()\n .observe({\n color: 'string',\n ink: 'string',\n block: 'boolean',\n typeStyle: 'string',\n })\n .css`\n :host([color=\"primary\"]) {\n --mdw-bg: var(--mdw-color__primary);\n --mdw-ink: var(--mdw-color__on-primary);\n }\n \n :host([color=\"primary-container\"]) {\n --mdw-bg: var(--mdw-color__primary-container);\n --mdw-ink: var(--mdw-color__on-primary-container);\n }\n \n :host([color=\"secondary\"]) {\n --mdw-bg: var(--mdw-color__secondary);\n --mdw-ink: var(--mdw-color__on-secondary);\n }\n \n :host([color=\"secondary-container\"]) {\n --mdw-bg: var(--mdw-color__secondary-container);\n --mdw-ink: var(--mdw-color__on-secondary-container);\n }\n \n :host([color=\"tertiary\"]) {\n --mdw-bg: var(--mdw-color__tertiary);\n --mdw-ink: var(--mdw-color__on-tertiary);\n }\n \n :host([color=\"tertiary-container\"]) {\n --mdw-bg: var(--mdw-color__tertiary-container);\n --mdw-ink: var(--mdw-color__on-tertiary-container);\n }\n \n :host([color=\"error\"]) {\n --mdw-bg: var(--mdw-color__error);\n --mdw-ink: var(--mdw-color__on-error);\n }\n \n :host([color=\"error-container\"]) {\n --mdw-bg: var(--mdw-color__error-container);\n --mdw-ink: var(--mdw-color__on-error-container);\n }\n \n :host([color=\"background\"]) {\n --mdw-bg: var(--mdw-color__background);\n --mdw-ink: var(--mdw-color__on-background);\n }\n \n :host([color^=\"surface\"]) {\n --mdw-bg: var(--mdw-color__surface);\n --mdw-ink: var(--mdw-color__on-surface);\n }\n \n /* Quality-of-life */\n :host([color=\"surface-primary\"]) {\n --mdw-ink: var(--mdw-color__primary);\n }\n \n :host([color$=\"variant\"]) {\n --mdw-bg: var(--mdw-color__surface-variant);\n --mdw-ink: var(--mdw-color__on-surface-variant);\n }\n \n :host([color^=\"inverse\"]) {\n --mdw-bg: var(--mdw-color__inverse-surface);\n --mdw-ink: var(--mdw-color__inverse-on-surface);\n }\n \n :host([color=\"inverse-primary\"]) {\n --mdw-ink: var(--mdw-color__inverse-primary);\n }\n \n :host([color][disabled]) {\n /* background-color: rgba(var(--mdw-color__on-surface), 0.12); */\n /* color: rgba(var(--mdw-color__on-surface), 0.38); */\n }\n \n :host([ink=\"inverse-primary\"]) {\n --mdw-ink: var(--mdw-color__inverse-primary);\n }\n \n :host([ink=\"primary\"]) {\n --mdw-ink: var(--mdw-color__primary);\n }\n \n :host([ink=\"on-primary-container\"]) {\n --mdw-ink: var(--mdw-color__on-primary-container);\n }\n \n :host([ink=\"secondary\"]) {\n --mdw-ink: var(--mdw-color__secondary);\n }\n \n :host([ink=\"on-secondary-container\"]) {\n --mdw-ink: var(--mdw-color__on-secondary-container);\n }\n \n :host([ink=\"tertiary\"]) {\n --mdw-ink: var(--mdw-color__tertiary);\n }\n \n :host([ink=\"on-tertiary-container\"]) {\n --mdw-ink: var(--mdw-color__on-tertiary-container);\n }\n \n :host([ink=\"error\"]) {\n --mdw-ink: var(--mdw-color__error);\n }\n \n :host([ink=\"outline\"]) {\n --mdw-ink: var(--mdw-color__outline);\n }\n \n :host([ink=\"on-surface\"]) {\n --mdw-ink: var(--mdw-color__on-surface);\n }\n \n :host([ink=\"surface-variant\"]) {\n --mdw-ink: var(--mdw-color__surface-variant);\n }\n \n :host([ink=\"on-surface-variant\"]) {\n --mdw-ink: var(--mdw-color__on-surface-variant);\n }\n \n :host([ink=\"inverse-on-surface\"]) {\n --mdw-ink: var(--mdw-color__inverse-on-surface);\n }\n \n :host([ink=\"inherit\"]) {\n --mdw-ink: inherit;\n }\n \n :host([type-style|=\"display\"]) {\n --mdw-type__font: var(--mdw-typescale__display-large__font);\n --mdw-type__letter-spacing: var(--mdw-typescale__display-large__letter-spacing);\n }\n \n :host([type-style=\"display-medium\"]) {\n --mdw-type__font: var(--mdw-typescale__display-medium__font);\n --mdw-type__letter-spacing: var(--mdw-typescale__display-medium__letter-spacing);\n }\n \n :host([type-style=\"display-small\"]) {\n --mdw-type__font: var(--mdw-typescale__display-small__font);\n --mdw-type__letter-spacing: var(--mdw-typescale__display-small__letter-spacing);\n }\n \n :host([type-style|=\"headline\"]) {\n --mdw-type__font: var(--mdw-typescale__headline-large__font);\n --mdw-type__letter-spacing: var(--mdw-typescale__headline-large__letter-spacing);\n }\n \n :host([type-style=\"headline-medium\"]) {\n --mdw-type__font: var(--mdw-typescale__headline-medium__font);\n --mdw-type__letter-spacing: var(--mdw-typescale__headline-medium__letter-spacing);\n }\n \n :host([type-style=\"headline-small\"]) {\n --mdw-type__font: var(--mdw-typescale__headline-small__font);\n --mdw-type__letter-spacing: var(--mdw-typescale__headline-small__letter-spacing);\n }\n \n :host([type-style|=\"title\"]) {\n --mdw-type__font: var(--mdw-typescale__title-large__font);\n --mdw-type__letter-spacing: var(--mdw-typescale__title-large__letter-spacing);\n }\n \n :host([type-style=\"title-medium\"]) {\n --mdw-type__font: var(--mdw-typescale__title-medium__font);\n --mdw-type__letter-spacing: var(--mdw-typescale__title-medium__letter-spacing);\n }\n \n :host([type-style=\"title-small\"]) {\n --mdw-type__font: var(--mdw-typescale__title-small__font);\n --mdw-type__letter-spacing: var(--mdw-typescale__title-small__letter-spacing);\n }\n \n :host([type-style|=\"label\"]) {\n --mdw-type__font: var(--mdw-typescale__label-large__font);\n --mdw-type__letter-spacing: var(--mdw-typescale__label-large__letter-spacing);\n }\n \n :host([type-style=\"label-medium\"]) {\n --mdw-type__font: var(--mdw-typescale__label-medium__font);\n --mdw-type__letter-spacing: var(--mdw-typescale__label-medium__letter-spacing);\n }\n \n :host([type-style=\"label-small\"]) {\n --mdw-type__font: var(--mdw-typescale__label-small__font);\n --mdw-type__letter-spacing: var(--mdw-typescale__label-small__letter-spacing);\n }\n \n :host([type-style|=\"body\"]) {\n --mdw-type__font: var(--mdw-typescale__body-large__font);\n --mdw-type__letter-spacing: var(--mdw-typescale__body-large__letter-spacing);\n }\n \n :host([type-style=\"body-medium\"]) {\n --mdw-type__font: var(--mdw-typescale__body-medium__font);\n --mdw-type__letter-spacing: var(--mdw-typescale__body-medium__letter-spacing);\n }\n \n :host([type-style=\"body-small\"]) {\n --mdw-type__font: var(--mdw-typescale__body-small__font);\n --mdw-type__letter-spacing: var(--mdw-typescale__body-small__letter-spacing);\n } \n `;\n}\n", "import CustomElement from '../core/CustomElement.js';\nimport DensityMixin from '../mixins/DensityMixin.js';\nimport ShapeMixin from '../mixins/ShapeMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\nexport default CustomElement\n .mixin(ThemableMixin)\n .mixin(DensityMixin)\n .mixin(ShapeMixin)\n .extend()\n .html/* html */`<slot id=slot></slot>`\n .css`\n :host {\n --mdw-shape__size: 8px;\n --mdw-ink: var(--mdw-color__on-error);\n --mdw-shape__bg: rgb(var(--mdw-color__error));\n --mdw-type__font: var(--mdw-typescale__label-small__font);\n --mdw-type__letter-spacing: var(--mdw-typescale__label-small__letter-spacing);\n position: relative;\n \n display: inline-block;\n vertical-align: middle;\n \n box-sizing: border-box;\n min-block-size: var(--mdw-typescale__label-small__line-height);\n min-inline-size: var(--mdw-typescale__label-small__line-height);\n padding-inline: max(4px, calc(4px + (var(--mdw-density) * 2px)));\n \n color: rgb(var(--mdw-ink));\n \n font: var(--mdw-type__font);\n letter-spacing: var(--mdw-type__letter-spacing);\n text-align: center;\n }\n \n @supports (width: 1lh) {\n :host {\n min-block-size: 1lh; /* Clamps to 1:1 */\n min-inline-size: 1lh; /* Clamps to 1:1 */\n padding-inline: max(0.25lh, calc(0.25lh + (var(--mdw-density) * 2px)));\n }\n }\n \n :host(:empty) {\n vertical-align: middle;\n }\n \n :host(:empty) #shape {\n inset: 5px;\n }\n `\n .autoRegister('mdw-badge');\n", "/**\n * @param {typeof import('../core/CustomElement.js').default} Base\n */\nexport default function FlexableMixin(Base) {\n return Base\n .extend()\n .observe({\n flex: {\n type: 'string',\n empty: 'row',\n /** @type {'row'|'column'} */\n value: 'row',\n },\n x: {\n type: 'string',\n empty: 'start',\n /** @type {'start'|'center'|'end'|'between'|'around'|'stretch'} */\n value: 'start',\n },\n y: {\n type: 'string',\n empty: 'start',\n /** @type {'start'|'center'|'end'|'between'|'around'|'stretch'} */\n value: 'start',\n },\n gap: 'float',\n padding: 'float',\n })\n .css`\n /* https://css-tricks.com/snippets/css/a-guide-to-flexbox/ */\n\n :host{\n box-sizing: border-box;\n }\n\n :host([flex]) {\n display:flex;\n }\n\n :host([flex=\"column\"]) {\n flex-direction: column;\n }\n\n :host(:where([flex][y=\"start\"], [flex=\"column\"][x=\"start\"])) {\n align-items: flex-start;\n }\n\n :host(:where([flex][y=\"end\"], [flex=\"column\"][x=\"end\"])) {\n align-items: flex-end;\n }\n\n :host(:where([flex][y=\"center\"], [flex=\"column\"][x=\"center\"])) {\n align-items: center;\n }\n\n :host(:where([flex][y=\"between\"], [flex=\"column\"][x=\"between\"])) {\n align-items: space-between;\n }\n\n :host(:where([flex][y=\"around\"], [flex=\"column\"][x=\"around\"])) {\n align-items: space-around;\n }\n\n :host(:where([flex][y=\"stretch\"], [flex=\"column\"][x=\"stretch\"])) {\n align-items: stretch;\n }\n\n :host(:where([flex][x=\"start\"], [flex=\"column\"][y=\"start\"])) {\n justify-content: flex-start;\n }\n\n :host(:where([flex][x=\"end\"], [flex=\"column\"][y=\"end\"])) {\n justify-content: flex-end;\n }\n\n :host(:where([flex][x=\"center\"], [flex=\"column\"][y=\"center\"])) {\n justify-content: center;\n }\n\n :host(:where([flex][x=\"between\"], [flex=\"column\"][y=\"between\"])) {\n justify-content: space-between;\n }\n\n :host(:where([flex][x=\"stretch\"], [flex=\"column\"][y=\"stretch\"])) {\n justify-content: space-around;\n }\n\n :host([wrap]) {\n flex-wrap: wrap;\n }\n\n :host([wrap=\"reverse\"]) {\n flex-wrap: wrap-reverse;\n }\n\n :host([gap=\"4\"]) {gap: 4px;}\n :host([gap=\"8\"]) {gap: 8px;}\n :host([gap=\"12\"]) {gap: 12px;}\n :host([gap=\"16\"]) {gap: 16px;}\n :host([gap=\"20\"]) {gap: 20px;}\n :host([gap=\"24\"]) {gap: 24px;}\n\n :host([padding=\"4\"]) {padding: 4px;}\n :host([padding=\"8\"]) {padding: 8px;}\n :host([padding=\"12\"]) {padding: 12px;}\n :host([padding=\"16\"]) {padding: 16px;}\n :host([padding=\"20\"]) {padding: 20px;}\n :host([padding=\"24\"]) {padding: 24px;}\n `;\n}\n", "import CustomElement from '../core/CustomElement.js';\nimport FlexableMixin from '../mixins/FlexableMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\n/**\n * Containers are stateless elements that may have a color and ink.\n * They should have simple geometry for rendering and layout.\n */\nexport default CustomElement\n .mixin(ThemableMixin)\n .mixin(FlexableMixin)\n .extend()\n .observe({\n inline: 'boolean',\n block: {\n type: 'boolean',\n empty: true,\n },\n })\n .css`\n :host {\n display: block;\n }\n \n :host([inline]) {\n display: inline-block;\n }\n \n :host([flex]:where([inline])) {\n display: inline-flex;\n }\n \n :host([color]) {\n background-color: rgb(var(--mdw-bg));\n color: rgb(var(--mdw-ink));\n }\n \n :host([ink]) {\n color: rgb(var(--mdw-ink));\n }\n \n :host([type-style]) {\n font: var(--mdw-type__font);\n letter-spacing: var(--mdw-type__letter-spacing);\n }\n \n #slot {\n /* Passthrough from parent */\n block-size: inherit;\n inline-size: inherit;\n }\n `\n .html/* html */`<slot id=slot type-style={typeStyle}></slot>`\n .autoRegister('mdw-box');\n", "import Box from './Box.js';\n\nexport default Box\n .extend()\n .css`\n :host {\n font: var(--mdw-typescale__body-large__font);\n letter-spacing: var(--mdw-typescale__body-large__letter-spacing);\n }\n \n :host([size=\"medium\"]) {\n font: var(--mdw-typescale__body-medium__font);\n letter-spacing: var(--mdw-typescale__body-medium__letter-spacing);\n }\n \n :host([size=\"small\"]) {\n font: var(--mdw-typescale__body-small__font);\n letter-spacing: var(--mdw-typescale__body-small__letter-spacing);\n }\n `\n .autoRegister('mdw-body');\n", "/** @param {typeof import('../core/CustomElement.js').default} Base */\nexport default function AriaReflectorMixin(Base) {\n return Base\n .extend()\n .observe({\n _ariaRole: 'string',\n }).methods({\n /**\n * @param {keyof HTMLElement & keyof ElementInternals} name\n * @param {string} value\n */\n updateAriaProperty(name, value) {\n if (this.elementInternals && name in this.elementInternals) {\n this.elementInternals[name] = value;\n } else if (name in this) {\n this[name] = value;\n } else {\n console.warn('Unknown ARIA property', name);\n /** @type {string} */\n let attrName = name;\n if (attrName.startsWith('aria')) {\n attrName = `aria-${attrName.slice(4).toLowerCase()}`;\n }\n if (value == null) {\n this.removeAttribute(name);\n } else {\n this.setAttribute(attrName, value);\n }\n }\n },\n })\n .on({\n _ariaRoleChanged(oldValue, newValue) {\n this.updateAriaProperty('role', newValue);\n },\n constructed() {\n this.updateAriaProperty('role', this._ariaRole);\n },\n });\n}\n", "import { attemptFocus, isRtl } from '../core/dom.js';\n\nconst DEFAULT_ELEMENT_QUERY = [\n 'button',\n '[href]',\n 'input',\n 'select',\n 'textarea',\n '[tabindex]',\n].join(', ');\n\n/**\n * @param {typeof import('../core/CustomElement.js').default} Base\n */\nexport default function KeyboardNavMixin(Base) {\n return Base\n .extend()\n .observe({\n /** Keyboard navigation attribute */\n kbdNav: { empty: 'true' },\n _kbdFocusable: { empty: true },\n\n })\n .define({\n /**\n * Query used to find roving tab index children\n */\n kbdNavQuery() {\n return DEFAULT_ELEMENT_QUERY;\n },\n /**\n * Flag whether disabled elements participating in roving tab index\n * should be focusable.\n */\n kbdNavFocusableWhenDisabled() { return true; },\n /** @return {'horizontal'|'vertical'} */\n ariaOrientationDefault() { return 'vertical'; },\n })\n .define({\n /**\n * List of roving tab index participating children\n * @return {NodeListOf<HTMLElement>}\n */\n kbdNavChildren() {\n return this.querySelectorAll(this.kbdNavQuery);\n },\n })\n .methods({\n _ariaOrientationIsVertical() {\n return (this.ariaOrientation\n ?? this.getAttribute('aria-orientation')\n ?? this.ariaOrientationDefault) === 'vertical';\n },\n /**\n * Focuses next element participating in roving tab index list\n * @param {HTMLElement} [current]\n * @param {boolean} [loop=true]\n * @param {boolean} [reverse]\n * @return {HTMLElement} focusedElement\n */\n focusNext(current = null, loop = true, reverse = false) {\n let foundCurrent = false;\n const array = reverse ? [...this.kbdNavChildren].reverse() : this.kbdNavChildren;\n for (const candidate of array) {\n if (!foundCurrent) {\n foundCurrent = (current\n ? (candidate === current)\n : (candidate.getAttribute('tabindex') === '0'));\n continue;\n }\n if (!candidate.hasAttribute('tabindex')) {\n continue;\n }\n if (candidate.getAttribute('aria-hidden') === 'true') {\n continue;\n }\n if (attemptFocus(candidate)) {\n this.ariaActiveDescendantElement = candidate;\n return candidate;\n }\n }\n\n if (!loop) {\n if (document.activeElement !== current && current instanceof HTMLElement) {\n current.focus();\n }\n return current;\n }\n // Loop\n for (const candidate of array) {\n if (!candidate.hasAttribute('tabindex')) {\n continue;\n }\n if (candidate.getAttribute('aria-hidden') === 'true') {\n continue;\n }\n // Abort if we've looped all the way back to original element\n // Abort if candidate received focus\n if (attemptFocus(candidate)) {\n return candidate;\n }\n if (candidate === current) {\n return candidate;\n }\n }\n return null;\n },\n\n /**\n * Alias for focusNext(list, current, true).\n * Selects previous element\n * @param {HTMLElement} [current]\n * @param {boolean} [loop=true]\n * @return {HTMLElement}\n */\n focusPrevious(current, loop = true) {\n return this.focusNext(current, loop, true);\n },\n\n /** @type {HTMLElement['focus']} */\n focus(...options) {\n // super.focus(...options);\n if (attemptFocus(this.ariaActiveDescendantElement, ...options)) {\n return;\n }\n for (const candidate of this.kbdNavChildren) {\n if (candidate.getAttribute('tabindex') === '0' && candidate instanceof HTMLElement) {\n this.ariaActiveDescendantElement = candidate;\n candidate.focus(...options);\n return;\n }\n }\n this.focusNext();\n },\n\n /**\n * Refreshes roving tab index attributes based on kbdNavChildren\n */\n refreshTabIndexes() {\n if (this.kbdNav !== 'true') return;\n /** @type {HTMLElement} */\n let currentlyFocusedChild = null;\n /** @type {HTMLElement} */\n let currentTabIndexChild = null;\n /** @type {HTMLElement} */\n let firstFocusableChild = null;\n for (const child of this.kbdNavChildren) {\n if (!currentlyFocusedChild && document.activeElement === child) {\n currentlyFocusedChild = child;\n } else if (!currentTabIndexChild && child.getAttribute('tabindex') === '0') {\n currentTabIndexChild = child;\n } else {\n if (!firstFocusableChild && child.getAttribute('aria-hidden') !== 'true'\n && (this.kbdNavFocusableWhenDisabled || child.getAttribute('aria-disabled') !== 'true')) {\n firstFocusableChild = child;\n }\n child.tabIndex = -1;\n // child.setAttribute('tabindex', '-1');\n }\n // Bind\n if (!child.hasAttribute('tabindex')) {\n child.tabIndex = (document.activeElement === child) ? 0 : -1;\n }\n // this.rtiBindChild(child);\n }\n if (currentlyFocusedChild) {\n currentlyFocusedChild.tabIndex = 0;\n // currentlyFocusedChild.setAttribute('tabindex', '0');\n } else if (currentTabIndexChild) {\n if (currentlyFocusedChild) {\n currentTabIndexChild.tabIndex = -1;\n // currentTabIndexChild.setAttribute('tabindex', '-1');\n }\n } else if (firstFocusableChild) {\n firstFocusableChild.tabIndex = 0;\n // firstFocusableChild.setAttribute('tabindex', '0');\n }\n },\n })\n .events({\n focusin(event) {\n if (this.kbdNav !== 'true') return;\n const currentItem = /** @type {HTMLElement} */ (event.target);\n const participates = currentItem.matches(this.kbdNavQuery);\n if (!participates) return;\n this.ariaActiveDescendantElement = currentItem;\n if (currentItem.getAttribute('tabindex') !== '0') {\n currentItem.tabIndex = 0;\n }\n for (const item of this.kbdNavChildren) {\n if (item !== currentItem && item.hasAttribute('tabindex')) {\n item.tabIndex = -1;\n // item.setAttribute('tabindex', '-1');\n }\n }\n },\n keydown(event) {\n if (event.ctrlKey || event.altKey || event.shiftKey || event.metaKey) return;\n if (this.kbdNav !== 'true') return;\n\n switch (event.key) {\n case 'ArrowUp':\n case 'Up':\n if (this._ariaOrientationIsVertical()) {\n this.focusPrevious();\n }\n break;\n case 'ArrowDown':\n case 'Down':\n if (this._ariaOrientationIsVertical()) {\n this.focusNext();\n }\n break;\n case 'ArrowLeft':\n case 'Left':\n if (this._ariaOrientationIsVertical()) return;\n if (isRtl(this)) {\n this.focusNext();\n } else {\n this.focusPrevious();\n }\n break;\n case 'ArrowRight':\n case 'Right':\n if (this._ariaOrientationIsVertical()) return;\n if (isRtl(this)) {\n this.focusPrevious();\n } else {\n this.focusNext();\n }\n break;\n default:\n return;\n }\n event.stopPropagation(); // Avoid kbd within kbd (sub menus)\n event.preventDefault();\n },\n })\n .on({\n connected() {\n this.refreshTabIndexes();\n },\n });\n}\n", "import KbdNavWidgetMixin from './KeyboardNavMixin.js';\n\n/**\n * @param {typeof import('../core/CustomElement.js').default} Base\n */\nexport default function AriaToolbarMixin(Base) {\n return Base\n .mixin(KbdNavWidgetMixin)\n .extend()\n .set({\n ariaOrientationDefault: 'horizontal',\n });\n}\n", "/**\n * @param {ReturnType<import('./StateMixin.js').default> & ReturnType<import('./ThemableMixin.js').default>} Base\n */\nexport default function SurfaceMixin(Base) {\n return Base\n .extend()\n .observe({\n elevated: 'boolean',\n elevation: 'integer',\n _raised: {\n type: 'boolean',\n get({ hoveredState, pressedState }) {\n return hoveredState && !pressedState;\n },\n },\n })\n .expressions({\n showSurfaceTint({ elevated, elevation, disabledState, color }) {\n return (elevated || elevation !== null)\n && !disabledState\n && (!color || color.includes('surface'));\n },\n })\n .html/* html */`\n <div id=surface class=surface raised={_raised} disabled={disabledState} color={color}>\n <div _if={showSurfaceTint} id=surface-tint class=surface-tint raised={_raised} color={color} aria-hidden=true></div>\n </div>\n `\n .css`\n :host {\n\n /** Filter blur is 1/2 CSS blur */\n \n /** Reference Properties */\n /*\n --mdw-surface__box-shadow__1__umbra: 0px 1px 2px 0px rgba(var(--mdw-color__shadow), 0.30);\n --mdw-surface__box-shadow__2__umbra: 0px 1px 2px 0px rgba(var(--mdw-color__shadow), 0.30);\n --mdw-surface__box-shadow__3__umbra: 0px 1px 3px 0px rgba(var(--mdw-color__shadow), 0.30);\n --mdw-surface__box-shadow__4__umbra: 0px 2px 3px 0px rgba(var(--mdw-color__shadow), 0.30);\n --mdw-surface__box-shadow__5__umbra: 0px 4px 4px 0px rgba(var(--mdw-color__shadow), 0.30);\n \n --mdw-surface__filter__0__umbra: drop-shadow(0px 1px 1px rgba(var(--mdw-color__shadow), 0));\n --mdw-surface__filter__1__umbra: drop-shadow(0px 1px 1px rgba(var(--mdw-color__shadow), 0.30));\n --mdw-surface__filter__2__umbra: drop-shadow(0px 1px 1px rgba(var(--mdw-color__shadow), 0.30));\n --mdw-surface__filter__3__umbra: drop-shadow(0px 1px 1.5px rgba(var(--mdw-color__shadow), 0.30));\n --mdw-surface__filter__4__umbra: drop-shadow(0px 2px 1.5px rgba(var(--mdw-color__shadow), 0.30));\n --mdw-surface__filter__5__umbra: drop-shadow(0px 4px 2px rgba(var(--mdw-color__shadow), 0.30));\n \n --mdw-surface__box-shadow__1__penumbra: 0px 1px 3px 1px rgba(var(--mdw-color__shadow), 0.15);\n --mdw-surface__box-shadow__2__penumbra: 0px 2px 6px 2px rgba(var(--mdw-color__shadow), 0.15);\n --mdw-surface__box-shadow__3__penumbra: 0px 4px 8px 3px rgba(var(--mdw-color__shadow), 0.15);\n --mdw-surface__box-shadow__4__penumbra: 0px 6px 10px 4px rgba(var(--mdw-color__shadow), 0.15);\n --mdw-surface__box-shadow__5__penumbra: 0px 8px 12px 6px rgba(var(--mdw-color__shadow), 0.15);\n \n --mdw-surface__filter__0__penumbra: drop-shadow(0px 1px 2.5px rgba(var(--mdw-color__shadow), 0));\n --mdw-surface__filter__1__penumbra: drop-shadow(0px 1px 2.5px rgba(var(--mdw-color__shadow), 0.25));\n --mdw-surface__filter__2__penumbra: drop-shadow(0px 2px 5px rgba(var(--mdw-color__shadow), 0.25));\n --mdw-surface__filter__3__penumbra: drop-shadow(0px 4px 7px rgba(var(--mdw-color__shadow), 0.263));\n --mdw-surface__filter__4__penumbra: drop-shadow(0px 6px 9px rgba(var(--mdw-color__shadow), 0.27));\n --mdw-surface__filter__5__penumbra: drop-shadow(0px 8px 12px rgba(var(--mdw-color__shadow), 0.30));\n \n --mdw-surface__filter__0: var(--mdw-surface__shadow__0__umbra) var(--mdw-surface__shadow__0__penumbra);\n --mdw-surface__filter__1: var(--mdw-surface__shadow__1__umbra) var(--mdw-surface__shadow__1__penumbra);\n --mdw-surface__filter__2: var(--mdw-surface__shadow__2__umbra) var(--mdw-surface__shadow__2__penumbra);\n --mdw-surface__filter__3: var(--mdw-surface__shadow__3__umbra) var(--mdw-surface__shadow__3__penumbra);\n --mdw-surface__filter__4: var(--mdw-surface__shadow__4__umbra) var(--mdw-surface__shadow__4__penumbra);\n --mdw-surface__filter__5: var(--mdw-surface__shadow__5__umbra) var(--mdw-surface__shadow__5__penumbra);\n */\n \n /** Flatten for performance */\n --mdw-surface__shadow__0: drop-shadow(0px 1px 001px rgba(0,0,0,000)) drop-shadow(0px 1px 2.5px rgba(0,0,0,00000));\n --mdw-surface__shadow__1: drop-shadow(0px 1px 001px rgba(0,0,0,0.3)) drop-shadow(0px 1px 2.5px rgba(0,0,0,0.250));\n --mdw-surface__shadow__2: drop-shadow(0px 1px 001px rgba(0,0,0,0.3)) drop-shadow(0px 2px 005px rgba(0,0,0,0.250));\n --mdw-surface__shadow__3: drop-shadow(0px 1px 1.5px rgba(0,0,0,0.3)) drop-shadow(0px 4px 007px rgba(0,0,0,0.263));\n --mdw-surface__shadow__4: drop-shadow(0px 2px 1.5px rgba(0,0,0,0.3)) drop-shadow(0px 6px 009px rgba(0,0,0,0.270));\n --mdw-surface__shadow__5: drop-shadow(0px 4px 2.0px rgba(0,0,0,0.3)) drop-shadow(0px 8px 012px rgba(0,0,0,0.300));\n \n --mdw-surface__tint__1: 0.05;\n --mdw-surface__tint__2: 0.08;\n --mdw-surface__tint__3: 0.11;\n --mdw-surface__tint__4: 0.12;\n --mdw-surface__tint__5: 0.14;\n \n /** Configurables */\n \n --mdw-surface__shadow__resting: none;\n --mdw-surface__shadow: var(--mdw-surface__shadow__resting);\n --mdw-surface__tint: 0;\n --mdw-surface__tint__raised: 0;\n z-index: 0;\n }\n \n :host([elevation=\"0\"]) {\n --mdw-surface__tint: 0;\n --mdw-surface__shadow__resting: none;\n }\n \n :host([elevation=\"1\"]) {\n --mdw-surface__tint: var(--mdw-surface__tint__1);\n --mdw-surface__shadow__resting: var(--mdw-surface__shadow__1);\n }\n \n :host([elevation=\"2\"]) {\n --mdw-surface__tint: var(--mdw-surface__tint__2);\n --mdw-surface__shadow__resting: var(--mdw-surface__shadow__2);\n }\n \n :host([elevation=\"3\"]) {\n --mdw-surface__tint: var(--mdw-surface__tint__3);\n --mdw-surface__shadow__resting: var(--mdw-surface__shadow__3);\n }\n \n :host([elevation=\"4\"]) {\n --mdw-surface__tint: var(--mdw-surface__tint__4);\n --mdw-surface__shadow__resting: var(--mdw-surface__shadow__4);\n }\n \n :host([elevation=\"5\"]) {\n --mdw-surface__tint: var(--mdw-surface__tint__5);\n --mdw-surface__shadow__resting: var(--mdw-surface__shadow__5);\n }\n \n :host([elevation]) {\n --mdw-surface__tint__raised: var(--mdw-surface__tint);\n --mdw-surface__shadow__raised: var(--mdw-surface__shadow__resting);\n }\n \n .surface {\n position: absolute;\n inset: 0;\n \n pointer-events: none;\n \n filter: var(--mdw-surface__shadow);\n z-index: -1;\n \n transition-delay: 1ms;\n transition-duration: 200ms;\n transition-property: filter;\n transition-timing-function: linear;\n will-change: filter;\n }\n \n .surface[raised] {\n filter: var(--mdw-surface__shadow__raised, var(--mdw-surface__shadow__resting));\n }\n \n .surface[disabled] {\n filter:none;\n }\n \n .surface-tint {\n position: absolute;\n inset: 0;\n \n pointer-events: none;\n \n opacity: var(--mdw-surface__tint, 0);\n \n background-color: rgb(var(--mdw-color__primary));\n border-radius: inherit;\n \n transition-delay: 1ms;\n transition-duration: 200ms;\n transition-property: opacity;\n will-change: opacity;\n }\n \n .surface-tint[raised] {\n opacity: var(--mdw-surface__tint__raised, 0);\n }\n \n .surface-tint[pressed] {\n opacity: var(--mdw-surface__tint, 0);\n }\n \n .surface-tint[color]:not([color|=\"surface\"]) {\n display: none;\n } \n `;\n}\n", "import CustomElement from '../core/CustomElement.js';\nimport FlexableMixin from '../mixins/FlexableMixin.js';\nimport ShapeMixin from '../mixins/ShapeMixin.js';\nimport SurfaceMixin from '../mixins/SurfaceMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\nexport default CustomElement\n .mixin(ThemableMixin)\n .mixin(FlexableMixin)\n .mixin(SurfaceMixin)\n .mixin(ShapeMixin)\n .html/* html */`<slot id=slot></slot>`\n .on({\n composed() {\n const { surface, shape, surfaceTint } = this.refs;\n shape.append(surfaceTint);\n surface.append(shape);\n },\n })\n .css`\n :host {\n --mdw-shape__bg: rgb(var(--mdw-color__surface));\n --mdw-ink: var(--mdw-color__on-surface);\n position: relative;\n \n color: rgb(var(--mdw-ink));\n \n font: var(--mdw-type__font);\n letter-spacing: var(--mdw-type__letter-spacing);\n } \n `\n .autoRegister('mdw-surface');\n", "import AriaReflectorMixin from '../mixins/AriaReflectorMixin.js';\nimport AriaToolbarMixin from '../mixins/AriaToolbarMixin.js';\n\nimport Surface from './Surface.js';\n\n/**\n * Note: FAB does not exist inside because FABs can appear outside.\n * Space will be maintained for the FAB to slide into position. FAB should be\n * next on the DOM, so users can logically tab to it.\n */\n\nexport default Surface\n .mixin(AriaToolbarMixin)\n .mixin(AriaReflectorMixin)\n .extend()\n .set({\n elevated: true,\n _ariaRole: 'toolbar',\n })\n .observe({\n color: { empty: 'surface' },\n })\n .css`\n /* https://m3.material.io/components/bottom-app-bar/specs */\n\n :host {\n --mdw-surface__tint: var(--mdw-surface__tint__2);\n --mdw-surface__tint__raised: var(--mdw-surface__tint__2);\n --mdw-bg: var(--mdw-color__surface);\n --mdw-ink: var(--mdw-color__on-surface);\n\n display: flex;\n align-items: center;\n gap: 8px;\n justify-content: flex-start;\n\n box-sizing: content-box;\n /* Don't apply density */\n block-size: 56px;\n padding-block: 12px;\n padding-inline: 8px 16px;\n\n box-shadow: none;\n\n direction: ltr;\n }\n `\n .autoRegister('mdw-bottom-app-bar');\n", "// import fontStyles from 'https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:FILL@0..1&display=block' assert { type: 'css'};\n\nimport CustomElement from '../core/CustomElement.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\n/** @type {Map<string, {path:string, viewBox:string}>} */\nconst svgAliasMap = new Map();\nconst unaliased = new Set();\n\nconst documentLoadedStyleSheets = new Set();\n\n/** @typedef {'align'|'border'|'hspace'|'longDesc'|'lowsrc'|'name'|'vspace'} DeprecatedHTMLImageElementProperties */\n\n// https://html.spec.whatwg.org/multipage/embedded-content.html#htmlimageelement\n\n/** @implements {Omit<HTMLImageElement,DeprecatedHTMLImageElementProperties>} */\nexport default class Icon extends CustomElement\n .mixin(ThemableMixin)\n .extend()\n .define({\n _img() { return /** @type {HTMLImageElement} */ (this.refs.img); },\n })\n .define({\n naturalWidth() { return this._img.naturalWidth; },\n naturalHeight() { return this._img.naturalHeight; },\n complete() { return this._img.complete; },\n currentSrc() { return this._img.currentSrc; },\n x() { return this._img.x; },\n y() { return this._img.y; },\n decode() { return this._img.decode; },\n })\n .observe({\n _slottedText: 'string',\n disabled: 'boolean',\n alt: 'string',\n src: 'string',\n svg: 'string',\n svgPath: 'string',\n srcset: 'string',\n sizes: 'string',\n crossOrigin: { attr: 'crossorigin' },\n useMap: { attr: 'usemap' },\n isMap: { type: 'boolean', attr: 'ismap' },\n referrerPolicy: { attr: 'referrerpolicy' },\n decoding: { value: /** @type {'async'|'sync'|'auto'} */ (null) },\n loading: { value: /** @type {'eager'|'lazy'} */ (null) },\n width: 'integer',\n height: 'integer',\n forceFont: 'boolean',\n _linkLoaded: 'boolean',\n viewBox: { attr: 'viewBox' },\n fontClass: { empty: 'material-symbols-outlined' },\n fontLibrary: { empty: 'https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:FILL@0..1&display=block' },\n })\n .observe({\n _svgAlias: {\n type: 'object',\n get({ _slottedText }) {\n if (!_slottedText) return null;\n const result = svgAliasMap.get(_slottedText.trim().toLowerCase());\n if (!result) {\n unaliased.add(_slottedText);\n console.warn(`Icon: No SVG alias for ${JSON.stringify([...unaliased])}`);\n }\n return result;\n },\n },\n })\n .observe({\n _computedSVGPath({ svgPath, _svgAlias }) {\n return svgPath || _svgAlias?.path;\n },\n _computedViewBox({ viewBox, _svgAlias }) {\n return viewBox ?? _svgAlias?.viewBox ?? '0 0 24 24';\n },\n })\n .observe({\n _showSlot: {\n type: 'boolean',\n get({ _slottedText, svg, _computedSVGPath, src }) {\n return _slottedText && !svg && !_computedSVGPath && !src;\n },\n },\n })\n .expressions({\n showSVG({ svg, _computedSVGPath }) {\n return Boolean(svg || _computedSVGPath);\n },\n\n })\n .html/* html */`\n <link _if={_showSlot} id=link rel=stylesheet href={fontLibrary} />\n <svg _if=\"{showSVG}\" id=\"svg\" viewBox=\"{_computedViewBox}\">\n <use id=\"use\" _if=\"{svg}\" href=\"{svg}\" fill=\"currentColor\"/>\n <path id=\"path\" _if=\"{_computedSVGPath}\" d=\"{_computedSVGPath}\"/>\n </svg>\n <img _if={src} id=img\n disabled={disabled}\n alt={alt} src={src} srcset={srcset} sizes={sizes}\n crossorigin={crossOrigin} usemap={useMap} ismap={isMap}\n referrerpolicy={referrerPolicy} decoding={decoding} loading={loading}\n width={width} height={height}\n />\n <slot id=icon class={fontClass} hidden={!_showSlot} aria-hidden=true></slot>\n `\n .css`\n /* https://material.io/design/iconography/system-icons.html */\n\n :host {\n display: inline-block;\n vertical-align: -11.5%;\n\n block-size: 1em;\n inline-size: 1em;\n\n -webkit-user-select: none;\n user-select: none;\n\n font-variation-settings: 'FILL' 1;\n\n transition-duration: 200ms;\n /* stylelint-disable-next-line liberty/use-logical-spec -- Safari does not animate inline-size */\n transition-property: inline-size, width;\n }\n\n :host(:is([color],[ink])) {\n color: rgb(var(--mdw-ink));\n }\n\n #icon {\n /* Clip bounds in case font is not ready */\n display: block;\n overflow: clip;\n\n block-size: 1em;\n inline-size: 1em;\n\n font-size: inherit;\n font-variation-settings: inherit;\n\n transition-delay: 1ms;\n transition-duration: 200ms;\n\n transition-property: font-variation-settings;\n }\n\n #icon[hidden] {\n display: none;\n }\n\n #svg {\n display: block;\n\n block-size: inherit;\n inline-size: inherit;\n\n fill: currentColor;\n\n object-fit: cover;\n }\n\n #img {\n display: block;\n\n block-size: inherit;\n inline-size: inherit;\n\n object-fit: cover;\n\n transition-delay: 1ms;\n transition-duration: 200ms;\n transition-property: filter;\n }\n\n #img[disabled] {\n filter: grayscale();\n }\n\n .material-symbols-outlined {\n /* https://github.com/google/material-design-icons/issues/750 */\n direction: inherit;\n }\n\n `\n .childEvents({\n icon: {\n slotchange() {\n this._slottedText = this.textContent;\n },\n },\n link: {\n /**\n * @param {{currentTarget: HTMLLinkElement}} event\n * @type {any}\n */\n load({ currentTarget }) {\n const { href, parentNode } = currentTarget;\n if (!parentNode) {\n console.warn('Icon: parentNode is blank');\n }\n if (documentLoadedStyleSheets.has(href)) return;\n console.debug('Icon: Checking if link also in document', href);\n for (const link of document.head.getElementsByTagName('link')) {\n if (link.href === href) {\n console.debug(`Icon: Found ${href} in document.`);\n documentLoadedStyleSheets.add(href);\n return;\n }\n }\n console.debug(`Icon: Adding ${href} to document.`);\n document.head.append(currentTarget.cloneNode());\n documentLoadedStyleSheets.add(href);\n },\n },\n }) {\n static get svgAliasMap() { return svgAliasMap; }\n\n static get svgUnaliased() { return unaliased; }\n\n /**\n * @param {string} name\n * @param {string} path\n * @param {string} [viewBox]\n */\n static addSVGAlias(name, path, viewBox = '0 0 24 24') {\n name = name.toLowerCase();\n if (path) {\n svgAliasMap.set(name, { path, viewBox });\n } else {\n svgAliasMap.delete(name);\n }\n }\n\n /**\n * @param {number} [width]\n * @param {number} [height]\n */\n constructor(width, height) {\n super();\n\n if (width != null) {\n this.width = width;\n }\n if (height != null) {\n this.height = height;\n }\n }\n}\n\nIcon.autoRegister('mdw-icon');\n", "/* https://html.spec.whatwg.org/multipage/form-control-infrastructure.html */\n\n/** @typedef {HTMLElement & {value:string}} HTMLControlElement */\n\n/** @typedef {import('../core/CustomElement.js').default} CustomElement */\n\nconst FORM_IPC_EVENT = 'mdw-form-associated-changed';\n\nconst DOMString = { nullParser: String, value: '' };\n\n/**\n * @param {ReturnType<import('./StateMixin.js').default>} Base\n */\nexport default function FormAssociatedMixin(Base) {\n return Base\n .extend()\n .setStatic({\n formAssociated: true,\n })\n .set({\n /** @type {EventListener} */\n _ipcListener: null,\n /** @type {EventTarget} */\n _ipcTarget: null,\n })\n .observe({\n ariaControls: 'string',\n autocomplete: DOMString,\n name: DOMString,\n readOnly: { attr: 'readonly', type: 'boolean' },\n defaultChecked: { attr: 'checked', type: 'boolean' },\n _checkedDirty: 'boolean',\n /* \"Checkedness\" */\n _checked: 'boolean',\n required: 'boolean',\n type: DOMString,\n // [CEReactions] attribute [LegacyNullToEmptyString] DOMString value;\n _defaultValue: { reflect: true, attr: 'value' },\n _value: { empty: '' },\n _valueDirty: 'boolean',\n _invalid: 'boolean',\n _badInput: 'boolean',\n _validationMessage: 'string',\n _formDisabled: 'boolean',\n _formReset: 'boolean',\n })\n .observe({\n erroredState({ _invalid }) { return _invalid; },\n defaultValue: {\n reflect: false,\n get({ _defaultValue }) {\n return _defaultValue ?? '';\n },\n set(value) {\n this._defaultValue = String(value);\n },\n },\n _valueBehavior({ type }) {\n switch (type) {\n case 'radio':\n case 'checkbox':\n return 'default/on';\n case 'hidden':\n case 'button':\n case 'submit':\n case 'image':\n case 'reset':\n return 'default';\n case 'file': return 'filename';\n default: return 'value';\n }\n },\n })\n .methods({\n /**\n * Default behavior can should likely be overridden\n * @param {string} value\n */\n _onSetValue(value) {\n this._value = value;\n },\n /**\n * Default behavior can should likely be overridden\n * @param {boolean} checked\n */\n _onSetChecked(checked) {\n this._checked = checked;\n },\n })\n .observe({\n value: {\n reflect: false,\n get({ _valueBehavior, _defaultValue, _value }) {\n switch (_valueBehavior) {\n default:\n return _value;\n case 'default':\n return _defaultValue ?? '';\n case 'default/on':\n return _defaultValue ?? 'on';\n case 'filename':\n throw new Error('Not supported!');\n }\n },\n /** @param {string} v */\n set(v) {\n switch (this._valueBehavior) {\n case 'value':\n this._valueDirty = true;\n this._onSetValue(v);\n break;\n default:\n this.defaultValue = v;\n }\n },\n },\n /**\n * Part of FormAssociatedMixin for simplicity.\n * Enumerability doesn't guarantee checked state will be passed or used.\n */\n checked: {\n reflect: false,\n type: 'boolean',\n get({ _checked }) {\n return _checked;\n },\n /** @param {boolean} checked */\n set(checked) {\n this._checkedDirty = true;\n this._onSetChecked(checked);\n },\n },\n })\n .define({\n form() { return this.elementInternals.form; },\n validity() { return this.elementInternals.validity; },\n validationMessage() { return this.elementInternals.validationMessage; },\n willValidate() { return this.elementInternals.willValidate; },\n labels() { return this.elementInternals.labels; },\n })\n .observe({\n disabledState({ _formDisabled, disabled }) {\n if (_formDisabled) return true;\n return !!disabled;\n },\n })\n .methods({\n checkValidity() { return this.elementInternals.checkValidity(); },\n\n reportValidity() { return this.elementInternals.reportValidity(); },\n\n /**\n * @param {string} error\n * @return {void}\n */\n setCustomValidity(error) {\n this.elementInternals.setValidity({\n ...this.elementInternals.validity,\n customError: !!error,\n }, this.elementInternals.validationMessage || error);\n },\n\n /**\n * @param {string} key\n * @param {string} value\n * @return {void}\n */\n _notifyRadioChange(key, value) {\n this._ipcTarget?.dispatchEvent(\n new CustomEvent(FORM_IPC_EVENT, { detail: [key, value] }),\n );\n },\n\n refreshFormAssociation() {\n const newTarget = this.elementInternals.form ?? this.getRootNode();\n if (newTarget === this._ipcTarget) {\n // console.warn('Already associated?', newTarget);\n return;\n }\n if (this._ipcTarget) {\n this._ipcTarget.removeEventListener(FORM_IPC_EVENT, this._ipcListener);\n }\n if (this.type !== 'radio') return;\n\n this._ipcTarget = newTarget;\n this._ipcListener ??= this.formIPCEvent.bind(this);\n this._ipcTarget.addEventListener(FORM_IPC_EVENT, this._ipcListener);\n },\n\n /**\n * New lifecycle callback. This is called when association with\n * <form> is changed.\n * @param {HTMLFormElement?} form\n * @return {void}\n */\n formAssociatedCallback(form) {\n this.refreshFormAssociation();\n console.debug('FormAssociatedMixin: formAssociatedCallback', this);\n // Set value on association (not done by default?)\n },\n\n /**\n * @param {CustomEvent<[string, string]>} event\n * @return {void}\n */\n formIPCEvent(event) {\n if (event.target instanceof HTMLFormElement && event.target !== this.form) {\n console.warn('Control.formIPCEvent: Abort from wrong form');\n return;\n }\n if (this.type !== 'radio') {\n console.warn('Control.formIPCEvent: Abort from not radio');\n return;\n }\n const [name, value] = event.detail;\n if (this.name !== name) return;\n if (value === this.value) {\n // console.log('Control.formIPCEvent: Continue match', this.name, this.value);\n } else {\n console.debug('FormAssociatedMixin: Unchecking', this);\n this.checked = false;\n }\n },\n\n /** @param {boolean} disabled */\n formDisabledCallback(disabled) {\n this._formDisabled = disabled;\n },\n\n formResetCallback() {\n this._formReset = true; // Fires Change Event\n this._valueDirty = false;\n this.checkValidity();\n this._formReset = false;\n },\n\n /**\n * @param {string|FormData} state\n * @param {'autocomplete'|'restore'} mode\n */\n formStateRestoreCallback(state, mode) {\n if (navigator.userAgent.includes('Edg/')) {\n console.warn('Chromium Bug: 1429585 - Ignoring formStateRestoreCallback on Edge', { state, mode });\n // formStateRestoreCallback is broken on Edge\n // https://bugs.chromium.org/p/chromium/issues/detail?id=1429585\n return;\n }\n if (typeof state !== 'string') {\n console.warn('FormAssociatedMixin: (Restore) Could not restore', state);\n return;\n }\n if (this.type === 'checkbox' || this.type === 'radio') {\n console.debug('FormAssociatedMixin: (Restore) Setting Checkbox checked state.', state, this);\n this.checked = (state === 'checked');\n return;\n }\n if (this.type === 'radio') {\n // Due to lifecycle quirks, other radio elements on the page may not have\n // been upgraded to Custom Element yet and would not receive\n // the 'uncheck' communication. Delay notice until then.\n this.checked = (state === 'checked');\n return;\n }\n\n console.debug('FormAssociatedMixin: (Restore) Setting value state.', state, this);\n this.value = state;\n },\n\n _updateFormAssociatedValue() {\n switch (this.type) {\n case 'radio':\n if (this.checked) {\n this._notifyRadioChange(this.name, this.value || 'on');\n }\n // Fallthrough\n case 'checkbox':\n if (this.checked) {\n console.log('FormAssociatedMixin: setFormValue', this.name, `(${this.value}, 'checked')`, this);\n this.elementInternals.setFormValue(this.value, 'checked');\n } else {\n console.log('FormAssociatedMixin: setFormValue', this.name, \"(null, 'unchecked')\", this);\n this.elementInternals.setFormValue(null, 'unchecked');\n }\n break;\n default:\n console.log('FormAssociatedMixin: updating form value', this.name, this.value);\n this.elementInternals.setFormValue(this.value);\n }\n },\n })\n .events({\n blur() { this.checkValidity(); },\n })\n .on({\n connected() {\n // Bind to global if no form is present (used by radio)\n this.refreshFormAssociation();\n },\n checkedChanged() {\n this._updateFormAssociatedValue();\n },\n valueChanged() {\n this._updateFormAssociatedValue();\n },\n });\n}\n", "/* https://html.spec.whatwg.org/multipage/form-control-infrastructure.html */\n\nimport { cloneAttributeCallback } from '../core/CustomElement.js';\n\nimport FormAssociatedMixin from './FormAssociatedMixin.js';\n\n/** @typedef {import('../core/CustomElement.js').default} CustomElement */\n\n/** @typedef {'align'|'useMap'} DeprecatedHTMLInputElementProperties */\n\n/** @typedef {HTMLInputElement|HTMLTextAreaElement|HTMLSelectElement} HTMLControlElement */\n\n/**\n * @param {ReturnType<import('./StateMixin.js').default>} Base\n */\nexport default function ControlMixin(Base) {\n return Base\n .mixin(FormAssociatedMixin)\n .extend()\n .observe({\n ariaLabel: 'string',\n })\n .set({\n delegatesFocus: true,\n focusableOnDisabled: false,\n controlTagName: 'input',\n controlVoidElement: true,\n })\n .methods({\n onValueChangingContentAttribute() {\n const control = /** @type {HTMLControlElement} */ (this.refs.control);\n\n if (!this.hasAttribute('value')) {\n // Force HTMLInputElement to recalculate default\n // Unintended effect of incrementally changing attributes (eg: range)\n control.removeAttribute('value'); // Firefox will not run steps unless value is changed (remove first)\n control.setAttribute('value', ''); // Chrome needs to know to reset\n }\n // Changing control attribute may change the value (eg: min/max)\n this._value = control.value;\n },\n /** @type {HTMLElement['focus']} */\n focus(...options) {\n this.refs.control.focus(...options);\n },\n /** Redirect click requests to control itself */\n click() {\n console.log('ControlMixin: Click');\n this.refs.control.click();\n },\n })\n .define({\n stateTargetElement() { return this.refs.control; },\n form() { return this.elementInternals.form; },\n validity() { return this.elementInternals.validity; },\n validationMessage() { return this.elementInternals.validationMessage; },\n willValidate() { return this.elementInternals.willValidate; },\n labels() { return this.elementInternals.labels; },\n })\n .methods({\n checkValidity() {\n const control = /** @type {HTMLControlElement} */ (this.refs.control);\n const validityState = control.checkValidity();\n /** @type {Partial<ValidityState>} */\n const newValidity = {};\n\n // eslint-disable-next-line guard-for-in\n for (const key in control.validity) {\n // @ts-ignore Skip cast\n newValidity[key] = control.validity[key];\n }\n this.elementInternals.setValidity(newValidity, control.validationMessage);\n this._invalid = !validityState;\n this._validationMessage = control.validationMessage;\n this._badInput = control.validity.badInput;\n return validityState;\n },\n reportValidity() {\n this.checkValidity();\n /** @type {HTMLControlElement} */ (this.refs.control).reportValidity();\n return this.elementInternals.reportValidity();\n },\n /**\n * @param {string} error\n * @return {void}\n */\n setCustomValidity(error) {\n /** @type {HTMLControlElement} */ (this.refs.control).setCustomValidity(error);\n this.checkValidity();\n },\n\n })\n .on({\n // Wait until controlTagName is settled before templating\n composed({ template, html }) {\n template.append(html`\n <label id=label disabled={disabledState}>\n <${this.controlTagName} id=control \n aria-labelledby=${({ ariaLabel }) => (ariaLabel ? null : '#slot')}\n aria-label={ariaLabel}\n type={type}\n >${this.controlVoidElement ? '' : `</${this.controlTagName}>`}\n </label>\n `);\n },\n disabledStateChanged(oldValue, newValue) {\n const control = /** @type {HTMLControlElement} */ (this.refs.control);\n control.setAttribute('aria-disabled', `${newValue}`);\n if (!this.focusableOnDisabled) {\n control.disabled = newValue;\n if (newValue) {\n this.tabIndex = 0;\n } else {\n this.removeAttribute('tabindex');\n }\n }\n },\n constructed() {\n const control = /** @type {HTMLControlElement} */ (this.refs.control);\n this._value = control.value;\n },\n connected() {\n // Expose this element as focusable\n if (!this.hasAttribute('tabindex')) {\n this.tabIndex = 0;\n }\n },\n attrs: {\n autocomplete: cloneAttributeCallback('autocomplete', 'control'),\n name: cloneAttributeCallback('name', 'control'),\n readonly: cloneAttributeCallback('readonly', 'control'),\n required: cloneAttributeCallback('required', 'control'),\n },\n })\n .childEvents({\n control: {\n input({ currentTarget }) {\n console.debug('ControlMixin: input');\n const control = /** @type {HTMLControlElement} */ (currentTarget);\n if (this.validity.valid) {\n // Track internally\n control.checkValidity();\n this._badInput = control.validity.badInput;\n } else {\n // Perform check in case user has validated\n this.checkValidity();\n }\n this._value = control.value;\n },\n change({ currentTarget }) {\n console.debug('ControlMixin: change');\n const control = /** @type {HTMLControlElement} */ (currentTarget);\n this._valueDirty = true;\n this._value = control.value;\n this.checkValidity();\n // Change event is NOT composed. Needs to escape shadow DOM\n this.dispatchEvent(new Event('change', { bubbles: true }));\n },\n },\n })\n .css`\n :host {\n display: inline-flex;\n }\n \n /* Remove Firefox inner */\n :host(::-moz-focus-inner) {\n border: 0;\n }\n \n #label {\n display: contents;\n \n pointer-events: none;\n }\n \n #control {\n /* Control is the touch target */\n /* Firefox requires at least 1px \"visible\" for screen reading */\n /* Safari will not allow interaction with 0 opacity */\n /* Chrome will not focus with visibility:hidden */\n \n position: absolute;\n inset: 50%;\n /* --mdw-device-pixel-ratio: 1; */\n \n block-size: 100%;\n min-block-size: 48px;\n inline-size:100%;\n min-inline-size: 48px;\n margin: 0;\n border: 0;\n padding: 0;\n \n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n \n cursor: auto;\n outline: none;\n \n pointer-events: auto;\n \n transform: translateX(-50%) translateY(-50%);\n \n /* Safari and Chrome will emit two click events if not at top of stack */\n /* Allows up to 3 other layers (eg: ripple, outline) */\n z-index: 4;\n \n background-color: transparent;\n \n border-radius: 0;\n color: transparent;\n }\n \n #control::-moz-focus-inner {\n border: 0;\n }\n \n `;\n}\n", "import { cloneAttributeCallback } from '../core/CustomElement.js';\n\nimport ControlMixin from './ControlMixin.js';\n\n/** @typedef {'align'|'useMap'} DeprecatedHTMLInputElementProperties */\n\n/** @typedef {import('../core/CustomElement.js').default} CustomElement */\n\nconst IMPLICIT_SUBMISSION_BLOCKING_TYPES = new Set([\n 'text',\n 'search',\n 'url',\n 'tel',\n 'email',\n 'password',\n 'date',\n 'month',\n 'week',\n 'time',\n 'datetime-local',\n 'number',\n]);\n\nconst DOMString = { nullParser: String, empty: '' };\n\n/**\n * @see https://html.spec.whatwg.org/multipage/input.html#htmlinputelement\n * @param {ReturnType<import('./StateMixin.js').default>} Base\n */\nexport default function InputMixin(Base) {\n return Base\n .mixin(ControlMixin)\n .extend()\n .observe({\n accept: DOMString,\n alt: DOMString,\n dirName: { attr: 'dirname', ...DOMString },\n _formAction: { attr: 'formaction' },\n formEnctype: { attr: 'formenctype', ...DOMString },\n formMethod: { attr: 'formmethod', ...DOMString },\n formNoValidate: { attr: 'formNoValidate', type: 'boolean' },\n formTarget: { attr: 'formtarget', ...DOMString },\n _height: { attr: 'height', type: 'integer' },\n indeterminate: { type: 'boolean', reflect: false },\n max: DOMString,\n maxLength: { attr: 'maxlength', type: 'integer', empty: -1 },\n min: DOMString,\n minLength: { attr: 'minlength', type: 'integer', empty: -1 },\n multiple: 'boolean',\n pattern: DOMString,\n placeholder: DOMString,\n size: { type: 'integer', empty: 20 },\n src: DOMString,\n step: DOMString,\n // [CEReactions] attribute [LegacyNullToEmptyString] DOMString value;\n _width: { attr: 'width', type: 'integer' },\n })\n .define({\n // Alias for typescript\n _input() { return /** @type {HTMLInputElement} */ (this.refs.control); },\n })\n .overrides({\n controlTagName: 'input',\n })\n .on({\n composed({ inline }) {\n const { label, control } = this.refs;\n // Expose [selected] to .checked\n label.setAttribute('selected', '{checked}');\n label.setAttribute('invalid', '{_invalid}');\n label.setAttribute('indeterminate', '{indeterminate}');\n\n control.setAttribute('checked', '{defaultChecked}');\n control.setAttribute('height', '{_height}');\n control.setAttribute('width', '{_width}');\n control.setAttribute('value', '{_defaultValue}');\n },\n\n // TODO: Bind multiple\n typeChanged() { this.onValueChangingContentAttribute(); },\n defaultCheckedChanged() {\n this._checked = this._input.checked;\n },\n minChanged() { this.onValueChangingContentAttribute(); },\n minLengthChanged() { this.onValueChangingContentAttribute(); },\n maxChanged() { this.onValueChangingContentAttribute(); },\n maxLengthChanged() { this.onValueChangingContentAttribute(); },\n multipleChanged() { this.onValueChangingContentAttribute(); },\n patternChanged() { this.onValueChangingContentAttribute(); },\n stepChanged() { this.onValueChangingContentAttribute(); },\n defaultValueChanged() { this.onValueChangingContentAttribute(); },\n _formResetChanged(oldValue, newValue) {\n if (!newValue) return;\n console.log('form reset');\n const input = this._input;\n input.value = this.defaultValue;\n input.checked = this.defaultChecked;\n this._value = input.value;\n this._checked = input.checked;\n this._checkedDirty = false;\n },\n attrs: {\n accept: cloneAttributeCallback('accept', 'control'),\n alt: cloneAttributeCallback('alt', 'control'),\n dirname: cloneAttributeCallback('dirname', 'control'),\n formenctype: cloneAttributeCallback('formenctype', 'control'),\n formmethod: cloneAttributeCallback('formmethod', 'control'),\n formnovalidate: cloneAttributeCallback('formnovalidate', 'control'),\n formTarget: cloneAttributeCallback('formTarget', 'control'),\n max: cloneAttributeCallback('max', 'control'),\n maxlength: cloneAttributeCallback('maxlength', 'control'),\n min: cloneAttributeCallback('min', 'control'),\n minlength: cloneAttributeCallback('minlength', 'control'),\n multiple: cloneAttributeCallback('multiple', 'control'),\n pattern: cloneAttributeCallback('pattern', 'control'),\n placeholder: cloneAttributeCallback('placeholder', 'control'),\n size: cloneAttributeCallback('size', 'control'),\n src: cloneAttributeCallback('src', 'control'),\n step: cloneAttributeCallback('step', 'control'),\n },\n })\n .overrides({\n _onSetChecked(checked) {\n // Apply user value to input and read back result to apply control to parse\n this._input.checked = checked;\n this._checked = this._input.checked;\n },\n _onSetValue(value) {\n // Apply user value to input and read back result to apply control to parse\n this._input.value = value;\n this._value = this._input.value;\n },\n })\n .methods({\n /**\n * @see https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#implicit-submission\n * @param {Event} event\n * @return {void}\n */\n performImplicitSubmission(event) {\n const form = this.form;\n if (!form) return;\n /** @type {HTMLInputElement} */\n let defaultButton;\n const submissionBlockers = new Set();\n for (const element of /** @type {HTMLCollectionOf<HTMLInputElement>} */ (form.elements)) {\n if (element.type === 'submit' && !element.disabled && !element.matches(':disabled')) {\n defaultButton ??= element;\n break;\n }\n\n if (IMPLICIT_SUBMISSION_BLOCKING_TYPES.has(element.type)) {\n submissionBlockers.add(element);\n }\n }\n if (defaultButton) {\n defaultButton.click();\n return;\n }\n if (submissionBlockers.size > 1) return;\n this.form.submit();\n },\n\n })\n .childEvents({\n control: {\n keydown(event) {\n if (event.defaultPrevented) return;\n if (event.key !== 'Enter') return;\n if (/** @type {HTMLInputElement} */ (event.currentTarget).type === 'submit') return;\n this.performImplicitSubmission(event);\n },\n change(event) {\n if (this.disabledState) {\n event.preventDefault();\n event.stopImmediatePropagation();\n return;\n }\n const input = /** @type {HTMLInputElement} */ (event.currentTarget);\n console.debug('InputMixin: Will fire checked via change event');\n this._checkedDirty = true;\n this._checked = input.checked;\n },\n },\n })\n .define({\n files() { return this._input.files; },\n\n select() { return this._input.select; },\n\n selectionDirection: {\n get() { return this._input.selectionDirection; },\n set(value) { this._input.selectionDirection = value; },\n },\n\n selectionEnd: {\n get() { return this._input.selectionEnd; },\n set(value) { this._input.selectionEnd = value; },\n },\n\n selectionStart: {\n get() { return this._input.selectionStart; },\n set(value) { this._input.selectionStart = value; },\n },\n\n setRangeText() { return this._input.setRangeText; },\n\n setSelectionRange() { return this._input.setSelectionRange; },\n\n showPicker() { return this._input.showPicker; },\n\n stepDown() { return this._input.stepDown; },\n\n stepUp() { return this._input.stepUp; },\n\n valueAsDate: {\n get() { return this._input.valueAsDate; },\n set(value) {\n this._input.valueAsDate = value;\n this.value = this._input.value;\n },\n },\n\n valueAsNumber: {\n get() { return this._input.valueAsNumber; },\n set(value) {\n this._input.valueAsNumber = value;\n this.value = this._input.value;\n },\n },\n\n height: {\n get() { return this._input.height; },\n set(value) {\n this._input.height = value;\n this._height = value;\n },\n },\n\n formAction: {\n get() { return this._input.formAction; },\n set(value) {\n this._input.formAction = value;\n this._formAction = value;\n },\n },\n\n width: {\n get() { return this._input.width; },\n set(value) {\n this._input.width = value;\n this._width = value;\n },\n },\n });\n}\n", "/** @typedef {import('./CustomElement').default} CustomElement */\n\n/** @type {WeakMap<HTMLElement, EventListener>} */\nconst eventHandlerValues = new Map();\n\n/**\n * @see https://html.spec.whatwg.org/multipage/webappapis.html#event-handler-attributes\n * @type {import('./typings.js').ObserverOptions<'function',EventListener, unknown>}\n */\nexport const EVENT_HANDLER_TYPE = {\n type: 'function',\n reflect: 'read',\n value: null,\n values: eventHandlerValues,\n parser(v) { return v; },\n attributeChangedCallback(name, oldValue, newValue) {\n if (oldValue == null && newValue == null) return;\n // Must continue if oldValue === newValue;\n if (newValue == null) {\n this[name] = null;\n return;\n }\n // Assign to temp element, allow it to parse and then copy result.\n // Let browser parse instead of using eval()\n // CSP Violations will be thrown by browser on failure and result in `null`\n const button = document.createElement('button');\n button.setAttribute('onclick', newValue);\n const fn = button.onclick;\n button.remove();\n this[name] = fn;\n },\n propChangedCallback(name, oldValue, newValue) {\n const eventName = name.slice(2);\n if (oldValue) {\n this.removeEventListener(eventName, oldValue);\n }\n if (newValue) {\n this.addEventListener(eventName, newValue);\n }\n },\n};\n\nconst weakRefValues = new WeakMap();\n\n/**\n * @type {import('./typings.js').ObserverOptions<'object',HTMLElement>}\n */\nexport const WEAKREF_TYPE = {\n type: 'object',\n reflect: false,\n value: null,\n values: weakRefValues,\n parser(v) { return new WeakRef(v); },\n get() {\n return weakRefValues.get(this)?.deref();\n },\n};\n\n/** @type {WeakMap<any, Animation>} */\nconst elementStylerLastAnimation = new WeakMap();\n/** @type {WeakMap<CustomElement, ElementStylerOptions>} */\nconst elementStylerValues = new WeakMap();\n/** @type {WeakSet<any>} */\nconst elementStylerHasQueue = new WeakSet();\n\n/**\n * @typedef {Object} ElementStylerOptions\n * @prop {string} target Target ID\n * @prop {Keyframe} styles\n * @prop {EffectTiming} [timing]\n */\n\n/** @this {CustomElement} */\nfunction elementStylerRAFCallback() {\n let previousAnimation = elementStylerLastAnimation.get(this);\n const value = elementStylerValues.get(this);\n if (!value) {\n previousAnimation?.cancel();\n return;\n }\n /** @type {HTMLElement} */\n const el = value.target ? this.composition.getElement(this.shadowRoot, value.target) : this;\n const currentAnimation = el.animate(value.styles, {\n ...value.timing,\n fill: 'forwards',\n });\n currentAnimation.onremove = () => {\n previousAnimation?.effect.updateTiming({\n fill: 'none',\n });\n // Destroy previous manually to avoid leak\n previousAnimation?.finish();\n previousAnimation?.cancel();\n previousAnimation = null;\n };\n elementStylerLastAnimation.set(this, currentAnimation);\n elementStylerHasQueue.delete(this);\n}\n\n/** @type {import('./typings.js').ObserverOptions<'object',ElementStylerOptions, CustomElement>} */\nexport const ELEMENT_STYLER_TYPE = {\n type: 'object',\n reflect: false,\n values: elementStylerValues,\n diff: null, // Skip computing entire change\n changedCallback(oldValue, newValue) {\n const hasQueue = elementStylerHasQueue.has(this);\n if (!newValue) {\n if (!hasQueue) return;\n console.warn('debug needed of cancel needed');\n elementStylerHasQueue.delete(this);\n return;\n }\n\n if (hasQueue) {\n // Already scheduled\n return;\n }\n\n // Animation styles may trickle in steps, so queue a microtask before doing any work.\n // Using requestAnimationFrame would fire one frame too late for CSS animations already scheduled\n queueMicrotask(elementStylerRAFCallback.bind(this));\n elementStylerHasQueue.add(this);\n },\n};\n", "import CustomElement from '../core/CustomElement.js';\nimport { ELEMENT_STYLER_TYPE } from '../core/customTypes.js';\n\nexport default CustomElement\n .extend()\n .set({\n hadRippleHeld: false,\n hadRippleReleased: false,\n rippleStarted: false,\n })\n .observe({\n rippleState: 'string',\n keepAlive: 'boolean',\n _positionX: 'float',\n _positionY: 'float',\n _radius: 'float',\n holdRipple: {\n type: 'boolean',\n changedCallback(oldValue, newValue) {\n if (newValue) {\n this.hadRippleHeld = true;\n } else {\n this.hadRippleReleased = true;\n }\n },\n },\n })\n .observe({\n _positionStyle: {\n ...ELEMENT_STYLER_TYPE,\n get({ _positionX, _positionY, _radius }) {\n return {\n styles: {\n minBlockSize: `${_radius}px`,\n minInlineSize: `${_radius}px`,\n boxShadow: `0 0 calc(0.10 * ${_radius}px) calc(0.10 * ${_radius}px) currentColor`,\n left: `calc(50% + ${_positionX}px)`,\n top: `calc(50% + ${_positionY}px)`,\n },\n };\n },\n },\n })\n .methods({\n /**\n * @param {number} [x] offsetX\n * @param {number} [y] offsetY\n * @param {number} [size]\n * @return {void}\n */\n updatePosition(x, y, size) {\n // Element is already centered.\n // Use offset to calculate parent size;\n\n let hypotenuse = size;\n const { clientWidth: parentWidth, clientHeight: parentHeight } = this.offsetParent;\n\n x ??= parentWidth / 2;\n y ??= parentHeight / 2;\n if (!hypotenuse) {\n const width = (x >= parentWidth / 2) ? x : (parentWidth - x);\n const height = (y >= parentHeight / 2) ? y : (parentHeight - y);\n hypotenuse = 2 * Math.sqrt((width * width) + (height * height));\n }\n\n // const expandDuration = Math.min(\n // 500, // Never longer than long-press duration\n // (1000 * Math.sqrt(size / 2 / 1024) + 0.5), // From Android\n // );\n\n // this.style.minBlockSize = `${hypotenuse}px`;\n // this.style.minInlineSize = `${hypotenuse}px`;\n // this.style.boxShadow = `0 0 calc(0.10 * ${0}px) calc(0.10 * ${0}px) currentColor`;\n // this.style.marginLeft = `${x - (parentWidth / 2)}px`;\n // this.style.marginTop = `${y - (parentHeight / 2)}px`;\n\n this._positionX = x - (parentWidth / 2);\n this._positionY = y - (parentHeight / 2);\n this._radius = hypotenuse;\n },\n handleRippleComplete() {\n if (this.keepAlive) {\n this.setAttribute('ripple-state', 'complete');\n } else {\n this.remove();\n }\n },\n })\n .events({\n animationstart({ animationName }) {\n if (animationName !== 'ripple-fade-in') return;\n if (this.rippleStarted && !this.keepAlive) {\n // Animation restarted. Likely from visibility change\n this.remove();\n return;\n }\n this.rippleStarted = true;\n },\n animationend({ animationName }) {\n switch (animationName) {\n case 'ripple-fade-in':\n this.setAttribute('ripple-state', 'filled');\n break;\n case 'ripple-fade-out':\n this.handleRippleComplete();\n break;\n default:\n }\n },\n })\n .css`\n :host {\n --enter-delay: 80ms;\n --touch-down-acceleration: 1024;\n --touch-up-acceleration: 3400;\n --mdw-ripple-expand-duration: 300ms;\n --mdw-ripple-simple-duration: 200ms;\n --mdw-ripple-fade-out-duration: 333ms;\n --mdw-ripple-standard-easing: var(--mdw-motion-standard-easing, cubic-bezier(0.4, 0.0, 0.2, 1));\n --mdw-ripple-deceleration-easing: var(--mdw-motion-deceleration-easing, cubic-bezier(0.0, 0.0, 0.2, 1));\n \n --size: 0;\n position: absolute;\n /* stylelint-disable-next-line liberty/use-logical-spec */\n top: 50%;\n /* stylelint-disable-next-line liberty/use-logical-spec */\n left: 50%;\n \n display: block;\n \n min-block-size: 141.42%; /* √2 * 100% */\n min-inline-size: 141.42%;\n \n pointer-events: none;\n \n -webkit-tap-highlight-color: transparent;\n \n opacity: 0.12;\n transform: translateX(-50%) translateY(-50%) scale(1);\n \n background-color: currentColor;\n border-radius: 50%;\n \n /* Adds feathered appearance to ripple */\n box-shadow: 0 0 calc(0.10 * var(--size)) calc(0.10 * var(--size)) currentColor;\n \n transition-delay: 0s;\n transition-duration: var(--mdw-ripple-simple-duration);\n transition-property: background-color, color;\n transition-timing-function: var(--mdw-ripple-standard-easing);\n \n animation-name: ripple-fade-in, none;\n animation-duration: var(--mdw-ripple-expand-duration), var(--mdw-ripple-fade-out-duration);\n animation-timing-function: linear, var(--mdw-ripple-deceleration-easing);\n animation-direction: normal;\n animation-fill-mode: forwards;\n /* stylelint-disable-next-line liberty/use-logical-spec */\n will-change: transform, opacity, top, left, box-shadow;\n \n aspect-ratio: 1/1;\n }\n \n :host([ripple-state=\"filled\"]) {\n animation-name: none, ripple-fade-out;\n }\n \n :host([ripple-state=\"filled\"][hold-ripple]) {\n animation-name: ripple-fade-in, none;\n }\n \n :host([ripple-state=\"complete\"]) {\n animation-name: none, ripple-fade-out;\n animation-duration: 0s;\n }\n \n @keyframes ripple-fade-in {\n from {\n transform: translateX(-50%) translateY(-50%) scale(0);\n }\n }\n \n @keyframes ripple-fade-out {\n \n to { opacity: 0; }\n }\n `\n .autoRegister('mdw-ripple');\n", "import Ripple from '../components/Ripple.js';\n\n/** @typedef {import('../components/Ripple.js').default} Ripple */\n\n/**\n * @param {ReturnType<import('./StateMixin.js').default>} Base\n */\nexport default function RippleMixin(Base) {\n return Base\n .extend()\n .set({\n /** @type {WeakRef<InstanceType<Ripple>>} */\n _lastRippleWeakRef: null,\n /** Flag set if ripple was added this event loop. */\n _rippleAdded: false,\n })\n .define({\n _lastRipple: {\n get() {\n const element = this._lastRippleWeakRef?.deref();\n if (element?.isConnected) return element;\n return null;\n },\n set(ripple) {\n this._lastRippleWeakRef = ripple ? new WeakRef(ripple) : null;\n },\n },\n })\n .methods({\n /**\n * @param {number} [x]\n * @param {number} [y]\n * @param {boolean} [hold]\n * @return {InstanceType<Ripple>}\n */\n addRipple(x, y, hold) {\n const { rippleContainer } = this.refs;\n if (!rippleContainer.isConnected) return null; // Detached?\n const ripple = new Ripple();\n this._rippleAdded = true;\n queueMicrotask(() => {\n // Reset before next event loop;\n this._rippleAdded = false;\n });\n rippleContainer.appendChild(ripple);\n if (hold) {\n ripple.holdRipple = true;\n }\n ripple.updatePosition(x, y);\n this._lastRipple = ripple;\n return ripple;\n },\n })\n .html/* html */`\n <div id=ripple-container _if={!disabledState} aria-hidden=true></div>\n `\n .events({\n '~pointerdown'(event) {\n if (event.button) return;\n if (this.disabledState) return;\n\n const { rippleContainer } = this.refs;\n if (!rippleContainer.isConnected) return; // Detached?\n const rect = rippleContainer.getBoundingClientRect();\n const x = event.pageX - rect.left - window.pageXOffset;\n const y = event.pageY - rect.top - window.pageYOffset;\n const lastRipple = this._lastRipple;\n if (lastRipple) {\n lastRipple.holdRipple = false;\n }\n console.debug('ripple from pointerdown');\n this.addRipple(x, y);\n },\n '~click'(e) {\n if (this._rippleAdded) {\n // Avoid double event\n return;\n }\n if (e.pointerType || e.detail) return;\n if (this.disabledState) return;\n if (this._pressed) return;\n const lastRipple = this._lastRipple;\n if (lastRipple) {\n lastRipple.holdRipple = false;\n }\n console.debug('ripple from programmatic click');\n this.addRipple();\n },\n })\n .on({\n _pressedChanged(oldValue, pressed) {\n const ripple = this._lastRipple;\n if (!pressed) {\n if (ripple) {\n ripple.holdRipple = false;\n }\n return;\n }\n if (!ripple || ripple.hadRippleReleased) {\n if (this._lastInteraction !== 'key') {\n // Sometimes pointer events may be out of order\n return;\n }\n console.debug('ripple from press state');\n this.addRipple(null, null, true);\n return;\n }\n if (ripple.hadRippleHeld) return;\n ripple.holdRipple = true;\n },\n })\n .css`\n :host {\n --mdw-state__pressed-opacity: 0;\n }\n \n #ripple-container {\n position: absolute;\n inset: 0;\n \n overflow: hidden;\n \n pointer-events: none;\n }\n `;\n}\n", "// Globals\n\nlet lastInteractionWasTouch = window?.matchMedia?.('(any-pointer: coarse)').matches;\n\n/**\n * @param {typeof import('../core/CustomElement.js').default} Base\n */\nexport default function StateMixin(Base) {\n return Base\n .extend()\n .observe({\n disabled: 'boolean',\n _lastInteraction: {\n /** @type {'mouse'|'touch'|'key'|'pen'|null} */\n value: null,\n },\n _hovered: 'boolean',\n _focused: 'boolean',\n _pressed: 'boolean',\n stateLayer: 'boolean',\n })\n .observe({\n disabledState({ disabled }) { return disabled; },\n hoveredState({ _hovered }) { return _hovered; },\n focusedState({ _focused }) { return _focused; },\n pressedState({ _pressed }) { return _pressed; },\n touchedState({ _lastInteraction }) {\n return _lastInteraction === 'touch';\n },\n })\n .define({\n stateTargetElement() { return this; },\n })\n .html/* html */`\n <div id=state _if={stateLayer}\n disabled={disabledState}\n focused={focusedState}\n hovered={hoveredState}\n pressed={pressedState}\n interaction={_lastInteraction}\n touched={touchedState}\n aria-hidden=true></div>\n `\n .events({\n pointerenter(event) {\n if (!event.isPrimary) return;\n this._pressed = this.stateTargetElement.matches(':active');\n if (event.pointerType === 'touch') return;\n this._hovered = true;\n // Firefox lags a frame before reporting :hover\n // requestAnimationFrame(() => {\n // this._hovered = this.stateTargetElement.matches(':hover');\n // });\n },\n '~pointerdown'(event) {\n if (!event.isPrimary) return;\n this._lastInteraction = /** @type {'touch'|'mouse'|'pen'} */ (event.pointerType);\n this._pressed = true;\n },\n '~pointerup'(event) {\n if (!event.isPrimary) return;\n this._lastInteraction = /** @type {'touch'|'mouse'|'pen'} */ (event.pointerType);\n this._pressed = false;\n },\n pointercancel(e) {\n if (!e.isPrimary) return;\n this._pressed = this.stateTargetElement.matches(':active');\n },\n pointerleave(event) {\n if (!event.isPrimary) return;\n this._pressed = false;\n this._hovered = false;\n },\n '~keydown'(e) {\n this._lastInteraction = 'key';\n if (e.repeat) return;\n // console.debug('keydown', this.stateTargetElement.matches(':active'));\n requestAnimationFrame(() => {\n this._pressed = this.stateTargetElement.matches(':active');\n // console.debug('pressed? after one keydown frame', this._pressed);\n });\n },\n '~keyup'() {\n this._lastInteraction = 'key';\n // console.debug('keyup', this.stateTargetElement.matches(':active'));\n requestAnimationFrame(() => {\n this._pressed = this.stateTargetElement.matches(':active');\n // console.debug('pressed? after one keyUP frame?', this._pressed);\n });\n },\n blur() {\n this._focused = false;\n if (!this._lastInteraction) return;\n lastInteractionWasTouch = (this._lastInteraction === 'touch');\n // this._lastInteraction = null;\n },\n focus() {\n this._focused = true;\n // Element was focused without a mouse or touch event (keyboard or programmatic)\n if (!this._lastInteraction && lastInteractionWasTouch) {\n // Replicate touch behavior\n this._lastInteraction = 'touch';\n }\n },\n })\n .on({\n disconnected() {\n this._lastInteraction = null;\n },\n })\n .css`\n /* https://m3.material.io/foundations/interaction-states */\n\n :host {\n --mdw-state__hovered-opacity: 0.08;\n --mdw-state__focused-opacity: 0.12;\n --mdw-state__pressed-opacity: 0.12;\n --mdw-state__dragged-opacity: 0.12;\n position: relative;\n\n outline: none;\n -webkit-tap-highlight-color: transparent;\n }\n\n /* Remove Firefox inner */\n :host(::-moz-focus-inner) {\n border: 0;\n }\n\n #state {\n position: absolute;\n inset: 0;\n\n pointer-events: none;\n\n opacity: calc(\n var(--mdw-state__hovered-opacity) +\n var(--mdw-state__focused-opacity) +\n var(--mdw-state__pressed-opacity) +\n var(--mdw-state__dragged-opacity)\n );\n /* opacity handled by theme engine */\n background-color: currentColor;\n border-radius: inherit;\n\n transition-delay: 0ms;\n transition-duration: 000ms;\n transition-property: opacity, color, background-color;\n will-change: opacity;\n }\n\n #state[touched] {\n --mdw-state__hovered-opacity: 0;\n --mdw-state__focused-opacity: 0;\n }\n\n /* Remove Hover State */\n #state:is(\n :not([hovered]),\n [disabled]:not([state-disabled~=\"hover\"]),\n [state-off~=\"hover\"]) {\n --mdw-state__hovered-opacity: 0;\n }\n\n /* Remove Focus State */\n #state:is(\n :not([focused]),\n [disabled]:not([state-disabled~=\"focus\"]),\n [state-off~=\"focus\"]) {\n --mdw-state__focused-opacity: 0;\n }\n\n /* Remove Pressed State */\n\n #state:is(\n :not([pressed]),\n [disabled]:not([state-disabled~=\"pressed\"]),\n [state-off~=\"pressed\"]) {\n --mdw-state__pressed-opacity: 0;\n }\n\n /* Remove Dragged State */\n :host(:not([aria-dragged=\"true\"])) #state,\n #state:is(\n [disabled]:not([state-disabled~=\"dragged\"]),\n [state-off~=\"dragged\"]) {\n --mdw-state__dragged-opacity: 0;\n }\n\n /* Disabled */\n #state[disabled]:not([state-disabled]) {\n display: none;\n }\n\n `;\n}\n", "import './Icon.js';\nimport CustomElement from '../core/CustomElement.js';\nimport DensityMixin from '../mixins/DensityMixin.js';\nimport InputMixin from '../mixins/InputMixin.js';\nimport RippleMixin from '../mixins/RippleMixin.js';\nimport ShapeMixin from '../mixins/ShapeMixin.js';\nimport StateMixin from '../mixins/StateMixin.js';\nimport SurfaceMixin from '../mixins/SurfaceMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\nexport default CustomElement\n .mixin(ThemableMixin)\n .mixin(DensityMixin)\n .mixin(SurfaceMixin)\n .mixin(ShapeMixin)\n .mixin(StateMixin)\n .mixin(RippleMixin)\n .mixin(InputMixin)\n .extend()\n .define({\n stateTargetElement() { return this.refs.control; },\n })\n .set({\n stateLayer: true,\n delegatesFocus: true,\n })\n .observe({\n type: { empty: 'button' },\n elevated: 'boolean',\n filled: 'string',\n outlined: 'boolean',\n icon: 'string',\n iconInk: 'string',\n src: 'string',\n svg: 'string',\n svgPath: 'string',\n })\n .expressions({\n hasIcon({ icon, svg, src, svgPath }) {\n return icon ?? svg ?? src ?? svgPath;\n },\n })\n .html/* html */`\n <mdw-icon _if={hasIcon} id=icon ink={iconInk} disabled={disabledState} outlined={outlined} aria-hidden=true svg={svg} src={src} svg-path={svgPath}>{icon}</mdw-icon>\n <slot id=slot disabled={disabledState}></slot>\n `\n .on({\n composed() {\n const {\n shape, surfaceTint, state, rippleContainer,\n surface, control, label, slot,\n icon,\n } = this.refs;\n surface.append(shape);\n shape.append(state, rippleContainer, surfaceTint);\n label.append(icon, slot);\n\n shape.setAttribute('filled', '{filled}');\n control.setAttribute('role', 'button');\n },\n })\n .css`\n /* https://m3.material.io/components/buttons/specs */\n\n :host {\n --mdw-shape__size: var(--mdw-shape__full);\n --mdw-ink: var(--mdw-color__primary);\n\n --mdw-type__font: var(--mdw-typescale__label-large__font);\n --mdw-type__letter-spacing: var(--mdw-typescale__label-large__letter-spacing);\n\n display: inline-flex;\n\n align-items: center;\n gap: 0;\n justify-content: center;\n vertical-align: middle;\n\n /* box-sizing: border-box; */\n min-block-size: 24px;\n min-inline-size: 24px;\n\n padding-block: calc(8px + (var(--mdw-density) * 2px));\n padding-inline: calc(12px + (var(--mdw-density) * 2px));\n\n -webkit-tap-highlight-color: transparent;\n -webkit-user-select: none;\n user-select: none;\n\n color: rgb(var(--mdw-ink));\n\n font: var(--mdw-type__font);\n letter-spacing: var(--mdw-type__letter-spacing);\n }\n\n :host(:where([elevated],[filled])) {\n will-change: filter;\n }\n\n /** Elevated Color Defaults */\n :host(:where([elevated])) {\n --mdw-bg: var(--mdw-color__surface);\n --mdw-ink: var(--mdw-color__primary);\n --mdw-surface__shadow__resting: var(--mdw-surface__shadow__1);\n --mdw-surface__shadow__raised: var(--mdw-surface__shadow__2);\n --mdw-surface__tint: var(--mdw-surface__tint__1);\n --mdw-surface__tint__raised: var(--mdw-surface__tint__2);\n }\n /** Filled Color Defaults */\n :host(:where([filled])) {\n --mdw-bg: var(--mdw-color__primary);\n --mdw-ink: var(--mdw-color__on-primary);\n --mdw-surface__shadow__resting: var(--mdw-surface__shadow__0);\n --mdw-surface__shadow__raised: var(--mdw-surface__shadow__1);\n --mdw-surface__tint: 0;\n --mdw-surface__tint__raised: var(--mdw-surface__tint__1);\n }\n /** Filled Tonal Color Defaults */\n :host(:where([filled=\"tonal\"])) {\n --mdw-bg: var(--mdw-color__secondary-container);\n --mdw-ink: var(--mdw-color__on-secondary-container);\n }\n /** Outlined Color Defaults */\n :host(:where([outlined])) {\n --mdw-ink: var(--mdw-color__primary);\n }\n\n :host(:where([icon])) {\n gap: 8px;\n\n padding-inline: calc(12px + (var(--mdw-density) * 2px)) calc(16px + (var(--mdw-density) * 2px));\n }\n\n :host(:where([outlined], [elevated], [filled])) {\n padding-inline: calc(24px + (var(--mdw-density) * 2px));\n }\n\n :host(:where([icon]):where([outlined], [elevated], [filled])) {\n gap: 8px;\n\n padding-inline: calc(16px + (var(--mdw-density) * 2px)) calc(24px + (var(--mdw-density) * 2px));\n }\n\n #shape:where([elevated],[filled],[color]) {\n background-color: rgb(var(--mdw-bg));\n }\n\n #slot {\n text-align: center;\n text-decoration: none;\n white-space: nowrap;\n }\n\n #control {\n cursor: inherit;\n }\n\n :host([disabled]) {\n /* cursor: not-allowed; */\n\n color: rgba(var(--mdw-color__on-surface), 0.38);\n }\n\n #shape[disabled]:is([elevated], [filled]) {\n background-color: rgba(var(--mdw-color__on-surface), 0.12);\n color: rgba(var(--mdw-color__on-surface), 0.38);\n }\n\n #slot[disabled] {\n color: rgba(var(--mdw-color__on-surface), 0.38);\n }\n\n #icon {\n font-size: calc(18/14 * 1em);\n font-variation-settings: 'FILL' 1;\n }\n\n #icon[outlined] {\n font-variation-settings: 'FILL' 0;\n }\n\n #icon[disabled] {\n opacity: 0.38;\n\n color: rgba(var(--mdw-color__on-surface));\n }\n\n #label {\n cursor: pointer;\n }\n\n #label[disabled] {\n cursor: not-allowed;\n }\n\n @media (any-pointer: coarse) {\n #touch-target {\n visibility: visible;\n }\n }\n `\n .childEvents({\n control: {\n /**\n * Duplicates button for form submission\n * @see https://github.com/WICG/webcomponents/issues/814\n * @param {{currentTarget:HTMLInputElement}} event\n * @type {any}\n */\n '~click'({ currentTarget }) {\n if (currentTarget.disabled) return;\n if (currentTarget.type !== 'submit') return;\n if (this.disabled) return;\n const { value } = currentTarget;\n const form = this.elementInternals?.form;\n if (!form) return;\n this.elementInternals.setFormValue(value);\n if ((currentTarget.type ?? 'submit') !== 'submit') return;\n const duplicatedButton = /** @type {HTMLInputElement} */ (currentTarget.cloneNode());\n duplicatedButton.hidden = true;\n form.append(duplicatedButton);\n if ('requestSubmit' in form) {\n form.requestSubmit(duplicatedButton);\n } else {\n duplicatedButton.click();\n }\n duplicatedButton.remove();\n },\n },\n })\n .autoRegister('mdw-button');\n", "import CustomElement from '../core/CustomElement.js';\nimport { EVENT_HANDLER_TYPE } from '../core/customTypes.js';\nimport AriaReflectorMixin from '../mixins/AriaReflectorMixin.js';\nimport FlexableMixin from '../mixins/FlexableMixin.js';\nimport FormAssociatedMixin from '../mixins/FormAssociatedMixin.js';\nimport ShapeMixin from '../mixins/ShapeMixin.js';\nimport StateMixin from '../mixins/StateMixin.js';\nimport SurfaceMixin from '../mixins/SurfaceMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\nconst SUPPORTS_INERT = 'inert' in HTMLElement.prototype;\n\nexport default CustomElement\n .mixin(ThemableMixin)\n .mixin(FlexableMixin)\n .mixin(SurfaceMixin)\n .mixin(ShapeMixin)\n .mixin(FormAssociatedMixin) // Tap into FormAssociated for disabledState\n .mixin(StateMixin)\n .mixin(AriaReflectorMixin)\n .extend()\n .setStatic({\n delegatesFocus: true,\n })\n .set({\n _ariaRole: 'figure',\n })\n .observe({\n filled: 'boolean',\n actionable: 'boolean',\n actionLabel: 'string',\n onaction: EVENT_HANDLER_TYPE,\n })\n .define({\n stateTargetElement() { return this.actionable ? this.refs.action : this; },\n })\n .expressions({\n showBlocker: ({ disabledState }) => !SUPPORTS_INERT && disabledState,\n })\n .methods({\n focus() {\n if (this.disabledState) return;\n if (this.actionable) this.refs.action.focus();\n },\n })\n .html/* html */`\n <mdw-button _if={actionable} aria-label={actionLabel} id=action disabled={disabledState}></mdw-button>\n <div _if={showBlocker} id=inert-blocker></div>\n <slot id=slot disabled={disabledState}></slot>\n `\n .css`\n /* https://m3.material.io/components/cards/specs */\n\n :host {\n --mdw-shape__size: 12px;\n --mdw-surface__tint: var(--mdw-surface__tint__0);\n --mdw-surface__tint__raised: var(--mdw-surface__tint);\n\n --mdw-surface__shadow__resting: none;\n --mdw-surface__shadow__raised: var(--mdw-surface__shadow__resting);\n /* padding-inline: 12px; */\n\n --mdw-bg: var(--mdw-color__surface);\n --mdw-ink: var(--mdw-color__on-surface);\n position: relative;\n\n display: block;\n\n color: rgb(var(--mdw-ink));\n\n font: var(--mdw-type__font);\n letter-spacing: var(--mdw-type__letter-spacing);\n }\n\n #shape:where([elevated],[filled],[color]) {\n background-color: rgb(var(--mdw-bg));\n }\n\n :host(:where([filled])) {\n --mdw-bg: var(--mdw-color__surface-variant);\n --mdw-ink: var(--mdw-color__on-surface-variant);\n }\n\n :host(:where([elevated])) {\n --mdw-bg: var(--mdw-color__surface);\n --mdw-ink: var(--mdw-color__on-surface);\n }\n\n :host([filled]) {\n --mdw-surface__tint: var(--mdw-surface__tint__0);\n --mdw-surface__shadow__resting: var(--mdw-surface__shadow__0);\n }\n\n :host([filled][actionable]) {\n --mdw-surface__tint__raised: var(--mdw-surface__tint__1);\n --mdw-surface__shadow__raised: var(--mdw-surface__shadow__1);\n }\n\n :host([elevated]) {\n --mdw-surface__tint: var(--mdw-surface__tint__1);\n --mdw-surface__shadow__resting: var(--mdw-surface__shadow__1);\n }\n\n :host([elevated][actionable]) {\n --mdw-surface__tint__raised: var(--mdw-surface__tint__2);\n --mdw-surface__shadow__raised: var(--mdw-surface__shadow__2);\n }\n\n #shape[disabled] {\n\n /* Works on images */\n filter: grayscale();\n\n color: rgb(var(--mdw-color__on-surface));\n }\n\n :host([disabled]) {\n cursor: not-allowed;\n\n filter: grayscale();\n opacity: 0.38;\n }\n\n #slot[disabled] {\n color: rgb(var(--mdw-color__on-surface));\n }\n\n #outline[disabled] {\n color: rgba(var(--mdw-color__on-surface), calc(0.12/0.38));\n }\n\n /** Firefox and Safari do not support [inert] */\n\n #inert-blocker {\n position: absolute;\n inset: 0;\n\n cursor: not-allowed;\n pointer-events: auto;\n\n z-index: 99;\n }\n\n #shape[disabled][elevated] {\n background-color: rgba(var(--mdw-color__surface-variant));\n }\n\n #action {\n --mdw-ink: inherit;\n --mdw-shape__size: inherit;\n\n position: absolute;\n inset: 0;\n\n padding: 0;\n\n z-index: 0;\n\n color: inherit\n }\n `\n .on({\n composed() {\n const { slot, surface, surfaceTint, shape, outline } = this.refs;\n shape.append(surfaceTint);\n surface.append(shape);\n outline.removeAttribute('pressed');\n outline.removeAttribute('focused');\n\n shape.setAttribute('filled', '{filled}');\n slot.setAttribute('inert', '{disabledState}');\n slot.setAttribute('disabled', '{disabledState}');\n // shape.setAttribute('disabled', '{disabledState}');\n // shape.setAttribute('filled', '{filled}');\n },\n })\n .childEvents({\n action: {\n click() {\n if (this.disabledState) return;\n this.dispatchEvent(new Event('action'));\n },\n },\n slot: SUPPORTS_INERT ? {} : {\n focusin() {\n if (this.disabledState) {\n console.warn('Inert not supported. Element should be able to receive focus');\n }\n },\n },\n })\n .autoRegister('mdw-card');\n", "import './Icon.js';\nimport CustomElement from '../core/CustomElement.js';\nimport ShapeMixin from '../mixins/ShapeMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\nexport default CustomElement\n .mixin(ThemableMixin)\n .mixin(ShapeMixin)\n .observe({\n selected: 'boolean',\n icon: 'string',\n errored: 'boolean',\n disabled: 'boolean',\n })\n .define({\n /** Alias for Selected (QoL) */\n checked: {\n get() { return this.selected; },\n set(value) { this.selected = value; },\n },\n })\n .css`\n /* https://m3.material.io/components/checkbox/specs */\n\n :host {\n --mdw-ink: var(--mdw-color__on-primary);\n --mdw-bg: var(--mdw-color__primary);\n --mdw-shape__size: 2px;\n --disabled-opacity: 0.38;\n position: relative;\n\n display: inline-block;\n align-items: center;\n justify-content: center;\n\n box-sizing: border-box;\n block-size: 18px;\n inline-size: 18px;\n\n font-size: 18px;\n line-height: 18px;\n }\n\n #shape {\n --mdw-shape__size: inherit;\n position: absolute;\n inset: 0;\n\n z-index: auto;\n\n background-color: transparent;\n }\n\n #icon {\n position: absolute;\n inset: 0;\n\n opacity: 0;\n\n background-color: rgb(var(--mdw-bg));\n color: rgb(var(--mdw-ink));\n\n transition-duration: 200ms;\n transition-property: opacity, background-color, color;\n will-change: opacity;\n }\n\n #outline {\n filter:\n drop-shadow(1px 0px 0px currentColor)\n drop-shadow(0px 1px 0px currentColor)\n drop-shadow(-1px 0px 0px currentColor)\n drop-shadow(0px -1px 0px currentColor);\n\n color: rgb(var(--mdw-color__on-surface));\n\n transition-duration: 200ms;\n transition-property: opacity, background-color, color;\n will-change: opacity;\n }\n\n /* Selected */\n\n #icon[selected] {\n opacity: 1;\n }\n\n #outline[selected] {\n opacity: 0;\n }\n\n /* Errored */\n\n #icon[errored] {\n background-color: rgb(var(--mdw-color__error));\n color: rgb(var(--mdw-color__on-error));\n }\n\n #outline[errored] {\n color: rgb(var(--mdw-color__error));\n }\n\n /* Disabled */\n\n #icon[disabled] {\n background-color: rgba(var(--mdw-color__on-surface), var(--disabled-opacity));\n color: rgb(var(--mdw-color__surface), var(--disabled-opacity));\n }\n\n #outline[disabled] {\n color: rgb(var(--mdw-color__on-surface), var(--disabled-opacity));\n }\n `\n .on({\n composed({ html }) {\n const { outline, shape } = this.refs;\n outline.removeAttribute('_if');\n outline.setAttribute('selected', '{selected}');\n outline.setAttribute('errored', '{errored}');\n outline.setAttribute('disabled', '{disabled}');\n // outlineLeft.remove();\n // outlineRight.remove();\n shape.append(html`\n <mdw-icon id=icon selected={selected} errored={errored} disabled={disabled}>{icon}</mdw-icon>\n `);\n },\n })\n .extend()\n .autoRegister('mdw-checkbox-icon');\n", "/** @param {typeof import('../core/CustomElement.js').default} Base */\nexport default function TouchTargetMixin(Base) {\n return Base\n .extend()\n .html/* html */`<div id=touch-target class=touch-target></div>`\n .css`\n .touch-target {\n position: absolute;\n inset: 50%;\n /* --mdw-device-pixel-ratio: 1; */\n \n block-size: 100%;\n min-block-size: 48px;\n /* min-block-size: 10mm; */\n /* min-block-size: calc(0.393701in / var(--mdw-device-pixel-ratio, 1)); */\n inline-size:100%;\n min-inline-size: 48px;\n /* min-inline-size: 10mm; */\n /* min-inline-size: calc(0.393701in / var(--mdw-device-pixel-ratio, 1)); */\n \n cursor: inherit;\n \n /* box-sizing: border-box; */\n /* border: solid 1px magenta; */\n pointer-events: auto;\n \n transform: translateX(-50%) translateY(-50%);\n visibility: visible;\n z-index: 1;\n \n border-radius: inherit;\n }\n `;\n}\n", "import './CheckboxIcon.js';\n\nimport CustomElement from '../core/CustomElement.js';\nimport InputMixin from '../mixins/InputMixin.js';\nimport RippleMixin from '../mixins/RippleMixin.js';\nimport StateMixin from '../mixins/StateMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\nimport TouchTargetMixin from '../mixins/TouchTargetMixin.js';\n\nexport default CustomElement\n .mixin(ThemableMixin)\n .mixin(StateMixin)\n .mixin(RippleMixin)\n .mixin(InputMixin)\n .mixin(TouchTargetMixin)\n .extend()\n .set({\n stateLayer: true,\n type: 'checkbox',\n })\n .observe({\n icon: { value: 'check' },\n indeterminateIcon: { value: 'check_indeterminate_small' },\n /** Reflected property */\n indeterminate: 'boolean',\n })\n .observe({\n _ariaChecked({ indeterminate, checked }) {\n return (indeterminate ? 'mixed' : `${!!checked}`);\n },\n _determinateIcon({ indeterminate, indeterminateIcon, icon }) {\n return (indeterminate ? indeterminateIcon : icon);\n },\n })\n .css`\n /* https://m3.material.io/components/checkbox/specs */\n\n :host {\n --mdw-ink: var(--mdw-color__on-primary);\n --mdw-bg: var(--mdw-color__primary);\n\n display: inline-grid;\n align-items: baseline;\n gap: 12px;\n grid-auto-flow: column;\n justify-content: flex-start;\n\n cursor: pointer;\n\n transition: none 100ms cubic-bezier(0.4, 0.0, 1, 1);\n }\n\n :host([disabled]) {\n opacity: 0.38;\n }\n\n :host(:empty) {\n vertical-align: -11.5%;\n\n line-height: 18px;\n }\n\n :host(:empty) #checkbox {\n transform: none;\n }\n\n #control {\n grid-column: 1/1;\n\n cursor: inherit;\n }\n\n #label {\n cursor: inherit;\n }\n\n #label[disabled] {\n cursor: not-allowed;\n }\n\n #state,\n #ripple-container {\n inset-block-start: 50%;\n inset-inline-start: 50%;\n\n block-size: 40px;\n inline-size: 40px;\n\n transform: translateX(-50%) translateY(-50%);\n\n border-radius: 50%;\n }\n\n #checkbox {\n position: relative;\n\n display: inline-flex;\n\n grid-column: 1 / 1;\n\n pointer-events: none;\n\n transform: translateY(11.5%);\n\n color: rgb(var(--mdw-color__on-surface));\n }\n\n #checkbox[selected] {\n color: rgb(var(--mdw-bg));\n }\n\n #checkbox[disabled] {\n color: rgb(var(--mdw-color__on-surface));\n }\n\n #checkbox[errored] {\n color: rgb(var(--mdw-color__error));\n }\n\n #icon {\n --mdw-ink: inherit;\n --mdw-bg: inherit;\n --disabled-opacity: 1;\n }\n `\n .on({\n composed({ html }) {\n const { label, control, state, rippleContainer, touchTarget } = this.refs;\n label.append(html`\n ${touchTarget}\n ${control}\n <div id=checkbox errored={erroredState} selected={checked}>\n <mdw-checkbox-icon id=icon errored={erroredState} disabled={disabledState}\n icon={_determinateIcon} selected={checked}>\n </mdw-checkbox-icon>\n ${state}\n ${rippleContainer}\n </div>\n <slot id=slot></slot>\n `);\n\n // Indeterminate must be manually expressed for ARIA\n control.setAttribute('aria-checked', '{_ariaChecked}');\n },\n })\n .autoRegister('mdw-checkbox');\n", "import Button from './Button.js';\n\nexport default Button\n .extend()\n .observe({\n suggestion: 'boolean',\n })\n .css`\n /* https://m3.material.io/components/chips/specs */\n\n :host {\n --mdw-shape__size: 8px;\n --mdw-ink: var(--mdw-color__on-surface);\n padding-block: calc(4px + (var(--mdw-density) * 2px));\n padding-inline: calc(16px + (var(--mdw-density) * 2px));\n\n color: rgb(var(--mdw-ink));\n }\n\n :host(:where([suggestion])) {\n --mdw-ink: var(--mdw-color__on-surface-variant);\n }\n\n :host(:where([icon])) {\n gap: 8px;\n\n padding-inline: calc(8px + (var(--mdw-density) * 2px)) calc(16px + (var(--mdw-density) * 2px));\n\n }\n\n #outline {\n --mdw-ink: rgb(var(--mdw-color__on-surface-variant));\n }\n\n #outline:is([ink],[color]) {\n /* stylelint-disable-next-line rule-selector-property-disallowed-list */\n --mdw-ink: inherit;\n }\n\n #slot[disabled],\n #icon[disabled] {\n color: rgba(var(--mdw-color__on-surface), 0.38);\n }\n\n `\n .on({\n composed({ inline }) {\n const { slot, outline, icon } = this.refs;\n slot.setAttribute('disabled', '{disabledState}');\n slot.removeAttribute('ink');\n slot.removeAttribute('color');\n outline.setAttribute('_if', '{!elevated}');\n outline.setAttribute('ink', '{ink}');\n outline.setAttribute('color', '{color}');\n icon.setAttribute('ink', inline(({ ink, iconInk }) => iconInk ?? ink ?? 'primary'));\n },\n })\n .autoRegister('mdw-chip');\n", "import CustomElement from '../core/CustomElement.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\nexport default CustomElement\n .mixin(ThemableMixin)\n .extend()\n .observe({\n vertical: 'boolean',\n })\n .css`\n /* https://m3.material.io/components/dividers/specs */\n\n :host {\n --mdw-ink: var(--mdw-color__outline-variant);\n position: relative;\n\n display: block;\n overflow: visible;\n\n box-sizing: border-box;\n block-size: 0;\n inline-size: 100%;\n\n color: rgb(var(--mdw-ink));\n }\n\n :host::before {\n content: '';\n\n display: block;\n\n box-sizing: border-box;\n block-size: 1px;\n inline-size: auto;\n\n background-color: currentcolor;\n }\n\n :host([vertical]) {\n display: inline-flex;\n vertical-align: top;\n\n block-size: auto;\n min-block-size: 100%;\n inline-size: 0;\n }\n\n :host([vertical])::before {\n block-size: auto;\n min-inline-size: 1px;\n }\n\n `\n .autoRegister('mdw-divider');\n", "import CustomElement from '../core/CustomElement.js';\n\nexport default CustomElement\n .extend()\n .css`\n :host {\n align-self: flex-end;\n\n margin-block: 24px;\n padding-inline: 24px;\n }\n `\n .html/* html */`<slot id=slot></slot>`\n .register('mdw-dialog-actions');\n", "/**\n * @param {KeyboardEvent} event\n * @this {HTMLElement}\n * @return {void}\n */\nexport function handleTabKeyPress(event) {\n const focusableElements = this.querySelectorAll([\n 'button:not(:disabled):not([tabindex=\"-1\"])',\n '[href]:not(:disabled):not([tabindex=\"-1\"])',\n 'input:not(:disabled):not([tabindex=\"-1\"]):not([hidden])',\n 'select:not(:disabled):not([tabindex=\"-1\"])',\n 'textarea:not(:disabled):not([tabindex=\"-1\"])',\n '[tabindex]:not([tabindex=\"-1\"])',\n ].join(', '));\n let foundTarget = false;\n let candidate = null;\n for (const el of focusableElements) {\n if (el === event.target) {\n foundTarget = true;\n if (event.shiftKey) {\n break;\n }\n } else if (event.shiftKey) {\n candidate = el;\n } else if (foundTarget) {\n candidate = el;\n break;\n }\n }\n if (!candidate) {\n candidate = event.shiftKey ? focusableElements[focusableElements.length - 1] : focusableElements[0];\n }\n event.stopPropagation();\n event.preventDefault();\n if (candidate && candidate instanceof HTMLElement) {\n try {\n candidate.focus();\n } catch {\n // Failed to focus\n }\n }\n}\n", "import './Button.js';\nimport './Surface.js';\nimport './Divider.js';\nimport './Icon.js';\nimport './DialogActions.js';\n\nimport { handleTabKeyPress } from '../aria/modal.js';\nimport CustomElement from '../core/CustomElement.js';\n\n/** @typedef {Object<string,any>} DialogStackState */\n\n/** @typedef {InstanceType<import('./Dialog.js').default>} Dialog */\n\n/**\n * @typedef {Object} DialogStack\n * @prop {Dialog} element\n * @prop {Element} [previousFocus]\n * @prop {DialogStackState} [state]\n * @prop {DialogStackState} [previousState]\n */\n\n/** @type {DialogStack[]} */\nconst OPEN_DIALOGS = [];\n\nconst supportsHTMLDialogElement = typeof HTMLDialogElement !== 'undefined';\n\nexport default CustomElement\n .extend()\n .define({\n _dialog() {\n return /** @type {HTMLDialogElement} */ (this.refs.dialog);\n },\n returnValue() {\n return /** @type {HTMLDialogElement} */ (this.refs.dialog).returnValue;\n },\n })\n .observe({\n open: 'boolean',\n dividers: {\n /** @type {'full'|''|'inset'} */\n value: null,\n },\n headline: 'string',\n icon: 'string',\n default: { value: 'confirm' },\n cancel: { value: 'Cancel' },\n confirm: { value: 'Confirm' },\n _isNativeModal: 'boolean',\n color: { empty: 'surface' },\n ink: 'string',\n outlined: 'boolean',\n elevation: { empty: 3 },\n })\n .methods({\n /**\n * @param {TransitionEvent} event\n * @return {void}\n */\n onTransitionEnd(event) {\n if (event.propertyName !== 'opacity') return;\n if (this.getAttribute('aria-hidden') !== 'true') return;\n this.setAttribute('mdw-ready', '');\n },\n\n /**\n * @param {Event & {currentTarget: HTMLSlotElement}} event\n * @return {void}\n */\n onSlotChange({ currentTarget }) {\n const nodes = currentTarget.assignedNodes();\n const hasContent = nodes.some((node) => (node.nodeType === node.ELEMENT_NODE)\n || (node.nodeType === node.TEXT_NODE && node.nodeValue.trim().length));\n currentTarget.toggleAttribute('slotted', hasContent);\n },\n\n /**\n * @param {SubmitEvent & {currentTarget: HTMLFormElement}} event\n * @return {void}\n */\n onFormSubmit(event) {\n if (event.currentTarget.assignedSlot) {\n // Custom form.\n // @ts-ignore Skip cast\n const returnValue = event.submitter?.value;\n this.close(returnValue);\n event.preventDefault();\n }\n },\n\n /**\n * @param {Event & {currentTarget: HTMLFormElement}} event\n * @return {void}\n */\n onFormSlotChange({ currentTarget }) {\n /** @type {HTMLFormElement} */\n const [form] = currentTarget.assignedNodes();\n form?.addEventListener('submit', (e) => this.onFormSubmit(e));\n },\n\n /**\n * @param {PopStateEvent} event\n * @return {void}\n */\n onPopState(event) {\n if (!event.state) return;\n\n const lastOpenDialog = OPEN_DIALOGS.at(-1);\n if (!lastOpenDialog || !lastOpenDialog.previousState) {\n return;\n }\n if ((lastOpenDialog.previousState === event.state) || Object.entries(event.state)\n .every(([key, value]) => value === lastOpenDialog.previousState[key])) {\n const cancelEvent = new Event('cancel', { cancelable: true });\n if (lastOpenDialog.element.dispatchEvent(cancelEvent)) {\n lastOpenDialog.element.close();\n } else {\n // Revert pop state by pushing state again\n window.history.pushState(lastOpenDialog.state, lastOpenDialog.state.title);\n }\n }\n },\n\n /**\n * @param {any} returnValue\n * @return {boolean} handled\n */\n close(returnValue) {\n if (!this.open) return false;\n if (this._isNativeModal) {\n this._isNativeModal = false;\n } else {\n const main = document.querySelector('main');\n if (main) {\n main.removeAttribute('aria-hidden');\n }\n }\n // if (this.dialogElement.getAttribute('aria-hidden') === 'true') return false;\n if (supportsHTMLDialogElement && this._dialog.open) {\n // Force close native dialog\n this._dialog.close(returnValue);\n } else {\n this._dialog.returnValue = returnValue;\n }\n\n // Will invoke observed attribute change: ('aria-hidden', 'true');\n this.open = false;\n this.dispatchEvent(new Event('close'));\n // .mdw-dialog__popup hidden by transitionEnd event\n let stackIndex = -1;\n OPEN_DIALOGS.some((stack, index) => {\n // @ts-ignore Skip unknown\n if (stack.element === this) {\n stackIndex = index;\n return true;\n }\n return false;\n });\n if (stackIndex !== -1) {\n const stack = OPEN_DIALOGS[stackIndex];\n if (stack.previousFocus\n && stack.previousFocus instanceof HTMLElement\n && document.activeElement?.closest(this.constructor.elementName) === this) {\n // Only pop focus back when hiding a dialog with focus within itself.\n try {\n stack.previousFocus.focus();\n } catch {\n // Failed to focus\n }\n }\n OPEN_DIALOGS.splice(stackIndex, 1);\n if (stack.state && window.history && window.history.state // IE11 returns a cloned state object, not the original\n && stack.state.hash === window.history.state.hash) {\n window.history.back();\n }\n }\n if (!OPEN_DIALOGS.length) {\n window.removeEventListener('popstate', this.onPopState);\n }\n return true;\n },\n\n /**\n * @param {Event} [event]\n * @return {boolean} handled\n */\n showModal(event) {\n if (this.open) return false;\n if (supportsHTMLDialogElement) {\n this._dialog.showModal();\n this._isNativeModal = true;\n }\n return this.show(event);\n },\n\n /**\n * @param {MouseEvent|PointerEvent|HTMLElement|Event} [source]\n * @return {boolean} handled\n */\n show(source) {\n if (this.open) return false;\n this.open = true;\n\n if (supportsHTMLDialogElement) {\n this._dialog.show();\n const main = document.querySelector('main');\n if (main) {\n main.setAttribute('aria-hidden', 'true');\n }\n }\n\n const previousFocus = document.activeElement;\n const title = this.headline || this.textContent;\n const newState = { time: Date.now(), random: Math.random(), title };\n let previousState = null;\n\n if (!window.history.state) {\n window.history.replaceState({\n hash: Math.random().toString(36).slice(2, 18),\n }, document.title);\n }\n previousState = window.history.state;\n window.history.pushState(newState, title);\n window.addEventListener('popstate', this.onPopState);\n\n /** @type {DialogStack} */\n const dialogStack = {\n // @ts-ignore Recursive cast\n element: this,\n previousFocus,\n state: newState,\n previousState,\n };\n OPEN_DIALOGS.push(dialogStack);\n const focusElement = this.querySelector('[autofocus]')\n ?? this.shadowRoot.querySelector('[autofocus]');\n try {\n if (focusElement && focusElement instanceof HTMLElement) {\n if (focusElement.scrollIntoView) {\n focusElement.scrollIntoView();\n }\n focusElement.focus();\n } else {\n this.refs.surface.focus();\n }\n } catch {\n // Failed to focus\n }\n return true;\n },\n })\n .expressions({\n cancelAutoFocus({ default: d }) { return d === 'cancel'; },\n confirmAutoFocus({ default: d }) { return d === 'confirm'; },\n _ariaHidden({ open }) { return (open ? 'false' : 'true'); },\n })\n .html/* html */`\n <dialog id=dialog aria-modal=true role=dialog\n aria-hidden={_ariaHidden}\n aria-labelledby=headline aria-describedby=slot>\n <div _if={open} id=scrim aria-hidden=true></div>\n <mdw-surface id=surface open={open} icon={icon} elevation={elevation} color={color} ink={ink} outlined={outlined}>\n <mdw-icon _if={icon} id=icon class=content ink=secondary aria-hidden=true>{icon}</mdw-icon>\n <slot id=headline name=headline on-slotchange={onSlotChange} role=header>{headline}</slot>\n <slot id=fixed name=fixed class=content on-slotchange={onSlotChange}></slot>\n <mdw-divider id=divider-top size={dividers}></mdw-divider>\n <slot id=slot class=content on-slotchange={onSlotChange}></slot>\n <mdw-divider id=divider-bottom size={dividers}></mdw-divider>\n <slot name=form id=form-slot on-slotchange={onFormSlotChange}>\n <form id=form method=dialog role=none on-submit={onFormSubmit}>\n <mdw-dialog-actions>\n <mdw-button id=cancel type=submit value=cancel\n autofocus={cancelAutoFocus}>{cancel}</mdw-button>\n <mdw-button id=confirm type=submit value=confirm\n autofocus={confirmAutoFocus}>{confirm}</mdw-button>\n </mdw-dialog-actions>\n </form>\n </slot>\n </mdw-surface>\n </dialog>\n `\n .css`\n /* https://m3.material.io/components/dialogs/specs */\n\n :host {\n --mdw-dialog__expand-duration: var(--mdw-motion-expand-duration, 250ms);\n --mdw-dialog__simple-duration: var(--mdw-motion-simple-duration, 100ms);\n --mdw-dialog__standard-easing: var(--mdw-motion-standard-easing, cubic-bezier(0.4, 0.0, 0.2, 1));\n --mdw-dialog__deceleration-easing: var(--mdw-motion-deceleration-easing, cubic-bezier(0.0, 0.0, 0.2, 1));\n --mdw-dialog__fade-in-duration: var(--mdw-motion-fade-in-duration, 150ms);\n\n position: fixed;\n inset: 0;\n\n pointer-events: none;\n\n z-index: 24;\n }\n\n #dialog {\n position: fixed;\n inset-block-start: 0;\n inset-inline-start: 0;\n\n display: flex;\n align-items: center;\n flex-direction: row;\n justify-content: center;\n\n box-sizing: border-box;\n block-size:100%;\n max-block-size: none;\n inline-size:100%;\n max-inline-size: none;\n margin:0;\n border: none;\n padding: 48px;\n\n opacity: 0;\n /* visiblity:hidden still registers events, hide from pointer with scale(0) */\n transform: scale(0);\n visibility: hidden;\n z-index: 24;\n\n background-color: transparent;\n\n transition-delay: 0s, 200ms, 200ms;\n transition-duration: 200ms, 0s, 0s;\n transition-property: opacity, transform, visibility;\n transition-timing-function: ease-out;\n will-change: opacity;\n }\n\n @media (min-width: 1440px) {\n #dialog {\n padding: 56px;\n }\n }\n\n #dialog::backdrop {\n /** Use scrim instead */\n display: none;\n }\n\n #dialog[aria-hidden=\"false\"],\n #dialog:modal {\n pointer-events: auto;\n\n opacity: 1;\n\n transform: none;\n visibility: visible;\n\n transition-delay: 0s;\n transition-duration: 0s;\n transition-timing-function: ease-in;\n }\n\n #scrim {\n position: fixed;\n inset: 0;\n\n overflow-y: scroll;\n overscroll-behavior: none;\n overscroll-behavior: contain;\n scrollbar-width: none;\n\n block-size: 100%;\n inline-size: 100%;\n\n cursor: default;\n pointer-events: inherit;\n -webkit-tap-highlight-color: transparent;\n\n opacity: 0.38;\n z-index: 0;\n\n background-color: rgb(var(--mdw-color__scrim));\n }\n\n #scrim::-webkit-scrollbar {\n display: none;\n }\n\n #scrim::after {\n content: '';\n\n display: block;\n\n block-size: 200%;\n inline-size: 200%;\n }\n @keyframes scaleUpAnimation {\n from {\n transform: scaleY(0);\n }\n\n to {\n transform: scaleY(1);\n }\n }\n\n #surface {\n --mdw-shape__size: 28px;\n\n position: relative;\n\n display: flex;\n align-items: flex-start;\n flex-direction: column;\n -webkit-overflow-scrolling: touch;\n overscroll-behavior: none;\n overscroll-behavior: contain;\n\n box-sizing: border-box;\n max-block-size: 100%;\n min-inline-size: 280px;\n max-inline-size: 560px;\n flex-shrink: 1;\n\n padding-block-start: 8px;\n\n transform: scale(1);\n transform-origin: top center;\n z-index: 24;\n\n will-change: display, transform;\n }\n\n #surface[icon] {\n align-items: center;\n }\n\n #surface[open] {\n animation-name: scaleUpAnimation;\n animation-duration: 200ms;\n animation-direction: forwards;\n }\n\n #icon {\n padding-block-start: 16px;\n\n font-size: 24px;\n }\n\n #headline {\n display: block;\n\n padding-block-start: 16px;\n padding-inline: 24px;\n\n font: var(--mdw-typescale__headline-small__font);\n letter-spacing: var(--mdw-typescale__headline-small__letter-spacing);\n }\n\n #headline:not([slotted]):empty {\n display: none;\n }\n\n #body {\n padding-block: 16px;\n }\n\n .content {\n padding-inline: 24px;\n }\n\n #divider-top {\n padding-block-start: 16px;\n }\n\n mdw-divider:not([size]) {\n color: transparent;\n }\n\n mdw-divider[size=\"inset\"] {\n padding-inline: 24px;\n }\n\n #fixed {\n display:block;\n\n padding-block-start: 16px;\n\n color: rgb(var(--mdw-color__on-surface-variant));\n\n font: var(--mdw-typescale__body-medium__font);\n letter-spacing: var(--mdw-typescale__body-medium__letter-spacing);\n }\n\n #fixed:not([slotted]) {\n display: none;\n }\n\n #slot {\n display:block;\n\n overflow-y: auto;\n\n color: rgb(var(--mdw-color__on-surface-variant));\n\n font: var(--mdw-typescale__body-medium__font);\n letter-spacing: var(--mdw-typescale__body-medium__letter-spacing);\n }\n\n #scroller {\n display: block;\n overflow-y: auto;\n }\n\n #form {\n display: contents;\n }\n\n #form-slot::slotted(form) {\n display: contents;\n }\n `\n .childEvents({\n dialog: {\n cancel(event) {\n event.stopPropagation();\n const cancelEvent = new Event('cancel', { cancelable: true });\n if (!this.dispatchEvent(cancelEvent)) {\n event.preventDefault();\n }\n },\n close(event) {\n event.stopPropagation();\n this.close(this.returnValue);\n },\n },\n scrim: {\n '~click'() {\n const cancelEvent = new Event('cancel', { cancelable: true });\n if (!this.dispatchEvent(cancelEvent)) return;\n this.close();\n },\n },\n surface: {\n keydown(event) {\n if (event.key === 'Tab') {\n const surface = /** @type {HTMLElement} */ (event.currentTarget);\n if (!this._isNativeModal) {\n // Move via Light or Shadow DOM, depending on target\n const context = surface.contains(event.target) ? surface : this;\n handleTabKeyPress.call(context, event);\n }\n return;\n }\n if (event.key === 'Escape' || event.key === 'Esc') {\n event.preventDefault();\n event.stopPropagation();\n const cancelEvent = new Event('cancel', { cancelable: true });\n if (this.dispatchEvent(cancelEvent)) {\n this.close();\n }\n }\n },\n },\n })\n .autoRegister('mdw-dialog');\n", "import Button from './Button.js';\n\nexport default Button\n .extend()\n .css`\n /* https://m3.material.io/components/extended-fab/specs */\n\n :host {\n --mdw-bg: var(--mdw-color__primary-container);\n --mdw-ink: var(--mdw-color__on-primary-container);\n --mdw-shape__size: 16px;\n --mdw-surface__tint: var(--mdw-surface__tint__3);\n --mdw-surface__tint__raised: var(--mdw-surface__tint__4);\n --mdw-surface__shadow__resting: var(--mdw-surface__shadow__3);\n --mdw-surface__shadow__raised: var(--mdw-surface__shadow__4);\n min-inline-size: 48px;\n padding: calc(16px + (var(--mdw-density) * 2px));\n }\n\n #icon {\n font-size: 24px;\n }\n\n :host([lowered]) {\n --mdw-surface__tint: var(--mdw-surface__tint__1);\n --mdw-surface__tint__raised: var(--mdw-surface__tint__2);\n --mdw-surface__shadow__resting: var(--mdw-surface__shadow__1);\n --mdw-surface__shadow__raised: var(--mdw-surface__shadow__2);\n }\n\n `\n .observe({\n filled: { empty: 'tonal' },\n elevated: { type: 'boolean', empty: true },\n })\n .autoRegister('mdw-extended-fab');\n", "import AriaReflectorMixin from '../mixins/AriaReflectorMixin.js';\n\nimport Surface from './Surface.js';\n\nexport default Surface\n .mixin(AriaReflectorMixin)\n .extend()\n .set({\n _ariaRole: 'tooltip',\n })\n .observe({\n open: {\n type: 'boolean',\n changedCallback(oldValue, newValue) {\n this.updateAriaProperty('ariaHidden', newValue ? 'true' : 'false');\n },\n },\n touch: 'boolean',\n })\n .css`\n /* https://m2.material.io/components/tooltips */\n\n :host {\n --mdw-shape__size: var(--mdw-shape__extra-small);\n --mdw-ink: var(--mdw-color__on-surface-variant);\n --mdw-shape__bg: rgb(var(--mdw-color__surface-variant));\n display: block;\n vertical-align: middle;\n\n box-sizing: border-box;\n /* stylelint-disable-next-line declaration-property-value-disallowed-list */\n margin-inline: auto;\n padding-block: 4px;\n padding-inline: 8px;\n\n pointer-events: none;\n\n opacity: 0;\n transform: scale(0);\n z-index: 24;\n\n font: var(--mdw-typescale__label-medium__font);\n letter-spacing: var(--mdw-typescale__label-medium__letter-spacing);\n\n transition: transform 200ms, opacity 200ms;\n\n }\n\n :host([touch]) {\n padding-block: 6px;\n padding-inline: 16px;\n\n font: var(--mdw-typescale__label-large__font);\n letter-spacing: var(--mdw-typescale__label-large__letter-spacing);\n }\n\n :host([open]) {\n opacity: 1;\n transform: scale(1);\n }\n `\n .autoRegister('mdw-tooltip');\n", "/**\n * @typedef {Object} CanAnchorPopUpOptions\n * @prop {Element|DOMRect} [anchor]\n * @prop {number|'left'|'center'|'right'} [clientX]\n * @prop {number|'top'|'center'|'bottom'} [clientY]\n * @prop {number} [pageX]\n * @prop {number} [pageY]\n * @prop {Element|DOMRect} [popup]\n * @prop {number} [width]\n * @prop {number} [height]\n * @prop {number} [offsetX] Offset from anchor\n * @prop {number} [offsetY] Offset from anchor\n * @prop {number} [margin] Margin from page\n * @prop {'left'|'center'|'right'} [directionX='right']\n * @prop {'up'|'center'|'down'} [directionY='down']\n * @prop {boolean} [force=false]\n */\n\n/** @param {CanAnchorPopUpOptions} options */\nexport function canAnchorPopup(options) {\n let { pageX, pageY, directionX, directionY } = options;\n if (pageX == null || pageY == null) {\n const { clientX, clientY, anchor } = options;\n const rect = anchor instanceof Element ? anchor.getBoundingClientRect() : anchor;\n if (pageX == null) {\n switch (clientX) {\n case 'left':\n case null:\n case undefined:\n pageX = rect.left;\n directionX ??= 'right';\n break;\n case 'center':\n pageX = rect.left + rect.width / 2;\n directionX ??= 'center';\n break;\n case 'right':\n pageX = rect.right;\n directionX ??= 'left';\n break;\n default:\n pageX = rect.left + clientX;\n }\n }\n if (pageY == null) {\n switch (clientY) {\n case 'top':\n pageY = rect.top;\n directionY ??= 'up';\n break;\n case 'center':\n pageY = rect.top + rect.height / 2;\n directionY ??= 'center';\n break;\n case 'bottom':\n case null:\n case undefined:\n pageY = rect.bottom;\n directionY ??= 'down';\n break;\n default:\n pageY = rect.top + clientY;\n }\n }\n }\n let { width, height } = options;\n if (width == null || height == null) {\n const { popup } = options;\n if (popup instanceof Element) {\n width = popup.clientWidth;\n height = popup.clientHeight;\n } else {\n width = popup.width;\n height = popup.width;\n }\n }\n\n // eslint-disable-next-line default-case\n switch (directionX) {\n case 'left':\n pageX -= width;\n break;\n case 'center':\n pageX -= width / 2;\n }\n\n // eslint-disable-next-line default-case\n switch (directionY) {\n case 'up':\n pageY -= height;\n break;\n case 'center':\n pageY -= height / 2;\n }\n\n const offsetX = options.offsetX ?? 0;\n const offsetY = options.offsetY ?? 0;\n pageX += offsetX;\n pageY += offsetY;\n const margin = options.margin ?? 0;\n if (!options.force) {\n if (pageX - margin < 0) return null;\n if (pageY - margin < 0) return null;\n if (pageX + width > (document.documentElement.clientWidth - margin)) return null;\n if (pageY + height > (document.documentElement.clientHeight - margin)) return null;\n }\n\n return {\n ...options,\n offsetX,\n offsetY,\n pageX,\n pageY,\n transformOriginX: directionX === 'center' ? 'center' : (directionX === 'left' ? 'right' : 'left'),\n transformOriginY: directionY === 'center' ? 'center' : (directionY === 'up' ? 'bottom' : 'top'),\n };\n}\n", "import '../components/Tooltip.js';\nimport { canAnchorPopup } from '../utils/popup.js';\n\n/**\n * @param {ReturnType<import('./StateMixin.js').default>} Base\n */\nexport default function TooltipTriggerMixin(Base) {\n class TooltipTrigger extends Base {\n static {\n this.on({\n composed({ template, html }) {\n template.append(html`\n <mdw-tooltip role=tooltip id=tooltip>\n <slot id=tooltip-slot on-slotchange={onTooltipTriggerSlotChange} name=tooltip>{tooltip}</slot>\n </mdw-tooltip>\n `);\n },\n });\n // eslint-disable-next-line no-unused-expressions\n this.css`\n #tooltip {\n position:absolute;\n \n overflow: hidden;\n \n box-sizing: content-box;\n \n block-size: 0;\n inline-size: 0;\n margin: 0;\n padding: 0;\n \n transform: none;\n }\n \n #tooltip[open] {\n display: block;\n \n block-size: auto;\n inline-size: auto;\n \n cursor: default;\n pointer-events:auto;\n \n opacity: 0;\n transform: none;\n }\n `;\n }\n\n static TOOLTIP_MOUSE_IDLE_MS = 500;\n\n static TOOLTIP_TOUCH_IDLE_MS = 1500;\n\n /** @type {InstanceType<Tooltip>} */\n #tooltip;\n\n /** @type {any} */\n #idleDebounce;\n\n #pendingHide = false;\n\n /** @type {HTMLElement[]} */\n #watchedParents = [];\n\n #resizeObserver;\n\n #intersectObserver;\n\n onParentScroll = (event) => {\n this.updateTooltipPosition();\n };\n\n /** @param {any[]} args */\n constructor(...args) {\n super(...args);\n this.#tooltip = /** @type {InstanceType<Tooltip>} */ (this.refs.tooltip.cloneNode(true));\n this.#tooltip.removeAttribute('id');\n this.#tooltip.style.setProperty('position', 'fixed');\n this.#tooltip.setAttribute('aria-hidden', 'true');\n this.#resizeObserver = new ResizeObserver((entries) => {\n // console.log('RO', entries);\n if (!this.#tooltip.open) return;\n this.updateTooltipPosition();\n });\n const threshold = [0, 0.49, 0.5, 0.51, 1];\n this.#intersectObserver = new IntersectionObserver((entries) => {\n // console.log('IO', entries);\n if (!this.#tooltip.open) return;\n for (const entry of entries) {\n if (entry.intersectionRatio <= 0) {\n console.debug('Hide tooltip due to tooltip occlusion');\n this.hideTooltip();\n return;\n }\n if (entry.target === this.#tooltip) {\n console.debug('Reposition tooltip due to possible tooltip occlusion');\n this.updateTooltipPosition();\n return;\n }\n if (entry.target === this) {\n if (entry.intersectionRatio <= 0.5) {\n console.debug('Hiding tooltip because target is occluded');\n this.hideTooltip();\n } else {\n console.debug('Using InsectionObserver rect to update tooltip');\n this.updateTooltipPosition(entry.boundingClientRect);\n }\n return;\n }\n }\n console.debug('Updating tooltip position because offsetParent change.');\n this.updateTooltipPosition();\n }, { threshold });\n // this.#tooltip.remove();\n }\n\n /**\n * @param {Event & {currentTarget: HTMLSlotElement}} event\n * @return {void}\n */\n onTooltipTriggerSlotChange(event) {\n const tooltip = this.tooltipClone;\n tooltip.replaceChildren(\n ...event.currentTarget.assignedNodes()\n .map((child) => child.cloneNode(true)),\n );\n }\n\n /**\n * @this {TooltipTrigger} this\n * @param {FocusEvent} event\n * @return {void}\n */\n onTooltipTriggerFocus(event) {\n // console.log('getting focus', event);\n if (this.disabledState) return;\n if (this.matches(':active')) {\n // console.log('abort from active');\n return;\n }\n this.showTooltip();\n }\n\n /**\n * @this {TooltipTrigger} this\n * @param {KeyboardEvent} event\n * @return {void}\n */\n onTooltipTriggerKeydown(event) {\n if (event.ctrlKey) this.hideTooltip();\n }\n\n /**\n * @this {TooltipTrigger} this\n * @return {void}\n */\n onTooltipTriggerBlur() {\n this.hideTooltip();\n }\n\n /**\n * @param {MouseEvent|TouchEvent} event\n * @this {TooltipTrigger} this\n * @return {void}\n */\n onTooltipTriggerPointer(event) {\n if (this.disabledState) return;\n // console.log('tooltip event', event.type);\n switch (event.type) {\n case 'touchstart':\n this.scheduleShowTooltip('touch');\n break;\n case 'touchend':\n case 'touchcancel':\n this.scheduleHideTooltip('touch');\n break;\n case 'click':\n case 'mouseout':\n this.cancelShowTooltip();\n this.hideTooltip();\n break;\n case 'mousemove':\n case 'mouseover':\n this.scheduleShowTooltip('mouse');\n break;\n default:\n }\n }\n\n get tooltipClone() {\n return this.#tooltip;\n }\n\n get clonedTooltip() {\n return this.#tooltip;\n }\n\n cancelShowTooltip() {\n // console.log('cancel tooltiptimer');\n clearTimeout(this.#idleDebounce);\n }\n\n /** @param {'mouse'|'touch'|'keyboard'} type */\n scheduleHideTooltip(type) {\n clearTimeout(this.#idleDebounce);\n if (!this.#tooltip.open) {\n // console.log('abort schedule (shown)');\n return;\n }\n let timeout = 0;\n switch (type) {\n case 'mouse':\n timeout = 0;\n break;\n case 'touch':\n timeout = 1500;\n break;\n default:\n }\n // console.log('schedule tooltiptimer');\n this.#idleDebounce = setTimeout(() => {\n // console.log('hide timeout');\n this.hideTooltip();\n }, timeout);\n }\n\n /** @param {'mouse'|'touch'|'keyboard'} type */\n scheduleShowTooltip(type) {\n if (this.#tooltip.open) {\n // console.log('abort schedule (shown)');\n return;\n }\n let timeout = 0;\n switch (type) {\n case 'mouse':\n timeout = this.constructor.TOOLTIP_MOUSE_IDLE_MS;\n break;\n case 'touch':\n timeout = this.constructor.TOOLTIP_TOUCH_IDLE_MS;\n break;\n default:\n }\n // console.log('schedule tooltiptimer');\n clearTimeout(this.#idleDebounce);\n this.#idleDebounce = setTimeout(() => {\n // console.log('idle');\n this.showTooltip(type === 'touch');\n }, timeout);\n }\n\n showTooltip(touch = false) {\n if (this.#tooltip.open) return;\n this.refs.tooltip.open = true;\n this.refs.tooltip.touch = touch;\n this.#tooltip.touch = touch;\n document.body.append(this.#tooltip);\n this.updateTooltipPosition();\n this.#resizeObserver.observe(this, { box: 'border-box' });\n this.#intersectObserver.observe(this);\n this.#intersectObserver.observe(this.#tooltip);\n /** @type {HTMLElement} */\n let offsetParent = this;\n while ((offsetParent = offsetParent.offsetParent)) {\n this.#resizeObserver.observe(offsetParent, { box: 'border-box' });\n // console.log('observing', offsetParent);\n this.#watchedParents.push(offsetParent);\n this.#intersectObserver.observe(offsetParent);\n offsetParent.addEventListener('scroll', this.onParentScroll);\n }\n window.addEventListener('scroll', this.onParentScroll);\n\n // console.log('offsetparent', this.offsetParent);\n\n this.#tooltip.open = true;\n }\n\n hideTooltip() {\n this.#resizeObserver.disconnect();\n this.#intersectObserver.disconnect();\n let parent;\n while ((parent = this.#watchedParents.pop())) {\n parent.removeEventListener('scroll', this.onParentScroll);\n }\n window.removeEventListener('scroll', this.onParentScroll);\n this.#tooltip.open = false;\n this.#tooltip.remove();\n this.refs.tooltip.open = false;\n const hoverStyle = this.refs.tooltip.style;\n hoverStyle.removeProperty('width');\n hoverStyle.removeProperty('height');\n }\n\n /**\n * @param {DOMRect} [domRect]\n * @return {void}\n */\n updateTooltipPosition(domRect) {\n const offset = 8;\n // const margin = 8;\n /** @type {import('../utils/popup.js').CanAnchorPopUpOptions} */\n const anchorOptions = {\n anchor: domRect ?? this.getBoundingClientRect(),\n width: this.#tooltip.clientWidth,\n height: this.#tooltip.clientHeight,\n // margin,\n };\n\n const isPageRTL = (getComputedStyle(this).direction === 'rtl');\n const xStart = isPageRTL ? 'right' : 'left';\n const xEnd = isPageRTL ? 'left' : 'right';\n /** @type {import('../utils/popup.js').CanAnchorPopUpOptions[]} */\n const preferences = [\n { clientY: 'bottom', clientX: 'center', offsetY: offset },\n { clientY: 'bottom', clientX: xStart, offsetY: offset },\n { clientY: 'bottom', clientX: xEnd, offsetY: offset },\n { clientY: 'top', clientX: 'center', offsetY: -offset },\n { clientY: 'top', clientX: xStart, offsetY: -offset },\n { clientY: 'top', clientX: xEnd, offsetY: -offset },\n ];\n\n let anchorResult;\n for (const preference of preferences) {\n anchorResult = canAnchorPopup({\n ...anchorOptions,\n ...preference,\n });\n if (anchorResult) break;\n }\n\n // console.log({ anchorResult });\n if (!anchorResult) {\n anchorResult = canAnchorPopup({\n ...anchorOptions,\n ...preferences[0],\n force: true,\n });\n }\n\n this.#tooltip.style.setProperty('top', `${anchorResult.pageY}px`);\n this.#tooltip.style.setProperty('left', `${anchorResult.pageX}px`);\n this.#tooltip.style.setProperty('margin', '0');\n this.#tooltip.style.setProperty('transform-origin', `${anchorResult.transformOriginY} ${anchorResult.transformOriginX}`);\n\n const hoverStyle = this.refs.tooltip.style;\n hoverStyle.setProperty('width', `${anchorResult.width + (anchorResult.offsetX * 2)}px`);\n hoverStyle.setProperty('height', `${anchorResult.height + (anchorResult.offsetY)}px`);\n if (anchorResult.clientY === 'bottom') {\n hoverStyle.setProperty('top', '100%');\n hoverStyle.removeProperty('bottom');\n } else {\n hoverStyle.removeProperty('top');\n hoverStyle.setProperty('height', `${anchorResult.height + (anchorResult.offsetY)}px`);\n hoverStyle.setProperty('bottom', '100%');\n }\n switch (anchorResult.clientX) {\n case 'left':\n hoverStyle.setProperty('left', '0');\n hoverStyle.removeProperty('right');\n break;\n default:\n case 'center':\n hoverStyle.removeProperty('left');\n hoverStyle.removeProperty('right');\n break;\n case 'right':\n hoverStyle.removeProperty('left');\n hoverStyle.setProperty('right', '0');\n }\n }\n\n connectedCallback() {\n super.connectedCallback();\n for (const type of ['click', 'mousedown', 'mousemove', 'mouseout',\n 'touchmove', 'touchstart', 'touchend', 'touchleave', 'touchcancel']) {\n this.addEventListener(type, this.onTooltipTriggerPointer, { passive: true });\n }\n this.addEventListener('focus', this.onTooltipTriggerFocus);\n this.addEventListener('blur', this.onTooltipTriggerBlur);\n this.addEventListener('keydown', this.onTooltipTriggerKeydown, { passive: true });\n }\n\n disconnectedCallback() {\n // console.log('disconnected');\n this.hideTooltip();\n super.disconnectedCallback();\n }\n }\n TooltipTrigger.prototype.tooltip = TooltipTrigger.prop('tooltip');\n return TooltipTrigger;\n}\n", "import TooltipTriggerMixin from '../mixins/TooltipTriggerMixin.js';\n\nimport ExtendedFab from './ExtendedFab.js';\n\nexport default ExtendedFab\n .mixin(TooltipTriggerMixin)\n .extend()\n .observe({\n fabSize: {\n /** @type {null|'small'|'large'} */\n value: null,\n },\n })\n .css`\n /* https://m3.material.io/components/floating-action-button/specs */\n\n :host {\n min-inline-size: 24px;\n }\n\n #icon {\n font-size: 24px;\n }\n\n #icon[fab-size=\"large\"] {\n font-size: 36px;\n }\n\n :host([fab-size=\"small\"]) {\n --mdw-shape__size: 12px;\n padding: calc(8px + (var(--mdw-density) * 2px));\n }\n\n :host([fab-size=\"large\"]) {\n --mdw-shape__size: 28px;\n padding: calc(30px + (var(--mdw-density) * 2px));\n }\n\n `\n .on({\n composed() {\n const { slot, tooltipSlot, control, shape, icon } = this.refs;\n slot.remove();\n tooltipSlot.removeAttribute('name');\n control.setAttribute('aria-labelledby', 'tooltip');\n shape.setAttribute('fab-size', '{fabSize}');\n icon.setAttribute('fab-size', '{fabSize}');\n },\n })\n .autoRegister('mdw-fab');\n", "import './Icon.js';\n\nimport Chip from './Chip.js';\n\nexport default Chip\n .extend()\n .observe({\n type: { empty: 'checkbox' },\n dropdown: 'boolean',\n trailingSrc: 'string',\n trailingIcon: 'string',\n })\n .expressions({\n computedTrailingIcon: ({ trailingIcon, dropdown, trailingSrc }) => {\n if (trailingIcon) return trailingIcon;\n if (dropdown) return 'arrow_drop_down';\n if (trailingSrc) return '';\n return null;\n },\n })\n .html/* html */`\n <mdw-icon _if={!icon} id=check-icon disabled={disabledState} selected={checked} aria-hidden=true>check</mdw-icon>\n <mdw-icon _if={computedTrailingIcon} id=trailing-icon aria-hidden=true src={trailingSrc}>{computedTrailingIcon}</mdw-icon>\n `\n .on({\n composed() {\n const { shape, icon, control, outline, slot, trailingIcon, checkIcon } = this.refs;\n\n shape.setAttribute('selected', '{checked}');\n shape.setAttribute('icon', '');\n shape.setAttribute('trailing-icon', '{computedTrailingIcon}');\n icon.setAttribute('_if', '{icon}');\n icon.setAttribute('ink', '{iconInk}');\n\n control.removeAttribute('role');\n\n outline.removeAttribute('ink');\n outline.removeAttribute('color');\n outline.setAttribute('selected', '{checked}');\n\n slot.removeAttribute('ink');\n slot.removeAttribute('color');\n\n slot.before(checkIcon);\n slot.after(trailingIcon);\n },\n })\n .css`\n /* https://m3.material.io/components/chips/specs */\n\n /* Filter Chips can be elevated */\n\n :host {\n --mdw-ink: var(--mdw-color__on-secondary-container);\n --mdw-bg: var(--mdw-color__secondary-container);\n gap: 8px;\n\n padding-inline-start: max(4px, calc(8px + (var(--mdw-density) * 2px)));\n padding-inline-end: max(12px, calc(16px + (var(--mdw-density) * 2px)));\n\n color: rgb(var(--mdw-color__on-surface-variant));\n\n }\n\n :host(:focus) {\n --mdw-outline__rgb: var(--mdw-color__outline);\n }\n\n #icon[selected] {\n font-variation-settings: 'FILL' 1;\n }\n\n #shape {\n background-color: transparent;\n }\n\n :host(:where([trailing-icon],[dropdown],[trailing-src])) {\n padding-inline-start: max(4px, calc(8px + (var(--mdw-density) * 2px)));\n }\n\n #shape[elevated] {\n background-color: rgb(var(--mdw-color__surface));\n }\n\n #shape[selected] {\n background-color: rgb(var(--mdw-bg));\n }\n\n :host([selected]) {\n color: rgb(var(--mdw-ink));\n }\n\n #outline[selected] {\n opacity: 0;\n }\n\n #trailing-icon {\n position: relative;\n\n font-size: 18px;\n }\n\n .mdw-chip__checkbox {\n position: absolute;\n\n max-block-size: 0;\n max-inline-size: 0;\n\n appearance: none;\n pointer-events: none;\n }\n\n #check-icon {\n font-size: 0;\n }\n\n #check-icon[selected] {\n font-size: 18px;\n }\n\n #check-icon[disabled] {\n color: rgba(var(--mdw-color__on-surface), 0.38);\n }\n\n #shape[disabled]:is([elevated],[selected]) {\n background-color: rgba(var(--mdw-color__on-surface), 0.12);\n /* color: rgba(var(--mdw-color__on-surface), 0.38); */\n }\n\n `\n .autoRegister('mdw-filter-chip');\n", "import ThemableMixin from '../mixins/ThemableMixin.js';\n\nimport Box from './Box.js';\n\nexport default Box\n .mixin(ThemableMixin)\n .extend()\n .observe({\n ariaLevel: 'string',\n size: {\n type: 'string',\n /** @type {'large'|'medium'|'small'} */\n empty: 'large',\n },\n })\n .expressions({\n computeAriaLevel({ ariaLevel, size }) {\n if (ariaLevel) return ariaLevel;\n if (size === 'medium') return '2';\n if (size === 'small') return '3';\n return '1';\n },\n })\n .on({\n composed() {\n const { slot } = this.refs;\n slot.setAttribute('role', 'heading');\n slot.setAttribute('aria-level', '{computeAriaLevel}');\n },\n })\n .css`\n :host {\n font: var(--mdw-typescale__headline-large__font);\n letter-spacing: var(--mdw-typescale__headline-large__letter-spacing);\n }\n \n :host([size=\"medium\"]) {\n font: var(--mdw-typescale__headline-medium__font);\n letter-spacing: var(--mdw-typescale__headline-medium__letter-spacing);\n }\n \n :host([size=\"small\"]) {\n font: var(--mdw-typescale__headline-small__font);\n letter-spacing: var(--mdw-typescale__headline-small__letter-spacing);\n } \n `\n .autoRegister('mdw-headline');\n", "import TooltipTriggerMixin from '../mixins/TooltipTriggerMixin.js';\n\nimport Button from './Button.js';\n\nexport default Button\n .mixin(TooltipTriggerMixin)\n .extend()\n .observe({\n _ariaPressed: {\n get({ type, checked }) {\n if (type !== 'checkbox') return null;\n return checked ? 'true' : 'false';\n },\n },\n })\n .expressions({\n isToggle({ type }) {\n return type === 'checkbox';\n },\n })\n .childEvents({\n control: {\n keydown(event) {\n if (event.key !== 'Enter') return;\n const input = /** @type {HTMLInputElement} */ (event.currentTarget);\n if (input.type !== 'checkbox') return;\n event.stopImmediatePropagation();\n event.stopPropagation();\n event.preventDefault();\n if (input.disabled) return;\n\n // Simulate click\n const clickEvent = new Event('click', { bubbles: true, cancelable: true, composed: true });\n if (!input.dispatchEvent(clickEvent)) return;\n\n // Toggle check and signal\n input.checked = !input.checked;\n input.dispatchEvent(new Event('change', { bubbles: true }));\n },\n },\n })\n .on({\n composed() {\n const { slot, shape, tooltipSlot, icon, label, surfaceTint, control, outline } = this.refs;\n shape.classList.add('colored');\n label.classList.add('colored');\n for (const el of [shape, label, icon]) {\n el.setAttribute('toggle', '{isToggle}');\n el.setAttribute('selected', '{checked}');\n }\n slot.remove();\n icon.removeAttribute('_if');\n tooltipSlot.removeAttribute('name');\n\n surfaceTint.remove();\n\n control.setAttribute('aria-pressed', '{_ariaPressed}');\n control.setAttribute('aria-labelledby', 'tooltip');\n\n outline.setAttribute('selected', '{checked}');\n },\n })\n .css`\n /* https://m3.material.io/components/icon-buttons/specs */\n\n :host {\n --mdw-shape__size: var(--mdw-shape__full);\n --mdw-ink: rgb(var(--mdw-color__on-surface-variant));\n\n align-items: center;\n justify-content: center;\n\n padding: max(8px, calc(8px + (var(--mdw-density) * 2px)));\n\n background-color: transparent;\n\n font-size: 24px;\n }\n\n :host(:where([type=\"checkbox\"])) {\n --mdw-ink: var(--mdw-color__primary);\n }\n\n /** Filled | Filled Checked */\n :host(:where([filled])) {\n --mdw-ink: var(--mdw-color__on-primary);\n --mdw-bg: var(--mdw-color__primary);\n --mdw-surface__shadow__resting: none;\n --mdw-surface__shadow__raised: none;\n }\n\n /** Tonal | Tonal Checked */\n :host(:where([filled=\"tonal\"])) {\n --mdw-ink: var(--mdw-color__on-secondary-container);\n --mdw-bg: var(--mdw-color__secondary-container);\n }\n\n /** Outlined | Outlined Unchecked */\n :host(:where([outlined])) {\n --mdw-ink: var(--mdw-color__on-surface-variant);\n }\n\n /** Outlined | Outlined Unchecked */\n :host(:where([outlined][type=\"checkbox\"])) {\n --mdw-bg: var(--mdw-color__inverse-surface);\n --mdw-ink: var(--mdw-color__inverse-on-surface);\n }\n\n #label {\n font-size: inherit;\n letter-spacing: inherit;\n }\n\n #shape[toggle] {\n background-color: transparent;\n }\n\n .colored[toggle] {\n color: rgb(var(--mdw-color__on-surface-variant));\n }\n\n .colored[selected] {\n /* background-color: rgb(var(--mdw-bg)); */\n color: rgb(var(--mdw-ink));\n }\n\n #shape[filled][toggle] {\n background-color: rgb(var(--mdw-color__surface-variant));\n }\n\n .colored[filled][toggle] {\n color: rgb(var(--mdw-bg));\n }\n\n #shape[filled=\"tonal\"][toggle] {\n background-color: rgb(var(--mdw-color__surface-variant));\n }\n\n .colored[filled=\"tonal\"][toggle] {\n color: rgb(var(--mdw-color__on-surface-variant));\n }\n\n #shape[filled][selected] {\n background-color: rgb(var(--mdw-bg));\n }\n\n .colored[filled][selected] {\n color: rgb(var(--mdw-ink));\n }\n\n #shape[outlined] {\n background-color: transparent;\n }\n\n .colored[outlined] {\n color: inherit;\n }\n\n #shape[outlined][toggle] {\n background-color: transparent;\n }\n\n .colored[outlined][toggle] {\n color: rgb(var(--mdw-color__on-surface-variant));\n }\n\n #shape[outlined][selected] {\n background-color: rgb(var(--mdw-bg));\n }\n\n .colored[outlined][selected] {\n color: rgb(var(--mdw-ink));\n }\n\n #icon {\n font-size: inherit;\n font-variation-settings: 'FILL' 1;\n }\n\n #icon[toggle] {\n font-variation-settings: 'FILL' 0;\n }\n\n #icon[selected] {\n font-variation-settings: 'FILL' 1;\n }\n\n #outline[focused] {\n opacity: 1;\n\n color: inherit;\n }\n\n #outline[selected] {\n opacity: 0;\n }\n\n /** Disabled */\n .colored[disabled] {\n cursor: not-allowed;\n\n color: rgba(var(--mdw-color__on-surface), 0.38);\n }\n\n #shape[disabled][filled],\n #shape[disabled][outlined][selected] {\n background-color: rgba(var(--mdw-color__on-surface), 0.12);\n }\n\n .colored[disabled][filled],\n .colored[disabled][outlined][selected] {\n color: rgba(var(--mdw-color__on-surface), 0.38);\n }\n\n `\n .autoRegister('mdw-icon-button');\n", "import '../components/Icon.js';\nimport DensityMixin from './DensityMixin.js';\nimport ShapeMixin from './ShapeMixin.js';\n\n/** @typedef {import('../core/CustomElement.js').default} CustomElement */\n\n/**\n * @param {ReturnType<import('./ControlMixin.js').default>} Base\n */\nexport default function TextFieldMixin(Base) {\n return Base\n .mixin(DensityMixin)\n .mixin(ShapeMixin)\n .extend()\n .set({\n stateLayer: true,\n })\n .observe({\n type: { empty: 'text' },\n icon: 'string',\n label: 'string',\n filled: 'boolean',\n outlined: 'boolean',\n inputPrefix: 'string',\n inputSuffix: 'string',\n trailingIcon: 'string',\n trailingIconInk: 'string',\n supporting: 'string',\n error: 'string',\n placeholder: { nullParser: String }, // DOMString\n })\n .observe({\n erroredState({ error, _invalid }) { return Boolean(error || _invalid); },\n })\n .expressions({\n computePlaceholder({ filled, outlined, label, placeholder }) {\n if (filled || outlined) return placeholder;\n return placeholder ?? label;\n },\n\n shouldShowSupporting({ _invalid, error, supporting }) {\n return _invalid || ((error ?? supporting) != null);\n },\n\n computeSupportingText({ error, _validationMessage, supporting }) {\n return (error || _validationMessage || supporting) ?? '';\n },\n\n populatedState({ value, _badInput }) {\n return !!value || _badInput;\n },\n _showLabelText({ label, filled, outlined }) {\n return label && (filled || outlined);\n },\n })\n .on({\n composed({ template, html, inline }) {\n const { control, label: labelElement, outline, shape, outlineLeft, outlineRight, state } = this.refs;\n control.setAttribute('placeholder', '{computePlaceholder}');\n control.setAttribute('aria-label', '{label}');\n control.setAttribute('input-suffix', '{inputSuffix}');\n control.setAttribute('errored', '{erroredState}');\n control.removeAttribute('aria-labelledby');\n control.classList.add('inline');\n\n labelElement.classList.add('shape');\n labelElement.setAttribute('filled', '{filled}');\n labelElement.setAttribute('color', '{color}');\n labelElement.setAttribute('icon', '{icon}');\n labelElement.setAttribute('shape-style', '{shapeStyle}');\n labelElement.setAttribute('trailingIcon', '{trailingIcon}');\n labelElement.setAttribute('populated', '{populatedState}');\n labelElement.setAttribute('outlined', '{outlined}');\n labelElement.setAttribute('focused', '{focusedState}');\n labelElement.setAttribute('label', '{label}');\n labelElement.setAttribute('shape-top', inline(({ shapeTop, filled }) => shapeTop || filled));\n labelElement.append(\n state,\n outline,\n html`\n <mdw-icon _if={icon} id=icon aria-hidden=true disabled={disabledState}>{icon}</mdw-icon>\n <span _if={inputPrefix} class=inline id=prefix aria-hidden=true focused={focusedState} populated={populatedState}>{inputPrefix}</span>\n <span _if={inputSuffix} class=inline id=suffix aria-hidden=true focused={focusedState} populated={populatedState}>{inputSuffix}</span>\n <mdw-icon _if={trailingIcon} id=trailing-icon ink={trailingIconInk} aria-hidden=true disabled={disabledState}>{trailingIcon}</mdw-icon>\n <div id=indicator _if={filled} focused={focusedState} hovered={hoveredState} errored={erroredState} disabled={disabledState} ></div>\n `,\n );\n\n outline.setAttribute('label', '{label}');\n outline.setAttribute('invalid', '{invalid}');\n outline.setAttribute('errored', '{erroredState}');\n outlineLeft.after(html`\n <div id=gap _if={label} label={label} populated={populatedState} focused={focusedState}>\n <div id=gap-slot focused={focusedState}></div>\n <span id=gap-label>{label}</span>\n </div>\n `);\n\n outlineLeft.setAttribute('focused', '{focusedState}');\n outlineRight.setAttribute('focused', '{focusedState}');\n\n shape.remove();\n state.setAttribute('_if', '{!outlined}');\n\n template.append(html`\n <div id=label-text _if={_showLabelText} aria-hidden=true\n outlined={outlined}\n populated={populatedState}\n focused={focusedState}\n icon={icon}\n trailing-icon={trailingIcon}\n disabled={disabledState}\n errored={erroredState}>{label}</div>\n <div _if={shouldShowSupporting} id=supporting disabled={disabledState} errored={erroredState}>\n {computeSupportingText}\n <slot id=supporting-slot name=supporting></slot>\n </div>\n `);\n },\n sizeChanged(oldValue, newValue) {\n this.refs.control.style.setProperty('--size', `${newValue}ch`);\n },\n })\n .css`\n /* https://m3.material.io/components/text-fields/specs */\n\n /**\n * States: Enabled / Hover / Focus / Error / Error Hover / Error Focus\n * Input: on-surface / on-surface / on-surface / on-surface / on-surface / on-surface\n * Inline: on-surface-variant / on-surface-variant / on-surface-variant / on-surface-variant / on-surface-variant / on-surface-variant\n * Label: on-surface-variant / on-surface* / ink / error / on-error-container / error\n * Indicator: on-surface-variant / on-surface / ink / error / on-error-container / error\n * Caret: (any) / (any) / ink / (any) / (any) / error\n * Outline: outline / on-surface / ink / error / on-error-container / error\n * Selection: on-* / on-* / ink / error / on-error-container / error\n *\n *\n * *Filled hovered unpopulated label may be on-surface-variant instead\n *\n * Input: Always on-surface\n * Inline: Always on-surface-variant\n * Indicator: same as label\n * Label: same as indicator\n * Outline: outline default, same as label+indicator on :hover or :focus\n * Caret: same as label+indicator+outline (cannot inherit color or use currentColor)\n * Selection: (cannot inherit color or use currentColor)\n */\n\n :host {\n --mdw-shape__size: var(--mdw-shape__extra-small);\n /* --mdw-shape__size: 8px; */\n /* --mdw-shape__size__bottom-start-size: var(--mdw-shape__size); */\n /* --mdw-shape__size__bottom-end-size: var(--mdw-shape__size); */\n --mdw-text-field__ratio: calc(var(--mdw-density) * 0.125 + 1);\n\n --control__margin-top: calc(var(--mdw-typescale__body-small__line-height) / 2);\n --control__padding-top: calc((var(--mdw-text-field__ratio) * 16px) - calc(var(--mdw-typescale__body-small__line-height) / 2));\n --control__padding-bottom: calc(var(--mdw-text-field__ratio) * 16px);\n --control__margin-bottom: 0px;\n\n --inline-color: rgb(var(--mdw-color__on-surface-variant));\n\n --descriptor-opacity: 0.5;\n --mdw-ink: var(--mdw-color__primary);\n --mdw-bg: var(--mdw-color__surface-variant);\n\n --mdw-type__font: var(--mdw-typescale__body-large__font);\n --mdw-type__letter-spacing: var(--mdw-typescale__body-large__letter-spacing);\n\n display: inline-block;\n\n /* State layer */\n color: rgb(var(--mdw-color__on-surface));\n\n font: var(--mdw-type__font);\n letter-spacing: var(--mdw-type__letter-spacing);\n }\n\n :host([icon]) {\n --padding-inline-start: 12px;\n }\n\n :host([trailing-icon]) {\n --padding-inline-end: 12px;\n }\n\n :host(:is([color], [ink])) {\n background-color: transparent;\n color: rgb(var(--mdw-color__on-surface));\n }\n\n /** Guard against bleed */\n :host([label][outlined]) {\n --mdw-shape__size__top-start-size: min(var(--mdw-shape__size), 12px);\n --mdw-shape__size__bottom-start-size: min(var(--mdw-shape__size), 12px);\n --mdw-shape__size__top-end-size: min(var(--mdw-shape__size), 12px);\n --mdw-shape__size__bottom-end-size: min(var(--mdw-shape__size), 12px);\n }\n\n #label[label][outlined] {\n -webkit-mask-box-image-width: min(var(--mdw-shape__size), 12px);\n }\n\n #label {\n position: relative;\n\n display: flex;\n\n align-items: center;\n overflow: visible;\n\n padding-inline-start: 16px;\n padding-inline-end: 16px;\n\n cursor: inherit;\n\n z-index: 0;\n\n background-color: transparent;\n\n font-weight: inherit;\n font-size: inherit;\n line-height: inherit;\n font-family: inherit;\n letter-spacing: inherit;\n\n transition: none 200ms cubic-bezier(0.0, 0.0, 0.2, 1);\n }\n\n #label:is([filled],[color]) {\n background-color: rgb(var(--mdw-bg));\n color: rgb(var(--mdw-color__on-surface));\n }\n\n #label[outlined] {\n background-color: transparent;\n }\n\n #label-text,\n #indicator {\n color: rgb(var(--mdw-color__on-surface-variant))\n }\n\n :is(#label-text, #indicator)[focused] {\n color: rgb(var(--mdw-ink))\n }\n\n #label[icon] {\n padding-inline-start: 12px;\n }\n\n #label[trailing-icon] {\n padding-inline-end: 12px;\n }\n\n #label[focused] {\n transition: none 100ms cubic-bezier(0.4, 0.0, 1, 1);\n }\n\n #label[shape-top] {\n --mdw-shape__size__bottom-start-size: 0px;\n --mdw-shape__size__bottom-end-size: 0px;\n --mdw-shape__mask: linear-gradient(transparent 50%, black 50%);\n }\n\n #prefix,\n #suffix,\n #control::placeholder {\n opacity: var(--descriptor-opacity);\n\n color: var(--inline-color);\n\n transition-duration: inherit;\n transition-property: opacity;\n transition-timing-function: inherit;\n will-change: opacity;\n }\n\n :host([label]:is([filled],[outlined])) {\n --descriptor-opacity: 0;\n }\n\n #control {\n position: relative;\n inset: auto;\n align-self: flex-start;\n\n display: inline;\n\n box-sizing: border-box;\n\n block-size: auto;\n min-block-size: none;\n inline-size: 100%;\n min-inline-size: none;\n flex: 1;\n border-block-start: solid var(--control__margin-top) transparent;\n border-block-end: solid var(--control__margin-bottom) transparent;\n padding-block: var(--control__padding-top) var(--control__padding-bottom);\n\n appearance: none;\n caret-color: rgb(var(--mdw-ink));\n cursor: auto;\n\n transform: none;\n\n visibility: visible;\n\n background-color: transparent;\n border-color: transparent;\n color: inherit;\n /* rgb(var(--mdw-color__on-surface)); */\n\n font-weight: inherit;\n font-size: inherit;\n line-height: inherit;\n font-family: inherit;\n letter-spacing: inherit;\n\n transition-duration: inherit;\n transition-property: color;\n transition-timing-function: inherit;\n }\n\n #suffix,\n #prefix {\n /* Symmetrical to allow centering */\n margin-block: var(--control__margin-top) var(--control__margin-bottom);\n padding-block: var(--control__padding-top) var(--control__padding-bottom);\n }\n\n /* stylelint-disable-next-line plugin/no-unsupported-browser-features */\n #control::selection {\n background-color: rgb(var(--mdw-ink));\n color: rgb(var(--mdw-color__surface));\n }\n\n #state {\n --mdw-state__focused-opacity: 0;\n --mdw-state__pressed-opacity: 0;\n }\n\n mdw-icon {\n --mdw-icon__size: 24px;\n align-self: center;\n\n color: var(--inline-color);\n }\n\n #icon {\n order: -2;\n\n margin-inline-end: 16px;\n\n font-size: 24px;\n }\n\n #prefix {\n order: -1;\n }\n\n #suffix {\n order: 1;\n }\n\n #trailing-icon {\n order: 2;\n\n margin-inline-start: 16px;\n }\n\n #indicator {\n position: absolute;\n inset-block-end: 0;\n inset-inline: 0;\n\n border-block-end: 2px solid currentColor;\n\n pointer-events: none;\n\n transform: scaleY(0.5);\n z-index: 1; /* Force new layer to avoid repaint */\n\n transition-duration: inherit;\n transition-property: transform;\n transition-timing-function: inherit;\n will-change: transform;\n }\n\n #indicator[focused] {\n transform: scaleY(1);\n\n }\n\n /** Label Text **/\n\n #label-text {\n position: absolute;\n inset-block-start: 0;\n inset-inline: 0;\n\n display: block;\n overflow-x: clip;\n overflow-y: visible;\n\n padding-inline: 16px;\n\n pointer-events: none;\n\n opacity: 1;\n transform: translateY(calc((var(--control__margin-top) + var(--control__padding-top) + 100% + var(--control__padding-bottom) + var(--control__margin-bottom)) / 2)) translateY(-50%);\n z-index: 4;\n /* FireFox bug */\n\n color: rgb(var(--mdw-color__on-surface-variant));\n\n text-overflow: ellipsis;\n white-space: nowrap;\n\n transition-duration: 200ms;\n transition-property: inset-inline-start, font-size, transform;\n /* transition-timing-function: inherit; */\n /*Expand*/\n\n will-change: inset-inline-start, font-size, transform;\n }\n\n @supports (-moz-appearance:none ) {\n #label-text {\n /* Firefox clips Y as well as X */\n overflow-x: hidden;\n }\n }\n\n #label-text[focused] {\n color: rgb(var(--mdw-ink));\n }\n\n #label-text[icon] {\n inset-inline-start: calc(12px + 24px);\n }\n\n #label-text[trailing-icon] {\n inset-inline-end: calc(24px + 12px);\n }\n\n #label-text:is([focused], [populated]) {\n transform: translateY(calc(var(--mdw-text-field__ratio) * 8px));\n\n font: var(--mdw-typescale__body-small__font);\n /* Not spec: Should only use font-size and line-height */\n letter-spacing: var(--mdw-typescale__body-small__letter-spacing);\n }\n\n #label-text[outlined]:is([focused], [populated]) {\n inset-inline: 0;\n\n transform: translateY(-50%);\n }\n\n :is(#prefix, #suffix):is([focused], [populated]) {\n opacity: 1;\n }\n\n /* If no label */\n #control:is(:focus, :not(:placeholder-shown))::placeholder {\n opacity: 0.70;\n }\n\n #control[input-suffix] {\n text-align: end;\n }\n\n /** Outlined **/\n\n #outline::before {\n content: none;\n }\n\n .outline-section {\n position: relative;\n\n border: 1px solid currentColor;\n }\n\n .outline-section[focused] {\n border-width: 2px;\n }\n\n #outline-left {\n /* stylelint-disable-next-line liberty/use-logical-spec */\n border-right-width: 0;\n /* stylelint-disable-next-line liberty/use-logical-spec */\n border-top-left-radius: inherit;\n /* stylelint-disable-next-line liberty/use-logical-spec */\n border-bottom-left-radius: inherit;\n }\n\n #outline-right {\n /* stylelint-disable-next-line liberty/use-logical-spec */\n border-left-width: 0;\n /* stylelint-disable-next-line liberty/use-logical-spec */\n border-top-right-radius: inherit;\n /* stylelint-disable-next-line liberty/use-logical-spec */\n border-bottom-right-radius: inherit;\n }\n\n #outline {\n display: grid;\n grid-auto-flow: column;\n grid-template-columns: 1fr 0 1fr;\n\n color: rgb(var(--mdw-color__outline));\n }\n\n #outline[label] {\n grid-template-columns: 12px minmax(0,auto) minmax(12px, 1fr);\n }\n\n #outline[hovered] {\n color: rgb(var(--mdw-color__on-surface));\n }\n\n #outline[focused] {\n color: rgb(var(--mdw-ink));\n }\n\n .outline-section {\n min-inline-size: 12px;\n }\n\n .outline-section::before,\n .outline-section::after {\n max-inline-size: none;\n }\n\n .outline-left {\n grid-column: calc(2 - var(--mdw-dir, 1)) / span 1; /* 1 on LTR, 3 on RTL */\n }\n\n .outline-right {\n grid-column: calc(2 + var(--mdw-dir, 1)) / span 1;\n }\n\n #gap {\n position: relative;\n\n display: inline-block;\n overflow: clip hidden;\n\n max-inline-size: 100%;\n grid-column: 2;\n\n font: var(--mdw-typescale__body-small__font);\n /* Not spec: Should only use font-size and line-height */\n letter-spacing: var(--mdw-typescale__body-small__letter-spacing);\n\n /* Close gap */\n transition-duration: inherit;\n transition-property: padding;\n transition-timing-function: inherit;\n }\n\n #gap-label {\n display: inline-block;\n overflow: clip hidden;\n\n padding-inline: 4px;\n\n color:transparent;\n\n white-space: nowrap;\n }\n\n #gap::after {\n content: '';\n\n position: absolute;\n inset: 0;\n\n border-block-end: solid 1px currentColor;\n }\n\n #gap[focused]::after {\n border-block-end-width: 2px;\n }\n\n #gap-slot {\n position: absolute;\n inset: 0;\n\n }\n\n #gap-slot::before,\n #gap-slot::after {\n content: '';\n\n position: absolute;\n inset: 0;\n\n border-block-start: solid 1px currentColor;\n\n transition: transform 200ms;\n will-change: transform;\n }\n\n #gap-slot[focused]::before,\n #gap-slot[focused]::after {\n border-block-start-width: 2px;\n }\n\n @supports(-webkit-mask-box-image: none) {\n #outline[focused] {\n /** Fake 2px outline */\n filter:\n drop-shadow(1px 0px 0px currentColor)\n drop-shadow(0px 1px 0px currentColor)\n drop-shadow(-1px 0px 0px currentColor)\n drop-shadow(0px -1px 0px currentColor);\n }\n\n #outline::before {\n content: '';\n\n position: absolute;\n inset: 0;\n\n grid-column: calc(2 - var(--mdw-dir, 1)) / span 1;\n /* stylelint-disable-next-line liberty/use-logical-spec */\n margin-right: -0.99px;\n border: none;\n\n background-color: currentColor;\n -webkit-mask-box-image: var(--mdw-shape__mask-image__edges)\n 8 fill /\n auto\n stretch;\n -webkit-mask-box-image-width: auto 0 auto auto;\n }\n\n #outline::after {\n grid-column: calc(2 + var(--mdw-dir, 1)) / span 1;\n grid-row: 1;\n\n /* stylelint-disable-next-line liberty/use-logical-spec */\n margin-left: -0.99px;\n -webkit-mask-box-image-width: auto auto auto 0;\n }\n\n .outline-section {\n border: none;\n }\n\n #gap::after {\n border: none;\n\n background-color: currentColor;\n -webkit-mask-box-image: var(--mdw-shape__mask-image__edges)\n 8 fill /\n auto\n stretch;\n -webkit-mask-box-image-width: 0 0 auto 0;\n }\n\n #gap-slot::before,\n #gap-slot::after {\n border: none;\n\n background-color: currentColor;\n\n -webkit-mask-box-image: var(--mdw-shape__mask-image__edges)\n 8 fill /\n auto\n stretch;\n -webkit-mask-box-image-width: auto 0 0 0;\n }\n }\n\n #gap-slot::before {\n /* stylelint-disable-next-line liberty/use-logical-spec */\n margin-right: -0.99px;\n\n transform: var(--gap-transform, scaleX(0.5));\n transform-origin: 0 0;\n }\n\n #gap-slot::after {\n /* stylelint-disable-next-line liberty/use-logical-spec */\n margin-left: -0.99px;\n\n transform: var(--gap-transform, scaleX(0.5));\n transform-origin: 100% 0;\n }\n\n #gap:is([focused], [populated]) {\n /* Open gap */\n --gap-transform: scaleX(0);\n }\n\n #gap:empty {\n padding: 0;\n }\n\n #label[label][filled] {\n align-items: flex-start;\n }\n\n :host([filled]) {\n --mdw-shape__size__bottom-start-size: 0px;\n --mdw-shape__size__bottom-end-size: 0px;\n --mdw-text-field__ratio: calc(var(--mdw-density) * 0.25 + 1);\n }\n\n :host(:is([filled][label])) {\n --control__margin-top: calc((var(--mdw-text-field__ratio) * 8px) + var(--mdw-typescale__body-small__line-height));\n --control__padding-top: 0px;\n --control__padding-bottom: calc(var(--mdw-text-field__ratio) * 4px);\n --control__margin-bottom: calc(var(--mdw-text-field__ratio) * 4px);\n }\n\n #supporting {\n min-block-size: var(--mdw-typescale__body-small__line-height);\n margin-block-start: 4px;\n margin-inline: 16px;\n\n font-weight: var(--mdw-typescale__body-small__font-weight); /* Not spec */\n font-size: var(--mdw-typescale__body-small__font-size);\n line-height: var(--mdw-typescale__body-small__line-height);\n font-family: var(--mdw-typescale__body-small__font-family); /* Not spec */\n letter-spacing: var(--mdw-typescale__body-small__letter-spacing); /* Not spec */\n }\n\n /* Error States */\n\n #control[errored] {\n caret-color: rgb(var(--mdw-color__error));\n }\n\n #control[errored]::selection {\n background-color: rgb(var(--mdw-color__on-error-container));\n }\n\n :is(#indicator, #label-text, #supporting, #outline)[errored] {\n color: rgb(var(--mdw-color__error));\n }\n\n :is(#indicator, #label-text, #supporting, #outline)[errored]:where([hovered]) {\n color: rgb(var(--mdw-color__on-error-container));\n }\n\n :is(#indicator, #label-text, #supporting, #outline)[errored]:where([focused]) {\n color: rgb(var(--mdw-color__error));\n }\n\n /* stylelint-disable-next-line selector-max-compound-selectors */\n #label[disabled],\n #label[disabled] #control {\n cursor: not-allowed;\n }\n\n #outline[disabled] {\n color: rgba(var(--mdw-color__outline), 0.12);\n }\n\n #label-text[disabled] {\n color: rgba(var(--mdw-color__on-surface), 0.38);\n }\n\n #supporting[disabled] {\n color: rgba(var(--mdw-color__on-surface), 0.38);\n }\n\n .inline[disabled] {\n color: rgba(var(--mdw-color__on-surface), 0.38);\n }\n\n mdw-icon[disabled] {\n color: rgba(var(--mdw-color__on-surface), 0.38);\n }\n\n #label[disabled] {\n background-color: rgba(var(--mdw-color__on-surface), calc(0.04));\n color: rgba(var(--mdw-color__on-surface), 0.38);\n }\n\n #indicator[disabled] {\n color: rgba(var(--mdw-color__on-surface), 0.38);\n }\n\n #label[disabled][outlined] {\n background-color: transparent;\n }\n \n `;\n}\n", "import CustomElement from '../core/CustomElement.js';\nimport InputMixin from '../mixins/InputMixin.js';\nimport StateMixin from '../mixins/StateMixin.js';\nimport TextFieldMixin from '../mixins/TextFieldMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\nexport default CustomElement\n .mixin(ThemableMixin)\n .mixin(StateMixin)\n .mixin(InputMixin)\n .mixin(TextFieldMixin)\n .extend()\n .define({\n stateTargetElement() { return this.refs.control; },\n })\n .autoRegister('mdw-input');\n", "import Box from './Box.js';\n\nexport default Box\n .extend()\n .css`\n :host {\n font: var(--mdw-typescale__label-large__font);\n letter-spacing: var(--mdw-typescale__body-large__letter-spacing);\n }\n \n :host([size=\"medium\"]) {\n font: var(--mdw-typescale__label-medium__font);\n letter-spacing: var(--mdw-typescale__body-medium__letter-spacing);\n }\n \n :host([size=\"small\"]) {\n font: var(--mdw-typescale__label-small__font);\n letter-spacing: var(--mdw-typescale__body-small__letter-spacing);\n }\n `\n .autoRegister('mdw-label');\n", "import CustomElement from '../core/CustomElement.js';\n\nexport default CustomElement\n .extend()\n .html/* html */`\n <slot id=slot-top name=top></slot>\n <slot id=slot></slot>\n `\n .css`\n /* https://m3.material.io/foundations/layout/applying-layout/window-size-classes */\n\n :host {\n display: block;\n\n /* QOL */\n font: var(--mdw-typescale__body-large__font);\n letter-spacing: var(--mdw-typescale__body-large__letter-spacing);\n \n }\n\n /* Pane Slot */\n #slot {\n display: flex;\n gap: 24px;\n\n justify-content: center;\n\n padding-inline: 16px;\n\n transition: padding-inline 100ms;\n }\n\n @media screen and (min-width: 648px) { #slot { padding-inline: 24px; } }\n `\n .autoRegister('mdw-layout');\n", "import AriaReflectorMixin from '../mixins/AriaReflectorMixin.js';\nimport DensityMixin from '../mixins/DensityMixin.js';\n\nimport Box from './Box.js';\n\n/** @typedef {'compact'} DeprecatedHTMLMenuElementProperties */\n\nexport default Box\n .mixin(DensityMixin)\n .mixin(AriaReflectorMixin)\n .extend()\n .set({\n _ariaRole: 'list',\n })\n .css`\n /* https://m3.material.io/components/lists/specs */\n\n :host {\n display: flex;\n flex-direction: column;\n\n padding-block: 8px;\n }\n\n :host(:focus) {\n outline: 1px solid red;\n }\n\n `\n .autoRegister('mdw-list');\n", "import CustomElement from '../core/CustomElement.js';\nimport ShapeMixin from '../mixins/ShapeMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\nexport default CustomElement\n .mixin(ThemableMixin)\n .mixin(ShapeMixin)\n .extend()\n .observe({\n selected: 'boolean',\n icon: 'string',\n errored: 'boolean',\n disabled: 'boolean',\n hovered: 'boolean',\n focused: 'boolean',\n })\n .define({\n /** Alias for Selected (QoL) */\n checked: {\n get() { return this.selected; },\n set(value) { this.selected = value; },\n },\n })\n .html/* html */`\n <div id=inner-shape class=shape selected={selected}></div>\n `.on({\n composed() {\n const { outline } = this.refs;\n outline.removeAttribute('_if');\n outline.setAttribute('selected', '{selected}');\n },\n })\n .css`\n /* https://m3.material.io/components/radio-button/specs */\n\n :host {\n --disabled-opacity: 0.38;\n --mdw-ink: rgb(var(--mdw-color__primary));\n /* Use CSS Variables to force filter to reapply (Chrome Bug) */\n --color: rgb(var(--mdw-color__on-surface-variant));\n --mdw-shape__size: var(--mdw-shape__full);\n position: relative;\n\n display: inline-block;\n\n block-size: 20px;\n inline-size: 20px;\n\n background-color: transparent;\n\n transition: opacity 200ms;\n }\n\n #outline {\n filter:\n drop-shadow(1px 0px 0px var(--color))\n drop-shadow(0px 1px 0px var(--color))\n drop-shadow(-1px 0px 0px var(--color))\n drop-shadow(0px -1px 0px var(--color))\n ;\n\n color: var(--color);\n\n will-change: filter, color;\n }\n\n #inner-shape {\n position: absolute;\n inset: 0;\n\n transform: scale(0);\n\n background-color: var(--color);\n\n transition: transform 200ms, background-color 100ms;\n }\n\n :host([hovered]) {\n --color: rgb(var(--mdw-color__on-surface));\n }\n\n :host([focused]) {\n --color: rgb(var(--mdw-color__on-surface));\n }\n\n :host([selected]) {\n --color: rgb(var(--mdw-ink));\n }\n\n :host([errored]) {\n --color: rgb(var(--mdw-color__error));\n }\n\n :host([disabled]) {\n --color: rgba(var(--mdw-color__on-surface));\n opacity: var(--disabled-opacity);\n }\n\n #inner-shape[selected] {\n transform: scale(0.5);\n }\n\n `\n .autoRegister('mdw-radio-icon');\n", "// https://www.w3.org/WAI/ARIA/apg/patterns/listbox/\n\nimport './CheckboxIcon.js';\nimport './RadioIcon.js';\nimport './Divider.js';\nimport './Icon.js';\n\nimport CustomElement from '../core/CustomElement.js';\nimport AriaReflectorMixin from '../mixins/AriaReflectorMixin.js';\nimport RippleMixin from '../mixins/RippleMixin.js';\nimport StateMixin from '../mixins/StateMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\nexport default CustomElement\n .mixin(ThemableMixin)\n .mixin(StateMixin)\n .mixin(RippleMixin)\n .mixin(AriaReflectorMixin)\n .extend()\n .set({\n _ariaRole: 'listitem',\n delegatesFocus: false,\n stateLayer: true,\n })\n .observe({\n leading: 'string',\n avatar: 'string',\n avatarColor: { value: 'primary-container' },\n avatarSrc: 'string',\n src: 'string',\n alt: 'string',\n icon: 'string',\n href: 'string',\n iconInk: 'string',\n iconSrc: 'string',\n checkbox: 'string',\n radio: 'string',\n selectionColor: { value: 'primary' },\n selected: 'boolean',\n supporting: 'string',\n trailing: 'string',\n trailingIcon: 'string',\n trailingIconInk: 'string',\n trailingIconSrc: 'string',\n divider: 'boolean',\n video: 'boolean',\n lines: 'integer',\n _supportingSlotted: 'boolean',\n })\n .observe({\n // Alias since not form-associated\n disabledState({ disabled }) {\n return disabled;\n },\n\n })\n .expressions({\n isInteractive({ href }) {\n return href != null;\n },\n hasSupporting() {\n return this.supporting || this._supportingSlotted;\n },\n checkboxClass() {\n return this.checkbox || 'leading';\n },\n radioClass() {\n return this.radio || 'leading';\n },\n })\n .html/* html */`\n <a id=anchor _if={href} href={href} disabled={disabledState} aria-labelledby=content></a>\n <mdw-checkbox-icon id=checkbox _if={checkbox} aria-hidden=true class={checkboxClass} color={selectionColor} disabled={disabledState} icon=check selected={selected}></mdw-checkbox-icon>\n <mdw-radio-icon id=radio _if={radio} aria-hidden=true class={radioClass} disabled={disabledState} ink={selectionColor} selected={selected}></mdw-radio-icon>\n <mdw-box _if={avatar} id=avatar color={avatarColor} type-style=title-medium src={AvatarSrc}\n aria-hidden=true>{avatar}</mdw-box>\n <mdw-icon _if={icon} id=icon ink={iconInk} src={iconSrc} aria-hidden=true>{icon}</mdw-icon>\n <img id=img _if={src} src={src} alt={alt} video={video} />\n <slot name=leading>{leading}</slot>\n <div id=content has-supporting={hasSupporting} lines={lines}>\n <slot id=slot></slot>\n <slot id=supporting name=supporting class=text lines={lines}>{supporting}</slot>\n </div>\n <mdw-icon _if={trailingIcon} id=trailing-icon ink={trailingIconInk} src={trailingIconSrc} aria-hidden=true>{trailingIcon}</mdw-icon>\n <slot id=trailing name=trailing role=note>{trailing}</slot>\n <mdw-divider _if={divider} id=divider divder={divider}></mdw-divider>\n `\n .on({\n composed() {\n const { state, rippleContainer, anchor } = this.refs;\n anchor.append(\n state,\n rippleContainer,\n );\n state.setAttribute('state-disabled', 'focus hover');\n },\n disabledStateChanged(oldValue, newValue) {\n this.updateAriaProperty('ariaDisabled', newValue ? 'true' : 'false');\n },\n })\n .css`\n /* https://m3.material.io/components/lists/specs */\n\n :host {\n --mdw-shape__size: 0px;\n /* Grid does not auto collapse columns, leaving gaps */\n\n display: flex;\n align-items: center;\n gap: 16px;\n\n border: none;\n padding-block: 8px;\n padding-inline: 16px 24px;\n\n cursor: auto;\n\n outline: none;\n\n color: inherit;\n\n text-decoration: none;\n }\n\n :host([href]) {\n cursor: pointer;\n }\n\n #anchor {\n position: absolute;\n inset: 0;\n\n outline: none;\n\n color: inherit;\n\n }\n\n :host([video]) {\n padding-inline-start: 0;\n }\n\n :host([lines=\"3\"]) {\n align-items: flex-start;\n\n padding-block: 12px;\n }\n\n #content {\n display: inline-flex;\n align-items: flex-start;\n flex-direction: column;\n justify-content: center;\n\n flex: 1;\n\n padding-block: calc(8px + (var(--mdw-density) * 2px));\n }\n\n #content:is([has-supporting], [lines=\"2\"]) {\n box-sizing: border-box;\n min-block-size: calc(8px + calc(48px + var(--mdw-density) * 2px));\n padding-block: calc(4px + var(--mdw-density) * 2px);\n }\n\n #content:is([lines=\"3\"]) {\n box-sizing: border-box;\n min-block-size: calc(8px + calc(48px + var(--mdw-density) * 2px));\n padding-block: calc(0 + var(--mdw-density) * 2px);\n }\n\n #icon {\n font-size: 24px;\n }\n\n #trailing-icon {\n font-size: 24px;\n }\n\n #divider {\n position: absolute;\n inset-block-end: 0;\n\n display: block;\n\n color: rgb(var(--mdw-color__surface-variant));\n }\n\n #divider[divider=\"inset\"] {\n padding-inline: 16px 24px;\n }\n\n #slot {\n max-block-size: var(--mdw-typescale__body-large__line-height) * 2;\n\n /* background-color: rgba(255,0,0,0.10); */\n\n color: var(--mdw-color__on-surface);\n\n font: var(--mdw-typescale__body-large__font);\n letter-spacing: var(--mdw-typescale__body-large__letter-spacing);\n }\n\n #supporting {\n max-block-size: calc(var(--mdw-typescale__body-medium__line-height) * 2);\n\n /* background-color: rgba(0,255,0,0.10); */\n\n color: var(--mdw-color__on-surface-variant);\n\n font: var(--mdw-typescale__body-medium__font);\n letter-spacing: var(--mdw-typescale__body-medium__letter-spacing);\n }\n\n #trailing {\n color: var(--mdw-color__on-surface-variant);\n\n font: var(--mdw-typescale__body-medium__font);\n letter-spacing: var(--mdw-typescale__body-medium__letter-spacing);\n }\n\n #slot, #supporting {\n display: block;\n overflow-x: hidden;\n overflow-y: hidden;\n\n text-align: start;\n text-overflow: ellipsis;\n text-transform: none;\n white-space: normal;\n word-break: break-word;\n }\n\n #supporting[lines=\"2\"] {\n min-block-size: var(--mdw-typescale__body-medium__line-height);\n max-block-size: var(--mdw-typescale__body-medium__line-height);\n }\n\n #supporting[lines=\"3\"] {\n min-block-size: calc(var(--mdw-typescale__body-medium__line-height) * 2);\n max-block-size: calc(var(--mdw-typescale__body-medium__line-height) * 2);\n }\n\n @supports(width: 1lh) {\n #slot {\n max-block-size: 1lh;\n }\n\n #supporting {\n max-block-size: 2lh;\n }\n\n #supporting[lines=\"2\"] {\n min-block-size: 1lh;\n max-block-size: 1lh;\n }\n\n #supporting[lines=\"3\"] {\n min-block-size: 2lh;\n max-block-size: 2lh;\n }\n }\n\n @supports(-webkit-line-clamp:1) {\n #slot {\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 1;\n }\n\n #supporting {\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n }\n\n #supporting[lines=\"2\"] {\n -webkit-line-clamp: 1;\n }\n }\n\n #avatar {\n display: flex;\n align-items: center;\n justify-content: center;\n\n block-size: 40px;\n inline-size: 40px;\n\n border-radius: 50%;\n }\n\n #img {\n block-size: 56px;\n max-block-size: 56px;\n inline-size: 56px;\n max-inline-size: 56px;\n\n object-fit: cover;\n object-position: center center;\n }\n\n #img[video] {\n block-size: 64px;\n max-block-size: 64px;\n inline-size: 114px;\n max-inline-size: 114px;\n }\n\n #checkbox {\n /* stylelint-disable-next-line declaration-property-value-disallowed-list */\n margin: 3px;\n }\n\n #radio {\n /* stylelint-disable-next-line declaration-property-value-disallowed-list */\n margin: 2px;\n }\n\n .trailing {\n order: 1;\n }\n\n :host([disabled]) {\n opacity: 0.38;\n\n color: rgb(var(--mdw-color__on-surface));\n }\n `\n .childEvents({\n supporting: {\n /** @param {Event & {currentTarget: HTMLSlotElement}} event */\n slotchange({ currentTarget }) {\n this._supportingSlotted = currentTarget.assignedNodes().length !== 0;\n },\n },\n })\n .autoRegister('mdw-list-item');\n", "// https://www.w3.org/WAI/ARIA/apg/patterns/listbox/\n\nimport ListItem from './ListItem.js';\n\n// https://html.spec.whatwg.org/multipage/form-elements.html#htmloptionelement\n\nexport default class ListOption extends ListItem\n .extend()\n .setStatic({\n formAssociated: true,\n })\n .set({\n _ariaRole: 'none',\n delegatesFocus: true,\n _index: -1,\n _selectedDirty: false,\n isInteractive: true,\n })\n .observe({\n // ListOption.prototype._form = ListOption.prop('_form');\n _label: { attr: 'label', nullParser: String },\n defaultSelected: { attr: 'selected', reflect: true, type: 'boolean' },\n _selected: 'boolean',\n _value: { attr: 'value', reflect: true },\n _formDisabled: 'boolean',\n })\n .observe({\n selected: {\n reflect: false,\n type: 'boolean',\n get({ _selectedDirty, defaultSelected, _selected }) {\n if (!_selectedDirty) return defaultSelected;\n return _selected;\n },\n /** @param {boolean} value */\n set(value) {\n this._selectedDirty = true;\n this._selected = value;\n },\n },\n disabledState({ _formDisabled, disabled }) {\n if (_formDisabled) return true;\n return !!disabled;\n },\n })\n .define({\n index() { return this._index; },\n form() { return /** @type {import('./ListSelect.js').default} */ (this.parentElement)?.form; },\n label: {\n get() { return this._label; },\n /** @param {string} value */\n set(value) {\n this._label = value;\n },\n },\n value: {\n get() { return this._value; },\n /** @param {string} value */\n set(value) { this._label = value; },\n },\n })\n .methods({\n /** @param {boolean} formDisabled */\n formDisabledCallback(formDisabled) {\n this._formDisabled = formDisabled;\n },\n /** @type {HTMLElement['focus']} */\n focus(...options) {\n this.refs.anchor.focus(...options);\n },\n })\n .on({\n composed({ inline }) {\n const { anchor, state, content } = this.refs;\n\n // Form Associated elements cannot receive focus unless using delegatesFocus\n // Workaround by redirecting focus to an inner element\n // Reuse HTMLAnchorElement with no HREF\n\n anchor.setAttribute('disabled', '{disabledState}');\n anchor.setAttribute('role', 'option');\n anchor.setAttribute('aria-disabled', inline(({ disabledState }) => `${disabledState}`));\n anchor.setAttribute('tabindex', '0');\n anchor.setAttribute('aria-selected', inline(({ selected }) => `${selected}`));\n anchor.setAttribute('selected', '{selected}');\n anchor.removeAttribute('href');\n anchor.removeAttribute('_if');\n\n content.setAttribute('selected', '{selected}');\n\n state.setAttribute('state-disabled', 'focus');\n },\n })\n .css`\n :host {\n --mdw-bg: var(--mdw-color__secondary-container);\n --mdw-ink: var(--mdw-color__on-secondary-container);\n cursor: pointer;\n \n z-index: 0;\n }\n \n :host([href]) {\n cursor: pointer;\n }\n \n :host([disabled]) {\n cursor: not-allowed;\n pointer-events: none;\n }\n \n #content {\n -webkit-user-select: none;\n user-select: none;\n }\n \n #content[selected] {\n color: rgb(var(--mdw-ink));\n }\n \n #anchor {\n z-index: -1;\n }\n \n #anchor[selected] {\n background-color: rgb(var(--mdw-bg));\n color: rgb(var(--mdw-ink));\n }\n ` {\n static { this.autoRegister('mdw-list-option'); }\n\n /**\n * @param {string} [text]\n * @param {string} [value]\n * @param {boolean} [defaultSelected]\n * @param {boolean} [selected]\n */\n constructor(text, value, defaultSelected, selected) {\n super();\n if (text !== undefined) {\n this.text = text;\n }\n if (value !== undefined) {\n this._value = value;\n }\n if (defaultSelected !== undefined) {\n this.defaultSelected = defaultSelected;\n }\n if (selected !== undefined) {\n this._selected = selected;\n }\n }\n\n connectedCallback() {\n super.connectedCallback();\n if (!this.hasAttribute('tabindex')) {\n this.tabIndex = 0;\n }\n }\n}\n", "/**\n * @see https://html.spec.whatwg.org/multipage/common-dom-interfaces.html#htmloptionscollection\n * @template {HTMLOptionElement} T1\n * @template {HTMLOptGroupElement} T2\n * @param {Object} options\n * @param {HTMLElement} options.host\n * @param {HTMLCollectionOf<T1>} options.collection\n * @param {typeof T1} options.OptionConstructor\n * @param {typeof T2} options.GroupConstructor\n * @return {HTMLCollectionOf<T1> & HTMLOptionsCollection}\n */\nexport function constructHTMLOptionsCollectionProxy({ host, collection, OptionConstructor, GroupConstructor }) {\n /**\n * @param {T1} element\n * @param {HTMLElement|number} [before]\n * @return {void}\n */\n // eslint-disable-next-line func-style\n const add = function add(element, before) {\n let beforeElement;\n let index = -1;\n if (typeof before === 'number') {\n if (before >= 0 && before < collection.length - 1) {\n index = before;\n }\n } else if (before instanceof HTMLElement) {\n beforeElement = before;\n }\n if (index !== -1) {\n beforeElement = collection.item(index);\n }\n if (beforeElement) {\n beforeElement.before(element);\n } else {\n host.append(element);\n }\n };\n /**\n * @param {number} index\n * @return {void}\n */\n // eslint-disable-next-line func-style\n const remove = function remove(index) {\n collection.item(index)?.remove();\n };\n\n Object.defineProperty(collection, 'selectedIndex', {\n get() {\n for (let i = 0; i < collection.length; i++) {\n if (collection[i].selected) {\n return i;\n }\n }\n return -1;\n },\n set(value) {\n for (let i = 0; i < collection.length; i++) {\n collection[i].selected = (i === value);\n }\n },\n });\n const newCollection = new Proxy(collection, {\n get(target, p, receiver) {\n switch (p) {\n case 'add':\n return add;\n case 'remove':\n return remove;\n default:\n return target[p];\n }\n },\n set(target, p, newValue, receiver) {\n let index = Number.NaN;\n switch (typeof p) {\n case 'string':\n index = Number.parseInt(p, 10);\n break;\n case 'number':\n index = p;\n break;\n default:\n case 'symbol':\n return Reflect.set(target, p, newValue, receiver);\n }\n if (Number.isNaN(index)) {\n return Reflect.set(target, p, newValue, receiver);\n }\n const currentSize = collection.length;\n while (index > collection.length) {\n add(new OptionConstructor());\n }\n if (index === currentSize) {\n if (newValue != null) {\n add(newValue);\n }\n } else if (index >= 0) {\n remove(index);\n if (newValue !== null) {\n add(newValue, index);\n }\n }\n },\n });\n return newCollection;\n}\n", "import { constructHTMLOptionsCollectionProxy } from '../dom/HTMLOptionsCollectionProxy.js';\nimport FormAssociatedMixin from '../mixins/FormAssociatedMixin.js';\nimport KeyboardNavMixin from '../mixins/KeyboardNavMixin.js';\nimport StateMixin from '../mixins/StateMixin.js';\n\nimport List from './List.js';\nimport ListOption from './ListOption.js';\n\n/** @implements {HTMLSelectElement} */\nexport default class ListSelect extends List\n .mixin(StateMixin)\n .mixin(FormAssociatedMixin)\n .mixin(KeyboardNavMixin) {\n static {\n this.autoRegister('mdw-list-select');\n // eslint-disable-next-line no-unused-expressions\n this.css`\n :host(:disabled) {\n cursor: not-allowed;\n pointer-events: none;\n }\n \n :host([internals-disabled]) {\n cursor: not-allowed;\n pointer-events: none;\n }\n `;\n this.on({\n disabledStateChanged(oldValue, newValue) {\n this._kbdFocusable = !newValue;\n this.tabIndex = newValue ? -1 : 0;\n },\n multipleChanged(oldValue, newValue) {\n this.updateAriaProperty('ariaMultiSelectable', newValue ? 'true' : 'false');\n },\n });\n }\n\n /** @type {HTMLCollectionOf<ListOption> & HTMLOptionsCollection} */\n _optionsCollection = null;\n\n constructor() {\n super();\n this.refs.slot.addEventListener('slotchange', this.onSlotChange);\n this.addEventListener('keydown', this.onControlKeydown);\n this.addEventListener('click', this.onListSelectClick);\n }\n\n connectedCallback() {\n super.connectedCallback();\n if (!this.hasAttribute('tabindex')) {\n this.tabIndex = 0;\n }\n }\n\n * _selectedOptionsGenerator() {\n for (const el of this.options) {\n if (!el.selected) continue;\n yield el;\n }\n }\n\n /**\n * @param {Event} event\n * @this {HTMLSlotElement}\n * @return {void}\n */\n onSlotChange(event) {\n /** @type {{host:ListSelect}} */ // @ts-ignore Coerce\n const { host } = this.getRootNode();\n host.refreshTabIndexes();\n let index = 0;\n for (const el of host.options) {\n el._index = index++;\n }\n }\n\n /**\n * @param {KeyboardEvent} event\n * @this {ListSelect}\n * @return {void}\n */\n onControlKeydown(event) {\n if (event.key === 'Spacebar' || event.key === ' ') {\n const target = event.target;\n if (!(target instanceof ListOption)) return;\n event.stopPropagation();\n event.preventDefault();\n this.onListSelectClick.call(this, event);\n }\n }\n\n /**\n * @param {MouseEvent|KeyboardEvent} event\n * @this {ListSelect}\n * @return {void}\n */\n onListSelectClick(event) {\n console.log('onListSelectClick');\n const target = event.target;\n if (!(target instanceof ListOption)) return;\n event.stopPropagation();\n if (target.disabledState) return;\n\n // Perform unselect\n if (target.selected) {\n if (this.multiple) {\n const selections = [...this.selectedOptions];\n if (this.required && selections.length === 1) return;\n if (selections.length === 0) {\n console.warn('impossible??');\n }\n target.selected = false;\n let firstSelection = selections.shift();\n if (firstSelection === target) {\n // Get new first selection (or undefined)\n firstSelection = selections.shift();\n }\n this._value = firstSelection?.value ?? '';\n return;\n }\n if (this.required) return;\n target.selected = false;\n this._value = '';\n return;\n }\n\n if (this.multiple) {\n // Skip ctrlKey requirement\n target.selected = true;\n this._value = this.selectedOptions.next().value;\n return;\n }\n\n for (const el of this.options) {\n el.selected = el === target;\n }\n this._value = target.value;\n }\n\n formResetCallback() {\n // TODO: Reset dirty on options\n super.formResetCallback();\n }\n\n get options() {\n if (!this._optionsCollection) {\n this._optionsCollection = constructHTMLOptionsCollectionProxy({\n host: this,\n collection: this.getElementsByTagName(ListOption.elementName),\n OptionConstructor: ListOption,\n GroupConstructor: ListOption,\n });\n }\n return this._optionsCollection;\n }\n\n get selectedOptions() {\n return this._selectedOptionsGenerator();\n }\n\n // @ts-ignore @override\n get type() { return 'select'; }\n\n /** @override */\n get kbdNavQuery() { return ListOption.elementName; }\n\n // @ts-ignore @override\n get length() {\n return this.options.length;\n }\n\n get selectedIndex() {\n return this.options.selectedIndex;\n }\n\n set selectedIndex(value) {\n this.options.selectedIndex = value;\n this._value = (this.options.item(value)?.value) ?? '';\n }\n\n get value() {\n return this._value;\n }\n\n /** @param {string} v */\n set value(v) {\n for (const el of this.options) {\n el.selected = (el.value === v);\n }\n this._value = v;\n }\n\n get add() { return this.options.add; }\n\n get item() { return this.options.item; }\n\n get namedItem() { return this.options.namedItem; }\n\n * [Symbol.iterator]() {\n for (const el of this.options) {\n yield el;\n }\n }\n\n get kbdNavFocusableWhenDisabled() { return true; }\n}\n\n// https://html.spec.whatwg.org/multipage/form-elements.html#htmlselectelement\n\n// [CEReactions] attribute DOMString autocomplete;\n// ListSelect.prototype.disabled = ListSelect.prop('disabled', { type: 'boolean' });\n// readonly attribute HTMLFormElement? form;\nListSelect.prototype.multiple = ListSelect.prop('multiple', { type: 'boolean' });\n// [CEReactions] attribute boolean multiple;\n// [CEReactions] attribute DOMString name;\n// [CEReactions] attribute boolean required;\nListSelect.prototype.size = ListSelect.prop('size', { type: 'integer', empty: 0 });\nListSelect.prototype._ariaRole = 'listbox';\nListSelect.prototype.delegatesFocus = true;\n", "// https://www.w3.org/TR/wai-aria-practices/#menu\n\nimport './Surface.js';\nimport CustomElement from '../core/CustomElement.js';\nimport { attemptFocus } from '../core/dom.js';\nimport DensityMixin from '../mixins/DensityMixin.js';\nimport KeyboardNavMixin from '../mixins/KeyboardNavMixin.js';\nimport { canAnchorPopup } from '../utils/popup.js';\n\n/**\n * @typedef {Object} MenuStack\n * @prop {HTMLElement} element\n * @prop {Element} previousFocus\n * @prop {Object} [state]\n * @prop {Object} [previousState]\n * @prop {MouseEvent|PointerEvent|HTMLElement|Element} [originalEvent]\n * @prop {any} [pendingResizeOperation]\n * @prop {window['history']['scrollRestoration']} [scrollRestoration]\n */\n\nconst supportsHTMLDialogElement = typeof HTMLDialogElement !== 'undefined';\n/** @type {MenuStack[]} */\nconst OPEN_MENUS = [];\n\n/**\n * @return {void}\n */\nfunction onWindowResize() {\n const lastOpenMenu = OPEN_MENUS.at(-1);\n if (!lastOpenMenu || !lastOpenMenu.originalEvent) {\n return;\n }\n if (lastOpenMenu.pendingResizeOperation) {\n cancelAnimationFrame(lastOpenMenu.pendingResizeOperation);\n }\n lastOpenMenu.pendingResizeOperation = requestAnimationFrame(() => {\n lastOpenMenu.element.updateMenuPosition(lastOpenMenu.originalEvent);\n lastOpenMenu.pendingResizeOperation = null;\n });\n}\n\n/**\n * @param {PopStateEvent} event\n */\nfunction onPopState(event) {\n if (!event.state) return;\n const lastOpenMenu = OPEN_MENUS.at(-1);\n if (!lastOpenMenu || !lastOpenMenu.previousState) {\n return;\n }\n if ((lastOpenMenu.previousState === event.state) || Object.keys(event.state)\n .every((key) => event.state[key] === lastOpenMenu.previousState[key])) {\n lastOpenMenu.element.close();\n }\n}\n\n/** @param {BeforeUnloadEvent} event */\nfunction onBeforeUnload(event) {\n if (!OPEN_MENUS.length) return;\n console.warn('Menu was open during page unload (refresh?).');\n}\n\nexport default CustomElement\n .mixin(DensityMixin)\n .mixin(KeyboardNavMixin)\n .extend()\n .observe({\n open: 'boolean',\n flow: {\n type: 'string',\n /** @type {'corner'|'adjacent'|'overflow'|'vcenter'|'hcenter'|'center'} */\n value: null,\n },\n submenu: 'boolean',\n modal: 'boolean',\n _isNativeModal: 'boolean',\n color: { empty: 'surface' },\n ink: 'string',\n elevation: { empty: 2 },\n outlined: 'boolean',\n })\n .set({\n returnValue: '',\n delegatesFocus: true,\n /** @type {WeakRef<HTMLElement>} */\n _cascader: null,\n _closing: false,\n })\n .define({\n kbdNavChildren() {\n const items = [...this.querySelectorAll('mdw-menu-item')];\n // eslint-disable-next-line unicorn/prefer-set-has\n const submenuItems = [...this.querySelectorAll(':scope mdw-menu mdw-menu-item')];\n return items.filter((el) => !submenuItems.includes(el));\n },\n _dialog() {\n return /** @type {HTMLDialogElement} */ (this.refs.dialog);\n },\n cascader: {\n get() {\n return this._cascader?.deref();\n },\n /**\n * @param {HTMLElement} value\n */\n set(value) {\n this._cascader = value ? new WeakRef(value) : null;\n },\n },\n })\n .html/* html */`\n <dialog id=dialog role=menu aria-hidden=${({ open }) => (open ? 'false' : 'true')}>\n <div id=scrim aria-hidden=true modal={modal}></div>\n <form id=form method=dialog role=none>\n <mdw-surface id=surface elevation={elevation} color={color} ink={ink} outlined={outlined}>\n <div id=scroller>\n <slot id=slot on-slotchange={refreshTabIndexes}></slot>\n </div>\n </mdw-surface>\n <slot id=submenu-slot name=submenu></slot>\n </form>\n </dialog>\n `\n .css`\n /* https://m3.material.io/components/menus/specs */\n\n :host {\n --mdw-menu__transform-origin-inline-start: left;\n --mdw-menu__transform-origin-inline-end: right;\n /* Normal */\n --mdw-menu__transform-origin-x: var(--mdw-menu__transform-origin-inline-start);\n /* Down */\n --mdw-menu__transform-origin-y: top;\n --mdw-menu__inline-base: 56px;\n --mdw-menu__size: 2;\n --mdw-bg: var(--mdw-color__surface);\n --mdw-ink: var(--mdw-color__on-surface);\n position: absolute;\n /* Default position is bottom */\n /* Default direction is start */\n inset-block: 100% auto;\n inset-inline: auto 0;\n\n display: block;\n /* Hide scrollbar */\n -ms-overflow-style: none;\n /* Scroll mask */\n overscroll-behavior: none;\n overscroll-behavior: contain;\n scrollbar-width: none;\n\n pointer-events: none;\n\n transform-origin: var(--mdw-menu__transform-origin-x) var(--mdw-menu__transform-origin-y);\n\n transition-duration: motion.$fadeOutDuration;\n transition-property: none;\n transition-timing-function: motion.$decelerateEasing;\n }\n\n :host(::after) {\n content: '';\n\n display: block;\n\n block-size: 200%;\n inline-size: 200%;\n }\n\n :host(::-webkit-scrollbar) {\n display: none;\n }\n\n dialog {\n position: fixed;\n inset: 0;\n\n box-sizing: border-box;\n block-size:100%;\n max-block-size: none;\n inline-size:100%;\n max-inline-size: none;\n margin: 0;\n border: none;\n padding: 0;\n\n opacity: 0;\n visibility: hidden;\n z-index: 24;\n\n background-color: transparent;\n\n transition: none;\n transition-property: opacity;\n will-change: opacity;\n }\n\n dialog::backdrop {\n /** Use scrim instead */\n display: none;\n }\n\n dialog[aria-hidden=\"false\"],\n dialog:modal {\n display: block;\n\n pointer-events: none;\n\n opacity: 1;\n visibility: visible;\n\n transition-duration: var(--mdw-dialog__fade-in-duration);\n transition-property: opacity;\n transition-timing-function: var(--mdw-dialog__deceleration-easing);\n }\n\n #scrim {\n position: fixed;\n inset: 0;\n\n overflow-y: scroll;\n overscroll-behavior: none;\n overscroll-behavior: contain;\n scrollbar-width: none;\n\n block-size: 100%;\n inline-size: 100%;\n\n cursor: default;\n pointer-events: auto;\n -webkit-tap-highlight-color: transparent;\n\n visibility: hidden; /* Only show if [modal] */\n\n z-index:0;\n }\n\n #form {\n display: contents;\n }\n\n #scrim::-webkit-scrollbar {\n display: none;\n }\n\n #scrim::after {\n content: '';\n\n display: block;\n\n block-size: 200%;\n inline-size: 200%;\n }\n\n #surface {\n --mdw-shape__size: var(--mdw-shape__extra-small);\n position: sticky;\n\n display: inline-flex;\n flex-direction: column;\n\n inline-size: calc(var(--mdw-menu__size) * var(--mdw-menu__inline-base));\n min-inline-size: calc(var(--mdw-menu__inline-base) * 2);\n max-inline-size: 100vw;\n flex:1;\n\n pointer-events: auto;\n /* background-color: rgb(var(--mdw-color__surface)); */\n /* color: rgb(var(--mdw-color__on-surface)); */\n /* stylelint-disable-next-line liberty/use-logical-spec */\n will-change: top, left;\n }\n\n @supports(-moz-appearance: none) {\n #surface {\n position: absolute;\n }\n }\n\n #scroller {\n display: flex;\n align-items: stretch;\n flex-direction: column;\n overflow-y: auto;\n overscroll-behavior: none;\n overscroll-behavior: contain;\n\n flex: 1;\n\n padding-block: 8px;\n }\n\n #scrim[modal] {\n visibility: visible;\n }\n `\n .methods({\n focus() {\n const [firstItem] = this.kbdNavChildren;\n if (!attemptFocus(firstItem)) {\n this.focusNext(firstItem);\n }\n },\n /**\n * @param {DOMRect|Element} [anchor]\n * @return {void}\n */\n updateMenuPosition(anchor) {\n const surface = this.refs.surface;\n surface.style.setProperty('max-height', 'none');\n surface.style.setProperty('width', 'auto');\n const newSize = Math.ceil(surface.clientWidth / 56);\n surface.style.removeProperty('width');\n surface.style.setProperty('--mdw-menu__size', newSize.toString(10));\n\n /** @type {import('../utils/popup.js').CanAnchorPopUpOptions} */\n const anchorOptions = {\n anchor: anchor ?? this.getBoundingClientRect(),\n width: surface.clientWidth,\n height: surface.clientHeight,\n // margin,\n };\n\n const isPageRTL = (getComputedStyle(this).direction === 'rtl');\n const xStart = isPageRTL ? 'right' : 'left';\n const xEnd = isPageRTL ? 'left' : 'right';\n\n /* Automatic Positioning\n *\n * Positions:\n * 3 7 4\n * ┌─────────┐\n * │ │\n * 5 │ 9 │ 6\n * │ │\n * └─────────┘\n * 1 8 2\n *\n * 1: Bottom Left\n * 2: Bottom Right\n * 3: Top Left\n * 4: Top Right\n * 5: VCenter Left\n * 6: VCenter Right\n * 7: HCenter Top\n * 8: HCenter Bottom\n * 9: VCenter HCenter\n *\n * Directions:\n * a - Down LTR\n * b - Down RTL\n * c - Up LTR\n * d - Up RTL\n * e - LTR\n * f - RTL\n * g - Down\n * h - Up\n * i - Center\n *\n *\n * 16 total combos\n * 1a 1b 1c 1d └↘ └↙ └↗ └↖\n * 2a 2b 2c 2d ┘↘ ┘↙ ┘↗ ┘↖\n * 3a 3b 3c 3d ┌↘ ┌↙ ┌↗ ┌↖\n * 4a 4b 4c 4d ┐↘ ┐↙ ┐↗ ┐↖\n *\n * Avoid using opposite angle\n *\n * 1a XX 1c 1d └↘ ██ └↗ └↖\n * XX 2b 2c 2d ██ ┘↙ ┘↗ ┘↖\n * 1a 3b 3c XX ┌↘ ┌↙ ┌↗ ██\n * 4a 4b XX 4d ┐↘ ┐↙ ██ ┐↖\n *\n *\n * Preference Order:\n * - Flow from corner 1a 2b 3c 4d └↘ ┘↙ ┌↗ ┐↖\n * - Open adjacent to target 4a 3b 2c 1d ┐↘ ┌↙ ┘↗ └↖\n * - Overlay target 3a 4b 1c 2d ┌↘ ┐↙ └↗ ┘↖\n * - Open from horizontal side 5e 6f │→ │←\n * - Open from center 9i █·\n */\n\n /** @type {import('../utils/popup.js').CanAnchorPopUpOptions[]} */\n const preferences = [\n (!this.submenu && (this.flow ?? 'corner') === 'corner') ? [\n { clientY: 'bottom', clientX: xStart },\n { clientY: 'bottom', clientX: xEnd },\n { clientY: 'top', clientX: xStart },\n { clientY: 'top', clientX: xEnd },\n ] : [],\n (this.submenu || (this.flow ?? 'adjacent') === 'adjacent') ? [\n { clientY: 'top', clientX: xEnd, directionX: xEnd, directionY: 'down' },\n { clientY: 'top', clientX: xStart, directionX: xStart, directionY: 'down' },\n { clientY: 'bottom', clientX: xEnd, directionX: xEnd, directionY: 'up' },\n { clientY: 'bottom', clientX: xStart, directionX: xStart, directionY: 'up' },\n ] : [],\n (!this.submenu && (this.flow ?? 'overlay') === 'overlay') ? [\n { clientY: 'top', clientX: xStart, directionX: xEnd, directionY: 'down' },\n { clientY: 'top', clientX: xEnd, directionX: xStart, directionY: 'down' },\n { clientY: 'bottom', clientX: xStart, directionX: xEnd, directionY: 'up' },\n { clientY: 'bottom', clientX: xEnd, directionX: xStart, directionY: 'up' },\n ] : [],\n (!this.submenu && (this.flow ?? 'vcenter') === 'vcenter') ? [\n { clientY: 'center', clientX: xEnd, directionX: xEnd, directionY: 'center' },\n { clientY: 'center', clientX: xStart, directionX: xStart, directionY: 'center' },\n ] : [],\n (!this.submenu && (this.flow ?? 'hcenter') === 'hcenter') ? [\n { clientY: 'bottom', clientX: 'center', directionX: 'center', directionY: 'down' },\n { clientY: 'top', clientX: 'center', directionX: 'center', directionY: 'up' },\n ] : [],\n (!this.submenu && (this.flow ?? 'center') === 'center') ? [\n { clientY: 'center', clientX: 'center', directionX: 'center', directionY: 'center' },\n ] : [],\n ].flat();\n\n let anchorResult;\n for (const preference of preferences) {\n anchorResult = canAnchorPopup({\n ...anchorOptions,\n ...preference,\n });\n if (anchorResult) break;\n }\n\n if (!anchorResult) {\n anchorResult = canAnchorPopup({\n ...anchorOptions,\n ...preferences[0],\n force: true,\n });\n }\n\n surface.style.setProperty('inset-block-start', `${anchorResult.pageY}px`);\n surface.style.setProperty('inset-inline-start', `${anchorResult.pageX}px`);\n surface.style.setProperty('margin', '0');\n surface.style.setProperty('transform-origin', `${anchorResult.transformOriginY} ${anchorResult.transformOriginX}`);\n surface.scrollIntoView();\n },\n /**\n * @param {MouseEvent|PointerEvent|HTMLElement|Element} source\n * @return {boolean} handled\n */\n showModal(source) {\n if (this.open) return false;\n this.modal = true;\n if (supportsHTMLDialogElement) {\n this._dialog.showModal();\n this._isNativeModal = true;\n }\n return this.showPopup(source);\n },\n /**\n * @param {MouseEvent|PointerEvent|HTMLElement|Element} source\n * @return {boolean} handled\n */\n showPopup(source) {\n if (this.open) return false;\n this.open = true;\n\n const previousFocus = source instanceof HTMLElement ? source : document.activeElement;\n this.updateMenuPosition(source);\n if (supportsHTMLDialogElement && !this._dialog.open) {\n this._dialog.show();\n }\n\n const newState = { hash: Math.random().toString(36).slice(2, 18) };\n let previousState = null;\n\n if (!window.history.state) {\n // Create new previous state\n window.history.replaceState({\n hash: Math.random().toString(36).slice(2, 18),\n }, document.title);\n }\n previousState = window.history.state;\n const scrollRestoration = window.history.scrollRestoration;\n window.history.scrollRestoration = 'manual';\n window.history.pushState(newState, document.title);\n console.debug('Menu pushed page');\n window.addEventListener('popstate', onPopState);\n window.addEventListener('beforeunload', onBeforeUnload);\n\n window.addEventListener('resize', onWindowResize);\n window.addEventListener('scroll', onWindowResize);\n\n OPEN_MENUS.push({\n element: this,\n previousFocus,\n state: newState,\n previousState,\n originalEvent: source,\n scrollRestoration,\n });\n\n this.focus();\n\n return true;\n },\n /**\n * @param {boolean} returnFocus Return focus to element focused during open\n * @return {boolean} handled\n */\n close(returnFocus = true) {\n if (!this.open) return false;\n if (this._closing) return false;\n this._closing = true;\n this.modal = false;\n if (this._isNativeModal) {\n this._isNativeModal = false;\n } else {\n const main = document.querySelector('main');\n if (main) {\n main.removeAttribute('aria-hidden');\n }\n }\n // if (this.dialogElement.getAttribute('aria-hidden') === 'true') return false;\n if (supportsHTMLDialogElement && this._dialog.open) {\n const previousFocus = document.activeElement;\n // Closing a native dialog will return focus automatically.\n this._dialog.close();\n if (!attemptFocus(previousFocus, { preventScroll: true })) {\n document.activeElement?.blur?.();\n }\n }\n\n // Will invoke observed attribute change: ('aria-hidden', 'true');\n\n this.open = false;\n this.dispatchEvent(new Event('close'));\n\n const len = OPEN_MENUS.length;\n for (let i = len - 1; i >= 0; i--) {\n const entry = OPEN_MENUS[i];\n if (entry.element === this) {\n if (entry.state && window.history && window.history.state && entry.state.hash === window.history.state.hash) {\n window.removeEventListener('popstate', onPopState);\n window.history.back();\n // Back does not set state immediately\n // Needed to track submenu\n // TODO: use window.history.go(indexDelta) instead for Safari (not Wekbit) submenu support\n window.history.replaceState(entry.previousState, document.title);\n window.history.scrollRestoration = entry.scrollRestoration || 'auto';\n window.addEventListener('popstate', onPopState);\n } else {\n console.warn('Menu state mismatch?', entry, window.history.state);\n }\n if (returnFocus) {\n entry.previousFocus?.focus?.({ preventScroll: true });\n }\n OPEN_MENUS.splice(i, 1);\n break;\n } else if (this.contains(entry.element)) {\n console.debug('Closing submenu first');\n entry.element.close(false);\n console.debug('Sub menu closed. Continuing...');\n }\n }\n if (!OPEN_MENUS.length) {\n window.removeEventListener('popstate', onPopState);\n window.removeEventListener('beforeunload', onBeforeUnload);\n window.removeEventListener('resize', onWindowResize);\n console.debug('All menus closed');\n }\n this._closing = false;\n return true;\n },\n /**\n * @param {HTMLElement} cascader Element that calls for submenu cascade\n */\n cascade(cascader) {\n this.cascader = cascader;\n this.showPopup(cascader);\n },\n /**\n * @param {MouseEvent|PointerEvent|HTMLElement|Element} source\n * @return {boolean} handled\n */\n show(source) {\n // Auto-select type based on default platform convention\n // Mac OS X / iPad does not expect clickthrough\n if (navigator.userAgent.includes('Mac OS X')) {\n return this.showModal(source);\n }\n return this.showPopup(source);\n },\n })\n .events({\n '~click'(event) {\n if (this !== event.target) return;\n // Clicked self (scrim-like)\n event.stopPropagation();\n this.close(true);\n },\n keydown(event) {\n if (!this.open) return;\n\n switch (event.key) {\n case 'Tab':\n // Hide menu allowing focus to revert to calling element\n // If close is successfully, focus will return to spawning element\n // and browser will then tab from spawning to next.\n // If close is not successful, stop event.\n if (!this.close()) {\n event.stopPropagation();\n event.preventDefault();\n }\n break;\n // Unless menu hiding is cancelled\n case 'ArrowLeft':\n case 'ArrowRight':\n if (!this.submenu) break;\n if (getComputedStyle(this).direction === 'rtl') {\n if (event.key === 'ArrowLeft') break;\n } else if (event.key === 'ArrowRight') break;\n // Fallthrough;\n case 'Escape':\n case 'Esc':\n event.stopPropagation();\n event.preventDefault();\n this.close(true);\n break;\n default:\n }\n },\n focusout(event) {\n if (!this.open) return;\n if (this.modal) return;\n // Wait until end of event loop cycle to see if focus really is lost\n queueMicrotask(() => {\n if (this.matches(':focus-within')) return;\n const activeElement = document.activeElement;\n if (activeElement\n && (this.cascader === activeElement || this.contains(activeElement))) {\n return;\n }\n this.close(false);\n });\n },\n })\n .autoRegister('mdw-menu');\n", "// https://www.w3.org/TR/wai-aria-practices/#menu\n\nimport FormAssociatedMixin from '../mixins/FormAssociatedMixin.js';\n\nimport './Icon.js';\nimport ListOption from './ListOption.js';\n\nexport default class MenuItem extends ListOption\n .mixin(FormAssociatedMixin)\n .extend()\n .set({\n _cascadeTimeout: null,\n CASCADE_TIMEOUT: 500,\n _cascading: false,\n })\n .define({\n type() {\n if (this.radio != null) return 'radio';\n if (this.checkbox != null) return 'checkbox';\n return null;\n },\n })\n .observe({\n /** ID of menu to cascade */\n cascades: 'string',\n /** Can be null */\n _defaultValue: {\n attr: 'value',\n reflect: true,\n nullParser: String,\n empty: null,\n },\n })\n .observe({\n /** Never returns null */\n defaultValue: {\n reflect: false,\n get() {\n return this._defaultValue ?? '';\n },\n /** @param {string} value */\n set(value) {\n this._defaultValue = value;\n },\n },\n value: {\n reflect: false,\n get() {\n return this._defaultValue ?? 'on';\n },\n /**\n * @param {string} value\n * @return {void}\n */\n set(value) {\n this._defaultValue = value;\n },\n },\n })\n .overrides({\n formIPCEvent(event) {\n if (event.target instanceof HTMLFormElement && event.target !== this.form) {\n console.warn('Control.formIPCEvent: Abort from wrong form');\n return;\n }\n if (this.type !== 'radio') {\n console.warn('Control.formIPCEvent: Abort from not radio');\n return;\n }\n const [name, value] = event.detail;\n if (this.name !== name) return;\n if (value === this.value) return;\n if (this.value === '1') {\n console.log('unchecking', this.name, this.value);\n this.selected = false;\n } else {\n this.selected = false;\n }\n },\n })\n .expressions({\n computeTrailingIcon({ trailingIcon, cascades }) {\n if (!trailingIcon && cascades) return 'arrow_right';\n return trailingIcon;\n },\n })\n .methods({\n unscheduleCascade() {\n clearTimeout(this._cascadeTimeout);\n this._cascadeTimeout = null;\n },\n scheduleCascade() {\n if (this._cascadeTimeout) return;\n this._cascadeTimeout = setTimeout(this.cascade.bind(this), this.CASCADE_TIMEOUT);\n },\n cascade() {\n this.unscheduleCascade();\n this._cascading = true;\n document.getElementById(this.cascades)?.cascade?.(this);\n this._cascading = false;\n },\n })\n .on({\n _selectedChanged(oldValue, newValue) {\n console.log('_selectedChanged', oldValue, newValue);\n if (newValue) {\n this.elementInternals.setFormValue(this.value);\n if (this.type === 'radio') {\n this._notifyRadioChange(this.name, this.value);\n }\n } else {\n this.elementInternals.setFormValue(null);\n }\n if (this._selectedDirty) {\n this.dispatchEvent(new Event('change', { bubbles: true }));\n }\n },\n })\n .events({\n mouseenter() {\n if (this.disabledState) return;\n if (document.activeElement !== this) {\n this.focus();\n }\n if (!this.cascades) return;\n this.scheduleCascade();\n },\n mouseout: 'unscheduleCascade',\n '~click'() {\n if (this.disabledState) return;\n if (this.type === 'radio') {\n if (this.required) return;\n this.selected = true;\n } else if (this.type === 'checkbox') {\n if (this.required) return;\n this.selected = !this.selected;\n return;\n }\n\n if (this.cascades) {\n this.cascade();\n }\n },\n keydown(event) {\n if (this.disabledState) return;\n switch (event.key) {\n case 'Enter':\n case ' ':\n event.stopPropagation();\n event.preventDefault();\n this.click();\n break;\n case 'ArrowLeft':\n case 'ArrowRight':\n if (!this.cascades) break;\n if (getComputedStyle(this).direction === 'rtl') {\n if (event.key === 'ArrowRight') break;\n } else if (event.key === 'ArrowLeft') break;\n event.stopPropagation();\n event.preventDefault();\n this.cascade();\n break;\n default:\n }\n },\n /**\n * Closes submenu if focus leaves cascader to something else (sibling menu item)\n * RelatedTarget is unreliable on Webkit\n */\n blur() {\n if (!this.cascades) return;\n if (this._cascading) return;\n const submenuElement = document.getElementById(this.cascades);\n if (submenuElement.matches(':focus-within')) return;\n console.debug('closing submenu via cascader blur');\n submenuElement.close(false);\n },\n })\n .on({\n composed({ inline, html }) {\n const { checkbox: checkboxRef, radio: radioRef, anchor, trailing, trailingIcon } = this.refs;\n checkboxRef.remove();\n radioRef.remove();\n\n anchor.setAttribute('role', inline(({ checkbox, radio }) => {\n if (checkbox != null) return 'menuitemcheckbox';\n if (radio != null) return 'menuitemradio';\n return 'menuitem';\n }));\n\n // MenuItems use checked instead of selected as in list items.\n anchor.setAttribute('ariaChecked', anchor.getAttribute('aria-selected'));\n\n anchor.after(html`\n <mdw-icon id=selection\n _if=${({ checkbox, radio }) => checkbox ?? radio ?? false}\n class=${({ checkbox, radio }) => checkbox || radio || 'leading'}\n selected={selected}>check</mdw-icon>\n `);\n\n trailing.setAttribute('type-style', 'label-large');\n\n trailingIcon.setAttribute('_if', '{computeTrailingIcon}');\n trailingIcon.textContent = '{computeTrailingIcon}';\n },\n })\n .css`\n /* https://m3.material.io/components/menus/specs */\n\n :host {\n gap: 12px;\n\n padding-inline: 12px;\n\n cursor: pointer;\n\n white-space: nowrap;\n }\n\n #content {\n padding-block: calc(4px + (var(--mdw-density) * 2px))\n }\n\n #icon {\n transition-duration: 100ms;\n transition-property: opacity;\n will-change: opacity;\n }\n\n #trailing,\n #icon {\n color: rgb(var(--mdw-color__on-surface-variant));\n }\n\n #selection {\n opacity: 0;\n\n font-size: 18px;\n }\n\n #selection.trailing {\n font-size: 24px;\n }\n\n #selection[selected] {\n opacity: 1;\n }\n\n :host([disabled]) {\n cursor: not-allowed;\n }\n\n #anchor[selected] {\n background-color: transparent;\n color: inherit;\n }\n\n #content[selected] {\n color: inherit;\n }\n `\n .autoRegister('mdw-menu-item')\n .tsClassFix() {\n formResetCallback() {\n this._selected = this.defaultSelected;\n super.formResetCallback();\n }\n}\n", "const IDLE_TIMEOUT_MS = 500;\n\n/**\n * @param {typeof import('../core/CustomElement.js').default} Base\n */\nexport default function ScrollListenerMixin(Base) {\n return Base\n .extend()\n .observe({\n scrollListenerPositionX: { type: 'float', empty: 0, reflect: false },\n scrollListenerPositionY: { type: 'float', empty: 0, reflect: false },\n })\n .set({\n /** @type {WeakRef<EventTarget>} */\n _scroller: null,\n /** @type {EventListener} */\n _scrollerScrollListener: null,\n /** @type {EventListener} */\n _scrollerResizeListener: null,\n _scrollDebounce: null,\n })\n .methods({\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n onScrollIdle() {},\n\n /** @param {Event} event */\n onScrollerScroll(event) {\n this.scrollListenerPositionY = (event.currentTarget === window)\n ? window.scrollY\n : /** @type {HTMLElement} */ (event.currentTarget).scrollTop;\n\n this.scrollListenerPositionX = (event.currentTarget === window)\n ? window.scrollX\n : /** @type {HTMLElement} */ (event.currentTarget).scrollLeft;\n\n clearTimeout(this._scrollDebounce);\n this._scrollDebounce = setTimeout(() => this.onScrollIdle(), IDLE_TIMEOUT_MS);\n },\n\n /** @param {Event} event */\n onScrollerResize(event) {},\n\n /**\n * @param {EventTarget} [scroller]\n * @return {boolean}\n */\n startScrollListener(scroller) {\n scroller ??= this.offsetParent;\n if (!scroller) return false;\n\n if (scroller === document.body) {\n // console.log('scroller is body, attaching to window');\n scroller = window;\n }\n\n this._scroller = new WeakRef(scroller);\n this._scrollerScrollListener = this.onScrollerScroll.bind(this);\n this._scrollerResizeListener = this.onScrollerResize.bind(this);\n scroller.addEventListener('scroll', this._scrollerScrollListener);\n scroller.addEventListener('resize', this._scrollerResizeListener);\n this.scrollListenerPositionX = 0;\n this.scrollListenerPositionY = 0;\n return true;\n },\n\n getScrollingElementScrollHeight() {\n const element = this.getScroller();\n if (element === window) {\n return document.documentElement.scrollHeight;\n }\n // @ts-expect-error Skip Element cast\n return element.scrollHeight;\n },\n\n getScrollingElementClientHeight() {\n const element = this.getScroller();\n if (element === window) {\n return window.innerHeight;\n }\n // @ts-expect-error Skip Element cast\n return element.clientHeight;\n },\n\n getScroller() {\n return this._scroller.deref();\n },\n\n /**\n * @param {EventTarget} [scroller]\n * @return {boolean}\n */\n clearScrollListener(scroller) {\n scroller ??= this._scroller?.deref();\n if (!scroller) return false;\n if (!this._scrollerScrollListener) return false;\n scroller.removeEventListener('scroll', this._scrollerScrollListener);\n return true;\n },\n });\n}\n", "import './Icon.js';\nimport './Ripple.js';\nimport './Badge.js';\n\nimport CustomElement from '../core/CustomElement.js';\nimport RippleMixin from '../mixins/RippleMixin.js';\nimport ShapeMixin from '../mixins/ShapeMixin.js';\nimport StateMixin from '../mixins/StateMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\n/** @typedef {'charset'|'coords'|'name'|'shape'} DeprecatedHTMLAnchorElementProperties */\n\nexport default class NavItem extends CustomElement\n .mixin(ThemableMixin)\n .mixin(StateMixin)\n .mixin(RippleMixin)\n .mixin(ShapeMixin)\n .extend()\n .set({\n delegatesFocus: true,\n stateLayer: true,\n })\n .observe({\n showLabel: 'string',\n active: 'boolean',\n icon: 'string',\n src: 'string',\n href: 'string',\n badge: 'string',\n ariaLabel: 'string', // watch attribute and emit callback\n })\n .methods({\n focus(options) {\n this.refs.anchor.focus(options);\n },\n })\n .html/* html */`\n <mdw-icon id=icon aria-hidden=true src={src} active={active}>{icon}</mdw-icon>\n <a id=anchor\n aria-current=${({ active }) => (active ? 'page' : null)}\n aria-describedby=badge\n aria-label={ariaLabel}\n aria-labelledby=${({ ariaLabel }) => (ariaLabel ? null : 'slot')}\n href=${({ href }) => href ?? '#'}>\n </a>\n <slot id=slot active={active} show-label={showLabel} aria-hidden=true></slot>\n <mdw-badge part=badge id=badge badge={badge} show-label={showLabel} aria-hidden=true>{badge}</mdw-badge>\n `\n .on({\n composed({ html }) {\n const { shape, state, rippleContainer } = this.refs;\n shape.append(html`\n <mdw-ripple id=ripple ripple-origin=center keep-alive hold-ripple ripple-state=${({ active }) => ((active) ? null : 'complete')}></mdw-ripple>\n ${state}\n ${rippleContainer}\n `);\n shape.setAttribute('active', '{active}');\n shape.removeAttribute('color');\n },\n })\n .css`\n /* https://m3.material.io/components/navigation-bar/specs */\n /* https://m3.material.io/components/navigation-drawer/specs */\n /* https://m3.material.io/components/navigation-rail/specs */\n\n :host {\n --mdw-badge__scale: 0;\n --mdw-shape__size: var(--mdw-shape__full);\n --mdw-nav-item__offset-y: 0;\n position: relative;\n\n display: grid;\n align-content: center;\n align-items: center;\n grid-auto-flow: row;\n grid-auto-rows: minmax(20px, min-content);\n grid-template-rows: [icon] minmax(32px, 1fr);\n grid-template-columns: [icon] minmax(56px, 1fr);\n\n justify-items: center;\n row-gap: 4px;\n\n box-sizing: border-box;\n min-block-size: 56px;\n\n padding-inline: 0;\n\n cursor: pointer;\n /* stylelint-disable-next-line plugin/no-unsupported-browser-features */\n user-select: none;\n\n font: var(--mdw-typescale__label-large__font);\n letter-spacing: var(--mdw-typescale__label-large__letter-spacing);\n\n text-align: center;\n }\n\n :host(:not([color])) {\n --mdw-ink: var(--mdw-color__on-secondary-container);\n --mdw-bg: var(--mdw-color__secondary-container);\n }\n\n :host([color]) {\n background-color: transparent;\n color: rgb(var(--mdw-color__on-surface-variant));\n }\n\n #slot {\n display: contents;\n align-items: center;\n flex-direction: column;\n grid-area: label;\n justify-content: center;\n\n grid-column: 1 /4;\n\n grid-row: 2;\n\n flex: 1;\n\n cursor: inherit;\n outline: none;\n\n transform: translateY(var(--mdw-nav-item__offset-y));\n\n color: rgb(var(--mdw-color__on-surface-variant));\n\n transition: opacity, color, transform 200ms;\n will-change: opacity, transform;\n }\n\n #anchor {\n position: absolute;\n inset: 0;\n }\n\n #shape {\n position: absolute;\n /* stylelint-disable-next-line liberty/use-logical-spec */\n top: 50%;\n /* stylelint-disable-next-line liberty/use-logical-spec */\n left: 50%;\n\n block-size: 100%;\n inline-size: 100%;\n max-inline-size: 56px;\n\n grid-column: icon;\n grid-row: 1 / 1;\n\n transform: translateX(-50%) translateY(-50%) translateY(var(--mdw-nav-item__offset-y));\n z-index: 0;\n\n background-color: transparent;\n\n transition: transform 200ms;\n will-change: transform;\n }\n\n #icon {\n position: relative;\n align-self: center;\n\n grid-area: icon;\n\n transform: translateY(var(--mdw-nav-item__offset-y));\n z-index: 3;\n\n color: rgb(var(--mdw-color__on-surface-variant));\n\n font-size: 24px;\n font-variation-settings: 'FILL' 0;\n\n transition: transform 200ms;\n will-change: transform;\n }\n\n #state {\n z-index: 2;\n }\n\n #badge {\n --mdw-badge__scale: 0;\n position: absolute;\n inset-block-start: 50%;\n inset-inline-start: 50%;\n\n overflow: hidden;\n\n max-inline-size: 50%;\n grid-column: 1 / 4;\n\n grid-row: 1 / 2;\n\n transform: translateY(-100%) translateY(var(--mdw-nav-item__offset-y)) scale(var(--mdw-badge__scale));\n z-index: 4;\n\n text-align: start;\n text-overflow: ellipsis;\n text-transform: none;\n white-space: nowrap;\n word-break: normal;\n\n transition: transform 200ms;\n will-change: transform;\n }\n\n #badge[badge] {\n --mdw-badge__scale: 1;\n }\n\n #ripple {\n opacity: 1;\n\n color: rgb(var(--mdw-bg));\n }\n\n #ripple-container {\n z-index:1;\n }\n\n #shape[active] {\n color: rgb(var(--mdw-ink));\n }\n\n #icon[active] {\n color: rgb(var(--mdw-ink));\n\n font-variation-settings: 'FILL' 1;\n }\n\n #slot[active] {\n color: inherit;\n }\n\n :host([show-label]) {\n --mdw-nav-item__offset-y: 12px;\n }\n\n :host([show-label=\"active\"][active]) {\n --mdw-nav-item__offset-y: 0;\n }\n `\n .childEvents({\n anchor: {\n click() {\n /* Prevent Default (false) if no href */\n return this.href != null;\n },\n keydown({ key, repeat }) {\n if (key !== ' ') return true;\n if (!repeat) this.click();\n return false;\n },\n },\n })\n .autoRegister('mdw-nav-item')\n .tsClassFix() {\n addRipple(...args) {\n if (!this.active) return null;\n return super.addRipple(...args);\n }\n}\n", "import NavItem from './NavItem.js';\nimport Surface from './Surface.js';\n\nexport default Surface\n .extend()\n .css`\n /* https://m3.material.io/components/navigation-bar/specs */\n /* https://m3.material.io/components/navigation-drawer/specs */\n /* https://m3.material.io/components/navigation-rail/specs */\n\n :host {\n --mdw-surface__tint: var(--mdw-surface__tint__2);\n --mdw-surface__tint__raised: var(--mdw-surface__tint__2);\n --mdw-ink: var(--mdw-color__on-surface);\n --mdw-bg: var(--mdw-color__surface);\n\n z-index:2;\n\n color: rgb(var(--mdw-ink));\n\n font: var(--mdw-typescale__label-medium__font);\n letter-spacing: var(--mdw-typescale__label-medium__letter-spacing);\n }\n `\n .set({\n elevated: true,\n color: 'surface',\n })\n .events({\n '~click'(event) {\n // Abort if not child\n if (event.target === this) return;\n if (event.target instanceof NavItem === false) return;\n for (const el of this.querySelectorAll('*')) {\n if (el instanceof NavItem === false) continue;\n el.active = (el === event.target);\n }\n },\n })\n .autoRegister('mdw-nav');\n", "import { ELEMENT_STYLER_TYPE } from '../core/customTypes.js';\nimport ScrollListenerMixin from '../mixins/ScrollListenerMixin.js';\n\nimport Nav from './Nav.js';\n\nexport default Nav\n .mixin(ScrollListenerMixin)\n .observe({\n hideOnScroll: 'boolean',\n _translateY: { type: 'float', empty: 0 },\n _transition: { empty: 'none' },\n })\n .observe({\n _positioningStyle: {\n ...ELEMENT_STYLER_TYPE,\n get({ _translateY, _transition }) {\n return {\n styles: {\n transform: `translateY(${_translateY}px)`,\n transition: _transition,\n },\n };\n },\n },\n })\n .methods({\n onScrollerResize() {\n console.log('onScrollerResize');\n // Chrome Bug: When window resizes bottom sticky needs to be recomputed\n // Force style recalculation\n this.style.setProperty('bottom', 'auto');\n // eslint-disable-next-line no-unused-expressions\n this.clientHeight;\n this.style.removeProperty('bottom');\n this.propChangedCallback('scrollListenerPositionY', this.scrollListenerPositionY, this.scrollListenerPositionY);\n },\n onScrollIdle() {\n const max = this.scrollHeight;\n const visibility = (max - this._translateY) / max;\n if (visibility <= 0) return;\n if (visibility >= 1) return;\n if (visibility >= 0.5) {\n // Reveal all\n this._translateY = 0;\n this._transition = 'transform 250ms ease-in';\n } else {\n this._translateY = max;\n this._transition = 'transform 200ms ease-out';\n }\n },\n })\n .css`\n /* https://m3.material.io/components/navigation-bar/specs */\n\n :host {\n position: sticky;\n inset-block-end: 0;\n order:1; /* Nav Bars are at top of tab order, but bottom of page */\n\n display: grid;\n align-content: flex-start;\n align-items: flex-start;\n gap: 8px;\n grid-auto-columns: minmax(48px, 1fr);\n grid-auto-flow: column;\n\n overflow: hidden; /* Don't expand viewport when contents translates */\n\n box-sizing: border-box;\n min-block-size: 80px;\n inline-size: 100%;\n\n flex-shrink: 0;\n\n transform: translateY(0);\n\n box-shadow: none;\n\n text-align: center;\n\n will-change: transform;\n }\n\n #slot {\n pointer-events: auto;\n }\n\n `\n .on({\n connected() {\n if (this.hideOnScroll) {\n if (this.offsetParent) {\n this.startScrollListener(this.offsetParent ?? window);\n } else {\n const resizeObserver = new ResizeObserver(() => {\n this.startScrollListener(this.offsetParent ?? window);\n resizeObserver.disconnect();\n });\n resizeObserver.observe(this);\n }\n }\n },\n disconnected() {\n this.clearScrollListener();\n },\n scrollListenerPositionYChanged(oldValue, newValue) {\n if (!this.hideOnScroll) return;\n const delta = newValue - oldValue;\n const rate = 1;\n const shift = rate * delta;\n\n const bottom = this.getScrollingElementScrollHeight() - this.getScrollingElementClientHeight();\n const breakpoint = bottom - this.scrollHeight;\n let max = this.scrollHeight;\n if (newValue >= breakpoint) {\n // Scrolling to bottom always shows Nav Bar (ensures content isn't occluded)\n max -= (newValue - breakpoint);\n }\n this._transition = 'none';\n this._translateY = Math.max(0, Math.min(this._translateY + shift, max));\n },\n })\n .autoRegister('mdw-nav-bar');\n", "import NavItem from './NavItem.js';\n\nexport default NavItem\n .extend()\n .css`\n /* https://m3.material.io/components/navigation-bar/specs */\n /* https://m3.material.io/components/navigation-drawer/specs */\n /* https://m3.material.io/components/navigation-rail/specs */\n\n :host {\n grid-auto-rows: minmax(20px, min-content);\n grid-template-rows: [icon] minmax(32px, 1fr);\n grid-template-columns: auto [icon] minmax(56px, 1fr) auto;\n\n padding-block: 12px; /* Spec 16px bottom is based on 1em not 1lh */\n }\n\n #slot {\n display: block;\n }\n\n :host(:empty) {\n font-size: 0;\n line-height: 0;\n }\n\n #slot[show-label] {\n grid-column: 1 /4;\n\n grid-row: 2;\n\n opacity: 0;\n }\n\n #shape {\n grid-column: 2;\n grid-row: 1 / 1;\n }\n\n #slot[show-label=\"never\"] {\n block-size: 0;\n }\n\n #slot[show-label=\"active\"][active] {\n opacity: 1;\n }\n\n `\n .autoRegister('mdw-nav-bar-item');\n", "import Nav from './Nav.js';\n\nexport default Nav\n .extend()\n .observe({\n align: { value: /** @type {'start'|'center'|'end'} */ (null) },\n })\n .on({\n composed({ html }) {\n const { slot } = this.refs;\n slot.before(html`<slot id=start name=start></slot>`);\n slot.setAttribute('align', '{align}');\n },\n })\n .css`\n /* https://m3.material.io/components/navigation-rail/specs */\n\n :host{\n display: grid;\n align-content: flex-start;\n flex-direction: column;\n grid-template-rows: auto minmax(0,1fr);\n grid-template-columns: 80px;\n justify-items: stretch;\n\n text-align: center;\n }\n\n #start {\n display: flex;\n align-items: center;\n flex-direction: column;\n gap: 12px;\n\n padding-block-start: 12px;\n\n }\n\n #slot {\n align-self: center;\n\n display: flex;\n align-items: stretch;\n flex-direction: column;\n gap: 12px;\n overflow-x: clip;\n overflow-y: auto;\n\n box-sizing: border-box;\n\n inline-size: 100%;\n\n padding-block: 12px;\n }\n\n #slot[align=\"start\"] {\n align-self: flex-start;\n }\n\n #slot[align=\"end\"] {\n align-self: flex-end;\n }\n\n `\n .autoRegister('mdw-nav-rail');\n", "import NavRail from './NavRail.js';\n\nexport default NavRail\n .extend()\n .observe({\n shapeEnd: {\n type: 'boolean',\n empty: true,\n },\n })\n .css`\n /* https://m3.material.io/components/navigation-drawer/specs */\n\n :host([open]) {\n --mdw-surface__tint: var(--mdw-surface__tint__0);\n --mdw-surface__tint__raised: var(--mdw-surface__tint__1);\n --mdw-shape__size: var(--mdw-shape__large, 16px);\n --mdw-shape__size__top-start-size: 0px;\n --mdw-shape__size__bottom-start-size: 0px;\n\n --mdw-nav-item__badge__position: static;\n --mdw-nav-item__badge__transform: none;\n --mdw-nav-item__badge__grid-area: badge;\n --mdw-nav-item__label__padding-block: 18px;\n --mdw-nav-item__label__padding-inline: 52px 0;\n --mdw-nav-item__anchor__display: block;\n --mdw-nav-item__indicator__grid-area: auto;\n\n display: block;\n grid-template-rows: min-content;\n grid-template-columns: minmax(360px, min-content);\n\n min-inline-size: 360px;\n padding-inline: 12px;\n\n box-shadow: none;\n\n }\n\n #slot {\n gap: 0;\n }\n\n `\n .autoRegister('mdw-nav-drawer');\n", "import NavItem from './NavItem.js';\n\nexport default NavItem\n .extend()\n .css`\n /* https://m3.material.io/components/navigation-bar/specs */\n /* https://m3.material.io/components/navigation-drawer/specs */\n /* https://m3.material.io/components/navigation-rail/specs */\n\n :host {\n align-self: stretch;\n\n display: grid;\n display: flex;\n align-items: center;\n gap: 12px;\n grid-template:\n \"icon label badge\" minmax(56px, min-content)\n / 24px 1fr minmax(0, min-content);\n justify-items: flex-start;\n\n padding-inline: 16px 24px;\n }\n\n #icon {\n grid-area: icon;\n }\n\n #slot {\n display: block;\n\n text-align: start;\n }\n\n :host([active]) {\n color: rgb(var(--mdw-ink));\n }\n\n #shape {\n max-inline-size: none;\n grid-column: auto;\n grid-row: 1 / 2;\n }\n\n #badge-text {\n z-index: 1;\n }\n `\n .on({\n composed({ html }) {\n this.refs.badge.replaceWith(html`<span id=\"badge-text\">{badge}</span>`);\n },\n })\n .autoRegister('mdw-nav-drawer-item');\n", "/* https://m3.material.io/components/navigation-rail/specs */\n\nimport NavItem from './NavItem.js';\n\nexport default NavItem\n .extend()\n .css`\n :host {\n grid-auto-flow: row;\n grid-auto-rows: minmax(20px, min-content);\n grid-template-rows: [icon] minmax(32px, 1fr);\n grid-template-columns: [icon] minmax(56px, 1fr);\n\n padding-inline: 12px;\n }\n\n #slot {\n display: contents;\n overflow-wrap: anywhere;\n\n word-break: break-all;\n word-break: break-word;\n }\n\n #badge {\n max-inline-size:40px;\n grid-column: 1 / 2;\n }\n `\n .autoRegister('mdw-nav-rail-item');\n", "import CustomElement from '../core/CustomElement.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\nexport default CustomElement\n .mixin(ThemableMixin)\n .extend()\n .observe({\n columns: 'integer',\n flexible: 'boolean',\n fixed: 'boolean',\n split: 'boolean',\n navDrawer: 'boolean',\n navRail: 'boolean',\n })\n .html/* html */`\n <slot id=slot></slot>\n `\n .css`\n /* https://m2.material.io/design/layout/responsive-layout-grid.html#columns-gutters-and-margins */\n /*\n * Window breakpoints\n * Compact (0 <= width < 600px):\n * * Single: 100vw - padding\n * * Padding: 16px\n * * Spacer: 0 (none)\n * Medium (600px <= width < 840px)\n * * Single: 100vw - padding - (?navrail)\n * * [Fixed]: 360px\n * * [Flexable]: 100vw - 360px - spacer - padding\n * * [Split] 50vw - ((padding + spacer) / 2)\n * * Padding: 24px\n * * Spacer: 24px\n * Expanded (840px <= width)\n * * Single: 100vw - padding - (?navrail | ?navdrawer)\n * * [Fixed] 360px\n * * [Flexable] 100vw - 360px - spacer - padding - (?navrail | ?navdrawer)\n * * [Split] 50vw - ((padding + spacer + (?navrail | ?navdrawer)) / 2)\n * * Padding: 24px\n * * Spacer: 24px\n *\n * | Screen size | Margin | Body | Layout columns |\n * |---------------------|---------|---------|----------------|\n * | Extra-small (phone) | | | |\n * | 0-631dp | 16dp | Scaling | 4 |\n * | 632 - 647 | Scaling | 600dp | 8 |\n * | Small (tablet) | | | |\n * | 648-887 | 24dp | Scaling | 8 |\n * | 888-1239 | Scaling | 840dp | 12 |\n * | Medium (laptop) | | | |\n * | 1240-1439 | 200dp | Scaling | 12 |\n * | Large (desktop) | | | |\n * | 1440+ | Scaling | 1040 | 12 |\n *\n *\n * Column count is pane-based, not window based requiring newly computed values.\n * Gutters are irrelevant to pane sizing.\n * Nav Rail is ~80px.\n * Nav Drawer is ~360px.\n * Padding and spacers are set by pane's parent.\n * Avoid using CSS Variables because panes are at top of document tree. https://bugs.chromium.org/p/chromium/issues/detail?id=1056209\n * Container queries would reduce code considerably.\n */\n\n /* Compact */\n :host {\n display: grid;\n align-content: flex-start;\n gap: 16px;\n grid-auto-flow: row;\n grid-template-columns: repeat(4, 1fr);\n\n max-inline-size: 600px;\n\n flex: 1;\n\n transition-duration: 200ms;\n /* stylelint-disable-next-line liberty/use-logical-spec */\n transition-property: visibility, width, max-inline-size;\n }\n\n /* Will set 8col when window is 600px + padding (2x16) */\n /* Will set 12col when window is 840px + padding (2x24) */\n @media screen and (min-width: 632px) { :host { grid-template-columns: repeat(8, 1fr); } }\n @media screen and (min-width: 888px) { :host { grid-template-columns: repeat(12, 1fr); } }\n\n /* Will cap to 840px when window is 600px + padding (2x24px) */\n /* Will cap to 1040px when window is 840px + padding (2x200px) */\n @media screen and (min-width: 648px) { :host { max-inline-size: 840px } }\n @media screen and (min-width: 1240px) { :host { max-inline-size: 1040px; } }\n\n /* NAVRAIL */\n\n :host([nav-rail]) {\n grid-template-columns: repeat(4, 1fr);\n\n max-inline-size: 600px;\n }\n\n /* Will set 8col when window is 600px + padding (2x24) + navrail (80) */\n /* Will set 12col when window is 840px + padding (2x24) + navrail (80) */\n @media screen and (min-width: 728px) { :host([nav-rail]) { grid-template-columns: repeat(8, 1fr); } }\n @media screen and (min-width: 968px) { :host([nav-rail]) { grid-template-columns: repeat(12, 1fr); } }\n\n /* Will cap to 840px when window is 600px + padding (2x24px) + navrail (80) */\n /* Will cap to 1040px when window is 840px + padding (2x200px) + navrail (80) */\n @media screen and (min-width: 728px) { :host([nav-rail]) { max-inline-size: 840px } }\n @media screen and (min-width: 1320px) { :host([nav-rail]) { max-inline-size: 1040px; } }\n\n /* NAVDRAWER */\n\n :host([nav-drawer]) {\n grid-template-columns: repeat(4, 1fr);\n\n max-inline-size: 600px;\n }\n\n /* Will set 8col when window is 600px + padding (2x24) + navdrawer (360) */\n /* Will set 12col when window is 840px + padding (2x24) + navdrawer (360) */\n @media screen and (min-width: 1008px) { :host([nav-rail]) { grid-template-columns: repeat(8, 1fr); } }\n @media screen and (min-width: 1248px) { :host([nav-rail]) { grid-template-columns: repeat(12, 1fr); } }\n\n /* Will cap to 840px when window is 600px + padding (2x24px) + navrail (360) */\n /* Will cap to 1040px when window is 840px + padding (2x200px) + navrail (360) */\n @media screen and (min-width: 1008px) { :host([nav-rail]) { max-inline-size: 840px } }\n @media screen and (min-width: 1600px) { :host([nav-rail]) { max-inline-size: 1040px; } }\n\n /* FLEXIBLE */\n\n :host([flexible]) {\n grid-template-columns: repeat(4, 1fr);\n\n max-inline-size: 600px;\n }\n\n /* Will set 8col when window is 600px + padding (2x24) + spacer (24) + fixed (360) */\n /* Will set 12col when window is 840px + padding (2x24) + spacer (24) + fixed (360) */\n @media screen and (min-width: 1032px) { :host([flexible]) { grid-template-columns: repeat(8, 1fr); } }\n @media screen and (min-width: 1272px) { :host([flexible]) { grid-template-columns: repeat(12, 1fr); } }\n\n /* Will cap to 840px when window is 600px + padding (2x24px) + spacer (24) + fixed (360) */\n /* Will cap to 1040px when window is 840px + padding (2x200px) + spacer (24) + fixed (360) */\n @media screen and (min-width: 1032px) { :host([flexible]) { max-inline-size: 840px } }\n @media screen and (min-width: 1624px) { :host([flexible]) { max-inline-size: 1040px; } }\n\n /* FLEXIBLE + NAV RAIL */\n\n :host([flexible]:where([nav-rail])) {\n grid-template-columns: repeat(4, 1fr);\n\n max-inline-size: 600px;\n }\n\n /* Will set 8col when window is 600px + padding (2x24) + spacer (24) + fixed (360) + navrail (80) */\n /* Will set 12col when window is 840px + padding (2x24) + spacer (24) + fixed (360) + navrail (80) */\n @media screen and (min-width: 1112px) { :host([flexible]:where([nav-rail])) { grid-template-columns: repeat(8, 1fr); } }\n @media screen and (min-width: 1352px) { :host([flexible]:where([nav-rail])) { grid-template-columns: repeat(12, 1fr); } }\n\n /* Will cap to 840px when window is 600px + padding (2x24px) + spacer (24) + fixed (360) + navrail (80) */\n /* Will cap to 1040px when window is 840px + padding (2x200px) + spacer (24) + fixed (360) + navrail (80) */\n @media screen and (min-width: 1112px) { :host([flexible]:where([nav-rail])) { max-inline-size: 840px } }\n @media screen and (min-width: 1704px) { :host([flexible]:where([nav-rail])) { max-inline-size: 1040px; } }\n\n /* FLEXIBLE + NAV DRAWER */\n\n :host([flexible]:where([nav-drawer])) {\n grid-template-columns: repeat(4, 1fr);\n\n max-inline-size: 600px;\n }\n\n /* Will set 8col when window is 600px + padding (2x24) + spacer (24) + fixed (360) + navdrawer (360) */\n /* Will set 12col when window is 840px + padding (2x24) + spacer (24) + fixed (360) + navdrawer (360) */\n @media screen and (min-width: 1392px) { :host([flexible]:where([nav-drawer])) { grid-template-columns: repeat(8, 1fr); } }\n @media screen and (min-width: 1632px) { :host([flexible]:where([nav-drawer])) { grid-template-columns: repeat(12, 1fr); } }\n\n /* Will cap to 840px when window is 600px + padding (2x24px) + spacer (24) + fixed (360) + navdrawer (360) */\n /* Will cap to 1040px when window is 840px + padding (2x200px) + spacer (24) + fixed (360) + navdrawer (360) */\n @media screen and (min-width: 1392px) { :host([flexible]:where([nav-drawer])) { max-inline-size: 840px } }\n @media screen and (min-width: 1984px) { :host([flexible]:where([nav-drawer])) { max-inline-size: 1040px; } }\n\n /* SPLIT */\n\n :host([split]) {\n grid-template-columns: repeat(4, 1fr);\n\n max-inline-size: 600px;\n }\n\n /* Will set 8col when window is 600px + padding (2x24) + spacer (24) + split (600) */\n /* Will set 12col when window is 840px + padding (2x24) + spacer (24) + split (840) */\n @media screen and (min-width: 1272px) { :host([split]) { grid-template-columns: repeat(8, 1fr); } }\n @media screen and (min-width: 1752px) { :host([split]) { grid-template-columns: repeat(12, 1fr); } }\n\n /* Will cap to 840px when window is 600px + padding (2x24px) + spacer (24) + split (600) */\n /* Will cap to 1040px when window is 840px + padding (2x200px) + spacer (24) + split (840) */\n @media screen and (min-width: 1272px) { :host([split]) { max-inline-size: 840px } }\n @media screen and (min-width: 2104px) { :host([split]) { max-inline-size: 1040px; } }\n\n /* SPLIT + NAVRAIL */\n\n :host([split]:where([nav-rail])) {\n grid-template-columns: repeat(4, 1fr);\n\n max-inline-size: 600px;\n }\n\n /* Will set 8col when window is 600px + padding (2x24) + spacer (24) + split (600) + navrail (80) */\n /* Will set 12col when window is 840px + padding (2x24) + spacer (24) + split (840) + navrail (80) */\n @media screen and (min-width: 1352px) { :host([split]:where([nav-rail])) { grid-template-columns: repeat(8, 1fr); } }\n @media screen and (min-width: 1832px) { :host([split]:where([nav-rail])) { grid-template-columns: repeat(12, 1fr); } }\n\n /* Will cap to 840px when window is 600px + padding (2x24px) + spacer (24) + split (600) + navrail (80) */\n /* Will cap to 1040px when window is 840px + padding (2x200px) + spacer (24) + split (840) + navrail (80) */\n @media screen and (min-width: 1352px) { :host([split]:where([nav-rail])) { max-inline-size: 840px } }\n @media screen and (min-width: 2184px) { :host([split]:where([nav-rail])) { max-inline-size: 1040px; } }\n\n /* SPLIT + NAVDRAWER */\n\n :host([split]:where([nav-drawer])) {\n grid-template-columns: repeat(4, 1fr);\n\n max-inline-size: 600px;\n }\n\n /* Will set 8col when window is 600px + padding (2x24) + spacer (24) + split (600) + navdrawer (360) */\n /* Will set 12col when window is 840px + padding (2x24) + spacer (24) + split (840) + navdrawer (360) */\n @media screen and (min-width: 1632px) { :host([split]:where([nav-drawer])) { grid-template-columns: repeat(8, 1fr); } }\n @media screen and (min-width: 2112px) { :host([split]:where([nav-drawer])) { grid-template-columns: repeat(12, 1fr); } }\n\n /* Will cap to 840px when window is 600px + padding (2x24px) + spacer (24) + split (600) + navdrawer (360) */\n /* Will cap to 1040px when window is 840px + padding (2x200px) + spacer (24) + split (840) + navdrawer (360) */\n @media screen and (min-width: 1632px) { :host([split]:where([nav-drawer])) { max-inline-size: 840px } }\n @media screen and (min-width: 2464px) { :host([split]:where([nav-drawer])) { max-inline-size: 1040px; } }\n\n :host([full-width]) {\n max-inline-size: none;\n }\n\n /** FIXED **/\n\n :host([fixed]) {\n grid-template-columns: repeat(4, 1fr);\n\n inline-size:360px;\n }\n\n @media screen and (max-width: 600px) {\n :host(:nth-of-type(2)) {\n display: none;\n }\n }\n /* Will cap to 360px when window is 360px + padding (2x24px) + spacer (24) + 360px */\n @media screen and (min-width: 792px) {\n :host([fixed]) {\n max-inline-size: 360px\n }\n }\n\n #scrim {\n position: absolute;\n inset: 0;\n\n grid-area: auto;\n }\n\n #slot::slotted(*) { grid-column: 1 / none }\n #slot::slotted([colspan=\"1\"]) { grid-column-end: span 1; }\n #slot::slotted([colspan=\"2\"]) { grid-column-end: span 2; }\n #slot::slotted([colspan=\"3\"]) { grid-column-end: span 3; }\n #slot::slotted([colspan=\"4\"]) { grid-column-end: span 4; }\n #slot::slotted([colspan=\"5\"]) { grid-column-end: span 5; }\n #slot::slotted([colspan=\"6\"]) { grid-column-end: span 6; }\n #slot::slotted([colspan=\"7\"]) { grid-column-end: span 7; }\n #slot::slotted([colspan=\"8\"]) { grid-column-end: span 8; }\n #slot::slotted([colspan=\"9\"]) { grid-column-end: span 9; }\n #slot::slotted([colspan=\"10\"]) { grid-column-end: span 10; }\n #slot::slotted([colspan=\"11\"]) { grid-column-end: span 11; }\n #slot::slotted([colspan=\"12\"]) { grid-column-end: span 12; }\n\n `\n .autoRegister('mdw-pane');\n", "/* https://m3.material.io/components/progress-indicators/specs */\n\nimport CustomElement from '../core/CustomElement.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\n// https://html.spec.whatwg.org/multipage/form-elements.html#the-progress-element\n\nexport default CustomElement\n .mixin(ThemableMixin)\n .extend()\n .observe({\n circle: 'boolean',\n value: 'float',\n max: 'float',\n autoHide: 'boolean',\n _determinateStyle: 'string',\n })\n .observe({\n _valueAsFraction: {\n type: 'float',\n get({ value, max }) {\n return (value / (max || 100));\n },\n changedCallback(oldValue, newValue) {\n this._determinateStyle = `\n --previous:${oldValue ?? newValue ?? 0};\n --value:${newValue ?? 0};\n `;\n },\n },\n })\n .define({\n position() {\n return /** @type {HTMLProgressElement} */ (this.refs.progress).position;\n },\n labels() {\n return /** @type {HTMLProgressElement} */ (this.refs.progress).labels;\n },\n })\n .html/* html */`\n <div id=determinate style=\"{_determinateStyle}\">\n <progress id=progress value={value} max={max} circle={circle}></progress>\n <div _if={circle} id=circle>\n <div id=semi1 class=semi></div>\n <div id=semi2 class=semi></div>\n </div>\n </div>\n <div _if={!value} id=indeterminate>\n <div _if={!circle} id=indeterminate-line>\n <div id=line1 class=line value={value}></div>\n <div id=line2 class=line value={value}></div>\n </div>\n <div _if={circle} id=indeterminate-circle>\n <div id=arc2 class=arc></div>\n <div id=arc3 class=arc></div>\n <div id=arc4 class=arc></div>\n </div>\n </div>\n `\n .css`\n /* Base Styles */\n\n :host {\n --mdw-bg: var(--mdw-color__surface-variant);\n --mdw-ink: var(--mdw-color__primary);\n --mdw-progress__opacity__duration: 500ms;\n position: relative;\n\n display: inline-block;\n overflow: hidden;\n vertical-align: middle;\n\n min-block-size: 4px;\n inline-size: 100%;\n\n opacity: 1;\n\n background-color: rgb(var(--mdw-bg));\n color: rgb(var(--mdw-ink));\n\n transition: opacity 500ms 275ms;\n }\n\n :host([auto-hide]) {\n will-change: opacity;\n }\n\n :host([auto-hide][value=\"100\"]) {\n opacity:0;\n\n transition: opacity 1s 1s;\n }\n\n #determinate {\n --previous: 0;\n --value: 0;\n }\n\n #progress {\n position: absolute;\n inset: 0;\n\n box-sizing: border-box;\n block-size: 100%;\n inline-size: 100%;\n border: none; /* FireFox */\n\n -moz-appearance: none;\n appearance: none;\n\n opacity:0;\n transform: scaleX(var(--value, 0));\n transform-origin: 0 0;\n\n background-color: currentColor;\n color: inherit;\n\n transition: transform 275ms, opacity var(--mdw-progress__opacity__duration);\n will-change: transform, opacity;\n }\n\n #progress::-webkit-progress-bar {\n display: none;\n }\n\n #progress::-moz-progress-bar {\n display: none; /* Doesn't always work */\n\n block-size: 0;\n }\n\n #progress[value] {\n opacity:1;\n transform: scaleX(var(--value, 0));\n }\n `\n .css`\n /* Line Styles */\n\n /* https://github.com/material-components/material-components-android/blob/ed77ab36ccac98df24e55060d58406c5981a9062/lib/java/com/google/android/material/progressindicator/ */\n\n :host {\n --mdw-progress__line1-head__timing: cubic-bezier(0.2, 0.8, 0, 1.0);\n --mdw-progress__line1-tail__timing: cubic-bezier(0.4, 0.0, 1.0, 1.0);\n --mdw-progress__line2-head__timing: cubic-bezier(0.0, 0.65, 0, 1.0);\n --mdw-progress__line2-tail__timing: cubic-bezier(0.1, 0.45, 0, 1.0);\n --mdw-progress__line__duration: 1800ms;\n }\n\n @media (prefers-reduced-motion) {\n :host {\n --mdw-progress__line__duration: 18000ms\n }\n }\n\n .line {\n opacity: 1;\n\n transition: opacity var(--mdw-progress__opacity__duration);\n will-change: opacity;\n }\n\n .line,\n .line::after {\n position: absolute;\n inset: 0;\n\n overflow: hidden;\n\n animation-duration: var(--mdw-progress__line__duration);\n animation-timing-function: linear;\n animation-iteration-count: infinite;\n animation-fill-mode: forwards;\n }\n\n .line::after {\n content: '';\n\n background-color: currentColor;\n\n animation: inherit;\n will-change: transform;\n }\n\n #line1 {\n animation-name: l1h;\n }\n\n #line2 {\n animation-name: l2h;\n }\n\n #line1::after {\n animation-name: l1t;\n }\n\n #line2::after {\n animation-name: l2t;\n }\n\n .line[value] {\n opacity: 0;\n visibility: hidden;\n\n transition: opacity var(--mdw-progress__opacity__duration), visibility 1ms var(--mdw-progress__opacity__duration);\n }\n\n /**\n * L1H = 1267 / +533 = 70.39% - 100%\n * L1T = 1000 / +567 = 55.56% - 87.05%\n * L2H = 0333 / +850 = 18.50% - 65.72%\n * L2T = 0000 / +750 = 0% - 41.67%\n * Total = 1800ms\n *\n * t l1h l1t l2h l2t\n * --------------------------------------\n * 0.0000 0.0000 0.0000 0.0000 0.0000\n * 0.1850 0.0000 0.0000 0.0000 0.5899\n * 0.4167 0.0000 0.0000 0.7374 1.0000\n * 0.5556 0.0000 0.0000 0.9072 1.0000\n * 0.6572 0.0000 0.1544 1.0000 1.0000\n * 0.7039 0.0000 0.2939 1.0000 1.0000\n * 0.8706 0.7918 1.0000 1.0000 1.0000\n * 1.0000 1.0000 1.0000 1.0000 1.0000\n */\n\n @keyframes l1h {\n 0% {\n transform: translateX(0%);\n }\n\n 70.4% {\n transform: translateX(0%);\n\n animation-timing-function: var(--mdw-progress__line1-head__timing);\n }\n\n 100% {\n transform: translateX(100%);\n }\n }\n @keyframes l1t {\n 0% {\n transform: translateX(-100%);\n }\n\n 55.6% {\n transform: translateX(-100%);\n\n animation-timing-function: var(--mdw-progress__line1-tail__timing);\n }\n\n 87.1% {\n transform: translateX(0%);\n }\n\n 100% {\n transform: translateX(0%);\n }\n }\n @keyframes l2h {\n 0% {\n transform: translateX(0%);\n }\n\n 18.5% {\n transform: translateX(0%);\n\n animation-timing-function: var(--mdw-progress__line2-head__timing);\n }\n\n 65.72% {\n transform: translateX(100%);\n }\n\n to {\n transform: translateX(100%);\n }\n }\n @keyframes l2t {\n 0% {\n transform: translateX(-100%);\n\n animation-timing-function: var(--mdw-progress__line2-tail__timing);\n }\n\n 41.67% {\n transform: translateX(0%);\n }\n\n to {\n transform: translateX(0%);\n }\n }\n\n `\n .css`\n /* Circle Styles */\n /** https://github.com/material-components/material-components-android/blob/ed77ab36ccac98df24e55060d58406c5981a9062/lib/java/com/google/android/material/progressindicator/CircularIndeterminateAnimatorDelegate.java */\n\n :host {\n --mdw-progress__circle__timing: cubic-bezier(0.4, 0.0, 0.2, 1);\n --mdw-progress__circle__margin: 4px;\n --mdw-progress__circle__duration: 5400ms;\n --mdw-progress__circle__duration__expand: 667ms;\n --mdw-progress__circle__duration__collapse: 667ms;\n --mdw-progress__circle__duration__fade-in: 333ms;\n --mdw-progress__circle__duration__complete-end: 333ms;\n }\n\n @media (prefers-reduced-motion) {\n :host {\n --mdw-progress__circle__duration: 54000ms;\n }\n }\n\n #circle {\n --startA: min(0.5, var(--previous));\n --endA: min(0.5, var(--value));\n --travelA: max(\n calc(var(--startA) - var(--endA)),\n calc(var(--endA) - var(--startA))\n );\n --delayA: max(0, calc(var(--previous) - 0.5));\n --startB: max(0, calc(var(--previous) - 0.5));\n --endB: max(0, calc(var(--value) - 0.5));\n --travelB: max(\n calc(var(--startB) - var(--endB)),\n calc(var(--endB) - var(--startB))\n );\n --delayB: max(0, 0.5 - calc(var(--previous)));\n\n position: absolute;\n inset: 0;\n }\n\n :host([circle]) {\n block-size: 48px;\n inline-size: 48px;\n }\n\n :host([circle]:not([color])) {\n background-color: transparent;\n }\n\n #progress[circle] {\n visibility: hidden;\n }\n\n .semi {\n position: absolute;\n inset: var(--mdw-progress__circle__margin);\n\n overflow: hidden;\n\n box-sizing: border-box;\n }\n\n #semi1 {\n inset-inline-start: 50%;\n }\n\n #semi2 {\n inset-inline-end: 50%;\n }\n\n .semi::after {\n content: \"\";\n\n position: absolute;\n inset: 0;\n\n box-sizing: border-box;\n border: solid currentcolor 4px;\n\n transform: rotate(var(--rotation));\n\n background-color: transparent;\n border-radius: 50%;\n\n transition: transform 400ms;\n transition-timing-function: linear;\n }\n\n #semi1::after {\n --rotation: min(180deg, calc(var(--value) * 360deg));\n inset-inline-start: -100%;\n\n clip-path: inset(0 50% 0 0);\n\n transition-delay: calc(var(--delayA) * var(--mdw-progress__circle__duration__expand));\n transition-duration: calc(var(--travelA) * var(--mdw-progress__circle__duration__expand));\n }\n\n #semi2::after {\n --rotation: max(0deg, calc(var(--value) * 360deg - 180deg));\n inset-inline-end: -100%;\n\n clip-path: inset(0 0 0 50%);\n\n transition-delay: calc(var(--delayB) * var(--mdw-progress__circle__duration__expand));\n transition-duration: calc(var(--travelB) * var(--mdw-progress__circle__duration__expand));\n }\n\n #indeterminate-circle {\n position: absolute;\n inset: 0;\n\n display: block;\n\n animation: rotate-cw calc(var(--mdw-progress__circle__duration) / 4) linear infinite;\n }\n\n .arc {\n position: absolute;\n inset: var(--mdw-progress__circle__margin);\n\n overflow: hidden;\n\n box-sizing: border-box;\n\n animation: rotate-jump var(--mdw-progress__circle__duration) steps(1,end) infinite;\n }\n\n .arc::after {\n content: \"\";\n\n position: absolute;\n inset: 0;\n\n box-sizing: border-box;\n border: solid currentcolor 4px;\n\n background-color: transparent;\n border-radius: 50%;\n\n animation: grow-shrink calc(var(--mdw-progress__circle__duration) / 4) var(--mdw-progress__circle__timing) infinite;\n }\n\n #arc2 {\n inset-block-end: 50%;\n inset-inline-start: 50%;\n\n transform-origin: 0 100%;\n }\n\n #arc3 {\n inset-block-start: 50%;\n inset-inline-end: 50%;\n\n transform-origin: 100% 0;\n }\n\n #arc4 {\n inset-block-start: 50%;\n inset-inline-start: 50%;\n\n transform-origin: 0 0;\n }\n\n #arc2:after {\n inset-block-end: -100%;\n inset-inline-start: -100%;\n\n clip-path: polygon(0% 0%, 50% 0%, 50% 50%, 100% 50%, 100% 100%, 0% 100%);\n }\n\n #arc3:after {\n inset-block-start: -100%;\n inset-inline-end: -100%;\n\n clip-path: inset(0 50% 50% 0);\n }\n\n #arc4:after {\n inset-block-start: -100%;\n inset-inline-start: -100%;\n\n clip-path: inset(0 50% 0 0);\n }\n\n @keyframes rotate-cw {\n from {\n transform: rotate(0deg);\n }\n\n to {\n transform: rotate(360deg);\n }\n }\n\n @keyframes rotate-jump {\n 0% { transform: scaleX(1) rotate(0deg); }\n\n 12.5% { transform: scaleX(-1) rotate(-270deg); }\n\n 25% { transform: scaleX(1) rotate(270deg); }\n\n 37.5% {transform: scaleX(-1) rotate(-180deg);}\n\n 50% { transform: scaleX(1) rotate(180deg); }\n\n 62.5% { transform: scaleX(-1) rotate(-90deg); }\n\n 75% { transform: scaleX(1) rotate(90deg); }\n\n 87.5% { transform: scaleX(-1) rotate(0deg); }\n\n to { transform: scaleX(1) rotate(0deg); }\n }\n\n @keyframes grow-shrink {\n from {\n transform: rotate(calc(0.01 * 360deg));\n }\n\n 50% {\n transform: rotate(calc(0.73 * 360deg));\n }\n\n to {\n transform: rotate(calc(0.01 * 360deg));\n }\n }\n `\n .autoRegister('mdw-progress');\n", "import './RadioIcon.js';\n\nimport CustomElement from '../core/CustomElement.js';\nimport InputMixin from '../mixins/InputMixin.js';\nimport RippleMixin from '../mixins/RippleMixin.js';\nimport StateMixin from '../mixins/StateMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\nimport TouchTargetMixin from '../mixins/TouchTargetMixin.js';\n\nexport default CustomElement\n .mixin(ThemableMixin)\n .mixin(StateMixin)\n .mixin(RippleMixin)\n .mixin(InputMixin)\n .mixin(TouchTargetMixin)\n .extend()\n .set({\n type: 'radio',\n stateLayer: true,\n })\n .on({\n composed({ html }) {\n const { label, rippleContainer, state, control, touchTarget } = this.refs;\n label.append(html`\n ${touchTarget}\n ${control}\n <div id=radio errored={erroredState} selected={checked}>\n <mdw-radio-icon id=icon errored={erroredState} disabled={disabledState}\n selected={checked} focused={focusedState} hovered={hoveredState}></mdw-radio-icon>\n ${state}\n ${rippleContainer}\n </div>\n <slot id=slot></slot>\n `);\n },\n })\n .css`\n /* https://m3.material.io/components/radio/specs */\n\n :host {\n --mdw-ink: var(--mdw-color__primary);\n --mdw-shape__size: var(--mdw-shape__full);\n display: inline-grid;\n align-items: baseline;\n gap: 12px;\n grid-auto-flow: column;\n grid-template-rows: minmax(20px, auto);\n grid-template-columns: 20px;\n justify-content: flex-start;\n\n cursor: pointer;\n\n transition: none 100ms cubic-bezier(0.4, 0.0, 1, 1);\n }\n\n :host(:empty) {\n vertical-align: -11.5%;\n\n line-height: 20px;\n }\n\n :host(:empty) #radio {\n transform: none;\n }\n\n #control {\n grid-column: 1/1;\n\n cursor: inherit;\n }\n\n #label {\n cursor: inherit;\n }\n\n #label[disabled] {\n cursor: not-allowed;\n }\n\n #state {\n pointer-events: auto;\n }\n\n #state,\n #ripple-container {\n inset-block-start: 50%;\n inset-inline-start: 50%;\n\n block-size: 40px;\n inline-size: 40px;\n\n transform: translateX(-50%) translateY(-50%);\n\n border-radius: 50%;\n }\n\n :host([disabled]) {\n cursor: not-allowed;\n\n opacity: 0.38;\n }\n\n #radio {\n position: relative;\n\n display: inline-flex;\n\n grid-column: 1 / 1;\n\n pointer-events: none;\n\n transform: translateY(11.5%);\n\n color: rgb(var(--mdw-color__on-surface));\n }\n\n #radio[selected] {\n color: rgb(var(--mdw-ink));\n }\n\n #radio[disabled] {\n color: rgb(var(--mdw-color__on-surface));\n }\n\n #radio[errored] {\n color: rgb(var(--mdw-color__error));\n }\n\n #icon {\n --mdw-ink: inherit;\n --disabled-opacity: 1;\n }\n `\n .autoRegister('mdw-radio');\n", "import './Icon.js';\n\nimport Button from './Button.js';\n\nexport default Button\n .extend()\n .observe({\n type: { empty: 'radio' },\n innerSegmentedButton: 'boolean',\n })\n .set({\n focusableOnDisabled: true,\n })\n .on({\n composed({ html, inline }) {\n const { shape, icon, outline, control, slot, state } = this.refs;\n\n slot.before(html`\n <div id=icons>\n ${icon}\n <mdw-icon selected={checked} id=check-icon aria-hidden=true>check</mdw-icon>\n </div>\n `);\n shape.setAttribute('selected', '{checked}');\n\n icon.removeAttribute('_if');\n icon.setAttribute('has-icon', '{hasIcon}');\n icon.setAttribute('selected', '{checked}');\n outline.setAttribute('inner-segmented-button', '{innerSegmentedButton}');\n outline.setAttribute('shape-start', '{shapeStart}');\n outline.setAttribute('shape-end', '{shapeEnd}');\n control.setAttribute('role', 'option');\n control.setAttribute('aria-checked', inline(\n ({ type, checked }) => (type === 'checkbox' ? `${(!!checked)}` : null),\n ));\n control.setAttribute('aria-selected', inline(\n ({ type, checked }) => (type === 'checkbox' ? null : `${!!checked}`),\n ));\n\n state.setAttribute('state-disabled', 'focus');\n },\n constructed() {\n this.outlined = true;\n },\n })\n .css`\n /* https://m3.material.io/components/segmented-buttons/specs */\n\n :host {\n --mdw-shape__size: var(--mdw-shape__full);\n --mdw-ink: var(--mdw-color__on-surface);\n gap: 8px;\n\n min-inline-size: 24px;\n padding-inline-start: max(12px, calc(16px + (var(--mdw-density) * 2px)));\n padding-inline-end: max(20px, calc(24px + (var(--mdw-density) * 2px)));\n\n color: rgb(var(--mdw-ink));\n }\n\n :host([inner-segmented-button]) {\n --mdw-shape__size: 0px;\n }\n\n #outline {\n inset-inline-end: -1px;\n }\n\n #outline[shape-end] {\n inset-inline-end: 0;\n }\n\n #shape[selected] {\n background-color: rgb(var(--mdw-bg));\n }\n\n #label[selected] {\n color: rgb(var(--mdw-ink));\n }\n\n #icons {\n position: relative;\n\n display: inline-flex;\n }\n\n #icon {\n box-sizing: border-box;\n inline-size: 0;\n\n opacity: 1;\n }\n\n #icon[has-icon] {\n inline-size: 18px;\n\n opacity: 1;\n }\n\n #icon[selected] {\n inline-size: 18px;\n\n opacity: 0;\n }\n\n #check-icon {\n position: absolute;\n inset: 0;\n\n display: block;\n\n overflow: visible;\n\n margin: 0;\n\n opacity: 0;\n\n font-size: 18px;\n font-variation-settings: 'FILL' 1;\n }\n\n #check-icon[selected] {\n opacity: 1;\n\n font-size: 18px;\n }\n\n #icon[disabled] {\n color: rgba(var(--mdw-color__on-surface), 0.38);\n }\n\n #shape[disabled][selected] {\n background-color: rgba(var(--mdw-color__on-surface), 0.12);\n }\n\n #label[disabled][selected] {\n color: rgba(var(--mdw-color__on-surface), 0.38);\n }\n\n `\n .autoRegister('mdw-segmented-button');\n", "import AriaReflectorMixin from '../mixins/AriaReflectorMixin.js';\nimport KeyboardNav from '../mixins/KeyboardNavMixin.js';\n\nimport Box from './Box.js';\nimport SegmentedButton from './SegmentedButton.js';\n\n/** @typedef {'compact'} DeprecatedHTMLMenuElementProperties */\n\nexport default Box\n .mixin(KeyboardNav)\n .mixin(AriaReflectorMixin)\n .extend()\n .define({\n kbdNavQuery() {\n return SegmentedButton.elementName;\n },\n })\n .set({\n _ariaRole: 'listbox',\n })\n .childEvents({\n slot: {\n slotchange() {\n this.refreshTabIndexes();\n // eslint-disable-next-line github/array-foreach\n this.kbdNavChildren.forEach((child, index, list) => {\n /** @type {InstanceType<SegmentedButton>} */\n (child).shapeStart = index === 0;\n /** @type {InstanceType<SegmentedButton>} */\n (child).innerSegmentedButton = index > 0 && index < list.length - 1;\n /** @type {InstanceType<SegmentedButton>} */\n (child).shapeEnd = index === list.length - 1;\n });\n },\n },\n })\n .css`\n /* https://m3.material.io/components/segmented-buttons/specs */\n\n :host {\n --mdw-bg: var(--mdw-color__secondary-container);\n --mdw-ink: var(--mdw-color__on-secondary-container);\n\n display: inline-flex;\n }\n\n :host([color]) {\n background-color: transparent;\n }\n\n `\n .on({\n constructed() {\n this.setAttribute('aria-orientation', 'horizontal');\n },\n })\n .autoRegister('mdw-segmented-button-group');\n", "import CustomElement from '../core/CustomElement.js';\nimport ControlMixin from '../mixins/ControlMixin.js';\nimport StateMixin from '../mixins/StateMixin.js';\nimport TextFieldMixin from '../mixins/TextFieldMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\n/* @implements {HTMLSelectElement} */\nexport default CustomElement\n .mixin(ThemableMixin)\n .mixin(StateMixin)\n .mixin(ControlMixin)\n .mixin(TextFieldMixin)\n .extend()\n .observe({\n trailingIcon: { empty: 'arrow_drop_down' },\n })\n .overrides({\n controlTagName: 'select',\n controlVoidElement: false,\n type: 'select-one',\n })\n .define({\n _select() {\n return /** @type {HTMLSelectElement} */ (this.refs.control);\n },\n /** Readonly values */\n multiple: { value: false },\n size: { value: 1 },\n })\n .html/* html */`<slot id=slot></slot>`\n .childEvents({\n slot: {\n /** @param {Event & {currentTarget:HTMLSlotElement}} event */\n slotchange(event) {\n const select = this._select;\n select.replaceChildren(\n ...event.currentTarget.assignedNodes()\n .map((child) => child.cloneNode(true)),\n );\n this._value = select.value;\n },\n },\n })\n .on({\n composed({ template }) {\n const { slot, prefix, suffix, control } = this.refs;\n control.setAttribute('icon', '{icon}');\n template.append(slot);\n prefix.remove();\n suffix.remove();\n },\n _formResetChanged(oldValue, newValue) {\n if (!newValue) return;\n this._select.value = this.querySelector('option[selected]')?.value ?? '';\n },\n })\n .css`\n #slot {\n display: none;\n }\n \n #label {\n padding: 0;\n \n cursor: pointer;\n }\n \n #label[disabled] {\n cursor: not-allowed;\n }\n \n #icon {\n position: absolute;\n \n /* padding-inline-start: 12px; */\n }\n \n #trailing-icon {\n position: absolute;\n inset-inline-end: 16px;\n }\n \n #control {\n padding-inline-start: 16px;\n padding-inline-end: calc(16px + 24px + 16px);\n accent-color: rgb(var(--mdw-ink));\n \n cursor: inherit;\n }\n \n #control[icon] {\n margin-inline-start: calc(16px + 24px);\n padding-inline-start: 0;\n }\n \n option {\n accent-color: rgb(var(--mdw-ink));\n \n min-block-size: var(--mdw-typescale__label-large__line-height);\n \n appearance: none;\n \n background-color: rgb(var(--mdw-color__surface)) !important;\n border-radius: 0;\n color: rgb(var(--mdw-color__on-surface)) !important;\n \n font: var(--mdw-typescale__label-large__font);\n letter-spacing: var(--mdw-typescale__label-large__letter-spacing);\n }\n `\n .autoRegister('mdw-select');\n", "import CustomElement from '../core/CustomElement.js';\nimport InputMixin from '../mixins/InputMixin.js';\nimport StateMixin from '../mixins/StateMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\n/**\n * @param {string} value\n * @param {number} onNaN\n * @return {number}\n */\nfunction parseFloat(value, onNaN = 0) {\n const number = Number.parseFloat(value);\n if (Number.isNaN(number)) return onNaN;\n return number;\n}\n\n/**\n * @param {string} value\n * @param {string} min\n * @param {string} max\n * @return {?number}\n */\nfunction valueAsFraction(value, min, max) {\n const nValue = parseFloat(value);\n const nMin = parseFloat(min);\n const nMax = parseFloat(max, 100);\n\n return (nValue - nMin) / (nMax - nMin);\n}\n\nexport default CustomElement\n .mixin(ThemableMixin)\n .mixin(StateMixin)\n .mixin(InputMixin)\n .extend()\n .set({\n stateLayer: true,\n type: 'range',\n })\n .observe({\n ticks: 'string',\n showLabel: { type: 'boolean', reflect: false },\n _previewValue: { nullable: false },\n _roundedValue: 'float',\n _isHoveringThumb: 'boolean',\n })\n .methods({\n /**\n * @param {(MouseEvent|TouchEvent) & {currentTarget:HTMLInputElement}} event\n * @return {void}\n */\n onControlMouseOrTouch(event) {\n const input = event.currentTarget;\n if (input.disabled) return;\n\n if (this.disabledState) return;\n\n if (event.type === 'touchend') {\n this._isHoveringThumb = false;\n return;\n }\n\n let offsetX;\n let clientX;\n let pageX;\n let isActive;\n\n const isTouch = 'touches' in event;\n if (isTouch) {\n if (event.touches.length) {\n const [touch] = event.touches;\n isActive = true;\n // @ts-ignore Might exist\n ({ offsetX, clientX, pageX } = touch);\n }\n } else {\n // Ignore mouse drag-over\n // Firefox doesn't report `:active`\n // eslint-disable-next-line no-bitwise\n isActive = (event.buttons & 1) === 1\n && (event.type === 'mousedown' || input.matches(':active'));\n ({ offsetX, clientX, pageX } = event);\n }\n\n if (offsetX == null) {\n clientX ??= pageX - window.scrollX; // Safari\n offsetX = clientX - input.getBoundingClientRect().left;\n }\n\n const { clientWidth } = input;\n let position = (offsetX / clientWidth);\n if (position > 1) {\n position = 1;\n } else if (position < 0) {\n position = 0;\n }\n\n if (isActive) {\n this._isHoveringThumb = true;\n const { min, max, step } = this;\n\n const nMin = parseFloat(min);\n const nMax = parseFloat(max, 100);\n const nStep = parseFloat(step, 1);\n\n const currentValue = position * (nMax - nMin) + nMin;\n let roundedValue = Math.round(currentValue / nStep) * nStep;\n\n if (nStep < 1) {\n // Floating Point Numbers need to be rounded off based on step\n // eg: 3.4 / 10 with step of 0.1 yields 0.33999999999999997\n const log10 = Math.floor(Math.log10(nStep)); // e value in scientific notation\n const scale = 10 ** (-1 * log10); // multiplier to scale up to integer\n roundedValue = Math.round(roundedValue * scale) / scale;\n }\n\n this._roundedValue = roundedValue;\n this._previewValue = roundedValue.toString(10);\n return;\n }\n\n if (isTouch) return;\n\n const fractionalValue = valueAsFraction(this.value, this.min, this.max);\n const thumbOffset = fractionalValue * clientWidth;\n const thumbMin = thumbOffset - 20;\n const thumbMax = thumbOffset + 20;\n this._isHoveringThumb = offsetX >= thumbMin && offsetX <= thumbMax;\n },\n\n /** @param {Event} event */\n onLeaveEvent({ currentTarget }) {\n if (document.activeElement === currentTarget) return;\n this._isHoveringThumb = false;\n },\n\n /**\n * @param {(MouseEvent|TouchEvent) & {currentTarget:HTMLInputElement}} event\n * @return {void}\n */\n onControlFinish(event) {\n const input = event.currentTarget;\n if (input.disabled) return;\n event.preventDefault();\n input.valueAsNumber = this._roundedValue;\n if (this._value !== input.value) {\n this._value = input.value;\n input.dispatchEvent(new Event('change', { bubbles: true }));\n }\n },\n })\n .events({\n blur: 'onLeaveEvent',\n mouseout: 'onLeaveEvent',\n })\n .childEvents({\n control: {\n '~mousedown': 'onControlMouseOrTouch',\n '~mousemove': 'onControlMouseOrTouch',\n '~mouseout': 'onControlMouseOrTouch',\n '~touchmove': 'onControlMouseOrTouch',\n '~touchstart': 'onControlMouseOrTouch',\n // @ts-expect-error Old spec\n '~touchleave': 'onControlMouseOrTouch',\n '~touchcancel': 'onControlMouseOrTouch',\n '~touchend': 'onControlMouseOrTouch',\n touchend: 'onControlFinish',\n click: 'onControlFinish',\n },\n })\n .expressions({\n computeTrackStyle({ ticks, _previewValue, min, max }) {\n return [\n ticks ? `--ticks:${ticks}` : null,\n `--value:${valueAsFraction(_previewValue, min, max)}`,\n ].filter(Boolean).join(';') || null;\n },\n })\n .on({\n composed({ template, html }) {\n const { state, label, control } = this.refs;\n template.append(html`\n <div id=track style={computeTrackStyle} aria-hidden=true disabled={disabledState}>\n <div _if={ticks} id=ticks></div>\n <div id=track-active></div>\n <div id=thumb-anchor>\n <div id=thumb>\n ${state}\n </div>\n <div id=thumb-label\n hidden=${({ _isHoveringThumb, focusedState }) => (!_isHoveringThumb && !focusedState)} \n text={_previewValue}></div>\n </div>\n </div>\n `);\n label.removeAttribute('aria-labelledby');\n },\n valueChanged(oldValue, newValue) {\n this._previewValue = newValue;\n },\n })\n .css`\n /* https://m3.material.io/components/sliders/specs */\n\n :host {\n --mdw-ink: var(--mdw-color__on-primary);\n --mdw-bg: var(--mdw-color__primary);\n\n display: block;\n vertical-align: middle;\n\n min-block-size: 40px;\n min-inline-size: 88px;\n\n background-color: transparent;\n }\n\n :host,\n :host([color]) {\n background-color: transparent;\n }\n\n #label {\n position: absolute;\n inset: 0;\n\n display: block;\n\n cursor: pointer;\n\n z-index: 1;\n\n /* border-radius: 50%; */\n color: rgb(var(--mdw-bg));\n }\n\n #control {\n inset:0;\n\n overflow: visible;\n\n block-size: 100%;\n min-block-size: 0;\n inline-size: 100%;\n min-inline-size: 0;\n\n appearance: none;\n\n cursor: inherit;\n\n transform: none;\n\n background-color: transparent;\n color: inherit;\n }\n\n #control::-webkit-slider-runnable-track {\n /* stylelint-disable-next-line declaration-property-value-disallowed-list */\n margin-inline: -10px;\n\n appearance: none;\n\n background-color: transparent;\n }\n\n @supports (-moz-appearance:none ){\n #control {\n inset-inline: -10px;\n\n inline-size: calc(100% + 20px);\n }\n }\n\n #control::-moz-range-track {\n inline-size: calc(100% + 20px) !important;\n\n appearance: none;\n }\n\n #control::-webkit-slider-thumb {\n display: block;\n\n block-size: 20px;\n inline-size: 20px;\n\n -webkit-appearance: none;\n cursor: inherit;\n\n transform: scale(2);\n\n background-color: transparent; /* Safari */\n\n border-radius: 50%;\n box-shadow: none; /* Safari */\n }\n\n #control::-moz-range-thumb {\n display: block;\n\n box-sizing: content-box;\n block-size: 20px;\n inline-size: 20px;\n border: none;\n\n appearance: none;\n cursor: inherit;\n\n transform: scale(2);\n\n background-color: transparent;\n border-radius: 50%;\n }\n\n #track {\n --value: 0.5;\n position: absolute;\n inset-block-start: 50%;\n inset-inline: 0;\n\n block-size: 4px;\n margin-block-start: -2px;\n\n pointer-events: none;\n user-select: none;\n\n background-color: rgb(var(--mdw-color__surface-variant));\n border-radius: inherit;\n }\n\n #thumb {\n position: absolute;\n inset-block-start: -18px;\n inset-inline-start: -20px;\n\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n\n block-size: 40px;\n inline-size: 40px;\n\n pointer-events: none;\n\n border-radius: 50%;\n\n color: rgb(var(--mdw-bg));\n }\n\n #thumb::before {\n content: '';\n\n display: block;\n\n block-size: 20px;\n inline-size: 20px;\n\n background-color: currentColor;\n border-radius: 50%;\n\n transition: background-color 100ms;\n }\n\n /* Inactive ticks */\n\n #ticks::before,\n #ticks::after {\n content: '';\n\n position: absolute;\n inset: 0;\n\n padding-inline: 10px;\n\n background-clip: content-box;\n /* stylelint-disable-next-line plugin/no-unsupported-browser-features */\n background-image: radial-gradient(circle at center, var(--tick-color) 0, var(--tick-color) 1px, transparent 0);\n background-position: center center;\n background-repeat: repeat-x;\n background-size: 0 100%;\n background-size: calc(100% / var(--ticks, 0)) 2px;\n }\n\n #ticks::before {\n --tick-color: rgb(var(--mdw-color__on-surface-variant));\n }\n\n #ticks::after {\n --tick-color: rgb(var(--mdw-ink));\n /* TODO: Use single-paint implementation */\n padding-inline-end: calc(100% - (100% * var(--value)) + 10px);\n\n z-index: 1;\n\n will-change: padding-inline-end;\n }\n /* Active Indicator */\n #track-active {\n position: absolute;\n inset: 0;\n\n overflow: hidden;\n\n border-radius: 99px;\n }\n\n #track-active::before {\n content: '';\n\n position: absolute;\n inset: 0;\n\n transform: scaleX(var(--value));\n transform-origin: 0 0;\n\n background-color: rgb(var(--mdw-bg));\n\n will-change: transform;\n }\n\n #thumb-anchor {\n position: absolute;\n inset-inline: 0;\n\n display: flex;\n align-items: flex-start;\n flex-direction: column;\n\n inline-size: 1%;\n\n transform: translateX(calc(var(--value) * 100 * 100%));\n transform-origin: 0 0;\n z-index: 24;\n\n will-change: transform;\n }\n\n #thumb-label {\n position: absolute;\n inset-block-end: 14px;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n box-sizing: content-box;\n margin-block-end: 6px;\n\n transform: translateX(-50%) scale(1);\n transform-origin: 50% 100%;\n\n font-weight: var(--mdw-typescale__label-medium__font-weight);\n line-height: var(--mdw-typescale__label-medium__line-height);\n font-family: var(--mdw-typescale__label-medium__font-family);\n letter-spacing: var(--mdw-typescale__label-medium__letter-spacing);\n\n transition: transform 200ms;\n will-change: transform;\n }\n\n #thumb-label:is([hidden],[text=\"\"]) {\n transform: translateX(-50%) scale(0);\n }\n\n #thumb-label::before {\n content: attr(text);\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n min-block-size: 28px;\n min-inline-size: 28px;\n\n z-index: 1;\n\n background-color: rgb(var(--mdw-bg));\n border-radius: 50%;\n color: rgb(var(--mdw-ink));\n }\n\n #thumb-label::after {\n /* Values from Figma SVG */\n --x-start: 14.6446%; /*4.1005px*/\n --x-end: 85.3554%;\n --y: 70.7106%; /*24.0416px*/\n\n content: \"\";\n\n position: absolute;\n inset: 0;\n inset-block-end: -6px;\n\n clip-path: polygon(var(--x-start) var(--y), var(--x-end) var(--y), 50% 100%, var(--x-start) var(--y));\n\n background-color: rgb(var(--mdw-bg));\n }\n\n #track[disabled] {\n background-color: rgb(var(--mdw-color__on-surface), calc(0.12 / 0.38));\n }\n\n #label[disabled],\n #track[disabled] {\n --mdw-bg: var(--mdw-color__on-surface);\n cursor: not-allowed;\n\n opacity: 0.38;\n }\n `\n .autoRegister('mdw-slider');\n", "// https://w3c.github.io/aria/#status\n\nimport { EVENT_HANDLER_TYPE } from '../core/customTypes.js';\nimport AriaReflectorMixin from '../mixins/AriaReflectorMixin.js';\nimport DensityMixin from '../mixins/DensityMixin.js';\n\nimport './Button.js';\nimport './IconButton.js';\n\nimport Surface from './Surface.js';\n\nexport default Surface\n .mixin(DensityMixin)\n .mixin(AriaReflectorMixin)\n .extend()\n .set({\n _ariaRole: 'status',\n elevated: true,\n })\n .observe({\n open: 'boolean',\n persistent: 'boolean',\n action: 'string',\n actionInk: { empty: 'inverse-primary' },\n actionTypeStyle: { empty: 'label-large' },\n closeButton: 'boolean',\n closeIcon: { empty: 'close' },\n closeInk: { empty: 'inherit' },\n onaction: EVENT_HANDLER_TYPE,\n })\n .methods({\n async close() {\n if (!this.dispatchEvent(new Event('close', { cancelable: true }))) return;\n if (!this.open) return;\n this.open = false;\n if (window.getComputedStyle(this).transitionDuration === '0s') return;\n await new Promise((resolve) => {\n this.addEventListener('transitionend', resolve, { once: true });\n });\n },\n show() {\n this.open = true;\n },\n /** @param {string} text */\n update(text) {\n this.textContent = text;\n },\n })\n .html/* html */`\n <div id=content></div>\n <mdw-button _if={action} id=action class=button ink={actionInk} type-style={actionTypeStyle}>{action}</mdw-button>\n <mdw-icon-button _if={closeButton} id=close class=button icon={closeIcon} ink={closeInk}>Close</mdw-button>\n `\n .on({\n composed() {\n const { content, slot } = this.refs;\n content.append(slot);\n },\n })\n .childEvents({\n action: {\n '~click'() {\n if (!this.dispatchEvent(new Event('action', { cancelable: true }))) return;\n this.close();\n },\n },\n close: {\n '~click'() {\n this.close();\n },\n },\n })\n .css`\n /* https://m3.material.io/components/snackbar/specs */\n\n :host {\n --mdw-shape__size: var(--mdw-shape__small);\n --mdw-surface__shadow: var(--mdw-surface__shadow__3);\n --mdw-surface__tint: var(--mdw-surface__tint__3);\n --mdw-shape__bg: rgb(var(--mdw-color__inverse-surface));\n --mdw-ink: var(--mdw-color__inverse-on-surface);\n\n --mdw-type__line-height: var(--mdw-typescale__body-medium__line-height);\n display: flex;\n align-items: center;\n\n padding-inline: 16px;\n\n opacity: 0;\n transform: translateY(25%) scaleY(0.25);\n transform-origin: bottom center;\n visibility: hidden; /* Remove from tab order */\n z-index: 24;\n\n font: var(--mdw-typescale__body-medium__font);\n letter-spacing: var(--mdw-typescale__body-medium__letter-spacing);\n\n transition: transform 200ms, opacity 200ms, visibility 200ms;\n }\n\n :host([action]) {\n gap: 8px;\n\n padding-inline-end: 8px;\n }\n\n :host([close-button]) {\n gap: 4px;\n\n padding-inline-end: 4px;\n }\n\n :host([open]) {\n opacity: 1;\n transform: scale(1);\n visibility: visible;\n }\n\n #content {\n display: flex;\n align-items: center;\n\n flex: 1;\n padding-block: max(2px, calc(14px + (var(--mdw-density) * 2px)));\n }\n\n #slot {\n display: block;\n overflow-x: hidden;\n overflow-y: hidden;\n\n max-block-size: calc(var(--mdw-type__line-height) * 2);\n\n text-align: start;\n text-overflow: ellipsis;\n text-transform: none;\n white-space: normal;\n word-break: break-word;\n }\n\n @supports(width: 1lh) {\n #slot {\n max-block-size: 2lh;\n }\n }\n\n @supports(-webkit-line-clamp:1) {\n #slot {\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 2;\n }\n }\n `\n .autoRegister('mdw-snackbar');\n", "import ShapeMixin from '../mixins/ShapeMixin.js';\n\nimport Box from './Box.js';\n\nexport default Box\n .mixin(ShapeMixin)\n .extend()\n .on({\n composed() {\n const { shape, outline } = this.refs;\n shape.before(outline);\n shape.remove();\n },\n })\n .css`\n :host {\n position: relative;\n\n overflow: hidden;\n\n z-index: auto;\n\n background-color: var(--mdw-shape__bg, transparent);\n\n border-start-start-radius: calc(var(--mdw-shape__rounded) * var(--mdw-shape__size__top-start-size));\n border-start-end-radius: calc(var(--mdw-shape__rounded) * var(--mdw-shape__size__top-end-size));\n border-end-start-radius: calc(var(--mdw-shape__rounded) * var(--mdw-shape__size__bottom-start-size));\n border-end-end-radius: calc(var(--mdw-shape__rounded) * var(--mdw-shape__size__bottom-end-size));\n\n transition-delay: 1ms;\n transition-duration: 200ms;\n transition-property: background-color, color;\n will-change: background-color, color;\n\n }\n\n :host([color]) {\n background-color: rgb(var(--mdw-bg));\n }\n\n :host(:where([ink],[color])) {\n color: rgb(var(--mdw-ink));\n }\n\n :host([outlined]) {\n background-color: transparent;\n }\n\n :host(:is([color=\"none\"], [color=\"transparent\"])) {\n background-color: transparent;\n }\n\n @supports(-webkit-mask-box-image: none) {\n :host {\n -webkit-mask-box-image: var(--mdw-shape__mask-border-source)\n 8 fill /\n var(--mdw-shape__size)\n stretch;\n\n -webkit-mask: var(--mdw-shape__mask);\n\n transition-duration: 200ms, 200ms, 200ms;\n transition-property: background-color, color, -webkit-mask-box-image-width;\n will-change: background-color, color, -webkit-mask-box-image;\n }\n }\n `\n .autoRegister('mdw-shape');\n", "import './Icon.js';\nimport './Shape.js';\nimport CustomElement from '../core/CustomElement.js';\nimport ShapeMixin from '../mixins/ShapeMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\nexport default CustomElement\n .mixin(ThemableMixin)\n .mixin(ShapeMixin)\n .extend()\n .observe({\n selected: 'boolean',\n icon: 'string',\n errored: 'boolean',\n disabled: 'boolean',\n selectedIcon: 'string',\n unselectedIcon: 'string',\n src: 'string',\n selectedSrc: 'string',\n unselectedSrc: 'string',\n hovered: 'boolean',\n pressed: 'boolean',\n focused: 'boolean',\n dragValue: 'float',\n color: { empty: 'primary' },\n })\n .observe({\n /** Alias for Selected (QoL) */\n checked: {\n type: 'boolean',\n get({ selected }) { return selected; },\n /** @param {boolean} value */\n set(value) { this.selected = value; },\n },\n _active({ disabled, pressed, focused, hovered }) {\n return !disabled && (pressed || focused || hovered);\n },\n })\n .observe({\n _thumbColor({ color, _active }) {\n return _active ? `${color}-container` : '';\n },\n _iconInk({ disabled, selected, color }) {\n if (!selected) return 'surface-variant';\n if (disabled) return 'on-surface';\n return `on-${color}-container`;\n },\n })\n .expressions({\n hasIcon({ icon, src, unselectedIcon, unselectedSrc }) {\n return Boolean(icon || src || unselectedIcon || unselectedSrc);\n },\n })\n .html/* html */`\n <div id=thumb selected={checked} pressed={pressed} disabled={disabled}>\n <mdw-shape id=thumb-shape shape-style=full selected={checked} pressed={pressed} hovered={hovered} focused={focused} icon={hasIcon}\n color={_thumbColor} active={_active} ink={_thumbInk} disabled={disabled}></mdw-shape>\n <mdw-icon ink={_iconInk} class=icon id=icon src={src} selected={checked}>{icon}</mdw-icon>\n <mdw-icon ink={_iconInk} class=icon id=selected-icon src={selectedIconSrc} selected={checked}>{selectedIcon}</mdw-icon>\n <mdw-icon ink={_iconInk} class=icon id=unselected-icon src={unselectedIconSrc} selected={checked}>{unselectedIcon}</mdw-icon>\n <slot id=slot selected={checked}></slot>\n </div>\n `\n .on({\n composed() {\n const { outline, shape: track } = this.refs;\n track.id = 'track';\n track.setAttribute('selected', '{checked}');\n track.setAttribute('disabled', '{disabled}');\n outline.removeAttribute('_if');\n outline.setAttribute('selected', '{checked}');\n outline.setAttribute('errored', '{errored}');\n outline.setAttribute('disabled', '{disabled}');\n },\n dragValueChanged(oldValue, newValue) {\n if (newValue == null) {\n this.refs.thumb.style.removeProperty('--mdw-switch__value');\n this.refs.thumb.style.removeProperty('transition-duration');\n } else {\n this.refs.thumb.style.setProperty('--mdw-switch__value', `${newValue}`);\n this.refs.thumb.style.setProperty('transition-duration', '0s');\n }\n },\n })\n .css`\n /* https://m3.material.io/components/switch/specs */\n\n :host {\n --mdw-ink: var(--mdw-color__on-primary);\n --mdw-bg: var(--mdw-color__primary);\n --mdw-shape__size: var(--mdw-shape__full);\n --mdw-switch__value: 0;\n\n position: relative;\n\n display: inline-block;\n vertical-align: middle;\n\n box-sizing: border-box;\n block-size: 32px;\n inline-size: 52px;\n container-type: inline-size;\n container-name: switch-icon;\n }\n\n :host([selected]) {\n --mdw-switch__value: 1;\n }\n\n :host([disabled]) {\n opacity: 0.38;\n }\n\n #track{\n position: absolute;\n inset: 0;\n\n background-color: rgb(var(--mdw-color__surface-variant));\n }\n\n #track[selected] {\n background-color: rgb(var(--mdw-bg));\n }\n\n #track[disabled] {\n opacity: calc(0.12/0.38);\n }\n\n #track[disabled][selected] {\n background-color: rgb(var(--mdw-color__on-surface));\n }\n\n #outline {\n filter:\n drop-shadow(1px 0px 0px currentColor)\n drop-shadow(0px 1px 0px currentColor)\n drop-shadow(-1px 0px 0px currentColor)\n drop-shadow(0px -1px 0px currentColor);\n\n color: rgb(var(--mdw-color__outline));\n }\n\n #outline:is([pressed],[focused]) {\n color: rgb(var(--mdw-color__outline));\n }\n\n #outline[disabled] {\n color: rgb(var(--mdw-color__on-surface));\n }\n\n #outline[selected] {\n color: transparent;\n }\n\n /** Thumb (state) **/\n\n #thumb {\n --thumb-color: var(--mdw-ink);\n position: absolute;\n inset-block: 0;\n inset-inline-start: 0;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n transform: translateX(calc(var(--mdw-dir, 1) * var(--mdw-switch__value) * (52px - 100%)));\n\n aspect-ratio: 1/1;\n }\n\n :dir(rtl) #thumb {\n --mdw-dir: -1;\n }\n\n @supports(width: 1cqw) {\n #thumb {\n transform: translateX(calc(var(--mdw-dir, 1) * var(--mdw-switch__value) * (100cqw - 100%)));\n }\n }\n\n #slot {\n color: rgb(var(--mdw-color__on-surface));\n }\n\n #slot[selected] {\n color: rgb(var(--mdw-bg));\n }\n\n /** Thumb Shape **/\n\n #thumb-shape {\n --mdw-shape__size: inherit;\n\n position: absolute;\n\n inset: 2px;\n\n transform: scale(calc(16/28));\n z-index: 0;\n }\n\n #thumb-shape[icon] {\n transform: scale(calc(24/28));\n }\n\n #thumb-shape:not([selected]) {\n --mdw-bg: var(--mdw-color__outline);\n --mdw-ink: var(--mdw-color__surface-variant);\n }\n\n #thumb-shape[selected] {\n transform: scale(calc(24/28));\n }\n\n #thumb-shape[selected]:not([active]) {\n --mdw-bg: var(--thumb-color);\n }\n\n #thumb-shape[pressed]:not([disabled]) {\n transform: scale(1);\n }\n\n /** Thumb Icons **/\n\n .icon {\n position: absolute;\n inset-block-start: 50%;\n inset-inline-start: 50%;\n\n opacity: 0;\n transform: translateX(-50%) translateY(-50%);\n\n font-size: 16px;\n\n /* border-radius: 50%; */\n }\n\n .icon:not([src]):empty {\n display: none;\n }\n\n #icon, #unselected-icon {\n opacity: 1;\n\n font-variation-settings: 'FILL' 0;\n }\n\n #unselected-icon[selected] {\n opacity: 0;\n }\n\n #selected-icon[selected] {\n opacity: 1;\n }\n\n #icon[selected] {\n font-variation-settings: 'FILL' 1;\n }\n\n #thumb[disabled] {\n color: rgb(var(--mdw-color__on-surface));\n }\n `\n .css`\n /* https://m3.material.io/components/switch/specs */\n\n :host {\n /*FastOutLinearInInterpolator*/\n --mdw-switch__transition-timing__collapse: cubic-bezier(0.4, 0.0, 1, 1);\n --mdw-switch__transition-duration__collapse: 375ms;\n /*LinearOutSlowInInterpolator*/\n --mdw-switch__transition-timing__expand: cubic-bezier(0.0, 0.0, 0.2, 1);\n --mdw-switch__transition-duration__expand: 500ms;\n --scale-delay: var(--mdw-switch__transition-duration);\n\n --mdw-switch__transition-duration: var(--mdw-switch__transition-duration__collapse);\n --mdw-switch__transition-timing: var(--mdw-switch__transition-timing__collapse);\n --mdw-switch__transition-delay__color: calc(var(--mdw-switch__transition-duration) / 2);\n --mdw-switch__transition-delay__translate: calc(var(--mdw-switch__transition-duration) / 2);\n --mdw-switch__transition-delay__scale: calc(var(--mdw-switch__transition-duration) / 2);\n\n transition-delay: var(--mdw-switch__transition-delay__color);\n transition-duration: calc(var(--mdw-switch__transition-duration) / 2);\n /* 2 legged animation */\n transition-timing-function: var(--mdw-switch__transition-timing);\n }\n\n #track {\n transition-delay: var(--mdw-switch__transition-delay__color);\n transition-duration: inherit;\n transition-property: background-color;\n transition-timing-function: inherit;\n }\n\n #outline {\n transition-delay: var(--mdw-switch__transition-delay__color);\n transition-duration: inherit;\n transition-property: background-color, color;\n transition-timing-function: inherit;\n }\n\n #thumb {\n transition-delay: var(--mdw-switch__transition-delay__translate);\n transition-duration: inherit;\n transition-property: transform;\n transition-timing-function: inherit;\n }\n\n #thumb-shape, .icon {\n /* (selected => unselected): stall color+scale */\n transition-delay: var(--mdw-switch__transition-delay__scale), var(--mdw-switch__transition-delay__color), var(--mdw-switch__transition-delay__color);\n transition-duration: inherit;\n transition-property: transform, background-color, color;\n transition-timing-function: inherit;\n }\n\n :host([icon]) {\n --mdw-switch__transition-delay__translate: 0s;\n }\n\n .icon {\n transition-property: transform, opacity, color;\n }\n\n /* unselected => selected */\n :host([selected]) {\n --mdw-switch__transition-delay__color: 0s;\n --mdw-switch__transition-delay__scale: 0s;\n /* --mdw-switch__transition-delay__translate: 0s; */\n --mdw-switch__transition-duration: var(--mdw-switch__transition-duration__expand);\n --mdw-switch__transition-timing: var(--mdw-switch__transition-timing__expand);\n }\n\n /* active => selected */\n :host([selected][pressed]) {\n /* --mdw-switch__transition-delay__color: 0s; */\n /* --mdw-switch__transition-delay__scale: 0s; */\n --mdw-switch__transition-delay__translate: 0s;\n }\n\n /* selected => unselected */\n :host(:not([selected])) {\n /* --mdw-switch__transition-delay__color: 0s; */\n /* --mdw-switch__transition-delay__scale: 0s; */\n --mdw-switch__transition-delay__translate: 0s;\n }\n\n /* unselected => active */\n :host([pressed]:not([selected])) {\n /* --mdw-switch__transition-delay__color: 0s; */\n --mdw-switch__transition-delay__scale: 0s;\n /* --mdw-switch__transition-delay__translate: 0s; */\n }\n `\n .autoRegister('mdw-switch-icon');\n", "import './SwitchIcon.js';\nimport CustomElement from '../core/CustomElement.js';\nimport InputMixin from '../mixins/InputMixin.js';\nimport StateMixin from '../mixins/StateMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\nimport TouchTargetMixin from '../mixins/TouchTargetMixin.js';\n\nexport default CustomElement\n .mixin(ThemableMixin)\n .mixin(InputMixin) // Label as root\n .mixin(StateMixin)\n .mixin(TouchTargetMixin)\n // Switches have their own pressed animation (No ripple)\n .extend()\n .set({\n type: 'checkbox',\n stateLayer: true,\n })\n .observe({\n icon: 'string',\n selectedIcon: 'string',\n unselectedIcon: 'string',\n src: 'string',\n selectedSrc: 'string',\n unselectedSrc: 'string',\n })\n .on({\n composed({ html }) {\n const { state, label, control, touchTarget } = this.refs;\n label.append(html`\n ${touchTarget}\n <mdw-switch-icon id=switch\n color={color} ink={ink} selected={checked} hovered={hoveredState} focused={focusedState} pressed={pressedState} disabled={disabledState}\n icon={icon}\n selected-icon={selectedIcon}\n unselected-icon={unselectedIcon}\n src={src}\n selected-src={selectedSrc}\n unselected-src={unselectedSrc}\n >\n ${state}\n ${control}\n </mdw-switch-icon>\n <slot id=slot></slot>\n `);\n control.setAttribute('role', 'switch');\n },\n })\n .methods({\n /**\n * @param {(MouseEvent|TouchEvent) & {currentTarget:HTMLInputElement}} event\n * @return {void}\n */\n onControlMouseOrTouch(event) {\n const input = event.currentTarget;\n if (input.disabled) return;\n\n if (this.disabledState) return;\n\n if (event.type === 'touchend') {\n // this._isHoveringThumb = false;\n return;\n }\n\n let offsetX;\n let clientX;\n let pageX;\n let isActive;\n\n const isTouch = 'touches' in event;\n if (isTouch) {\n if (event.touches.length) {\n const [touch] = event.touches;\n isActive = true;\n // @ts-ignore Might exist\n ({ offsetX, clientX, pageX } = touch);\n }\n } else {\n // Ignore mouse drag-over\n // Firefox doesn't report `:active`\n // eslint-disable-next-line no-bitwise\n isActive = (event.buttons & 1) === 1\n && (event.type === 'mousedown' || input.matches(':active'));\n ({ offsetX, clientX, pageX } = event);\n }\n\n if (!isActive) return;\n\n if (offsetX == null) {\n clientX ??= pageX - window.scrollX; // Safari\n offsetX = clientX - input.getBoundingClientRect().left;\n }\n\n const { clientWidth } = input;\n let position = (offsetX / clientWidth);\n if (position > 1) {\n position = 1;\n } else if (position < 0) {\n position = 0;\n }\n\n // this._isHoveringThumb = true;\n\n let currentValue = this.refs.switch.dragValue;\n if (currentValue == null) {\n currentValue = this.checked ? 1 : 0;\n }\n const pixels = offsetX - (clientWidth / 2);\n const currentPixels = this.refs.switch.clientWidth - (this.refs.switch.clientHeight);\n // console.log(pixels, currentPixels, currentPixels * currentValue, pixels / currentPixels);\n const newRatio = pixels / currentPixels;\n const newValue = Math.max(Math.min(currentValue + newRatio, 1), 0);\n // this.refs.switch.dragValue = newValue;\n // event.preventDefault();\n },\n })\n .childEvents({\n control: {\n '~pointermove': 'onControlMouseOrTouch',\n },\n })\n .css`\n /* https://m3.material.io/components/switch/specs */\n\n :host {\n --mdw-ink: var(--mdw-color__on-primary);\n --mdw-bg: var(--mdw-color__primary);\n position: relative;\n\n display: inline-flex;\n align-items: center;\n\n gap: 12px;\n vertical-align: middle;\n\n }\n\n #touch-target {\n z-index: 0;\n }\n\n #label {\n display: contents;\n\n cursor: pointer;\n\n /* border-radius: 50%; */\n }\n\n /** Switch **/\n\n #switch {\n --mdw-bg: inherit;\n --mdw-ink: inherit;\n flex:1;\n\n pointer-events: none;\n }\n\n /** State **/\n\n #state {\n position: absolute;\n inset: 50%;\n\n block-size: 100%;\n min-block-size: 40px;\n inline-size: 100%;\n min-inline-size: 40px;\n\n pointer-events: none;\n\n transform: translateX(-50%) translateY(-50%);\n\n border-radius: 50%;\n }\n\n /** Disabled **/\n\n #label[disabled] {\n --mdw-ink: var(--mdw-color__on-surface); /* selected icon */\n --mdw-bg: var(--mdw-color__surface);\n cursor: not-allowed;\n\n opacity: 0.38;\n }\n\n `\n .autoRegister('mdw-switch');\n", "// https://w3c.github.io/aria/#tab\n\nimport './Icon.js';\n\nimport CustomElement from '../core/CustomElement.js';\nimport RippleMixin from '../mixins/RippleMixin.js';\nimport ScrollListenerMixin from '../mixins/ScrollListenerMixin.js';\nimport ShapeMixin from '../mixins/ShapeMixin.js';\nimport StateMixin from '../mixins/StateMixin.js';\n\nexport default CustomElement\n .mixin(ShapeMixin)\n .mixin(StateMixin)\n .mixin(RippleMixin)\n .mixin(ScrollListenerMixin)\n .extend()\n .define({\n stateTargetElement() { return this.refs.anchor; },\n /**\n * Used to compute primary indicator size.\n * Default to 24.\n */\n labelMetrics() {\n const slot = this.refs.slot;\n let target = this.refs.slot;\n if (!slot.clientWidth) target = this.refs.icon;\n return {\n width: target.clientWidth,\n left: target.offsetLeft,\n };\n },\n })\n .set({\n delegatesFocus: true,\n stateLayer: true,\n })\n .observe({\n active: 'boolean',\n icon: 'string',\n src: 'string',\n href: 'string',\n ariaLabel: 'string',\n })\n .methods({\n /** @type {HTMLElement['focus']} */\n focus(options) {\n this.refs.anchor.focus(options);\n },\n })\n .html/* html */`\n <a id=anchor role=tab\n aria-label={ariaLabel}\n aria-controls=${({ href }) => (href?.startsWith('#') ? href.slice(1) : null)}\n aria-selected=${({ active }) => (active ? 'true' : 'false')}\n aria-disabled=${({ disabledState }) => `${disabledState}`}\n disabled={disabledState}\n href=${({ href }) => href ?? '#'}>\n <mdw-icon _if=${(data) => data.icon || data.src} id=icon aria-hidden=true src={src} active={active}>{icon}</mdw-icon>\n <slot id=slot></slot>\n </a>\n `\n .on({\n composed() {\n const { shape, rippleContainer, state } = this.refs;\n shape.append(state, rippleContainer);\n state.setAttribute('state-disabled', 'focus');\n },\n })\n .events({\n keydown(event) {\n if (event.key === ' ') {\n event.preventDefault(); // Avoid vertical scroll\n this.refs.anchor.click();\n }\n },\n })\n .childEvents({\n anchor: {\n click(event) {\n if (this.disabledState) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n const { href } = this;\n if (!href) {\n event.preventDefault();\n return;\n }\n if (href.startsWith('#')) {\n /** @type {HTMLElement} */\n const el = document.querySelector(href);\n if (!el) { console.warn('Unknown element', href); }\n event.preventDefault();\n el.scrollIntoView({ block: 'nearest', inline: 'start' });\n }\n },\n },\n })\n .css`\n /* https://m3.material.io/components/tabs/specs */\n\n :host {\n display: inline-flex;\n\n min-inline-size: 64px;\n\n cursor: pointer;\n }\n\n #anchor {\n display: flex;\n align-items: center;\n flex-direction: column;\n justify-content: center;\n\n box-sizing: border-box;\n block-size: 100%;\n inline-size: 100%;\n flex: 1;\n\n padding-block: 6px;\n padding-inline: 12px;\n\n cursor: pointer;\n outline: none;\n\n color: inherit;\n\n text-decoration: inherit;\n }\n\n #icon {\n padding-block: 4px;\n\n font-size: 24px;\n font-variation-settings: 'FILL' 0;\n\n }\n\n #shape[disabled],\n #anchor[disabled] {\n cursor: not-allowed;\n\n background-color: rgba(var(--mdw-color__on-surface), 0.12);\n color: rgba(var(--mdw-color__on-surface), 0.38);\n }\n\n :host([active]) {\n color: rgb(var(--mdw-ink));\n }\n\n #icon[active] {\n font-variation-settings: 'FILL' 1;\n }\n\n #slot {\n display: block;\n overflow-x: hidden;\n overflow-y: hidden;\n\n max-block-size: var(--mdw-typescale__title-small__line-height);\n\n max-inline-size: 100%;\n\n cursor: inherit;\n outline: none;\n\n opacity: var(--mdw-nav-item__anchor__opacity, 1);\n transform: translateY(var(--mdw-nav-item__offset-y, 0));\n\n color: inherit;\n\n font: var(--mdw-typescale__title-small__font);\n letter-spacing: var(--mdw-typescale__title-small__letter-spacing);\n text-align: center;\n text-decoration: inherit;\n text-overflow: ellipsis;\n text-transform: none;\n white-space: nowrap;\n word-break: break-word;\n\n transition: opacity, color, transform 200ms;\n will-change: opacity, transform;\n }\n `\n .autoRegister('mdw-tab');\n", "const registeredElements = new Set();\n\n/** @type {MutationObserver} */\nlet rtlObserver;\n\n/**\n * @param {typeof import('../core/CustomElement.js').default} Base\n */\nexport default function RTLObserverMixin(Base) {\n return Base\n .extend()\n .observe({\n pageIsRTL: {\n type: 'boolean',\n value: document.documentElement.dir === 'rtl',\n },\n })\n .on({\n connected() {\n if (!rtlObserver) {\n rtlObserver = new MutationObserver(() => {\n const isRTL = document.documentElement.dir === 'rtl';\n for (const el of registeredElements) {\n el.pageIsRTL = isRTL;\n }\n });\n rtlObserver.observe(document.documentElement, { attributeFilter: ['dir'] });\n }\n registeredElements.add(this);\n },\n disconnected() {\n registeredElements.delete(this);\n },\n });\n}\n", "const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n // @ts-ignore Skip cast\n entry.target.onResizeObserved(entry);\n }\n});\n\n/**\n * @param {typeof import('../core/CustomElement.js').default} Base\n */\nexport default function ResizeObserverMixin(Base) {\n return Base\n .extend()\n .set({\n observeResizeOnConnected: true,\n })\n .methods({\n /** @param {ResizeObserverEntry} entry */\n onResizeObserved(entry) {\n // Virtual function\n },\n observeResize() {\n resizeObserver.observe(this);\n },\n unobserveResize() {\n resizeObserver.unobserve(this);\n },\n })\n .on({\n connected() {\n if (!this.observeResizeOnConnected) return;\n this.observeResize();\n },\n disconnected() {\n this.unobserveResize();\n },\n });\n}\n", "// https://w3c.github.io/aria/#tablist\n\nimport CustomElement from '../core/CustomElement.js';\nimport KeyboardNavMixin from '../mixins/KeyboardNavMixin.js';\nimport RTLObserverMixin from '../mixins/RTLObserverMixin.js';\nimport ResizeObserverMixin from '../mixins/ResizeObserverMixin.js';\nimport ShapeMixin from '../mixins/ShapeMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\nimport Tab from './Tab.js';\n\nexport default CustomElement\n .mixin(ThemableMixin)\n .mixin(KeyboardNavMixin)\n .mixin(ResizeObserverMixin)\n .mixin(RTLObserverMixin)\n .mixin(ShapeMixin)\n .extend()\n .set({\n /** @type {WeakRef<HTMLElement>} */\n _tabContentRef: null,\n _tabContentScrollListener: null,\n /** @type {HTMLCollectionOf<InstanceType<Tab>>} */\n _tabCollection: null,\n /**\n * @type {{\n * left:number,\n * width:number,\n * right:number,\n * center: number,\n * label: {left:number, width:number},\n * index: number,\n * }[]}\n */\n _tabMetrics: null,\n _isRTL: null,\n })\n .define({\n tabContent: {\n get() {\n return this._tabContentRef?.deref();\n },\n /** @param {HTMLElement} value */\n set(value) {\n const oldValue = this._tabContentRef?.deref();\n if (oldValue) {\n oldValue.removeEventListener('scroll', this._tabContentScrollListener);\n }\n if (value) {\n this._tabContentRef = new WeakRef(value);\n this._tabContentScrollListener = this.observeTabContent.bind(this);\n value.addEventListener('scroll', this._tabContentScrollListener);\n this.observeTabContent();\n } else {\n this._tabContentRef = null;\n }\n },\n },\n })\n .observe({\n tabContentId: {\n /**\n * @param {string} oldValue\n * @param {string} newValue\n */\n changedCallback(oldValue, newValue) {\n // @ts-ignore Skip cast\n this.tabContent = newValue ? document.getElementById(newValue) : null;\n },\n },\n active: 'boolean',\n secondary: 'boolean',\n _indicatorStyle: { value: 'opacity: 0' },\n color: { empty: 'surface-primary' },\n })\n .define({\n tabs() {\n // eslint-disable-next-line no-return-assign\n return this._tabCollection ??= /** @type {HTMLCollectionOf<InstanceType<Tab>>} */ (\n this.getElementsByTagName(Tab.elementName)\n );\n },\n })\n .observe({\n /** Internal observed property */\n _selectedIndex: {\n type: 'integer',\n empty: -1,\n /**\n * @param {number} oldValue\n * @param {number} newValue\n */\n changedCallback(oldValue, newValue) {\n this.active = newValue !== -1;\n },\n },\n })\n .define({\n kbdNavQuery() {\n return Tab.elementName;\n },\n ariaOrientationDefault() {\n return /** @type {'horizontal'|'vertical'} */ ('horizontal');\n },\n /** @return {NodeListOf<InstanceType<Tab>>} */\n childTabItems() {\n return (this.querySelectorAll(Tab.elementName));\n },\n tabMetrics() {\n // eslint-disable-next-line no-return-assign\n return this._tabMetrics ??= [...this.tabs].map((tab, index) => ({\n left: tab.offsetLeft,\n width: tab.offsetWidth,\n right: tab.offsetLeft + tab.offsetWidth,\n center: tab.offsetLeft + (tab.offsetWidth / 2),\n label: tab.labelMetrics,\n index,\n }));\n },\n selectedIndex: {\n get() {\n let index = 0;\n for (const tab of this.tabs) {\n if (tab.active) return index;\n index++;\n }\n return -1;\n },\n set(value) {\n let index = 0;\n for (const el of this.tabs) {\n if (index === value) {\n el.active = true;\n this._selectedIndex = index;\n } else {\n el.active = false;\n }\n index++;\n }\n },\n },\n })\n .define({\n selectedItem: {\n /**\n * @return {InstanceType<Tab>}\n */\n get() {\n for (const tab of this.tabs) {\n if (tab.active) return tab;\n }\n return null;\n },\n /**\n * @param {InstanceType<Tab>} value\n * @return {InstanceType<Tab>}\n */\n set(value) {\n let index = 0;\n for (const tab of this.tabs) {\n if (tab === value) {\n this.selectedIndex = index;\n return value;\n }\n index++;\n }\n return null;\n },\n },\n })\n .methods({\n clearCache() {\n this._tabMetrics = null;\n },\n /** @param {InstanceType<Tab>} [tab] */\n updateIndicatorByTab(tab) {\n tab ??= this.selectedItem ?? this.tabs.item(0);\n\n const width = this.secondary ? tab.clientWidth : tab.labelMetrics.width;\n const position = this.secondary ? tab.offsetLeft : tab.offsetLeft + tab.labelMetrics.left;\n this._indicatorStyle = `--width: ${width}; --offset: ${position}px`;\n },\n updateIndicator(animate = false) {\n this.updateIndicatorByTab();\n if (!animate) {\n this.refs.indicator.style.setProperty('--transition-ratio', '0');\n }\n },\n /** @param {number} percentage */\n updateIndicatorByPosition(percentage) {\n const metrics = this.tabMetrics;\n\n // Tab panels are equal-width whereas tablist may be variable\n\n const clamped = Math.min(Math.max(percentage, 0), 1);\n const decimalIndex = (metrics.length - 1) * clamped;\n const leftIndex = Math.floor(decimalIndex);\n const rightIndex = Math.ceil(decimalIndex);\n\n const leftMetrics = metrics[leftIndex];\n if (!leftMetrics) return;\n\n const rightMetrics = metrics[rightIndex];\n\n let width;\n let activeTab;\n /** Center-based position */\n let center;\n if (leftMetrics === rightMetrics) {\n width = this.secondary ? leftMetrics.width : leftMetrics.label.width;\n activeTab = this.tabs.item(leftIndex);\n center = leftMetrics.center;\n } else {\n const leftRatio = 1 - (decimalIndex - leftIndex);\n const rightRatio = 1 - leftRatio;\n const leftWidth = leftRatio * (this.secondary ? leftMetrics.width : leftMetrics.label.width);\n const rightWidth = rightRatio * (this.secondary ? rightMetrics.width : rightMetrics.label.width);\n const activeIndex = leftRatio > rightRatio ? leftIndex : rightIndex;\n const distance = rightMetrics.center - leftMetrics.center;\n width = leftWidth + rightWidth;\n activeTab = this.tabs.item(activeIndex);\n center = leftMetrics.center + (distance * rightRatio);\n }\n\n if (!activeTab.active) {\n for (const tab of this.tabs) {\n tab.active = tab === activeTab;\n }\n this.active = true;\n }\n\n this._indicatorStyle = `--width: ${width}; --offset: ${center - (width / 2)}px`;\n this.refs.indicator.style.setProperty('--transition-ratio', '0');\n },\n /** @param {number} index */\n updateIndicatorByIndex(index) {\n this.updateIndicatorByTab(this.tabs.item(index ?? this._selectedIndex));\n },\n observeTabContent() {\n const tabContent = this.tabContent;\n if (!tabContent) return;\n let start = tabContent.scrollLeft;\n if (this.pageIsRTL) {\n start *= -1;\n }\n const width = tabContent.clientWidth;\n const max = tabContent.scrollWidth - width;\n const percentage = max === 0 ? 0 : start / max;\n this.updateIndicatorByPosition(percentage);\n },\n onResizeObserved() {\n this.clearCache();\n this.updateIndicator();\n },\n })\n\n .set({\n ariaRole: 'tablist',\n })\n .html/* html */`\n <slot id=slot ink={ink} type-style={typeStyle}></slot>\n <div id=indicator aria-hidden=true style={_indicatorStyle} active={active} secondary={secondary}>\n <div id=indicator-start class=indicator-piece></div>\n <div id=indicator-center class=indicator-piece></div>\n <div id=indicator-end class=indicator-piece></div>\n </div>\n `\n .on({\n composed() {\n const { shape, indicator } = this.refs;\n shape.append(indicator);\n },\n pageIsRTLChanged() {\n this.clearCache();\n this.updateIndicator();\n },\n activeChanged(oldValue, newValue) {\n if (newValue) {\n // Update indicator position without transition\n this.updateIndicator();\n }\n },\n secondaryChanged() {\n this.updateIndicator();\n },\n _selectedIndexChanged(oldValue, newValue) {\n this.updateIndicatorByIndex(newValue);\n },\n })\n .events({\n '~click'({ target }) {\n // Abort if not child\n if (target === this) return;\n if (target instanceof Tab) {\n // TODO: Override colors from scroll events\n }\n },\n })\n .childEvents({\n slot: {\n slotchange() {\n this.clearCache();\n this.updateIndicator();\n },\n },\n })\n .css`\n /* https://m3.material.io/components/tabs/specs */\n\n :host {\n --mdw-ink: var(--mdw-color__primary);\n --mdw-shape__bg: rgb(var(--mdw-color__surface));\n position: relative;\n position: sticky;\n inset-block-start: 0;\n inset-inline: 0;\n\n display: grid;\n align-items: stretch;\n grid-auto-columns: minmax(auto, 1fr);\n grid-auto-flow: column;\n justify-content: space-evenly;\n overflow-y: hidden;\n\n box-sizing: border-box;\n min-block-size: 48px;\n inline-size: 100%;\n flex:none;\n\n color: inherit;\n\n text-align: center;\n\n will-change: transform;\n }\n\n #indicator {\n --corner: 3;\n --width: 24;\n --offset: 0;\n --visibility: 0;\n --transition-ratio: 1;\n position: absolute;\n inset-block-end: 0;\n inset-inline: 0;\n\n overflow-y: clip;\n\n block-size: 3px;\n inline-size: 100%;\n\n pointer-events: none;\n\n opacity: 1;\n transform: translateY(calc(100% * (1 - var(--visibility))));\n\n color: inherit;\n\n transition: transform 200ms;\n will-change: transform;\n }\n\n .indicator-piece {\n position: absolute;\n inset-block: 0;\n\n opacity: 1;\n /* opacity: 0.60; */\n transform-origin: 0 0;\n z-index:1;\n\n background-color: currentColor;\n\n transition: transform;\n transition-duration: calc(200ms * var(--transition-ratio));\n will-change: transform;\n }\n\n #indicator-start {\n /* stylelint-disable-next-line liberty/use-logical-spec */\n left: 0;\n\n inline-size: calc(2 * 1px * var(--corner));\n\n transform: translateX(var(--offset));\n\n /* stylelint-disable-next-line liberty/use-logical-spec */\n border-top-left-radius: calc(1px * var(--corner));\n }\n\n #indicator-center {\n /* Chrome has rendering issues upscaling small elements */\n --precision: 100;\n\n position: absolute;\n /* stylelint-disable-next-line liberty/use-logical-spec */\n left: calc(1px * var(--corner));\n\n inline-size: calc(1px * var(--precision));\n\n transform: translateX(var(--offset)) scaleX(calc((var(--width) - (2 * var(--corner))) / var(--precision)));\n\n }\n\n #indicator-end {\n position: absolute;\n /* stylelint-disable-next-line liberty/use-logical-spec */\n left: 0;\n\n inline-size: calc(2 * 1px * var(--corner));\n\n transform:\n translateX(var(--offset))\n translateX(calc(-2px * var(--corner)))\n translateX(calc(var(--width) * 1px));\n\n /* stylelint-disable-next-line liberty/use-logical-spec */\n border-top-right-radius: calc(1px * var(--corner));\n }\n\n #indicator[active] {\n --visibility: 1;\n color: rgb(var(--mdw-ink));\n }\n\n #indicator[secondary] {\n --corner: 0;\n }\n\n :host([scrollable]) {\n grid-auto-columns: max-content;\n justify-content: flex-start;\n overflow-x: auto;\n\n padding-inline: 48px\n }\n `\n .autoRegister('mdw-tab-list');\n", "import AriaReflectorMixin from '../mixins/AriaReflectorMixin.js';\n\nimport Box from './Box.js';\n\nexport default Box\n .mixin(AriaReflectorMixin)\n .extend()\n .set({\n _ariaRole: 'tabpanel',\n })\n .observe({\n active: {\n type: 'boolean',\n changedCallback(oldValue, newValue) {\n this.updateAriaProperty('ariaHidden', newValue ? 'false' : 'true');\n },\n },\n peeking: 'boolean',\n })\n .css/* css */`\n :host {\n scroll-snap-align: center;\n min-inline-size: 100%;\n max-inline-size: 100%;\n min-block-size: 100%;\n max-block-size: 100%;\n overflow-y: auto;\n will-change: visibility;\n\n visibility: hidden; \n }\n :host(:is([active],[peeking])) {\n /* Safari bug: Visiblity not changing without !important or layout reflow */\n visibility: visible !important;;\n }\n `\n .autoRegister('mdw-tab-panel');\n", "import './TabList.js'; /* TabList must register before TabContent */\nimport CustomElement from '../core/CustomElement.js';\nimport ResizeObserverMixin from '../mixins/ResizeObserverMixin.js';\n\nimport TabPanel from './TabPanel.js';\n\nexport default CustomElement\n .mixin(ResizeObserverMixin)\n .extend()\n .set({\n /** @type {InstanceType<TabPanel>[]} */\n _panelNodes: [],\n /**\n * @type {{\n * left:number,\n * width:number,\n * right:number,\n * center: number,\n * index: number,\n * }[]}\n */\n _panelMetrics: null,\n })\n .observe({\n /** Internal observed property */\n _selectedIndex: {\n type: 'integer',\n empty: -1,\n },\n })\n .define({\n panels() {\n return this._panelNodes;\n },\n panelMetrics() {\n // eslint-disable-next-line no-return-assign\n return this._panelMetrics ??= [...this._panelNodes].map((panel, index) => ({\n left: panel.offsetLeft,\n width: panel.offsetWidth,\n right: panel.offsetLeft + panel.offsetWidth,\n center: panel.offsetLeft + (panel.offsetWidth / 2),\n index,\n }));\n },\n })\n .define({\n selectedIndex: {\n get() {\n let index = 0;\n for (const panel of this.panels) {\n if (panel.active) return index;\n index++;\n }\n return -1;\n },\n set(value) {\n let index = 0;\n for (const el of this.panels) {\n if (index === value) {\n el.active = true;\n this._selectedIndex = index;\n } else {\n el.active = false;\n }\n index++;\n }\n },\n },\n })\n .define({\n selectedPanel: {\n /**\n * @return {InstanceType<TabPanel>}\n */\n get() {\n return this.panels.find((panel) => panel.active);\n },\n /**\n * @param {InstanceType<TabPanel>} value\n * @return {InstanceType<TabPanel>}\n */\n set(value) {\n const index = this.panels.indexOf(value);\n if (index === -1) return null;\n this.selectedIndex = index;\n return value;\n },\n },\n })\n .html/* html */`<slot id=slot></slot>`\n .methods({\n onResizeObserved() {\n this._panelMetrics = null;\n // Resize should not change panel visibility\n },\n updatePanels() {\n const start = this.scrollLeft;\n const width = this.clientWidth;\n const end = start + width;\n for (const metric of this.panelMetrics) {\n const visibleWidth = (start > metric.right) || (end < metric.left) // Offscreen ?\n ? 0\n : (\n (start >= metric.left) // Scroll at or over panel left point?\n ? metric.right - start // Measure from panel right\n : end - metric.left // Measure from panel left\n );\n const percentage = visibleWidth / width;\n const panel = this.panels[metric.index];\n panel.active = percentage >= 0.5;\n // TODO: Investigate possible subpixel imprecision\n panel.peeking = percentage > 0 && percentage < 0.5;\n }\n },\n })\n .childEvents({\n slot: {\n slotchange(event) {\n const slot = /** @type {HTMLSlotElement} */ (event.currentTarget);\n // @ts-ignore Skip cast\n this._panelNodes = slot.assignedElements()\n .filter((el) => el.tagName === TabPanel.elementName.toUpperCase());\n this.updatePanels();\n },\n },\n })\n .events({\n scroll: 'updatePanels',\n })\n .css`\n :host {\n display: grid;\n grid-auto-columns: 100%;\n grid-auto-flow: column;\n grid-template-columns: 100%;\n overflow-x: auto;\n scroll-behavior: smooth;\n scroll-snap-type: x mandatory;\n scrollbar-width: none;\n\n flex-grow: 1;\n -webkit-scroll-snap-type-x: mandatory;\n scroll-snap-type-x: mandatory;\n -webkit-scroll-snap-points-x: repeat(100%);\n scroll-snap-points-x: repeat(100%);\n overscroll-behavior-x: none;\n\n will-change: transform; /* Avoid repaint on scroll */\n }\n `\n .autoRegister('mdw-tab-content');\n", "import CustomElement, { cloneAttributeCallback } from '../core/CustomElement.js';\nimport ControlMixin from '../mixins/ControlMixin.js';\nimport ResizeObserverMixin from '../mixins/ResizeObserverMixin.js';\nimport StateMixin from '../mixins/StateMixin.js';\nimport TextFieldMixin from '../mixins/TextFieldMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\nconst DOMString = { nullParser: String, value: '' };\n\n/**\n * @see https://html.spec.whatwg.org/multipage/form-elements.html#the-textarea-element\n * -implements {HTMLTextAreaElement}\n */\nexport default CustomElement\n .mixin(ThemableMixin)\n .mixin(StateMixin)\n .mixin(ControlMixin)\n .mixin(TextFieldMixin)\n .mixin(ResizeObserverMixin)\n .extend()\n .set({\n supportsCSSLineHeightUnit: CSS.supports('height', '1lh'),\n type: 'textarea',\n })\n .overrides({\n controlTagName: 'textarea',\n controlVoidElement: false,\n })\n .observe({\n fixed: { type: 'boolean' },\n minRows: { attr: 'minrows', type: 'integer', nullable: false },\n maxRows: { attr: 'maxrows', type: 'integer', nullable: false },\n _lineHeight: 'string',\n cols: { type: 'integer', empty: 0 },\n dirName: { attr: 'dirname', ...DOMString },\n maxLength: { attr: 'maxlength', type: 'integer', empty: 0 },\n minLength: { attr: 'minlength', type: 'integer', empty: 0 },\n placeholder: DOMString,\n rows: { type: 'integer', empty: 1 },\n wrap: DOMString,\n // Not in spec, but plays nice with HTML linters\n defaultValueAttr: { attr: 'value', ...DOMString },\n })\n .define({\n _textarea() { return /** @type {HTMLTextAreaElement} */ (this.refs.control); },\n })\n .define({\n defaultValue: {\n get() { return this._textarea.defaultValue; },\n set(value) {\n const previousValue = this._textarea.defaultValue;\n this._textarea.defaultValue = value;\n const newValue = this._textarea.defaultValue;\n if (previousValue !== newValue) {\n this.propChangedCallback('defaultValue', previousValue, newValue);\n }\n this.textContent = this._textarea.defaultValue;\n },\n },\n textLength() { return this._textarea.textLength; },\n select() { return this._textarea.select; },\n\n selectionDirection: {\n get() { return this._textarea.selectionDirection; },\n set(value) { this._textarea.selectionDirection = value; },\n },\n\n selectionStart: {\n get() { return this._textarea.selectionStart; },\n set(value) { this._textarea.selectionStart = value; },\n },\n\n selectionEnd: {\n get() { return this._textarea.selectionEnd; },\n set(value) { this._textarea.selectionEnd = value; },\n },\n\n setRangeText() { return this._textarea.setRangeText; },\n\n setSelectionRange() { return this._textarea.setSelectionRange; },\n\n })\n .methods({\n\n /** @return {number} */\n resize() {\n const textarea = this._textarea;\n textarea.style.removeProperty('height');\n\n // if (this.placeholder) textarea.removeAttribute('placeholder');\n\n if (!this.supportsCSSLineHeightUnit) {\n const { lineHeight } = window.getComputedStyle(textarea);\n this._lineHeight = lineHeight;\n }\n\n if (this.minRows > 1 && textarea.rows < this.minRows) {\n textarea.rows = this.minRows;\n } else if (this.maxRows && textarea.rows > this.maxRows) {\n textarea.rows = this.maxRows;\n }\n if (!this.fixed) {\n while (textarea.scrollHeight > textarea.clientHeight) {\n if (this.maxRows && textarea.rows === this.maxRows) break;\n const lastClientHeight = textarea.clientHeight;\n textarea.rows++;\n if (lastClientHeight === textarea.clientHeight) {\n textarea.rows--;\n break;\n }\n }\n while (textarea.scrollHeight === textarea.clientHeight) {\n if (textarea.rows === 1) break;\n if (this.minRows > 1 && textarea.rows === this.minRows) break;\n const lastClientHeight = textarea.clientHeight;\n textarea.rows--;\n if ((lastClientHeight === textarea.clientHeight)\n || (textarea.scrollHeight > textarea.clientHeight)) {\n textarea.rows++;\n break;\n }\n }\n }\n\n if (textarea.selectionEnd === textarea.value.length) {\n textarea.scrollTop = textarea.scrollHeight;\n }\n\n this.rows = textarea.rows;\n // if (this.placeholder) textarea.setAttribute('placeholder', this.placeholder);\n return this.rows;\n },\n\n /** @param {ResizeObserverEntry} entry */\n onResizeObserved(entry) {\n if (this.matches(':active')) return;\n this.resize();\n },\n })\n .childEvents({\n slot: {\n /**\n * @param {Event & {currentTarget:HTMLSlotElement}} event\n * @return {void}\n */\n slotchange({ currentTarget }) {\n const textarea = /** @type {HTMLTextAreaElement} */ (this.refs.control);\n const previousValue = textarea.defaultValue;\n textarea.replaceChildren(\n ...currentTarget.assignedNodes().map((child) => child.cloneNode(true)),\n );\n\n const newValue = textarea.defaultValue;\n if (previousValue !== newValue) {\n this.propChangedCallback('defaultValue', previousValue, newValue);\n }\n },\n },\n control: {\n input() {\n this.resize();\n },\n },\n })\n .on({\n composed() {\n const { control } = this.refs;\n // Spec\n control.removeAttribute('placeholder');\n control.setAttribute('rows', '{rows}');\n\n // Custom\n control.setAttribute('input-prefix', '{inputPrefix}');\n control.setAttribute('input-suffix', '{inputSuffix}');\n control.setAttribute('fixed', '{fixed}');\n control.setAttribute('icon', '{icon}');\n },\n defaultValueAttrChanged(oldValue, newValue) {\n this.defaultValue = newValue;\n },\n defaultValueChanged() {\n this._value = this._textarea.value;\n this.resize();\n },\n _lineHeightChanged(oldValue, newValue) {\n this.refs.label.style.setProperty('--line-height', newValue);\n },\n minRowsChanged(oldValue, newValue) {\n this.refs.label.style.setProperty('--min-rows', `${newValue || 'none'}`);\n this.resize();\n },\n maxRowsChanged(oldValue, newValue) {\n this.refs.label.style.setProperty('--max-rows', `${newValue || 'none'}`);\n this.resize();\n },\n rowsChanged() {\n this.resize();\n },\n _formResetChanged(oldValue, newValue) {\n if (!newValue) return;\n this._textarea.value = this.defaultValue;\n this._value = this._textarea.value;\n },\n attrs: {\n cols: cloneAttributeCallback('cols', 'control'),\n dirname: cloneAttributeCallback('dirname', 'control'),\n minlength: cloneAttributeCallback('minlength', 'control'),\n maxlength: cloneAttributeCallback('maxlength', 'control'),\n placeholder: cloneAttributeCallback('placeholder', 'control'),\n minrows: cloneAttributeCallback('minrows', 'control'),\n maxrows: cloneAttributeCallback('maxrows', 'control'),\n },\n })\n .css`\n /* https://m3.material.io/components/text-fields/specs */\n\n :host {\n display: inline-grid;\n grid-auto-flow: row;\n grid-template-rows: minmax(0, 100%);\n }\n\n :host(:is([filled][label])) {\n --control__margin-top: calc((var(--mdw-text-field__ratio) * 8px) + var(--mdw-typescale__body-small__line-height));\n --control__padding-top: 0px;\n --control__padding-bottom: calc((var(--mdw-text-field__ratio) * 8px) - 1px);\n --control__margin-bottom: 1px;\n }\n\n #label {\n --max-rows: none;\n --line-height: var(--mdw-typescale__body-large__line-height);\n --expected-height: calc(var(--line-height)\n + var(--control__margin-top)\n + var(--control__padding-top)\n + var(--control__padding-bottom)\n + var(--control__margin-bottom));\n max-block-size: 100%;\n grid-row: 1 / 1;\n padding: 0;\n }\n\n @supports(height: 1lh) {\n #label {\n --line-height: 1lh;\n }\n }\n\n #slot {\n display: none;\n }\n\n #control {\n -ms-overflow-style: -ms-autohiding-scrollbar;\n overflow-y: auto;\n -webkit-overflow-scrolling: touch;\n\n box-sizing: border-box;\n block-size: 100%;\n\n min-block-size: var(--expected-height);\n /* Avoid clipping on resize */\n max-block-size: inherit;\n inline-size: 100% !important; /* !important to override user-agent resize */\n padding-inline: 16px;\n }\n\n #control[icon] {\n padding-inline-start: 0;\n }\n\n #control[minrows] {\n min-block-size: calc((var(--min-rows) * var(--line-height))\n + var(--control__margin-top)\n + var(--control__padding-top)\n + var(--control__padding-bottom)\n + var(--control__margin-bottom)\n );\n }\n\n #control[maxrows] {\n max-block-size: calc((var(--max-rows) * var(--line-height))\n + var(--control__margin-top)\n + var(--control__padding-top)\n + var(--control__padding-bottom)\n + var(--control__margin-bottom)\n );\n }\n\n #control:is([icon], [input-prefix]) {\n padding-inline-start: 0;\n }\n\n #control:is([trailing-icon], [input-suffix]) {\n padding-inline-end: 0;\n }\n\n #suffix {\n padding-inline-end: 16px;\n }\n\n mdw-icon {\n align-self: flex-start;\n\n margin-block-start: calc((var(--expected-height) - var(--mdw-icon__size)) / 2);\n }\n\n #control[fixed] {\n /* stylelint-disable-next-line plugin/no-unsupported-browser-features */\n resize: none;\n }\n `\n .autoRegister('mdw-textarea');\n", "import Headline from './Headline.js';\n\nexport default Headline\n .extend()\n .expressions({\n computeAriaLevel({ ariaLevel, size }) {\n if (ariaLevel) return ariaLevel;\n if (size === 'medium') return '5';\n if (size === 'small') return '6';\n return '4';\n },\n })\n .css`\n :host {\n font: var(--mdw-typescale__title-large__font);\n letter-spacing: var(--mdw-typescale__title-large__letter-spacing);\n }\n \n :host([size=\"medium\"]) {\n font: var(--mdw-typescale__title-medium__font);\n letter-spacing: var(--mdw-typescale__title-medium__letter-spacing);\n }\n \n :host([size=\"small\"]) {\n font: var(--mdw-typescale__title-small__font);\n letter-spacing: var(--mdw-typescale__title-small__letter-spacing);\n }\n `\n .autoRegister('mdw-title');\n", "import CustomElement from '../core/CustomElement.js';\nimport { ELEMENT_STYLER_TYPE } from '../core/customTypes.js';\nimport AriaToolbarMixin from '../mixins/AriaToolbarMixin.js';\nimport ResizeObserverMixin from '../mixins/ResizeObserverMixin.js';\nimport ScrollListenerMixin from '../mixins/ScrollListenerMixin.js';\nimport SurfaceMixin from '../mixins/SurfaceMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\nexport default CustomElement\n .mixin(ThemableMixin)\n .mixin(SurfaceMixin) // TopAppBars are non-shaped surfaces\n .mixin(AriaToolbarMixin)\n .mixin(ScrollListenerMixin)\n .mixin(ResizeObserverMixin)\n .extend()\n .set({\n elevated: true,\n })\n .observe({\n headline: 'string',\n _raised: 'boolean', // Change to raw value instead of computed\n hideOnScroll: 'boolean',\n size: { value: /** @type {'small'|'medium'|'large'|null} */ (null) },\n _cssPosition: {\n /** @type {'sticky'|'relative'} */\n empty: 'relative',\n },\n _visibleStart: { type: 'float', default: 0 },\n _translateY: { type: 'float', empty: 0 },\n _duration: { type: 'float', empty: 0 },\n _easing: { empty: 'ease-in' },\n _headlineOpacity: { type: 'float', default: 0 },\n /** Convert to observable */\n ariaLabel: 'string',\n color: { empty: 'surface' },\n })\n .observe({\n _scrollDirection: {\n /**\n * @param {'up'|'down'} oldValue\n * @param {'up'|'down'} newValue\n */\n changedCallback(oldValue, newValue) {\n if (newValue === 'down') {\n if (this._cssPosition !== 'sticky') return;\n // Was sticky, switch to relative and let appbar scroll away\n this._cssPosition = 'relative';\n this._translateY = this.scrollListenerPositionY;\n return;\n }\n if (this._visibleStart < 1) return;\n // Align appbar.bottom with scroll position (top of screen)\n this._translateY = this.scrollListenerPositionY - this.refs.surface.scrollHeight;\n },\n },\n _surfaceStyle: {\n ...ELEMENT_STYLER_TYPE,\n get({ hideOnScroll, _cssPosition, _translateY, _duration, _easing }) {\n if (!hideOnScroll) {\n return null;\n }\n return {\n target: 'surface',\n styles: {\n position: _cssPosition,\n transform: `translateY(${_translateY}px)`,\n },\n timing: {\n duration: _duration,\n easing: _easing,\n },\n };\n },\n },\n _headlineStyle: {\n ...ELEMENT_STYLER_TYPE,\n get({ size, _headlineOpacity }) {\n if (size !== 'medium' && size !== 'large') return null;\n return {\n target: 'headline',\n styles: {\n opacity: _headlineOpacity ?? 0,\n },\n timing: {\n duration: 200,\n },\n };\n },\n },\n })\n .html/* html */`\n <slot id=leading name=leading on-slotchange={refreshTabIndexes}></slot>\n <div id=headline ink={ink} color={color} type-style={typeStyle} on-slotchange={refreshTabIndexes}>\n {headline}\n <slot id=headline-slot></slot>\n </div>\n <slot id=trailing name=trailing on-slotchange={refreshTabIndexes}></slot>\n <div _if=${({ size }) => size === 'medium' || size === 'large'} id=companion aria-hidden=true size={size}>\n <div _if={showSurfaceTint} id=companion-tint raised={_raised} class=surface-tint color={color}></div>\n <slot id=companion-slot name=companion size={size}>{headline}</span>\n </div>\n `\n .on({\n composed({ inline }) {\n const { surface, leading, headline, trailing } = this.refs;\n surface.append(leading, headline, trailing);\n surface.setAttribute('size', '{size}');\n surface.setAttribute('hide-on-scroll', '{hideOnScroll}');\n surface.setAttribute('role', 'toolbar');\n surface.setAttribute('aria-label', '{ariaLabel}');\n surface.setAttribute(\n 'aria-labelledby',\n inline(({ ariaLabel }) => (ariaLabel ? null : 'headline')),\n );\n },\n scrollListenerPositionYChanged(oldValue, newValue) {\n this._raised = (newValue > 0);\n if (this.size === 'medium' || this.size === 'large') {\n const max = this.refs.companion.scrollHeight;\n const min = (0.5 * max);\n this._headlineOpacity = Math.max(0, Math.min(1, (newValue - min) / (max - min)));\n }\n\n if (!this.hideOnScroll) return;\n\n this._duration = 0;\n if (newValue <= 0) {\n // Set at rest (top of parent, but allow overscroll)\n this._cssPosition = 'relative';\n this._translateY = 0;\n this._visibleStart = 0;\n } else if (newValue < this._translateY) {\n // Align appbar.top with scroll position (top of screen)\n this._cssPosition = 'sticky';\n this._translateY = 0;\n this._visibleStart = 0;\n } else if (this._cssPosition !== 'sticky') {\n this._visibleStart = (newValue - this._translateY) / this.refs.surface.scrollHeight;\n }\n\n this._scrollDirection = newValue > oldValue ? 'down' : 'up';\n },\n })\n .methods({\n onScrollIdle() {\n const _visibleStart = this._visibleStart;\n if (this._headlineOpacity > 0) {\n // Fill in opacity on idle\n this._headlineOpacity = 1;\n }\n if (_visibleStart <= 0) return;\n if (_visibleStart >= 1) return;\n if (this.scrollListenerPositionY < (this.refs.surface.scrollHeight)) return;\n if (_visibleStart <= 0.5) {\n // Reveal all\n this._duration = 250;\n this._easing = 'ease-in';\n this._cssPosition = 'relative';\n this._translateY = this.scrollListenerPositionY;\n this._headlineOpacity = 1;\n } else {\n this._duration = 200;\n this._easing = 'ease-out';\n this._cssPosition = 'relative';\n this._translateY = this.scrollListenerPositionY - this.refs.surface.scrollHeight;\n }\n },\n })\n .define({\n ariaActiveDescendantElement: {\n get() {\n // @ts-ignore Accessibility Object Model\n return this.refs.surface.ariaActiveDescendantElement;\n },\n set(value) {\n // @ts-ignore Accessibility Object Model\n this.refs.surface.ariaActiveDescendantElement = value;\n },\n },\n })\n .on({\n connected() {\n const { surface } = this.refs;\n if (surface.offsetParent) {\n this.startScrollListener(surface.offsetParent ?? window);\n } else {\n const resizeObserver = new ResizeObserver(() => {\n this.startScrollListener(surface.offsetParent ?? window);\n resizeObserver.disconnect();\n });\n resizeObserver.observe(surface);\n }\n },\n disconnected() {\n this.clearScrollListener();\n },\n })\n .css`\n /* https://m3.material.io/components/bottom-app-bar/specs */\n\n :host {\n --mdw-bg: var(--mdw-color__surface);\n --mdw-ink: var(--mdw-color__on-surface);\n --mdw-surface__tint: var(--mdw-surface__tint__0);\n --mdw-surface__tint__raised: var(--mdw-surface__tint__2);\n display: contents;\n\n z-index:2;\n }\n\n #surface {\n position: sticky;\n inset-block-start: 0;\n\n display: grid;\n\n align-items: center;\n gap: 12px;\n grid-auto-flow: row;\n grid-template-rows: minmax(64px,min-content);\n grid-template-columns: minmax(auto,1fr) minmax(0,auto) minmax(auto,1fr);\n overflow-x: clip; /* Clip oversized touch targets to avoid scroll-bars */\n overflow-y: visible;\n\n box-sizing: border-box;\n inline-size: 100%;\n max-inline-size: 100%;\n\n /* 16px from icon */\n /* inset = (button.width / 2) - (icon.width / 2) */\n /* paddingInline = 16px - inset */\n /* paddingInlineStart = 16px - ((48px / 2) - (24px / 2)) */\n /* paddingInlineEnd = 16px - ((48px / 2) - (30px / 2)) */\n\n padding-inline: 4px;\n\n pointer-events: auto;\n\n filter: none; /* Never receive shadow */\n\n z-index: 5;\n /* inset-inline: 0; */\n\n background-color: rgb(var(--mdw-bg));\n color: rgb(var(--mdw-ink));\n\n transition: grid-template-columns 100ms;\n\n }\n\n #surface-tint {\n position: 0;\n\n z-index: 1;\n }\n\n #leading {\n justify-self: flex-start;\n\n display: flex;\n align-items: center;\n\n grid-column: 1;\n grid-row: 1;\n }\n\n #headline {\n display: inline-block;\n\n overflow: clip hidden;\n\n max-inline-size: 100%;\n\n grid-column: 2;\n grid-row: 1;\n\n font: var(--mdw-typescale__title-large__font);\n letter-spacing: var(--mdw-typescale__title-large__letter-spacing);\n\n text-overflow: ellipsis;\n text-transform: none;\n white-space: nowrap;\n word-break: break-word;\n\n transition-duration: 200ms;\n transition-property: transform, opacity, color, background-color;\n }\n\n #trailing {\n justify-self: flex-end;\n\n display: flex;\n align-items: center;\n gap: 8px;\n justify-content: flex-end;\n\n grid-column: 3;\n grid-row: 1;\n\n color: var(--mdw-color__on-surface-variant);\n }\n\n /* Medium */\n #companion {\n position: relative;\n\n display: flex;\n align-items: flex-end;\n\n /**\n * Total Height = 112px\n * Bar = 12 + 40 + 12 (64)\n * Companion = 112px - 64\n * Companion Bottom = 20px\n * Companion = 28px\n * Shift up = 1lh - 28px\n */\n /* stylelint-disable-next-line declaration-property-value-disallowed-list */\n margin-block-start: calc(28px - var(--mdw-typescale__headline-small__line-height));\n padding-block-end: 20px;\n\n padding-inline: 16px;\n\n background-color: rgb(var(--mdw-bg));\n box-shadow: none;\n\n font: var(--mdw-typescale__headline-small__font);\n letter-spacing: var(--mdw-typescale__headline-small__letter-spacing);\n white-space: nowrap;\n }\n\n #companion[size=\"large\"] {\n /**\n * Total Height = 152px\n * Bar = 12 + 40 + 12 (64)\n * Companion = 152px - 64\n * Companion Bottom = 20px\n * Companion = 68px\n * Shift up = 2lh - 68px\n */\n\n min-block-size: calc(2 * var(--mdw-typescale__headline-medium__line-height));\n /* stylelint-disable-next-line declaration-property-value-disallowed-list */\n margin-block-start: calc(68px - (2 * var(--mdw-typescale__headline-medium__line-height)));\n\n font: var(--mdw-typescale__headline-medium__font);\n letter-spacing: var(--mdw-typescale__headline-medium__letter-spacing);\n white-space: normal;\n }\n\n @supports(width: 1lh) {\n #companion {\n /* stylelint-disable-next-line declaration-property-value-disallowed-list */\n margin-block-start: calc(28px - 1lh);\n }\n\n #companion[size=\"large\"] {\n min-block-size: 2lh;\n /* stylelint-disable-next-line declaration-property-value-disallowed-list */\n margin-block-start: calc(68px - 2lh);\n }\n }\n\n #companion-slot {\n display: block;\n overflow-x: clip;\n overflow-y: hidden;\n\n text-overflow: ellipsis;\n text-transform: none;\n word-break: break-word;\n }\n\n #companion-slot[size=\"large\"] {\n max-block-size: calc(2 * var(--mdw-typescale__headline-medium__line-height));\n }\n\n @supports(-webkit-line-clamp: 2) {\n #companion-slot[size=\"large\"] {\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 2;\n\n max-block-size: none;\n }\n }\n\n #surface[hide-on-scroll] {\n position: relative;\n\n inset-block-start: 0;\n\n transform: translateY(0);\n\n will-change: transform, position;\n }\n\n #surface[size=\"small\"] {\n gap: 4px;\n grid-template-columns: auto 1fr auto;\n }\n\n #headline:is([size=\"medium\"],[size=\"large\"]) {\n opacity: 0;\n\n will-change: opacity;\n }\n\n `\n .autoRegister('mdw-top-app-bar');\n", "import { css } from '../core/template.js';\n\nimport {\n generateThemeCSS,\n generateTypographyGlobalCSS,\n themeOptionsFromSearchParams,\n} from './index.js';\n\nconst rules = [\n generateThemeCSS(themeOptionsFromSearchParams(new URL(import.meta.url).searchParams)),\n generateTypographyGlobalCSS(),\n].join('\\n');\n\nconst parsed = css`${rules}`;\nif (parsed instanceof HTMLStyleElement) {\n document.head.append(parsed);\n} else {\n document.adoptedStyleSheets = [\n ...document.adoptedStyleSheets,\n parsed,\n ];\n}\n", "import { COLOR_KEYWORDS } from '../utils/color_keywords.js';\nimport { getScheme } from '../utils/hct/helper.js';\nimport { svgToCSSURL } from '../utils/svg.js';\n\n/**\n * @typedef {Object} ThemeOptions\n * @prop {string} [color]\n * @prop {Iterable<[string,string?]>} [custom] Map()\n * @prop {'auto'|'light'|'dark'} [lightness='auto']\n * @return {string}\n */\n\n/**\n * @param {string} shape\n * @return {string}\n */\nfunction getShapeMaskSVG(shape) {\n return [\n '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">',\n `<defs><path id=\"a\" d=\"${shape}\"/></defs>`,\n '<use href=\"#a\" transform=\"scale(.666)\"/>',\n '<use href=\"#a\" transform=\"translate(8) scale(.666)\"/>',\n '<use href=\"#a\" transform=\"matrix(.666 0 0 .666 0 8)\"/>',\n '<use href=\"#a\" transform=\"matrix(.666 0 0 .666 8 8)\"/>',\n '<path d=\"M8 0h8v24H8Z\"/><path d=\"M0 8h24v8H0Z\"/>',\n '</svg>',\n ].join('');\n}\n\n/**\n * @param {string} shape\n * @param {'top-left'|'top-right'|'bottom-left'|'bottom-right'} corner\n * @param {boolean} [convex]\n * @return {string}\n */\nfunction getShapeCornerSVGs(shape, corner, convex) {\n const path = `<path ${[\n `d=\"${shape}\"`,\n 'vector-effect=\"non-scaling-stroke\"',\n `transform-origin=\"${corner.replace('-', ' ')}\"`,\n 'stroke-linejoin=\"miter\"',\n 'transform=\"scale(2)\"',\n `stroke-width=\"${convex ? 4 : 2}px\"`,\n 'stroke=\"black\"',\n 'fill=\"none\"',\n ].join(' ')}/>`;\n\n return [\n '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">',\n convex\n ? [\n '<mask id=\"m\">',\n '<rect x=\"0\" y=\"0\" width=\"24\" height=\"24\" fill=\"white\"/>',\n `<path d=\"${shape}\" transform-origin=\"${corner.replace('-', ' ')}\" transform=\"scale(2)\"/>`,\n '</mask>',\n `<g mask=\"url(#m)\">${path}</g>`,\n ].join('')\n : path,\n '</svg>',\n ].join('');\n}\n\n/**\n * @return {string}\n */\nfunction getShapeEdgesSVGs() {\n return [\n '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">',\n '<rect x=\"0\" y=\"0\" width=\"24\" height=\"24\" vector-effect=\"non-scaling-stroke\" stroke-width=\"2px\" stroke=\"black\" fill=\"none\"/>',\n '</svg>',\n ].join('');\n}\n\nconst CIRCLE_PATH = 'M0 12A12 12 0 1012 0 12 12 0 000 12Z';\n// const SQUIRCLE_PATH = 'M12 24C17.2583 24 20.1815 24 22.0908 22.0908 24 20.1815 24 17.2583 24 12 24 6.7417 24 3.8185 22.0908 1.9092 20.1815-0 17.2583-0 12-0 6.7417-0 3.8185-0 1.9092 1.9092-0 3.8185-0 6.7417-0 12-0 17.2583-0 20.1815 1.9092 22.0908 3.8185 24 6.7417 24 12 24Z';\nconst DIAMOND_PATH = 'M 0 12 12 0 24 12 12 24 Z';\nconst SQUIRCLE_PATH = 'M12 24C17.2583 24 20.1815 24 22.0908 22.0908 24 20.1815 24 17.2583 24 12 24 6.7417 24 3.8185 22.0908 1.9092 20.1815-0 17.2583-0 12-0 6.7417-0 3.8185-0 1.9092 1.9092-0 3.8185-0 6.7417-0 12-0 17.2583-0 20.1815 1.9092 22.0908 3.8185 24 6.7417 24 12 24Z';\nconst HALF_NOTCH_PATH = 'M0 6H6V0H18V6H24V18H18V24H6V18H0Z';\n\nconst SHAPE_ROUNDED_DEFAULT = {\n size: {\n extraSmall: '4px',\n small: '8px',\n medium: '12px',\n large: '16px',\n extraLarge: '28px',\n full: '32px',\n },\n /** @type {string?} */\n mask: CIRCLE_PATH, // CIRCLE_PATH\n convex: false,\n};\n\nconst SHAPE_CUT_DEFAULT = {\n ...SHAPE_ROUNDED_DEFAULT,\n size: {\n extraSmall: '4px',\n small: '8px',\n medium: '12px',\n large: '16px',\n extraLarge: '28px',\n full: '32px',\n },\n mask: DIAMOND_PATH,\n};\n\nconst SHAPE_SQUIRCLE_DEFAULT = {\n ...SHAPE_ROUNDED_DEFAULT,\n mask: SQUIRCLE_PATH,\n};\n\nconst SP = 1 / 16;\n\nconst TYPOGRAPHY_DEFAULT = {\n face: {\n brand: '\"Roboto Medium\", Roboto, -apple-system, BlinkMacSystemFont, \"Segoe UI Variable Display\", Helvetica, \"Segoe UI\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\"',\n plain: '\"Roboto Regular\", Roboto, -apple-system, BlinkMacSystemFont, \"Segoe UI Variable Text\", Helvetica, \"Segoe UI\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\"',\n weight: {\n regular: 400,\n medium: 500,\n },\n },\n scale: {\n display: {\n large: {\n fontFamily: 'var(--mdw-typeface__brand)',\n lineHeight: 64,\n fontSize: 57,\n letterSpacing: 0,\n weight: 'var(--mdw-typeface__weight-regular)',\n },\n medium: {\n fontFamily: 'var(--mdw-typeface__brand)',\n lineHeight: 52,\n fontSize: 45,\n letterSpacing: 0,\n weight: 'var(--mdw-typeface__weight-regular)',\n },\n small: {\n fontFamily: 'var(--mdw-typeface__brand)',\n lineHeight: 44,\n fontSize: 36,\n letterSpacing: 0,\n weight: 'var(--mdw-typeface__weight-regular)',\n },\n },\n headline: {\n large: {\n fontFamily: 'var(--mdw-typeface__brand)',\n lineHeight: 40,\n fontSize: 32,\n letterSpacing: 0,\n weight: 'var(--mdw-typeface__weight-regular)',\n },\n medium: {\n fontFamily: 'var(--mdw-typeface__brand)',\n lineHeight: 36,\n fontSize: 28,\n letterSpacing: 0,\n weight: 'var(--mdw-typeface__weight-regular)',\n },\n small: {\n fontFamily: 'var(--mdw-typeface__brand)',\n lineHeight: 32,\n fontSize: 24,\n letterSpacing: 0,\n weight: 'var(--mdw-typeface__weight-regular)',\n },\n },\n title: {\n large: {\n fontFamily: 'var(--mdw-typeface__brand)',\n lineHeight: 28,\n fontSize: 22,\n letterSpacing: 0,\n weight: 'var(--mdw-typeface__weight-medium)', // Figma style has regular\n },\n medium: {\n fontFamily: 'var(--mdw-typeface__plain)',\n lineHeight: 24,\n fontSize: 16,\n letterSpacing: 0.15,\n weight: 'var(--mdw-typeface__weight-medium)',\n },\n small: {\n fontFamily: 'var(--mdw-typeface__plain)',\n lineHeight: 20,\n fontSize: 14,\n letterSpacing: 0.1,\n weight: 'var(--mdw-typeface__weight-medium)',\n },\n },\n label: {\n large: {\n fontFamily: 'var(--mdw-typeface__plain)',\n lineHeight: 20,\n fontSize: 14,\n letterSpacing: 0.1,\n weight: 'var(--mdw-typeface__weight-medium)',\n },\n medium: {\n fontFamily: 'var(--mdw-typeface__plain)',\n lineHeight: 16,\n fontSize: 12,\n letterSpacing: 0.5,\n weight: 'var(--mdw-typeface__weight-medium)',\n },\n small: {\n fontFamily: 'var(--mdw-typeface__plain)',\n lineHeight: 16,\n fontSize: 11,\n letterSpacing: 0.5,\n weight: 'var(--mdw-typeface__weight-medium)',\n },\n },\n body: {\n large: {\n fontFamily: 'var(--mdw-typeface__plain)',\n lineHeight: 24,\n fontSize: 16,\n letterSpacing: 0.5, // Figma text has 0.15\n weight: 'var(--mdw-typeface__weight-regular)',\n },\n medium: {\n fontFamily: 'var(--mdw-typeface__plain)',\n lineHeight: 20,\n fontSize: 14,\n letterSpacing: 0.25,\n weight: 'var(--mdw-typeface__weight-regular)',\n },\n small: {\n fontFamily: 'var(--mdw-typeface__brand)',\n lineHeight: 16,\n fontSize: 12,\n letterSpacing: 0.4,\n weight: 'var(--mdw-typeface__weight-regular)',\n },\n },\n },\n};\n\n/**\n * @param {typeof TYPOGRAPHY_DEFAULT} config\n * @return {string}\n */\nexport function generateTypographyCSS(config = TYPOGRAPHY_DEFAULT) {\n return /* css */ `\n :root {\n --mdw-typeface__brand: ${config.face.brand};\n --mdw-typeface__weight-regular: ${config.face.weight.regular};\n --mdw-typeface__weight-medium: ${config.face.weight.medium};\n --mdw-typeface__plain: ${config.face.plain};\n\n --mdw-typescale__display-large__font-family: ${config.scale.display.large.fontFamily};\n --mdw-typescale__display-large__line-height: calc(${config.scale.display.large.lineHeight} * 0.0625rem);\n --mdw-typescale__display-large__font-size: calc(${config.scale.display.large.fontSize} * 0.0625rem);\n --mdw-typescale__display-large__letter-spacing: calc(${config.scale.display.large.letterSpacing} * 0.0625rem);\n --mdw-typescale__display-large__font-weight: ${config.scale.display.large.weight};\n\n --mdw-typescale__display-medium__font-family: ${config.scale.display.medium.fontFamily};\n --mdw-typescale__display-medium__line-height: calc(${config.scale.display.medium.lineHeight} * 0.0625rem);\n --mdw-typescale__display-medium__font-size: calc(${config.scale.display.medium.fontSize} * 0.0625rem);\n --mdw-typescale__display-medium__letter-spacing: calc(${config.scale.display.medium.letterSpacing} * 0.0625rem);\n --mdw-typescale__display-medium__font-weight: ${config.scale.display.medium.weight};\n\n --mdw-typescale__display-small__font-family: ${config.scale.display.small.fontFamily};\n --mdw-typescale__display-small__line-height: calc(${config.scale.display.small.lineHeight} * 0.0625rem);\n --mdw-typescale__display-small__font-size: calc(${config.scale.display.small.fontSize} * 0.0625rem);\n --mdw-typescale__display-small__letter-spacing: calc(${config.scale.display.small.letterSpacing} * 0.0625rem);\n --mdw-typescale__display-small__font-weight: ${config.scale.display.small.weight};\n\n --mdw-typescale__headline-large__font-family: ${config.scale.headline.large.fontFamily};\n --mdw-typescale__headline-large__line-height: calc(${config.scale.headline.large.lineHeight} * 0.0625rem);\n --mdw-typescale__headline-large__font-size: calc(${config.scale.headline.large.fontSize} * 0.0625rem);\n --mdw-typescale__headline-large__letter-spacing: calc(${config.scale.headline.large.letterSpacing} * 0.0625rem);\n --mdw-typescale__headline-large__font-weight: ${config.scale.headline.large.weight};\n\n --mdw-typescale__headline-medium__font-family: ${config.scale.headline.medium.fontFamily};\n --mdw-typescale__headline-medium__line-height: calc(${config.scale.headline.medium.lineHeight} * 0.0625rem);\n --mdw-typescale__headline-medium__font-size: calc(${config.scale.headline.medium.fontSize} * 0.0625rem);\n --mdw-typescale__headline-medium__letter-spacing: calc(${config.scale.headline.medium.letterSpacing} * 0.0625rem);\n --mdw-typescale__headline-medium__font-weight: ${config.scale.headline.medium.weight};\n\n --mdw-typescale__headline-small__font-family: ${config.scale.headline.small.fontFamily};\n --mdw-typescale__headline-small__line-height: calc(${config.scale.headline.small.lineHeight} * 0.0625rem);\n --mdw-typescale__headline-small__font-size: calc(${config.scale.headline.small.fontSize} * 0.0625rem);\n --mdw-typescale__headline-small__letter-spacing: calc(${config.scale.headline.small.letterSpacing} * 0.0625rem);\n --mdw-typescale__headline-small__font-weight: ${config.scale.headline.small.weight};\n\n --mdw-typescale__title-large__font-family: ${config.scale.title.large.fontFamily};\n --mdw-typescale__title-large__line-height: calc(${config.scale.title.large.lineHeight} * 0.0625rem);\n --mdw-typescale__title-large__font-size: calc(${config.scale.title.large.fontSize} * 0.0625rem);\n --mdw-typescale__title-large__letter-spacing: calc(${config.scale.title.large.letterSpacing} * 0.0625rem);\n --mdw-typescale__title-large__font-weight: ${config.scale.title.large.weight};\n\n --mdw-typescale__title-medium__font-family: ${config.scale.title.medium.fontFamily};\n --mdw-typescale__title-medium__line-height: calc(${config.scale.title.medium.lineHeight} * 0.0625rem);\n --mdw-typescale__title-medium__font-size: calc(${config.scale.title.medium.fontSize} * 0.0625rem);\n --mdw-typescale__title-medium__letter-spacing: calc(${config.scale.title.medium.letterSpacing} * 0.0625rem);\n --mdw-typescale__title-medium__font-weight: ${config.scale.title.medium.weight};\n\n --mdw-typescale__title-small__font-family: ${config.scale.title.small.fontFamily};\n --mdw-typescale__title-small__line-height: calc(${config.scale.title.small.lineHeight} * 0.0625rem);\n --mdw-typescale__title-small__font-size: calc(${config.scale.title.small.fontSize} * 0.0625rem);\n --mdw-typescale__title-small__letter-spacing: calc(${config.scale.title.small.letterSpacing} * 0.0625rem);\n --mdw-typescale__title-small__font-weight: ${config.scale.title.small.weight};\n\n --mdw-typescale__label-large__font-family: ${config.scale.label.large.fontFamily};\n --mdw-typescale__label-large__line-height: calc(${config.scale.label.large.lineHeight} * 0.0625rem);\n --mdw-typescale__label-large__font-size: calc(${config.scale.label.large.fontSize} * 0.0625rem);\n --mdw-typescale__label-large__letter-spacing: calc(${config.scale.label.large.letterSpacing} * 0.0625rem);\n --mdw-typescale__label-large__font-weight: ${config.scale.label.large.weight};\n\n --mdw-typescale__label-medium__font-family: ${config.scale.label.medium.fontFamily};\n --mdw-typescale__label-medium__line-height: calc(${config.scale.label.medium.lineHeight} * 0.0625rem);\n --mdw-typescale__label-medium__font-size: calc(${config.scale.label.medium.fontSize} * 0.0625rem);\n --mdw-typescale__label-medium__letter-spacing: calc(${config.scale.label.medium.letterSpacing} * 0.0625rem);\n --mdw-typescale__label-medium__font-weight: ${config.scale.label.medium.weight};\n\n --mdw-typescale__label-small__font-family: ${config.scale.label.small.fontFamily};\n --mdw-typescale__label-small__line-height: calc(${config.scale.label.small.lineHeight} * 0.0625rem);\n --mdw-typescale__label-small__font-size: calc(${config.scale.label.small.fontSize} * 0.0625rem);\n --mdw-typescale__label-small__letter-spacing: calc(${config.scale.label.small.letterSpacing} * 0.0625rem);\n --mdw-typescale__label-small__font-weight: ${config.scale.label.small.weight};\n\n --mdw-typescale__body-large__font-family: ${config.scale.body.large.fontFamily};\n --mdw-typescale__body-large__line-height: calc(${config.scale.body.large.lineHeight} * 0.0625rem);\n --mdw-typescale__body-large__font-size: calc(${config.scale.body.large.fontSize} * 0.0625rem);\n --mdw-typescale__body-large__letter-spacing: calc(${config.scale.body.large.letterSpacing} * 0.0625rem);\n --mdw-typescale__body-large__font-weight: ${config.scale.body.large.weight};\n\n --mdw-typescale__body-medium__font-family: ${config.scale.body.medium.fontFamily};\n --mdw-typescale__body-medium__line-height: calc(${config.scale.body.medium.lineHeight} * 0.0625rem);\n --mdw-typescale__body-medium__font-size: calc(${config.scale.body.medium.fontSize} * 0.0625rem);\n --mdw-typescale__body-medium__letter-spacing: calc(${config.scale.body.medium.letterSpacing} * 0.0625rem);\n --mdw-typescale__body-medium__font-weight: ${config.scale.body.medium.weight};\n\n --mdw-typescale__body-small__font-family: ${config.scale.body.small.fontFamily};\n --mdw-typescale__body-small__line-height: calc(${config.scale.body.small.lineHeight} * 0.0625rem);\n --mdw-typescale__body-small__font-size: calc(${config.scale.body.small.fontSize} * 0.0625rem);\n --mdw-typescale__body-small__letter-spacing: calc(${config.scale.body.small.letterSpacing} * 0.0625rem);\n --mdw-typescale__body-small__font-weight: ${config.scale.body.small.weight};\n }`;\n}\n\n/** @return {string} */\nexport function generateTypographyGlobalCSS() {\n return /* css */ `\n :root {${['display', 'headline', 'title', 'label', 'body']\n .map((style) => ['large', 'medium', 'small']\n .map((size) => `--mdw-typescale__${style}-${size}__font: ${\n [\n `var(--mdw-typescale__${style}-${size}__font-weight)`,\n `var(--mdw-typescale__${style}-${size}__font-size)/var(--mdw-typescale__${style}-${size}__line-height)`,\n `var(--mdw-typescale__${style}-${size}__font-family)`,\n ].join(' ')\n };`).join('\\n'))\n .join('\\n')}}`;\n}\n\n/**\n * @param {typeof SHAPE_ROUNDED_DEFAULT} config\n * @return {string}\n */\nexport function generateShapeCSS(config = SHAPE_ROUNDED_DEFAULT) {\n return /* css */`\n :root {\n --mdw-shape__extra-small: ${config.size.extraSmall};\n --mdw-shape__small: ${config.size.small};\n --mdw-shape__medium: ${config.size.medium};\n --mdw-shape__large: ${config.size.large};\n --mdw-shape__extra-large: ${config.size.extraLarge};\n --mdw-shape__full: ${config.size.full};\n --mdw-shape__rounded: ${config.mask ? '0' : '1'};\n --mdw-shape__outline__background: ${config.mask ? 'currentColor' : 'transparent'};\n --mdw-shape__convex: ${config.convex ? '1' : '0'};\n --mdw-shape__mask-border-source: ${config.mask ? svgToCSSURL(getShapeMaskSVG(config.mask)) : 'none'};\n --mdw-shape__mask-image__top-left: ${config.mask ? svgToCSSURL(getShapeCornerSVGs(config.mask, 'top-left')) : 'none'};\n --mdw-shape__mask-image__top-right: ${config.mask ? svgToCSSURL(getShapeCornerSVGs(config.mask, 'top-right')) : 'none'};\n --mdw-shape__mask-image__bottom-right: ${config.mask ? svgToCSSURL(getShapeCornerSVGs(config.mask, 'bottom-right')) : 'none'};\n --mdw-shape__mask-image__bottom-left: ${config.mask ? svgToCSSURL(getShapeCornerSVGs(config.mask, 'bottom-left')) : 'none'};\n --mdw-shape__mask-image__edges: ${config.mask ? svgToCSSURL(getShapeEdgesSVGs()) : 'none'};\n }\n `;\n}\n\n/**\n * @param {string} content\n * @return {HTMLStyleElement } element\n */\nfunction addStyle(content) {\n const element = document.createElement('style');\n element.textContent = content;\n document.head.append(element);\n return element;\n}\n\n/**\n * @param {ThemeOptions} options\n * @return {string}\n */\nexport function generateColorCSS({ color = '#6750A4', custom = [], lightness = 'light' }) {\n /** @type {[string,string][]} */\n const parsedColors = [...custom]\n .map(([name, hex]) => [name, COLOR_KEYWORDS.get(hex) || hex || COLOR_KEYWORDS.get(name)]);\n const scheme = getScheme(color, parsedColors);\n if (lightness === 'dark') {\n return scheme.dark;\n }\n return scheme.light;\n}\n\n/**\n * @param {ThemeOptions} options\n * @return {void}\n */\nexport function setupTheme({ color = '#6750A4', custom = [], lightness = 'auto' }) {\n /** @type {[string,string][]} */\n const parsedColors = [...custom]\n .map(([name, hex]) => [name, COLOR_KEYWORDS.get(hex) || hex || COLOR_KEYWORDS.get(name)]);\n const scheme = getScheme(color, parsedColors);\n if (lightness === 'dark') {\n addStyle(scheme.dark);\n } else {\n addStyle(scheme.light);\n if (lightness !== 'light') {\n addStyle(scheme.dark).media = '(prefers-color-scheme:dark)';\n }\n }\n addStyle(generateShapeCSS());\n addStyle(generateTypographyCSS());\n}\n\n/**\n * @param {URLSearchParams} searchParams\n * @return {ThemeOptions}\n */\nexport function themeOptionsFromSearchParams(searchParams) {\n const color = searchParams.get('color') || '#6750A4';\n\n /** @type {[string,string?][]} */\n const custom = searchParams.getAll('custom')\n .flatMap((c) => c.split(','))\n .map((c) => c.split(':'));\n\n const lightness = searchParams.get('lightness') ?? 'auto';\n return { color, custom, lightness };\n}\n\n/**\n * @param {ThemeOptions} options\n * @return {string}\n */\nexport function generateThemeCSS({ color = '#6750A4', custom = [], lightness = 'auto' }) {\n const shapeCss = generateShapeCSS();\n const typographyCss = generateTypographyCSS();\n let colorCss;\n if (lightness === 'light' || lightness === 'dark') {\n colorCss = generateColorCSS({ color, custom, lightness });\n } else {\n colorCss = `\n ${generateColorCSS({ color, custom, lightness: 'light' })}\n @media (prefers-color-scheme:dark) {\n :root { color-scheme: dark; }\n ${generateColorCSS({ color, custom, lightness: 'dark' })}\n }`;\n }\n return [\n shapeCss,\n typographyCss,\n colorCss,\n ].join('\\n');\n}\n", "// https://developer.mozilla.org/en-US/docs/Web/CSS/color_value/color_keywords\nexport const COLOR_KEYWORDS = new Map([\n ['black', '#000000'],\n ['silver', '#c0c0c0'],\n ['gray', '#808080'],\n ['white', '#ffffff'],\n ['maroon', '#800000'],\n ['red', '#ff0000'],\n ['purple', '#800080'],\n ['fuchsia', '#ff00ff'],\n ['green', '#008000'],\n ['lime', '#00ff00'],\n ['olive', '#808000'],\n ['yellow', '#ffff00'],\n ['navy', '#000080'],\n ['blue', '#0000ff'],\n ['teal', '#008080'],\n ['aqua', '#00ffff'],\n ['orange', '#ffa500'],\n ['aliceblue', '#f0f8ff'],\n ['antiquewhite', '#faebd7'],\n ['aquamarine', '#7fffd4'],\n ['azure', '#f0ffff'],\n ['beige', '#f5f5dc'],\n ['bisque', '#ffe4c4'],\n ['blanchedalmond', '#ffebcd'],\n ['blueviolet', '#8a2be2'],\n ['brown', '#a52a2a'],\n ['burlywood', '#deb887'],\n ['cadetblue', '#5f9ea0'],\n ['chartreuse', '#7fff00'],\n ['chocolate', '#d2691e'],\n ['coral', '#ff7f50'],\n ['cornflowerblue', '#6495ed'],\n ['cornsilk', '#fff8dc'],\n ['crimson', '#dc143c'],\n ['cyan', '00ffff'],\n ['darkblue', '#00008b'],\n ['darkcyan', '#008b8b'],\n ['darkgoldenrod', '#b8860b'],\n ['darkgray', '#a9a9a9'],\n ['darkgreen', '#006400'],\n ['darkgrey', '#a9a9a9'],\n ['darkkhaki', '#bdb76b'],\n ['darkmagenta', '#8b008b'],\n ['darkolivegreen', '#556b2f'],\n ['darkorange', '#ff8c00'],\n ['darkorchid', '#9932cc'],\n ['darkred', '#8b0000'],\n ['darksalmon', '#e9967a'],\n ['darkseagreen', '#8fbc8f'],\n ['darkslateblue', '#483d8b'],\n ['darkslategray', '#2f4f4f'],\n ['darkslategrey', '#2f4f4f'],\n ['darkturquoise', '#00ced1'],\n ['darkviolet', '#9400d3'],\n ['deeppink', '#ff1493'],\n ['deepskyblue', '#00bfff'],\n ['dimgray', '#696969'],\n ['dimgrey', '#696969'],\n ['dodgerblue', '#1e90ff'],\n ['firebrick', '#b22222'],\n ['floralwhite', '#fffaf0'],\n ['forestgreen', '#228b22'],\n ['gainsboro', '#dcdcdc'],\n ['ghostwhite', '#f8f8ff'],\n ['gold', '#ffd700'],\n ['goldenrod', '#daa520'],\n ['greenyellow', '#adff2f'],\n ['grey', '#808080'],\n ['honeydew', '#f0fff0'],\n ['hotpink', '#ff69b4'],\n ['indianred', '#cd5c5c'],\n ['indigo', '#4b0082'],\n ['ivory', '#fffff0'],\n ['khaki', '#f0e68c'],\n ['lavender', '#e6e6fa'],\n ['lavenderblush', '#fff0f5'],\n ['lawngreen', '#7cfc00'],\n ['lemonchiffon', '#fffacd'],\n ['lightblue', '#add8e6'],\n ['lightcoral', '#f08080'],\n ['lightcyan', '#e0ffff'],\n ['lightgoldenrodyellow', '#fafad2'],\n ['lightgray', '#d3d3d3'],\n ['lightgreen', '#90ee90'],\n ['lightgrey', '#d3d3d3'],\n ['lightpink', '#ffb6c1'],\n ['lightsalmon', '#ffa07a'],\n ['lightseagreen', '#20b2aa'],\n ['lightskyblue', '#87cefa'],\n ['lightslategray', '#778899'],\n ['lightslategrey', '#778899'],\n ['lightsteelblue', '#b0c4de'],\n ['lightyellow', '#ffffe0'],\n ['limegreen', '#32cd32'],\n ['linen', '#faf0e6'],\n ['magenta', '#ff00ff'],\n ['mediumaquamarine', '#66cdaa'],\n ['mediumblue', '#0000cd'],\n ['mediumorchid', '#ba55d3'],\n ['mediumpurple', '#9370db'],\n ['mediumseagreen', '#3cb371'],\n ['mediumslateblue', '#7b68ee'],\n ['mediumspringgreen', '#00fa9a'],\n ['mediumturquoise', '#48d1cc'],\n ['mediumvioletred', '#c71585'],\n ['midnightblue', '#191970'],\n ['mintcream', '#f5fffa'],\n ['mistyrose', '#ffe4e1'],\n ['moccasin', '#ffe4b5'],\n ['navajowhite', '#ffdead'],\n ['oldlace', '#fdf5e6'],\n ['olivedrab', '#6b8e23'],\n ['orangered', '#ff4500'],\n ['orchid', '#da70d6'],\n ['palegoldenrod', '#eee8aa'],\n ['palegreen', '#98fb98'],\n ['paleturquoise', '#afeeee'],\n ['palevioletred', '#db7093'],\n ['papayawhip', '#ffefd5'],\n ['peachpuff', '#ffdab9'],\n ['peru', '#cd853f'],\n ['pink', '#ffc0cb'],\n ['plum', '#dda0dd'],\n ['powderblue', '#b0e0e6'],\n ['rosybrown', '#bc8f8f'],\n ['royalblue', '#4169e1'],\n ['saddlebrown', '#8b4513'],\n ['salmon', '#fa8072'],\n ['sandybrown', '#f4a460'],\n ['seagreen', '#2e8b57'],\n ['seashell', '#fff5ee'],\n ['sienna', '#a0522d'],\n ['skyblue', '#87ceeb'],\n ['slateblue', '#6a5acd'],\n ['slategray', '#708090'],\n ['slategrey', '#708090'],\n ['snow', '#fffafa'],\n ['springgreen', '#00ff7f'],\n ['steelblue', '#4682b4'],\n ['tan', '#d2b48c'],\n ['thistle', '#d8bfd8'],\n ['tomato', '#ff6347'],\n ['turquoise', '#40e0d0'],\n ['violet', '#ee82ee'],\n ['wheat', '#f5deb3'],\n ['whitesmoke', '#f5f5f5'],\n ['yellowgreen', '#9acd32'],\n ['rebeccapurple', '#663399'],\n]);\n", "/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// This file is automatically generated. Do not modify it.\n\n/**\n * Utility methods for mathematical operations.\n */\n\n/**\n * The signum function.\n * @param {number} num\n * @return {1|-1|0} 1 if num > 0, -1 if num < 0, and 0 if num = 0\n */\nexport function signum(num) {\n if (num < 0) {\n return -1;\n }\n if (num === 0) {\n return 0;\n }\n return 1;\n}\n\n/**\n * The linear interpolation function.\n * @param {number} start\n * @param {number} stop\n * @param {number} amount\n * @return {number} start if amount = 0 and stop if amount = 1\n */\nexport function lerp(start, stop, amount) {\n return (1 - amount) * start + amount * stop;\n}\n\n/**\n * Clamps an integer between two integers.\n * @param {number} min\n * @param {number} max\n * @param {number} input\n * @return {number} input when min <= input <= max, and either min or max\n * otherwise.\n */\nexport function clampInt(min, max, input) {\n if (input < min) {\n return min;\n } if (input > max) {\n return max;\n }\n\n return input;\n}\n\n/**\n * Clamps an integer between two floating-point numbers.\n * @param {number} min\n * @param {number} max\n * @param {number} input\n * @return {number} input when min <= input <= max, and either min or max\n * otherwise.\n */\nexport function clampDouble(min, max, input) {\n if (input < min) {\n return min;\n } if (input > max) {\n return max;\n }\n\n return input;\n}\n\n/**\n * Sanitizes a degree measure as an integer.\n * @param {number} degrees\n * @return {number} a degree measure between 0 (inclusive) and 360\n * (exclusive).\n */\nexport function sanitizeDegreesInt(degrees) {\n degrees %= 360;\n if (degrees < 0) {\n degrees += 360;\n }\n return degrees;\n}\n\n/**\n * Sanitizes a degree measure as a floating-point number.\n * @param {number} degrees\n * @return {number} a degree measure between 0.0 (inclusive) and 360.0\n * (exclusive).\n */\nexport function sanitizeDegreesDouble(degrees) {\n degrees %= 360;\n if (degrees < 0) {\n degrees += 360;\n }\n return degrees;\n}\n\n/**\n * Sign of direction change needed to travel from one angle to\n * another.\n *\n * For angles that are 180 degrees apart from each other, both\n * directions have the same travel distance, so either direction is\n * shortest. The value 1.0 is returned in this case.\n * @param {number} from The angle travel starts from, in degrees.\n * @param {number} to The angle travel ends at, in degrees.\n * @return {number} -1 if decreasing from leads to the shortest travel\n * distance, 1 if increasing from leads to the shortest travel\n * distance.\n */\nexport function rotationDirection(from, to) {\n const increasingDifference = sanitizeDegreesDouble(to - from);\n return increasingDifference <= 180 ? 1 : -1;\n}\n\n/**\n * Distance of two points on a circle, represented using degrees.\n * @param {number} a\n * @param {number} b\n * @return {number}\n */\nexport function differenceDegrees(a, b) {\n return 180 - Math.abs(Math.abs(a - b) - 180);\n}\n\n/**\n * Multiplies a 1x3 row vector with a 3x3 matrix.\n * @param {number[]} row\n * @param {number[][]} matrix\n * @return {number[]}\n */\nexport function matrixMultiply(row, matrix) {\n const a = row[0] * matrix[0][0] + row[1] * matrix[0][1] + row[2] * matrix[0][2];\n const b = row[0] * matrix[1][0] + row[1] * matrix[1][1] + row[2] * matrix[1][2];\n const c = row[0] * matrix[2][0] + row[1] * matrix[2][1] + row[2] * matrix[2][2];\n return [a, b, c];\n}\n", "/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// This file is automatically generated. Do not modify it.\n\nimport * as mathUtils from './mathUtils.js';\n\n/**\n * Color science utilities.\n *\n * Utility methods for color science constants and color space\n * conversions that aren't HCT or CAM16.\n */\n\nconst SRGB_TO_XYZ = [\n [0.412_338_95, 0.357_620_64, 0.180_510_42],\n [0.2126, 0.7152, 0.0722],\n [0.019_321_41, 0.119_163_82, 0.950_344_78],\n];\n\nconst XYZ_TO_SRGB = [\n [\n 3.241_377_479_238_868_5,\n -1.537_665_240_285_185_1,\n -0.498_853_668_462_680_53,\n ],\n [\n -0.969_145_251_300_532_1,\n 1.875_885_345_106_787_2,\n 0.041_565_856_169_120_61,\n ],\n [\n 0.055_620_936_896_913_05,\n -0.203_955_245_647_421_23,\n 1.057_179_911_122_033_5,\n ],\n];\n\nconst WHITE_POINT_D65 = [95.047, 100, 108.883];\n\n/**\n * Converts a color from RGB components to ARGB format.\n * @param {number} red\n * @param {number} green\n * @param {number} blue\n * @return {number}\n */\nexport function argbFromRgb(red, green, blue) {\n return (255 << 24 | (red & 255) << 16 | (green & 255) << 8 | blue & 255)\n >>> 0;\n}\n\n/**\n * Converts a color from linear RGB components to ARGB format.\n * @param {number[]} linrgb\n * @return {number}\n */\nexport function argbFromLinrgb(linrgb) {\n const r = delinearized(linrgb[0]);\n const g = delinearized(linrgb[1]);\n const b = delinearized(linrgb[2]);\n return argbFromRgb(r, g, b);\n}\n\n/**\n * Returns the alpha component of a color in ARGB format.\n * @param {number} argb\n * @return {number}\n */\nexport function alphaFromArgb(argb) {\n return argb >> 24 & 255;\n}\n\n/**\n * Returns the red component of a color in ARGB format.\n * @param {number} argb\n * @return {number}\n */\nexport function redFromArgb(argb) {\n return argb >> 16 & 255;\n}\n\n/**\n * Returns the green component of a color in ARGB format.\n * @param {number} argb\n * @return {number}\n */\nexport function greenFromArgb(argb) {\n return argb >> 8 & 255;\n}\n\n/**\n * Returns the blue component of a color in ARGB format.\n * @param {number} argb\n * @return {number}\n */\nexport function blueFromArgb(argb) {\n return argb & 255;\n}\n\n/**\n * Returns whether a color in ARGB format is opaque.\n * @param {number} argb\n * @return {boolean}\n */\nexport function isOpaque(argb) {\n return alphaFromArgb(argb) >= 255;\n}\n\n/**\n * Converts a color from ARGB to XYZ.\n * @param {number} x\n * @param {number} y\n * @param {number} z\n * @return {number}\n */\nexport function argbFromXyz(x, y, z) {\n const matrix = XYZ_TO_SRGB;\n const linearR = matrix[0][0] * x + matrix[0][1] * y + matrix[0][2] * z;\n const linearG = matrix[1][0] * x + matrix[1][1] * y + matrix[1][2] * z;\n const linearB = matrix[2][0] * x + matrix[2][1] * y + matrix[2][2] * z;\n const r = delinearized(linearR);\n const g = delinearized(linearG);\n const b = delinearized(linearB);\n return argbFromRgb(r, g, b);\n}\n\n/**\n * Converts a color from XYZ to ARGB.\n * @param {number} argb\n * @return {number[]}\n */\nexport function xyzFromArgb(argb) {\n const r = linearized(redFromArgb(argb));\n const g = linearized(greenFromArgb(argb));\n const b = linearized(blueFromArgb(argb));\n return mathUtils.matrixMultiply([r, g, b], SRGB_TO_XYZ);\n}\n\n/**\n * Converts a color represented in Lab color space into an ARGB\n * integer.\n * @param {number} l\n * @param {number} a\n * @param {number} b\n * @return {number}\n */\nexport function argbFromLab(l, a, b) {\n const whitePoint = WHITE_POINT_D65;\n const fy = (l + 16) / 116;\n const fx = a / 500 + fy;\n const fz = fy - b / 200;\n const xNormalized = labInvf(fx);\n const yNormalized = labInvf(fy);\n const zNormalized = labInvf(fz);\n const x = xNormalized * whitePoint[0];\n const y = yNormalized * whitePoint[1];\n const z = zNormalized * whitePoint[2];\n return argbFromXyz(x, y, z);\n}\n\n/**\n * Converts a color from ARGB representation to L*a*b*\n * representation.\n * @param {number} argb the ARGB representation of a color\n * @return {number[]} a Lab object representing the color\n */\nexport function labFromArgb(argb) {\n const linearR = linearized(redFromArgb(argb));\n const linearG = linearized(greenFromArgb(argb));\n const linearB = linearized(blueFromArgb(argb));\n const matrix = SRGB_TO_XYZ;\n const x = matrix[0][0] * linearR + matrix[0][1] * linearG + matrix[0][2] * linearB;\n const y = matrix[1][0] * linearR + matrix[1][1] * linearG + matrix[1][2] * linearB;\n const z = matrix[2][0] * linearR + matrix[2][1] * linearG + matrix[2][2] * linearB;\n const whitePoint = WHITE_POINT_D65;\n const xNormalized = x / whitePoint[0];\n const yNormalized = y / whitePoint[1];\n const zNormalized = z / whitePoint[2];\n const fx = labF(xNormalized);\n const fy = labF(yNormalized);\n const fz = labF(zNormalized);\n const l = 116 * fy - 16;\n const a = 500 * (fx - fy);\n const b = 200 * (fy - fz);\n return [l, a, b];\n}\n\n/**\n * Converts an L* value to an ARGB representation.\n * @param {number} lstar L* in L*a*b*\n * @return {number} ARGB representation of grayscale color with lightness\n * matching L*\n */\nexport function argbFromLstar(lstar) {\n const y = yFromLstar(lstar);\n const component = delinearized(y);\n return argbFromRgb(component, component, component);\n}\n\n/**\n * Computes the L* value of a color in ARGB representation.\n * @param {number} argb ARGB representation of a color\n * @return {number} L*, from L*a*b*, coordinate of the color\n */\nexport function lstarFromArgb(argb) {\n const y = xyzFromArgb(argb)[1];\n return 116 * labF(y / 100) - 16;\n}\n\n/**\n * Converts an L* value to a Y value.\n *\n * L* in L*a*b* and Y in XYZ measure the same quantity, luminance.\n *\n * L* measures perceptual luminance, a linear scale. Y in XYZ\n * measures relative luminance, a logarithmic scale.\n * @param {number} lstar L* in L*a*b*\n * @return {number} Y in XYZ\n */\nexport function yFromLstar(lstar) {\n return 100 * labInvf((lstar + 16) / 116);\n}\n\n/**\n * Linearizes an RGB component.\n * @param {number} rgbComponent 0 <= rgb_component <= 255, represents R/G/B\n * channel\n * @return {number} 0.0 <= output <= 100.0, color channel converted to\n * linear RGB space\n */\nexport function linearized(rgbComponent) {\n const normalized = rgbComponent / 255;\n if (normalized <= 0.040_449_936) {\n return (normalized / 12.92) * 100;\n }\n return ((normalized + 0.055) / 1.055) ** 2.4 * 100;\n}\n\n/**\n * Delinearizes an RGB component.\n * @param {number} rgbComponent 0.0 <= rgb_component <= 100.0, represents\n * linear R/G/B channel\n * @return {number} 0 <= output <= 255, color channel converted to regular\n * RGB space\n */\nexport function delinearized(rgbComponent) {\n const normalized = rgbComponent / 100;\n let delinearized = 0;\n delinearized = normalized <= 0.003_130_8 ? normalized * 12.92 : 1.055 * normalized ** (1 / 2.4) - 0.055;\n return mathUtils.clampInt(0, 255, Math.round(delinearized * 255));\n}\n\n/**\n * Returns the standard white point; white on a sunny day.\n * @return {number[]} The white point\n */\nexport function whitePointD65() {\n return WHITE_POINT_D65;\n}\n\n/**\n * @param {number} t\n * @return {number}\n */\nfunction labF(t) {\n const e = 216 / 24_389;\n const kappa = 24_389 / 27;\n if (t > e) {\n return t ** (1 / 3);\n }\n return (kappa * t + 16) / 116;\n}\n\n/**\n *\n * @param {number} ft\n * @return {number}\n */\nfunction labInvf(ft) {\n const e = 216 / 24_389;\n const kappa = 24_389 / 27;\n const ft3 = ft * ft * ft;\n if (ft3 > e) {\n return ft3;\n }\n return (116 * ft - 16) / kappa;\n}\n", "/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as utils from './colorUtils.js';\nimport * as math from './mathUtils.js';\n\n/**\n * In traditional color spaces, a color can be identified solely by the\n * observer's measurement of the color. Color appearance models such as CAM16\n * also use information about the environment where the color was\n * observed, known as the viewing conditions.\n *\n * For example, white under the traditional assumption of a midday sun white\n * point is accurately measured as a slightly chromatic blue by CAM16. (roughly,\n * hue 203, chroma 3, lightness 100)\n *\n * This class caches intermediate values of the CAM16 conversion process that\n * depend only on viewing conditions, enabling speed ups.\n */\nexport default class ViewingConditions {\n /** sRGB-like viewing conditions. */\n static DEFAULT = ViewingConditions.make();\n\n /**\n * Create ViewingConditions from a simple, physically relevant, set of\n * parameters.\n * @param whitePoint White point, measured in the XYZ color space.\n * default = D65, or sunny day afternoon\n * @param {number} adaptingLuminance The luminance of the adapting field. Informally,\n * how bright it is in the room where the color is viewed. Can be\n * calculated from lux by multiplying lux by 0.0586. default = 11.72,\n * or 200 lux.\n * @param {number} backgroundLstar The lightness of the area surrounding the color.\n * measured by L* in L*a*b*. default = 50.0\n * @param {number} surround A general description of the lighting surrounding the\n * color. 0 is pitch dark, like watching a movie in a theater. 1.0 is a\n * dimly light room, like watching TV at home at night. 2.0 means there\n * is no difference between the lighting on the color and around it.\n * default = 2.0\n * @param {boolean} discountingIlluminant Whether the eye accounts for the tint of the\n * ambient lighting, such as knowing an apple is still red in green light.\n * default = false, the eye does not perform this process on\n * self-luminous objects like displays.\n * @return {ViewingConditions}\n */\n static make(\n whitePoint = utils.whitePointD65(),\n adaptingLuminance = ((200 / Math.PI) * utils.yFromLstar(50)) / 100,\n backgroundLstar = 50,\n surround = 2,\n discountingIlluminant = false,\n ) {\n const xyz = whitePoint;\n const rW = xyz[0] * 0.401_288 + xyz[1] * 0.650_173 + xyz[2] * -0.051_461;\n const gW = xyz[0] * -0.250_268 + xyz[1] * 1.204_414 + xyz[2] * 0.045_854;\n const bW = xyz[0] * -0.002_079 + xyz[1] * 0.048_952 + xyz[2] * 0.953_127;\n const f = 0.8 + surround / 10;\n const c = f >= 0.9 ? math.lerp(0.59, 0.69, (f - 0.9) * 10)\n : math.lerp(0.525, 0.59, (f - 0.8) * 10);\n let d = discountingIlluminant\n ? 1\n : f * (1 - (1 / 3.6) * Math.exp((-adaptingLuminance - 42) / 92));\n d = d > 1 ? 1 : (d < 0 ? 0 : d);\n const nc = f;\n const rgbD = [\n d * (100 / rW) + 1 - d,\n d * (100 / gW) + 1 - d,\n d * (100 / bW) + 1 - d,\n ];\n const k = 1 / (5 * adaptingLuminance + 1);\n const k4 = k * k * k * k;\n const k4F = 1 - k4;\n const fl = k4 * adaptingLuminance\n + 0.1 * k4F * k4F * Math.cbrt(5 * adaptingLuminance);\n const n = utils.yFromLstar(backgroundLstar) / whitePoint[1];\n const z = 1.48 + Math.sqrt(n);\n const nbb = 0.725 / n ** 0.2;\n const ncb = nbb;\n const rgbAFactors = [\n ((fl * rgbD[0] * rW) / 100) ** 0.42,\n ((fl * rgbD[1] * gW) / 100) ** 0.42,\n ((fl * rgbD[2] * bW) / 100) ** 0.42,\n ];\n const rgbA = [\n (400 * rgbAFactors[0]) / (rgbAFactors[0] + 27.13),\n (400 * rgbAFactors[1]) / (rgbAFactors[1] + 27.13),\n (400 * rgbAFactors[2]) / (rgbAFactors[2] + 27.13),\n ];\n const aw = (2 * rgbA[0] + rgbA[1] + 0.05 * rgbA[2]) * nbb;\n return new ViewingConditions(n, aw, nbb, ncb, c, nc, rgbD, fl, fl ** 0.25, z);\n }\n\n /**\n * Parameters are intermediate values of the CAM16 conversion process. Their\n * names are shorthand for technical color science terminology, this class\n * would not benefit from documenting them individually. A brief overview\n * is available in the CAM16 specification, and a complete overview requires\n * a color science textbook, such as Fairchild's Color Appearance Models.\n * @param {number} n\n * @param {number} aw\n * @param {number} nbb\n * @param {number} ncb\n * @param {number} c\n * @param {number} nc\n * @param {number[]} rgbD\n * @param {number} fl\n * @param {number} fLRoot\n * @param {number} z\n */\n constructor(n, aw, nbb, ncb, c, nc, rgbD, fl, fLRoot, z) {\n this.n = n;\n this.aw = aw;\n this.nbb = nbb;\n this.ncb = ncb;\n this.c = c;\n this.nc = nc;\n this.rgbD = rgbD;\n this.fl = fl;\n this.fLRoot = fLRoot;\n this.z = z;\n }\n}\n", "/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport ViewingConditions from './ViewingConditions.js';\nimport * as utils from './colorUtils.js';\nimport * as math from './mathUtils.js';\n\n/**\n * CAM16, a color appearance model. Colors are not just defined by their hex\n * code, but rather, a hex code and viewing conditions.\n *\n * CAM16 instances also have coordinates in the CAM16-UCS space, called J*, a*,\n * b*, or jstar, astar, bstar in code. CAM16-UCS is included in the CAM16\n * specification, and should be used when measuring distances between colors.\n *\n * In traditional color spaces, a color can be identified solely by the\n * observer's measurement of the color. Color appearance models such as CAM16\n * also use information about the environment where the color was\n * observed, known as the viewing conditions.\n *\n * For example, white under the traditional assumption of a midday sun white\n * point is accurately measured as a slightly chromatic blue by CAM16. (roughly,\n * hue 203, chroma 3, lightness 100)\n */\nexport default class Cam16 {\n /**\n * All of the CAM16 dimensions can be calculated from 3 of the dimensions, in\n * the following combinations:\n * - {j or q} and {c, m, or s} and hue\n * - jstar, astar, bstar\n * Prefer using a static method that constructs from 3 of those dimensions.\n * This constructor is intended for those methods to use to return all\n * possible dimensions.\n * @param {number} hue\n * @param {number} chroma informally, colorfulness / color intensity. like saturation\n * in HSL, except perceptually accurate.\n * @param {number} j lightness\n * @param {number} q brightness; ratio of lightness to white point's lightness\n * @param {number} m colorfulness\n * @param {number} s saturation; ratio of chroma to white point's chroma\n * @param {number} jstar CAM16-UCS J coordinate\n * @param {number} astar CAM16-UCS a coordinate\n * @param {number} bstar CAM16-UCS b coordinate\n */\n constructor(hue, chroma, j, q, m, s, jstar, astar, bstar) {\n /** @readonly */\n this.hue = hue;\n /** @readonly */\n this.chroma = chroma;\n /** @readonly */\n this.j = j;\n /** @readonly */\n this.q = q;\n /** @readonly */\n this.m = m;\n /** @readonly */\n this.s = s;\n /** @readonly */\n this.jstar = jstar;\n /** @readonly */\n this.astar = astar;\n /** @readonly */\n this.bstar = bstar;\n }\n\n /**\n * CAM16 instances also have coordinates in the CAM16-UCS space, called J*,\n * a*, b*, or jstar, astar, bstar in code. CAM16-UCS is included in the CAM16\n * specification, and is used to measure distances between colors.\n * @param {Cam16} other\n * @return {number}\n */\n distance(other) {\n const dJ = this.jstar - other.jstar;\n const dA = this.astar - other.astar;\n const dB = this.bstar - other.bstar;\n const dEPrime = Math.sqrt(dJ * dJ + dA * dA + dB * dB);\n const dE = 1.41 * dEPrime ** 0.63;\n return dE;\n }\n\n /**\n * @param {number} argb ARGB representation of a color.\n * @return {Cam16} CAM16 color, assuming the color was viewed in default viewing\n * conditions.\n */\n static fromInt(argb) {\n return Cam16.fromIntInViewingConditions(argb, ViewingConditions.DEFAULT);\n }\n\n /**\n * @param {number} argb ARGB representation of a color.\n * @param {ViewingConditions} viewingConditions Information about the environment where the color\n * was observed.\n * @return {Cam16} CAM16 color.\n */\n static fromIntInViewingConditions(argb, viewingConditions) {\n const red = (argb & 0x00_FF_00_00) >> 16;\n const green = (argb & 0x00_00_FF_00) >> 8;\n const blue = (argb & 0x00_00_00_FF);\n const redL = utils.linearized(red);\n const greenL = utils.linearized(green);\n const blueL = utils.linearized(blue);\n const x = 0.412_338_95 * redL + 0.357_620_64 * greenL + 0.180_510_42 * blueL;\n const y = 0.2126 * redL + 0.7152 * greenL + 0.0722 * blueL;\n const z = 0.019_321_41 * redL + 0.119_163_82 * greenL + 0.950_344_78 * blueL;\n\n const rC = 0.401_288 * x + 0.650_173 * y - 0.051_461 * z;\n const gC = -0.250_268 * x + 1.204_414 * y + 0.045_854 * z;\n const bC = -0.002_079 * x + 0.048_952 * y + 0.953_127 * z;\n\n const rD = viewingConditions.rgbD[0] * rC;\n const gD = viewingConditions.rgbD[1] * gC;\n const bD = viewingConditions.rgbD[2] * bC;\n\n const rAF = ((viewingConditions.fl * Math.abs(rD)) / 100) ** 0.42;\n const gAF = ((viewingConditions.fl * Math.abs(gD)) / 100) ** 0.42;\n const bAF = ((viewingConditions.fl * Math.abs(bD)) / 100) ** 0.42;\n\n const rA = (math.signum(rD) * 400 * rAF) / (rAF + 27.13);\n const gA = (math.signum(gD) * 400 * gAF) / (gAF + 27.13);\n const bA = (math.signum(bD) * 400 * bAF) / (bAF + 27.13);\n\n const a = (11 * rA + -12 * gA + bA) / 11;\n const b = (rA + gA - 2 * bA) / 9;\n const u = (20 * rA + 20 * gA + 21 * bA) / 20;\n const p2 = (40 * rA + 20 * gA + bA) / 20;\n const atan2 = Math.atan2(b, a);\n const atanDegrees = (atan2 * 180) / Math.PI;\n const hue = atanDegrees < 0 ? atanDegrees + 360\n : (atanDegrees >= 360 ? atanDegrees - 360\n : atanDegrees);\n const hueRadians = (hue * Math.PI) / 180;\n\n const ac = p2 * viewingConditions.nbb;\n const j = 100\n * (ac / viewingConditions.aw) ** (viewingConditions.c * viewingConditions.z);\n const q = (4 / viewingConditions.c) * Math.sqrt(j / 100)\n * (viewingConditions.aw + 4) * viewingConditions.fLRoot;\n const huePrime = hue < 20.14 ? hue + 360 : hue;\n const eHue = 0.25 * (Math.cos((huePrime * Math.PI) / 180 + 2) + 3.8);\n const p1 = (50_000 / 13) * eHue * viewingConditions.nc * viewingConditions.ncb;\n const t = (p1 * Math.sqrt(a * a + b * b)) / (u + 0.305);\n const alpha = t ** 0.9\n * (1.64 - 0.29 ** viewingConditions.n) ** 0.73;\n const c = alpha * Math.sqrt(j / 100);\n const m = c * viewingConditions.fLRoot;\n const s = 50\n * Math.sqrt((alpha * viewingConditions.c) / (viewingConditions.aw + 4));\n const jstar = ((1 + 100 * 0.007) * j) / (1 + 0.007 * j);\n const mstar = (1 / 0.0228) * Math.log(1 + 0.0228 * m);\n const astar = mstar * Math.cos(hueRadians);\n const bstar = mstar * Math.sin(hueRadians);\n\n return new Cam16(hue, c, j, q, m, s, jstar, astar, bstar);\n }\n\n /**\n * @param {number} j CAM16 lightness\n * @param {number} c CAM16 chroma\n * @param {number} h CAM16 hue\n * @return {Cam16}\n */\n static fromJch(j, c, h) {\n return Cam16.fromJchInViewingConditions(j, c, h, ViewingConditions.DEFAULT);\n }\n\n /**\n * @param {number} j CAM16 lightness\n * @param {number} c CAM16 chroma\n * @param {number} h CAM16 hue\n * @param {ViewingConditions} viewingConditions Information about the environment where the color\n * was observed.\n */\n static fromJchInViewingConditions(j, c, h, viewingConditions) {\n const q = (4 / viewingConditions.c) * Math.sqrt(j / 100)\n * (viewingConditions.aw + 4) * viewingConditions.fLRoot;\n const m = c * viewingConditions.fLRoot;\n const alpha = c / Math.sqrt(j / 100);\n const s = 50\n * Math.sqrt((alpha * viewingConditions.c) / (viewingConditions.aw + 4));\n const hueRadians = (h * Math.PI) / 180;\n const jstar = ((1 + 100 * 0.007) * j) / (1 + 0.007 * j);\n const mstar = (1 / 0.0228) * Math.log(1 + 0.0228 * m);\n const astar = mstar * Math.cos(hueRadians);\n const bstar = mstar * Math.sin(hueRadians);\n return new Cam16(h, c, j, q, m, s, jstar, astar, bstar);\n }\n\n /**\n * @param {number} jstar CAM16-UCS lightness.\n * @param {number} astar CAM16-UCS a dimension. Like a* in L*a*b*, it is a Cartesian\n * coordinate on the Y axis.\n * @param {number} bstar CAM16-UCS b dimension. Like a* in L*a*b*, it is a Cartesian\n * coordinate on the X axis.\n * @return {Cam16}\n */\n static fromUcs(jstar, astar, bstar) {\n return Cam16.fromUcsInViewingConditions(jstar, astar, bstar, ViewingConditions.DEFAULT);\n }\n\n /**\n * @param {number} jstar CAM16-UCS lightness.\n * @param {number} astar CAM16-UCS a dimension. Like a* in L*a*b*, it is a Cartesian\n * coordinate on the Y axis.\n * @param {number} bstar CAM16-UCS b dimension. Like a* in L*a*b*, it is a Cartesian\n * coordinate on the X axis.\n * @param {ViewingConditions} viewingConditions Information about the environment where the color\n * was observed.\n */\n static fromUcsInViewingConditions(jstar, astar, bstar, viewingConditions) {\n const a = astar;\n const b = bstar;\n const m = Math.sqrt(a * a + b * b);\n const M = (Math.exp(m * 0.0228) - 1) / 0.0228;\n const c = M / viewingConditions.fLRoot;\n let h = Math.atan2(b, a) * (180 / Math.PI);\n if (h < 0) {\n h += 360;\n }\n const j = jstar / (1 - (jstar - 100) * 0.007);\n return Cam16.fromJchInViewingConditions(j, c, h, viewingConditions);\n }\n\n /**\n * @return {number} ARGB representation of color, assuming the color was viewed in\n * default viewing conditions, which are near-identical to the default\n * viewing conditions for sRGB.\n */\n toInt() {\n return this.viewed(ViewingConditions.DEFAULT);\n }\n\n /**\n * @param {ViewingConditions} viewingConditions Information about the environment where the color\n * will be viewed.\n * @return {number} ARGB representation of color\n */\n viewed(viewingConditions) {\n const alpha = this.chroma === 0 || this.j === 0\n ? 0\n : this.chroma / Math.sqrt(this.j / 100);\n\n const t = (alpha / (1.64 - 0.29 ** viewingConditions.n) ** 0.73) ** (1 / 0.9);\n const hRad = (this.hue * Math.PI) / 180;\n\n const eHue = 0.25 * (Math.cos(hRad + 2) + 3.8);\n const ac = viewingConditions.aw\n * (this.j / 100) ** (1 / viewingConditions.c / viewingConditions.z);\n const p1 = eHue * (50_000 / 13) * viewingConditions.nc * viewingConditions.ncb;\n const p2 = ac / viewingConditions.nbb;\n\n const hSin = Math.sin(hRad);\n const hCos = Math.cos(hRad);\n\n const gamma = (23 * (p2 + 0.305) * t)\n / (23 * p1 + 11 * t * hCos + 108 * t * hSin);\n const a = gamma * hCos;\n const b = gamma * hSin;\n const rA = (460 * p2 + 451 * a + 288 * b) / 1403;\n const gA = (460 * p2 - 891 * a - 261 * b) / 1403;\n const bA = (460 * p2 - 220 * a - 6300 * b) / 1403;\n\n const rCBase = Math.max(0, (27.13 * Math.abs(rA)) / (400 - Math.abs(rA)));\n const rC = math.signum(rA) * (100 / viewingConditions.fl)\n * rCBase ** (1 / 0.42);\n const gCBase = Math.max(0, (27.13 * Math.abs(gA)) / (400 - Math.abs(gA)));\n const gC = math.signum(gA) * (100 / viewingConditions.fl)\n * gCBase ** (1 / 0.42);\n const bCBase = Math.max(0, (27.13 * Math.abs(bA)) / (400 - Math.abs(bA)));\n const bC = math.signum(bA) * (100 / viewingConditions.fl)\n * bCBase ** (1 / 0.42);\n const rF = rC / viewingConditions.rgbD[0];\n const gF = gC / viewingConditions.rgbD[1];\n const bF = bC / viewingConditions.rgbD[2];\n\n const x = 1.862_067_86 * rF - 1.011_254_63 * gF + 0.149_186_77 * bF;\n const y = 0.387_526_54 * rF + 0.621_447_44 * gF - 0.008_973_98 * bF;\n const z = -0.015_841_5 * rF - 0.034_122_94 * gF + 1.049_964_44 * bF;\n\n const argb = utils.argbFromXyz(x, y, z);\n return argb;\n }\n}\n", "/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Cam16 from './Cam16.js';\nimport ViewingConditions from './ViewingConditions.js';\nimport * as colorUtils from './colorUtils.js';\nimport * as mathUtils from './mathUtils.js';\n\n/**\n * A class that solves the HCT equation.\n */\n// libmonet is designed to have a consistent API across platforms\n// and modular components that can be moved around easily. Using a class as a\n// namespace facilitates this.\n//\n// tslint:disable-next-line:class-as-namespace\n\nexport const SCALED_DISCOUNT_FROM_LINRGB = [\n [\n 0.001_200_833_568_784_504,\n 0.002_389_694_492_170_889,\n 0.000_279_574_288_586_112_4,\n ],\n [\n 0.000_589_108_665_137_599_9,\n 0.002_978_550_257_343_875_8,\n 0.000_327_066_610_400_839_8,\n ],\n [\n 0.000_101_466_924_916_405_72,\n 0.000_536_421_435_918_669_4,\n 0.003_297_940_177_071_207_6,\n ],\n];\n\nexport const LINRGB_FROM_SCALED_DISCOUNT = [\n [\n 1373.219_870_959_423_1,\n -1100.425_119_075_482_1,\n -7.278_681_089_101_213,\n ],\n [\n -271.815_969_077_903,\n 559.658_046_594_073_3,\n -32.460_474_827_911_94,\n ],\n [\n 1.962_289_959_966_566_6,\n -57.173_814_538_844_006,\n 308.723_319_781_238_5,\n ],\n];\n\nexport const Y_FROM_LINRGB = [0.2126, 0.7152, 0.0722];\n\nexport const CRITICAL_PLANES = [\n 0.015_176_349_177_441_876, 0.045_529_047_532_325_624, 0.075_881_745_887_209_38,\n 0.106_234_444_242_093_13, 0.136_587_142_596_976_85, 0.166_939_840_951_860_62,\n 0.197_292_539_306_744_34, 0.227_645_237_661_628_1, 0.257_997_936_016_511_9,\n 0.288_350_634_371_395_63, 0.318_830_090_443_053_2, 0.350_925_934_958_123,\n 0.384_831_493_309_642_6, 0.420_574_803_010_494_66, 0.458_183_274_052_838,\n 0.497_683_725_027_402_3, 0.539_102_415_980_638_1, 0.582_465_078_404_089_8,\n 0.627_796_942_691_410_7, 0.675_122_763_349_862_3, 0.724_466_842_212_892_1,\n 0.775_853_049_866_786, 0.829_304_845_476_233, 0.884_845_295_169_849_8,\n 0.942_497_089_126_609, 1.002_282_557_486_903_9, 1.064_223_685_197_357_7,\n 1.128_342_125_885_829_7, 1.194_659_214_852_212_8, 1.263_195_981_251_186_4,\n 1.333_973_159_534_903_4, 1.407_011_200_216_447, 1.482_330_280_008_641_5,\n 1.559_950_311_387_327_2, 1.639_890_951_623_367_7, 1.722_171_611_323_410_5,\n 1.806_811_462_515_637_7, 1.893_829_446_313_407_3, 1.983_244_280_186_685_2,\n 2.075_074_464_868_551, 2.169_338_290_921_623_4, 2.266_053_844_987_206_3,\n 2.365_239_015_737_95, 2.466_911_499_553_200_7, 2.571_088_805_934_576_4,\n 2.677_788_262_677_978_5, 2.787_027_020_816_925_7, 2.898_822_059_350_997,\n 3.013_190_189_772_090_7, 3.130_148_060_400_286_3, 3.249_712_160_540_222_6,\n 3.371_898_824_468_108_7, 3.496_724_235_258_794_6, 3.624_204_428_461_639,\n 3.754_355_295_633_311, 3.887_192_587_735_158, 4.022_731_918_402_185,\n 4.160_988_767_090_289, 4.301_978_482_107_941, 4.445_716_283_538_092,\n 4.592_217_266_055_746, 4.741_496_401_646_282, 4.893_568_542_229_298,\n 5.048_448_422_192_488, 5.206_150_660_839_72, 5.366_689_764_757_337_5,\n 5.530_080_130_102_386_5, 5.696_336_044_816_294, 5.865_471_690_767_354,\n 6.037_501_145_825_082, 6.212_438_385_869_475, 6.390_297_286_737_924,\n 6.571_091_626_112_461, 6.754_835_085_349_804_5, 6.941_541_251_256_611,\n 7.131_223_617_812_143, 7.323_895_587_840_543, 7.519_570_474_634_666_5,\n 7.718_261_503_533_434_5, 7.919_981_813_454_504, 8.124_744_458_384_042,\n 8.332_562_408_825_165, 8.543_448_553_206_703, 8.757_415_699_253_682,\n 8.974_476_575_321_063, 9.194_643_831_691_977, 9.417_930_041_841_839,\n 9.644_347_703_669_503, 9.873_909_240_696_694, 10.106_627_003_236_781,\n 10.342_513_269_534_024, 10.581_580_246_874_27, 10.823_840_072_668_1,\n 11.069_304_815_507_364, 11.317_986_476_196_008, 11.569_896_988_756_009,\n 11.825_048_221_409_341, 12.083_451_977_536_606, 12.345_119_996_613_247,\n 12.610_063_955_123_938, 12.878_295_467_455_942, 13.149_826_086_772_048,\n 13.424_667_305_863_72, 13.702_830_557_985_108, 13.984_327_217_668_513,\n 14.269_168_601_521_828, 14.557_365_969_008_56, 14.848_930_523_210_871,\n 15.143_873_411_576_273, 15.442_205_726_648_32, 15.743_938_506_781_891,\n 16.049_082_736_843_37, 16.357_649_348_896_34, 16.669_649_222_873_04,\n 16.985_093_187_232_053, 17.303_992_019_602_69, 17.626_356_447_416_25,\n 17.952_197_148_524_76, 18.281_524_751_807_332, 18.614_349_837_764_564,\n 18.950_682_939_101_38, 19.290_534_541_298_456, 19.633_915_083_172_692,\n 19.980_834_957_426_89, 20.331_304_511_189_067, 20.685_334_046_541_502,\n 21.042_933_821_039_977, 21.404_114_048_223_256, 21.768_884_898_113_22,\n 22.137_256_497_705_877, 22.509_238_931_453_28, 22.884_842_241_736_916,\n 23.264_076_429_332_462, 23.646_951_453_866_3, 24.033_477_234_264_016,\n 24.423_663_649_190_83, 24.817_520_537_484_558, 25.215_057_698_580_89,\n 25.616_284_892_931_38, 26.021_211_842_414_342, 26.429_848_230_738_664,\n 26.842_203_703_840_827, 27.258_287_870_275_353, 27.678_110_301_598_522,\n 28.101_680_532_745_97, 28.529_008_062_403_893, 28.960_102_353_374_22,\n 29.394_972_832_933_96, 29.833_628_893_188_45, 30.276_079_891_419_332,\n 30.722_335_150_426_627, 31.172_403_958_865_512, 31.626_295_571_577_85,\n 32.084_019_209_918_37, 32.545_584_062_075_92, 33.010_999_283_389_665,\n 33.480_273_996_660_3, 33.953_417_292_456_834, 34.430_438_229_418_264,\n 34.911_345_834_551_085, 35.396_149_103_522_07, 35.884_857_000_946_71,\n 36.377_478_460_673_49, 36.874_022_386_063_82, 37.374_497_650_267_89,\n 37.878_913_096_496_59, 38.387_277_538_289_26, 38.899_599_759_777_85,\n 39.415_888_515_946_97, 39.936_152_532_890_54, 40.460_400_508_064_545,\n 40.988_641_110_536_29, 41.520_882_981_230_194, 42.057_134_733_170_16,\n 42.597_404_951_718_396, 43.141_702_194_811_224, 43.690_034_993_191_3,\n 44.242_411_850_636_97, 44.798_841_244_188_324, 45.359_331_624_370_17,\n 45.923_891_415_412_09, 46.492_529_015_465_52, 47.065_252_796_817_916,\n 47.642_071_106_104_09, 48.222_992_264_514_68, 48.808_024_568_002_054,\n 49.397_176_287_483_3, 49.990_455_669_040_8, 50.587_870_934_119_984,\n 51.189_430_279_724_725, 51.795_141_878_610_14, 52.405_013_879_472_88,\n 53.019_054_407_139_2, 53.637_271_562_750_364, 54.259_673_423_945_976,\n 54.886_268_045_044_93, 55.517_063_457_223_934, 56.152_067_668_694_24,\n 56.791_288_664_875_74, 57.434_734_408_569_16, 58.082_412_840_126_21,\n 58.734_331_877_617_365, 59.390_499_416_998_07, 60.050_923_332_272_51,\n 60.715_611_475_655_585, 61.384_571_677_733_11, 62.057_811_747_619_894,\n 62.735_339_473_115_9, 63.417_162_620_860_914, 64.103_288_936_486_92,\n 64.793_726_144_769_21, 65.488_481_949_775_29, 66.187_564_035_012_24,\n 66.890_980_063_572_58, 67.598_737_678_278_08, 68.310_844_501_822_22,\n 69.027_308_136_910_93, 69.748_136_166_401_64, 70.473_336_153_441_07,\n 71.202_915_641_601_04, 71.936_882_155_013_12, 72.675_243_198_501_72,\n 73.418_006_257_715_42, 74.165_178_799_257_33, 74.916_768_270_813_6,\n 75.672_782_101_280_72, 76.433_227_700_891_46, 77.198_112_461_339_3,\n 77.967_443_755_901_67, 78.741_228_939_561_74, 79.519_475_349_129_04,\n 80.302_190_303_358_69, 81.089_381_103_069_34, 81.881_055_031_259_99,\n 82.677_219_353_225_41, 83.477_881_316_670_6, 84.283_048_151_823_72,\n 85.092_727_071_548_08, 85.906_925_271_453_02, 86.725_649_930_003_43,\n 87.548_908_208_628_19, 88.376_707_251_827_7, 89.209_054_187_280_1,\n 90.045_956_125_946_55, 90.887_420_162_175_18, 91.733_453_373_804_38,\n 92.584_062_822_264_91, 93.439_255_552_680_66, 94.299_038_593_969_02,\n 95.163_418_958_939_69, 96.032_403_644_392_74, 96.905_999_631_215_9,\n 97.784_213_884_480_44, 98.667_053_353_536_6, 99.554_524_972_107_76,\n];\n\n/**\n * Sanitizes a small enough angle in radians.\n * @param {number} angle An angle in radians; must not deviate too much\n * from 0.\n * @return {number} A coterminal angle between 0 and 2pi.\n */\nfunction sanitizeRadians(angle) {\n return (angle + Math.PI * 8) % (Math.PI * 2);\n}\n\n/**\n * Delinearizes an RGB component, returning a floating-point\n * number.\n * @param {number} rgbComponent 0.0 <= rgb_component <= 100.0, represents\n * linear R/G/B channel\n * @return {number} 0.0 <= output <= 255.0, color channel converted to\n * regular RGB space\n */\nfunction trueDelinearized(rgbComponent) {\n const normalized = rgbComponent / 100;\n let delinearized = 0;\n delinearized = normalized <= 0.003_130_8 ? normalized * 12.92 : 1.055 * normalized ** (1 / 2.4) - 0.055;\n return delinearized * 255;\n}\n\n/**\n * @param {number} component\n * @return {number}\n */\nfunction chromaticAdaptation(component) {\n const af = Math.abs(component) ** 0.42;\n return mathUtils.signum(component) * 400 * af / (af + 27.13);\n}\n\n/**\n * Returns the hue of a linear RGB color in CAM16.\n * @param {number[]} linrgb The linear RGB coordinates of a color.\n * @return {number} The hue of the color in CAM16, in radians.\n */\nfunction hueOf(linrgb) {\n const scaledDiscount = mathUtils.matrixMultiply(linrgb, SCALED_DISCOUNT_FROM_LINRGB);\n const rA = chromaticAdaptation(scaledDiscount[0]);\n const gA = chromaticAdaptation(scaledDiscount[1]);\n const bA = chromaticAdaptation(scaledDiscount[2]);\n // redness-greenness\n const a = (11 * rA + -12 * gA + bA) / 11;\n // yellowness-blueness\n const b = (rA + gA - 2 * bA) / 9;\n return Math.atan2(b, a);\n}\n\n/**\n *\n * @param {number} a\n * @param {number} b\n * @param {number} c\n * @return {boolean}\n */\nfunction areInCyclicOrder(a, b, c) {\n const deltaAB = sanitizeRadians(b - a);\n const deltaAC = sanitizeRadians(c - a);\n return deltaAB < deltaAC;\n}\n\n/**\n * Solves the lerp equation.\n * @param {number} source The starting number.\n * @param {number} mid The number in the middle.\n * @param {number} target The ending number.\n * @return {number} A number t such that lerp(source, target, t) = mid.\n */\nfunction intercept(source, mid, target) {\n return (mid - source) / (target - source);\n}\n\n/**\n *\n * @param {number[]} source\n * @param {number} t\n * @param {number[]} target\n * @return {[number,number,number]}\n */\nfunction lerpPoint(source, t, target) {\n return [\n source[0] + (target[0] - source[0]) * t,\n source[1] + (target[1] - source[1]) * t,\n source[2] + (target[2] - source[2]) * t,\n ];\n}\n\n/**\n * Intersects a segment with a plane.\n * @param {number[]} source The coordinates of point A.\n * @param {number} coordinate The R-, G-, or B-coordinate of the plane.\n * @param {number[]} target The coordinates of point B.\n * @param {number} axis The axis the plane is perpendicular with. (0: R, 1:\n * G, 2: B)\n * @return {number[]} The intersection point of the segment AB with the plane\n * R=coordinate, G=coordinate, or B=coordinate\n */\nfunction setCoordinate(source, coordinate, target, axis) {\n const t = intercept(source[axis], coordinate, target[axis]);\n return lerpPoint(source, t, target);\n}\n\n/**\n * @param {number} x\n * @return {boolean}\n */\nfunction isBounded(x) {\n return x >= 0 && x <= 100;\n}\n\n/**\n * Returns the nth possible vertex of the polygonal intersection.\n * @param {number} y The Y value of the plane\n * @param {number} n The zero-based index of the point. 0 <= n <= 11.\n * @return {number[]} The nth possible vertex of the polygonal intersection\n * of the y plane and the RGB cube, in linear RGB coordinates, if\n * it exists. If this possible vertex lies outside of the cube,\n * [-1.0, -1.0, -1.0] is returned.\n */\nfunction nthVertex(y, n) {\n const kR = Y_FROM_LINRGB[0];\n const kG = Y_FROM_LINRGB[1];\n const kB = Y_FROM_LINRGB[2];\n const coordA = n % 4 <= 1 ? 0 : 100;\n const coordB = n % 2 === 0 ? 0 : 100;\n if (n < 4) {\n const g = coordA;\n const b = coordB;\n const r = (y - g * kG - b * kB) / kR;\n if (isBounded(r)) {\n return [r, g, b];\n }\n return [-1, -1, -1];\n }\n if (n < 8) {\n const b = coordA;\n const r = coordB;\n const g = (y - r * kR - b * kB) / kG;\n if (isBounded(g)) {\n return [r, g, b];\n }\n return [-1, -1, -1];\n }\n const r = coordA;\n const g = coordB;\n const b = (y - r * kR - g * kG) / kB;\n if (isBounded(b)) {\n return [r, g, b];\n }\n return [-1, -1, -1];\n}\n\n/**\n * Finds the segment containing the desired color.\n * @param {number} y The Y value of the color.\n * @param {number} targetHue The hue of the color.\n * @return {[number[], number[]]} A list of two sets of linear RGB coordinates, each\n * corresponding to an endpoint of the segment containing the\n * desired color.\n */\nfunction bisectToSegment(y, targetHue) {\n let left = [-1, -1, -1];\n let right = left;\n let leftHue = 0;\n let rightHue = 0;\n let initialized = false;\n let uncut = true;\n\n for (let n = 0; n < 12; n++) {\n const mid = nthVertex(y, n);\n if (mid[0] < 0) {\n continue;\n }\n const midHue = hueOf(mid);\n if (!initialized) {\n left = mid;\n right = mid;\n leftHue = midHue;\n rightHue = midHue;\n initialized = true;\n continue;\n }\n if (uncut || areInCyclicOrder(leftHue, midHue, rightHue)) {\n uncut = false;\n if (areInCyclicOrder(leftHue, targetHue, midHue)) {\n right = mid;\n rightHue = midHue;\n } else {\n left = mid;\n leftHue = midHue;\n }\n }\n }\n return [left, right];\n}\n\n/**\n *\n * @param {number[]} a\n * @param {number[]} b\n * @return {number[]}\n */\nfunction midpoint(a, b) {\n return [\n (a[0] + b[0]) / 2,\n (a[1] + b[1]) / 2,\n (a[2] + b[2]) / 2,\n ];\n}\n\n/**\n * @param {number} x\n * @return {number}\n */\nfunction criticalPlaneBelow(x) {\n return Math.floor(x - 0.5);\n}\n\n/**\n * @param {number} x\n * @return {number}\n */\nfunction criticalPlaneAbove(x) {\n return Math.ceil(x - 0.5);\n}\n\n/**\n * Finds a color with the given Y and hue on the boundary of the\n * cube.\n * @param {number} y The Y value of the color.\n * @param {number} targetHue The hue of the color.\n * @return {number[]} The desired color, in linear RGB coordinates.\n */\nfunction bisectToLimit(y, targetHue) {\n const segment = bisectToSegment(y, targetHue);\n let left = segment[0];\n let leftHue = hueOf(left);\n let right = segment[1];\n for (let axis = 0; axis < 3; axis++) {\n if (left[axis] !== right[axis]) {\n let lPlane = -1;\n let rPlane = 255;\n if (left[axis] < right[axis]) {\n lPlane = criticalPlaneBelow(\n trueDelinearized(left[axis]),\n );\n rPlane = criticalPlaneAbove(\n trueDelinearized(right[axis]),\n );\n } else {\n lPlane = criticalPlaneAbove(\n trueDelinearized(left[axis]),\n );\n rPlane = criticalPlaneBelow(\n trueDelinearized(right[axis]),\n );\n }\n for (let i = 0; i < 8; i++) {\n if (Math.abs(rPlane - lPlane) <= 1) {\n break;\n } else {\n const mPlane = Math.floor((lPlane + rPlane) / 2);\n const midPlaneCoordinate = CRITICAL_PLANES[mPlane];\n const mid = setCoordinate(left, midPlaneCoordinate, right, axis);\n const midHue = hueOf(mid);\n if (areInCyclicOrder(leftHue, targetHue, midHue)) {\n right = mid;\n rPlane = mPlane;\n } else {\n left = mid;\n leftHue = midHue;\n lPlane = mPlane;\n }\n }\n }\n }\n }\n return midpoint(left, right);\n}\n\n/**\n * @param {number} adapted\n * @return {number}\n */\nfunction inverseChromaticAdaptation(adapted) {\n const adaptedAbs = Math.abs(adapted);\n const base = Math.max(0, 27.13 * adaptedAbs / (400 - adaptedAbs));\n return mathUtils.signum(adapted) * base ** (1 / 0.42);\n}\n\n/**\n * Finds a color with the given hue, chroma, and Y.\n * @param {number} hueRadians The desired hue in radians.\n * @param {number} chroma The desired chroma.\n * @param {number} y The desired Y.\n * @return {number} The desired color as a hexadecimal integer, if found; 0\n * otherwise.\n */\nfunction findResultByJ(hueRadians, chroma, y) {\n // Initial estimate of j.\n let j = Math.sqrt(y) * 11;\n // ===========================================================\n // Operations inlined from Cam16 to avoid repeated calculation\n // ===========================================================\n const viewingConditions = ViewingConditions.DEFAULT;\n const tInnerCoeff = 1 / (1.64 - 0.29 ** viewingConditions.n) ** 0.73;\n const eHue = 0.25 * (Math.cos(hueRadians + 2) + 3.8);\n const p1 = eHue * (50_000 / 13) * viewingConditions.nc * viewingConditions.ncb;\n const hSin = Math.sin(hueRadians);\n const hCos = Math.cos(hueRadians);\n for (let iterationRound = 0; iterationRound < 5; iterationRound++) {\n // ===========================================================\n // Operations inlined from Cam16 to avoid repeated calculation\n // ===========================================================\n const jNormalized = j / 100;\n const alpha = chroma === 0 || j === 0 ? 0 : chroma / Math.sqrt(jNormalized);\n const t = (alpha * tInnerCoeff) ** (1 / 0.9);\n const ac = viewingConditions.aw\n * jNormalized ** (1 / viewingConditions.c / viewingConditions.z);\n const p2 = ac / viewingConditions.nbb;\n const gamma = 23 * (p2 + 0.305) * t / (23 * p1 + 11 * t * hCos + 108 * t * hSin);\n const a = gamma * hCos;\n const b = gamma * hSin;\n const rA = (460 * p2 + 451 * a + 288 * b) / 1403;\n const gA = (460 * p2 - 891 * a - 261 * b) / 1403;\n const bA = (460 * p2 - 220 * a - 6300 * b) / 1403;\n const rCScaled = inverseChromaticAdaptation(rA);\n const gCScaled = inverseChromaticAdaptation(gA);\n const bCScaled = inverseChromaticAdaptation(bA);\n const linrgb = mathUtils.matrixMultiply(\n [rCScaled, gCScaled, bCScaled],\n LINRGB_FROM_SCALED_DISCOUNT,\n );\n // ===========================================================\n // Operations inlined from Cam16 to avoid repeated calculation\n // ===========================================================\n if (linrgb[0] < 0 || linrgb[1] < 0 || linrgb[2] < 0) {\n return 0;\n }\n const kR = Y_FROM_LINRGB[0];\n const kG = Y_FROM_LINRGB[1];\n const kB = Y_FROM_LINRGB[2];\n const fnj = kR * linrgb[0] + kG * linrgb[1] + kB * linrgb[2];\n if (fnj <= 0) {\n return 0;\n }\n if (iterationRound === 4 || Math.abs(fnj - y) < 0.002) {\n if (linrgb[0] > 100.01 || linrgb[1] > 100.01 || linrgb[2] > 100.01) {\n return 0;\n }\n return colorUtils.argbFromLinrgb(linrgb);\n }\n // Iterates with Newton method,\n // Using 2 * fn(j) / j as the approximation of fn'(j)\n j -= (fnj - y) * j / (2 * fnj);\n }\n return 0;\n}\n\n/**\n * Finds an sRGB color with the given hue, chroma, and L*, if\n * possible.\n * @param {number} hueDegrees The desired hue, in degrees.\n * @param {number} chroma The desired chroma.\n * @param {number} lstar The desired L*.\n * @return {number} A hexadecimal representing the sRGB color. The color\n * has sufficiently close hue, chroma, and L* to the desired\n * values, if possible; otherwise, the hue and L* will be\n * sufficiently close, and chroma will be maximized.\n */\nexport function solveToInt(hueDegrees, chroma, lstar) {\n if (chroma < 0.0001 || lstar < 0.0001 || lstar > 99.9999) {\n return colorUtils.argbFromLstar(lstar);\n }\n hueDegrees = mathUtils.sanitizeDegreesDouble(hueDegrees);\n const hueRadians = hueDegrees / 180 * Math.PI;\n const y = colorUtils.yFromLstar(lstar);\n const exactAnswer = findResultByJ(hueRadians, chroma, y);\n if (exactAnswer !== 0) {\n return exactAnswer;\n }\n const linrgb = bisectToLimit(y, hueRadians);\n return colorUtils.argbFromLinrgb(linrgb);\n}\n\n/**\n * Finds an sRGB color with the given hue, chroma, and L*, if\n * possible.\n * @param {number} hueDegrees The desired hue, in degrees.\n * @param {number} chroma The desired chroma.\n * @param {number} lstar The desired L*.\n * @return {Cam16} An CAM16 object representing the sRGB color. The color\n * has sufficiently close hue, chroma, and L* to the desired\n * values, if possible; otherwise, the hue and L* will be\n * sufficiently close, and chroma will be maximized.\n */\nexport function solveToCam(hueDegrees, chroma, lstar) {\n return Cam16.fromInt(solveToInt(hueDegrees, chroma, lstar));\n}\n", "/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * A color system built using CAM16 hue and chroma, and L* from\n * L*a*b*.\n *\n * Using L* creates a link between the color system, contrast, and thus\n * accessibility. Contrast ratio depends on relative luminance, or Y in the XYZ\n * color space. L*, or perceptual luminance can be calculated from Y.\n *\n * Unlike Y, L* is linear to human perception, allowing trivial creation of\n * accurate color tones.\n *\n * Unlike contrast ratio, measuring contrast in L* is linear, and simple to\n * calculate. A difference of 40 in HCT tone guarantees a contrast ratio >= 3.0,\n * and a difference of 50 guarantees a contrast ratio >= 4.5.\n */\n\nimport Cam16 from './Cam16.js';\nimport * as utils from './colorUtils.js';\nimport * as hctSolver from './hctSolver.js';\n\n/**\n * HCT, hue, chroma, and tone. A color system that provides a perceptually\n * accurate color measurement system that can also accurately render what colors\n * will appear as in different lighting environments.\n */\nexport default class Hct {\n /**\n * @param hue 0 <= hue < 360; invalid values are corrected.\n * @param chroma 0 <= chroma < ?; Informally, colorfulness. The color\n * returned may be lower than the requested chroma. Chroma has a different\n * maximum for any given hue and tone.\n * @param tone 0 <= tone <= 100; invalid values are corrected.\n * @return HCT representation of a color in default viewing conditions.\n */\n\n /** @type {number} */\n internalHue;\n\n /** @type {number} */\n internalChroma;\n\n /** @type {number} */\n internalTone;\n\n /**\n * @param {number} hue\n * @param {number} chroma\n * @param {number} tone\n * @return {Hct}\n */\n static from(hue, chroma, tone) {\n return new Hct(hctSolver.solveToInt(hue, chroma, tone));\n }\n\n /**\n * @param {number} argb ARGB representation of a color.\n * @return {Hct} HCT representation of a color in default viewing conditions\n */\n static fromInt(argb) {\n return new Hct(argb);\n }\n\n /** @return {number} */\n toInt() {\n return this.argb;\n }\n\n /**\n * A number, in degrees, representing ex. red, orange, yellow, etc.\n * Ranges from 0 <= hue < 360.\n * @return {number}\n */\n get hue() {\n return this.internalHue;\n }\n\n /**\n * @param {number} newHue 0 <= newHue < 360; invalid values are corrected.\n * Chroma may decrease because chroma has a different maximum for any given\n * hue and tone.\n */\n set hue(newHue) {\n this.setInternalState(\n hctSolver.solveToInt(\n newHue,\n this.internalChroma,\n this.internalTone,\n ),\n );\n }\n\n /** @return {number} */\n get chroma() {\n return this.internalChroma;\n }\n\n /**\n * @param {number} newChroma 0 <= newChroma < ?\n * Chroma may decrease because chroma has a different maximum for any given\n * hue and tone.\n */\n set chroma(newChroma) {\n this.setInternalState(\n hctSolver.solveToInt(\n this.internalHue,\n newChroma,\n this.internalTone,\n ),\n );\n }\n\n /**\n * Lightness. Ranges from 0 to 100.\n * @return {number}\n */\n get tone() {\n return this.internalTone;\n }\n\n /**\n * @param {number} newTone 0 <= newTone <= 100; invalid valids are corrected.\n * Chroma may decrease because chroma has a different maximum for any given\n * hue and tone.\n */\n set tone(newTone) {\n this.setInternalState(\n hctSolver.solveToInt(\n this.internalHue,\n this.internalChroma,\n newTone,\n ),\n );\n }\n\n /** @param {number} argb */\n constructor(argb) {\n const cam = Cam16.fromInt(argb);\n this.internalHue = cam.hue;\n this.internalChroma = cam.chroma;\n this.internalTone = utils.lstarFromArgb(argb);\n this.argb = argb;\n }\n\n /**\n * @private\n * @param {number} argb\n */\n setInternalState(argb) {\n const cam = Cam16.fromInt(argb);\n this.internalHue = cam.hue;\n this.internalChroma = cam.chroma;\n this.internalTone = utils.lstarFromArgb(argb);\n this.argb = argb;\n }\n}\n", "/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Hct from './Hct.js';\n\n/**\n * A convenience class for retrieving colors that are constant in hue and\n * chroma, but vary in tone.\n */\nexport default class TonalPalette {\n /** @type {Map<number, number>} */\n #cache = new Map();\n\n /**\n * @param {number} argb ARGB representation of a color\n * @return {TonalPalette} Tones matching that color's hue and chroma.\n */\n static fromInt(argb) {\n const hct = Hct.fromInt(argb);\n return TonalPalette.fromHueAndChroma(hct.hue, hct.chroma);\n }\n\n /**\n * @param {number} hue HCT hue\n * @param {number} chroma HCT chroma\n * @return {TonalPalette} Tones matching hue and chroma.\n */\n static fromHueAndChroma(hue, chroma) {\n return new TonalPalette(hue, chroma);\n }\n\n /**\n * @private\n * @param {number} hue\n * @param {number} chroma\n */\n constructor(hue, chroma) {\n this.hue = hue;\n this.chroma = chroma;\n }\n\n /**\n * @param {number} tone HCT tone, measured from 0 to 100.\n * @return {number} ARGB representation of a color with that tone.\n */\n tone(tone) {\n let argb = this.#cache.get(tone);\n if (argb === undefined) {\n argb = Hct.from(this.hue, this.chroma, tone).toInt();\n this.#cache.set(tone, argb);\n }\n return argb;\n }\n}\n", "/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Hct from './Hct.js';\nimport TonalPalette from './TonalPalette.js';\n\n/**\n * An intermediate concept between the key color for a UI theme, and a full\n * color scheme. 5 sets of tones are generated, all except one use the same hue\n * as the key color, and all vary in chroma.\n */\nexport default class CorePalette {\n /** @type {TonalPalette} */\n a1;\n\n /** @type {TonalPalette} */\n a2;\n\n /** @type {TonalPalette} */\n a3;\n\n /** @type {TonalPalette} */\n n1;\n\n /** @type {TonalPalette} */\n n2;\n\n /** @type {TonalPalette} */\n error;\n\n /**\n * @param {number} argb ARGB representation of a color\n * @return {CorePalette}\n */\n static of(argb) {\n return new CorePalette(argb, false);\n }\n\n /**\n * @param {number} argb ARGB representation of a color\n * @return {CorePalette}\n */\n static contentOf(argb) {\n return new CorePalette(argb, true);\n }\n\n /**\n * @param {number} argb\n * @param {boolean} isContent\n */\n constructor(argb, isContent) {\n const hct = Hct.fromInt(argb);\n const { hue } = hct;\n const { chroma } = hct;\n if (isContent) {\n this.a1 = TonalPalette.fromHueAndChroma(hue, chroma);\n this.a2 = TonalPalette.fromHueAndChroma(hue, chroma / 3);\n this.a3 = TonalPalette.fromHueAndChroma(hue + 60, chroma / 2);\n this.n1 = TonalPalette.fromHueAndChroma(hue, Math.min(chroma / 12, 4));\n this.n2 = TonalPalette.fromHueAndChroma(hue, Math.min(chroma / 6, 8));\n } else {\n this.a1 = TonalPalette.fromHueAndChroma(hue, Math.max(48, chroma));\n this.a2 = TonalPalette.fromHueAndChroma(hue, 16);\n this.a3 = TonalPalette.fromHueAndChroma(hue + 60, 24);\n this.n1 = TonalPalette.fromHueAndChroma(hue, 4);\n this.n2 = TonalPalette.fromHueAndChroma(hue, 8);\n }\n this.error = TonalPalette.fromHueAndChroma(25, 84);\n }\n}\n", "/*\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport CorePalette from './CorePalette.js';\n\n/** Represents a Material color scheme, a mapping of color roles to colors. */\nexport default class Scheme {\n /**\n * @param {number} [primary]\n * @param {number} [onPrimary]\n * @param {number} [primaryContainer]\n * @param {number} [onPrimaryContainer]\n * @param {number} [secondary]\n * @param {number} [onSecondary]\n * @param {number} [secondaryContainer]\n * @param {number} [onSecondaryContainer]\n * @param {number} [tertiary]\n * @param {number} [onTertiary]\n * @param {number} [tertiaryContainer]\n * @param {number} [onTertiaryContainer]\n * @param {number} [error]\n * @param {number} [onError]\n * @param {number} [errorContainer]\n * @param {number} [onErrorContainer]\n * @param {number} [background]\n * @param {number} [onBackground]\n * @param {number} [surface]\n * @param {number} [onSurface]\n * @param {number} [surfaceVariant]\n * @param {number} [onSurfaceVariant]\n * @param {number} [outline]\n * @param {number} [outlineVariant]\n * @param {number} [shadow]\n * @param {number} [scrim]\n * @param {number} [inverseSurface]\n * @param {number} [inverseOnSurface]\n * @param {number} [inversePrimary]\n */\n constructor(\n primary,\n onPrimary,\n primaryContainer,\n onPrimaryContainer,\n secondary,\n onSecondary,\n secondaryContainer,\n onSecondaryContainer,\n tertiary,\n onTertiary,\n tertiaryContainer,\n onTertiaryContainer,\n error,\n onError,\n errorContainer,\n onErrorContainer,\n background,\n onBackground,\n surface,\n onSurface,\n surfaceVariant,\n onSurfaceVariant,\n outline,\n outlineVariant,\n shadow,\n scrim,\n inverseSurface,\n inverseOnSurface,\n inversePrimary,\n ) {\n this.primary = primary;\n this.onPrimary = onPrimary;\n this.primaryContainer = primaryContainer;\n this.onPrimaryContainer = onPrimaryContainer;\n this.secondary = secondary;\n this.onSecondary = onSecondary;\n this.secondaryContainer = secondaryContainer;\n this.onSecondaryContainer = onSecondaryContainer;\n this.tertiary = tertiary;\n this.onTertiary = onTertiary;\n this.tertiaryContainer = tertiaryContainer;\n this.onTertiaryContainer = onTertiaryContainer;\n this.error = error;\n this.onError = onError;\n this.errorContainer = errorContainer;\n this.onErrorContainer = onErrorContainer;\n this.background = background;\n this.onBackground = onBackground;\n this.surface = surface;\n this.onSurface = onSurface;\n this.surfaceVariant = surfaceVariant;\n this.onSurfaceVariant = onSurfaceVariant;\n this.outline = outline;\n this.outlineVariant = outlineVariant;\n this.shadow = shadow;\n this.scrim = scrim;\n this.inverseSurface = inverseSurface;\n this.inverseOnSurface = inverseOnSurface;\n this.inversePrimary = inversePrimary;\n }\n\n /**\n * @param {number} argb\n * @return {Scheme}\n */\n static light(argb) {\n return Scheme.#lightFromCorePalette(CorePalette.of(argb));\n }\n\n /**\n * @param {number} argb\n * @return {Scheme}\n */\n static dark(argb) {\n return Scheme.#darkFromCorePalette(CorePalette.of(argb));\n }\n\n /**\n * @param {number} argb\n * @return {Scheme}\n */\n static lightContent(argb) {\n return Scheme.#lightFromCorePalette(CorePalette.contentOf(argb));\n }\n\n /**\n * @param {number} argb\n * @return {Scheme}\n */\n static darkContent(argb) {\n return Scheme.#darkFromCorePalette(CorePalette.contentOf(argb));\n }\n\n /**\n * Light scheme from core palette\n * @param {CorePalette} core\n * @return {Scheme}\n */\n static #lightFromCorePalette(core) {\n return new Scheme()\n .withPrimary(core.a1.tone(40))\n .withOnPrimary(core.a1.tone(100))\n .withPrimaryContainer(core.a1.tone(90))\n .withOnPrimaryContainer(core.a1.tone(10))\n .withSecondary(core.a2.tone(40))\n .withOnSecondary(core.a2.tone(100))\n .withSecondaryContainer(core.a2.tone(90))\n .withOnSecondaryContainer(core.a2.tone(10))\n .withTertiary(core.a3.tone(40))\n .withOnTertiary(core.a3.tone(100))\n .withTertiaryContainer(core.a3.tone(90))\n .withOnTertiaryContainer(core.a3.tone(10))\n .withError(core.error.tone(40))\n .withOnError(core.error.tone(100))\n .withErrorContainer(core.error.tone(90))\n .withOnErrorContainer(core.error.tone(10))\n .withBackground(core.n1.tone(99))\n .withOnBackground(core.n1.tone(10))\n .withSurface(core.n1.tone(99))\n .withOnSurface(core.n1.tone(10))\n .withSurfaceVariant(core.n2.tone(90))\n .withOnSurfaceVariant(core.n2.tone(30))\n .withOutline(core.n2.tone(50))\n .withOutlineVariant(core.n2.tone(80))\n .withShadow(core.n1.tone(0))\n .withScrim(core.n1.tone(0))\n .withInverseSurface(core.n1.tone(20))\n .withInverseOnSurface(core.n1.tone(95))\n .withInversePrimary(core.a1.tone(80));\n }\n\n /**\n * Dark scheme from core palette\n * @param {CorePalette} core\n * @return {Scheme}\n */\n static #darkFromCorePalette(core) {\n return new Scheme()\n .withPrimary(core.a1.tone(80))\n .withOnPrimary(core.a1.tone(20))\n .withPrimaryContainer(core.a1.tone(30))\n .withOnPrimaryContainer(core.a1.tone(90))\n .withSecondary(core.a2.tone(80))\n .withOnSecondary(core.a2.tone(20))\n .withSecondaryContainer(core.a2.tone(30))\n .withOnSecondaryContainer(core.a2.tone(90))\n .withTertiary(core.a3.tone(80))\n .withOnTertiary(core.a3.tone(20))\n .withTertiaryContainer(core.a3.tone(30))\n .withOnTertiaryContainer(core.a3.tone(90))\n .withError(core.error.tone(80))\n .withOnError(core.error.tone(20))\n .withErrorContainer(core.error.tone(30))\n .withOnErrorContainer(core.error.tone(90))\n .withBackground(core.n1.tone(10))\n .withOnBackground(core.n1.tone(90))\n .withSurface(core.n1.tone(10))\n .withOnSurface(core.n1.tone(90))\n .withSurfaceVariant(core.n2.tone(30))\n .withOnSurfaceVariant(core.n2.tone(80))\n .withOutline(core.n2.tone(60))\n .withOutlineVariant(core.n2.tone(30))\n .withShadow(core.n1.tone(0))\n .withScrim(core.n1.tone(0))\n .withInverseSurface(core.n1.tone(90))\n .withInverseOnSurface(core.n1.tone(20))\n .withInversePrimary(core.a1.tone(40));\n }\n\n /**\n * @param {number} primary\n * @return {this}\n */\n withPrimary(primary) {\n this.primary = primary;\n return this;\n }\n\n /**\n * @param {number} onPrimary\n * @return {this}\n */\n withOnPrimary(onPrimary) {\n this.onPrimary = onPrimary;\n return this;\n }\n\n /**\n * @param {number} primaryContainer\n * @return {this}\n */\n withPrimaryContainer(primaryContainer) {\n this.primaryContainer = primaryContainer;\n return this;\n }\n\n /**\n * @param {number} onPrimaryContainer\n * @return {this}\n */\n withOnPrimaryContainer(onPrimaryContainer) {\n this.onPrimaryContainer = onPrimaryContainer;\n return this;\n }\n\n /**\n * @param {number} secondary\n * @return {this}\n */\n withSecondary(secondary) {\n this.secondary = secondary;\n return this;\n }\n\n /**\n * @param {number} onSecondary\n * @return {this}\n */\n withOnSecondary(onSecondary) {\n this.onSecondary = onSecondary;\n return this;\n }\n\n /**\n * @param {number} secondaryContainer\n * @return {this}\n */\n withSecondaryContainer(secondaryContainer) {\n this.secondaryContainer = secondaryContainer;\n return this;\n }\n\n /**\n * @param {number} onSecondaryContainer\n * @return {this}\n */\n withOnSecondaryContainer(onSecondaryContainer) {\n this.onSecondaryContainer = onSecondaryContainer;\n return this;\n }\n\n /**\n * @param {number} tertiary\n * @return {this}\n */\n withTertiary(tertiary) {\n this.tertiary = tertiary;\n return this;\n }\n\n /**\n * @param {number} onTertiary\n * @return {this}\n */\n withOnTertiary(onTertiary) {\n this.onTertiary = onTertiary;\n return this;\n }\n\n /**\n * @param {number} tertiaryContainer\n * @return {this}\n */\n withTertiaryContainer(tertiaryContainer) {\n this.tertiaryContainer = tertiaryContainer;\n return this;\n }\n\n /**\n * @param {number} onTertiaryContainer\n * @return {this}\n */\n withOnTertiaryContainer(onTertiaryContainer) {\n this.onTertiaryContainer = onTertiaryContainer;\n return this;\n }\n\n /**\n * @param {number} error\n * @return {this}\n */\n withError(error) {\n this.error = error;\n return this;\n }\n\n /**\n * @param {number} onError\n * @return {this}\n */\n withOnError(onError) {\n this.onError = onError;\n return this;\n }\n\n /**\n * @param {number} errorContainer\n * @return {this}\n */\n withErrorContainer(errorContainer) {\n this.errorContainer = errorContainer;\n return this;\n }\n\n /**\n * @param {number} onErrorContainer\n * @return {this}\n */\n withOnErrorContainer(onErrorContainer) {\n this.onErrorContainer = onErrorContainer;\n return this;\n }\n\n /**\n * @param {number} background\n * @return {this}\n */\n withBackground(background) {\n this.background = background;\n return this;\n }\n\n /**\n * @param {number} onBackground\n * @return {this}\n */\n withOnBackground(onBackground) {\n this.onBackground = onBackground;\n return this;\n }\n\n /**\n * @param {number} surface\n * @return {this}\n */\n withSurface(surface) {\n this.surface = surface;\n return this;\n }\n\n /**\n * @param {number} onSurface\n * @return {this}\n */\n withOnSurface(onSurface) {\n this.onSurface = onSurface;\n return this;\n }\n\n /**\n * @param {number} surfaceVariant\n * @return {this}\n */\n withSurfaceVariant(surfaceVariant) {\n this.surfaceVariant = surfaceVariant;\n return this;\n }\n\n /**\n * @param {number} onSurfaceVariant\n * @return {this}\n */\n withOnSurfaceVariant(onSurfaceVariant) {\n this.onSurfaceVariant = onSurfaceVariant;\n return this;\n }\n\n /**\n * @param {number} outline\n * @return {this}\n */\n withOutline(outline) {\n this.outline = outline;\n return this;\n }\n\n /**\n * @param {number} outlineVariant\n * @return {this}\n */\n withOutlineVariant(outlineVariant) {\n this.outlineVariant = outlineVariant;\n return this;\n }\n\n /**\n * @param {number} shadow\n * @return {this}\n */\n withShadow(shadow) {\n this.shadow = shadow;\n return this;\n }\n\n /**\n * @param {number} scrim\n * @return {this}\n */\n withScrim(scrim) {\n this.scrim = scrim;\n return this;\n }\n\n /**\n * @param {number} inverseSurface\n * @return {this}\n */\n withInverseSurface(inverseSurface) {\n this.inverseSurface = inverseSurface;\n return this;\n }\n\n /**\n * @param {number} inverseOnSurface\n * @return {this}\n */\n withInverseOnSurface(inverseOnSurface) {\n this.inverseOnSurface = inverseOnSurface;\n return this;\n }\n\n /**\n * @param {number} inversePrimary\n * @return {this}\n */\n withInversePrimary(inversePrimary) {\n this.inversePrimary = inversePrimary;\n return this;\n }\n\n /**\n * @param {any} object\n @return {boolean} */\n equals(object) {\n if (this === object) {\n return true;\n }\n if (!(object instanceof Scheme)) {\n return false;\n }\n\n /** @type {Scheme} */\n const scheme = object;\n\n if (this.primary !== scheme.primary) {\n return false;\n }\n if (this.onPrimary !== scheme.onPrimary) {\n return false;\n }\n if (this.primaryContainer !== scheme.primaryContainer) {\n return false;\n }\n if (this.onPrimaryContainer !== scheme.onPrimaryContainer) {\n return false;\n }\n if (this.secondary !== scheme.secondary) {\n return false;\n }\n if (this.onSecondary !== scheme.onSecondary) {\n return false;\n }\n if (this.secondaryContainer !== scheme.secondaryContainer) {\n return false;\n }\n if (this.onSecondaryContainer !== scheme.onSecondaryContainer) {\n return false;\n }\n if (this.tertiary !== scheme.tertiary) {\n return false;\n }\n if (this.onTertiary !== scheme.onTertiary) {\n return false;\n }\n if (this.tertiaryContainer !== scheme.tertiaryContainer) {\n return false;\n }\n if (this.onTertiaryContainer !== scheme.onTertiaryContainer) {\n return false;\n }\n if (this.error !== scheme.error) {\n return false;\n }\n if (this.onError !== scheme.onError) {\n return false;\n }\n if (this.errorContainer !== scheme.errorContainer) {\n return false;\n }\n if (this.onErrorContainer !== scheme.onErrorContainer) {\n return false;\n }\n if (this.background !== scheme.background) {\n return false;\n }\n if (this.onBackground !== scheme.onBackground) {\n return false;\n }\n if (this.surface !== scheme.surface) {\n return false;\n }\n if (this.onSurface !== scheme.onSurface) {\n return false;\n }\n if (this.surfaceVariant !== scheme.surfaceVariant) {\n return false;\n }\n if (this.onSurfaceVariant !== scheme.onSurfaceVariant) {\n return false;\n }\n if (this.outline !== scheme.outline) {\n return false;\n }\n if (this.outlineVariant !== scheme.outlineVariant) {\n return false;\n }\n if (this.shadow !== scheme.shadow) {\n return false;\n }\n if (this.scrim !== scheme.scrim) {\n return false;\n }\n if (this.inverseSurface !== scheme.inverseSurface) {\n return false;\n }\n if (this.inverseOnSurface !== scheme.inverseOnSurface) {\n return false;\n }\n if (this.inversePrimary !== scheme.inversePrimary) {\n return false;\n }\n\n return true;\n }\n}\n", "/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// libmonet is designed to have a consistent API across platforms\n// and modular components that can be moved around easily. Using a class as a\n// namespace facilitates this.\n//\n// tslint:disable:class-as-namespace\n\nimport Cam16 from './Cam16.js';\nimport Hct from './Hct.js';\nimport * as colorUtils from './colorUtils.js';\nimport * as mathUtils from './mathUtils.js';\n\n/**\n * Blend the design color's HCT hue towards the key color's HCT\n * hue, in a way that leaves the original color recognizable and\n * recognizably shifted towards the key color.\n * @param {number} designColor ARGB representation of an arbitrary color.\n * @param {number} sourceColor ARGB representation of the main theme color.\n * @return {number} The design color with a hue shifted towards the\n * system's color, a slightly warmer/cooler variant of the design\n * color's hue.\n */\nexport function harmonize(designColor, sourceColor) {\n const fromHct = Hct.fromInt(designColor);\n const toHct = Hct.fromInt(sourceColor);\n const differenceDegrees = mathUtils.differenceDegrees(fromHct.hue, toHct.hue);\n const rotationDegrees = Math.min(differenceDegrees * 0.5, 15);\n const outputHue = mathUtils.sanitizeDegreesDouble(\n fromHct.hue\n + rotationDegrees * mathUtils.rotationDirection(fromHct.hue, toHct.hue),\n );\n return Hct.from(outputHue, fromHct.chroma, fromHct.tone).toInt();\n}\n\n/**\n * Blend in CAM16-UCS space.\n * @param {number} from ARGB representation of color\n * @param {number} to ARGB representation of color\n * @param {number} amount how much blending to perform; 0.0 >= and <= 1.0\n * @return {number} from, blended towards to. Hue, chroma, and tone will\n * change.\n */\nexport function cam16Ucs(from, to, amount) {\n const fromCam = Cam16.fromInt(from);\n const toCam = Cam16.fromInt(to);\n const fromJ = fromCam.jstar;\n const fromA = fromCam.astar;\n const fromB = fromCam.bstar;\n const toJ = toCam.jstar;\n const toA = toCam.astar;\n const toB = toCam.bstar;\n const jstar = fromJ + (toJ - fromJ) * amount;\n const astar = fromA + (toA - fromA) * amount;\n const bstar = fromB + (toB - fromB) * amount;\n return Cam16.fromUcs(jstar, astar, bstar).toInt();\n}\n\n/**\n * Blends hue from one color into another. The chroma and tone of\n * the original color are maintained.\n * @param {number} from ARGB representation of color\n * @param {number} to ARGB representation of color\n * @param {number} amount how much blending to perform; 0.0 >= and <= 1.0\n * @return {number} from, with a hue blended towards to. Chroma and tone\n * are constant.\n */\nexport function hctHue(from, to, amount) {\n const ucs = cam16Ucs(from, to, amount);\n const ucsCam = Cam16.fromInt(ucs);\n const fromCam = Cam16.fromInt(from);\n const blended = Hct.from(\n ucsCam.hue,\n fromCam.chroma,\n colorUtils.lstarFromArgb(from),\n );\n return blended.toInt();\n}\n", "import CorePalette from './CorePalette.js';\nimport Scheme from './Scheme.js';\nimport { harmonize } from './blend.js';\nimport * as colorUtils from './colorUtils.js';\n\n/** @typedef {import('./TonalPalette.js').default} TonalPalette */\n\n/**\n * @param {string} value\n * @return {number}\n */\nfunction parseIntHex(value) {\n // tslint:disable-next-line:ban\n return Number.parseInt(value, 16);\n}\n\n/**\n * @param {string} hex String representing color as hex code. Accepts strings with or\n * without leading #, and string representing the color using 3, 6, or 8\n * hex characters.\n * @return {number} ARGB representation of color.\n */\nfunction argbFromHex(hex) {\n hex = hex.replace('#', '');\n const isThree = hex.length === 3;\n const isSix = hex.length === 6;\n const isEight = hex.length === 8;\n if (!isThree && !isSix && !isEight) {\n throw new Error(`unexpected hex ${hex}`);\n }\n let r = 0;\n let g = 0;\n let b = 0;\n if (isThree) {\n r = parseIntHex(hex.slice(0, 1).repeat(2));\n g = parseIntHex(hex.slice(1, 2).repeat(2));\n b = parseIntHex(hex.slice(2, 3).repeat(2));\n } else if (isSix) {\n r = parseIntHex(hex.slice(0, 2));\n g = parseIntHex(hex.slice(2, 4));\n b = parseIntHex(hex.slice(4, 6));\n } else if (isEight) {\n r = parseIntHex(hex.slice(2, 4));\n g = parseIntHex(hex.slice(4, 6));\n b = parseIntHex(hex.slice(6, 8));\n }\n\n return (\n ((255 << 24) | ((r & 0x0_FF) << 16) | ((g & 0x0_FF) << 8) | (b & 0x0_FF))\n >>> 0);\n}\n\n/**\n * @param {number} argb ARGB representation of a color.\n * @return {string} Hex string representing color, ex. #ff0000 for red.\n */\nfunction hexFromArgb(argb) {\n const r = colorUtils.redFromArgb(argb);\n const g = colorUtils.greenFromArgb(argb);\n const b = colorUtils.blueFromArgb(argb);\n const outParts = [r.toString(16), g.toString(16), b.toString(16)];\n\n // Pad single-digit output values\n for (const [i, part] of outParts.entries()) {\n if (part.length === 1) {\n outParts[i] = `0${part}`;\n }\n }\n\n return `#${outParts.join('')}`;\n}\n\n/**\n * @param {number} argb\n * @return {string}\n */\nfunction cssVarFromArgb(argb) {\n return [\n colorUtils.redFromArgb(argb),\n colorUtils.greenFromArgb(argb),\n colorUtils.blueFromArgb(argb),\n ].join(',');\n}\n\n/**\n * @param {Scheme} scheme\n * @return {string}\n */\nfunction cssVariablesFromScheme(scheme) {\n return /* css */`\n :root {\n --mdw-color__primary: ${cssVarFromArgb(scheme.primary)};\n --mdw-color__on-primary: ${cssVarFromArgb(scheme.onPrimary)};\n --mdw-color__primary-container: ${cssVarFromArgb(scheme.primaryContainer)};\n --mdw-color__on-primary-container: ${cssVarFromArgb(scheme.onPrimaryContainer)};\n --mdw-color__secondary: ${cssVarFromArgb(scheme.secondary)};\n --mdw-color__on-secondary: ${cssVarFromArgb(scheme.onSecondary)};\n --mdw-color__secondary-container: ${cssVarFromArgb(scheme.secondaryContainer)};\n --mdw-color__on-secondary-container: ${cssVarFromArgb(scheme.onSecondaryContainer)};\n --mdw-color__tertiary: ${cssVarFromArgb(scheme.tertiary)};\n --mdw-color__on-tertiary: ${cssVarFromArgb(scheme.onTertiary)};\n --mdw-color__tertiary-container: ${cssVarFromArgb(scheme.tertiaryContainer)};\n --mdw-color__on-tertiary-container: ${cssVarFromArgb(scheme.onTertiaryContainer)};\n --mdw-color__error: ${cssVarFromArgb(scheme.error)};\n --mdw-color__on-error: ${cssVarFromArgb(scheme.onError)};\n --mdw-color__error-container: ${cssVarFromArgb(scheme.errorContainer)};\n --mdw-color__on-error-container: ${cssVarFromArgb(scheme.onErrorContainer)};\n --mdw-color__background: ${cssVarFromArgb(scheme.background)};\n --mdw-color__on-background: ${cssVarFromArgb(scheme.onBackground)};\n --mdw-color__surface: ${cssVarFromArgb(scheme.surface)};\n --mdw-color__on-surface: ${cssVarFromArgb(scheme.onSurface)};\n --mdw-color__surface-variant: ${cssVarFromArgb(scheme.surfaceVariant)};\n --mdw-color__on-surface-variant: ${cssVarFromArgb(scheme.onSurfaceVariant)};\n --mdw-color__outline: ${cssVarFromArgb(scheme.outline)};\n --mdw-color__outline-variant: ${cssVarFromArgb(scheme.outlineVariant)};\n --mdw-color__shadow: ${cssVarFromArgb(scheme.shadow)};\n --mdw-color__scrim: ${cssVarFromArgb(scheme.scrim)};\n --mdw-color__inverse-surface: ${cssVarFromArgb(scheme.inverseSurface)};\n --mdw-color__inverse-on-surface: ${cssVarFromArgb(scheme.inverseOnSurface)};\n --mdw-color__inverse-primary: ${cssVarFromArgb(scheme.inversePrimary)};\n }\n `;\n}\n\n/**\n * @param {string} name\n * @param {TonalPalette} tonalPalette\n * @param {boolean} [isDark]\n */\nfunction cssVariablesFromCustom(name, tonalPalette, isDark) {\n return /* css */`\n :root {\n --mdw-color__${name}: ${cssVarFromArgb(tonalPalette.tone(isDark ? 80 : 40))};\n --mdw-color__on-${name}: ${cssVarFromArgb(tonalPalette.tone(isDark ? 20 : 100))};\n --mdw-color__${name}-container: ${cssVarFromArgb(tonalPalette.tone(isDark ? 30 : 90))};\n --mdw-color__on-${name}-container: ${cssVarFromArgb(tonalPalette.tone(isDark ? 90 : 10))};\n }\n .mdw-custom[color=\"${name}\"] {\n --mdw-bg: var(--mdw-color__${name});\n --mdw-ink: var(--mdw-color__on-${name});\n }\n .mdw-custom[color=\"${name}-container\"] {\n --mdw-bg: var(--mdw-color__${name}-container);\n --mdw-ink: var(--mdw-color__on-${name}-container);\n }\n .mdw-custom[ink=\"${name}\"] {\n --mdw-ink: var(--mdw-color__${name});\n }\n \n \n `;\n}\n\n/**\n * @param {string} mainColor as hex\n * @param {Iterable<[string,string]>} [customColors]\n * @return {Record<string, string>}\n */\nexport function getScheme(mainColor, customColors = []) {\n const argbColor = argbFromHex(mainColor);\n const lightRules = [cssVariablesFromScheme(Scheme.light(argbColor))];\n const darkRules = [cssVariablesFromScheme(Scheme.dark(argbColor))];\n const lightContentRules = [cssVariablesFromScheme(Scheme.lightContent(argbColor))];\n const darkContentRules = [cssVariablesFromScheme(Scheme.darkContent(argbColor))];\n for (const [name, color] of customColors) {\n const argbCustom = argbFromHex(color);\n const blended = harmonize(argbCustom, argbColor);\n const { a1: tp } = CorePalette.of(blended);\n const { a1: ctp } = CorePalette.contentOf(blended);\n\n lightRules.push(cssVariablesFromCustom(name, tp));\n darkRules.push(cssVariablesFromCustom(name, tp, true));\n lightContentRules.push(cssVariablesFromCustom(name, ctp));\n darkContentRules.push(cssVariablesFromCustom(name, ctp, true));\n }\n return {\n light: lightRules.join('\\n'),\n dark: darkRules.join('\\n'),\n lightContent: lightContentRules.join('\\n'),\n darkContent: darkContentRules.join('\\n'),\n };\n}\n", "/**\n * Uses UTF-8 charset instead of base64 for better compression\n * @param {string} svg\n * @return {string}\n */\nexport function svgToCSSURL(svg) {\n return `url('data:image/svg+xml;charset=UTF-8,${svg\n .replaceAll('\\n', ' ')\n .replaceAll('#', '%23')\n .replaceAll('(', '%28')\n .replaceAll(')', '%29')}')`;\n}\n"],
5
- "mappings": "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",
6
- "names": ["generateCSSStyleSheets", "styles", "style", "sheet", "styleElementWrappers", "generateHTMLStyleElements", "styleElement", "PREFIX", "generatedUIDs", "generateUID", "id", "identifierFromElement", "element", "mutate", "buildMergePatch", "previous", "current", "arrayStrategy", "isArray", "patch", "previousKeys", "key", "value", "changes", "hasMergePatch", "target", "attrValueFromDataValue", "value", "attrNameFromPropName", "name", "attrNameWords", "prev", "curr", "IS_FIREFOX", "isFocused", "element", "attemptFocus", "options", "isRtl", "DEFAULT_NULL_PARSER", "DEFAULT_BOOLEAN_PARSER", "v", "DEFAULT_NUMBER_PARSER", "DEFAULT_STRING_PARSER", "DEFAULT_OBJECT_PARSER", "o", "DEFAULT_OBJECT_COMPARATOR", "a", "b", "hasMergePatch", "DEFAULT_OBJECT_DIFF", "buildMergePatch", "emptyFromType", "type", "defaultParserFromType", "parseObserverOptions", "name", "typeOrOptions", "object", "options", "enumerable", "attr", "reflect", "empty", "changedCallback", "parsedType", "value", "parsed", "attrNameFromPropName", "parser", "nullParser", "parsedEmpty", "isFn", "diff", "INIT_SYMBOL", "DEFAULT_OBSERVER_CONFIGURATION", "observeFunction", "fn", "arg0", "args", "argPoked", "thisPoked", "buildProxy", "proxyTarget", "set", "prefix", "target", "p", "arg", "value", "argProxy", "thisProxy", "defaultValue", "reusable", "defineObservableProperty", "object", "key", "options", "config", "DEFAULT_OBSERVER_CONFIGURATION", "parseObserverOptions", "detectChange", "oldValue", "newValue", "changes", "internalGet", "internalSet", "onInvalidate", "props", "prop", "descriptor", "INIT_SYMBOL", "_inactiveDocument", "_cssStyleSheetConstructable", "generateFragment", "fromString", "inlineFunctions", "addInlineFunction", "fn", "internalName", "generateUID", "cssStyleSheetsCache", "styleElementCache", "css", "array", "substitutions", "content", "sheet", "style", "fragmentCache", "html", "strings", "tempSlots", "replacements", "sub", "tempId", "compiledString", "fragment", "id", "element", "STRING_INTERPOLATION_REGEX", "buildShadowRootChildListener", "fn", "event", "host", "flattenObject", "object", "syntax", "target", "scope", "key", "value", "scopedKey", "entryFromPropName", "prop", "source", "child", "valueFromPropName", "Composition", "parts", "generateFragment", "part", "listener", "set", "root", "changes", "context", "store", "fnResults", "modifiedNodes", "flattened", "rawValue", "entries", "id", "node", "nodeType", "props", "negate", "doubleNegate", "ref", "args", "lastIndexOfDot", "entry", "propSearchKey", "lastPropSearchKey", "propName", "index", "nodesFound", "childNode", "attached", "orphaned", "shouldShow", "metadata", "comment", "parent", "commentText", "#interpolateNode", "element", "defaults", "parsedValue", "nodeValue", "nodeName", "trimmed", "length", "segments", "segment", "newNode", "isEvent", "textNodeIndex", "prev", "identifierFromElement", "eventType", "flags", "type", "options", "inlineFunctions", "defaultValue", "inlineFunctionOptions", "observeResult", "observeFunction", "parsedNodeName", "removalList", "TREE_WALKER_FILTER", "treeWalker", "removeElement", "attr", "parentId", "nextNode", "watcher", "generateCSSStyleSheets", "generateHTMLStyleElements", "data", "rootEventTarget", "events", "eventTarget", "references", "anchorElement", "cloneTarget", "interpolatedElement", "parentElement", "referencedParent", "liveElement", "conditionalParent", "iterator", "nodeIdentifier", "reusable", "ICustomElement", "cloneAttributeCallback", "name", "target", "oldValue", "newValue", "element", "EVENT_PREFIX_REGEX", "_refsProxy", "_refsCache", "_refsCompositionCache", "_composition", "_template", "template_get", "_CustomElement", "ICustomElement", "args", "__privateAdd", "__publicField", "callback", "s", "config", "__privateGet", "__privateSet", "Composition", "collection", "parts", "composition", "array", "substitutions", "css", "schema", "elementName", "strings", "html", "source", "options", "value", "mixin", "force", "typeOrOptions", "customCallback", "changes", "defineObservableProperty", "prop", "props", "propWatchers", "watcher", "index", "listeners", "key", "listenerOptions", "flags", "type", "listenerMap", "id", "nameOrCallbacks", "callbacks", "fn", "arrayPropName", "lcName", "data", "store", "stringValue", "previousDataValue", "parsedValue", "reflect", "attr", "dataValue", "attrValue", "attrValueFromDataValue", "formattedId", "attrNameFromPropName", "listener", "e", "addInlineFunction", "CustomElement", "DensityMixin", "Base", "ShapeMixin", "Base", "ThemableMixin", "Base", "Badge_default", "CustomElement", "ThemableMixin", "DensityMixin", "ShapeMixin", "FlexableMixin", "Base", "Box_default", "CustomElement", "ThemableMixin", "FlexableMixin", "Body_default", "Box_default", "AriaReflectorMixin", "Base", "name", "value", "attrName", "oldValue", "newValue", "DEFAULT_ELEMENT_QUERY", "KeyboardNavMixin", "Base", "current", "loop", "reverse", "foundCurrent", "array", "candidate", "attemptFocus", "options", "currentlyFocusedChild", "currentTabIndexChild", "firstFocusableChild", "child", "event", "currentItem", "item", "isRtl", "AriaToolbarMixin", "Base", "KeyboardNavMixin", "SurfaceMixin", "Base", "hoveredState", "pressedState", "elevated", "elevation", "disabledState", "color", "Surface_default", "CustomElement", "ThemableMixin", "FlexableMixin", "SurfaceMixin", "ShapeMixin", "surface", "shape", "surfaceTint", "BottomAppBar_default", "Surface_default", "AriaToolbarMixin", "AriaReflectorMixin", "svgAliasMap", "unaliased", "documentLoadedStyleSheets", "Icon", "CustomElement", "ThemableMixin", "_slottedText", "result", "svgPath", "_svgAlias", "viewBox", "svg", "_computedSVGPath", "src", "currentTarget", "href", "parentNode", "link", "name", "path", "width", "height", "FORM_IPC_EVENT", "DOMString", "FormAssociatedMixin", "Base", "_invalid", "_defaultValue", "value", "type", "checked", "_valueBehavior", "_value", "v", "_checked", "_formDisabled", "disabled", "error", "key", "newTarget", "form", "event", "name", "state", "mode", "ControlMixin", "Base", "FormAssociatedMixin", "control", "options", "validityState", "newValidity", "key", "error", "template", "html", "ariaLabel", "oldValue", "newValue", "cloneAttributeCallback", "currentTarget", "IMPLICIT_SUBMISSION_BLOCKING_TYPES", "DOMString", "InputMixin", "Base", "ControlMixin", "inline", "label", "control", "oldValue", "newValue", "input", "cloneAttributeCallback", "checked", "value", "event", "form", "defaultButton", "submissionBlockers", "element", "eventHandlerValues", "EVENT_HANDLER_TYPE", "v", "name", "oldValue", "newValue", "button", "fn", "eventName", "elementStylerLastAnimation", "elementStylerValues", "elementStylerHasQueue", "elementStylerRAFCallback", "previousAnimation", "value", "currentAnimation", "ELEMENT_STYLER_TYPE", "oldValue", "newValue", "hasQueue", "Ripple_default", "CustomElement", "oldValue", "newValue", "ELEMENT_STYLER_TYPE", "_positionX", "_positionY", "_radius", "x", "y", "size", "hypotenuse", "parentWidth", "parentHeight", "width", "height", "animationName", "RippleMixin", "Base", "element", "ripple", "x", "y", "hold", "rippleContainer", "Ripple_default", "event", "rect", "lastRipple", "oldValue", "pressed", "lastInteractionWasTouch", "StateMixin", "Base", "disabled", "_hovered", "_focused", "_pressed", "_lastInteraction", "event", "Button_default", "CustomElement", "ThemableMixin", "DensityMixin", "SurfaceMixin", "ShapeMixin", "StateMixin", "RippleMixin", "InputMixin", "icon", "svg", "src", "svgPath", "shape", "surfaceTint", "state", "rippleContainer", "surface", "control", "label", "slot", "currentTarget", "value", "form", "duplicatedButton", "SUPPORTS_INERT", "Card_default", "CustomElement", "ThemableMixin", "FlexableMixin", "SurfaceMixin", "ShapeMixin", "FormAssociatedMixin", "StateMixin", "AriaReflectorMixin", "EVENT_HANDLER_TYPE", "disabledState", "slot", "surface", "surfaceTint", "shape", "outline", "CheckboxIcon_default", "CustomElement", "ThemableMixin", "ShapeMixin", "value", "html", "outline", "shape", "TouchTargetMixin", "Base", "Checkbox_default", "CustomElement", "ThemableMixin", "StateMixin", "RippleMixin", "InputMixin", "TouchTargetMixin", "indeterminate", "checked", "indeterminateIcon", "icon", "html", "label", "control", "state", "rippleContainer", "touchTarget", "Chip_default", "Button_default", "inline", "slot", "outline", "icon", "ink", "iconInk", "Divider_default", "CustomElement", "ThemableMixin", "DialogActions_default", "CustomElement", "handleTabKeyPress", "event", "focusableElements", "foundTarget", "candidate", "el", "OPEN_DIALOGS", "supportsHTMLDialogElement", "Dialog_default", "CustomElement", "event", "currentTarget", "hasContent", "node", "returnValue", "form", "e", "lastOpenDialog", "key", "value", "cancelEvent", "main", "stackIndex", "stack", "index", "source", "previousFocus", "title", "newState", "previousState", "dialogStack", "focusElement", "d", "open", "surface", "context", "handleTabKeyPress", "ExtendedFab_default", "Button_default", "Tooltip_default", "Surface_default", "AriaReflectorMixin", "oldValue", "newValue", "canAnchorPopup", "options", "pageX", "pageY", "directionX", "directionY", "clientX", "clientY", "anchor", "rect", "width", "height", "popup", "offsetX", "offsetY", "margin", "TooltipTriggerMixin", "Base", "_tooltip", "_idleDebounce", "_pendingHide", "_watchedParents", "_resizeObserver", "_intersectObserver", "_TooltipTrigger", "args", "__privateAdd", "__publicField", "event", "__privateSet", "__privateGet", "entries", "threshold", "entry", "child", "type", "timeout", "touch", "offsetParent", "parent", "hoverStyle", "domRect", "anchorOptions", "isPageRTL", "xStart", "xEnd", "preferences", "anchorResult", "preference", "canAnchorPopup", "TooltipTrigger", "template", "html", "Fab_default", "ExtendedFab_default", "TooltipTriggerMixin", "slot", "tooltipSlot", "control", "shape", "icon", "FilterChip_default", "Chip_default", "trailingIcon", "dropdown", "trailingSrc", "shape", "icon", "control", "outline", "slot", "checkIcon", "Headline_default", "Box_default", "ThemableMixin", "ariaLevel", "size", "slot", "IconButton_default", "Button_default", "TooltipTriggerMixin", "type", "checked", "event", "input", "clickEvent", "slot", "shape", "tooltipSlot", "icon", "label", "surfaceTint", "control", "outline", "el", "TextFieldMixin", "Base", "DensityMixin", "ShapeMixin", "error", "_invalid", "filled", "outlined", "label", "placeholder", "supporting", "_validationMessage", "value", "_badInput", "template", "html", "inline", "control", "labelElement", "outline", "shape", "outlineLeft", "outlineRight", "state", "shapeTop", "oldValue", "newValue", "Input_default", "CustomElement", "ThemableMixin", "StateMixin", "InputMixin", "TextFieldMixin", "Label_default", "Box_default", "Layout_default", "CustomElement", "List_default", "Box_default", "DensityMixin", "AriaReflectorMixin", "RadioIcon_default", "CustomElement", "ThemableMixin", "ShapeMixin", "value", "outline", "ListItem_default", "CustomElement", "ThemableMixin", "StateMixin", "RippleMixin", "AriaReflectorMixin", "disabled", "href", "state", "rippleContainer", "anchor", "oldValue", "newValue", "currentTarget", "_ListOption", "ListItem_default", "_selectedDirty", "defaultSelected", "_selected", "value", "_formDisabled", "disabled", "formDisabled", "options", "inline", "anchor", "state", "content", "disabledState", "selected", "text", "ListOption", "constructHTMLOptionsCollectionProxy", "host", "collection", "OptionConstructor", "GroupConstructor", "add", "element", "before", "beforeElement", "index", "remove", "i", "value", "target", "p", "receiver", "newValue", "currentSize", "_ListSelect", "List_default", "StateMixin", "FormAssociatedMixin", "KeyboardNavMixin", "el", "event", "host", "index", "ListOption", "target", "selections", "firstSelection", "constructHTMLOptionsCollectionProxy", "value", "v", "ListSelect", "oldValue", "newValue", "supportsHTMLDialogElement", "OPEN_MENUS", "onWindowResize", "lastOpenMenu", "onPopState", "event", "key", "onBeforeUnload", "Menu_default", "CustomElement", "DensityMixin", "KeyboardNavMixin", "items", "submenuItems", "el", "value", "open", "firstItem", "attemptFocus", "anchor", "surface", "newSize", "anchorOptions", "isPageRTL", "xStart", "xEnd", "preferences", "anchorResult", "preference", "canAnchorPopup", "source", "previousFocus", "newState", "previousState", "scrollRestoration", "returnFocus", "main", "len", "entry", "cascader", "activeElement", "MenuItem", "ListOption", "FormAssociatedMixin", "value", "event", "name", "trailingIcon", "cascades", "oldValue", "newValue", "submenuElement", "inline", "html", "checkboxRef", "radioRef", "anchor", "trailing", "checkbox", "radio", "ScrollListenerMixin", "Base", "event", "scroller", "element", "NavItem", "CustomElement", "ThemableMixin", "StateMixin", "RippleMixin", "ShapeMixin", "options", "active", "ariaLabel", "href", "html", "shape", "state", "rippleContainer", "key", "repeat", "args", "Nav_default", "Surface_default", "event", "NavItem", "el", "NavBar_default", "Nav_default", "ScrollListenerMixin", "ELEMENT_STYLER_TYPE", "_translateY", "_transition", "max", "visibility", "resizeObserver", "oldValue", "newValue", "shift", "breakpoint", "NavBarItem_default", "NavItem", "NavRail_default", "Nav_default", "html", "slot", "NavDrawer_default", "NavRail_default", "NavDrawerItem_default", "NavItem", "html", "NavRailItem_default", "NavItem", "Pane_default", "CustomElement", "ThemableMixin", "Progress_default", "CustomElement", "ThemableMixin", "value", "max", "oldValue", "newValue", "Radio_default", "CustomElement", "ThemableMixin", "StateMixin", "RippleMixin", "InputMixin", "TouchTargetMixin", "html", "label", "rippleContainer", "state", "control", "touchTarget", "SegmentedButton_default", "Button_default", "html", "inline", "shape", "icon", "outline", "control", "slot", "state", "type", "checked", "SegmentedButtonGroup_default", "Box_default", "KeyboardNavMixin", "AriaReflectorMixin", "SegmentedButton_default", "child", "index", "list", "Select_default", "CustomElement", "ThemableMixin", "StateMixin", "ControlMixin", "TextFieldMixin", "event", "select", "child", "template", "slot", "prefix", "suffix", "control", "oldValue", "newValue", "parseFloat", "value", "onNaN", "number", "valueAsFraction", "min", "max", "nValue", "nMin", "nMax", "Slider_default", "CustomElement", "ThemableMixin", "StateMixin", "InputMixin", "event", "input", "offsetX", "clientX", "pageX", "isActive", "isTouch", "touch", "clientWidth", "position", "step", "nStep", "currentValue", "roundedValue", "scale", "thumbOffset", "thumbMin", "thumbMax", "currentTarget", "ticks", "_previewValue", "template", "html", "state", "label", "control", "_isHoveringThumb", "focusedState", "oldValue", "newValue", "Snackbar_default", "Surface_default", "DensityMixin", "AriaReflectorMixin", "EVENT_HANDLER_TYPE", "resolve", "text", "content", "slot", "Shape_default", "Box_default", "ShapeMixin", "shape", "outline", "SwitchIcon_default", "CustomElement", "ThemableMixin", "ShapeMixin", "selected", "value", "disabled", "pressed", "focused", "hovered", "color", "_active", "icon", "src", "unselectedIcon", "unselectedSrc", "outline", "track", "oldValue", "newValue", "Switch_default", "CustomElement", "ThemableMixin", "InputMixin", "StateMixin", "TouchTargetMixin", "html", "state", "label", "control", "touchTarget", "event", "input", "offsetX", "clientX", "pageX", "isActive", "touch", "clientWidth", "position", "currentValue", "pixels", "currentPixels", "newRatio", "newValue", "Tab_default", "CustomElement", "ShapeMixin", "StateMixin", "RippleMixin", "ScrollListenerMixin", "slot", "target", "options", "href", "active", "disabledState", "data", "shape", "rippleContainer", "state", "event", "el", "registeredElements", "rtlObserver", "RTLObserverMixin", "Base", "isRTL", "el", "resizeObserver", "entries", "entry", "ResizeObserverMixin", "Base", "TabList_default", "CustomElement", "ThemableMixin", "KeyboardNavMixin", "ResizeObserverMixin", "RTLObserverMixin", "ShapeMixin", "value", "oldValue", "newValue", "Tab_default", "tab", "index", "el", "width", "position", "animate", "percentage", "metrics", "clamped", "decimalIndex", "leftIndex", "rightIndex", "leftMetrics", "rightMetrics", "activeTab", "center", "leftRatio", "rightRatio", "leftWidth", "rightWidth", "activeIndex", "distance", "tabContent", "start", "max", "shape", "indicator", "target", "TabPanel_default", "Box_default", "AriaReflectorMixin", "oldValue", "newValue", "TabContent_default", "CustomElement", "ResizeObserverMixin", "panel", "index", "value", "el", "start", "width", "end", "metric", "percentage", "event", "slot", "TabPanel_default", "DOMString", "TextArea_default", "CustomElement", "ThemableMixin", "StateMixin", "ControlMixin", "TextFieldMixin", "ResizeObserverMixin", "value", "previousValue", "newValue", "textarea", "lineHeight", "lastClientHeight", "entry", "currentTarget", "child", "control", "oldValue", "cloneAttributeCallback", "Title_default", "Headline_default", "ariaLevel", "size", "TopAppBar_default", "CustomElement", "ThemableMixin", "SurfaceMixin", "AriaToolbarMixin", "ScrollListenerMixin", "ResizeObserverMixin", "oldValue", "newValue", "ELEMENT_STYLER_TYPE", "hideOnScroll", "_cssPosition", "_translateY", "_duration", "_easing", "size", "_headlineOpacity", "inline", "surface", "leading", "headline", "trailing", "ariaLabel", "max", "min", "_visibleStart", "value", "resizeObserver", "loader_exports", "theming_exports", "__export", "generateColorCSS", "generateShapeCSS", "generateThemeCSS", "generateTypographyCSS", "generateTypographyGlobalCSS", "setupTheme", "themeOptionsFromSearchParams", "COLOR_KEYWORDS", "signum", "num", "lerp", "start", "stop", "amount", "clampInt", "min", "max", "input", "sanitizeDegreesDouble", "degrees", "rotationDirection", "from", "to", "differenceDegrees", "a", "b", "matrixMultiply", "row", "matrix", "c", "SRGB_TO_XYZ", "XYZ_TO_SRGB", "WHITE_POINT_D65", "argbFromRgb", "red", "green", "blue", "argbFromLinrgb", "linrgb", "r", "delinearized", "g", "b", "redFromArgb", "argb", "greenFromArgb", "blueFromArgb", "argbFromXyz", "x", "y", "z", "matrix", "XYZ_TO_SRGB", "linearR", "linearG", "linearB", "r", "delinearized", "g", "b", "argbFromRgb", "xyzFromArgb", "argb", "linearized", "redFromArgb", "greenFromArgb", "blueFromArgb", "matrixMultiply", "SRGB_TO_XYZ", "argbFromLstar", "lstar", "y", "yFromLstar", "component", "delinearized", "argbFromRgb", "lstarFromArgb", "argb", "xyzFromArgb", "labF", "labInvf", "linearized", "rgbComponent", "normalized", "clampInt", "whitePointD65", "WHITE_POINT_D65", "kappa", "ft", "ft3", "_ViewingConditions", "whitePoint", "whitePointD65", "adaptingLuminance", "yFromLstar", "backgroundLstar", "surround", "discountingIlluminant", "xyz", "rW", "gW", "bW", "f", "c", "lerp", "d", "nc", "rgbD", "k", "k4", "k4F", "fl", "n", "z", "nbb", "ncb", "rgbAFactors", "rgbA", "aw", "fLRoot", "ViewingConditions", "__publicField", "Cam16", "hue", "chroma", "j", "q", "m", "s", "jstar", "astar", "bstar", "other", "dJ", "dA", "dB", "argb", "ViewingConditions", "viewingConditions", "red", "green", "blue", "redL", "linearized", "greenL", "blueL", "x", "y", "z", "rC", "gC", "bC", "rD", "gD", "bD", "rAF", "gAF", "bAF", "rA", "signum", "gA", "bA", "a", "b", "u", "p2", "atanDegrees", "hueRadians", "huePrime", "eHue", "alpha", "c", "mstar", "h", "t", "hRad", "ac", "p1", "hSin", "hCos", "gamma", "rCBase", "gCBase", "bCBase", "rF", "gF", "bF", "argbFromXyz", "SCALED_DISCOUNT_FROM_LINRGB", "LINRGB_FROM_SCALED_DISCOUNT", "Y_FROM_LINRGB", "CRITICAL_PLANES", "sanitizeRadians", "angle", "trueDelinearized", "rgbComponent", "normalized", "delinearized", "chromaticAdaptation", "component", "af", "signum", "hueOf", "linrgb", "scaledDiscount", "matrixMultiply", "rA", "gA", "bA", "a", "b", "areInCyclicOrder", "c", "deltaAB", "deltaAC", "intercept", "source", "mid", "target", "lerpPoint", "t", "setCoordinate", "coordinate", "axis", "isBounded", "x", "nthVertex", "y", "n", "kR", "kG", "kB", "coordA", "coordB", "g", "r", "bisectToSegment", "targetHue", "left", "right", "leftHue", "rightHue", "initialized", "uncut", "midHue", "midpoint", "criticalPlaneBelow", "criticalPlaneAbove", "bisectToLimit", "segment", "lPlane", "rPlane", "i", "mPlane", "midPlaneCoordinate", "inverseChromaticAdaptation", "adapted", "adaptedAbs", "base", "findResultByJ", "hueRadians", "chroma", "j", "viewingConditions", "ViewingConditions", "tInnerCoeff", "p1", "hSin", "hCos", "iterationRound", "jNormalized", "p2", "gamma", "rCScaled", "gCScaled", "bCScaled", "fnj", "argbFromLinrgb", "solveToInt", "hueDegrees", "lstar", "argbFromLstar", "sanitizeDegreesDouble", "yFromLstar", "exactAnswer", "Hct", "hue", "chroma", "tone", "solveToInt", "argb", "newHue", "newChroma", "newTone", "cam", "Cam16", "lstarFromArgb", "TonalPalette", "#cache", "argb", "hct", "Hct", "hue", "chroma", "tone", "CorePalette", "argb", "isContent", "hct", "Hct", "hue", "chroma", "TonalPalette", "_lightFromCorePalette", "lightFromCorePalette_fn", "_darkFromCorePalette", "darkFromCorePalette_fn", "_Scheme", "primary", "onPrimary", "primaryContainer", "onPrimaryContainer", "secondary", "onSecondary", "secondaryContainer", "onSecondaryContainer", "tertiary", "onTertiary", "tertiaryContainer", "onTertiaryContainer", "error", "onError", "errorContainer", "onErrorContainer", "background", "onBackground", "surface", "onSurface", "surfaceVariant", "onSurfaceVariant", "outline", "outlineVariant", "shadow", "scrim", "inverseSurface", "inverseOnSurface", "inversePrimary", "argb", "_a", "__privateMethod", "CorePalette", "object", "scheme", "Scheme", "core", "__privateAdd", "harmonize", "designColor", "sourceColor", "fromHct", "Hct", "toHct", "differenceDegrees", "rotationDegrees", "outputHue", "sanitizeDegreesDouble", "rotationDirection", "parseIntHex", "value", "argbFromHex", "hex", "isThree", "isSix", "isEight", "r", "g", "b", "cssVarFromArgb", "argb", "redFromArgb", "greenFromArgb", "blueFromArgb", "cssVariablesFromScheme", "scheme", "cssVariablesFromCustom", "name", "tonalPalette", "isDark", "getScheme", "mainColor", "customColors", "argbColor", "argbFromHex", "lightRules", "Scheme", "darkRules", "lightContentRules", "darkContentRules", "color", "argbCustom", "blended", "harmonize", "tp", "CorePalette", "ctp", "svgToCSSURL", "svg", "getShapeMaskSVG", "shape", "getShapeCornerSVGs", "corner", "convex", "path", "getShapeEdgesSVGs", "CIRCLE_PATH", "DIAMOND_PATH", "SQUIRCLE_PATH", "SHAPE_ROUNDED_DEFAULT", "CIRCLE_PATH", "SHAPE_CUT_DEFAULT", "DIAMOND_PATH", "SHAPE_SQUIRCLE_DEFAULT", "SQUIRCLE_PATH", "SP", "TYPOGRAPHY_DEFAULT", "generateTypographyCSS", "config", "generateTypographyGlobalCSS", "style", "size", "generateShapeCSS", "svgToCSSURL", "getShapeMaskSVG", "getShapeCornerSVGs", "getShapeEdgesSVGs", "addStyle", "content", "element", "generateColorCSS", "color", "custom", "lightness", "parsedColors", "name", "hex", "COLOR_KEYWORDS", "scheme", "getScheme", "setupTheme", "themeOptionsFromSearchParams", "searchParams", "c", "generateThemeCSS", "shapeCss", "typographyCss", "colorCss", "rules", "generateThemeCSS", "themeOptionsFromSearchParams", "generateTypographyGlobalCSS", "parsed", "css"]
3
+ "sources": ["../mixins/ThemableMixin.js", "../core/optimizations.js", "../core/CompositionAdapter.js", "../core/css.js", "../core/dom.js", "../core/jsonMergePatch.js", "../core/observe.js", "../core/uid.js", "../core/template.js", "../core/Composition.js", "../core/ICustomElement.js", "../core/CustomElement.js", "../mixins/DensityMixin.js", "../mixins/ShapeMixin.js", "../components/Badge.js", "../mixins/FlexableMixin.js", "../components/Box.js", "../components/Body.js", "../mixins/AriaReflectorMixin.js", "../mixins/KeyboardNavMixin.js", "../mixins/AriaToolbarMixin.js", "../mixins/SurfaceMixin.js", "../components/Surface.js", "../components/BottomAppBar.js", "../components/Icon.js", "../mixins/FormAssociatedMixin.js", "../mixins/ControlMixin.js", "../mixins/InputMixin.js", "../core/customTypes.js", "../components/Ripple.js", "../mixins/RippleMixin.js", "../mixins/StateMixin.js", "../components/Button.js", "../components/Card.js", "../components/CheckboxIcon.js", "../mixins/TouchTargetMixin.js", "../components/Checkbox.js", "../components/Chip.js", "../components/Divider.js", "../components/DialogActions.js", "../utils/popup.js", "../mixins/PopupMixin.js", "../components/Dialog.js", "../components/ExtendedFab.js", "../components/Tooltip.js", "../mixins/TooltipTriggerMixin.js", "../components/Fab.js", "../components/FilterChip.js", "../components/Headline.js", "../components/IconButton.js", "../mixins/ResizeObserverMixin.js", "../mixins/TextFieldMixin.js", "../components/Popup.js", "../components/Input.js", "../components/Label.js", "../components/Layout.js", "../components/List.js", "../components/RadioIcon.js", "../components/ListItem.js", "../components/ListOption.js", "../dom/HTMLOptionsCollectionProxy.js", "../components/Listbox.js", "../components/Menu.js", "../components/MenuItem.js", "../mixins/ScrollListenerMixin.js", "../mixins/SemiStickyMixin.js", "../components/NavItem.js", "../components/Nav.js", "../components/NavBar.js", "../components/NavBarItem.js", "../components/NavRail.js", "../components/NavDrawer.js", "../components/NavDrawerItem.js", "../components/NavRailItem.js", "../components/Progress.js", "../components/Radio.js", "../components/TopAppBar.js", "../components/Search.js", "../components/SegmentedButton.js", "../components/SegmentedButtonGroup.js", "../components/Select.js", "../components/Shape.js", "../components/Slider.js", "../components/Snackbar.js", "../components/SwitchIcon.js", "../components/Switch.js", "../components/Tab.js", "../mixins/RTLObserverMixin.js", "../components/TabList.js", "../components/TabPanel.js", "../components/TabContent.js", "../components/TextArea.js", "../components/Title.js", "../theming/loader.js", "../theming/index.js", "../utils/color_keywords.js", "../utils/material-color/utils/math.js", "../utils/material-color/utils/color.js", "../utils/material-color/hct/ViewingConditions.js", "../utils/material-color/hct/Cam16.js", "../utils/material-color/hct/hctSolver.js", "../utils/material-color/hct/Hct.js", "../utils/material-color/blend.js", "../utils/material-color/palettes/TonalPalette.js", "../utils/material-color/palettes/CorePalette.js", "../utils/material-color/scheme/Scheme.js", "../utils/material-color/helper.js", "../utils/svg.js"],
4
+ "sourcesContent": ["/**\n * @param {typeof import('../core/CustomElement.js').default} Base\n */\nexport default function ThemableMixin(Base) {\n return Base\n .observe({\n color: 'string',\n ink: 'string',\n typeStyle: 'string',\n })\n .css`${\n ThemableMixin.PALETTES.map((palette) => [\n `:host([color=\"${palette}\"]){`,\n `--mdw-bg: var(--mdw-color__${palette});`,\n `--mdw-ink: var(--mdw-color__on-${palette});`,\n '}',\n `:host([color=\"${palette}-container\"]){`,\n `--mdw-bg: var(--mdw-color__${palette}-container);`,\n `--mdw-ink: var(--mdw-color__on-${palette}-container);`,\n '}',\n ].join('')).join('')}`\n .css`\n :host([color=\"background\"]) {\n --mdw-bg: var(--mdw-color__background);\n --mdw-ink: var(--mdw-color__on-background);\n }\n\n :host([color=\"surface-dim\"]) {\n --mdw-bg: var(--mdw-color__surface-dim);\n }\n\n :host([color=\"surface-bright\"]) {\n --mdw-bg: var(--mdw-color__surface-bright);\n }\n\n :host([color=\"surface-container-lowest\"]) {\n --mdw-bg: var(--mdw-color__surface-container-lowest);\n }\n\n :host([color=\"surface-container-low\"]) {\n --mdw-bg: var(--mdw-color__surface-container-low);\n }\n\n :host([color=\"surface-container-high\"]) {\n --mdw-bg: var(--mdw-color__surface-container-high);\n }\n \n :host([color=\"surface-container-highest\"]) {\n --mdw-bg: var(--mdw-color__surface-container-highest);\n }\n \n /* Quality-of-life */\n :host([color=\"surface-primary\"]) {\n --mdw-ink: var(--mdw-color__primary);\n }\n \n :host([color$=\"variant\"]) {\n --mdw-bg: var(--mdw-color__surface-container-highest);\n --mdw-ink: var(--mdw-color__on-surface-variant);\n }\n \n :host([color^=\"inverse\"]) {\n --mdw-bg: var(--mdw-color__inverse-surface);\n --mdw-ink: var(--mdw-color__inverse-on-surface);\n }\n \n :host([color=\"inverse-primary\"]) {\n --mdw-ink: var(--mdw-color__inverse-primary);\n }\n \n :host([color][disabled]) {\n /* background-color: rgba(var(--mdw-color__on-surface), 0.12); */\n /* color: rgba(var(--mdw-color__on-surface), 0.38); */\n }\n `\n .css`${\n ThemableMixin.PALETTES.map((palette) => [\n `:host([ink=\"${palette}\"]){`,\n `--mdw-ink: var(--mdw-color__${palette});`,\n '}',\n `:host([ink=\"on-${palette}-container\"]){`,\n `--mdw-ink: var(--mdw-color__on-${palette}-container);`,\n '}',\n ].join('')).join('')}`\n .css`\n :host([ink=\"inverse-primary\"]) {\n --mdw-ink: var(--mdw-color__inverse-primary);\n }\n\n :host([ink=\"outline\"]) {\n --mdw-ink: var(--mdw-color__outline);\n }\n \n :host([ink=\"surface-container-highest\"]) {\n --mdw-ink: var(--mdw-color__surface-container-highest);\n }\n \n :host([ink=\"on-surface-variant\"]) {\n --mdw-ink: var(--mdw-color__on-surface-variant);\n }\n \n :host([ink=\"inverse-on-surface\"]) {\n --mdw-ink: var(--mdw-color__inverse-on-surface);\n }\n \n :host([ink=\"inherit\"]) {\n --mdw-ink: inherit;\n }\n `\n .css`${\n ThemableMixin.TYPE_STYLES.map((typeStyle) => [\n `:host([type-style|=\"${typeStyle}\"]) {`,\n `--mdw-type__font: var(--mdw-typescale__${typeStyle}-large__font);`,\n `--mdw-type__letter-spacing: var(--mdw-typescale__${typeStyle}-large__letter-spacing);`,\n '}',\n `:host([type-style=\"${typeStyle}-medium\"]) {`,\n `--mdw-type__font: var(--mdw-typescale__${typeStyle}-medium__font);`,\n `--mdw-type__letter-spacing: var(--mdw-typescale__${typeStyle}-medium__letter-spacing);`,\n '}',\n `:host([type-style=\"${typeStyle}-small\"]) {`,\n `--mdw-type__font: var(--mdw-typescale__${typeStyle}-small__font);`,\n `--mdw-type__letter-spacing: var(--mdw-typescale__${typeStyle}-small__letter-spacing);`,\n '}',\n ].join(''))}`;\n}\n\nThemableMixin.PALETTES = [\n 'primary',\n 'secondary',\n 'tertiary',\n 'error',\n 'surface',\n];\n\nThemableMixin.TYPE_STYLES = [\n 'display',\n 'headline',\n 'title',\n 'label',\n 'body',\n];\n", "// Micro-optimized functions\n\nconst BLANK_TEXT = new Text();\nconst BLANK_COMMENT = new Comment();\nconst BLANK_DIV = document.createElement('div');\n\n/** @return {Text} */\nexport function createEmptyTextNode() {\n // @ts-ignore\n return BLANK_TEXT.cloneNode();\n}\n\n/** @return {HTMLDivElement} */\nexport function createEmptyDiv() {\n // @ts-ignore\n return BLANK_DIV.cloneNode();\n}\n\n/** @return {Comment} */\nexport function createEmptyComment() {\n // @ts-ignore\n return BLANK_COMMENT.cloneNode();\n}\n", "import { createEmptyComment } from './optimizations.js';\n\n/**\n * @typedef {Object} DomAdapterCreateOptions\n * @prop {Comment} anchorNode\n * @prop {(...args:any[]) => HTMLElement} [create]\n */\n\n/**\n * @typedef {Object} ItemMetadata\n * @prop {Element} element\n * @prop {any} key\n * @prop {Element|Comment} domNode\n * @prop {Function} render\n * @prop {boolean} [hidden]\n * @prop {Comment} [comment]\n */\n\nexport default class CompositionAdapter {\n /** @param {DomAdapterCreateOptions} options */\n constructor(options) {\n this.anchorNode = options.anchorNode;\n\n /** @type {ItemMetadata[]} */\n this.metadata = [];\n /**\n * Ordered-list of metadata keys\n * Chrome and FireFox optimize arrays for indexOf/includes\n * Safari is faster with WeakMap.get(), but can't use Primitive keys\n * TODO: Add Safari path\n * @type {any[]}\n */\n this.keys = [];\n\n /**\n * Chrome needs a hint to know we will need a fast path for array by keys.\n */\n this.needsArrayKeyFastPath = false;\n\n this.composition = options.composition;\n this.renderOptions = options.renderOptions;\n\n this.pendingRemoves = [];\n // Batch objects\n\n /** @type {Map<any, ItemMetadata>} */\n this.metadataCache = null;\n\n /** @type {Element[]} */\n this.queuedElements = [];\n // this.batching = false;\n /** @type {number|null} */\n this.batchStartIndex = null;\n /** @type {number|null} */\n this.batchEndIndex = null;\n }\n\n render(changes, data) {\n return this.composition.render(changes, data, this.renderOptions);\n }\n\n startBatch() {\n this.needsArrayKeyFastPath = true;\n // this.batching = true;\n }\n\n writeBatch() {\n if (!this.queuedElements.length) return;\n /** @type {Comment|Element} */\n const previousSibling = this.metadata[this.batchStartIndex - 1]?.domNode ?? this.anchorNode;\n previousSibling.after(...this.queuedElements);\n this.queuedElements.length = 0;\n }\n\n stopBatch() {\n this.writeBatch();\n\n this.needsArrayKeyFastPath = false;\n this.batchStartIndex = null;\n this.batchEndIndex = null;\n if (this.metadataCache !== null) {\n for (const { domNode } of this.metadataCache.values()) {\n domNode.remove();\n }\n this.metadataCache.clear();\n }\n }\n\n /** @param {number} index */\n removeByIndex(index) {\n const [metadata] = this.metadata.splice(index, 1);\n const { domNode, key } = metadata;\n this.keys.splice(index, 1);\n domNode.remove();\n\n // Don't release in case we may need it later\n if (this.metadataCache === null) {\n this.metadataCache = new Map([[key, metadata]]);\n } else {\n this.metadataCache.set(key, metadata);\n }\n }\n\n /**\n * Worst case scenario\n * @param {number} newIndex expectedIndex\n * @param {*} changes\n * @param {*} data\n * @param {*} key\n * @param {*} change\n * @param {boolean} [skipOnMatch]\n * JSON Merge has no way to express sort change and data change. Best\n * performance is done via invoking render on sort change and another on\n * inner change. Can't skip if mixing change types.\n */\n renderData(newIndex, changes, data, key, change, skipOnMatch) {\n if (newIndex < this.metadata.length) {\n const metadataAtIndex = this.metadata[newIndex];\n\n // There is an element in this slot\n\n // Compare if different\n const currentKey = metadataAtIndex.key;\n const sameKey = (currentKey === key);\n const isPartial = (change !== key);\n\n if (sameKey) {\n // Both reference the same key (correct spot)\n if (isPartial) {\n metadataAtIndex.render(changes, data);\n } else if (skipOnMatch) {\n // Skip overwrite. Presume no change\n // console.warn('same key, no reason to repaint', newIndex);\n } else {\n // console.warn('no skip on match', newIndex);\n metadataAtIndex.render(changes, data);\n }\n return;\n }\n\n if (this.metadataCache === null) {\n this.metadataCache = new Map();\n }\n\n // If not same key. Scan key list.\n // Can avoid checking before current index. Will always be after current\n let failedFastPath = false;\n if (this.needsArrayKeyFastPath) {\n // Invoking includes will ensure Chrome generates an internal hash map\n failedFastPath = !this.keys.includes(key);\n this.needsArrayFastPath = false;\n }\n const oldIndex = failedFastPath ? -1 : this.keys.indexOf(key, newIndex + 1);\n if (oldIndex === -1) {\n // New key\n // console.log('new key?', 'should be at', newIndex);\n // Was key removed in this batch?\n if (this.metadataCache.has(key)) {\n // console.log('inserting removed element', 'at', newIndex);\n // (Optimistic insert)\n // Key was removed and should be here instead\n // If should have been replace, will correct next step\n const previousMetadata = this.metadataCache.get(key);\n this.metadata.splice(newIndex, 0, previousMetadata);\n this.keys.splice(newIndex, 0, key);\n\n const previousSibling = this.metadata[newIndex - 1]?.domNode ?? this.anchorNode;\n previousSibling.after(previousMetadata.domNode);\n this.metadataCache.delete(key);\n return;\n }\n\n // (Optimistic replace)\n // Brand new key. Cache whatever is in current and replace\n // If should have been insert, will correct itself next step.\n // Allows multiple inserts to batch instead of one-by-one\n\n // console.log('completely new key', 'removing old. will replace', newIndex);\n this.metadataCache.set(metadataAtIndex.key, metadataAtIndex);\n\n // Continue to PUT below\n } else {\n // Key is in the wrong spot (guaranteed to be oldIndex > newIndex)\n // console.warn('Found key for', newIndex, '@', oldIndex);\n // console.warn('swapping', newIndex, '<=>', oldIndex);\n if ((newIndex - oldIndex) === -1) {\n // (Optimistic removal)\n // If element should be one step sooner, remove instead to shift up.\n // If should have been swap, will correct itself next step.\n // console.warn('Removing', newIndex, 'instead');\n this.removeByIndex(newIndex);\n return;\n }\n // Swap with other element\n // Arrays should be iterated sequentially.\n // Array can never swap before current index\n\n // Store what's later in the tree to move here\n\n const correctMetadata = this.metadata[oldIndex];\n\n // Move back <=\n this.metadata[newIndex] = correctMetadata;\n this.metadata.splice(oldIndex, 1);\n\n const { domNode: domNodeToRemove } = metadataAtIndex;\n domNodeToRemove.replaceWith(correctMetadata.domNode);\n\n if (!skipOnMatch) {\n console.warn('no skip on match on swap', newIndex);\n correctMetadata.render(changes, data);\n }\n\n // Remove posterior\n\n this.keys[newIndex] = key;\n this.keys.splice(oldIndex, 1);\n\n domNodeToRemove.remove();\n\n // Don't release in case we may need it later\n // console.debug('Caching key', key);\n this.metadataCache.set(metadataAtIndex.key, metadataAtIndex);\n\n return;\n }\n }\n\n const render = this.render(changes, data);\n const element = render.target;\n\n this.metadata[newIndex] = {\n render,\n element,\n key,\n domNode: element,\n };\n this.keys[newIndex] = key;\n\n if (this.batchEndIndex === null || this.batchEndIndex !== (newIndex - 1)) {\n this.writeBatch();\n // Start new batch\n this.batchStartIndex = newIndex;\n }\n this.batchEndIndex = newIndex;\n this.queuedElements.push(element);\n }\n\n removeEntries(startIndex = 0) {\n const { length } = this.metadata;\n for (let index = length - 1; index >= startIndex; index--) {\n this.metadata[index].domNode.remove();\n }\n this.metadata.length = startIndex;\n this.keys.length = startIndex;\n }\n\n /**\n * @param {number} [index]\n * @param {ItemMetadata} [metadata]\n * @param {any} [key]\n * @return {boolean} changed\n */\n hide(index, metadata, key) {\n if (!metadata) {\n if (index == null) {\n index = this.keys.indexOf(key);\n }\n metadata = this.metadata[index];\n if (!metadata) {\n return false;\n }\n }\n\n if (metadata.hidden) return false;\n\n let { comment, element } = metadata;\n if (!comment) {\n comment = createEmptyComment();\n metadata.comment = comment;\n }\n\n element.replaceWith(comment);\n metadata.domNode = comment;\n metadata.hidden = true;\n return true;\n }\n\n /**\n * @param {number} [index]\n * @param {ItemMetadata} [metadata]\n * @param {any} [key]\n * @return {boolean} changed\n */\n show(index, metadata, key) {\n if (!metadata) {\n if (index == null) {\n index = this.keys.indexOf(key);\n }\n metadata = this.metadata[index];\n if (!metadata) {\n return false;\n }\n }\n\n if (!metadata.hidden) return false;\n\n const { comment, element } = metadata;\n\n comment.replaceWith(element);\n metadata.domNode = element;\n metadata.hidden = false;\n return true;\n }\n}\n", "/**\n * @param {Iterable<HTMLStyleElement|CSSStyleSheet>} styles\n * @yields composed CSSStyleSheet\n * @return {Generator<CSSStyleSheet>} composed CSSStyleSheet\n */\nexport function* generateCSSStyleSheets(styles) {\n for (const style of styles) {\n if (style instanceof HTMLStyleElement) {\n const sheet = new CSSStyleSheet();\n sheet.replaceSync(style.textContent);\n yield sheet;\n } else if (style.ownerNode) {\n console.warn('Stylesheet is part of style');\n const sheet = new CSSStyleSheet();\n sheet.replaceSync([...style.cssRules].map((r) => r.cssText).join(''));\n yield sheet;\n } else {\n yield style;\n }\n }\n}\n\n/** @type {WeakMap<CSSStyleSheet, HTMLStyleElement>} */\nconst styleElementWrappers = new WeakMap();\n\n/**\n * @param {Iterable<HTMLStyleElement|CSSStyleSheet>} styles\n * @yields composed HTMLStyleElement\n * @return {Generator<HTMLStyleElement>} composed CSSStyleSheet\n */\nexport function* generateHTMLStyleElements(styles) {\n for (const style of styles) {\n if (style instanceof HTMLStyleElement) {\n yield style;\n } else if (style.ownerNode instanceof HTMLStyleElement) {\n // console.log('Cloning parent HTMLStyleElement instead');\n // @ts-ignore Skip cast\n yield style.ownerNode.cloneNode(true);\n } else if (styleElementWrappers.has(style)) {\n // @ts-ignore Skip cast\n yield styleElementWrappers.get(style).cloneNode(true);\n } else {\n console.warn('Manually constructing HTMLStyleElement', [...style.cssRules].map((r) => r.cssText).join('\\n'));\n const styleElement = document.createElement('style');\n styleElement.textContent = [...style.cssRules].map((r) => r.cssText).join('');\n styleElementWrappers.set(style, styleElement);\n\n // @ts-ignore Skip cast\n yield styleElement.cloneNode(true);\n }\n }\n}\n", "/* eslint-disable no-bitwise */\n\n/**\n * @param {any} value\n * @return {?string}\n */\nexport function attrValueFromDataValue(value) {\n switch (value) {\n case undefined:\n case null:\n case false:\n return null;\n case true:\n return '';\n default:\n return `${value}`;\n }\n}\n\n/**\n * Converts property name to attribute name\n * (Similar to DOMStringMap)\n * @param {string} name\n * @return {string}\n */\nexport function attrNameFromPropName(name) {\n const attrNameWords = name.split(/([A-Z])/);\n if (attrNameWords.length === 1) return name;\n return attrNameWords.reduce((prev, curr) => {\n if (prev == null) return curr;\n if (curr.length === 1 && curr.toUpperCase() === curr) {\n return `${prev}-${curr.toLowerCase()}`;\n }\n return prev + curr;\n });\n}\n\nconst IS_FIREFOX = globalThis?.navigator?.userAgent.includes('Firefox');\n\n/**\n * @param {Element} element\n * @return {boolean}\n */\nexport function isFocused(element) {\n if (!element) return false;\n if (IS_FIREFOX && element.constructor.formAssociated && element.hasAttribute('disabled')) {\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1818287\n console.warn('Firefox bug 1818287: Disabled form associated custom element cannot receive focus.');\n return false;\n }\n if (document.activeElement === element) return true;\n if (!element.isConnected) return false;\n if (element?.getRootNode() === document) return false; // isInLightDOM\n // console.debug('checking shadowdom', element, element.matches(':focus'));\n return element.matches(':focus');\n}\n\n/**\n * @param {HTMLElement|Element} element\n * @param {Parameters<HTMLElement['focus']>} [options]\n * @return {boolean} Focus was successful\n */\nexport function attemptFocus(element, ...options) {\n if (!element) return false;\n try {\n // @ts-expect-error Use catch if not HTMLElement\n element.focus(...options);\n } catch (e) {\n console.error(e);\n return false;\n // Ignore error.\n }\n return isFocused(element);\n}\n\n/**\n * @param {Element} element\n * @return {boolean}\n */\nexport function isRtl(element) {\n return getComputedStyle(element).direction === 'rtl';\n}\n", "/** @link https://www.rfc-editor.org/rfc/rfc7396 */\n\n/**\n * @template T1\n * @template T2\n * @param {T1} target\n * @param {T2} patch\n * @return {T1|T2|(T1 & T2)}\n */\nexport function applyMergePatch(target, patch) {\n if (target === patch) return target;\n if (target == null || patch == null || typeof patch !== 'object') return patch;\n if (typeof target !== 'object') {\n target = {};\n }\n for (const [key, value] of Object.entries(patch)) {\n if (value == null) {\n if (key in target) {\n delete target[key];\n }\n } else {\n target[key] = applyMergePatch(target[key], value);\n }\n }\n return target;\n}\n\n/**\n * Creates a JSON Merge patch based\n * Allows different strategies for arrays\n * - `reference`: Per spec, returns array as is\n * - `clone`: Clones all entries with no inspection.\n * - `object`: Convert to flattened, array-like objects. Requires\n * consumer of patch to be aware of the schema beforehand.\n * @param {object|number|string|boolean} previous\n * @param {object|number|string|boolean} current\n * @param {'clone'|'object'|'reference'} [arrayStrategy='reference']\n * @return {any} Patch\n */\nexport function buildMergePatch(previous, current, arrayStrategy = 'reference') {\n if (previous === current) return null;\n if (current == null || typeof current !== 'object') return current;\n if (previous == null || typeof previous !== 'object') {\n return structuredClone(current);\n }\n\n const patch = {};\n if (Array.isArray(current)) {\n if (arrayStrategy === 'reference') {\n return current;\n }\n // Assume previous is array\n if (arrayStrategy === 'clone') {\n return structuredClone(current);\n }\n for (const [index, value] of current.entries()) {\n if (value == null) {\n console.warn('Nullish value found at', index);\n continue;\n }\n const changes = buildMergePatch(previous[index], value, arrayStrategy);\n if (changes === null) {\n continue;\n } else {\n patch[index] = changes;\n }\n }\n // for (let i = current.length; i < previous.length; i++) {\n // patch[i] = null;\n // }\n if (current.length !== previous.length) {\n patch.length = current.length;\n }\n return patch;\n }\n\n const previousKeys = new Set(Object.keys(previous));\n for (const [key, value] of Object.entries(current)) {\n previousKeys.delete(key);\n if (value == null) {\n console.warn('Nullish value found at', key);\n continue;\n }\n const changes = buildMergePatch(previous[key], value, arrayStrategy);\n if (changes === null) {\n // console.log('keeping', key);\n } else {\n patch[key] = changes;\n }\n }\n for (const key of previousKeys) {\n patch[key] = null;\n console.log('removing', key);\n }\n\n return patch;\n}\n\n/**\n * Short-circuited JSON Merge Patch evaluation\n * @template T\n * @param {T} target\n * @param {Partial<T>} patch\n * @return {boolean}\n */\nexport function hasMergePatch(target, patch) {\n if (target === patch) return false;\n if (patch == null || typeof patch !== 'object') return true;\n if (target != null && typeof target !== 'object') {\n return true;\n }\n for (const [key, value] of Object.entries(patch)) {\n if (value == null) {\n if (key in target) {\n return true;\n }\n } else if (hasMergePatch(target[key], value)) {\n return true;\n }\n }\n return false;\n}\n", "import { attrNameFromPropName } from './dom.js';\nimport { buildMergePatch, hasMergePatch } from './jsonMergePatch.js';\n\n/** @typedef {import('./typings.js').ObserverPropertyType} ObserverPropertyType */\n\n/** @return {null} */\nconst DEFAULT_NULL_PARSER = () => null;\n\n/**\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean#boolean_coercion\n * @param {any} v\n * @return {boolean}\n */\nconst DEFAULT_BOOLEAN_PARSER = (v) => !!v;\n\n/**\n * Doesn't support `BigInt` types\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number#number_coercion\n * @param {any} v\n * @return {number}\n */\nconst DEFAULT_NUMBER_PARSER = (v) => +v;\n\n/**\n * Doesn't support `Symbol` types\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String#string_coercion\n * @param {any} v\n * @return {string}\n */\nconst DEFAULT_STRING_PARSER = (v) => `${v}`;\n\n/**\n * @template T\n * @param {T} o\n * @return {T}\n */\nconst DEFAULT_OBJECT_PARSER = (o) => o;\n\n/**\n * @template T\n * @param {T} a\n * @param {T} b\n * @return {boolean} true if equal\n */\nconst DEFAULT_OBJECT_COMPARATOR = (a, b) => !hasMergePatch(a, b);\n\n/**\n * Always invoke change on set\n * @template T\n * @param {T} a\n * @param {T} b\n * @return {boolean} true if equal\n */\nconst DEFAULT_ARRAY_COMPARATOR = (a, b) => false;\n\n/**\n * @template T\n * @param {T} a\n * @param {T} b\n * @return {boolean} true if equal\n */\nconst DEFAULT_OBJECT_DIFF = (a, b) => buildMergePatch(a, b, 'reference');\n\n/**\n * @param {ObserverPropertyType} type\n * @return {any}\n */\nfunction emptyFromType(type) {\n switch (type) {\n case 'boolean':\n return false;\n case 'integer':\n case 'float':\n return 0;\n case 'map':\n return new Map();\n case 'set':\n return new Set();\n case 'array':\n return [];\n case 'object':\n return null;\n default:\n case 'string':\n return '';\n }\n}\n\n/**\n * @template {Object} T\n * @param {T} proxyTarget\n * @param {Set<string>} set\n * @param {Set<string>} deepSet\n * @param {string} [prefix]\n * @return {T}\n */\nfunction buildProxy(proxyTarget, set, deepSet, prefix) {\n proxyTarget ??= {};\n return new Proxy(proxyTarget, {\n get(target, p) {\n const value = target[p];\n if (typeof p !== 'symbol') {\n const arg = prefix ? `${prefix}.${p}` : p;\n if (prefix) {\n deepSet.add(arg);\n } else {\n set.add(arg);\n }\n if (typeof value === 'object' && value != null) {\n console.debug('tried to arg poke object get', p, value);\n return buildProxy(value, set, deepSet, arg);\n }\n }\n return value;\n },\n has(target, p) {\n const value = Reflect.has(target, p);\n if (typeof p !== 'symbol') {\n const arg = prefix ? `${prefix}.p` : p;\n if (prefix) {\n deepSet.add(arg);\n } else {\n set.add(arg);\n }\n }\n return value;\n },\n });\n}\n\n/**\n * @param {ObserverPropertyType} type\n * @return {any}\n */\nfunction defaultParserFromType(type) {\n switch (type) {\n case 'boolean':\n return DEFAULT_BOOLEAN_PARSER;\n case 'integer':\n // Calls ToNumber(x)\n return Math.round;\n case 'float':\n return DEFAULT_NUMBER_PARSER;\n case 'map':\n return Map;\n case 'set':\n return Set;\n case 'object':\n return DEFAULT_OBJECT_PARSER;\n case 'array':\n return DEFAULT_OBJECT_PARSER;\n default:\n case 'string':\n return DEFAULT_STRING_PARSER;\n }\n}\n\n/**\n * @template {string} K\n * @template {ObserverPropertyType} [T1=any]\n * @template {any} [T2=import('./typings.js').ParsedObserverPropertyType<T1>]\n * @param {K} name\n * @param {T1|import('./typings.js').ObserverOptions<T1,T2>} [typeOrOptions='string']\n * @param {any} object\n * @return {import('./typings.js').ObserverConfiguration<T1,T2,K> & import('./typings.js').ObserverOptions<T1,T2>}\n */\nexport function parseObserverOptions(name, typeOrOptions, object) {\n /** @type {Partial<import('./typings.js').ObserverOptions<T1,T2>>} */\n const options = {\n ...((typeof typeOrOptions === 'string') ? { type: typeOrOptions } : typeOrOptions),\n };\n\n let { enumerable, attr, reflect } = options;\n const { type, empty, changedCallback } = options;\n\n /** @type {ObserverPropertyType} */\n let parsedType = type;\n if (parsedType == null) {\n // Use .value or .get() to parse type\n const value = options.value ?? empty ?? options.get?.call(object ?? {}, object ?? {});\n if (value == null) {\n parsedType = 'string';\n } else {\n const parsed = typeof value;\n parsedType = (parsed === 'number')\n ? (Number.isInteger(value) ? 'integer' : 'number')\n : parsed;\n }\n }\n\n enumerable ??= name[0] !== '_';\n reflect ??= enumerable ? parsedType !== 'object' : (attr ? 'write' : false);\n attr ??= (reflect ? attrNameFromPropName(name) : null);\n\n // if defined ? value\n // else if boolean ? false\n // else if onNullish ? false\n // else if empty == null\n const parser = options.parser ?? defaultParserFromType(parsedType);\n let nullParser = options.nullParser;\n let parsedEmpty = empty ?? null;\n if (!nullParser) {\n const nullable = options.nullable ?? (\n parsedType === 'boolean'\n ? false\n : (empty == null));\n if (nullable) {\n nullParser = DEFAULT_NULL_PARSER;\n } else {\n parsedEmpty ??= emptyFromType(parsedType);\n nullParser = parsedEmpty === null ? () => emptyFromType(parsedType) : () => parsedEmpty;\n }\n }\n\n let isFn = options.is;\n if (!isFn) {\n isFn = parsedType === 'object'\n ? DEFAULT_OBJECT_COMPARATOR\n : ((parsedType === 'array') ? DEFAULT_ARRAY_COMPARATOR : Object.is);\n }\n\n const diff = 'diff' in options\n ? options.diff\n : ((parsedType === 'object') ? DEFAULT_OBJECT_DIFF : null);\n\n return {\n ...options,\n type: parsedType,\n is: isFn,\n diff,\n attr,\n reflect,\n readonly: options.readonly ?? false,\n enumerable,\n value: options.value ?? parsedEmpty,\n parser,\n nullParser,\n key: name,\n changedCallback,\n watchers: options.watchers ?? [],\n values: options.values ?? new WeakMap(),\n computedValues: options.computedValues ?? new WeakMap(),\n attributeChangedCallback: options.attributeChangedCallback,\n needsSelfInvalidation: options.needsSelfInvalidation ?? new WeakSet(),\n };\n}\n\nconst INIT_SYMBOL = Symbol('PROP_INIT');\n\n/** @type {Partial<import('./typings.js').ObserverConfiguration<?,?,?>>} */\nconst DEFAULT_OBSERVER_CONFIGURATION = {\n nullParser: DEFAULT_NULL_PARSER,\n is: Object.is,\n INIT_SYMBOL,\n};\n\n/**\n * @this {import('./typings.js').ObserverConfiguration<?,?,?>}\n * @param {*} value\n */\nexport function parsePropertyValue(value) {\n let newValue = value;\n newValue = value == null\n ? this.nullParser.call(this, value)\n : this.parser.call(this, newValue);\n}\n\n/**\n * @param {(data: Partial<any>) => any} fn\n * @param {...any} args\n * @this {any}\n * @return {{\n * props: {\n * this: string[],\n * args: string[][],\n * },\n * deepPropStrings: {\n * this: string[],\n * args: string[][],\n * },\n * deepProps: {\n * this: string[][],\n * args: string[][][],\n * },\n * defaultValue: any,\n * reusable: boolean,\n * }}\n */\nexport function observeFunction(fn, ...args) {\n /** @type {Set<string>} */\n const thisPoked = new Set();\n /** @type {Set<string>} */\n const thisPokedDeep = new Set();\n\n const argWatchers = args.map((arg) => {\n const poked = new Set();\n const pokedDeep = new Set();\n const proxy = buildProxy(arg, poked, pokedDeep);\n return { poked, pokedDeep, proxy };\n });\n\n const thisProxy = buildProxy(this ?? {}, thisPoked, thisPokedDeep);\n const defaultValue = fn.apply(thisProxy, argWatchers.map((watcher) => watcher.proxy));\n /* Arrow functions can reused if they don't poke `this` */\n const reusable = fn.name ? true : !thisPoked.size;\n\n return {\n props: {\n this: [...thisPoked],\n args: argWatchers.map((watcher) => [...watcher.poked]),\n },\n deepPropStrings: {\n this: [...thisPokedDeep],\n args: argWatchers.map((watcher) => [...watcher.pokedDeep]),\n },\n deepProps: {\n this: [...thisPokedDeep].map((deepPropString) => deepPropString.split('.')),\n args: argWatchers.map((watcher) => [...watcher.pokedDeep].map((deepPropString) => deepPropString.split('.'))),\n },\n defaultValue,\n reusable,\n };\n}\n\n/**\n * @template {ObserverPropertyType} T1\n * @template {any} T2\n * @template {string} K\n * @template [C=any]\n * @param {C} object\n * @param {K} key\n * @param {import('./typings.js').ObserverOptions<T1, T2, C>} options\n * @return {import('./typings.js').ObserverConfiguration<T1,T2,K,C>}\n */\nexport function defineObservableProperty(object, key, options) {\n /** @type {import('./typings.js').ObserverConfiguration<T1,T2,K,C>} */\n const config = {\n ...DEFAULT_OBSERVER_CONFIGURATION,\n ...parseObserverOptions(key, options, object),\n changedCallback: options.changedCallback,\n };\n\n /**\n * @param {T2} oldValue\n * @param {T2} value\n * @return {boolean} changed\n */\n function detectChange(oldValue, value) {\n if (config.get) {\n // TODO: Custom getter vs parser\n }\n let newValue = value;\n newValue = (value == null)\n ? config.nullParser.call(this, value)\n : config.parser.call(this, newValue);\n\n let changes = newValue;\n if (oldValue == null) {\n if (newValue == null) return false; // Both nullish\n } else if (newValue != null) {\n // if (oldValue === newValue) return false;\n if (config.diff) {\n changes = config.diff.call(this, oldValue, newValue);\n if (changes == null) return false;\n } else if (config.is.call(this, oldValue, newValue)) return false;\n }\n\n config.values.set(this, newValue);\n // console.log(key, 'value.set', newValue);\n config.propChangedCallback?.call(this, key, oldValue, newValue, changes);\n config.changedCallback?.call(this, oldValue, newValue, changes);\n return true;\n }\n /**\n * @this {C}\n * @return {T2}\n */\n function internalGet() {\n return config.values.has(this) ? config.values.get(this) : config.value;\n }\n\n /**\n * @this {C}\n * @param {T2} value\n * @return {void}\n */\n function internalSet(value) {\n const oldValue = this[key];\n // console.log(key, 'internalSet', oldValue, '=>', value);\n detectChange.call(this, oldValue, value);\n }\n\n /** @return {void} */\n function onInvalidate() {\n // Current value is now invalidated. Recompute and check if changed\n const oldValue = config.computedValues.get(this);\n const newValue = this[key];\n // console.debug('observe: onInvalidate called for', key, oldValue, '=>', newValue, this);\n config.needsSelfInvalidation.delete(this);\n detectChange.call(this, oldValue, newValue);\n }\n\n if (config.get) {\n // Custom `get` uses computed values.\n // Invalidate computed value when dependent `prop` changes\n const observeResult = observeFunction(config.get.bind(object), object, internalGet.bind(object));\n const uniqueProps = new Set([\n ...observeResult.props.this,\n ...observeResult.props.args[0],\n ]);\n for (const prop of uniqueProps) {\n // @ts-ignore keyof C\n config.watchers.push([prop, onInvalidate]);\n }\n\n // TODO: May be able to cache value if props are present\n }\n /** @type {Partial<PropertyDescriptor>} */\n const descriptor = {\n enumerable: config.enumerable,\n configurable: true,\n /**\n * @this {C}\n * @return {T2}\n */\n get() {\n if (config.get) {\n const newValue = config.get.call(this, this, internalGet.bind(this));\n // Store computed value internally. Used by onInvalidate to get previous value\n config.computedValues.set(this, newValue);\n return newValue;\n }\n return internalGet.call(this);\n },\n /**\n * @this {C}\n * @param {T2} value\n * @return {void}\n */\n set(value) {\n if (value === INIT_SYMBOL) {\n // console.log(key, 'returning due to INIT');\n return;\n }\n if (config.set) {\n config.needsSelfInvalidation.add(this);\n const oldValue = this[key];\n config.set.call(this, value, internalSet.bind(this));\n const newValue = this[key];\n if (!config.needsSelfInvalidation.has(this)) return;\n config.needsSelfInvalidation.delete(this);\n detectChange.call(this, oldValue, newValue);\n } else {\n internalSet.call(this, value);\n }\n },\n };\n\n Object.defineProperty(object, key, descriptor);\n\n return config;\n}\n", "/** @type {Set<string>} */\nconst generatedUIDs = new Set();\n\n/**\n * @param {string} [prefix='x'] Prefix all UIDs by string to apply a name or ensure starts with [A-Z] character\n * @param {number} [n] Maximum number of variations needed. Calculated as 32^n.\n @return {string} */\nexport function generateUID(prefix = 'mdw_', n = 4) {\n let id;\n while (generatedUIDs.has(id = Math.random().toString(36).slice(2, n + 2)));\n generatedUIDs.add(id);\n return `${prefix}${id}`;\n}\n", "import { generateUID } from './uid.js';\n\n/**\n * Property are bound to an ID+Node\n * Values are either getter or via an function\n * @template {any} T\n * @typedef {Object} InlineFunctionEntry\n * @prop {(data:T) => any} fn\n * @prop {string[]} [props]\n * @prop {string[][]} [deepProps]\n * @prop {string[]} [injectionProps]\n * @prop {string[][]} [injectionDeepProps]\n * @prop {T} [defaultValue]\n */\n\n/** @type {Document} */\nlet _inactiveDocument;\n\n/** @type {boolean} */\nlet _cssStyleSheetConstructable;\n\n/**\n * @param {string} [fromString]\n * @return {DocumentFragment}\n */\nexport function generateFragment(fromString) {\n _inactiveDocument ??= document.implementation.createHTMLDocument();\n if (fromString == null) {\n return _inactiveDocument.createDocumentFragment();\n }\n return _inactiveDocument.createRange().createContextualFragment(fromString);\n}\n\n/** @type {Map<string, InlineFunctionEntry<?>>} */\nexport const inlineFunctions = new Map();\n\n/**\n * @template T\n * @typedef {Object} RenderOptions\n * @prop {Object} context\n * @prop {ParentNode} root\n * @prop {Object<string, HTMLElement>} refs\n */\n\n/**\n * @param {(data: Partial<any>) => any} fn\n * @return {string}\n */\nexport function addInlineFunction(fn) {\n const internalName = `#${generateUID()}`;\n inlineFunctions.set(internalName, { fn });\n return `{${internalName}}`;\n}\n\n/** @type {Map<string, CSSStyleSheet>} */\nconst cssStyleSheetsCache = new Map();\n\n/** @type {Map<string, HTMLStyleElement>} */\nconst styleElementCache = new Map();\n\n/**\n * @param {TemplateStringsArray} array\n * @param {...any} substitutions\n * @return {HTMLStyleElement|CSSStyleSheet}\n */\nexport function css(array, ...substitutions) {\n const content = String.raw({ raw: array }, ...substitutions);\n\n if (_cssStyleSheetConstructable == null) {\n try {\n const sheet = new CSSStyleSheet();\n _cssStyleSheetConstructable = true;\n sheet.replaceSync(content);\n cssStyleSheetsCache.set(content, sheet);\n return sheet;\n } catch {\n _cssStyleSheetConstructable = false;\n }\n }\n\n if (_cssStyleSheetConstructable) {\n if (cssStyleSheetsCache.has(content)) {\n return cssStyleSheetsCache.get(content);\n }\n const sheet = new CSSStyleSheet();\n _cssStyleSheetConstructable = true;\n sheet.replaceSync(content);\n cssStyleSheetsCache.set(content, sheet);\n return sheet;\n }\n\n let style;\n if (styleElementCache.has(content)) {\n style = styleElementCache.get(content);\n } else {\n _inactiveDocument ??= document.implementation.createHTMLDocument();\n style = _inactiveDocument.createElement('style');\n style.textContent = content;\n styleElementCache.set(content, style);\n }\n return /** @type {HTMLStyleElement} */ (style.cloneNode(true));\n}\n\n/** @type {Map<string, DocumentFragment>} */\nconst fragmentCache = new Map();\n/**\n * @template T1\n * @template T2\n * @param {TemplateStringsArray} strings\n * @param {...(string|DocumentFragment|Element|((this:T1, data:T2) => any))} substitutions\n * @return {DocumentFragment}\n */\nexport function html(strings, ...substitutions) {\n /** @type {Map<string, DocumentFragment|Element>} */\n let tempSlots;\n const replacements = substitutions.map((sub) => {\n switch (typeof sub) {\n case 'string': return sub;\n case 'function': return addInlineFunction(sub);\n case 'object': {\n if (sub == null) {\n console.warn(sub, 'is null', strings);\n return '';\n }\n // Assume Element\n const tempId = generateUID();\n tempSlots ??= new Map();\n tempSlots.set(tempId, sub);\n return `<div id=\"${tempId}\"></div>`;\n }\n default:\n throw new Error(`Unexpected substitution: ${sub}`);\n }\n });\n const compiledString = String.raw({ raw: strings }, ...replacements);\n\n if (tempSlots) {\n const fragment = generateFragment(compiledString);\n for (const [id, element] of tempSlots) {\n const slot = fragment.getElementById(id);\n slot.replaceWith(element);\n }\n return fragment;\n }\n\n let fragment = fragmentCache.get(compiledString);\n if (!fragment) {\n fragment = generateFragment(compiledString);\n fragmentCache.set(compiledString, fragment);\n }\n\n return /** @type {DocumentFragment} */ (fragment.cloneNode(true));\n}\n\n", "/* eslint-disable sort-class-members/sort-class-members */\n\nimport CompositionAdapter from './CompositionAdapter.js';\nimport { generateCSSStyleSheets, generateHTMLStyleElements } from './css.js';\nimport { observeFunction } from './observe.js';\nimport { createEmptyComment, createEmptyTextNode } from './optimizations.js';\nimport { generateFragment, inlineFunctions } from './template.js';\nimport { generateUID } from './uid.js';\n\n/**\n * @template T\n * @typedef {Composition<?>|HTMLStyleElement|CSSStyleSheet|DocumentFragment|string} CompositionPart\n */\n\n/**\n * @template {any} T\n * @callback Compositor\n * @param {...(CompositionPart<T>)} parts source for interpolation (not mutated)\n * @return {Composition<T>}\n */\n\n/**\n * @template T\n * @typedef {Object} RenderOptions\n * @prop {T} [store] what\n * @prop {DocumentFragment|ShadowRoot|HTMLElement|Element} [target] where\n * @prop {any} [context] `this` on callbacks/events\n * @prop {any} [injections]\n */\n\n/**\n * @template {any} T\n * @typedef {Object} NodeBindEntry\n * @prop {string} [key]\n * @prop {number} [index]\n * @prop {string} tag\n * @prop {string|number} subnode Index of childNode or attrName\n * @prop {string[]} props\n * @prop {string[][]} deepProps\n * @prop {boolean} [negate]\n * @prop {boolean} [doubleNegate]\n * @prop {Function} [expression]\n * @prop {(options: RenderOptions<?>, element: Element, changes:any, data:any) => any} [render] custom render function\n * @prop {import('./typings.js').CompositionEventListener<T>[]} [listeners]\n * @prop {Composition<any>} [composition] // Sub composition templating (eg: array)\n * @prop {T} defaultValue\n */\n\n/** @typedef {any[]} RenderState */\n\n/**\n * @typedef RenderGraphSearch\n * @prop {(state:InitializationState, changes:any, data:any) => any} invocation\n * @prop {number} cacheIndex\n * @prop {number} ranFlagIndex\n * @prop {number} dirtyIndex\n * @prop {string | Function | string[]} query\n * @prop {Function} [expression]\n * @prop {string} prop\n * @prop {string[]} deepProp\n * @prop {string[]} propsUsed\n * @prop {string[][]} deepPropsUsed\n * @prop {any} defaultValue\n * @prop {RenderGraphSearch} [subSearch]\n */\n\n/**\n * @typedef RenderGraphAction\n * @prop {(state:InitializationState, value:any, changes: any, data:any) => any} invocation\n * @prop {number} [commentIndex]\n * @prop {number} [nodeIndex]\n * @prop {number} [cacheIndex]\n * @prop {string} [attrName]\n * @prop {any} [defaultValue]\n * @prop {RenderGraphSearch} search\n */\n\n/**\n * @type {RenderGraphAction['invocation']}\n * @this {RenderGraphAction}\n */\nfunction writeDOMAttribute(state, value) {\n const { nodeIndex, attrName } = this;\n /** @type {Element} */\n const element = state.nodes[nodeIndex];\n switch (value) {\n case undefined:\n case null:\n case false:\n element.removeAttribute(attrName);\n return false;\n case true:\n element.setAttribute(attrName, '');\n return '';\n default:\n element.setAttribute(attrName, value);\n return value;\n }\n}\n\n/**\n * @type {RenderGraphAction['invocation']}\n * @this {RenderGraphAction}\n */\nfunction writeDOMText(state, value) {\n // @ts-ignore Skip cast\n state.nodes[this.nodeIndex].data = value;\n}\n\n/**\n * @type {RenderGraphAction['invocation']}\n * @this {RenderGraphAction}\n */\nfunction writeDOMElementAttachedState(state, value) {\n const { commentIndex, nodeIndex } = this;\n let comment = state.comments[commentIndex];\n if (!comment) {\n comment = createEmptyComment();\n state.comments[commentIndex] = comment;\n }\n const element = state.nodes[nodeIndex];\n const show = value != null && value !== false;\n if (show) {\n comment.replaceWith(element);\n } else {\n element.replaceWith(comment);\n }\n return show;\n}\n\n/**\n * @type {RenderGraphAction['invocation']}\n * @this {RenderGraphAction}\n */\nfunction writeDOMHideElementOnInit(state) {\n const { commentIndex, nodeIndex } = this;\n\n const comment = createEmptyComment();\n state.comments[commentIndex] = comment;\n\n state.nodes[nodeIndex].replaceWith(comment);\n}\n\n/**\n * @param {RenderGraphSearch} search\n * @param {Parameters<RenderGraphSearch['invocation']>} args\n */\nfunction executeSearch(search, ...args) {\n const [state] = args;\n const cachedValue = state.caches[search.cacheIndex];\n if (state.ranFlags[search.ranFlagIndex]) {\n // Return last result\n return {\n value: cachedValue,\n dirty: state.dirtyFlags[search.dirtyIndex],\n };\n }\n state.ranFlags[search.ranFlagIndex] = true;\n let result;\n if (search.subSearch) {\n const subResult = executeSearch(search.subSearch, ...args);\n // Use last cached value (if any)\n if (!subResult.dirty && cachedValue !== undefined) {\n state.dirtyFlags[search.dirtyIndex] = false;\n return { value: cachedValue, dirty: false };\n }\n // Pass from subquery\n result = search.invocation(subResult.value);\n } else {\n result = search.invocation(...args);\n }\n if ((result === undefined) || (cachedValue === result)) {\n // Returnf rom cache\n return { value: result, dirty: false };\n }\n\n // Overwrite cache and flag as dirty\n state.caches[search.cacheIndex] = result;\n state.dirtyFlags[search.dirtyIndex] = true;\n return { value: result, dirty: true };\n}\n\n/**\n * @type {RenderGraphSearch['invocation']}\n * @this {RenderGraphSearch}\n */\nfunction searchWithExpression(state, changes, data) {\n return this.expression.call(\n state.options.context,\n state.options.store ?? data,\n state.options.injections,\n );\n}\n\n/**\n * @type {RenderGraphSearch['invocation']}\n * @this {RenderGraphSearch}\n */\nfunction searchWithProp(state, changes, data) {\n return changes[this.prop];\n}\n\n/**\n * @type {RenderGraphSearch['invocation']}\n * @this {RenderGraphSearch}\n */\nfunction searchWithDeepProp(state, changes, data) {\n let scope = changes;\n for (const prop of this.deepProp) {\n if (scope === null) return null;\n if (prop in scope === false) return undefined;\n scope = scope[prop];\n }\n return scope;\n}\n\n/**\n * @typedef InterpolateOptions\n * @prop {Object} [defaults] Default values to use for interpolation\n * @prop {{iterable:string} & Record<string,any>} [injections] Context-specific injected properties. (Experimental)\n */\n\n/**\n * @typedef InitializationState\n * @prop {Element} lastElement\n * @prop {boolean} isShadowRoot\n * @prop {ChildNode} lastChildNode\n * @prop {(Element|Text)[]} nodes\n * @prop {any[]} caches\n * @prop {Comment[]} comments\n * @prop {boolean[]} ranFlags\n * @prop {boolean[]} dirtyFlags\n * @prop {Element[]} refs\n * @prop {number} lastChildNodeIndex\n * @prop {DocumentFragment} instanceFragment\n * @prop {RenderOptions<?>} options\n */\n\n/** Splits: `{template}text{template}` as `['', 'template', 'text', 'template', '']` */\nconst STRING_INTERPOLATION_REGEX = /{([^}]*)}/g;\n\n/**\n * Returns event listener bound to shadow root host.\n * Use this function to avoid generating extra closures\n *\n * @this {HTMLElement}\n * @param {Function} fn\n */\nfunction buildShadowRootChildListener(fn) {\n /** @param {Event & {currentTarget:{getRootNode: () => ShadowRoot}}} event */\n return function onShadowRootChildEvent(event) {\n const host = event.currentTarget.getRootNode().host;\n fn.call(host, event);\n };\n}\n\n/**\n * @example\n * propFromObject('foo', {foo:'bar'}) == ['foo', 'bar'];\n * @param {string} prop\n * @param {any} source\n * @return {any}\n */\nfunction propFromObject(prop, source) {\n if (source) {\n return source[prop];\n }\n return undefined;\n}\n\n/**\n * @example\n * deepPropFromObject(\n * ['address', 'home, 'houseNumber'],\n * {\n * address: {\n * home: {\n * houseNumber:35,\n * },\n * }\n * }\n * ) == [houseNumber, 35]\n * @param {string[]} nameArray\n * @param {any} source\n * @return {any}\n */\nfunction deepPropFromObject(nameArray, source) {\n if (!source) return undefined;\n let scope = source;\n let prop;\n for (prop of nameArray) {\n if (typeof scope === 'object') {\n if (scope === null) return null;\n if (!(prop in scope)) return undefined;\n scope = scope[prop];\n } else {\n return scope[prop];\n }\n }\n return scope;\n}\n\n/**\n * @param {string} prop\n * @param {any} source\n * @return {any}\n */\nfunction valueFromPropName(prop, source) {\n let value = source;\n for (const child of prop.split('.')) {\n if (!child) return null;\n // @ts-ignore Skip cast\n value = value[child];\n if (value == null) return null;\n }\n if (value === source) return null;\n return value;\n}\n\n/** @template T */\nexport default class Composition {\n #interpolationState = {\n nodeIndex: -1,\n ranFlagIndex: 0,\n cacheIndex: 0,\n dirtyIndex: 0,\n commentIndex: 0,\n /** @type {this['nodesToBind'][0]} */\n nodeEntry: null,\n };\n\n // eslint-disable-next-line symbol-description\n static shadowRootTag = Symbol();\n\n /** @type {{tag:string, textNodes: number[]}[]} */\n nodesToBind = [];\n\n /** @type {string[]} */\n props = [];\n\n /** @type {RenderGraphSearch[]} */\n searches = [];\n\n /** @type {any[]} */\n initCache = [];\n\n /**\n * Index of searches by query (dotted notation for deep props)\n *\n * @type {Map<Function|string, RenderGraphSearch>}\n */\n searchByQuery = new Map();\n\n /**\n * Index of searches by query (dotted notation for deep props)\n *\n * @type {Map<string, RenderGraphAction[]>}\n */\n actionsByPropsUsed = new Map();\n\n /** @type {RenderGraphAction[]} */\n actions = [];\n\n /** @type {RenderGraphAction[]} */\n postInitActions = [];\n\n /** @type {Set<string>} */\n tagsWithBindings = new Set();\n\n /**\n * Array of element tags\n *\n * @type {string[]}\n */\n tags = [];\n\n /**\n * Array of property bindings sorted by tag/subnode\n *\n * @type {Set<string>}\n */\n watchedProps = new Set();\n\n /**\n * Data of arrays used in templates\n * Usage of a [mdw-for] will create an ArrayLike expectation based on key\n * Only store metadata, not actual data. Currently only needs length.\n * TBD if more is needed later\n * Referenced by property key (string)\n *\n * @type {CompositionAdapter}\n */\n adapter;\n\n /**\n * Collection of events to bind.\n * Indexed by ID\n *\n * @type {Map<string|symbol, import('./typings.js').CompositionEventListener<any>[]>}\n */\n events = new Map();\n\n /**\n * Snapshot of composition at initial state.\n * This fragment can be cloned for first rendering, instead of calling\n * of using `render()` to construct the initial DOM tree.\n *\n * @type {DocumentFragment}\n */\n cloneable;\n\n /** @type {(HTMLStyleElement|CSSStyleSheet)[]} */\n styles = [];\n\n /** @type {CSSStyleSheet[]} */\n adoptedStyleSheets = [];\n\n /** @type {DocumentFragment} */\n stylesFragment;\n\n /**\n * List of IDs used by template elements\n * May be needed to be removed when adding to non-DocumentFragment\n *\n * @type {string[]}\n */\n allIds = [];\n\n /**\n * Collection of IDs used for referencing elements\n * Not meant for live DOM. Removed before attaching to document\n */\n temporaryIds = new Set();\n\n /** Flag set when template and styles have been interpolated */\n interpolated = false;\n\n /**\n * @param {(CompositionPart<T>)[]} parts\n */\n constructor(...parts) {\n /**\n * Template used to build interpolation and cloneable\n */\n this.template = generateFragment();\n this.append(...parts);\n }\n\n * [Symbol.iterator]() {\n for (const part of this.styles) {\n yield part;\n }\n yield this.template;\n }\n\n /**\n * @param {CompositionPart<T>[]} parts\n */\n append(...parts) {\n for (const part of parts) {\n if (typeof part === 'string') {\n this.append(generateFragment(part.trim()));\n } else if (part instanceof Composition) {\n this.append(...part);\n } else if (part instanceof DocumentFragment) {\n this.template.append(part);\n } else if (part instanceof CSSStyleSheet || part instanceof HTMLStyleElement) {\n this.styles.push(part);\n }\n }\n // Allow chaining\n return this;\n }\n\n /** @param {import('./typings.js').CompositionEventListener<T>} listener */\n addCompositionEventListener(listener) {\n const key = listener.tag ?? '';\n if (this.events.has(key)) {\n this.events.get(key).push(listener);\n } else {\n this.events.set(key, [listener]);\n }\n return this;\n }\n\n /**\n * @param {string|symbol} tag\n * @param {EventTarget} target\n * @param {any} [context]\n * @return {void}\n */\n #bindCompositionEventListeners(tag, target, context) {\n if (!this.events.has(tag)) return;\n for (const event of this.events.get(tag)) {\n let listener;\n if (event.handleEvent) {\n listener = event.handleEvent;\n } else if (event.deepProp.length) {\n listener = deepPropFromObject(event.deepProp, this.interpolateOptions.defaults);\n } else {\n listener = propFromObject(event.prop, this.interpolateOptions.defaults);\n }\n target.addEventListener(event.type, context ? listener.bind(context) : listener, event);\n }\n }\n\n /**\n * TODO: Add types and clean up closure leak\n * Updates component nodes based on data.\n * Expects data in JSON Merge Patch format\n *\n * @see https://www.rfc-editor.org/rfc/rfc7386\n * @template {Object} T\n * @param {Partial<T>} changes what specifically\n * @param {T} [data]\n * @param {RenderOptions<T>} [options]\n * @return {Function & {target:Element}} anchor\n */\n render(changes, data, options = {}) {\n // console.log('render', changes, options);\n if (!this.interpolated) {\n this.interpolate({ defaults: data ?? changes, injections: options?.injections });\n }\n\n const instanceFragment = /** @type {DocumentFragment} */ (this.cloneable.cloneNode(true));\n\n const target = options.target ?? instanceFragment.firstElementChild;\n\n const isShadowRoot = target instanceof ShadowRoot;\n\n /** @type {InitializationState} */\n const initState = {\n instanceFragment,\n lastChildNode: null,\n lastChildNodeIndex: 0,\n lastElement: null,\n isShadowRoot,\n ranFlags: [],\n comments: [],\n nodes: [],\n caches: this.initCache.slice(),\n dirtyFlags: [],\n refs: [],\n options,\n };\n\n const nodes = initState.nodes;\n for (const { tag, textNodes } of this.nodesToBind) {\n const element = instanceFragment.getElementById(tag);\n initState.refs.push(element);\n nodes.push(element);\n this.#bindCompositionEventListeners(tag, element, options.context);\n\n if (!textNodes.length) continue;\n\n let textNode = element.firstChild;\n let currentIndex = 0;\n for (const index of textNodes) {\n while (index !== currentIndex) {\n textNode = textNode.nextSibling;\n currentIndex++;\n }\n nodes.push(textNode);\n }\n }\n this.#bindCompositionEventListeners('', options.context);\n this.#bindCompositionEventListeners(Composition.shadowRootTag, options.context.shadowRoot, options.context);\n\n for (const action of this.postInitActions) {\n action.invocation(initState);\n }\n\n const draw = (changes, data) => {\n let ranSearch = false;\n for (const prop of this.props) {\n if (!this.actionsByPropsUsed.has(prop)) continue;\n if (!(prop in changes)) continue;\n const actions = this.actionsByPropsUsed.get(prop);\n for (const action of actions) {\n ranSearch = true;\n const result = executeSearch(action.search, initState, changes, data);\n if (result.dirty) {\n // console.log('dirty, updating from batch', initState.nodes[action.nodeIndex], 'with', result.value);\n action.invocation(initState, result.value, changes, data);\n }\n }\n }\n if (!ranSearch) return;\n initState.ranFlags.fill(false);\n initState.dirtyFlags.fill(false);\n };\n\n if (isShadowRoot) {\n options.context ??= target.host;\n if ('adoptedStyleSheets' in target) {\n if (this.adoptedStyleSheets.length) {\n target.adoptedStyleSheets = [\n ...target.adoptedStyleSheets,\n ...this.adoptedStyleSheets,\n ];\n }\n } else if (this.stylesFragment.hasChildNodes()) {\n instanceFragment.prepend(this.stylesFragment.cloneNode(true));\n }\n } else {\n options.context ??= target;\n }\n\n if (changes !== this.interpolateOptions.defaults) {\n // Not default, overwrite nodes\n draw(changes, data);\n }\n\n if (isShadowRoot) {\n target.append(instanceFragment);\n }\n\n draw.target = target;\n draw.byProp = (prop, value, data) => {\n if (!this.actionsByPropsUsed.has(prop)) return;\n let ranSearch = false;\n\n // Update search\n if (this.searchByQuery.has(prop)) {\n ranSearch = true;\n const search = this.searchByQuery.get(prop);\n const cachedValue = initState.caches[search.cacheIndex];\n if (cachedValue === value) {\n return;\n }\n initState.ranFlags[search.ranFlagIndex] = true;\n initState.caches[search.cacheIndex] = value;\n initState.dirtyFlags[search.dirtyIndex] = true;\n }\n\n let changes;\n const actions = this.actionsByPropsUsed.get(prop);\n for (const action of actions) {\n if (action.search.query === prop) {\n action.invocation(initState, value);\n } else {\n changes ??= { [prop]: value };\n data ??= changes;\n ranSearch = true;\n const result = executeSearch(action.search, initState, changes, data);\n if (result.dirty) {\n // console.debug('dirty, updating by prop', prop, initState.nodes[action.nodeIndex], 'with', result.value);\n action.invocation(initState, result.value, changes, data);\n }\n }\n }\n\n if (!ranSearch) return;\n initState.ranFlags.fill(false);\n initState.dirtyFlags.fill(false);\n };\n draw.state = initState;\n return draw;\n }\n\n /**\n * @param {Attr|Text} node\n * @param {Element} element\n * @param {InterpolateOptions} [options]\n * @param {string} [parsedValue]\n * @return {true|undefined} remove node\n */\n #interpolateNode(node, element, options, parsedValue) {\n const { nodeValue, nodeName, nodeType } = node;\n\n /** @type {Attr} */\n let attr;\n /** @type {Text} */\n let text;\n if (nodeType === Node.ATTRIBUTE_NODE) {\n attr = /** @type {Attr} */ (node);\n } else {\n text = /** @type {Text} */ (node);\n }\n\n // Get template strings(s) in node if not passed\n if (parsedValue == null) {\n if (!nodeValue) return;\n const trimmed = nodeValue.trim();\n if (!trimmed) return;\n if (attr) {\n if (trimmed[0] !== '{') return;\n const { length } = trimmed;\n if (trimmed[length - 1] !== '}') return;\n parsedValue = trimmed.slice(1, -1);\n // TODO: Support segmented attribute values\n } else {\n // Split text node into segments\n // TODO: Benchmark indexOf pre-check vs regex\n\n const segments = trimmed.split(STRING_INTERPOLATION_REGEX);\n if (segments.length < 3) return;\n if (segments.length === 3 && !segments[0] && !segments[2]) {\n parsedValue = segments[1];\n } else {\n for (const [index, segment] of segments.entries()) {\n // is even = is template string\n if (index % 2) {\n const newNode = createEmptyTextNode();\n text.before(newNode);\n this.#interpolateNode(newNode, element, options, segment);\n } else if (segment) {\n text.before(segment);\n }\n }\n // eslint-disable-next-line consistent-return\n return true;\n }\n }\n }\n\n // Check mutations\n\n const query = parsedValue;\n const negate = parsedValue[0] === '!';\n let doubleNegate = false;\n if (negate) {\n parsedValue = parsedValue.slice(1);\n doubleNegate = parsedValue[0] === '!';\n if (doubleNegate) {\n parsedValue = parsedValue.slice(1);\n }\n }\n\n let isEvent;\n let textNodeIndex;\n\n if (text) {\n // eslint-disable-next-line unicorn/consistent-destructuring\n if (element !== text.parentElement) {\n console.warn('mismatch?');\n element = text.parentElement;\n }\n textNodeIndex = 0;\n /** @type {ChildNode} */\n let prev = text;\n while ((prev = prev.previousSibling)) {\n textNodeIndex++;\n }\n } else {\n // @ts-ignore Skip cast\n // eslint-disable-next-line unicorn/consistent-destructuring\n if (element !== attr.ownerElement) {\n console.warn('mismatch?');\n element = attr.ownerElement;\n }\n if (nodeName.startsWith('on')) {\n // Do not interpolate inline event listeners\n const hyphenIndex = nodeName.indexOf('-');\n if (hyphenIndex === -1) return;\n isEvent = hyphenIndex === 2;\n }\n }\n\n if (isEvent) {\n element.removeAttribute(nodeName);\n const tag = this.#tagElement(element);\n const eventType = nodeName.slice(3);\n const [, flags, type] = eventType.match(/^([*1~]+)?(.*)$/);\n\n let handleEvent;\n /** @type {string} */\n let prop;\n /** @type {string[]} */\n let deepProp = [];\n if (parsedValue.startsWith('#')) {\n handleEvent = inlineFunctions.get(parsedValue).fn;\n } else {\n const parsedProps = parsedValue.split('.');\n if (parsedProps.length === 1) {\n prop = parsedValue;\n deepProp = [];\n } else {\n prop = parsedProps[0];\n deepProp = parsedProps;\n }\n }\n\n this.addCompositionEventListener({\n tag,\n type,\n handleEvent,\n prop,\n deepProp,\n once: flags?.includes('1'),\n passive: flags?.includes('~'),\n capture: flags?.includes('*'),\n });\n\n return;\n }\n\n /** @type {RenderGraphSearch} */\n let search;\n\n if (this.searchByQuery.has(query)) {\n search = this.searchByQuery.get(query);\n } else {\n // Has subquery?\n const subquery = parsedValue;\n const isSubquery = subquery !== query;\n /** @type {RenderGraphSearch} */\n let subSearch;\n if (isSubquery && this.searchByQuery.has(subquery)) {\n subSearch = this.searchByQuery.get(subquery);\n } else {\n // Construct subsearch, even is not subquery.\n /** @type {Function} */\n let expression;\n /** @type {string[]} */\n let propsUsed;\n /** @type {string[][]} */\n let deepPropsUsed;\n let defaultValue;\n let prop;\n let deepProp;\n let invocation;\n\n let inlineFunctionOptions;\n // Is Inline Function?\n if (parsedValue.startsWith('#')) {\n inlineFunctionOptions = inlineFunctions.get(parsedValue);\n if (!inlineFunctionOptions) {\n console.warn(`Invalid interpolation value: ${parsedValue}`);\n return;\n }\n expression = inlineFunctionOptions.fn;\n invocation = searchWithExpression;\n if (inlineFunctionOptions.props) {\n // console.log('This function has already been called. Reuse props', inlineFunctionOptions, this);\n propsUsed = inlineFunctionOptions.props;\n deepPropsUsed = inlineFunctionOptions.deepProps;\n defaultValue = inlineFunctionOptions.defaultValue ?? null;\n } else {\n defaultValue = inlineFunctionOptions.fn;\n }\n } else {\n defaultValue = null;\n if (options?.defaults) {\n defaultValue = deepPropFromObject(parsedValue.split('.'), options.defaults) ?? null;\n }\n if (defaultValue == null && options?.injections) {\n defaultValue = valueFromPropName(parsedValue, options.injections);\n console.log('default value from injection', parsedValue, { defaultValue });\n }\n }\n\n if (!propsUsed) {\n if (typeof defaultValue === 'function') {\n // Value must be reinterpolated and function observed\n const observeResult = observeFunction.call(this, defaultValue, options?.defaults, options?.injections);\n const uniqueProps = new Set([\n ...observeResult.props.this,\n ...observeResult.props.args[0],\n ...observeResult.props.args[1],\n ]);\n const uniqueDeepProps = new Set([\n ...observeResult.deepPropStrings.this,\n ...observeResult.deepPropStrings.args[0],\n ]);\n expression = defaultValue;\n defaultValue = observeResult.defaultValue;\n propsUsed = [...uniqueProps];\n deepPropsUsed = [...uniqueDeepProps].map((deepPropString) => deepPropString.split('.'));\n invocation = searchWithExpression;\n // console.log(this.static.name, fn.name || parsedValue, combinedSet);\n } else {\n // property binding\n const parsedProps = parsedValue.split('.');\n if (parsedProps.length === 1) {\n prop = parsedValue;\n propsUsed = [prop];\n invocation = searchWithProp;\n } else {\n propsUsed = [parsedProps[0]];\n deepProp = parsedProps;\n deepPropsUsed = [parsedProps];\n invocation = searchWithDeepProp;\n }\n\n // TODO: Rewrite property as deep with array index?\n }\n }\n\n if (inlineFunctionOptions) {\n inlineFunctionOptions.defaultValue = defaultValue;\n inlineFunctionOptions.props = propsUsed;\n inlineFunctionOptions.deepProps = deepPropsUsed;\n }\n subSearch = {\n cacheIndex: this.#interpolationState.cacheIndex++,\n dirtyIndex: this.#interpolationState.dirtyIndex++,\n ranFlagIndex: this.#interpolationState.ranFlagIndex++,\n query: subquery,\n defaultValue,\n subSearch: null,\n prop,\n propsUsed,\n deepProp,\n deepPropsUsed,\n invocation,\n expression,\n };\n this.addSearch(subSearch);\n }\n if (isSubquery) {\n search = {\n cacheIndex: this.#interpolationState.cacheIndex++,\n dirtyIndex: this.#interpolationState.dirtyIndex++,\n ranFlagIndex: this.#interpolationState.ranFlagIndex++,\n query,\n subSearch,\n negate,\n doubleNegate,\n prop: subSearch.prop,\n deepProp: subSearch.deepProp,\n propsUsed: subSearch.propsUsed,\n deepPropsUsed: subSearch.deepPropsUsed,\n defaultValue: doubleNegate ? !!subSearch.defaultValue\n : (negate ? !subSearch.defaultValue : subSearch.defaultValue),\n invocation(value) {\n if (this.doubleNegate) return !!value;\n if (this.negate) return !value;\n console.warn('Unknown query mutation', this.query);\n return value;\n },\n };\n this.addSearch(search);\n } else {\n // Store as search instead\n search = subSearch;\n }\n }\n\n // Tag\n let tag;\n let subnode = null;\n let defaultValue = search.defaultValue;\n if (text) {\n text.data = defaultValue;\n subnode = textNodeIndex;\n } else if (nodeName === 'mdw-if') {\n tag = this.#tagElement(element);\n element.removeAttribute(nodeName);\n defaultValue = defaultValue != null && defaultValue !== false;\n } else {\n subnode = nodeName;\n if (nodeName === 'id' || defaultValue == null || defaultValue === false) {\n element.removeAttribute(nodeName);\n } else {\n element.setAttribute(nodeName, defaultValue === true ? '' : defaultValue);\n }\n }\n\n tag ??= this.#tagElement(element);\n\n // Node entry\n let nodeEntry = this.#interpolationState.nodeEntry;\n if (!nodeEntry || nodeEntry.tag !== tag) {\n nodeEntry = {\n tag,\n textNodes: [],\n };\n this.#interpolationState.nodeEntry = nodeEntry;\n this.nodesToBind.push(nodeEntry);\n this.#interpolationState.nodeIndex++;\n }\n\n /** @type {RenderGraphAction} */\n let action;\n\n // Node Action\n if (text) {\n nodeEntry.textNodes.push(textNodeIndex);\n\n this.#interpolationState.nodeIndex++;\n action = {\n nodeIndex: this.#interpolationState.nodeIndex,\n invocation: writeDOMText,\n defaultValue,\n search,\n };\n } else if (subnode) {\n action = {\n nodeIndex: this.#interpolationState.nodeIndex,\n attrName: subnode,\n defaultValue,\n invocation: writeDOMAttribute,\n search,\n };\n } else {\n action = {\n nodeIndex: this.#interpolationState.nodeIndex,\n commentIndex: this.#interpolationState.commentIndex++,\n defaultValue,\n invocation: writeDOMElementAttachedState,\n search,\n };\n if (!defaultValue) {\n this.postInitActions.push({\n ...action,\n invocation: writeDOMHideElementOnInit,\n });\n }\n }\n\n this.addAction(action);\n this.tagsWithBindings.add(tag);\n }\n\n /**\n * @param {Element} element\n * @return {string}\n */\n #tagElement(element) {\n let id = element.id;\n if (id) {\n if (!this.allIds.includes(id)) {\n this.allIds.push(id);\n }\n } else {\n id = generateUID();\n this.temporaryIds.add(id);\n this.allIds.push(id);\n element.id = id;\n }\n return id;\n }\n\n /**\n * TODO: Subtemplating lacks optimization, though functional.\n * - Would benefit from custom type handler for arrays\n * to avoid multi-iteration change-detection.\n * - Could benefit from debounced/throttled render\n * - Consider remap of {item.prop} as {array[index].prop}\n *\n * @param {Element} element\n * @param {InterpolateOptions} options\n * @return {?Composition<?>}\n */\n #interpolateIterable(element, options) {\n // TODO: Microbenchmark element.attributes\n const forAttr = element.getAttribute('mdw-for');\n const trimmed = forAttr?.trim();\n if (!trimmed) {\n console.warn('Malformed mdw-for found at', element);\n return null;\n }\n\n if (trimmed[0] !== '{') {\n console.warn('Malformed mdw-for found at', element);\n return null;\n }\n const { length } = trimmed;\n if (trimmed[length - 1] !== '}') {\n console.warn('Malformed mdw-for found at', element);\n return null;\n }\n const parsedValue = trimmed.slice(1, -1);\n const [valueName, iterableName] = parsedValue.split(/\\s+of\\s+/);\n element.removeAttribute('mdw-for');\n // Create a new composition targetting element as root\n\n const elementAnchor = document.createElement('template');\n element.replaceWith(elementAnchor);\n const tag = this.#tagElement(elementAnchor);\n // console.log('tagging placeholder element with', elementAnchor, tag);\n\n let nodeEntry = this.#interpolationState.nodeEntry;\n if (!nodeEntry || nodeEntry.tag !== tag) {\n nodeEntry = {\n tag,\n textNodes: [],\n };\n this.#interpolationState.nodeEntry = nodeEntry;\n this.nodesToBind.push(nodeEntry);\n this.#interpolationState.nodeIndex++;\n console.log('adding node entry', tag, this.#interpolationState.nodeIndex);\n }\n\n const newComposition = new Composition();\n newComposition.template.append(element);\n // Move uninterpolated element to new composition template.\n const injections = {\n ...options.injections,\n [valueName]: null,\n index: null,\n };\n\n const propsUsed = [iterableName];\n /** @type {RenderGraphSearch} */\n const search = {\n cacheIndex: this.#interpolationState.cacheIndex++,\n dirtyIndex: this.#interpolationState.dirtyIndex++,\n ranFlagIndex: this.#interpolationState.ranFlagIndex++,\n propsUsed,\n deepPropsUsed: [[iterableName]],\n defaultValue: {},\n invocation(state, changes, data) {\n // Return unique to always specify dirty\n return {};\n },\n };\n\n /** @type {RenderGraphAction} */\n const action = {\n defaultValue: null,\n nodeIndex: this.#interpolationState.nodeIndex,\n search,\n commentIndex: this.#interpolationState.commentIndex++,\n injections,\n invocation(state, value, changes, data) {\n if (!newComposition.adapter) {\n // console.log({ state.options });\n const instanceAnchorElement = state.nodes[this.nodeIndex];\n const anchorNode = createEmptyComment();\n // Avoid leak\n state.nodes[this.commentIndex] = anchorNode;\n instanceAnchorElement.replaceWith(anchorNode);\n newComposition.adapter = new CompositionAdapter({\n anchorNode,\n composition: newComposition,\n renderOptions: {\n target: null,\n context: state.options.context,\n store: state.options.store,\n injections: this.injections,\n },\n });\n }\n const { adapter } = newComposition;\n const iterable = (data ?? state.options.store)[iterableName];\n // Remove oversized\n if (!iterable || iterable.length === 0) {\n adapter.removeEntries();\n return;\n }\n const changeList = changes[iterableName];\n const innerChanges = { ...changes };\n const needTargetAll = newComposition.props.some((prop) => prop !== iterableName && prop in changes);\n\n adapter.startBatch();\n if (!needTargetAll && !Array.isArray(changeList)) {\n const iterator = Array.isArray(changeList) ? changeList.entries() : Object.entries(changeList);\n // console.log('changeList render', iterator);\n for (const [key, change] of iterator) {\n if (key === 'length') continue;\n if (change === null) {\n // console.warn('null?', 'remove?', key);\n continue;\n }\n const index = (+key);\n const resource = iterable[index];\n innerChanges[valueName] = change;\n this.injections[valueName] = resource;\n this.injections.index = index;\n\n adapter.renderData(index, innerChanges, data, resource, change);\n }\n } else {\n if (!changeList) {\n delete innerChanges[valueName];\n }\n // console.log('full array render', iterable);\n for (const [index, resource] of iterable.entries()) {\n let change;\n if (changeList) {\n // console.warn('full array render has changeList?', changeList);\n if (!needTargetAll && !(index in changeList)) {\n console.warn('huh?');\n continue;\n }\n change = changeList[index];\n if (change === null) {\n // console.warn('remove?');\n continue;\n }\n innerChanges[valueName] = change;\n }\n this.injections[valueName] = resource;\n this.injections.index = index;\n\n adapter.renderData(index, innerChanges, data, resource, change);\n // adapter.renderIndex(index, innerChanges, data, resource);\n }\n }\n adapter.stopBatch();\n\n adapter.removeEntries(iterable.length);\n },\n\n };\n\n newComposition.interpolate({\n defaults: options.defaults,\n injections,\n });\n\n propsUsed.push(...newComposition.props);\n this.addSearch(search);\n this.addAction(action);\n this.tagsWithBindings.add(tag);\n // console.log('adding', iterable, 'bind to', this);\n // this.addBinding(iterable, entry);\n return newComposition;\n }\n\n /**\n * @param {InterpolateOptions} [options]\n */\n interpolate(options) {\n this.interpolateOptions = options;\n // console.log('Template', [...this.template.children].map((child) => child.outerHTML).join('\\n'));\n\n // Copy template before working on it\n // Store into `cloneable` to split later into `interpolation`\n this.cloneable = /** @type {DocumentFragment} */ (this.template.cloneNode(true));\n\n const TREE_WALKER_FILTER = 5; /* NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT */\n\n const treeWalker = document.createTreeWalker(this.cloneable, TREE_WALKER_FILTER);\n /** Note: `node` and treeWalker.currentNode may deviate */\n let node = treeWalker.nextNode();\n while (node) {\n /** @type {Element} */\n let element = null;\n switch (node.nodeType) {\n case Node.ELEMENT_NODE:\n element = /** @type {Element} */ (node);\n if (element instanceof HTMLTemplateElement) {\n node = treeWalker.nextSibling();\n continue;\n }\n if (node instanceof HTMLStyleElement) {\n // Move style elements out of cloneable\n if (node.parentNode === this.cloneable) {\n this.styles.push(node);\n node.remove();\n node = treeWalker.nextSibling();\n continue;\n }\n console.warn('<style> element not moved');\n }\n if (node instanceof HTMLScriptElement) {\n console.warn('<script> element found.');\n node.remove();\n node = treeWalker.nextSibling();\n continue;\n }\n\n if (element.hasAttribute('mdw-for')) {\n node = treeWalker.nextSibling();\n this.#interpolateIterable(element, options);\n } else {\n const idAttr = element.attributes.id;\n if (idAttr) {\n this.#interpolateNode(idAttr, element, options);\n this.#tagElement(element);\n }\n for (const attr of [...element.attributes].reverse()) {\n if (attr.nodeName === 'id') continue; // Already handled\n this.#interpolateNode(attr, element, options);\n }\n }\n\n break;\n case Node.TEXT_NODE:\n element = node.parentNode;\n if (this.#interpolateNode(/** @type {Text} */ (node), element, options)) {\n const nextNode = treeWalker.nextNode();\n node.remove();\n node = nextNode;\n continue;\n }\n\n break;\n default:\n throw new Error(`Unexpected node type: ${node.nodeType}`);\n }\n node = treeWalker.nextNode();\n }\n\n if ('adoptedStyleSheets' in document) {\n this.adoptedStyleSheets = [\n ...generateCSSStyleSheets(this.styles),\n ];\n } else {\n this.stylesFragment = generateFragment();\n this.stylesFragment.append(\n ...generateHTMLStyleElements(this.styles),\n );\n }\n\n this.props = [...this.actionsByPropsUsed.keys()];\n\n for (const id of this.allIds) {\n if (!this.tagsWithBindings.has(id)) {\n this.nodesToBind.push({\n tag: id,\n textNodes: [],\n });\n }\n }\n\n this.tags = this.nodesToBind.map((n) => n.tag);\n\n this.interpolated = true;\n\n // console.log('Cloneable', [...this.cloneable.children].map((child) => child.outerHTML).join('\\n'));\n }\n\n /**\n * @param {RenderGraphSearch} search\n * @return {RenderGraphSearch}\n */\n addSearch(search) {\n this.searches.push(search);\n if (search.query) {\n this.searchByQuery.set(search.query, search);\n this.initCache[search.cacheIndex] = search.defaultValue;\n }\n return search;\n }\n\n /**\n * @param {RenderGraphAction} action\n * @return {RenderGraphAction}\n */\n addAction(action) {\n this.actions.push(action);\n for (const prop of action.search.propsUsed) {\n if (this.actionsByPropsUsed.has(prop)) {\n this.actionsByPropsUsed.get(prop).push(action);\n } else {\n this.actionsByPropsUsed.set(prop, [action]);\n }\n }\n return action;\n }\n}\n", "export class ICustomElement extends HTMLElement {}\n", "/* eslint-disable max-classes-per-file */\n\nimport Composition from './Composition.js';\nimport { ICustomElement } from './ICustomElement.js';\nimport { attrNameFromPropName, attrValueFromDataValue } from './dom.js';\nimport { applyMergePatch } from './jsonMergePatch.js';\nimport { defineObservableProperty } from './observe.js';\nimport { addInlineFunction, css, html } from './template.js';\n\n/**\n * @template {abstract new (...args: any) => unknown} T\n * @param {InstanceType<T>} instance\n */\nfunction superOf(instance) {\n const staticContext = instance.constructor;\n const superOfStatic = Object.getPrototypeOf(staticContext);\n return superOfStatic.prototype;\n}\n\n/**\n * Clone attribute\n * @param {string} name\n * @param {string} target\n * @return {(oldValue:string, newValue:string, element: CustomElement) => void}\n */\nexport function cloneAttributeCallback(name, target) {\n return (oldValue, newValue, element) => {\n if (newValue == null) {\n element.refs[target].removeAttribute(name);\n } else {\n element.refs[target].setAttribute(name, newValue);\n }\n };\n}\n\nconst EVENT_PREFIX_REGEX = /^([*1~]+)?(.*)$/;\n\n/**\n * Web Component that can cache templates for minification or performance\n */\nexport default class CustomElement extends ICustomElement {\n /** @type {string} */\n static elementName;\n\n /** @return {Iterable<string>} */\n static get observedAttributes() {\n const s = new Set();\n for (const config of this.propList.values()) {\n if (config.reflect === true || config.reflect === 'read') {\n s.add(config.attr);\n }\n }\n return s;\n }\n\n /** @type {import('./Composition.js').Compositor<?>} */\n compose() {\n if (this.#composition) {\n console.warn('Already composed. Generating *new* composition...');\n }\n this.#composition = new Composition();\n return this.#composition;\n }\n\n /** @type {Composition<?>} */\n static _composition = null;\n\n /** @type {Map<string, import('./typings.js').ObserverConfiguration<?,?,?>>} */\n static _props = new Map();\n\n /** @type {Map<string, Function[]>} */\n static _propChangedCallbacks = new Map();\n\n /** @type {Map<string, Function[]>} */\n static _attributeChangedCallbacks = new Map();\n\n /** @type {typeof ICustomElement._onComposeCallbacks} */\n static _onComposeCallbacks = [];\n\n /** @type {typeof ICustomElement._onConnectedCallbacks} */\n static _onConnectedCallbacks = [];\n\n /** @type {typeof ICustomElement._onDisconnectedCallbacks} */\n static _onDisconnectedCallbacks = [];\n\n /** @type {typeof ICustomElement._onConstructedCallbacks} */\n static _onConstructedCallbacks = [];\n\n static interpolatesTemplate = true;\n\n static supportsElementInternals = 'attachInternals' in HTMLElement.prototype;\n\n static supportsElementInternalsRole = CustomElement.supportsElementInternals\n && 'role' in ElementInternals.prototype;\n\n /** @type {boolean} */\n static templatable = null;\n\n static defined = false;\n\n static autoRegistration = true;\n\n /** @type {Map<string, typeof CustomElement>} */\n static registrations = new Map();\n\n /** @type {typeof ICustomElement.expressions} */\n static expressions = this.set;\n\n /** @type {typeof ICustomElement.methods} */\n static methods = this.set;\n\n /** @type {typeof ICustomElement.overrides} */\n static overrides = this.set;\n\n /** @type {typeof ICustomElement.props} */\n static props = this.observe;\n\n /**\n * @template {typeof CustomElement} T\n * @this T\n * @template {keyof T} K\n * @param {K} collection\n * @param {T[K] extends (infer R)[] ? R : never} callback\n */\n static _addCallback(collection, callback) {\n if (!this.hasOwnProperty(collection)) {\n this[collection] = [\n ...this[collection],\n ];\n }\n this[collection].push(callback);\n }\n\n /**\n * Append parts to composition\n * @type {typeof ICustomElement.append}\n */\n static append(...parts) {\n this.on({\n composed({ composition }) {\n // console.debug('onComposed:append', ...parts);\n composition.append(...parts);\n },\n });\n // @ts-expect-error Can't cast T\n return this;\n }\n\n /**\n * Appends styles to composition\n * @type {typeof ICustomElement.css}\n */\n static css(array, ...substitutions) {\n if (Array.isArray(array)) {\n // @ts-expect-error Complex cast\n this.append(css(array, ...substitutions));\n } else {\n // @ts-expect-error Complex cast\n this.append(array, ...substitutions);\n }\n // @ts-expect-error Can't cast T\n return this;\n }\n\n /** @type {typeof ICustomElement['setSchema']} */\n static setSchema(schema) {\n this.schema = schema;\n // @ts-expect-error Can't cast T\n return this;\n }\n\n /**\n * Registers class asynchronously at end of current event loop cycle\n * via `queueMicrotask`. If class is registered before then,\n * does nothing.\n * @type {typeof ICustomElement['autoRegister']}\n */\n static autoRegister(elementName) {\n if (this.hasOwnProperty('defined') && this.defined) {\n console.warn(this.elementName, 'already registered.');\n // @ts-expect-error Can't cast T\n return this;\n }\n this.register(elementName);\n // @ts-expect-error Can't cast T\n return this;\n }\n\n /**\n * Appends DocumentFragment to composition\n * @type {typeof ICustomElement.html}\n */\n static html(strings, ...substitutions) {\n this.on({\n composed({ composition }) {\n // console.log('onComposed:html', strings);\n composition.append(html(strings, ...substitutions));\n },\n });\n // @ts-expect-error Can't cast T\n return this;\n }\n\n /**\n * Extends base class into a new class.\n * Use to avoid mutating base class.\n * TODO: Add constructor arguments typing\n * @type {typeof ICustomElement.extend}\n */\n static extend() {\n // @ts-expect-error Can't cast T\n return class extends this {};\n }\n\n /**\n * Fix for Typescript not parsing constructor params\n * @type {typeof ICustomElement.tsClassFix}\n */\n static tsClassFix() {\n // @ts-expect-error Can't cast T\n return this;\n }\n\n /**\n * Assigns static values to class\n * @type {typeof ICustomElement.setStatic}\n */\n static setStatic(source) {\n Object.assign(this, source);\n // @ts-expect-error Can't cast T\n return this;\n }\n\n /**\n * Assigns values directly to all instances (via prototype)\n * @type {typeof ICustomElement.set}\n */\n static readonly(source, options) {\n // @ts-expect-error Can't cast T\n return this.set(source, { ...options, writable: false });\n }\n\n /**\n * Assigns values directly to all instances (via prototype)\n * @type {typeof ICustomElement.set}\n */\n static set(source, options) {\n Object.defineProperties(\n this.prototype,\n Object.fromEntries([\n ...Object.entries(source).map(([name, value]) => {\n // Tap into .map() to avoid double iteration\n // Property may be redefined observable\n this.undefine(name);\n return [\n name,\n {\n enumerable: name[0] !== '_',\n configurable: true,\n value,\n writable: true,\n ...options,\n },\n ];\n }),\n ...Object.getOwnPropertySymbols(source).map((symbol) => [\n symbol,\n {\n enumerable: false,\n configurable: true,\n value: source[symbol],\n writable: true,\n ...options,\n },\n ]),\n ]),\n );\n // @ts-expect-error Can't cast T\n return this;\n }\n\n /**\n * Returns result of calling mixin with current class\n * @type {typeof ICustomElement.mixin}\n */\n static mixin(mixin) {\n return mixin(this);\n }\n\n /**\n * Registers class with window.customElements synchronously\n * @type {typeof ICustomElement['register']}\n */\n static register(elementName) {\n if (elementName) {\n this.elementName = elementName;\n }\n\n customElements.define(this.elementName, this);\n CustomElement.registrations.set(this.elementName, this);\n this.defined = true;\n // @ts-expect-error Can't cast T\n return this;\n }\n\n static get propList() {\n if (!this.hasOwnProperty('_props')) {\n this._props = new Map(this._props);\n }\n return this._props;\n }\n\n static get propChangedCallbacks() {\n if (!this.hasOwnProperty('_propChangedCallbacks')) {\n // structuredClone()\n this._propChangedCallbacks = new Map(\n [\n ...this._propChangedCallbacks,\n ].map(([name, array]) => [name, array.slice()]),\n );\n }\n return this._propChangedCallbacks;\n }\n\n static get attributeChangedCallbacks() {\n if (!this.hasOwnProperty('_attributeChangedCallbacks')) {\n this._attributeChangedCallbacks = new Map(\n [\n ...this._attributeChangedCallbacks,\n ].map(([name, array]) => [name, array.slice()]),\n );\n }\n return this._attributeChangedCallbacks;\n }\n\n /**\n * Creates observable property on instances (via prototype)\n * @template {import('./typings.js').ObserverPropertyType} [T1=null]\n * @template {import('./typings.js').ObserverPropertyType} [T2=null]\n * @template {any} [T3=null]\n * @param {string} name\n * @param {T1|import('./typings.js').ObserverOptions<T2,T3>} [typeOrOptions='string']\n * @return {(\n * T3 extends null ?\n * T2 extends null ?\n * T1 extends null ?\n * string\n * : import('./typings.js').ParsedObserverPropertyType<T1>\n * : import('./typings.js').ParsedObserverPropertyType<T2>\n * : T3\n * )}\n */\n static prop(name, typeOrOptions) {\n // TODO: Cache and save configuration for reuse (mixins)\n /** @type {import('./typings.js').ObserverOptions<?,?>} */\n const options = {\n ...((typeof typeOrOptions === 'string') ? { type: typeOrOptions } : typeOrOptions),\n };\n\n const customCallback = options.changedCallback;\n\n if (customCallback) {\n // Move callback to later in stack for attribute-based changes as well\n this.onPropChanged({ [name]: customCallback });\n }\n\n // TODO: Inspect possible closure bloat\n options.changedCallback = function wrappedChangedCallback(oldValue, newValue, changes) {\n this._onObserverPropertyChanged.call(this, name, oldValue, newValue, changes);\n };\n\n const config = defineObservableProperty(this.prototype, name, options);\n\n this.propList.set(name, config);\n for (const [prop, callback] of config.watchers) {\n this.on(`${prop}Changed`, callback);\n }\n\n return config.INIT_SYMBOL;\n }\n\n /**\n * Define properties on instances via Object.defineProperties().\n * Automatically sets property non-enumerable if name begins with `_`.\n * Functions will be remapped as getters\n * @type {typeof ICustomElement.define}\n */\n static define(props) {\n Object.defineProperties(\n this.prototype,\n Object.fromEntries(\n Object.entries(props).map(([name, options]) => {\n // Tap into .map() to avoid double iteration\n // Property may be redefined observable\n this.undefine(name);\n return [\n name,\n {\n enumerable: name[0] !== '_',\n configurable: true,\n ...(\n typeof options === 'function'\n ? { get: options }\n : options\n ),\n },\n ];\n }),\n ),\n );\n\n // @ts-expect-error Can't cast T\n return this;\n }\n\n static undefine(name) {\n Reflect.deleteProperty(this.prototype, name);\n if (this.propList.has(name)) {\n const config = this.propList.get(name);\n if (config.watchers.length && this.propChangedCallbacks.has(name)) {\n const propWatchers = this.propChangedCallbacks.get(name);\n for (const watcher of config.watchers) {\n const index = propWatchers.indexOf(watcher);\n if (index !== -1) {\n console.warn('Unwatching', name);\n propWatchers.splice(index, 1);\n }\n }\n }\n }\n this.propList.delete(name);\n return this;\n }\n\n /**\n * Creates observable properties on instances\n * @type {typeof ICustomElement.observe}\n */\n static observe(props) {\n for (const [name, typeOrOptions] of Object.entries(props ?? {})) {\n if (typeof typeOrOptions === 'function') {\n this.prop(name, {\n reflect: false,\n get: typeOrOptions,\n });\n } else {\n this.prop(name, typeOrOptions);\n }\n }\n // @ts-expect-error Can't cast T\n return this;\n }\n\n /** @type {typeof ICustomElement.defineStatic} */\n static defineStatic(props) {\n for (const [name, typeOrOptions] of Object.entries(props ?? {})) {\n const options = (typeof typeOrOptions === 'function')\n ? { get: typeOrOptions }\n : (typeof typeOrOptions === 'string'\n ? { type: typeOrOptions }\n : typeOrOptions);\n defineObservableProperty(this, name, {\n reflect: false,\n ...options,\n });\n }\n // @ts-expect-error Can't cast T\n return this;\n }\n\n /** @type {typeof ICustomElement.events} */\n static events(listeners, options) {\n this.on({\n composed({ composition }) {\n for (const [key, listenerOptions] of Object.entries(listeners)) {\n const [, flags, type] = key.match(EVENT_PREFIX_REGEX);\n // TODO: Make abstract\n let prop;\n /** @type {string[]} */\n let deepProp = [];\n if (typeof listenerOptions === 'string') {\n const parsedProps = listenerOptions.split('.');\n if (parsedProps.length === 1) {\n prop = listenerOptions;\n deepProp = [];\n } else {\n prop = parsedProps[0];\n deepProp = parsedProps;\n }\n }\n composition.addCompositionEventListener({\n type,\n once: flags?.includes('1'),\n passive: flags?.includes('~'),\n capture: flags?.includes('*'),\n ...(\n typeof listenerOptions === 'function'\n ? { handleEvent: listenerOptions }\n : (typeof listenerOptions === 'string'\n ? { prop, deepProp }\n : listenerOptions)\n ),\n ...(\n options\n )\n ,\n });\n }\n },\n });\n\n // @ts-expect-error Can't cast T\n return this;\n }\n\n /** @type {typeof ICustomElement.childEvents} */\n static childEvents(listenerMap, options) {\n for (const [tag, listeners] of Object.entries(listenerMap)) {\n // @ts-expect-error Can't cast T\n this.events(listeners, {\n tag: attrNameFromPropName(tag),\n ...options,\n });\n }\n\n // @ts-expect-error Can't cast T\n return this;\n }\n\n /** @type {typeof ICustomElement.events} */\n static rootEvents(listeners, options) {\n // @ts-expect-error Can't cast T\n return this.events(listeners, {\n tag: Composition.shadowRootTag,\n ...options,\n });\n }\n\n /** @type {typeof ICustomElement['on']} */\n static on(nameOrCallbacks, callback) {\n const callbacks = typeof nameOrCallbacks === 'string'\n ? { [nameOrCallbacks]: callback }\n : nameOrCallbacks;\n for (const [name, fn] of Object.entries(callbacks)) {\n /** @type {keyof (typeof CustomElement)} */\n let arrayPropName;\n switch (name) {\n case 'composed': arrayPropName = '_onComposeCallbacks'; break;\n case 'constructed': arrayPropName = '_onConstructedCallbacks'; break;\n case 'connected': arrayPropName = '_onConnectedCallbacks'; break;\n case 'disconnected': arrayPropName = '_onDisconnectedCallbacks'; break;\n case 'props':\n this.onPropChanged(fn);\n continue;\n case 'attrs':\n this.onAttributeChanged(fn);\n continue;\n default:\n if (name.endsWith('Changed')) {\n const prop = name.slice(0, name.length - 'Changed'.length);\n this.onPropChanged({ [prop]: fn });\n continue;\n }\n throw new Error('Invalid callback name');\n }\n this._addCallback(arrayPropName, fn);\n }\n\n // @ts-expect-error Can't cast T\n return this;\n }\n\n /** @type {typeof ICustomElement['onPropChanged']} */\n static onPropChanged(options) {\n for (const [prop, callback] of Object.entries(options)) {\n if (this.propChangedCallbacks.has(prop)) {\n this.propChangedCallbacks.get(prop).push(callback);\n } else {\n this.propChangedCallbacks.set(prop, [callback]);\n }\n }\n\n // @ts-expect-error Can't cast T\n return this;\n }\n\n /** @type {typeof ICustomElement['onAttributeChanged']} */\n static onAttributeChanged(options) {\n for (const [name, callback] of Object.entries(options)) {\n const lcName = name.toLowerCase();\n if (this.attributeChangedCallbacks.has(lcName)) {\n this.attributeChangedCallbacks.get(lcName).push(callback);\n } else {\n this.attributeChangedCallbacks.set(lcName, [callback]);\n }\n }\n\n // @ts-expect-error Can't cast T\n return this;\n }\n\n /** @type {Record<string, HTMLElement>}} */\n #refsProxy;\n\n /** @type {Map<string, WeakRef<HTMLElement>>}} */\n #refsCache = new Map();\n\n /** @type {Map<string, WeakRef<HTMLElement>>}} */\n #refsCompositionCache = new Map();\n\n /** @type {Composition<?>} */\n #composition;\n\n /** @type {Map<string,{stringValue:string, parsedValue:any}>} */\n _propAttributeCache;\n\n /** @type {import('./ICustomElement.js').CallbackArguments} */\n _callbackArguments = null;\n\n /** @param {any[]} args */\n constructor(...args) {\n super();\n\n if (CustomElement.supportsElementInternals) {\n this.elementInternals = this.attachInternals();\n }\n\n this.attachShadow({ mode: 'open', delegatesFocus: this.delegatesFocus });\n\n /**\n * Updates nodes based on data\n * Expects data in JSON Merge Patch format\n * @see https://www.rfc-editor.org/rfc/rfc7386\n * @param {Partial<?>} changes\n * @param {any} data\n * @return {void}\n */\n this.render = this.composition.render(\n this,\n this,\n {\n store: this,\n target: this.shadowRoot,\n context: this,\n },\n );\n\n for (const callback of this.static._onConstructedCallbacks) {\n callback.call(this, this.callbackArguments);\n }\n }\n\n /** @type {InstanceType<typeof ICustomElement>['propChangedCallback']} */\n propChangedCallback(name, oldValue, newValue, changes = newValue) {\n if (!this.patching) {\n this.render.byProp(name, changes, this);\n // this.render({ [name]: changes });\n }\n\n if (this.static._propChangedCallbacks.has(name)) {\n for (const callback of this.static.propChangedCallbacks.get(name)) {\n callback.call(this, oldValue, newValue, changes, this);\n }\n }\n }\n\n /**\n * @param {string} name\n * @param {string|null} oldValue\n * @param {string|null} newValue\n */\n attributeChangedCallback(name, oldValue, newValue) {\n const lcName = name.toLowerCase();\n if (this.static.attributeChangedCallbacks.has(lcName)) {\n for (const callback of this.static.attributeChangedCallbacks.get(lcName)) {\n callback.call(this, oldValue, newValue, this);\n }\n }\n\n // Array.find\n for (const config of this.static.propList.values()) {\n if (config.attr !== name) continue;\n\n if (config.reflect !== true && config.reflect !== 'read') return;\n\n if (config.attributeChangedCallback) {\n config.attributeChangedCallback.call(this, name, oldValue, newValue);\n return;\n }\n\n let cacheEntry;\n if (this.attributeCache.has(lcName)) {\n cacheEntry = this.attributeCache.get(lcName);\n if (cacheEntry.stringValue === newValue) return;\n }\n\n // @ts-expect-error any\n const previousDataValue = this[config.key];\n const parsedValue = newValue === null\n ? config.nullParser(/** @type {null} */ (newValue))\n // Avoid Boolean('') === false\n : (config.type === 'boolean' ? true : config.parser(newValue));\n\n if (parsedValue === previousDataValue) {\n // No internal value change\n return;\n }\n // \"Remember\" that this attrValue equates to this data value\n // Avoids rewriting attribute later on data change event\n if (cacheEntry) {\n cacheEntry.stringValue = newValue;\n cacheEntry.parsedValue = parsedValue;\n } else {\n this.attributeCache.set(lcName, {\n stringValue: newValue, parsedValue,\n });\n }\n // @ts-expect-error any\n this[config.key] = parsedValue;\n return;\n }\n }\n\n get #template() {\n return this.#composition?.template;\n }\n\n /**\n * @param {string} name\n * @param {any} oldValue\n * @param {any} newValue\n * @param {any} changes\n */\n _onObserverPropertyChanged(name, oldValue, newValue, changes) {\n if (this.static.propList.has(name)) {\n const { reflect, attr } = this.static.propList.get(name);\n if (attr && (reflect === true || reflect === 'write')) {\n const lcName = attr.toLowerCase();\n /** @type {{stringValue:string, parsedValue:any}} */\n let cacheEntry;\n let needsWrite = false;\n if (this.attributeCache.has(lcName)) {\n cacheEntry = this.attributeCache.get(lcName);\n needsWrite = (cacheEntry.parsedValue !== newValue);\n } else {\n // @ts-ignore skip cast\n cacheEntry = {};\n this.attributeCache.set(lcName, cacheEntry);\n needsWrite = true;\n }\n if (needsWrite) {\n const stringValue = attrValueFromDataValue(newValue);\n cacheEntry.parsedValue = newValue;\n cacheEntry.stringValue = stringValue;\n // Cache attrValue to ignore attributeChangedCallback later\n if (stringValue == null) {\n this.removeAttribute(attr);\n } else {\n this.setAttribute(attr, stringValue);\n }\n }\n }\n }\n\n // Invoke change => render\n this.propChangedCallback(name, oldValue, newValue, changes);\n }\n\n patch(patch) {\n this.patching = true;\n applyMergePatch(this, patch);\n this.render(patch);\n this.patching = false;\n }\n\n /**\n * Proxy object that returns shadow DOM elements by tag.\n * If called before interpolation (eg: on composed), returns from template\n * @return {Record<string,HTMLElement>}\n */\n get refs() {\n // eslint-disable-next-line no-return-assign\n return (this.#refsProxy ??= new Proxy({}, {\n /**\n * @param {any} target\n * @param {string} tag\n * @return {Element}\n */\n get: (target, tag) => {\n if (!this.#composition) {\n console.warn(this.static.name, 'Attempted to access references before composing!');\n }\n const composition = this.composition;\n let element;\n if (!composition.interpolated) {\n if (this.#refsCompositionCache.has(tag)) {\n element = this.#refsCompositionCache.get(tag).deref();\n if (element) return element;\n }\n const formattedTag = attrNameFromPropName(tag);\n // console.warn(this.tagName, 'Returning template reference');\n element = composition.template.getElementById(formattedTag);\n if (!element) return null;\n this.#refsCompositionCache.set(tag, new WeakRef(element));\n return element;\n }\n if (this.#refsCache.has(tag)) {\n element = this.#refsCache.get(tag).deref();\n if (element) {\n return element;\n }\n }\n\n const formattedTag = attrNameFromPropName(tag);\n const tagIndex = this.composition.tags.indexOf(formattedTag);\n element = this.render.state.refs[tagIndex];\n\n if (!element) return null;\n this.#refsCache.set(tag, new WeakRef(element));\n return element;\n },\n }));\n }\n\n get attributeCache() {\n this._propAttributeCache ??= new Map();\n return this._propAttributeCache;\n }\n\n get tabIndex() {\n return super.tabIndex;\n }\n\n set tabIndex(value) {\n if (value === super.tabIndex && value !== -1) {\n // Non -1 value already set\n return;\n }\n\n if (this.delegatesFocus && document.activeElement === this) {\n if (this.getAttribute('tabindex') === value.toString()) {\n // Skip if possible\n return;\n }\n\n // Chrome blurs on tabindex changes with delegatesFocus\n // Fixed in Chrome 111\n // Remove this code ~June 2023\n // https://bugs.chromium.org/p/chromium/issues/detail?id=1346606\n /** @type {EventListener} */\n const listener = (e) => {\n e.stopImmediatePropagation();\n e.stopPropagation();\n if (e.type === 'blur') {\n console.warn('Chromium bug 1346606: Tabindex change caused blur. Giving focusing back.', this);\n this.focus();\n } else {\n console.warn('Chromium bug 1346606: Blocking focus event.', this);\n }\n };\n this.addEventListener('blur', listener, { capture: true, once: true });\n this.addEventListener('focus', listener, { capture: true, once: true });\n super.tabIndex = value;\n this.removeEventListener('blur', listener, { capture: true });\n this.removeEventListener('focus', listener, { capture: true });\n return;\n }\n\n super.tabIndex = value;\n }\n\n get static() { return /** @type {typeof CustomElement} */ (/** @type {unknown} */ (this.constructor)); }\n\n get unique() { return false; }\n\n get callbackArguments() {\n // eslint-disable-next-line no-return-assign\n return this._callbackArguments ??= {\n composition: this.#composition,\n html: html.bind(this),\n inline: addInlineFunction,\n template: this.#template,\n element: this,\n };\n }\n\n /** @return {Composition<?>} */\n get composition() {\n if (this.#composition) return this.#composition;\n\n if (!this.unique && this.static.hasOwnProperty('_composition')) {\n this.#composition = this.static._composition;\n return this.static._composition;\n }\n\n // TODO: Use Composition to track uniqueness\n // console.log('composing', this.static.elementName);\n this.compose();\n for (const callback of this.static._onComposeCallbacks) {\n // console.log(this.static.elementName, 'composition callback');\n callback.call(this, this.callbackArguments);\n }\n\n if (!this.unique) {\n // Cache compilation into static property\n this.static._composition = this.#composition;\n }\n\n return this.#composition;\n }\n\n connectedCallback() {\n for (const callbacks of this.static._onConnectedCallbacks) {\n callbacks.call(this, this.callbackArguments);\n }\n }\n\n disconnectedCallback() {\n for (const callbacks of this.static._onDisconnectedCallbacks) {\n callbacks.call(this, this.callbackArguments);\n }\n }\n}\n\nCustomElement.prototype.delegatesFocus = false;\n", "/** @param {typeof import('../core/CustomElement.js').default} Base */\nexport default function DensityMixin(Base) {\n return Base\n .observe({\n density: 'integer',\n })\n .css`\n :host {\n --mdw-density: var(--mdw-density__default, 0);\n }\n \n /* Reset */\n :host([density]) { --mdw-density: 0; }\n \n :host([density=\"-1\"]) { --mdw-density: -1; }\n :host([density=\"-2\"]) { --mdw-density: -2; }\n :host([density=\"-3\"]) { --mdw-density: -2; }\n :host([density=\"-4\"]) { --mdw-density: -4; }\n :host([density=\"1\"]) { --mdw-density: 1; }\n :host([density=\"2\"]) { --mdw-density: 2; }\n :host([density=\"3\"]) { --mdw-density: 3; }\n :host([density=\"4\"]) { --mdw-density: 3; }\n `;\n}\n", "/**\n * @param {ReturnType<import('./StateMixin.js').default> & ReturnType<import('./ThemableMixin.js').default>} Base\n */\nexport default function ShapeMixin(Base) {\n return Base\n .observe({\n shapeTop: 'boolean',\n shapeBottom: 'boolean',\n shapeStart: 'boolean',\n shapeEnd: 'boolean',\n shapeStyle: 'string',\n outlined: 'boolean',\n })\n .html`\n <div id=shape part=shape class=shape elevated={elevated} \n shape-top={shapeTop} shape-bottom={shapeBottom} shape-start={shapeStart} shape-end={shapeEnd} shape-style={shapeStyle}\n color={color} outlined={outlined} disabled={disabledState}>\n <div id=outline mdw-if={outlined} class=outline disabled={disabledState} focused={focusedState} pressed={pressedState} hovered={hoveredState}>\n <div id=outline-left class=\"outline-section outline-left\"></div>\n <div id=outline-right class=\"outline-section outline-right\"></div>\n </div>\n </div>\n `\n .css`\n :host {\n --mdw-shape__size: 0px;\n --mdw-shape__bg: transparent;\n --mdw-surface__will-change: none;\n --mdw-shape__ltr: calc(0.5 * var(--mdw-dir, 1) + 0.5); /* 1 if LTR, 0 if RTL */\n --mdw-shape__rtl: calc(-0.5 * var(--mdw-dir, 1) + 0.5); /* 0 if LTR, 1 if RTL */\n\n /** By default, fallback to border-radius */\n --mdw-shape__rounded: 1;\n --mdw-shape__inline-start-deg: calc(var(--mdw-dir, 1) * -90deg);\n z-index: 0;\n }\n\n .shape {\n --mdw-shape__size__top-start-size: var(--mdw-shape__size);\n --mdw-shape__size__top-end-size: var(--mdw-shape__size);\n --mdw-shape__size__bottom-start-size: var(--mdw-shape__size);\n --mdw-shape__size__bottom-end-size: var(--mdw-shape__size);\n \n /* (1/2n + 1/2)L + (-1/2n + 1/2)R */\n \n --mdw-shape__size__top-left-size: calc((var(--mdw-shape__ltr) * var(--mdw-shape__size__top-start-size)) + (var(--mdw-shape__rtl) * var(--mdw-shape__size__top-end-size)));\n --mdw-shape__size__top-right-size: calc((var(--mdw-shape__rtl) * var(--mdw-shape__size__top-start-size)) + (var(--mdw-shape__ltr) * var(--mdw-shape__size__top-end-size)));\n --mdw-shape__size__bottom-left-size: calc((var(--mdw-shape__ltr) * var(--mdw-shape__size__bottom-start-size)) + (var(--mdw-shape__rtl) * var(--mdw-shape__size__bottom-end-size)));\n --mdw-shape__size__bottom-right-size: calc((var(--mdw-shape__rtl) * var(--mdw-shape__size__bottom-start-size)) + (var(--mdw-shape__ltr) * var(--mdw-shape__size__bottom-end-size)));\n \n }\n\n .shape[shape-style=\"none\"] {\n --mdw-shape__size: 0px;\n }\n \n .shape[shape-style=\"extra-small\"] {\n --mdw-shape__size: var(--mdw-shape__extra-small);\n }\n \n .shape[shape-style=\"small\"] {\n --mdw-shape__size: var(--mdw-shape__small);\n }\n \n .shape[shape-style=\"medium\"] {\n --mdw-shape__size: var(--mdw-shape__medium);\n }\n \n .shape[shape-style=\"large\"] {\n --mdw-shape__size: var(--mdw-shape__large);\n }\n \n .shape[shape-style=\"extra-large\"] {\n --mdw-shape__size: var(--mdw-shape__extra-large);\n }\n \n .shape[shape-style=\"full\"] {\n --mdw-shape__size: var(--mdw-shape__full);\n }\n \n .shape[shape-style=\"inherit\"] {\n --mdw-shape__size: inherit;\n }\n \n .shape[shape-top] {\n --mdw-shape__size__bottom-start-size: 0px;\n --mdw-shape__size__bottom-end-size: 0px;\n --mdw-shape__mask: linear-gradient(transparent 50%, black 50%);\n }\n \n .shape[shape-bottom] {\n --mdw-shape__size__top-start-size: 0px;\n --mdw-shape__size__top-end-size: 0px;\n --mdw-shape__mask: linear-gradient(black 50%, transparent 50%);\n }\n \n .shape[shape-start] {\n --mdw-shape__size__top-end-size: 0px;\n --mdw-shape__size__bottom-end-size: 0px;\n --mdw-shape__mask: linear-gradient(var(--mdw-shape__inline-start-deg), black 50%, transparent 50%);\n }\n \n .shape[shape-end] {\n --mdw-shape__size__top-start-size: 0px;\n --mdw-shape__size__bottom-start-size: 0px;\n --mdw-shape__mask: linear-gradient(var(--mdw-shape__inline-start-deg), transparent 50%, black 50%);\n }\n \n @supports(-webkit-mask-box-image: none) {\n :host {\n /* Inherit all the way up to :root */\n --mdw-shape__rounded: inherit;\n }\n }\n `\n .css`\n .shape {\n position: absolute;\n inset: 0;\n \n overflow: hidden;\n \n z-index: -1;\n \n background-color: var(--mdw-shape__bg, transparent);\n \n border-start-start-radius: calc(var(--mdw-shape__rounded) * var(--mdw-shape__size__top-start-size));\n border-start-end-radius: calc(var(--mdw-shape__rounded) * var(--mdw-shape__size__top-end-size));\n border-end-start-radius: calc(var(--mdw-shape__rounded) * var(--mdw-shape__size__bottom-start-size));\n border-end-end-radius: calc(var(--mdw-shape__rounded) * var(--mdw-shape__size__bottom-end-size));\n \n transition-delay: 1ms;\n transition-duration: 200ms;\n transition-property: background-color, color;\n will-change: background-color, color;\n \n }\n\n .shape[outlined] {\n background-color: transparent;\n }\n \n .shape[color] {\n background-color: rgb(var(--mdw-bg));\n color: rgb(var(--mdw-ink));\n }\n \n .shape:is([color=\"none\"], [color=\"transparent\"]) {\n background-color: transparent;\n }\n\n @supports(-webkit-mask-box-image: none) {\n .shape {\n -webkit-mask-box-image: var(--mdw-shape__mask-border-source)\n 8 fill /\n var(--mdw-shape__size)\n stretch;\n \n -webkit-mask: var(--mdw-shape__mask);\n\n transition-duration: 200ms, 200ms, 200ms;\n transition-property: background-color, color, -webkit-mask-box-image-width;\n will-change: background-color, color, -webkit-mask-box-image;\n }\n }\n `\n .css`\n .outline {\n position: absolute;\n inset: 0;\n \n pointer-events: none;\n \n border-color: currentColor;\n border-radius: inherit;\n color: rgb(var(--mdw-color__outline));\n }\n \n .outline:is([pressed],[focused]) {\n color: rgb(var(--mdw-ink));\n \n transition-delay: 0;\n transition-duration: 0;\n }\n \n .outline[disabled] {\n color: rgba(var(--mdw-color__on-surface), 0.12);\n }\n \n .outline::before {\n content: '';\n \n position: absolute;\n inset: 0;\n \n border-style: solid;\n border-width: 1px;\n \n border-radius: inherit;\n }\n \n @supports(-webkit-mask-box-image: none) {\n .outline::before {\n content: none;\n }\n \n .outline::after {\n content: '';\n \n position: absolute;\n inset: 0;\n \n -webkit-mask-box-image: var(--mdw-shape__mask-image__edges)\n 8 fill /\n auto\n stretch;\n \n background-color: currentColor;\n }\n \n .outline-section {\n position: absolute;\n inset: 0;\n }\n \n .outline-section::before,\n .outline-section::after {\n content: \"\";\n \n position: absolute;\n \n max-block-size: 50%;\n max-inline-size: 50%;\n \n -webkit-mask-repeat: no-repeat;\n -webkit-mask-size: contain;\n \n background-color: currentColor;\n \n transition-duration: 200ms;\n /* stylelint-disable-next-line liberty/use-logical-spec */\n transition-property: width, height;\n }\n \n .outline-left::before {\n /* stylelint-disable-next-line liberty/use-logical-spec */\n left: calc(-1px * var(--mdw-shape__convex));\n inset-block-start: calc(-1px * var(--mdw-shape__convex));\n \n block-size: calc(var(--mdw-shape__size__top-left-size));\n inline-size: calc(var(--mdw-shape__size__top-left-size));\n /* stylelint-disable-next-line liberty/use-logical-spec */\n padding-right: calc(2px * var(--mdw-shape__convex));\n padding-block-end: calc(2px * var(--mdw-shape__convex));\n \n -webkit-mask-image: var(--mdw-shape__mask-image__top-left);\n }\n \n .outline-left::after {\n /* stylelint-disable-next-line liberty/use-logical-spec */\n left: calc(-1px * var(--mdw-shape__convex));\n inset-block-end: calc(-1px * var(--mdw-shape__convex));\n \n block-size: var(--mdw-shape__size__bottom-left-size);\n inline-size: var(--mdw-shape__size__bottom-left-size);\n /* stylelint-disable-next-line liberty/use-logical-spec */\n padding-right: calc(2px * var(--mdw-shape__convex));\n padding-block-start: calc(2px * var(--mdw-shape__convex));\n \n -webkit-mask-image: var(--mdw-shape__mask-image__bottom-left);\n -webkit-mask-position-y: 100%;\n }\n \n .outline-right::before {\n /* stylelint-disable-next-line liberty/use-logical-spec */\n right: calc(-1px * var(--mdw-shape__convex));\n inset-block-start: calc(-1px * var(--mdw-shape__convex));\n \n block-size: var(--mdw-shape__size__top-right-size);\n inline-size: var(--mdw-shape__size__top-right-size);\n /* stylelint-disable-next-line liberty/use-logical-spec */\n padding-left: calc(2px * var(--mdw-shape__convex));\n padding-block-end: calc(2px * var(--mdw-shape__convex));\n \n -webkit-mask-image: var(--mdw-shape__mask-image__top-right);\n -webkit-mask-position-x: 100%;\n }\n\n .outline-right::after {\n /* stylelint-disable-next-line liberty/use-logical-spec */\n right: calc(-1px * var(--mdw-shape__convex));\n inset-block-end: calc(-1px * var(--mdw-shape__convex));\n \n block-size: var(--mdw-shape__size__bottom-right-size);\n inline-size: var(--mdw-shape__size__bottom-right-size);\n /* stylelint-disable-next-line liberty/use-logical-spec */\n padding-left: calc(2px * var(--mdw-shape__convex));\n padding-block-start: calc(2px * var(--mdw-shape__convex));\n \n -webkit-mask-image: var(--mdw-shape__mask-image__bottom-right);\n -webkit-mask-position-x: 100%;\n -webkit-mask-position-y: 100%;\n }\n }\n `;\n}\n", "import CustomElement from '../core/CustomElement.js';\nimport DensityMixin from '../mixins/DensityMixin.js';\nimport ShapeMixin from '../mixins/ShapeMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\nexport default CustomElement\n .extend()\n .mixin(ThemableMixin)\n .mixin(DensityMixin)\n .mixin(ShapeMixin)\n .html`<slot id=slot></slot>`\n .css`\n :host {\n --mdw-shape__size: 8px;\n --mdw-ink: var(--mdw-color__on-error);\n --mdw-shape__bg: rgb(var(--mdw-color__error));\n --mdw-type__font: var(--mdw-typescale__label-small__font);\n --mdw-type__letter-spacing: var(--mdw-typescale__label-small__letter-spacing);\n position: relative;\n \n display: inline-block;\n vertical-align: middle;\n \n box-sizing: border-box;\n min-block-size: var(--mdw-typescale__label-small__line-height);\n min-inline-size: var(--mdw-typescale__label-small__line-height);\n padding-inline: max(4px, calc(4px + (var(--mdw-density) * 2px)));\n \n color: rgb(var(--mdw-ink));\n \n font: var(--mdw-type__font);\n letter-spacing: var(--mdw-type__letter-spacing);\n text-align: center;\n }\n \n @supports (width: 1lh) {\n :host {\n min-block-size: 1lh; /* Clamps to 1:1 */\n min-inline-size: 1lh; /* Clamps to 1:1 */\n padding-inline: max(0.25lh, calc(0.25lh + (var(--mdw-density) * 2px)));\n }\n }\n \n :host(:empty) {\n vertical-align: middle;\n }\n \n :host(:empty) #shape {\n inset: 5px;\n }\n `\n .autoRegister('mdw-badge');\n", "/**\n * @param {typeof import('../core/CustomElement.js').default} Base\n */\nexport default function FlexableMixin(Base) {\n return Base\n .observe({\n flex: {\n type: 'string',\n empty: 'row',\n /** @type {'row'|'column'} */\n value: 'row',\n },\n x: {\n type: 'string',\n empty: 'start',\n /** @type {'start'|'center'|'end'|'between'|'around'|'stretch'} */\n value: 'start',\n },\n y: {\n type: 'string',\n empty: 'start',\n /** @type {'start'|'center'|'end'|'between'|'around'|'stretch'} */\n value: 'start',\n },\n gap: 'float',\n padding: 'float',\n })\n .css`\n /* https://css-tricks.com/snippets/css/a-guide-to-flexbox/ */\n\n :host{\n box-sizing: border-box;\n }\n\n :host([flex]) {\n display:flex;\n }\n\n :host([flex=\"column\"]) {\n flex-direction: column;\n }\n\n :host(:where([flex][y=\"start\"], [flex=\"column\"][x=\"start\"])) {\n align-items: flex-start;\n }\n\n :host(:where([flex][y=\"end\"], [flex=\"column\"][x=\"end\"])) {\n align-items: flex-end;\n }\n\n :host(:where([flex][y=\"center\"], [flex=\"column\"][x=\"center\"])) {\n align-items: center;\n }\n\n :host(:where([flex][y=\"between\"], [flex=\"column\"][x=\"between\"])) {\n align-items: space-between;\n }\n\n :host(:where([flex][y=\"around\"], [flex=\"column\"][x=\"around\"])) {\n align-items: space-around;\n }\n\n :host(:where([flex][y=\"stretch\"], [flex=\"column\"][x=\"stretch\"])) {\n align-items: stretch;\n }\n\n :host(:where([flex][x=\"start\"], [flex=\"column\"][y=\"start\"])) {\n justify-content: flex-start;\n }\n\n :host(:where([flex][x=\"end\"], [flex=\"column\"][y=\"end\"])) {\n justify-content: flex-end;\n }\n\n :host(:where([flex][x=\"center\"], [flex=\"column\"][y=\"center\"])) {\n justify-content: center;\n }\n\n :host(:where([flex][x=\"between\"], [flex=\"column\"][y=\"between\"])) {\n justify-content: space-between;\n }\n\n :host(:where([flex][x=\"stretch\"], [flex=\"column\"][y=\"stretch\"])) {\n justify-content: stretch;\n }\n\n :host([wrap]) {\n flex-wrap: wrap;\n }\n\n :host([wrap=\"reverse\"]) {\n flex-wrap: wrap-reverse;\n }\n\n :host([gap=\"4\"]) {gap: 4px;}\n :host([gap=\"8\"]) {gap: 8px;}\n :host([gap=\"12\"]) {gap: 12px;}\n :host([gap=\"16\"]) {gap: 16px;}\n :host([gap=\"20\"]) {gap: 20px;}\n :host([gap=\"24\"]) {gap: 24px;}\n\n :host([padding=\"4\"]) {padding: 4px;}\n :host([padding=\"8\"]) {padding: 8px;}\n :host([padding=\"12\"]) {padding: 12px;}\n :host([padding=\"16\"]) {padding: 16px;}\n :host([padding=\"20\"]) {padding: 20px;}\n :host([padding=\"24\"]) {padding: 24px;}\n `;\n}\n", "import CustomElement from '../core/CustomElement.js';\nimport FlexableMixin from '../mixins/FlexableMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\n/**\n * Containers are stateless elements that may have a color and ink.\n * They should have simple geometry for rendering and layout.\n */\nexport default CustomElement\n .extend()\n .mixin(ThemableMixin)\n .mixin(FlexableMixin)\n .observe({\n inline: 'boolean',\n grid: 'boolean',\n block: {\n type: 'boolean',\n empty: true,\n },\n })\n .css`\n :host {\n display: block;\n }\n \n :host([inline]) {\n display: inline-block;\n }\n \n :host([flex]:where([inline])) {\n display: inline-flex;\n }\n\n :host([color]) {\n background-color: rgb(var(--mdw-bg));\n color: rgb(var(--mdw-ink));\n }\n\n :host(:is([color=\"none\"],[color=\"transparent\"])) {\n background-color: transparent;\n color: inherit;\n }\n \n :host([ink]) {\n color: rgb(var(--mdw-ink));\n }\n \n :host([type-style]) {\n font: var(--mdw-type__font);\n letter-spacing: var(--mdw-type__letter-spacing);\n }\n \n #slot {\n /* Passthrough from parent */\n block-size: inherit;\n inline-size: inherit;\n }\n\n :host([grid]) {\n display: grid;\n column-gap: 16px; /* Gutters */\n grid-auto-flow: row;\n grid-template-columns: repeat(var(--mdw-grid__columns), 1fr);\n }\n\n #slot[grid]::slotted(*) { grid-column: auto / span calc(var(--mdw-grid__columns)) }\n #slot[grid]::slotted([col-span=\"1\"]) { grid-column: auto / span 1; }\n #slot[grid]::slotted([col-span=\"2\"]) { grid-column: auto / span min(2, var(--mdw-grid__columns)); }\n #slot[grid]::slotted([col-span=\"3\"]) { grid-column: auto / span min(3, var(--mdw-grid__columns)); }\n #slot[grid]::slotted([col-span=\"4\"]) { grid-column: auto / span min(4, var(--mdw-grid__columns)); }\n #slot[grid]::slotted([col-span=\"5\"]) { grid-column: auto / span min(5, var(--mdw-grid__columns)); }\n #slot[grid]::slotted([col-span=\"6\"]) { grid-column: auto / span min(6, var(--mdw-grid__columns)); }\n #slot[grid]::slotted([col-span=\"7\"]) { grid-column: auto / span min(7, var(--mdw-grid__columns)); }\n #slot[grid]::slotted([col-span=\"8\"]) { grid-column: auto / span min(8, var(--mdw-grid__columns)); }\n #slot[grid]::slotted([col-span=\"9\"]) { grid-column: auto / span min(9, var(--mdw-grid__columns)); }\n #slot[grid]::slotted([col-span=\"10\"]) { grid-column: auto / span min(10, var(--mdw-grid__columns)); }\n #slot[grid]::slotted([col-span=\"11\"]) { grid-column: auto / span min(11, var(--mdw-grid__columns)); }\n #slot[grid]::slotted([col-span=\"12\"]) { grid-column: auto / span min(12, var(--mdw-grid__columns)); }\n #slot[grid]::slotted([col-span=\"50%\"]) { grid-column: auto / span max(calc(var(--mdw-grid__columns) / 2), 1); }\n #slot[grid]::slotted([col-span=\"25%\"]) { grid-column: auto / span max(calc(var(--mdw-grid__columns) / 4), 1); }\n\n `\n .html`<slot id=slot type-style={typeStyle} grid={grid}></slot>`\n .autoRegister('mdw-box');\n", "import Box from './Box.js';\n\nexport default Box\n .extend()\n .css`\n :host {\n font: var(--mdw-typescale__body-large__font);\n letter-spacing: var(--mdw-typescale__body-large__letter-spacing);\n }\n \n :host([size=\"medium\"]) {\n font: var(--mdw-typescale__body-medium__font);\n letter-spacing: var(--mdw-typescale__body-medium__letter-spacing);\n }\n \n :host([size=\"small\"]) {\n font: var(--mdw-typescale__body-small__font);\n letter-spacing: var(--mdw-typescale__body-small__letter-spacing);\n }\n `\n .autoRegister('mdw-body');\n", "/** @param {typeof import('../core/CustomElement.js').default} Base */\nexport default function AriaReflectorMixin(Base) {\n return Base\n .observe({\n _ariaRole: 'string',\n }).methods({\n /**\n * @param {keyof HTMLElement & keyof ElementInternals} name\n * @param {string} value\n */\n updateAriaProperty(name, value) {\n if (this.elementInternals && name in this.elementInternals) {\n this.elementInternals[name] = value;\n } else if (name in this) {\n this[name] = value;\n } else {\n console.warn('Unknown ARIA property', name, this);\n /** @type {string} */\n let attrName = name;\n if (attrName.startsWith('aria')) {\n attrName = `aria-${attrName.slice(4).toLowerCase()}`;\n }\n if (value == null) {\n this.removeAttribute(name);\n } else {\n this.setAttribute(attrName, value);\n }\n }\n },\n })\n .on({\n _ariaRoleChanged(oldValue, newValue) {\n this.updateAriaProperty('role', newValue);\n },\n constructed() {\n this.updateAriaProperty('role', this._ariaRole);\n },\n });\n}\n", "import { attemptFocus, isRtl } from '../core/dom.js';\n\nconst DEFAULT_ELEMENT_QUERY = [\n 'button',\n '[href]',\n 'input',\n 'select',\n 'textarea',\n '[tabindex]',\n].join(', ');\n\n/**\n * @param {typeof import('../core/CustomElement.js').default} Base\n */\nexport default function KeyboardNavMixin(Base) {\n return Base\n .observe({\n /** Keyboard navigation attribute */\n kbdNav: { empty: 'true' },\n _kbdFocusable: { empty: true },\n\n })\n .define({\n /**\n * Query used to find roving tab index children\n */\n kbdNavQuery() {\n return DEFAULT_ELEMENT_QUERY;\n },\n /**\n * Flag whether disabled elements participating in roving tab index\n * should be focusable.\n */\n kbdNavFocusableWhenDisabled() { return true; },\n /** @return {'horizontal'|'vertical'} */\n ariaOrientationDefault() { return 'vertical'; },\n })\n .define({\n /**\n * List of roving tab index participating children\n * @return {NodeListOf<HTMLElement>}\n */\n kbdNavChildren() {\n return this.querySelectorAll(this.kbdNavQuery);\n },\n })\n .methods({\n _ariaOrientationIsVertical() {\n return (this.ariaOrientation\n ?? this.getAttribute('aria-orientation')\n ?? this.ariaOrientationDefault) === 'vertical';\n },\n focusCurrentOrFirst() {\n let current;\n let first;\n for (const candidate of this.kbdNavChildren) {\n first = candidate;\n if (candidate.tabIndex === 0) {\n current = candidate;\n break;\n }\n }\n if (attemptFocus(current)) return current;\n if (attemptFocus(first)) return first;\n return null;\n },\n /**\n * Focuses next element participating in roving tab index list\n * @param {HTMLElement} [current]\n * @param {boolean} [loop=true]\n * @param {boolean} [reverse]\n * @return {HTMLElement} focusedElement\n */\n focusNext(current = null, loop = true, reverse = false) {\n let foundCurrent = false;\n const array = reverse ? [...this.kbdNavChildren].reverse() : this.kbdNavChildren;\n for (const candidate of array) {\n if (!foundCurrent) {\n foundCurrent = (current\n ? (candidate === current)\n : (candidate.getAttribute('tabindex') === '0'));\n continue;\n }\n if (!candidate.hasAttribute('tabindex')) {\n continue;\n }\n if (candidate.getAttribute('aria-hidden') === 'true') {\n continue;\n }\n if (attemptFocus(candidate)) {\n this.ariaActiveDescendantElement = candidate;\n return candidate;\n }\n }\n\n if (!loop) {\n if (document.activeElement !== current && current instanceof HTMLElement) {\n current.focus();\n }\n return current;\n }\n // Loop\n for (const candidate of array) {\n if (!candidate.hasAttribute('tabindex')) {\n continue;\n }\n if (candidate.getAttribute('aria-hidden') === 'true') {\n continue;\n }\n // Abort if we've looped all the way back to original element\n // Abort if candidate received focus\n if (attemptFocus(candidate)) {\n return candidate;\n }\n if (candidate === current) {\n return candidate;\n }\n }\n return null;\n },\n\n /**\n * Alias for focusNext(list, current, true).\n * Selects previous element\n * @param {HTMLElement} [current]\n * @param {boolean} [loop=true]\n * @return {HTMLElement}\n */\n focusPrevious(current, loop = true) {\n return this.focusNext(current, loop, true);\n },\n\n /** @type {HTMLElement['focus']} */\n focus(...options) {\n // super.focus(...options);\n if (attemptFocus(this.ariaActiveDescendantElement, ...options)) {\n return;\n }\n for (const candidate of this.kbdNavChildren) {\n if (candidate.getAttribute('tabindex') === '0' && candidate instanceof HTMLElement) {\n this.ariaActiveDescendantElement = candidate;\n candidate.focus(...options);\n return;\n }\n }\n this.focusNext();\n },\n\n /**\n * Refreshes roving tab index attributes based on kbdNavChildren\n */\n refreshTabIndexes() {\n if (this.kbdNav !== 'true') return;\n /** @type {HTMLElement} */\n let currentlyFocusedChild = null;\n /** @type {HTMLElement} */\n let currentTabIndexChild = null;\n /** @type {HTMLElement} */\n let firstFocusableChild = null;\n for (const child of this.kbdNavChildren) {\n if (!currentlyFocusedChild && document.activeElement === child) {\n currentlyFocusedChild = child;\n } else if (!currentTabIndexChild && child.getAttribute('tabindex') === '0') {\n currentTabIndexChild = child;\n } else {\n if (!firstFocusableChild && child.getAttribute('aria-hidden') !== 'true'\n && (this.kbdNavFocusableWhenDisabled || child.getAttribute('aria-disabled') !== 'true')) {\n firstFocusableChild = child;\n }\n child.tabIndex = -1;\n // child.setAttribute('tabindex', '-1');\n }\n // Bind\n if (!child.hasAttribute('tabindex')) {\n child.tabIndex = (document.activeElement === child) ? 0 : -1;\n }\n // this.rtiBindChild(child);\n }\n if (currentlyFocusedChild) {\n currentlyFocusedChild.tabIndex = 0;\n // currentlyFocusedChild.setAttribute('tabindex', '0');\n } else if (currentTabIndexChild) {\n if (currentlyFocusedChild) {\n currentTabIndexChild.tabIndex = -1;\n // currentTabIndexChild.setAttribute('tabindex', '-1');\n }\n } else if (firstFocusableChild) {\n firstFocusableChild.tabIndex = 0;\n // firstFocusableChild.setAttribute('tabindex', '0');\n }\n },\n })\n .events({\n focusin(event) {\n if (this.kbdNav !== 'true') return;\n const currentItem = /** @type {HTMLElement} */ (event.target);\n const participates = currentItem.matches(this.kbdNavQuery);\n if (!participates) return;\n this.ariaActiveDescendantElement = currentItem;\n if (currentItem.getAttribute('tabindex') !== '0') {\n currentItem.tabIndex = 0;\n }\n for (const item of this.kbdNavChildren) {\n if (item !== currentItem && item.hasAttribute('tabindex')) {\n item.tabIndex = -1;\n // item.setAttribute('tabindex', '-1');\n }\n }\n },\n keydown(event) {\n if (event.ctrlKey || event.altKey || event.shiftKey || event.metaKey) return;\n if (this.kbdNav !== 'true') return;\n\n switch (event.key) {\n case 'ArrowUp':\n case 'Up':\n if (this._ariaOrientationIsVertical()) {\n this.focusPrevious();\n }\n break;\n case 'ArrowDown':\n case 'Down':\n if (this._ariaOrientationIsVertical()) {\n this.focusNext();\n }\n break;\n case 'ArrowLeft':\n case 'Left':\n if (this._ariaOrientationIsVertical()) return;\n if (isRtl(this)) {\n this.focusNext();\n } else {\n this.focusPrevious();\n }\n break;\n case 'ArrowRight':\n case 'Right':\n if (this._ariaOrientationIsVertical()) return;\n if (isRtl(this)) {\n this.focusPrevious();\n } else {\n this.focusNext();\n }\n break;\n default:\n return;\n }\n event.stopPropagation(); // Avoid kbd within kbd (sub menus)\n event.preventDefault();\n },\n })\n .on({\n connected() {\n this.refreshTabIndexes();\n },\n });\n}\n", "import KeyboardNavMixin from './KeyboardNavMixin.js';\n\n/**\n * @param {typeof import('../core/CustomElement.js').default} Base\n */\nexport default function AriaToolbarMixin(Base) {\n return Base\n .mixin(KeyboardNavMixin)\n .set({\n ariaOrientationDefault: 'horizontal',\n });\n}\n", "/**\n * @param {ReturnType<import('./StateMixin.js').default> & ReturnType<import('./ThemableMixin.js').default>} Base\n */\nexport default function SurfaceMixin(Base) {\n return Base\n .observe({\n elevated: 'boolean',\n elevation: 'integer',\n _raised: {\n type: 'boolean',\n get({ hoveredState, pressedState }) {\n return hoveredState && !pressedState;\n },\n },\n })\n .html`\n <div id=surface class=surface raised={_raised} disabled={disabledState} color={color}></div>\n `\n .css`\n :host {\n\n /** Filter blur is 1/2 CSS blur */\n \n /** Reference Properties */\n /*\n --mdw-surface__box-shadow__1__umbra: 0px 1px 2px 0px rgba(var(--mdw-color__shadow), 0.30);\n --mdw-surface__box-shadow__2__umbra: 0px 1px 2px 0px rgba(var(--mdw-color__shadow), 0.30);\n --mdw-surface__box-shadow__3__umbra: 0px 1px 3px 0px rgba(var(--mdw-color__shadow), 0.30);\n --mdw-surface__box-shadow__4__umbra: 0px 2px 3px 0px rgba(var(--mdw-color__shadow), 0.30);\n --mdw-surface__box-shadow__5__umbra: 0px 4px 4px 0px rgba(var(--mdw-color__shadow), 0.30);\n \n --mdw-surface__filter__0__umbra: drop-shadow(0px 1px 1px rgba(var(--mdw-color__shadow), 0));\n --mdw-surface__filter__1__umbra: drop-shadow(0px 1px 1px rgba(var(--mdw-color__shadow), 0.30));\n --mdw-surface__filter__2__umbra: drop-shadow(0px 1px 1px rgba(var(--mdw-color__shadow), 0.30));\n --mdw-surface__filter__3__umbra: drop-shadow(0px 1px 1.5px rgba(var(--mdw-color__shadow), 0.30));\n --mdw-surface__filter__4__umbra: drop-shadow(0px 2px 1.5px rgba(var(--mdw-color__shadow), 0.30));\n --mdw-surface__filter__5__umbra: drop-shadow(0px 4px 2px rgba(var(--mdw-color__shadow), 0.30));\n \n --mdw-surface__box-shadow__1__penumbra: 0px 1px 3px 1px rgba(var(--mdw-color__shadow), 0.15);\n --mdw-surface__box-shadow__2__penumbra: 0px 2px 6px 2px rgba(var(--mdw-color__shadow), 0.15);\n --mdw-surface__box-shadow__3__penumbra: 0px 4px 8px 3px rgba(var(--mdw-color__shadow), 0.15);\n --mdw-surface__box-shadow__4__penumbra: 0px 6px 10px 4px rgba(var(--mdw-color__shadow), 0.15);\n --mdw-surface__box-shadow__5__penumbra: 0px 8px 12px 6px rgba(var(--mdw-color__shadow), 0.15);\n \n --mdw-surface__filter__0__penumbra: drop-shadow(0px 1px 2.5px rgba(var(--mdw-color__shadow), 0));\n --mdw-surface__filter__1__penumbra: drop-shadow(0px 1px 2.5px rgba(var(--mdw-color__shadow), 0.25));\n --mdw-surface__filter__2__penumbra: drop-shadow(0px 2px 5px rgba(var(--mdw-color__shadow), 0.25));\n --mdw-surface__filter__3__penumbra: drop-shadow(0px 4px 7px rgba(var(--mdw-color__shadow), 0.263));\n --mdw-surface__filter__4__penumbra: drop-shadow(0px 6px 9px rgba(var(--mdw-color__shadow), 0.27));\n --mdw-surface__filter__5__penumbra: drop-shadow(0px 8px 12px rgba(var(--mdw-color__shadow), 0.30));\n \n --mdw-surface__filter__0: var(--mdw-surface__shadow__0__umbra) var(--mdw-surface__shadow__0__penumbra);\n --mdw-surface__filter__1: var(--mdw-surface__shadow__1__umbra) var(--mdw-surface__shadow__1__penumbra);\n --mdw-surface__filter__2: var(--mdw-surface__shadow__2__umbra) var(--mdw-surface__shadow__2__penumbra);\n --mdw-surface__filter__3: var(--mdw-surface__shadow__3__umbra) var(--mdw-surface__shadow__3__penumbra);\n --mdw-surface__filter__4: var(--mdw-surface__shadow__4__umbra) var(--mdw-surface__shadow__4__penumbra);\n --mdw-surface__filter__5: var(--mdw-surface__shadow__5__umbra) var(--mdw-surface__shadow__5__penumbra);\n */\n \n /** Flatten for performance */\n --mdw-surface__shadow__0: drop-shadow(0px 1px 001px rgba(0,0,0,000)) drop-shadow(0px 1px 2.5px rgba(0,0,0,00000));\n --mdw-surface__shadow__1: drop-shadow(0px 1px 001px rgba(0,0,0,0.3)) drop-shadow(0px 1px 2.5px rgba(0,0,0,0.250));\n --mdw-surface__shadow__2: drop-shadow(0px 1px 001px rgba(0,0,0,0.3)) drop-shadow(0px 2px 005px rgba(0,0,0,0.250));\n --mdw-surface__shadow__3: drop-shadow(0px 1px 1.5px rgba(0,0,0,0.3)) drop-shadow(0px 4px 007px rgba(0,0,0,0.263));\n --mdw-surface__shadow__4: drop-shadow(0px 2px 1.5px rgba(0,0,0,0.3)) drop-shadow(0px 6px 009px rgba(0,0,0,0.270));\n --mdw-surface__shadow__5: drop-shadow(0px 4px 2.0px rgba(0,0,0,0.3)) drop-shadow(0px 8px 012px rgba(0,0,0,0.300));\n\n /** Configurables */\n \n --mdw-surface__shadow__resting: none;\n --mdw-surface__shadow: var(--mdw-surface__shadow__resting);\n z-index: 0;\n }\n \n :host([elevation=\"0\"]) {\n --mdw-surface__shadow__resting: none;\n }\n \n :host([elevation=\"1\"]) {\n --mdw-surface__shadow__resting: var(--mdw-surface__shadow__1);\n }\n \n :host([elevation=\"2\"]) {\n --mdw-surface__shadow__resting: var(--mdw-surface__shadow__2);\n }\n \n :host([elevation=\"3\"]) {\n --mdw-surface__shadow__resting: var(--mdw-surface__shadow__3);\n }\n \n :host([elevation=\"4\"]) {\n --mdw-surface__shadow__resting: var(--mdw-surface__shadow__4);\n }\n \n :host([elevation=\"5\"]) {\n --mdw-surface__shadow__resting: var(--mdw-surface__shadow__5);\n }\n \n :host([elevation]) {\n --mdw-surface__shadow__raised: var(--mdw-surface__shadow__resting);\n }\n \n .surface {\n position: absolute;\n inset: 0;\n \n pointer-events: none;\n \n filter: var(--mdw-surface__shadow);\n z-index: -1;\n \n transition-delay: 1ms;\n transition-duration: 200ms;\n transition-property: filter;\n transition-timing-function: linear;\n will-change: filter;\n }\n \n .surface[raised] {\n filter: var(--mdw-surface__shadow__raised, var(--mdw-surface__shadow__resting));\n }\n \n .surface[disabled] {\n filter:none;\n }\n `;\n}\n", "import CustomElement from '../core/CustomElement.js';\nimport FlexableMixin from '../mixins/FlexableMixin.js';\nimport ShapeMixin from '../mixins/ShapeMixin.js';\nimport SurfaceMixin from '../mixins/SurfaceMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\nexport default CustomElement\n .extend()\n .mixin(ThemableMixin)\n .mixin(FlexableMixin)\n .mixin(SurfaceMixin)\n .mixin(ShapeMixin)\n .html`<slot id=slot></slot>`\n .on({\n composed() {\n const { surface, shape } = this.refs;\n surface.append(shape);\n },\n })\n .css`\n :host {\n --mdw-shape__bg: rgb(var(--mdw-color__surface));\n --mdw-ink: var(--mdw-color__on-surface);\n position: relative;\n \n color: rgb(var(--mdw-ink));\n \n font: var(--mdw-type__font);\n letter-spacing: var(--mdw-type__letter-spacing);\n } \n `\n .autoRegister('mdw-surface');\n", "import AriaReflectorMixin from '../mixins/AriaReflectorMixin.js';\nimport AriaToolbarMixin from '../mixins/AriaToolbarMixin.js';\n\nimport Surface from './Surface.js';\n\n/**\n * Note: FAB does not exist inside because FABs can appear outside.\n * Space will be maintained for the FAB to slide into position. FAB should be\n * next on the DOM, so users can logically tab to it.\n */\n\nexport default Surface\n .extend()\n .mixin(AriaToolbarMixin)\n .mixin(AriaReflectorMixin)\n .set({\n elevated: true,\n _ariaRole: 'toolbar',\n })\n .observe({\n color: { empty: 'surface-container' },\n })\n .css`\n /* https://m3.material.io/components/bottom-app-bar/specs */\n\n :host {\n --mdw-bg: var(--mdw-color__surface-container);\n --mdw-ink: var(--mdw-color__on-surface);\n\n display: flex;\n align-items: center;\n gap: 8px;\n justify-content: flex-start;\n\n box-sizing: content-box;\n /* Don't apply density */\n block-size: 56px;\n padding-block: 12px;\n padding-inline: 8px 16px;\n\n box-shadow: none;\n\n direction: ltr;\n }\n `\n .autoRegister('mdw-bottom-app-bar');\n", "// import fontStyles from 'https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:FILL@0..1&display=block' assert { type: 'css'};\n\nimport CustomElement from '../core/CustomElement.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\n/** @type {Map<string, {path:string, viewBox:string}>} */\nconst svgAliasMap = new Map();\nconst unaliased = new Set();\n\nconst documentLoadedStyleSheets = new Set();\n\n/** @typedef {'align'|'border'|'hspace'|'longDesc'|'lowsrc'|'name'|'vspace'} DeprecatedHTMLImageElementProperties */\n\n// https://html.spec.whatwg.org/multipage/embedded-content.html#htmlimageelement\n\n/** @implements {Omit<HTMLImageElement,DeprecatedHTMLImageElementProperties>} */\nexport default class Icon extends CustomElement\n .extend()\n .mixin(ThemableMixin)\n .define({\n _img() { return /** @type {HTMLImageElement} */ (this.refs.img); },\n })\n .define({\n naturalWidth() { return this._img.naturalWidth; },\n naturalHeight() { return this._img.naturalHeight; },\n complete() { return this._img.complete; },\n currentSrc() { return this._img.currentSrc; },\n x() { return this._img.x; },\n y() { return this._img.y; },\n decode() { return this._img.decode; },\n })\n .observe({\n _slottedText: 'string',\n disabled: 'boolean',\n alt: 'string',\n src: 'string',\n svg: 'string',\n svgPath: 'string',\n srcset: 'string',\n sizes: 'string',\n crossOrigin: { attr: 'crossorigin' },\n useMap: { attr: 'usemap' },\n isMap: { type: 'boolean', attr: 'ismap' },\n referrerPolicy: { attr: 'referrerpolicy' },\n decoding: { value: /** @type {'async'|'sync'|'auto'} */ (null) },\n loading: { value: /** @type {'eager'|'lazy'} */ (null) },\n width: 'integer',\n height: 'integer',\n forceFont: 'boolean',\n _linkLoaded: 'boolean',\n viewBox: 'string',\n fontClass: { empty: 'material-symbols-outlined' },\n fontLibrary: { empty: 'https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:FILL@0..1&display=block' },\n })\n .observe({\n _svgAlias: {\n type: 'object',\n get({ _slottedText }) {\n if (!_slottedText) return null;\n const result = svgAliasMap.get(_slottedText.trim().toLowerCase());\n if (!result) {\n unaliased.add(_slottedText);\n console.warn(`Icon: No SVG alias for ${JSON.stringify([...unaliased])}`);\n }\n return result;\n },\n },\n })\n .observe({\n _computedSVGPath({ svgPath, _svgAlias }) {\n return svgPath || _svgAlias?.path;\n },\n _computedViewBox({ viewBox, _svgAlias }) {\n return viewBox ?? _svgAlias?.viewBox ?? '0 0 24 24';\n },\n })\n .observe({\n _showSlot: {\n type: 'boolean',\n get({ _slottedText, svg, _computedSVGPath, src }) {\n return _slottedText && !svg && !_computedSVGPath && !src;\n },\n },\n })\n .expressions({\n showSVG({ svg, _computedSVGPath }) {\n return Boolean(svg || _computedSVGPath);\n },\n\n })\n .html`\n <link mdw-if={_showSlot} id=link rel=stylesheet href={fontLibrary} />\n <svg mdw-if=\"{showSVG}\" id=\"svg\" viewBox=\"{_computedViewBox}\">\n <use id=\"use\" mdw-if=\"{svg}\" href=\"{svg}\" fill=\"currentColor\"/>\n <path id=\"path\" mdw-if=\"{_computedSVGPath}\" d=\"{_computedSVGPath}\"/>\n </svg>\n <img mdw-if={src} id=img\n disabled={disabled}\n alt={alt} src={src} srcset={srcset} sizes={sizes}\n crossorigin={crossOrigin} usemap={useMap} ismap={isMap}\n referrerpolicy={referrerPolicy} decoding={decoding} loading={loading}\n width={width} height={height}\n />\n <slot id=icon class={fontClass} hidden={!_showSlot} aria-hidden=true></slot>\n `\n .css`\n /* https://material.io/design/iconography/system-icons.html */\n\n :host {\n display: inline-block;\n vertical-align: -11.5%;\n\n block-size: 1em;\n inline-size: 1em;\n\n -webkit-user-select: none;\n user-select: none;\n\n font-variation-settings: 'FILL' 1;\n\n transition-duration: 200ms;\n /* stylelint-disable-next-line liberty/use-logical-spec -- Safari does not animate inline-size */\n transition-property: inline-size, width;\n }\n\n :host(:is([color],[ink])) {\n color: rgb(var(--mdw-ink));\n }\n\n #icon {\n /* Clip bounds in case font is not ready */\n display: block;\n overflow: clip;\n\n block-size: 1em;\n inline-size: 1em;\n\n font-size: inherit;\n font-variation-settings: inherit;\n\n transition-delay: 1ms;\n transition-duration: 200ms;\n\n transition-property: font-variation-settings;\n }\n\n #icon[hidden] {\n display: none;\n }\n\n #svg {\n display: block;\n\n block-size: inherit;\n inline-size: inherit;\n\n fill: currentColor;\n\n object-fit: cover;\n }\n\n #img {\n display: block;\n\n block-size: inherit;\n inline-size: inherit;\n\n object-fit: cover;\n\n transition-delay: 1ms;\n transition-duration: 200ms;\n transition-property: filter;\n }\n\n #img[disabled] {\n filter: grayscale();\n }\n\n .material-symbols-outlined {\n /* https://github.com/google/material-design-icons/issues/750 */\n direction: inherit;\n }\n\n `\n .childEvents({\n icon: {\n slotchange() {\n this._slottedText = this.textContent;\n },\n },\n link: {\n /**\n * @param {{currentTarget: HTMLLinkElement}} event\n * @type {any}\n */\n load({ currentTarget }) {\n const { href, parentNode } = currentTarget;\n if (!parentNode) {\n console.warn('Icon: parentNode is blank');\n }\n if (documentLoadedStyleSheets.has(href)) return;\n console.debug('Icon: Checking if link also in document', href);\n for (const link of document.head.getElementsByTagName('link')) {\n if (link.href === href) {\n console.debug(`Icon: Found ${href} in document.`);\n documentLoadedStyleSheets.add(href);\n return;\n }\n }\n console.debug(`Icon: Adding ${href} to document.`);\n document.head.append(currentTarget.cloneNode());\n documentLoadedStyleSheets.add(href);\n },\n },\n }) {\n static get svgAliasMap() { return svgAliasMap; }\n\n static get svgUnaliased() { return unaliased; }\n\n /**\n * @param {string} name\n * @param {string} path\n * @param {string} [viewBox]\n */\n static addSVGAlias(name, path, viewBox = '0 0 24 24') {\n name = name.toLowerCase();\n if (path) {\n svgAliasMap.set(name, { path, viewBox });\n } else {\n svgAliasMap.delete(name);\n }\n }\n\n /**\n * @param {number} [width]\n * @param {number} [height]\n */\n constructor(width, height) {\n super();\n\n if (width != null) {\n this.width = width;\n }\n if (height != null) {\n this.height = height;\n }\n }\n}\n\nIcon.autoRegister('mdw-icon');\n", "/* https://html.spec.whatwg.org/multipage/form-control-infrastructure.html */\n\n/** @typedef {HTMLElement & {value:string}} HTMLControlElement */\n\n/** @typedef {import('../core/CustomElement.js').default} CustomElement */\n\nconst FORM_IPC_EVENT = 'mdw-form-associated-changed';\n\nconst DOMString = { nullParser: String, value: '' };\n\n/**\n * @param {ReturnType<import('./StateMixin.js').default>} Base\n */\nexport default function FormAssociatedMixin(Base) {\n return Base\n .setStatic({\n formAssociated: true,\n })\n .set({\n /** @type {EventListener} */\n _ipcListener: null,\n /** @type {EventTarget} */\n _ipcTarget: null,\n })\n .observe({\n ariaControls: 'string',\n autocomplete: DOMString,\n name: DOMString,\n readOnly: { attr: 'readonly', type: 'boolean' },\n defaultChecked: { attr: 'checked', type: 'boolean' },\n _checkedDirty: 'boolean',\n /* \"Checkedness\" */\n _checked: 'boolean',\n required: 'boolean',\n type: DOMString,\n // [CEReactions] attribute [LegacyNullToEmptyString] DOMString value;\n _defaultValue: { reflect: true, attr: 'value' },\n _value: { empty: '' },\n _valueDirty: 'boolean',\n _userInteracted: 'boolean',\n _invalid: 'boolean',\n _badInput: 'boolean',\n _validationMessage: 'string',\n _formDisabled: 'boolean',\n _formReset: 'boolean',\n })\n .observe({\n erroredState({ _invalid, _userInteracted }) { return _userInteracted && _invalid; },\n defaultValue: {\n reflect: false,\n get({ _defaultValue }) {\n return _defaultValue ?? '';\n },\n set(value) {\n this._defaultValue = String(value);\n },\n },\n _valueBehavior({ type }) {\n switch (type) {\n case 'radio':\n case 'checkbox':\n return 'default/on';\n case 'hidden':\n case 'button':\n case 'submit':\n case 'image':\n case 'reset':\n return 'default';\n case 'file': return 'filename';\n default: return 'value';\n }\n },\n })\n .methods({\n /**\n * Default behavior can should likely be overridden\n * @param {string} value\n */\n _onSetValue(value) {\n this._value = value;\n },\n /**\n * Default behavior can should likely be overridden\n * @param {boolean} checked\n */\n _onSetChecked(checked) {\n this._checked = checked;\n },\n })\n .observe({\n value: {\n reflect: false,\n get({ _valueBehavior, _defaultValue, _value }) {\n switch (_valueBehavior) {\n default:\n return _value;\n case 'default':\n return _defaultValue ?? '';\n case 'default/on':\n return _defaultValue ?? 'on';\n case 'filename':\n throw new Error('Not supported!');\n }\n },\n /** @param {string} v */\n set(v) {\n switch (this._valueBehavior) {\n case 'value':\n this._valueDirty = true;\n this._onSetValue(v);\n break;\n default:\n this.defaultValue = v;\n }\n },\n },\n /**\n * Part of FormAssociatedMixin for simplicity.\n * Enumerability doesn't guarantee checked state will be passed or used.\n */\n checked: {\n reflect: false,\n type: 'boolean',\n get({ _checked }) {\n return _checked;\n },\n /** @param {boolean} checked */\n set(checked) {\n this._checkedDirty = true;\n this._onSetChecked(checked);\n },\n },\n })\n .define({\n form() { return this.elementInternals.form; },\n validity() { return this.elementInternals.validity; },\n validationMessage() { return this.elementInternals.validationMessage; },\n willValidate() { return this.elementInternals.willValidate; },\n labels() { return this.elementInternals.labels; },\n })\n .observe({\n disabledState({ _formDisabled, disabled }) {\n if (_formDisabled) return true;\n return !!disabled;\n },\n })\n .methods({\n checkValidity() { return this.elementInternals.checkValidity(); },\n\n reportValidity() { return this.elementInternals.reportValidity(); },\n\n /**\n * @param {string} error\n * @return {void}\n */\n setCustomValidity(error) {\n this.elementInternals.setValidity({\n ...this.elementInternals.validity,\n customError: !!error,\n }, this.elementInternals.validationMessage || error);\n },\n\n /**\n * @param {string} key\n * @param {string} value\n * @return {void}\n */\n _notifyRadioChange(key, value) {\n this._ipcTarget?.dispatchEvent(\n new CustomEvent(FORM_IPC_EVENT, { detail: [key, value] }),\n );\n },\n\n refreshFormAssociation() {\n const newTarget = this.elementInternals.form ?? this.getRootNode();\n if (newTarget === this._ipcTarget) {\n // console.warn('Already associated?', newTarget);\n return;\n }\n if (this._ipcTarget) {\n this._ipcTarget.removeEventListener(FORM_IPC_EVENT, this._ipcListener);\n }\n if (this.type !== 'radio') return;\n\n this._ipcTarget = newTarget;\n this._ipcListener ??= this.formIPCEvent.bind(this);\n this._ipcTarget.addEventListener(FORM_IPC_EVENT, this._ipcListener);\n },\n\n /**\n * New lifecycle callback. This is called when association with\n * <form> is changed.\n * @param {HTMLFormElement?} form\n * @return {void}\n */\n formAssociatedCallback(form) {\n this.refreshFormAssociation();\n console.debug('FormAssociatedMixin: formAssociatedCallback', this);\n this.checkValidity();\n },\n\n /**\n * @param {CustomEvent<[string, string]>} event\n * @return {void}\n */\n formIPCEvent(event) {\n if (event.target instanceof HTMLFormElement && event.target !== this.form) {\n console.warn('Control.formIPCEvent: Abort from wrong form');\n return;\n }\n if (this.type !== 'radio') {\n console.warn('Control.formIPCEvent: Abort from not radio');\n return;\n }\n const [name, value] = event.detail;\n if (this.name !== name) return;\n if (value === this.value) {\n // console.log('Control.formIPCEvent: Continue match', this.name, this.value);\n } else {\n console.debug('FormAssociatedMixin: Unchecking', this);\n this.checked = false;\n }\n },\n\n /** @param {boolean} disabled */\n formDisabledCallback(disabled) {\n this._formDisabled = disabled;\n },\n\n formResetCallback() {\n this._formReset = true; // Fires Change Event\n this._valueDirty = false;\n this.checkValidity();\n this._formReset = false;\n },\n\n /**\n * @param {string|FormData} state\n * @param {'autocomplete'|'restore'} mode\n */\n formStateRestoreCallback(state, mode) {\n if (navigator.userAgent.includes('Chrome/')) {\n // console.warn('Chromium Bug: 1429585 - Ignoring formStateRestoreCallback on Chromium', { state, mode });\n // formStateRestoreCallback is broken on Chromium\n // https://bugs.chromium.org/p/chromium/issues/detail?id=1429585\n return;\n }\n if (typeof state !== 'string') {\n console.warn('FormAssociatedMixin: (Restore) Could not restore', state);\n return;\n }\n if (this.type === 'checkbox' || this.type === 'radio') {\n console.debug('FormAssociatedMixin: (Restore) Setting Checkbox checked state.', state, this);\n this.checked = (state === 'checked');\n return;\n }\n if (this.type === 'radio') {\n // Due to lifecycle quirks, other radio elements on the page may not have\n // been upgraded to Custom Element yet and would not receive\n // the 'uncheck' communication. Delay notice until then.\n this.checked = (state === 'checked');\n return;\n }\n\n console.debug('FormAssociatedMixin: (Restore) Setting value state.', state, this);\n this.value = state;\n },\n\n _updateFormAssociatedValue() {\n switch (this.type) {\n case 'radio':\n if (this.checked) {\n this._notifyRadioChange(this.name, this.value || 'on');\n }\n // Fallthrough\n case 'checkbox':\n if (this.checked) {\n // console.debug('FormAssociatedMixin: setFormValue', this.name, `(${this.value}, 'checked')`, this);\n this.elementInternals.setFormValue(this.value, 'checked');\n } else {\n // console.debug('FormAssociatedMixin: setFormValue', this.name, \"(null, 'unchecked')\", this);\n this.elementInternals.setFormValue(null, 'unchecked');\n }\n break;\n default:\n // console.debug('FormAssociatedMixin: setFormValue', this.name, this.value, this);\n this.elementInternals.setFormValue(this.value);\n }\n },\n })\n .events({\n blur() {\n this._userInteracted = true;\n this.checkValidity();\n },\n })\n .on({\n connected() {\n // Bind to global if no form is present (used by radio)\n this.refreshFormAssociation();\n },\n checkedChanged() {\n this._updateFormAssociatedValue();\n },\n valueChanged() {\n this._updateFormAssociatedValue();\n },\n });\n}\n", "/* https://html.spec.whatwg.org/multipage/form-control-infrastructure.html */\n\nimport { cloneAttributeCallback } from '../core/CustomElement.js';\n\nimport FormAssociatedMixin from './FormAssociatedMixin.js';\n\n/** @typedef {import('../core/CustomElement.js').default} CustomElement */\n\n/** @typedef {'align'|'useMap'} DeprecatedHTMLInputElementProperties */\n\n/** @typedef {HTMLInputElement|HTMLTextAreaElement|HTMLSelectElement} HTMLControlElement */\n\n/**\n * @param {ReturnType<import('./StateMixin.js').default>} Base\n */\nexport default function ControlMixin(Base) {\n return Base\n .mixin(FormAssociatedMixin)\n .observe({\n ariaLabel: 'string',\n })\n .set({\n delegatesFocus: true,\n focusableOnDisabled: false,\n controlTagName: 'input',\n controlVoidElement: true,\n })\n .methods({\n onValueChangingContentAttribute() {\n const control = /** @type {HTMLControlElement} */ (this.refs.control);\n\n if (!this.hasAttribute('value')) {\n // Force HTMLInputElement to recalculate default\n // Unintended effect of incrementally changing attributes (eg: range)\n control.removeAttribute('value'); // Firefox will not run steps unless value is changed (remove first)\n control.setAttribute('value', ''); // Chrome needs to know to reset\n }\n // Changing control attribute may change the value (eg: min/max)\n this._value = control.value;\n },\n /** @type {HTMLElement['focus']} */\n focus(...options) {\n this.refs.control.focus(...options);\n },\n /** Redirect click requests to control itself */\n click() {\n console.log('ControlMixin: Click');\n this.refs.control.click();\n },\n })\n .define({\n stateTargetElement() { return this.refs.control; },\n form() { return this.elementInternals.form; },\n validity() { return this.elementInternals.validity; },\n validationMessage() { return this.elementInternals.validationMessage; },\n willValidate() { return this.elementInternals.willValidate; },\n labels() { return this.elementInternals.labels; },\n })\n .methods({\n checkValidity() {\n const control = /** @type {HTMLControlElement} */ (this.refs.control);\n const validityState = control.checkValidity();\n /** @type {Partial<ValidityState>} */\n const newValidity = {};\n\n // eslint-disable-next-line guard-for-in\n for (const key in control.validity) {\n // @ts-ignore Skip cast\n newValidity[key] = control.validity[key];\n }\n this.elementInternals.setValidity(newValidity, control.validationMessage, control);\n this._invalid = !validityState;\n this._validationMessage = control.validationMessage;\n this._badInput = control.validity.badInput;\n return validityState;\n },\n reportValidity() {\n this.checkValidity();\n /** @type {HTMLControlElement} */ (this.refs.control).reportValidity();\n return this.elementInternals.reportValidity();\n },\n /**\n * @param {string} error\n * @return {void}\n */\n setCustomValidity(error) {\n /** @type {HTMLControlElement} */ (this.refs.control).setCustomValidity(error);\n this.checkValidity();\n this.elementInternals.setValidity(\n {\n ...this.elementInternals.validity,\n customError: !!error,\n },\n this.elementInternals.validationMessage || error,\n this.refs.control,\n );\n },\n\n })\n .on({\n // Wait until controlTagName is settled before templating\n composed({ template, html }) {\n template.append(html`\n <${this.controlTagName} id=control \n aria-labelledby=${({ ariaLabel }) => (ariaLabel ? null : 'slot')}\n part=control\n aria-label={ariaLabel}\n form-disabled={disabledState}\n type={type}\n >${this.controlVoidElement ? '' : `</${this.controlTagName}>`}\n `);\n },\n disabledStateChanged(oldValue, newValue) {\n const control = /** @type {HTMLControlElement} */ (this.refs.control);\n control.setAttribute('aria-disabled', `${newValue}`);\n if (!this.focusableOnDisabled) {\n control.disabled = newValue;\n if (newValue) {\n this.tabIndex = 0;\n } else {\n this.removeAttribute('tabindex');\n }\n }\n },\n constructed() {\n const control = /** @type {HTMLControlElement} */ (this.refs.control);\n this._value = control.value;\n },\n connected() {\n // Expose this element as focusable\n if (!this.hasAttribute('tabindex')) {\n this.tabIndex = 0;\n }\n },\n attrs: {\n autocomplete: cloneAttributeCallback('autocomplete', 'control'),\n name: cloneAttributeCallback('name', 'control'),\n readonly: cloneAttributeCallback('readonly', 'control'),\n required: cloneAttributeCallback('required', 'control'),\n },\n })\n .childEvents({\n control: {\n invalid() {\n console.debug('ControlMixin: invalid', this);\n },\n input({ currentTarget }) {\n console.debug('ControlMixin: input');\n const control = /** @type {HTMLControlElement} */ (currentTarget);\n if (this.validity.valid) {\n // Track internally\n control.checkValidity();\n this._badInput = control.validity.badInput;\n } else {\n // Perform check in case user has validated\n this.checkValidity();\n }\n this._value = control.value;\n },\n change({ currentTarget }) {\n console.debug('ControlMixin: change');\n const control = /** @type {HTMLControlElement} */ (currentTarget);\n this._valueDirty = true;\n this._value = control.value;\n this.checkValidity();\n // Change event is NOT composed. Needs to escape shadow DOM\n this.dispatchEvent(new Event('change', { bubbles: true }));\n },\n },\n })\n .css`\n :host {\n display: inline-flex;\n }\n \n /* Remove Firefox inner */\n :host(::-moz-focus-inner) {\n border: 0;\n }\n\n #control {\n /* Control is the touch target */\n /* Firefox requires at least 1px \"visible\" for screen reading */\n /* Safari will not allow interaction with 0 opacity */\n /* Chrome will not focus with visibility:hidden */\n \n position: absolute;\n /* stylelint-disable-next-line liberty/use-logical-spec */\n top: 50%;\n /* stylelint-disable-next-line liberty/use-logical-spec */\n left: 50%;\n \n /* --mdw-device-pixel-ratio: 1; */\n \n block-size: 100%;\n min-block-size: 48px;\n inline-size:100%;\n min-inline-size: 48px;\n margin: 0;\n border: 0;\n padding: 0;\n \n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n \n cursor: auto;\n outline: none;\n \n pointer-events: auto;\n \n transform: translateX(-50%) translateY(-50%);\n \n /* Safari and Chrome will emit two click events if not at top of stack */\n /* Allows up to 3 other layers (eg: ripple, outline) */\n z-index: 4;\n \n background-color: transparent;\n \n border-radius: 0;\n color: transparent;\n }\n \n #control::-moz-focus-inner {\n border: 0;\n }\n \n `;\n}\n", "import { cloneAttributeCallback } from '../core/CustomElement.js';\n\nimport ControlMixin from './ControlMixin.js';\n\n/** @typedef {'align'|'useMap'} DeprecatedHTMLInputElementProperties */\n\n/** @typedef {import('../core/CustomElement.js').default} CustomElement */\n\nconst IMPLICIT_SUBMISSION_BLOCKING_TYPES = new Set([\n 'text',\n 'search',\n 'url',\n 'tel',\n 'email',\n 'password',\n 'date',\n 'month',\n 'week',\n 'time',\n 'datetime-local',\n 'number',\n]);\n\nconst DOMString = { nullParser: String, empty: '' };\n\n/**\n * @see https://html.spec.whatwg.org/multipage/input.html#htmlinputelement\n * @param {ReturnType<import('./StateMixin.js').default>} Base\n */\nexport default function InputMixin(Base) {\n return Base\n .mixin(ControlMixin)\n .observe({\n accept: DOMString,\n alt: DOMString,\n dirName: { attr: 'dirname', ...DOMString },\n _formAction: { attr: 'formaction' },\n formEnctype: { attr: 'formenctype', ...DOMString },\n formMethod: { attr: 'formmethod', ...DOMString },\n formNoValidate: { attr: 'formNoValidate', type: 'boolean' },\n formTarget: { attr: 'formtarget', ...DOMString },\n _height: { attr: 'height', type: 'integer' },\n indeterminate: { type: 'boolean', reflect: false },\n max: DOMString,\n maxLength: { attr: 'maxlength', type: 'integer', empty: -1 },\n min: DOMString,\n minLength: { attr: 'minlength', type: 'integer', empty: -1 },\n multiple: 'boolean',\n pattern: DOMString,\n placeholder: DOMString,\n size: { type: 'integer', empty: 20 },\n src: DOMString,\n step: DOMString,\n // [CEReactions] attribute [LegacyNullToEmptyString] DOMString value;\n _width: { attr: 'width', type: 'integer' },\n })\n .define({\n // Alias for typescript\n _input() { return /** @type {HTMLInputElement} */ (this.refs.control); },\n })\n .overrides({\n controlTagName: 'input',\n })\n .on({\n composed() {\n const { control } = this.refs;\n control.setAttribute('checked', '{defaultChecked}');\n control.setAttribute('height', '{_height}');\n control.setAttribute('width', '{_width}');\n control.setAttribute('value', '{_defaultValue}');\n },\n\n // TODO: Bind multiple\n typeChanged() { this.onValueChangingContentAttribute(); },\n defaultCheckedChanged() {\n this._checked = this._input.checked;\n },\n minChanged() { this.onValueChangingContentAttribute(); },\n minLengthChanged() { this.onValueChangingContentAttribute(); },\n maxChanged() { this.onValueChangingContentAttribute(); },\n maxLengthChanged() { this.onValueChangingContentAttribute(); },\n multipleChanged() { this.onValueChangingContentAttribute(); },\n patternChanged() { this.onValueChangingContentAttribute(); },\n stepChanged() { this.onValueChangingContentAttribute(); },\n defaultValueChanged() { this.onValueChangingContentAttribute(); },\n _formResetChanged(oldValue, newValue) {\n if (!newValue) return;\n console.log('form reset');\n const input = this._input;\n input.value = this.defaultValue;\n input.checked = this.defaultChecked;\n this._value = input.value;\n this._checked = input.checked;\n this._checkedDirty = false;\n },\n attrs: {\n accept: cloneAttributeCallback('accept', 'control'),\n alt: cloneAttributeCallback('alt', 'control'),\n dirname: cloneAttributeCallback('dirname', 'control'),\n formenctype: cloneAttributeCallback('formenctype', 'control'),\n formmethod: cloneAttributeCallback('formmethod', 'control'),\n formnovalidate: cloneAttributeCallback('formnovalidate', 'control'),\n formTarget: cloneAttributeCallback('formTarget', 'control'),\n max: cloneAttributeCallback('max', 'control'),\n maxlength: cloneAttributeCallback('maxlength', 'control'),\n min: cloneAttributeCallback('min', 'control'),\n minlength: cloneAttributeCallback('minlength', 'control'),\n multiple: cloneAttributeCallback('multiple', 'control'),\n pattern: cloneAttributeCallback('pattern', 'control'),\n placeholder: cloneAttributeCallback('placeholder', 'control'),\n size: cloneAttributeCallback('size', 'control'),\n src: cloneAttributeCallback('src', 'control'),\n step: cloneAttributeCallback('step', 'control'),\n },\n })\n .overrides({\n _onSetChecked(checked) {\n // Apply user value to input and read back result to apply control to parse\n this._input.checked = checked;\n this._checked = this._input.checked;\n },\n _onSetValue(value) {\n // Apply user value to input and read back result to apply control to parse\n this._input.value = value;\n this._value = this._input.value;\n },\n })\n .methods({\n /**\n * @see https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#implicit-submission\n * @param {Event} event\n * @return {void}\n */\n performImplicitSubmission(event) {\n const form = this.form;\n if (!form) return;\n /** @type {HTMLInputElement} */\n let defaultButton;\n const submissionBlockers = new Set();\n for (const element of /** @type {HTMLCollectionOf<HTMLInputElement>} */ (form.elements)) {\n if (element.type === 'submit' && !element.disabled && !element.matches(':disabled')) {\n defaultButton ??= element;\n break;\n }\n\n if (IMPLICIT_SUBMISSION_BLOCKING_TYPES.has(element.type)) {\n submissionBlockers.add(element);\n }\n }\n if (defaultButton) {\n defaultButton.click();\n return;\n }\n if (submissionBlockers.size > 1) return;\n this.form.submit();\n },\n\n })\n .childEvents({\n control: {\n keydown(event) {\n if (event.defaultPrevented) return;\n if (event.key !== 'Enter') return;\n if (/** @type {HTMLInputElement} */ (event.currentTarget).type === 'submit') return;\n this.performImplicitSubmission(event);\n },\n change(event) {\n if (this.disabledState) {\n event.preventDefault();\n event.stopImmediatePropagation();\n return;\n }\n const input = /** @type {HTMLInputElement} */ (event.currentTarget);\n this._checkedDirty = true;\n this._checked = input.checked;\n },\n },\n })\n .define({\n files() { return this._input.files; },\n\n select() { return this._input.select; },\n\n selectionDirection: {\n get() { return this._input.selectionDirection; },\n set(value) { this._input.selectionDirection = value; },\n },\n\n selectionEnd: {\n get() { return this._input.selectionEnd; },\n set(value) { this._input.selectionEnd = value; },\n },\n\n selectionStart: {\n get() { return this._input.selectionStart; },\n set(value) { this._input.selectionStart = value; },\n },\n\n setRangeText() { return this._input.setRangeText; },\n\n setSelectionRange() { return this._input.setSelectionRange; },\n\n showPicker() { return this._input.showPicker; },\n\n stepDown() { return this._input.stepDown; },\n\n stepUp() { return this._input.stepUp; },\n\n valueAsDate: {\n get() { return this._input.valueAsDate; },\n set(value) {\n this._input.valueAsDate = value;\n this.value = this._input.value;\n },\n },\n\n valueAsNumber: {\n get() { return this._input.valueAsNumber; },\n set(value) {\n this._input.valueAsNumber = value;\n this.value = this._input.value;\n },\n },\n\n height: {\n get() { return this._input.height; },\n set(value) {\n this._input.height = value;\n this._height = value;\n },\n },\n\n formAction: {\n get() { return this._input.formAction; },\n set(value) {\n this._input.formAction = value;\n this._formAction = value;\n },\n },\n\n width: {\n get() { return this._input.width; },\n set(value) {\n this._input.width = value;\n this._width = value;\n },\n },\n });\n}\n", "/** @typedef {import('./CustomElement').default} CustomElement */\n\n/**\n * @see https://html.spec.whatwg.org/multipage/webappapis.html#event-handler-attributes\n * @type {import('./typings.js').ObserverOptions<'function',EventListener, unknown>}\n */\nexport const EVENT_HANDLER_TYPE = {\n type: 'function',\n reflect: 'read',\n value: null,\n parser(v) { return v; },\n attributeChangedCallback(name, oldValue, newValue) {\n if (oldValue == null && newValue == null) return;\n // Must continue even if oldValue === newValue;\n if (newValue == null) {\n this[name] = null;\n return;\n }\n // Assign to temp element, allow it to parse and then copy result.\n // Let browser parse instead of using eval()\n // CSP Violations will be thrown by browser on failure and result in `null`\n const button = document.createElement('button');\n button.setAttribute('onclick', newValue);\n const fn = button.onclick;\n button.remove();\n this[name] = fn;\n },\n propChangedCallback(name, oldValue, newValue) {\n const eventName = name.slice(2);\n if (oldValue) {\n this.removeEventListener(eventName, oldValue);\n }\n if (newValue) {\n this.addEventListener(eventName, newValue);\n }\n },\n};\n\nconst weakRefValues = new WeakMap();\n\n/**\n * @type {import('./typings.js').ObserverOptions<'object',HTMLElement>}\n */\nexport const WEAKREF_TYPE = {\n type: 'object',\n reflect: false,\n value: null,\n parser(v) { return new WeakRef(v); },\n get() {\n if (weakRefValues.has(this)) {\n return weakRefValues.get(this).deref();\n }\n return undefined;\n },\n};\n\n/**\n * @typedef {Object} ElementStylerOptions\n * @prop {string|HTMLElement|null} target tag, element or null (host)\n * @prop {Keyframe} styles\n * @prop {EffectTiming} [timing]\n */\n\n/** @type {WeakMap<CustomElement, Set<string>} */\nconst queuedPropsByElement = new WeakMap();\n\n/** @type {WeakMap<CustomElement, Map<string, Animation>>} */\nconst previousAnimationsByElement = new WeakMap();\n\n/**\n * @param {string} name\n * @this {CustomElement}\n */\nfunction elementStylerMicrotaskCallback(name) {\n const previousAnimations = previousAnimationsByElement.get(this);\n /** @type {Animation} */\n let previousAnimation;\n if (previousAnimations?.has(name)) {\n previousAnimation = previousAnimations.get(name);\n }\n const value = this[name];\n if (!value) {\n previousAnimation?.cancel();\n return;\n }\n const { target, styles, timing } = value;\n /** @type {HTMLElement} */\n const el = target\n ? (typeof target === 'string' ? this.refs[target] : target)\n : this;\n const currentAnimation = el.animate(styles, {\n ...timing,\n fill: 'forwards',\n });\n currentAnimation.onremove = () => {\n previousAnimation?.effect.updateTiming({\n fill: 'none',\n });\n // Destroy previous manually to avoid leak\n previousAnimation?.finish();\n previousAnimation?.cancel();\n previousAnimation = null;\n };\n if (previousAnimations) {\n previousAnimations.set(name, currentAnimation);\n } else {\n previousAnimationsByElement.set(this, new Map([[name, currentAnimation]]));\n }\n queuedPropsByElement.get(this).delete(name);\n}\n\n/** @type {import('./typings.js').ObserverOptions<'object',ElementStylerOptions, CustomElement>} */\nexport const ELEMENT_STYLER_TYPE = {\n type: 'object',\n reflect: false,\n diff: null, // Skip computing entire change\n propChangedCallback(name, oldValue, newValue) {\n if (!this.isConnected) return;\n const queuedProps = queuedPropsByElement.get(this);\n let hasQueue = false;\n if (queuedProps?.has(name)) {\n hasQueue = true;\n }\n if (!newValue) {\n if (!hasQueue) return;\n console.warn('debug of cancel needed');\n if (queuedProps) {\n queuedProps.delete(name);\n }\n return;\n }\n\n if (hasQueue) {\n // Already scheduled\n return;\n }\n\n if (queuedProps) {\n queuedProps.add(name);\n } else {\n queuedPropsByElement.set(this, new Set([name]));\n }\n // Animation styles may trickle in steps, so queue a microtask before doing any work.\n // Using requestAnimationFrame would fire one frame too late for CSS animations already scheduled\n queueMicrotask(elementStylerMicrotaskCallback.bind(this, name));\n },\n};\n", "import CustomElement from '../core/CustomElement.js';\nimport { ELEMENT_STYLER_TYPE } from '../core/customTypes.js';\n\nexport default CustomElement\n .extend()\n .set({\n hadRippleHeld: false,\n hadRippleReleased: false,\n rippleStarted: false,\n })\n .observe({\n rippleState: 'string',\n keepAlive: 'boolean',\n _positionX: 'float',\n _positionY: 'float',\n _radius: 'float',\n holdRipple: {\n type: 'boolean',\n changedCallback(oldValue, newValue) {\n if (newValue) {\n this.hadRippleHeld = true;\n } else {\n this.hadRippleReleased = true;\n }\n },\n },\n })\n .observe({\n _positionStyle: {\n ...ELEMENT_STYLER_TYPE,\n get({ _positionX, _positionY, _radius }) {\n return {\n styles: {\n minBlockSize: `${_radius}px`,\n minInlineSize: `${_radius}px`,\n boxShadow: `0 0 calc(0.10 * ${_radius}px) calc(0.10 * ${_radius}px) currentColor`,\n top: `calc(50% + ${_positionY}px)`,\n left: `calc(50% + ${_positionX}px)`,\n },\n };\n },\n },\n })\n .methods({\n /**\n * @param {number} [x] offsetX\n * @param {number} [y] offsetY\n * @param {number} [size]\n * @return {void}\n */\n updatePosition(x, y, size) {\n // Element is already centered.\n // Use offset to calculate parent size;\n\n let hypotenuse = size;\n const { clientWidth: parentWidth, clientHeight: parentHeight } = this.offsetParent;\n\n x ??= parentWidth / 2;\n y ??= parentHeight / 2;\n if (!hypotenuse) {\n const width = (x >= parentWidth / 2) ? x : (parentWidth - x);\n const height = (y >= parentHeight / 2) ? y : (parentHeight - y);\n hypotenuse = 2 * Math.sqrt((width * width) + (height * height));\n }\n\n // const expandDuration = Math.min(\n // 500, // Never longer than long-press duration\n // (1000 * Math.sqrt(size / 2 / 1024) + 0.5), // From Android\n // );\n\n // this.style.minBlockSize = `${hypotenuse}px`;\n // this.style.minInlineSize = `${hypotenuse}px`;\n // this.style.boxShadow = `0 0 calc(0.10 * ${0}px) calc(0.10 * ${0}px) currentColor`;\n // this.style.marginLeft = `${x - (parentWidth / 2)}px`;\n // this.style.marginTop = `${y - (parentHeight / 2)}px`;\n\n this._positionX = x - (parentWidth / 2);\n this._positionY = y - (parentHeight / 2);\n this._radius = hypotenuse;\n },\n handleRippleComplete() {\n if (this.keepAlive) {\n this.setAttribute('ripple-state', 'complete');\n } else {\n this.remove();\n }\n },\n })\n .events({\n animationstart({ animationName }) {\n if (animationName !== 'ripple-fade-in') return;\n if (this.rippleStarted && !this.keepAlive) {\n // Animation restarted. Likely from visibility change\n this.remove();\n return;\n }\n this.rippleStarted = true;\n },\n animationend({ animationName }) {\n switch (animationName) {\n case 'ripple-fade-in':\n this.setAttribute('ripple-state', 'filled');\n break;\n case 'ripple-fade-out':\n this.handleRippleComplete();\n break;\n default:\n }\n },\n })\n .css`\n /* stylelint-disable liberty/use-logical-spec */\n :host {\n --enter-delay: 80ms;\n --touch-down-acceleration: 1024;\n --touch-up-acceleration: 3400;\n --mdw-ripple-expand-duration: 300ms;\n --mdw-ripple-simple-duration: 200ms;\n --mdw-ripple-fade-out-duration: 333ms;\n --mdw-ripple-standard-easing: var(--mdw-motion-standard-easing, cubic-bezier(0.4, 0.0, 0.2, 1));\n --mdw-ripple-deceleration-easing: var(--mdw-motion-deceleration-easing, cubic-bezier(0.0, 0.0, 0.2, 1));\n \n --size: 0;\n position: absolute;\n top: 50%;\n left: 50%;\n \n display: block;\n \n min-block-size: 141.42%; /* √2 * 100% */\n min-inline-size: 141.42%;\n \n pointer-events: none;\n \n -webkit-tap-highlight-color: transparent;\n \n opacity: 0.12;\n transform: translateX(-50%) translateY(-50%) scale(1);\n \n background-color: currentColor;\n border-radius: 50%;\n \n /* Adds feathered appearance to ripple */\n box-shadow: 0 0 calc(0.10 * var(--size)) calc(0.10 * var(--size)) currentColor;\n \n transition-delay: 0s;\n transition-duration: var(--mdw-ripple-simple-duration);\n transition-property: background-color, color;\n transition-timing-function: var(--mdw-ripple-standard-easing);\n \n animation-name: ripple-fade-in, none;\n animation-duration: var(--mdw-ripple-expand-duration), var(--mdw-ripple-fade-out-duration);\n animation-timing-function: linear, var(--mdw-ripple-deceleration-easing);\n animation-direction: normal;\n animation-fill-mode: forwards;\n /* stylelint-disable-next-line liberty/use-logical-spec */\n will-change: transform, opacity, top, left, box-shadow;\n \n aspect-ratio: 1/1;\n }\n \n :host([ripple-state=\"filled\"]) {\n animation-name: none, ripple-fade-out;\n }\n \n :host([ripple-state=\"filled\"][hold-ripple]) {\n animation-name: ripple-fade-in, none;\n }\n \n :host([ripple-state=\"complete\"]) {\n animation-name: none, ripple-fade-out;\n animation-duration: 0s;\n }\n \n @keyframes ripple-fade-in {\n from {\n transform: translateX(-50%) translateY(-50%) scale(0);\n }\n }\n \n @keyframes ripple-fade-out {\n \n to { opacity: 0; }\n }\n `\n .autoRegister('mdw-ripple');\n", "import Ripple from '../components/Ripple.js';\n\n/** @typedef {import('../components/Ripple.js').default} Ripple */\n\n/**\n * @param {ReturnType<import('./StateMixin.js').default>} Base\n */\nexport default function RippleMixin(Base) {\n return Base\n .set({\n /** @type {WeakRef<InstanceType<Ripple>>} */\n _lastRippleWeakRef: null,\n /** Flag set if ripple was added this event loop. */\n _rippleAdded: false,\n })\n .define({\n _lastRipple: {\n get() {\n const element = this._lastRippleWeakRef?.deref();\n if (element?.isConnected) return element;\n return null;\n },\n set(ripple) {\n this._lastRippleWeakRef = ripple ? new WeakRef(ripple) : null;\n },\n },\n })\n .methods({\n /**\n * @param {number} [x]\n * @param {number} [y]\n * @param {boolean} [hold]\n * @return {InstanceType<Ripple>}\n */\n addRipple(x, y, hold) {\n const { rippleContainer } = this.refs;\n if (!rippleContainer.isConnected) return null; // Detached?\n const ripple = new Ripple();\n this._rippleAdded = true;\n queueMicrotask(() => {\n // Reset before next event loop;\n this._rippleAdded = false;\n });\n rippleContainer.append(ripple);\n if (hold) {\n ripple.holdRipple = true;\n }\n ripple.updatePosition(x, y);\n this._lastRipple = ripple;\n return ripple;\n },\n })\n .html`\n <div id=ripple-container mdw-if={!disabledState} aria-hidden=true></div>\n `\n .events({\n '~pointerdown'(event) {\n if (event.button) return;\n if (this.disabledState) return;\n\n const { rippleContainer } = this.refs;\n if (!rippleContainer.isConnected) return; // Detached?\n const rect = rippleContainer.getBoundingClientRect();\n const x = event.pageX - rect.left - window.pageXOffset;\n const y = event.pageY - rect.top - window.pageYOffset;\n const lastRipple = this._lastRipple;\n if (lastRipple) {\n lastRipple.holdRipple = false;\n }\n console.debug('ripple from pointerdown');\n this.addRipple(x, y);\n },\n '~click'(e) {\n if (this._rippleAdded) {\n // Avoid double event\n return;\n }\n if (e.pointerType || e.detail) return;\n if (this.disabledState) return;\n if (this._pressed) return;\n const lastRipple = this._lastRipple;\n if (lastRipple) {\n lastRipple.holdRipple = false;\n }\n console.debug('ripple from programmatic click');\n this.addRipple();\n },\n })\n .on({\n _pressedChanged(oldValue, pressed) {\n const ripple = this._lastRipple;\n if (!pressed) {\n if (ripple) {\n ripple.holdRipple = false;\n }\n return;\n }\n if (!ripple || ripple.hadRippleReleased) {\n if (this._lastInteraction !== 'key') {\n // Sometimes pointer events may be out of order\n return;\n }\n console.debug('ripple from press state');\n this.addRipple(null, null, true);\n return;\n }\n if (ripple.hadRippleHeld) return;\n ripple.holdRipple = true;\n },\n })\n .css`\n :host {\n --mdw-state__pressed-opacity: 0;\n }\n \n #ripple-container {\n position: absolute;\n inset: 0;\n \n overflow: hidden;\n \n pointer-events: none;\n }\n `;\n}\n", "// Globals\n\nlet lastInteractionWasTouch = window?.matchMedia?.('(any-pointer: coarse)').matches;\n\n/**\n * @param {typeof import('../core/CustomElement.js').default} Base\n */\nexport default function StateMixin(Base) {\n return Base\n .observe({\n disabled: 'boolean',\n /** Force focus state (independent of document) */\n focused: 'boolean',\n /** Force hover state (independent of interaction) */\n hovered: 'boolean',\n /** Force pressed state (independent of interaction) */\n pressed: 'boolean',\n _lastInteraction: {\n /** @type {'mouse'|'touch'|'key'|'pen'|null} */\n value: null,\n },\n _hovered: 'boolean',\n _focused: 'boolean',\n _pressed: 'boolean',\n stateLayer: 'boolean',\n })\n .observe({\n disabledState({ disabled }) { return disabled; },\n hoveredState({ _hovered, hovered }) { return _hovered || hovered; },\n focusedState({ _focused, focused }) { return _focused || focused; },\n pressedState({ _pressed, pressed }) { return _pressed || pressed; },\n touchedState({ _lastInteraction }) {\n return _lastInteraction === 'touch';\n },\n })\n .define({\n stateTargetElement() { return this; },\n })\n .html`\n <div id=state mdw-if={stateLayer}\n disabled={disabledState}\n focused={focusedState}\n hovered={hoveredState}\n pressed={pressedState}\n interaction={_lastInteraction}\n touched={touchedState}\n aria-hidden=true></div>\n `\n .events({\n pointerenter(event) {\n if (!event.isPrimary) return;\n this._pressed = this.stateTargetElement.matches(':active');\n if (event.pointerType === 'touch') return;\n this._hovered = true;\n // Firefox lags a frame before reporting :hover\n // requestAnimationFrame(() => {\n // this._hovered = this.stateTargetElement.matches(':hover');\n // });\n },\n '~pointerdown'(event) {\n if (!event.isPrimary) return;\n this._lastInteraction = /** @type {'touch'|'mouse'|'pen'} */ (event.pointerType);\n this._pressed = true;\n },\n '~pointerup'(event) {\n if (!event.isPrimary) return;\n this._lastInteraction = /** @type {'touch'|'mouse'|'pen'} */ (event.pointerType);\n this._pressed = false;\n },\n pointercancel(e) {\n if (!e.isPrimary) return;\n this._pressed = this.stateTargetElement.matches(':active');\n },\n pointerleave(event) {\n if (!event.isPrimary) return;\n this._pressed = false;\n this._hovered = false;\n },\n '~keydown'(e) {\n this._lastInteraction = 'key';\n if (e.repeat) return;\n // console.debug('keydown', this.stateTargetElement.matches(':active'));\n requestAnimationFrame(() => {\n this._pressed = this.stateTargetElement.matches(':active');\n // console.debug('pressed? after one keydown frame', this._pressed);\n });\n },\n '~keyup'() {\n this._lastInteraction = 'key';\n // console.debug('keyup', this.stateTargetElement.matches(':active'));\n requestAnimationFrame(() => {\n this._pressed = this.stateTargetElement.matches(':active');\n // console.debug('pressed? after one keyUP frame?', this._pressed);\n });\n },\n blur() {\n this._focused = false;\n if (!this._lastInteraction) return;\n lastInteractionWasTouch = (this._lastInteraction === 'touch');\n // this._lastInteraction = null;\n },\n focus() {\n this._focused = true;\n // Element was focused without a mouse or touch event (keyboard or programmatic)\n if (!this._lastInteraction && lastInteractionWasTouch) {\n // Replicate touch behavior\n this._lastInteraction = 'touch';\n }\n },\n })\n .on({\n disconnected() {\n this._lastInteraction = null;\n },\n })\n .css`\n /* https://m3.material.io/foundations/interaction-states */\n\n :host {\n --mdw-state__hovered-opacity: 0.08;\n --mdw-state__focused-opacity: 0.12;\n --mdw-state__pressed-opacity: 0.12;\n --mdw-state__dragged-opacity: 0.12;\n position: relative;\n\n outline: none;\n -webkit-tap-highlight-color: transparent;\n }\n\n /* Remove Firefox inner */\n :host(::-moz-focus-inner) {\n border: 0;\n }\n\n #state {\n position: absolute;\n inset: 0;\n\n pointer-events: none;\n\n opacity: calc(\n var(--mdw-state__hovered-opacity) +\n var(--mdw-state__focused-opacity) +\n var(--mdw-state__pressed-opacity) +\n var(--mdw-state__dragged-opacity)\n );\n /* opacity handled by theme engine */\n background-color: currentColor;\n border-radius: inherit;\n\n transition-delay: 0ms;\n transition-duration: 000ms;\n transition-property: opacity, color, background-color;\n will-change: opacity;\n }\n\n #state[touched] {\n --mdw-state__hovered-opacity: 0;\n --mdw-state__focused-opacity: 0;\n }\n\n /* Remove Hover State */\n #state:is(\n :not([hovered]),\n [disabled]:not([state-disabled~=\"hover\"]),\n [state-off~=\"hover\"]) {\n --mdw-state__hovered-opacity: 0;\n }\n\n /* Remove Focus State */\n #state:is(\n :not([focused]),\n [disabled]:not([state-disabled~=\"focus\"]),\n [state-off~=\"focus\"]) {\n --mdw-state__focused-opacity: 0;\n }\n\n /* Remove Pressed State */\n\n #state:is(\n :not([pressed]),\n [disabled]:not([state-disabled~=\"pressed\"]),\n [state-off~=\"pressed\"]) {\n --mdw-state__pressed-opacity: 0;\n }\n\n /* Remove Dragged State */\n :host(:not([aria-dragged=\"true\"])) #state,\n #state:is(\n [disabled]:not([state-disabled~=\"dragged\"]),\n [state-off~=\"dragged\"]) {\n --mdw-state__dragged-opacity: 0;\n }\n\n /* Disabled */\n #state[disabled]:not([state-disabled]) {\n display: none;\n }\n\n `;\n}\n", "import './Icon.js';\nimport CustomElement from '../core/CustomElement.js';\nimport DensityMixin from '../mixins/DensityMixin.js';\nimport InputMixin from '../mixins/InputMixin.js';\nimport RippleMixin from '../mixins/RippleMixin.js';\nimport ShapeMixin from '../mixins/ShapeMixin.js';\nimport StateMixin from '../mixins/StateMixin.js';\nimport SurfaceMixin from '../mixins/SurfaceMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\nexport default CustomElement\n .extend()\n .mixin(ThemableMixin)\n .mixin(DensityMixin)\n .mixin(SurfaceMixin)\n .mixin(ShapeMixin)\n .mixin(StateMixin)\n .mixin(RippleMixin)\n .mixin(InputMixin)\n .define({\n stateTargetElement() { return this.refs.control; },\n })\n .set({\n stateLayer: true,\n delegatesFocus: true,\n })\n .observe({\n type: { empty: 'button' },\n elevated: 'boolean',\n filled: 'string',\n href: 'string',\n outlined: 'boolean',\n icon: 'string',\n iconInk: 'string',\n src: 'string',\n svg: 'string',\n viewBox: 'string',\n svgPath: 'string',\n _slotInnerText: 'string',\n })\n .expressions({\n hasIcon({ icon, svg, src, svgPath }) {\n return icon ?? svg ?? src ?? svgPath;\n },\n computedAriaLabel({ ariaLabel, _slotInnerText }) {\n return ariaLabel?.trim() || _slotInnerText?.trim() || null;\n },\n })\n .methods({\n focus(...options) {\n if (this.href) {\n this.refs.anchor.focus(...options);\n } else {\n this.refs.control.focus(...options);\n }\n },\n })\n .html`\n <mdw-icon mdw-if={hasIcon} id=icon ink={iconInk} disabled={disabledState} outlined={outlined} aria-hidden=true svg={svg} src={src} svg-path={svgPath} view-box={viewBox}>{icon}</mdw-icon>\n <a mdw-if={href} id=anchor href={href} aria-label=\"{computedAriaLabel}\"></a>\n <slot id=slot disabled={disabledState} aria-hidden=false></slot>\n `\n .childEvents({\n slot: {\n slotchange() {\n // Firefox and Webkit will not apply label from slots.\n // https://bugs.webkit.org/show_bug.cgi?id=254934\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1826194\n if (navigator.userAgent.includes('Firefox')\n || (navigator.userAgent.includes('Safari') && !navigator.userAgent.includes('Chrom'))) {\n this._slotInnerText = this.textContent;\n }\n },\n },\n })\n .on({\n composed() {\n const {\n shape, state, rippleContainer, surface, control,\n } = this.refs;\n surface.append(shape);\n shape.append(state, rippleContainer);\n shape.setAttribute('filled', '{filled}');\n control.setAttribute('aria-label', '{computedAriaLabel}');\n control.setAttribute('hidden', '{href}');\n control.setAttribute('role', 'button');\n },\n })\n .css`\n /* https://m3.material.io/components/buttons/specs */\n\n :host {\n --mdw-shape__size: var(--mdw-shape__full);\n --mdw-ink: var(--mdw-color__primary);\n\n --mdw-type__font: var(--mdw-typescale__label-large__font);\n --mdw-type__letter-spacing: var(--mdw-typescale__label-large__letter-spacing);\n\n display: inline-flex;\n\n align-items: center;\n gap: 0;\n justify-content: center;\n vertical-align: middle;\n\n /* box-sizing: border-box; */\n min-block-size: 24px;\n min-inline-size: 24px;\n\n padding-block: calc(8px + (var(--mdw-density) * 2px));\n padding-inline: calc(12px + (var(--mdw-density) * 2px));\n\n -webkit-tap-highlight-color: transparent;\n -webkit-user-select: none;\n user-select: none;\n\n color: rgb(var(--mdw-ink));\n\n font: var(--mdw-type__font);\n letter-spacing: var(--mdw-type__letter-spacing);\n }\n\n :host(:where([elevated],[filled])) {\n will-change: filter;\n }\n\n /** Elevated Color Defaults */\n :host(:where([elevated])) {\n --mdw-bg: var(--mdw-color__surface-container-low);\n --mdw-ink: var(--mdw-color__primary);\n --mdw-surface__shadow__resting: var(--mdw-surface__shadow__1);\n --mdw-surface__shadow__raised: var(--mdw-surface__shadow__2);\n }\n /** Filled Color Defaults */\n :host(:where([filled])) {\n --mdw-bg: var(--mdw-color__primary);\n --mdw-ink: var(--mdw-color__on-primary);\n --mdw-surface__shadow__resting: var(--mdw-surface__shadow__0);\n --mdw-surface__shadow__raised: var(--mdw-surface__shadow__1);\n }\n /** Filled Tonal Color Defaults */\n :host(:where([filled=\"tonal\"])) {\n --mdw-bg: var(--mdw-color__secondary-container);\n --mdw-ink: var(--mdw-color__on-secondary-container);\n }\n /** Outlined Color Defaults */\n :host(:where([outlined])) {\n --mdw-ink: var(--mdw-color__primary);\n }\n\n :host(:where([icon])) {\n gap: 8px;\n\n padding-inline: calc(12px + (var(--mdw-density) * 2px)) calc(16px + (var(--mdw-density) * 2px));\n }\n\n :host(:where([outlined], [elevated], [filled])) {\n padding-inline: calc(24px + (var(--mdw-density) * 2px));\n }\n\n :host(:where([icon]):where([outlined], [elevated], [filled])) {\n gap: 8px;\n\n padding-inline: calc(16px + (var(--mdw-density) * 2px)) calc(24px + (var(--mdw-density) * 2px));\n }\n\n #shape:where([elevated],[filled],[color]) {\n background-color: rgb(var(--mdw-bg));\n }\n\n #slot {\n text-align: center;\n text-decoration: none;\n white-space: nowrap;\n }\n\n #control {\n cursor: pointer;\n }\n\n #anchor {\n position: absolute;\n inset: 0;\n\n cursor: pointer;\n outline: none;\n }\n\n :host([disabled]) {\n /* cursor: not-allowed; */\n\n color: rgba(var(--mdw-color__on-surface), 0.38);\n }\n\n #shape[disabled]:is([elevated], [filled]) {\n background-color: rgba(var(--mdw-color__on-surface), 0.12);\n color: rgba(var(--mdw-color__on-surface), 0.38);\n }\n\n #slot[disabled] {\n color: rgba(var(--mdw-color__on-surface), 0.38);\n }\n\n #icon {\n font-size: calc(18/14 * 1em);\n font-variation-settings: 'FILL' 1;\n }\n\n #icon[outlined] {\n font-variation-settings: 'FILL' 0;\n }\n\n #icon[disabled] {\n opacity: 0.38;\n\n color: rgba(var(--mdw-color__on-surface));\n }\n\n #control[form-disabled] {\n cursor: not-allowed;\n }\n\n @media (any-pointer: coarse) {\n #touch-target {\n visibility: visible;\n }\n }\n `\n .childEvents({\n control: {\n /**\n * Duplicates button for form submission\n * @see https://github.com/WICG/webcomponents/issues/814\n * @param {{currentTarget:HTMLInputElement}} event\n * @type {any}\n */\n '~click'({ currentTarget }) {\n if (currentTarget.disabled) return;\n if (currentTarget.type !== 'submit') return;\n if (this.disabled) return;\n const { value } = currentTarget;\n const form = this.elementInternals?.form;\n if (!form) return;\n this.elementInternals.setFormValue(value);\n if ((currentTarget.type ?? 'submit') !== 'submit') return;\n const duplicatedButton = /** @type {HTMLInputElement} */ (currentTarget.cloneNode());\n duplicatedButton.hidden = true;\n form.append(duplicatedButton);\n if ('requestSubmit' in form) {\n form.requestSubmit(duplicatedButton);\n } else {\n duplicatedButton.click();\n }\n duplicatedButton.remove();\n },\n },\n })\n .autoRegister('mdw-button');\n", "import CustomElement from '../core/CustomElement.js';\nimport { EVENT_HANDLER_TYPE } from '../core/customTypes.js';\nimport AriaReflectorMixin from '../mixins/AriaReflectorMixin.js';\nimport FlexableMixin from '../mixins/FlexableMixin.js';\nimport FormAssociatedMixin from '../mixins/FormAssociatedMixin.js';\nimport ShapeMixin from '../mixins/ShapeMixin.js';\nimport StateMixin from '../mixins/StateMixin.js';\nimport SurfaceMixin from '../mixins/SurfaceMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\nconst SUPPORTS_INERT = 'inert' in HTMLElement.prototype;\n\nexport default CustomElement\n .extend()\n .mixin(ThemableMixin)\n .mixin(FlexableMixin)\n .mixin(SurfaceMixin)\n .mixin(ShapeMixin)\n .mixin(FormAssociatedMixin) // Tap into FormAssociated for disabledState\n .mixin(StateMixin)\n .mixin(AriaReflectorMixin)\n .setStatic({\n delegatesFocus: true,\n })\n .set({\n _ariaRole: 'figure',\n })\n .observe({\n filled: 'boolean',\n actionable: 'boolean',\n actionLabel: 'string',\n onaction: EVENT_HANDLER_TYPE,\n })\n .define({\n stateTargetElement() { return this.actionable ? this.refs.action : this; },\n })\n .expressions({\n showBlocker: ({ disabledState }) => !SUPPORTS_INERT && disabledState,\n })\n .methods({\n focus() {\n if (this.disabledState) return;\n if (this.actionable) this.refs.action.focus();\n },\n })\n .html`\n <mdw-button mdw-if={actionable} aria-label={actionLabel} id=action disabled={disabledState}></mdw-button>\n <div mdw-if={showBlocker} id=inert-blocker></div>\n <slot id=slot disabled={disabledState}></slot>\n `\n .css`\n /* https://m3.material.io/components/cards/specs */\n\n :host {\n --mdw-shape__size: 12px;\n\n --mdw-surface__shadow__resting: none;\n --mdw-surface__shadow__raised: var(--mdw-surface__shadow__resting);\n /* padding-inline: 12px; */\n\n --mdw-bg: var(--mdw-color__surface-container);\n --mdw-ink: var(--mdw-color__on-surface);\n position: relative;\n\n display: block;\n\n color: rgb(var(--mdw-ink));\n\n font: var(--mdw-type__font);\n letter-spacing: var(--mdw-type__letter-spacing);\n }\n\n #shape:where([elevated],[filled],[color]) {\n background-color: rgb(var(--mdw-bg));\n }\n\n :host(:where([filled])) {\n --mdw-bg: var(--mdw-color__surface-container-highest);\n --mdw-ink: var(--mdw-color__on-surface-variant);\n }\n\n :host(:where([elevated])) {\n --mdw-bg: var(--mdw-color__surface-container-low);\n --mdw-ink: var(--mdw-color__on-surface);\n }\n\n :host([filled]) {\n --mdw-surface__shadow__resting: var(--mdw-surface__shadow__0);\n }\n\n :host([filled][actionable]) {\n --mdw-surface__shadow__raised: var(--mdw-surface__shadow__1);\n }\n\n :host([elevated]) {\n --mdw-surface__shadow__resting: var(--mdw-surface__shadow__1);\n }\n\n :host([elevated][actionable]) {\n --mdw-surface__shadow__raised: var(--mdw-surface__shadow__2);\n }\n\n #shape[disabled] {\n\n /* Works on images */\n filter: grayscale();\n\n color: rgb(var(--mdw-color__on-surface));\n }\n\n :host([disabled]) {\n cursor: not-allowed;\n\n filter: grayscale();\n opacity: 0.38;\n }\n\n #slot[disabled] {\n color: rgb(var(--mdw-color__on-surface));\n }\n\n #outline[disabled] {\n color: rgba(var(--mdw-color__on-surface), calc(0.12/0.38));\n }\n\n /** Firefox and Safari do not support [inert] */\n\n #inert-blocker {\n position: absolute;\n inset: 0;\n\n cursor: not-allowed;\n pointer-events: auto;\n\n z-index: 99;\n }\n\n #shape[disabled][elevated] {\n background-color: rgba(var(--mdw-color__surface-container-highest));\n }\n\n #action {\n --mdw-ink: inherit;\n --mdw-shape__size: inherit;\n\n position: absolute;\n inset: 0;\n\n padding: 0;\n\n z-index: 0;\n\n color: inherit\n }\n `\n .on({\n composed() {\n const { slot, surface, shape, outline } = this.refs;\n surface.append(shape);\n outline.removeAttribute('pressed');\n outline.removeAttribute('focused');\n\n shape.setAttribute('filled', '{filled}');\n slot.setAttribute('inert', '{disabledState}');\n slot.setAttribute('disabled', '{disabledState}');\n // shape.setAttribute('disabled', '{disabledState}');\n // shape.setAttribute('filled', '{filled}');\n },\n })\n .childEvents({\n action: {\n click() {\n if (this.disabledState) return;\n this.dispatchEvent(new Event('action'));\n },\n },\n slot: SUPPORTS_INERT ? {} : {\n focusin() {\n if (this.disabledState) {\n console.warn('Inert not supported. Element should be able to receive focus');\n }\n },\n },\n })\n .autoRegister('mdw-card');\n", "import './Icon.js';\nimport CustomElement from '../core/CustomElement.js';\nimport ShapeMixin from '../mixins/ShapeMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\nexport default CustomElement\n .extend()\n .mixin(ThemableMixin)\n .mixin(ShapeMixin)\n .observe({\n selected: 'boolean',\n icon: 'string',\n errored: 'boolean',\n disabled: 'boolean',\n })\n .define({\n /** Alias for Selected (QoL) */\n checked: {\n get() { return this.selected; },\n set(value) { this.selected = value; },\n },\n })\n .css`\n /* https://m3.material.io/components/checkbox/specs */\n\n :host {\n --mdw-ink: var(--mdw-color__on-primary);\n --mdw-bg: var(--mdw-color__primary);\n --mdw-shape__size: 2px;\n --disabled-opacity: 0.38;\n position: relative;\n\n display: inline-block;\n align-items: center;\n justify-content: center;\n\n box-sizing: border-box;\n block-size: 18px;\n inline-size: 18px;\n\n font-size: 18px;\n line-height: 18px;\n }\n\n #shape {\n --mdw-shape__size: inherit;\n position: absolute;\n inset: 0;\n\n z-index: auto;\n\n background-color: transparent;\n }\n\n #icon {\n position: absolute;\n inset: 0;\n\n opacity: 0;\n\n background-color: rgb(var(--mdw-bg));\n color: rgb(var(--mdw-ink));\n\n transition-duration: 200ms;\n transition-property: opacity, background-color, color;\n will-change: opacity;\n }\n\n #outline {\n filter:\n drop-shadow(1px 0px 0px currentColor)\n drop-shadow(0px 1px 0px currentColor)\n drop-shadow(-1px 0px 0px currentColor)\n drop-shadow(0px -1px 0px currentColor);\n\n color: rgb(var(--mdw-color__on-surface));\n\n transition-duration: 200ms;\n transition-property: opacity, background-color, color;\n will-change: opacity;\n }\n\n /* Selected */\n\n #icon[selected] {\n opacity: 1;\n }\n\n #outline[selected] {\n opacity: 0;\n }\n\n /* Errored */\n\n #icon[errored] {\n background-color: rgb(var(--mdw-color__error));\n color: rgb(var(--mdw-color__on-error));\n }\n\n #outline[errored] {\n color: rgb(var(--mdw-color__error));\n }\n\n /* Disabled */\n\n #icon[disabled] {\n background-color: rgba(var(--mdw-color__on-surface), var(--disabled-opacity));\n color: rgb(var(--mdw-color__surface), var(--disabled-opacity));\n }\n\n #outline[disabled] {\n color: rgb(var(--mdw-color__on-surface), var(--disabled-opacity));\n }\n `\n .on({\n composed({ html }) {\n const { outline, shape } = this.refs;\n outline.removeAttribute('mdw-if');\n outline.setAttribute('selected', '{selected}');\n outline.setAttribute('errored', '{errored}');\n outline.setAttribute('disabled', '{disabled}');\n // outlineLeft.remove();\n // outlineRight.remove();\n shape.append(html`\n <mdw-icon id=icon selected={selected} errored={errored} disabled={disabled}>{icon}</mdw-icon>\n `);\n },\n })\n .autoRegister('mdw-checkbox-icon');\n", "/** @param {typeof import('../core/CustomElement.js').default} Base */\nexport default function TouchTargetMixin(Base) {\n return Base\n .html`<div id=touch-target class=touch-target></div>`\n .css`\n /* stylelint-disable liberty/use-logical-spec */\n .touch-target {\n position: absolute;\n top: 50%;\n left: 50%;\n /* --mdw-device-pixel-ratio: 1; */\n \n block-size: 100%;\n min-block-size: 48px;\n /* min-block-size: 10mm; */\n /* min-block-size: calc(0.393701in / var(--mdw-device-pixel-ratio, 1)); */\n inline-size:100%;\n min-inline-size: 48px;\n /* min-inline-size: 10mm; */\n /* min-inline-size: calc(0.393701in / var(--mdw-device-pixel-ratio, 1)); */\n \n cursor: inherit;\n \n /* box-sizing: border-box; */\n /* border: solid 1px magenta; */\n pointer-events: auto;\n \n transform: translateX(-50%) translateY(-50%);\n visibility: visible;\n z-index: 1;\n \n border-radius: inherit;\n }\n `;\n}\n", "import './CheckboxIcon.js';\n\nimport CustomElement from '../core/CustomElement.js';\nimport InputMixin from '../mixins/InputMixin.js';\nimport RippleMixin from '../mixins/RippleMixin.js';\nimport StateMixin from '../mixins/StateMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\nimport TouchTargetMixin from '../mixins/TouchTargetMixin.js';\n\nexport default CustomElement\n .extend()\n .mixin(ThemableMixin)\n .mixin(StateMixin)\n .mixin(RippleMixin)\n .mixin(InputMixin)\n .mixin(TouchTargetMixin)\n .set({\n stateLayer: true,\n type: 'checkbox',\n })\n .observe({\n icon: { value: 'check' },\n indeterminateIcon: { value: 'check_indeterminate_small' },\n /** Reflected property */\n indeterminate: 'boolean',\n })\n .observe({\n _ariaChecked({ indeterminate, checked }) {\n return (indeterminate ? 'mixed' : `${!!checked}`);\n },\n _determinateIcon({ indeterminate, indeterminateIcon, icon }) {\n return (indeterminate ? indeterminateIcon : icon);\n },\n })\n .html`\n <div id=checkbox errored={erroredState} selected={checked}>\n <mdw-checkbox-icon id=icon errored={erroredState} disabled={disabledState}\n icon={_determinateIcon} selected={checked}>\n </mdw-checkbox-icon>\n </div>\n <slot id=slot></slot>\n `\n .rootEvents({\n click(event) {\n const { control } = this.refs;\n if (event.target !== control) {\n // Label-like click\n event.stopPropagation();\n control.click();\n }\n },\n })\n .on({\n composed() {\n const { control, checkbox, state, rippleContainer } = this.refs;\n checkbox.append(state, rippleContainer);\n\n // Indeterminate must be manually expressed for ARIA\n control.setAttribute('aria-checked', '{_ariaChecked}');\n },\n })\n .css`\n /* https://m3.material.io/components/checkbox/specs */\n\n :host {\n --mdw-ink: var(--mdw-color__on-primary);\n --mdw-bg: var(--mdw-color__primary);\n\n display: inline-grid;\n align-items: baseline;\n gap: 12px;\n grid-auto-flow: column;\n justify-content: flex-start;\n\n cursor: pointer;\n\n transition: none 100ms cubic-bezier(0.4, 0.0, 1, 1);\n }\n\n :host(:disabled) {\n cursor: not-allowed;\n\n opacity: 0.38;\n }\n\n :host([internals-disabled]) {\n cursor: not-allowed;\n\n opacity: 0.38;\n }\n\n :host(:empty) {\n vertical-align: -11.5%;\n\n line-height: 18px;\n }\n\n #control {\n grid-column: 1/1;\n\n cursor: inherit;\n }\n\n #state,\n #ripple-container {\n /* stylelint-disable-next-line liberty/use-logical-spec */\n top: 50%;\n /* stylelint-disable-next-line liberty/use-logical-spec */\n left: 50%;\n\n block-size: 40px;\n inline-size: 40px;\n\n transform: translateX(-50%) translateY(-50%);\n\n border-radius: 50%;\n }\n\n #checkbox {\n position: relative;\n\n display: inline-flex;\n\n grid-column: 1 / 1;\n\n pointer-events: none;\n\n transform: translateY(11.5%);\n\n color: rgb(var(--mdw-color__on-surface));\n }\n\n #checkbox[selected] {\n color: rgb(var(--mdw-bg));\n }\n\n #checkbox[disabled] {\n color: rgb(var(--mdw-color__on-surface));\n }\n\n #checkbox[errored] {\n color: rgb(var(--mdw-color__error));\n }\n\n :host(:empty) #checkbox {\n transform: none;\n }\n\n #icon {\n --mdw-ink: inherit;\n --mdw-bg: inherit;\n --disabled-opacity: 1;\n }\n `\n .autoRegister('mdw-checkbox');\n", "import Button from './Button.js';\n\nexport default Button\n .extend()\n .observe({\n suggestion: 'boolean',\n })\n .css`\n /* https://m3.material.io/components/chips/specs */\n\n :host {\n --mdw-shape__size: 8px;\n --mdw-ink: var(--mdw-color__on-surface);\n padding-block: calc(4px + (var(--mdw-density) * 2px));\n padding-inline: calc(16px + (var(--mdw-density) * 2px));\n\n color: rgb(var(--mdw-ink));\n }\n\n :host(:where([suggestion])) {\n --mdw-ink: var(--mdw-color__on-surface-variant);\n }\n\n :host(:where([icon])) {\n gap: 8px;\n\n padding-inline: calc(8px + (var(--mdw-density) * 2px)) calc(16px + (var(--mdw-density) * 2px));\n\n }\n\n #outline {\n --mdw-ink: rgb(var(--mdw-color__on-surface-variant));\n }\n\n #outline:is([ink],[color]) {\n /* stylelint-disable-next-line rule-selector-property-disallowed-list */\n --mdw-ink: inherit;\n }\n\n #slot[disabled],\n #icon[disabled] {\n color: rgba(var(--mdw-color__on-surface), 0.38);\n }\n\n `\n .on({\n composed({ inline }) {\n const { slot, outline, icon } = this.refs;\n slot.setAttribute('disabled', '{disabledState}');\n slot.removeAttribute('ink');\n slot.removeAttribute('color');\n outline.setAttribute('mdw-if', '{!elevated}');\n outline.setAttribute('ink', '{ink}');\n outline.setAttribute('color', '{color}');\n icon.setAttribute('ink', inline(({ ink, iconInk }) => iconInk ?? ink ?? 'primary'));\n },\n })\n .autoRegister('mdw-chip');\n", "/* https://m3.material.io/components/dividers/specs */\n\nimport CustomElement from '../core/CustomElement.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\nexport default CustomElement\n .extend()\n .mixin(ThemableMixin)\n .observe({\n vertical: 'boolean',\n })\n .css`\n :host {\n --mdw-ink: var(--mdw-color__outline-variant);\n position: relative;\n\n display: block;\n overflow: visible;\n\n box-sizing: border-box;\n block-size: 0;\n inline-size: 100%;\n\n color: rgb(var(--mdw-ink));\n }\n\n :host::before {\n content: '';\n\n display: block;\n\n box-sizing: border-box;\n block-size: 1px;\n inline-size: auto;\n\n background-color: currentcolor;\n }\n\n :host([vertical]) {\n display: inline-flex;\n vertical-align: top;\n\n block-size: auto;\n min-block-size: 100%;\n inline-size: 0;\n }\n\n :host([vertical])::before {\n block-size: auto;\n min-inline-size: 1px;\n }\n\n `\n .autoRegister('mdw-divider');\n", "import CustomElement from '../core/CustomElement.js';\n\nexport default CustomElement\n .extend()\n .css`\n :host {\n align-self: flex-end;\n\n margin-block: 24px;\n padding-inline: 24px;\n }\n `\n .html`<slot id=slot></slot>`\n .autoRegister('mdw-dialog-actions');\n", "/**\n * @typedef {Object} CanAnchorPopUpOptions\n * @prop {Element|DOMRect} [anchor]\n * @prop {number|'left'|'center'|'right'} [clientX]\n * @prop {number|'top'|'center'|'bottom'} [clientY]\n * @prop {number} [pageX]\n * @prop {number} [pageY]\n * @prop {Element|DOMRect} [popup]\n * @prop {number} [width]\n * @prop {number} [height]\n * @prop {number} [offsetX] Offset from anchor\n * @prop {number} [offsetY] Offset from anchor\n * @prop {number} [margin] Margin from page\n * @prop {'left'|'center'|'right'} [directionX='right']\n * @prop {'up'|'center'|'down'} [directionY='down']\n * @prop {boolean} [force=false]\n */\n\n/** @param {CanAnchorPopUpOptions} options */\nexport function canAnchorPopup(options) {\n let { pageX, pageY, directionX, directionY } = options;\n if (pageX == null || pageY == null) {\n const { clientX, clientY, anchor } = options;\n const rect = anchor instanceof Element ? anchor.getBoundingClientRect() : anchor;\n if (pageX == null) {\n switch (clientX) {\n case 'left':\n case null:\n case undefined:\n pageX = rect.left;\n directionX ??= 'right';\n break;\n case 'center':\n pageX = rect.left + rect.width / 2;\n directionX ??= 'center';\n break;\n case 'right':\n pageX = rect.right;\n directionX ??= 'left';\n break;\n default:\n pageX = rect.left + clientX;\n }\n }\n if (pageY == null) {\n switch (clientY) {\n case 'top':\n pageY = rect.top;\n directionY ??= 'up';\n break;\n case 'center':\n pageY = rect.top + rect.height / 2;\n directionY ??= 'center';\n break;\n case 'bottom':\n case null:\n case undefined:\n pageY = rect.bottom;\n directionY ??= 'down';\n break;\n default:\n pageY = rect.top + clientY;\n }\n }\n }\n\n let { width, height } = options;\n if (width == null || height == null) {\n const { popup } = options;\n if (popup instanceof Element) {\n width = popup.clientWidth;\n height = popup.clientHeight;\n } else {\n width = popup.width;\n height = popup.width;\n }\n }\n\n let top;\n let right;\n let bottom;\n let left;\n const margin = options.margin ?? 0;\n const pageTop = margin;\n const pageBottom = document.documentElement.clientHeight - margin;\n const pageRight = document.documentElement.clientWidth - margin;\n const pageLeft = margin;\n\n const offsetX = options.offsetX ?? 0;\n const offsetY = options.offsetY ?? 0;\n pageX += offsetX;\n pageY += offsetY;\n\n switch (directionY) {\n case 'up':\n bottom = Math.min(pageY, pageBottom);\n top = Math.max(bottom - height, pageTop);\n break;\n case 'center':\n top = Math.max(pageY - height / 2, pageTop);\n bottom = Math.min(pageY + height / 2, pageBottom);\n break;\n default:\n top = Math.max(pageY, pageTop);\n bottom = Math.min(top + height, pageBottom);\n }\n\n switch (directionX) {\n case 'left':\n right = Math.min(pageX, pageRight);\n left = Math.max(right - width, pageLeft);\n break;\n case 'center':\n left = Math.max(pageX - width / 2, pageLeft);\n right = Math.min(pageX + width / 2, pageRight);\n break;\n default:\n left = Math.max(pageX, pageLeft);\n right = Math.min(left + width, pageRight);\n }\n\n // compute area\n const fullSize = width * height;\n const realSize = (bottom - top) * (right - left);\n\n const visibility = realSize / fullSize;\n\n return {\n ...options,\n top,\n right,\n bottom,\n left,\n visibility,\n transformOriginX: directionX === 'center' ? 'center' : (directionX === 'left' ? 'right' : 'left'),\n transformOriginY: directionY === 'center' ? 'center' : (directionY === 'up' ? 'bottom' : 'top'),\n };\n}\n", "/**\n * @typedef {Object} PopupStack\n * @prop {Element} element\n * @prop {Element} previousFocus\n * @prop {boolean} [centered=false]\n * @prop {Record<string, any>} [state]\n * @prop {Record<string, any>} [previousState]\n * @prop {MouseEvent|PointerEvent|HTMLElement|Element} [originalEvent]\n * @prop {any} [pendingResizeOperation]\n * @prop {window['history']['scrollRestoration']} [scrollRestoration]\n */\n\nimport CustomElement from '../core/CustomElement.js';\nimport { attemptFocus } from '../core/dom.js';\nimport { canAnchorPopup } from '../utils/popup.js';\n\nCustomElement\n .extend()\n .observe({\n hidden: 'boolean',\n })\n .html`<div id=scroll-blocker></div>`\n .css`\n :host {\n position: fixed;\n inset: 0;\n\n display: block;\n overflow: overlay;\n\n overscroll-behavior: none;\n overscroll-behavior: contain;\n scrollbar-color: transparent transparent;\n scrollbar-width: thin;\n\n opacity: 0;\n\n z-index: 23;\n\n background-color: rgb(var(--mdw-color__scrim));\n \n animation: fade-in 200ms forwards ease-out;\n \n will-change: opacity;\n }\n\n :host([hidden]) {\n animation-name: fade-out;\n animation-timing-function: ease-in;\n }\n\n :host([invisible]) {\n background: transparent;\n }\n\n #scroll-blocker {\n position: absolute;\n top: 0;\n left: 0;\n\n display: block;\n\n height: 200%;\n width: 200%;\n }\n\n @keyframes fade-in {\n from {\n opacity: 0;\n }\n\n to {\n opacity: 0.38;\n }\n }\n\n @keyframes fade-out {\n from {\n opacity: 0.38;\n }\n\n to {\n opacity: 0;\n }\n }\n `\n .events({\n animationend() {\n if (this.hidden) this.remove();\n },\n })\n .autoRegister('mdw-scrim');\n\nconst supportsHTMLDialogElement = typeof HTMLDialogElement !== 'undefined';\n/** @type {PopupStack[]} */\nconst OPEN_POPUPS = [];\n\n/**\n * @return {void}\n */\nfunction onWindowResize() {\n const lastOpenPopup = OPEN_POPUPS.at(-1);\n if (!lastOpenPopup || !lastOpenPopup.originalEvent) {\n return;\n }\n if (lastOpenPopup.pendingResizeOperation) {\n cancelAnimationFrame(lastOpenPopup.pendingResizeOperation);\n }\n lastOpenPopup.pendingResizeOperation = requestAnimationFrame(() => {\n lastOpenPopup.element.updatePopupPosition(lastOpenPopup.originalEvent);\n lastOpenPopup.pendingResizeOperation = null;\n });\n}\n\n/**\n * @param {PopStateEvent} event\n */\nfunction onPopState(event) {\n if (!event.state) return;\n const lastOpenPopup = OPEN_POPUPS.at(-1);\n if (!lastOpenPopup || !lastOpenPopup.previousState) {\n return;\n }\n if ((lastOpenPopup.previousState === event.state) || Object.keys(event.state)\n .every((key) => event.state[key] === lastOpenPopup.previousState[key])) {\n // Close (cancel event) can be prevented. Fire and check if prevented\n const cancelEvent = new Event('cancel', { cancelable: true });\n if (lastOpenPopup.element.dispatchEvent(cancelEvent)) {\n lastOpenPopup.element.close();\n } else {\n // Revert pop state by pushing state again\n window.history.pushState(lastOpenPopup.state, lastOpenPopup.state.title);\n }\n }\n}\n\n/** @param {BeforeUnloadEvent} event */\nfunction onBeforeUnload(event) {\n if (!OPEN_POPUPS.length) return;\n console.warn('Popup was open during page unload (refresh?).');\n}\n\n/**\n * @param {typeof import('../core/CustomElement.js').default} Base\n */\nexport default function PopupMixin(Base) {\n return Base\n .observe({\n open: 'boolean',\n modal: 'boolean',\n _isNativeModal: 'boolean',\n scrollable: 'boolean',\n matchSourceWidth: 'boolean',\n _currentFlow: 'string',\n flow: {\n type: 'string',\n /** @type {'corner'|'adjacent'|'overflow'|'vcenter'|'hcenter'|'center'} */\n value: null,\n },\n })\n .set({\n returnValue: '',\n delegatesFocus: true,\n _closing: false,\n _useScrim: false,\n })\n .define({\n _dialog() {\n return /** @type {HTMLDialogElement} */ (this.refs.dialog);\n },\n })\n .methods({\n /**\n * @param {DOMRect|Element} [anchor]\n * @return {void}\n */\n updatePopupPosition(anchor) {\n const flow = this._currentFlow ?? this.flow;\n this.style.setProperty('min-width', 'none');\n this.style.setProperty('min-height', 'none');\n this.style.setProperty('width', 'auto');\n this.style.setProperty('height', 'auto');\n this.style.setProperty('max-width', 'none');\n this.style.setProperty('max-height', 'none');\n this.style.setProperty('top', '0');\n this.style.setProperty('left', '0');\n this.style.setProperty('--mdw-popup__x-offset', '0');\n this.style.setProperty('--mdw-popup__y-offset', '0');\n\n const layoutElement = this._isNativeModal ? this._dialog : this;\n layoutElement.style.setProperty('width', 'auto');\n layoutElement.style.setProperty('height', 'auto');\n\n const width = (anchor && this.matchSourceWidth)\n ? anchor.clientWidth\n : 56 * Math.ceil(layoutElement.clientWidth / 56);\n\n this.style.setProperty('width', `${width}px`);\n\n const height = layoutElement.clientHeight;\n layoutElement.style.removeProperty('width');\n layoutElement.style.removeProperty('height');\n\n const initialRect = this.getBoundingClientRect();\n /** @type {import('../utils/popup.js').CanAnchorPopUpOptions} */\n const anchorOptions = {\n anchor: anchor == null\n ? this.getBoundingClientRect()\n : (anchor instanceof Element ? anchor.getBoundingClientRect() : anchor),\n width,\n height,\n margin: 0,\n };\n\n const isPageRTL = (getComputedStyle(this).direction === 'rtl');\n const xStart = isPageRTL ? 'right' : 'left';\n const xEnd = isPageRTL ? 'left' : 'right';\n\n /* Automatic Positioning\n *\n * Positions:\n *\n * 3 7 4\n * ┌─────────┐\n * │ │\n * 5 │ 9 │ 6\n * │ │\n * └─────────┘\n * 1 8 2\n *\n * 1: Bottom Left\n * 2: Bottom Right\n * 3: Top Left\n * 4: Top Right\n * 5: VCenter Left\n * 6: VCenter Right\n * 7: HCenter Top\n * 8: HCenter Bottom\n * 9: VCenter HCenter\n *\n * Directions:\n * a - Down LTR\n * b - Down RTL\n * c - Up LTR\n * d - Up RTL\n * e - LTR\n * f - RTL\n * g - Down\n * h - Up\n * i - Center\n *\n *\n * 16 total combos\n * 1a 1b 1c 1d └↘ └↙ └↗ └↖\n * 2a 2b 2c 2d ┘↘ ┘↙ ┘↗ ┘↖\n * 3a 3b 3c 3d ┌↘ ┌↙ ┌↗ ┌↖\n * 4a 4b 4c 4d ┐↘ ┐↙ ┐↗ ┐↖\n *\n * Avoid using opposite angle\n *\n * 1a XX 1c 1d └↘ ██ └↗ └↖\n * XX 2b 2c 2d ██ ┘↙ ┘↗ ┘↖\n * 1a 3b 3c XX ┌↘ ┌↙ ┌↗ ██\n * 4a 4b XX 4d ┐↘ ┐↙ ██ ┐↖\n *\n *\n * Preference Order:\n * - Flow from corner 1a 2b 3c 4d └↘ ┘↙ ┌↗ ┐↖\n * - Open adjacent to target 4a 3b 2c 1d ┐↘ ┌↙ ┘↗ └↖\n * - Overlay target 3a 4b 1c 2d ┌↘ ┐↙ └↗ ┘↖\n * - Open from horizontal side 5e 6f │→ │←\n * - Open from center 9i █·\n */\n\n /** @type {import('../utils/popup.js').CanAnchorPopUpOptions[]} */\n const preferences = [\n ((flow ?? 'corner') === 'corner') ? [\n { clientY: 'bottom', clientX: xStart },\n { clientY: 'bottom', clientX: xEnd },\n { clientY: 'top', clientX: xStart },\n { clientY: 'top', clientX: xEnd },\n ] : [],\n ((flow ?? 'adjacent') === 'adjacent') ? [\n { clientY: 'top', clientX: xEnd, directionX: xEnd, directionY: 'down' },\n { clientY: 'top', clientX: xStart, directionX: xStart, directionY: 'down' },\n { clientY: 'bottom', clientX: xEnd, directionX: xEnd, directionY: 'up' },\n { clientY: 'bottom', clientX: xStart, directionX: xStart, directionY: 'up' },\n ] : [],\n ((flow ?? 'overlay') === 'overlay') ? [\n { clientY: 'top', clientX: xStart, directionX: xEnd, directionY: 'down' },\n { clientY: 'top', clientX: xEnd, directionX: xStart, directionY: 'down' },\n { clientY: 'bottom', clientX: xStart, directionX: xEnd, directionY: 'up' },\n { clientY: 'bottom', clientX: xEnd, directionX: xStart, directionY: 'up' },\n ] : [],\n ((flow ?? 'vcenter') === 'vcenter') ? [\n { clientY: 'center', clientX: xEnd, directionX: xEnd, directionY: 'center' },\n { clientY: 'center', clientX: xStart, directionX: xStart, directionY: 'center' },\n ] : [],\n ((flow ?? 'hcenter') === 'hcenter') ? [\n { clientY: 'bottom', clientX: 'center', directionX: 'center', directionY: 'down' },\n { clientY: 'top', clientX: 'center', directionX: 'center', directionY: 'up' },\n ] : [],\n ((flow ?? 'center') === 'center') ? [\n { clientY: 'center', clientX: 'center', directionX: 'center', directionY: 'center' },\n ] : [],\n ].flat();\n\n let anchorResult;\n for (const preference of preferences) {\n const result = canAnchorPopup({\n ...anchorOptions,\n ...preference,\n });\n if (!anchorResult || anchorResult.visibility < result.visibility) {\n anchorResult = result;\n }\n if (result.visibility === 1) break;\n }\n\n this.style.setProperty('top', `${anchorResult.top - initialRect.y}px`);\n this.style.setProperty('left', `${anchorResult.left - initialRect.x}px`);\n this.style.setProperty('min-width', `${anchorResult.right - anchorResult.left}px`);\n this.style.setProperty('min-height', `${anchorResult.bottom - anchorResult.top}px`);\n this.style.removeProperty('width');\n this.style.removeProperty('height');\n this.style.setProperty('max-width', `${anchorResult.right - anchorResult.left}px`);\n this.style.setProperty('max-height', `${anchorResult.bottom - anchorResult.top}px`);\n this.style.setProperty('transform-origin', `${anchorResult.transformOriginY} ${anchorResult.transformOriginX}`);\n this.scrollIntoView();\n },\n /**\n * @param {Event & {currentTarget: HTMLSlotElement}} event\n * @return {void}\n */\n onSlotChange({ currentTarget }) {\n const nodes = currentTarget.assignedNodes();\n const hasContent = nodes.some((node) => (node.nodeType === node.ELEMENT_NODE)\n || (node.nodeType === node.TEXT_NODE && node.nodeValue.trim().length));\n currentTarget.toggleAttribute('slotted', hasContent);\n },\n\n /**\n * @param {MouseEvent|PointerEvent|HTMLElement|Event} [source]\n * @param {boolean} focus\n * @param {string} flow\n * @return {boolean} handled\n */\n showPopup(source, focus = true, flow = null) {\n if (this.open) return false;\n this.open = true;\n\n // SCRIM\n if (this._useScrim) {\n document.body.append(this.refs.scrim);\n this.refs.scrim.hidden = false;\n } else {\n this.refs.scrim.remove();\n }\n\n const previousFocus = source instanceof HTMLElement ? source : document.activeElement;\n\n if (supportsHTMLDialogElement && focus) {\n // Calling show will force focus which is not intended for non-modals\n this._dialog.show();\n }\n\n this._currentFlow = flow;\n\n // Short first, then move\n // Native modals can fail update bounds on Chrome\n this.updatePopupPosition(source);\n\n const newState = { hash: Math.random().toString(36).slice(2, 18) };\n let previousState = null;\n\n if (!window.history.state) {\n // Create new previous state\n window.history.replaceState({\n hash: Math.random().toString(36).slice(2, 18),\n }, document.title);\n }\n previousState = window.history.state;\n\n const scrollRestoration = window.history.scrollRestoration;\n window.history.scrollRestoration = 'manual';\n window.history.pushState(newState, document.title);\n console.debug('Popup pushed page');\n window.addEventListener('popstate', onPopState);\n window.addEventListener('beforeunload', onBeforeUnload);\n\n window.addEventListener('resize', onWindowResize);\n window.addEventListener('scroll', onWindowResize);\n\n OPEN_POPUPS.push({\n element: this,\n previousFocus,\n state: newState,\n previousState,\n originalEvent: source,\n scrollRestoration,\n });\n\n // Overrideable\n if (focus) {\n console.log('focusing!');\n this.focus();\n }\n\n return true;\n },\n /**\n * @param {MouseEvent|PointerEvent|HTMLElement|Event} [source]\n * @param {boolean} [focus]\n * @param {string} [flow]\n * @return {boolean} handled\n */\n showModal(source, focus, flow) {\n if (this.open) return false;\n this.modal = true;\n if (supportsHTMLDialogElement) {\n this._dialog.showModal();\n this._isNativeModal = true;\n }\n return this.showPopup(source, focus, flow);\n },\n /**\n * @param {MouseEvent|PointerEvent|HTMLElement|Event} [source]\n * @param {boolean} [focus]\n * @param {string} [flow]\n * @return {boolean} handled\n */\n show(source, focus, flow) {\n // Auto-select type based on default platform convention\n // Mac OS X / iPad does not expect clickthrough\n if (navigator.userAgent.includes('Mac OS X')) {\n return this.showModal(source, focus, flow);\n }\n return this.showPopup(source, focus, flow);\n },\n /**\n * @param {any} [returnValue]\n * @param {boolean} [returnFocus=true]\n * @return {boolean} handled\n */\n close(returnValue = undefined, returnFocus = true) {\n if (!this.open) return false;\n if (this._closing) return false;\n this._closing = true;\n this.modal = false;\n\n // SCRIM\n this.refs.scrim.hidden = true;\n\n if (this._isNativeModal) {\n this._isNativeModal = false;\n } else {\n const main = document.querySelector('main');\n if (main) {\n main.removeAttribute('aria-hidden');\n }\n }\n // if (this.dialogElement.getAttribute('aria-hidden') === 'true') return false;\n if (supportsHTMLDialogElement && this._dialog.open) {\n const previousFocus = document.activeElement;\n // Closing a native dialog will return focus automatically.\n this._dialog.close();\n if (!attemptFocus(previousFocus, { preventScroll: true })) {\n document.activeElement?.blur?.();\n }\n } else {\n this._dialog.returnValue = returnValue;\n }\n\n // Will invoke observed attribute change: ('aria-hidden', 'true');\n this.open = false;\n this._currentFlow = null;\n\n this.dispatchEvent(new Event('close'));\n\n const len = OPEN_POPUPS.length;\n for (let i = len - 1; i >= 0; i--) {\n const entry = OPEN_POPUPS[i];\n if (entry.element === this) {\n if (entry.state && window.history\n && window.history.state && entry.state.hash === window.history.state.hash) {\n window.removeEventListener('popstate', onPopState);\n window.history.back();\n // Back does not set state immediately\n // Needed to track submenu\n // TODO: use window.history.go(indexDelta) instead for Safari (not Webkit) submenu support\n window.history.replaceState(entry.previousState, document.title);\n window.history.scrollRestoration = entry.scrollRestoration || 'auto';\n window.addEventListener('popstate', onPopState);\n } else {\n console.warn('Menu state mismatch?', entry, window.history.state);\n }\n if (returnFocus) {\n console.log('not returning focus');\n entry.previousFocus?.focus?.({ preventScroll: true });\n }\n OPEN_POPUPS.splice(i, 1);\n break;\n } else if (this.contains(entry.element)) {\n console.debug('Closing submenu first');\n entry.element.close(false);\n console.debug('Sub menu closed. Continuing...');\n }\n }\n if (!OPEN_POPUPS.length) {\n window.removeEventListener('popstate', onPopState);\n window.removeEventListener('beforeunload', onBeforeUnload);\n window.removeEventListener('resize', onWindowResize);\n console.debug('All menus closed');\n }\n this._closing = false;\n return true;\n },\n })\n .expressions({\n _ariaHidden({ open }) { return (open ? 'false' : 'true'); },\n })\n .html`\n <mdw-scrim id=scrim tabindex=-1 aria-hidden=true></mdw-scrim>\n <dialog id=dialog aria-modal=true role=dialog\n aria-hidden={_ariaHidden} scrollable={scrollable}>\n <slot id=slot on-slotchange={onSlotChange}></slot>\n </dialog>\n `\n .css`\n /* https://m3.material.io/components/dialogs/specs */\n\n :host {\n --mdw-popup__expand-duration: var(--mdw-motion-expand-duration, 250ms);\n --mdw-popup__simple-duration: var(--mdw-motion-simple-duration, 100ms);\n --mdw-popup__standard-easing: var(--mdw-motion-standard-easing, cubic-bezier(0.4, 0.0, 0.2, 1));\n --mdw-popup__deceleration-easing: var(--mdw-motion-deceleration-easing, cubic-bezier(0.0, 0.0, 0.2, 1));\n --mdw-popup__fade-in-duration: var(--mdw-motion-fade-in-duration, 150ms);\n --mdw-popup__x-offset: -50%;\n --mdw-popup__y-offset: -50%;\n\n --mdw-shape__size: 28px;\n\n --mdw-surface__shadow__resting: var(--mdw-surface__shadow__3);\n --mdw-surface__shadow__raised: var(--mdw-surface__shadow__resting);\n /* padding-inline: 12px; */\n\n --mdw-bg: var(--mdw-color__surface);\n --mdw-ink: var(--mdw-color__on-surface);\n\n position: fixed;\n\n /* stylelint-disable-next-line liberty/use-logical-spec */\n top: 50%;\n /* stylelint-disable-next-line liberty/use-logical-spec */\n left: 50%;\n align-self: center;\n justify-self: center;\n\n display: block;\n overflow: auto;\n -webkit-overflow-scrolling: touch;\n overscroll-behavior: none;\n overscroll-behavior: contain;\n\n box-sizing: border-box;\n block-size: auto;\n min-block-size: none;\n max-block-size: 100vh;\n inline-size: auto;\n min-inline-size: none;\n max-inline-size: 100vw;\n \n \n pointer-events: none;\n\n opacity: 0;\n\n transform: translateX(var(--mdw-popup__x-offset)) translateY(var(--mdw-popup__y-offset)) scale(0) ;\n /* visiblity:hidden still registers events, hide from pointer with scale(0) */\n transform-origin: top center;\n visibility: hidden;\n z-index: 24;\n\n color: rgb(var(--mdw-ink));\n\n font: var(--mdw-type__font);\n letter-spacing: var(--mdw-type__letter-spacing);\n\n transition-delay: 0s, 200ms, 200ms;\n transition-duration: 200ms, 0s, 0s;\n transition-property: opacity, transform, visibility;\n transition-timing-function: ease-out;\n\n will-change: display, transform;\n will-change: opacity;\n\n }\n\n :host([open]) {\n pointer-events: auto;\n\n opacity: 1;\n\n transform: translateX(var(--mdw-popup__x-offset)) translateY(var(--mdw-popup__y-offset)) scale(1);\n visibility: visible;\n\n transition-delay: 0s;\n transition-duration: 0s;\n transition-timing-function: ease-in;\n }\n\n \n\n #dialog {\n position: static;\n inset-block-start: 0;\n inset-inline-start: 0;\n\n display: contents;\n align-items: inherit;\n flex-direction: inherit;\n gap: inherit;\n justify-content: inherit;\n justify-items: inherit;\n place-items: inherit;\n\n box-sizing: border-box;\n\n block-size: inherit;\n \n \n flex: inherit;\n margin:0;\n border: none;\n padding: inherit;\n padding: 0;\n\n pointer-events: auto;\n\n opacity: 1;\n\n transform:inherit;\n visibility: inherit;\n /* visiblity:hidden still registers events, hide from pointer with scale(0) */\n z-index: 24;\n\n background-color: transparent;\n\n color:inherit;\n \n }\n\n :host([scrollable]) {\n overflow-y:auto;\n }\n\n #dialog::backdrop {\n /** Use scrim instead */\n background-color: transparent;\n }\n\n #dialog:modal {\n position: inherit;\n inset: inherit;\n\n display: inherit;\n align-items: inherit;\n flex-direction: inherit;\n gap: inherit;\n justify-content: inherit;\n justify-items: inherit;\n place-items: inherit;\n\n block-size: auto;\n min-block-size: inherit;\n max-block-size: inherit;\n\n inline-size:auto;\n min-inline-size: inherit;\n max-inline-size: inherit;\n flex: inherit;\n padding: inherit;\n\n pointer-events: auto;\n\n transform: inherit;\n visibility: inherit;\n }\n\n #dialog[scrollable][open] {\n display: inherit;\n align-items: inherit;\n flex-direction: inherit;\n gap: inherit;\n justify-content: inherit;\n justify-items: inherit;\n \n place-items: inherit;\n\n height: 100%;\n max-height: none;\n width: 100%;\n max-width: none;\n\n flex: 1;\n }\n\n \n\n #dialog[scrollable][open]:modal {\n overflow:auto;\n\n height:100%;\n min-height: none;\n max-height: inherit;\n width:100%;\n min-width: none;\n max-width: inherit;\n flex: inherit;\n padding: inherit;\n }\n\n \n `\n .childEvents({\n dialog: {\n cancel(event) {\n event.stopPropagation();\n const cancelEvent = new Event('cancel', { cancelable: true });\n if (!this.dispatchEvent(cancelEvent)) {\n event.preventDefault();\n }\n },\n close(event) {\n event.stopPropagation();\n this.close(this.returnValue);\n },\n '~click'(event) {\n // Track if click on backdrop\n if (event.target !== event.currentTarget) return;\n if (!this._isNativeModal) return;\n if (event.offsetX >= 0 && event.offsetX < event.currentTarget.offsetWidth\n && event.offsetY >= 0 && event.offsetY < event.currentTarget.offsetHeight) return;\n const cancelEvent = new Event('cancel', { cancelable: true });\n if (!this.dispatchEvent(cancelEvent)) return;\n this.close();\n },\n },\n scrim: {\n '~click'() {\n const cancelEvent = new Event('cancel', { cancelable: true });\n if (!this.dispatchEvent(cancelEvent)) return;\n this.close();\n },\n },\n });\n}\n", "import './Button.js';\nimport './Divider.js';\nimport './Icon.js';\nimport './DialogActions.js';\n\nimport CustomElement from '../core/CustomElement.js';\nimport { attemptFocus } from '../core/dom.js';\nimport PopupMixin from '../mixins/PopupMixin.js';\nimport ShapeMixin from '../mixins/ShapeMixin.js';\nimport SurfaceMixin from '../mixins/SurfaceMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\n/**\n * Returns array of elements that *may* be focusable over tab\n * @param {Node} root\n * @return {Element[]}\n */\nfunction listTabbables(root) {\n const treeWalker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT);\n const focusables = [];\n /** @type {Element} */\n let node;\n while ((node = treeWalker.nextNode())) {\n if (node.tagName === 'SLOT') {\n for (const el of (/** @type {HTMLSlotElement} */ (node)).assignedElements()) {\n if (el.tabIndex >= 0 && !el.matches(':disabled')) {\n focusables.push(el);\n }\n focusables.push(...listTabbables(el));\n }\n }\n if (node.tabIndex >= 0 && !node.matches(':disabled')) {\n focusables.push(node);\n }\n }\n return focusables;\n}\n\n/**\n * Iterate through root looking for autofocusable, or first focusable element\n * Attempt focus on each and return true if successful\n * @param {Node} root\n * @param {boolean} [autofocus=true]\n * @param {boolean} [forward=true]\n * @return {boolean} focused\n */\nfunction focusOnTree(root, autofocus, forward = true) {\n const treeWalker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT);\n const focusables = [];\n /** @type {Element} */\n let node;\n while ((node = treeWalker.nextNode())) {\n if (autofocus && node.hasAttribute('autofocus')) {\n if (attemptFocus(node)) return true;\n continue;\n }\n if (node.tagName === 'SLOT') {\n for (const el of (/** @type {HTMLSlotElement} */ (node)).assignedElements({ flatten: true })) {\n if (autofocus && el.hasAttribute('autofocus')) {\n if (attemptFocus(el)) return true;\n continue;\n }\n if (el.tabIndex >= 0) {\n // Can focus, add to later in case we find an autofocusable\n if (autofocus || !forward) {\n focusables.push(node);\n } else if (attemptFocus(node)) return true;\n }\n if (focusOnTree(el, autofocus, forward)) return true;\n }\n // Step through\n }\n if (node.tabIndex >= 0) {\n if (autofocus || !forward) {\n focusables.push(node);\n } else if (attemptFocus(node)) return true;\n }\n }\n for (const el of forward ? focusables : focusables.reverse()) {\n if (attemptFocus(el)) return true;\n }\n return false;\n}\n\nexport default CustomElement\n .extend()\n .mixin(ThemableMixin)\n .mixin(SurfaceMixin)\n .mixin(ShapeMixin)\n .mixin(PopupMixin)\n .define({\n returnValue() {\n return /** @type {HTMLDialogElement} */ (this.refs.dialog).returnValue;\n },\n })\n .observe({\n dividers: {\n /** @type {'full'|''|'inset'} */\n value: null,\n },\n headline: 'string',\n icon: 'string',\n default: { value: 'confirm' },\n cancel: { value: 'Cancel' },\n confirm: { value: 'Confirm' },\n })\n .set({\n _useScrim: true,\n })\n .overrides({\n updatePopupPosition() {\n // noop (keep centered);\n },\n })\n .methods({\n /**\n * @param {Event & {currentTarget: HTMLSlotElement}} event\n * @return {void}\n */\n onSlotChange({ currentTarget }) {\n const nodes = currentTarget.assignedNodes();\n const hasContent = nodes.some((node) => (node.nodeType === node.ELEMENT_NODE)\n || (node.nodeType === node.TEXT_NODE && node.nodeValue.trim().length));\n currentTarget.toggleAttribute('slotted', hasContent);\n },\n\n /**\n * @param {SubmitEvent & {currentTarget: HTMLFormElement}} event\n * @return {void}\n */\n onFormSubmit(event) {\n if (event.currentTarget.assignedSlot) {\n // Custom form.\n // @ts-ignore Skip cast\n const returnValue = event.submitter?.value;\n this.close(returnValue);\n event.preventDefault();\n }\n },\n\n /**\n * @param {Event & {currentTarget: HTMLFormElement}} event\n * @return {void}\n */\n onFormSlotChange({ currentTarget }) {\n /** @type {HTMLFormElement} */\n const [form] = currentTarget.assignedNodes();\n form?.addEventListener('submit', (e) => this.onFormSubmit(e));\n },\n focus() {\n focusOnTree(this.shadowRoot, true, true);\n },\n })\n .expressions({\n cancelAutoFocus({ default: d }) { return d === 'cancel'; },\n confirmAutoFocus({ default: d }) { return d === 'confirm'; },\n })\n .html`\n <div id=prepend>\n <mdw-icon mdw-if={icon} id=icon class=content ink=secondary aria-hidden=true>{icon}</mdw-icon>\n <slot id=headline name=headline on-slotchange={onSlotChange} role=header>{headline}</slot>\n <slot id=fixed name=fixed class=content on-slotchange={onSlotChange}></slot>\n <mdw-divider id=divider-top size={dividers}></mdw-divider>\n </div>\n <div id=append>\n <mdw-divider id=divider-bottom size={dividers}></mdw-divider>\n <slot name=form id=form-slot on-slotchange={onFormSlotChange}>\n <form id=form method=dialog role=none on-submit={onFormSubmit}>\n <mdw-dialog-actions>\n <mdw-button id=cancel type=submit value=cancel\n autofocus={cancelAutoFocus}>{cancel}</mdw-button>\n <mdw-button id=confirm type=submit value=confirm\n autofocus={confirmAutoFocus}>{confirm}</mdw-button>\n </mdw-dialog-actions>\n </form>\n </slot>\n </div>\n `\n .on({\n composed() {\n const { prepend, append, surface, shape, dialog, slot } = this.refs;\n dialog.setAttribute('aria-labelledby', 'headline');\n dialog.setAttribute('aria-describedby', 'slot');\n surface.append(shape);\n\n slot.classList.add('content');\n\n dialog.prepend(surface, ...prepend.childNodes);\n dialog.append(...append.childNodes);\n prepend.remove();\n append.remove();\n },\n })\n .css`\n /* https://m3.material.io/components/dialogs/specs */\n\n :host {\n --mdw-shape__size: 28px;\n\n --mdw-surface__shadow__resting: var(--mdw-surface__shadow__3);\n --mdw-surface__shadow__raised: var(--mdw-surface__shadow__resting);\n /* padding-inline: 12px; */\n\n --mdw-bg: var(--mdw-color__surface-container-high);\n --mdw-ink: var(--mdw-color__on-surface);\n position: fixed;\n\n /* stylelint-disable-next-line liberty/use-logical-spec */\n top: 50%;\n /* stylelint-disable-next-line liberty/use-logical-spec */\n left: 50%;\n\n display: flex;\n align-items: flex-start;\n flex-direction: column;\n justify-content: center;\n overflow: visible;\n -webkit-overflow-scrolling: touch;\n overscroll-behavior: none;\n overscroll-behavior: contain;\n\n box-sizing: border-box;\n max-block-size: calc(100% - 40px);\n inline-size: max-content;\n min-inline-size: 280px;\n max-inline-size: min(560px, calc(100% - 40px));\n\n padding-block-start: 8px;\n\n pointer-events: none;\n\n opacity: 0;\n\n transform: translateX(-50%) translateY(-50%) scale(0);\n /* visiblity:hidden still registers events, hide from pointer with scale(0) */\n transform-origin: top center;\n visibility: hidden;\n\n color: rgb(var(--mdw-ink));\n\n font: var(--mdw-type__font);\n letter-spacing: var(--mdw-type__letter-spacing);\n\n transition-delay: 0s, 200ms, 200ms;\n transition-duration: 200ms, 0s, 0s;\n transition-property: opacity, transform, visibility;\n transition-timing-function: ease-out;\n will-change: display, transform, opacity;\n }\n\n #dialog:modal {\n overflow: visible;\n }\n\n :host([icon]) {\n align-items: center;\n }\n\n #shape {\n background-color: rgb(var(--mdw-bg));\n }\n\n #icon {\n padding-block-start: 16px;\n\n font-size: 24px;\n }\n\n #headline {\n display: block;\n\n padding-block-start: 16px;\n padding-inline: 24px;\n\n font: var(--mdw-typescale__headline-small__font);\n letter-spacing: var(--mdw-typescale__headline-small__letter-spacing);\n }\n\n #headline:not([slotted]):empty {\n display: none;\n }\n\n #body {\n padding-block: 16px;\n }\n\n .content {\n padding-inline: 24px;\n }\n\n #divider-top {\n padding-block-start: 16px;\n }\n\n mdw-divider:not([size]) {\n color: transparent;\n }\n\n mdw-divider[size=\"inset\"] {\n padding-inline: 24px;\n }\n\n #fixed {\n display:block;\n\n padding-block-start: 16px;\n\n color: rgb(var(--mdw-color__on-surface-variant));\n\n font: var(--mdw-typescale__body-medium__font);\n letter-spacing: var(--mdw-typescale__body-medium__letter-spacing);\n }\n\n #fixed:not([slotted]) {\n display: none;\n }\n\n #slot {\n display:block;\n\n overflow-y: auto;\n\n color: rgb(var(--mdw-color__on-surface-variant));\n\n font: var(--mdw-typescale__body-medium__font);\n letter-spacing: var(--mdw-typescale__body-medium__letter-spacing);\n }\n\n #scroller {\n display: block;\n overflow-y: auto;\n }\n\n #form {\n display: contents;\n }\n\n #form-slot::slotted(form) {\n display: contents;\n }\n `\n .events({\n keydown(event) {\n if (event.key === 'Tab') {\n if (!this._isNativeModal) {\n // Tab trap\n event.preventDefault();\n const tabbables = listTabbables(this.shadowRoot);\n if (event.shiftKey) {\n tabbables.reverse();\n }\n let focusNext = false;\n let focused = false;\n // Find and mark next\n for (const el of tabbables) {\n if (focusNext) {\n if (attemptFocus(el)) {\n focused = true;\n break;\n }\n } else {\n focusNext = el.matches(':focus');\n }\n }\n // Loop\n if (!focused) {\n for (const el of tabbables) {\n if (attemptFocus(el)) {\n return;\n }\n }\n }\n }\n return;\n }\n\n if (event.key === 'Escape' || event.key === 'Esc') {\n event.preventDefault();\n event.stopPropagation();\n const cancelEvent = new Event('cancel', { cancelable: true });\n if (this.dispatchEvent(cancelEvent)) {\n this.close();\n }\n }\n },\n focusout(event) {\n if (!this.open) return;\n if (this._closing) return;\n if (this.modal) return;\n if (event.relatedTarget === this.refs.scrim) return;\n\n // Wait until end of event loop cycle to see if focus really is lost\n queueMicrotask(() => {\n if (this.matches(':focus-within')) return;\n const activeElement = document.activeElement;\n if (activeElement && this.contains(activeElement)) {\n return;\n }\n // Focus has left dialog (programmatic?)\n // Invoke cancel without returning focus\n this.close(undefined, false);\n });\n },\n })\n .childEvents({\n dialog: {\n cancel(event) {\n event.stopPropagation();\n const cancelEvent = new Event('cancel', { cancelable: true });\n if (!this.dispatchEvent(cancelEvent)) {\n event.preventDefault();\n }\n },\n close(event) {\n event.stopPropagation();\n this.close(this.returnValue);\n },\n '~click'(event) {\n // Track if click on backdrop\n if (event.target !== event.currentTarget) return;\n if (!this._isNativeModal) return;\n if (event.offsetX >= 0 && event.offsetX < event.currentTarget.offsetWidth\n && event.offsetY >= 0 && event.offsetY < event.currentTarget.offsetHeight) return;\n const cancelEvent = new Event('cancel', { cancelable: true });\n if (!this.dispatchEvent(cancelEvent)) return;\n this.close();\n },\n },\n })\n .autoRegister('mdw-dialog');\n", "import Button from './Button.js';\n\nexport default Button\n .extend()\n .css`\n /* https://m3.material.io/components/extended-fab/specs */\n\n :host {\n --mdw-bg: var(--mdw-color__surface-container-high);\n --mdw-ink: var(--mdw-color__primary);\n --mdw-shape__size: 16px;\n --mdw-surface__shadow__resting: var(--mdw-surface__shadow__3);\n --mdw-surface__shadow__raised: var(--mdw-surface__shadow__4);\n min-inline-size: 48px;\n padding: calc(16px + (var(--mdw-density) * 2px));\n }\n\n #icon {\n font-size: 24px;\n }\n\n :host(:where([lowered])) {\n --mdw-bg: var(--mdw-color__surface-container-low);\n --mdw-surface__shadow__resting: var(--mdw-surface__shadow__1);\n --mdw-surface__shadow__raised: var(--mdw-surface__shadow__2);\n }\n `\n .observe({\n filled: { empty: 'tonal' },\n elevated: { type: 'boolean', empty: true },\n })\n .autoRegister('mdw-extended-fab');\n", "import AriaReflectorMixin from '../mixins/AriaReflectorMixin.js';\n\nimport Surface from './Surface.js';\n\nexport default Surface\n .extend()\n .mixin(AriaReflectorMixin)\n .set({\n _ariaRole: 'tooltip',\n })\n .observe({\n open: {\n type: 'boolean',\n changedCallback(oldValue, newValue) {\n this.updateAriaProperty('ariaHidden', newValue ? 'true' : 'false');\n },\n },\n touch: 'boolean',\n })\n .css`\n /* https://m2.material.io/components/tooltips */\n\n :host {\n --mdw-shape__size: var(--mdw-shape__extra-small);\n --mdw-ink: var(--mdw-color__on-surface-variant);\n --mdw-shape__bg: rgb(var(--mdw-color__surface-container));\n display: block;\n vertical-align: middle;\n\n box-sizing: border-box;\n /* stylelint-disable-next-line declaration-property-value-disallowed-list */\n margin-inline: auto;\n padding-block: 4px;\n padding-inline: 8px;\n\n pointer-events: none;\n\n opacity: 0;\n transform: scale(0);\n z-index: 24;\n\n font: var(--mdw-typescale__label-medium__font);\n letter-spacing: var(--mdw-typescale__label-medium__letter-spacing);\n\n transition: transform 200ms, opacity 200ms;\n\n }\n\n :host([touch]) {\n padding-block: 6px;\n padding-inline: 16px;\n\n font: var(--mdw-typescale__label-large__font);\n letter-spacing: var(--mdw-typescale__label-large__letter-spacing);\n }\n\n :host([open]) {\n opacity: 1;\n transform: scale(1);\n }\n `\n .autoRegister('mdw-tooltip');\n", "import '../components/Tooltip.js';\nimport { canAnchorPopup } from '../utils/popup.js';\n\n/**\n * @param {ReturnType<import('./StateMixin.js').default>} Base\n */\nexport default function TooltipTriggerMixin(Base) {\n class TooltipTrigger extends Base {\n static {\n this.on({\n composed({ template, html }) {\n template.append(html`\n <mdw-tooltip role=tooltip id=tooltip>\n <slot id=tooltip-slot on-slotchange={onTooltipTriggerSlotChange} name=tooltip>{tooltip}</slot>\n </mdw-tooltip>\n `);\n },\n });\n // eslint-disable-next-line no-unused-expressions\n this.css`\n #tooltip {\n position:absolute;\n \n overflow: hidden;\n \n box-sizing: content-box;\n \n block-size: 0;\n inline-size: 0;\n margin: 0;\n padding: 0;\n \n transform: none;\n }\n \n #tooltip[open] {\n display: block;\n \n block-size: auto;\n inline-size: auto;\n \n cursor: default;\n pointer-events:auto;\n \n opacity: 0;\n transform: none;\n }\n `;\n }\n\n static TOOLTIP_MOUSE_IDLE_MS = 500;\n\n static TOOLTIP_TOUCH_IDLE_MS = 1500;\n\n /** @type {InstanceType<Tooltip>} */\n #tooltip;\n\n /** @type {any} */\n #idleDebounce;\n\n #pendingHide = false;\n\n /** @type {HTMLElement[]} */\n #watchedParents = [];\n\n #resizeObserver;\n\n #intersectObserver;\n\n onParentScroll = (event) => {\n this.updateTooltipPosition();\n };\n\n /** @param {any[]} args */\n constructor(...args) {\n super(...args);\n this.#tooltip = /** @type {InstanceType<Tooltip>} */ (this.refs.tooltip.cloneNode(true));\n this.#tooltip.removeAttribute('id');\n this.#tooltip.style.setProperty('position', 'fixed');\n this.#tooltip.setAttribute('aria-hidden', 'true');\n this.#resizeObserver = new ResizeObserver((entries) => {\n // console.log('RO', entries);\n if (!this.#tooltip.open) return;\n this.updateTooltipPosition();\n });\n const threshold = [0, 0.49, 0.5, 0.51, 1];\n this.#intersectObserver = new IntersectionObserver((entries) => {\n // console.log('IO', entries);\n if (!this.#tooltip.open) return;\n for (const entry of entries) {\n if (entry.intersectionRatio <= 0) {\n console.debug('Hide tooltip due to tooltip occlusion');\n this.hideTooltip();\n return;\n }\n if (entry.target === this.#tooltip) {\n console.debug('Reposition tooltip due to possible tooltip occlusion');\n this.updateTooltipPosition();\n return;\n }\n if (entry.target === this) {\n if (entry.intersectionRatio <= 0.5) {\n console.debug('Hiding tooltip because target is occluded');\n this.hideTooltip();\n } else {\n console.debug('Using InsectionObserver rect to update tooltip');\n this.updateTooltipPosition(entry.boundingClientRect);\n }\n return;\n }\n }\n console.debug('Updating tooltip position because offsetParent change.');\n this.updateTooltipPosition();\n }, { threshold });\n // this.#tooltip.remove();\n }\n\n /**\n * @param {Event & {currentTarget: HTMLSlotElement}} event\n * @return {void}\n */\n onTooltipTriggerSlotChange(event) {\n const tooltip = this.tooltipClone;\n tooltip.replaceChildren(\n ...event.currentTarget.assignedNodes()\n .map((child) => child.cloneNode(true)),\n );\n }\n\n /**\n * @this {TooltipTrigger} this\n * @param {FocusEvent} event\n * @return {void}\n */\n onTooltipTriggerFocus(event) {\n // console.log('getting focus', event);\n if (this.disabledState) return;\n if (this.matches(':active')) {\n // console.log('abort from active');\n return;\n }\n this.showTooltip();\n }\n\n /**\n * @this {TooltipTrigger} this\n * @param {KeyboardEvent} event\n * @return {void}\n */\n onTooltipTriggerKeydown(event) {\n if (event.ctrlKey) this.hideTooltip();\n }\n\n /**\n * @this {TooltipTrigger} this\n * @return {void}\n */\n onTooltipTriggerBlur() {\n this.hideTooltip();\n }\n\n /**\n * @param {MouseEvent|TouchEvent} event\n * @this {TooltipTrigger} this\n * @return {void}\n */\n onTooltipTriggerPointer(event) {\n if (this.disabledState) return;\n // console.log('tooltip event', event.type);\n switch (event.type) {\n case 'touchstart':\n this.scheduleShowTooltip('touch');\n break;\n case 'touchend':\n case 'touchcancel':\n this.scheduleHideTooltip('touch');\n break;\n case 'click':\n case 'mouseout':\n this.cancelShowTooltip();\n this.hideTooltip();\n break;\n case 'mousemove':\n case 'mouseover':\n this.scheduleShowTooltip('mouse');\n break;\n default:\n }\n }\n\n get tooltipClone() {\n return this.#tooltip;\n }\n\n get clonedTooltip() {\n return this.#tooltip;\n }\n\n cancelShowTooltip() {\n // console.log('cancel tooltiptimer');\n clearTimeout(this.#idleDebounce);\n }\n\n /** @param {'mouse'|'touch'|'keyboard'} type */\n scheduleHideTooltip(type) {\n clearTimeout(this.#idleDebounce);\n if (!this.#tooltip.open) {\n // console.log('abort schedule (shown)');\n return;\n }\n let timeout = 0;\n switch (type) {\n case 'mouse':\n timeout = 0;\n break;\n case 'touch':\n timeout = 1500;\n break;\n default:\n }\n // console.log('schedule tooltiptimer');\n this.#idleDebounce = setTimeout(() => {\n // console.log('hide timeout');\n this.hideTooltip();\n }, timeout);\n }\n\n /** @param {'mouse'|'touch'|'keyboard'} type */\n scheduleShowTooltip(type) {\n if (this.#tooltip.open) {\n // console.log('abort schedule (shown)');\n return;\n }\n let timeout = 0;\n switch (type) {\n case 'mouse':\n timeout = this.constructor.TOOLTIP_MOUSE_IDLE_MS;\n break;\n case 'touch':\n timeout = this.constructor.TOOLTIP_TOUCH_IDLE_MS;\n break;\n default:\n }\n // console.log('schedule tooltiptimer');\n clearTimeout(this.#idleDebounce);\n this.#idleDebounce = setTimeout(() => {\n // console.log('idle');\n this.showTooltip(type === 'touch');\n }, timeout);\n }\n\n showTooltip(touch = false) {\n if (this.#tooltip.open) return;\n this.refs.tooltip.open = true;\n this.refs.tooltip.touch = touch;\n this.#tooltip.touch = touch;\n document.body.append(this.#tooltip);\n this.updateTooltipPosition();\n this.#resizeObserver.observe(this, { box: 'border-box' });\n this.#intersectObserver.observe(this);\n this.#intersectObserver.observe(this.#tooltip);\n /** @type {HTMLElement} */\n let offsetParent = this;\n while ((offsetParent = offsetParent.offsetParent)) {\n this.#resizeObserver.observe(offsetParent, { box: 'border-box' });\n // console.log('observing', offsetParent);\n this.#watchedParents.push(offsetParent);\n this.#intersectObserver.observe(offsetParent);\n offsetParent.addEventListener('scroll', this.onParentScroll);\n }\n window.addEventListener('scroll', this.onParentScroll);\n\n // console.log('offsetparent', this.offsetParent);\n\n this.#tooltip.open = true;\n }\n\n hideTooltip() {\n this.#resizeObserver.disconnect();\n this.#intersectObserver.disconnect();\n let parent;\n while ((parent = this.#watchedParents.pop())) {\n parent.removeEventListener('scroll', this.onParentScroll);\n }\n window.removeEventListener('scroll', this.onParentScroll);\n this.#tooltip.open = false;\n this.#tooltip.remove();\n this.refs.tooltip.open = false;\n const hoverStyle = this.refs.tooltip.style;\n hoverStyle.removeProperty('width');\n hoverStyle.removeProperty('height');\n }\n\n /**\n * @param {DOMRect} [domRect]\n * @return {void}\n */\n updateTooltipPosition(domRect) {\n const offset = 8;\n // const margin = 8;\n /** @type {import('../utils/popup.js').CanAnchorPopUpOptions} */\n const anchorOptions = {\n anchor: domRect ?? this.getBoundingClientRect(),\n width: this.#tooltip.clientWidth,\n height: this.#tooltip.clientHeight,\n // margin,\n };\n\n const isPageRTL = (getComputedStyle(this).direction === 'rtl');\n const xStart = isPageRTL ? 'right' : 'left';\n const xEnd = isPageRTL ? 'left' : 'right';\n /** @type {import('../utils/popup.js').CanAnchorPopUpOptions[]} */\n const preferences = [\n { clientY: 'bottom', clientX: 'center', offsetY: offset },\n { clientY: 'bottom', clientX: xStart, offsetY: offset },\n { clientY: 'bottom', clientX: xEnd, offsetY: offset },\n { clientY: 'top', clientX: 'center', offsetY: -offset },\n { clientY: 'top', clientX: xStart, offsetY: -offset },\n { clientY: 'top', clientX: xEnd, offsetY: -offset },\n ];\n\n let anchorResult;\n for (const preference of preferences) {\n const result = canAnchorPopup({\n ...anchorOptions,\n ...preference,\n });\n if (!anchorResult || anchorResult.visibility < result.visibility) {\n anchorResult = result;\n }\n if (result.visibility === 1) break;\n }\n\n this.#tooltip.style.setProperty('top', `${anchorResult.top}px`);\n this.#tooltip.style.setProperty('left', `${anchorResult.left}px`);\n this.#tooltip.style.setProperty('margin', '0');\n this.#tooltip.style.setProperty('transform-origin', `${anchorResult.transformOriginY} ${anchorResult.transformOriginX}`);\n\n const hoverStyle = this.refs.tooltip.style;\n hoverStyle.setProperty('width', `${anchorResult.width + (anchorResult.offsetX * 2)}px`);\n hoverStyle.setProperty('height', `${anchorResult.height + (anchorResult.offsetY)}px`);\n if (anchorResult.clientY === 'bottom') {\n hoverStyle.setProperty('top', '100%');\n hoverStyle.removeProperty('bottom');\n } else {\n hoverStyle.removeProperty('top');\n hoverStyle.setProperty('height', `${anchorResult.height + (anchorResult.offsetY)}px`);\n hoverStyle.setProperty('bottom', '100%');\n }\n switch (anchorResult.clientX) {\n case 'left':\n hoverStyle.setProperty('left', '0');\n hoverStyle.removeProperty('right');\n break;\n default:\n case 'center':\n hoverStyle.removeProperty('left');\n hoverStyle.removeProperty('right');\n break;\n case 'right':\n hoverStyle.removeProperty('left');\n hoverStyle.setProperty('right', '0');\n }\n }\n\n connectedCallback() {\n super.connectedCallback();\n for (const type of ['click', 'mousedown', 'mousemove', 'mouseout',\n 'touchmove', 'touchstart', 'touchend', 'touchleave', 'touchcancel']) {\n this.addEventListener(type, this.onTooltipTriggerPointer, { passive: true });\n }\n this.addEventListener('focus', this.onTooltipTriggerFocus);\n this.addEventListener('blur', this.onTooltipTriggerBlur);\n this.addEventListener('keydown', this.onTooltipTriggerKeydown, { passive: true });\n }\n\n disconnectedCallback() {\n // console.log('disconnected');\n this.hideTooltip();\n super.disconnectedCallback();\n }\n }\n TooltipTrigger.prototype.tooltip = TooltipTrigger.prop('tooltip');\n return TooltipTrigger;\n}\n", "import TooltipTriggerMixin from '../mixins/TooltipTriggerMixin.js';\n\nimport ExtendedFab from './ExtendedFab.js';\n\nexport default ExtendedFab\n .extend()\n .mixin(TooltipTriggerMixin)\n .observe({\n fabSize: {\n /** @type {null|'small'|'large'} */\n value: null,\n },\n })\n .css`\n /* https://m3.material.io/components/floating-action-button/specs */\n\n :host {\n min-inline-size: 24px;\n }\n\n #icon {\n font-size: 24px;\n }\n\n #icon[fab-size=\"large\"] {\n font-size: 36px;\n }\n\n :host([fab-size=\"small\"]) {\n --mdw-shape__size: 12px;\n padding: calc(8px + (var(--mdw-density) * 2px));\n }\n\n :host([fab-size=\"large\"]) {\n --mdw-shape__size: 28px;\n padding: calc(30px + (var(--mdw-density) * 2px));\n }\n `\n .on({\n composed() {\n const { slot, tooltipSlot, control, shape, icon } = this.refs;\n slot.remove();\n tooltipSlot.removeAttribute('name');\n control.setAttribute('aria-labelledby', 'tooltip');\n shape.setAttribute('fab-size', '{fabSize}');\n icon.setAttribute('fab-size', '{fabSize}');\n },\n })\n .autoRegister('mdw-fab');\n", "import './Icon.js';\n\nimport Chip from './Chip.js';\n\nexport default Chip\n .extend()\n .observe({\n type: { empty: 'checkbox' },\n dropdown: 'boolean',\n trailingSrc: 'string',\n trailingIcon: 'string',\n })\n .expressions({\n computedTrailingIcon: ({ trailingIcon, dropdown, trailingSrc }) => {\n if (trailingIcon) return trailingIcon;\n if (dropdown) return 'arrow_drop_down';\n if (trailingSrc) return '';\n return null;\n },\n })\n .html`\n <mdw-icon mdw-if={!icon} id=check-icon disabled={disabledState} selected={checked} aria-hidden=true>check</mdw-icon>\n <mdw-icon mdw-if={computedTrailingIcon} id=trailing-icon aria-hidden=true src={trailingSrc}>{computedTrailingIcon}</mdw-icon>\n `\n .on({\n composed() {\n const { shape, icon, control, outline, slot, trailingIcon, checkIcon } = this.refs;\n\n shape.setAttribute('selected', '{checked}');\n shape.setAttribute('icon', '');\n shape.setAttribute('trailing-icon', '{computedTrailingIcon}');\n icon.setAttribute('mdw-if', '{icon}');\n icon.setAttribute('ink', '{iconInk}');\n\n control.removeAttribute('role');\n\n outline.removeAttribute('ink');\n outline.removeAttribute('color');\n outline.setAttribute('selected', '{checked}');\n\n slot.removeAttribute('ink');\n slot.removeAttribute('color');\n\n slot.before(checkIcon);\n slot.after(trailingIcon);\n },\n })\n .css`\n /* https://m3.material.io/components/chips/specs */\n\n /* Filter Chips can be elevated */\n\n :host {\n --mdw-ink: var(--mdw-color__on-secondary-container);\n --mdw-bg: var(--mdw-color__secondary-container);\n gap: 8px;\n\n padding-inline-start: max(4px, calc(8px + (var(--mdw-density) * 2px)));\n padding-inline-end: max(12px, calc(16px + (var(--mdw-density) * 2px)));\n\n color: rgb(var(--mdw-color__on-surface-variant));\n\n }\n\n :host(:focus) {\n --mdw-outline__rgb: var(--mdw-color__outline);\n }\n\n #icon[selected] {\n font-variation-settings: 'FILL' 1;\n }\n\n #shape {\n background-color: transparent;\n }\n\n :host(:where([trailing-icon],[dropdown],[trailing-src])) {\n padding-inline-start: max(4px, calc(8px + (var(--mdw-density) * 2px)));\n }\n\n #shape[elevated] {\n background-color: rgb(var(--mdw-color__surface));\n }\n\n #shape[selected] {\n background-color: rgb(var(--mdw-bg));\n }\n\n :host([selected]) {\n color: rgb(var(--mdw-ink));\n }\n\n #outline[selected] {\n opacity: 0;\n }\n\n #trailing-icon {\n position: relative;\n\n font-size: 18px;\n }\n\n .mdw-chip__checkbox {\n position: absolute;\n\n max-block-size: 0;\n max-inline-size: 0;\n\n appearance: none;\n pointer-events: none;\n }\n\n #check-icon {\n font-size: 0;\n }\n\n #check-icon[selected] {\n font-size: 18px;\n }\n\n #check-icon[disabled] {\n color: rgba(var(--mdw-color__on-surface), 0.38);\n }\n\n #shape[disabled]:is([elevated],[selected]) {\n background-color: rgba(var(--mdw-color__on-surface), 0.12);\n /* color: rgba(var(--mdw-color__on-surface), 0.38); */\n }\n\n `\n .autoRegister('mdw-filter-chip');\n", "import ThemableMixin from '../mixins/ThemableMixin.js';\n\nimport Box from './Box.js';\n\nexport default Box\n .extend()\n .mixin(ThemableMixin)\n .observe({\n ariaLevel: 'string',\n size: {\n type: 'string',\n /** @type {'large'|'medium'|'small'} */\n empty: 'large',\n },\n })\n .expressions({\n computeAriaLevel({ ariaLevel, size }) {\n if (ariaLevel) return ariaLevel;\n if (size === 'medium') return '2';\n if (size === 'small') return '3';\n return '1';\n },\n })\n .on({\n composed() {\n const { slot } = this.refs;\n slot.setAttribute('role', 'heading');\n slot.setAttribute('aria-level', '{computeAriaLevel}');\n },\n })\n .css`\n :host {\n font: var(--mdw-typescale__headline-large__font);\n letter-spacing: var(--mdw-typescale__headline-large__letter-spacing);\n }\n \n :host([size=\"medium\"]) {\n font: var(--mdw-typescale__headline-medium__font);\n letter-spacing: var(--mdw-typescale__headline-medium__letter-spacing);\n }\n \n :host([size=\"small\"]) {\n font: var(--mdw-typescale__headline-small__font);\n letter-spacing: var(--mdw-typescale__headline-small__letter-spacing);\n } \n `\n .autoRegister('mdw-headline');\n", "import TooltipTriggerMixin from '../mixins/TooltipTriggerMixin.js';\n\nimport Button from './Button.js';\n\nexport default Button\n .extend()\n .mixin(TooltipTriggerMixin)\n .observe({\n _ariaPressed: {\n get({ type, checked }) {\n if (type !== 'checkbox') return null;\n return checked ? 'true' : 'false';\n },\n },\n })\n .expressions({\n isToggle({ type }) {\n return type === 'checkbox';\n },\n })\n .childEvents({\n control: {\n keydown(event) {\n if (event.key !== 'Enter') return;\n const input = /** @type {HTMLInputElement} */ (event.currentTarget);\n if (input.type !== 'checkbox') return;\n event.stopImmediatePropagation();\n event.stopPropagation();\n event.preventDefault();\n if (input.disabled) return;\n\n // Simulate click\n const clickEvent = new Event('click', { bubbles: true, cancelable: true, composed: true });\n if (!input.dispatchEvent(clickEvent)) return;\n\n // Toggle check and signal\n input.checked = !input.checked;\n input.dispatchEvent(new Event('change', { bubbles: true }));\n },\n },\n })\n .on({\n composed() {\n const { slot, shape, tooltipSlot, icon, control, outline, anchor } = this.refs;\n shape.classList.add('colored');\n icon.classList.add('colored');\n for (const el of [shape, icon]) {\n el.setAttribute('toggle', '{isToggle}');\n el.setAttribute('selected', '{checked}');\n }\n slot.remove();\n icon.removeAttribute('mdw-if');\n tooltipSlot.removeAttribute('name');\n\n control.setAttribute('aria-pressed', '{_ariaPressed}');\n control.setAttribute('aria-labelledby', 'tooltip');\n anchor.setAttribute('aria-labelledby', 'tooltip');\n\n outline.setAttribute('selected', '{checked}');\n },\n })\n .css`\n /* https://m3.material.io/components/icon-buttons/specs */\n\n :host {\n --mdw-shape__size: var(--mdw-shape__full);\n --mdw-ink: rgb(var(--mdw-color__on-surface-variant));\n\n align-items: center;\n justify-content: center;\n\n padding: max(8px, calc(8px + (var(--mdw-density) * 2px)));\n\n background-color: transparent;\n\n font-size: 24px;\n }\n\n :host(:where([type=\"checkbox\"])) {\n --mdw-ink: var(--mdw-color__primary);\n }\n\n /** Filled | Filled Checked */\n :host(:where([filled])) {\n --mdw-ink: var(--mdw-color__on-primary);\n --mdw-bg: var(--mdw-color__primary);\n --mdw-surface__shadow__resting: none;\n --mdw-surface__shadow__raised: none;\n }\n\n /** Tonal | Tonal Checked */\n :host(:where([filled=\"tonal\"])) {\n --mdw-ink: var(--mdw-color__on-secondary-container);\n --mdw-bg: var(--mdw-color__secondary-container);\n }\n\n /** Outlined | Outlined Unchecked */\n :host(:where([outlined])) {\n --mdw-ink: var(--mdw-color__on-surface-variant);\n }\n\n /** Outlined | Outlined Unchecked */\n :host(:where([outlined][type=\"checkbox\"])) {\n --mdw-bg: var(--mdw-color__inverse-surface);\n --mdw-ink: var(--mdw-color__inverse-on-surface);\n }\n\n #shape[toggle] {\n background-color: transparent;\n }\n\n .colored[toggle] {\n color: rgb(var(--mdw-color__on-surface-variant));\n }\n\n .colored[selected] {\n /* background-color: rgb(var(--mdw-bg)); */\n color: rgb(var(--mdw-ink));\n }\n\n #shape[filled][toggle] {\n background-color: rgb(var(--mdw-color__surface-container-highest));\n }\n\n .colored[filled][toggle] {\n color: rgb(var(--mdw-bg));\n }\n\n #shape[filled=\"tonal\"][toggle] {\n /* Redundant */\n /* background-color: rgb(var(--mdw-color__surface-container-highest)); */\n }\n\n .colored[filled=\"tonal\"][toggle] {\n color: rgb(var(--mdw-color__on-surface-variant));\n }\n\n #shape[filled][selected] {\n background-color: rgb(var(--mdw-bg));\n }\n\n .colored[filled][selected] {\n color: rgb(var(--mdw-ink));\n }\n\n #shape[outlined] {\n background-color: transparent;\n }\n\n .colored[outlined] {\n color: inherit;\n }\n\n #shape[outlined][toggle] {\n background-color: transparent;\n }\n\n .colored[outlined][toggle] {\n color: rgb(var(--mdw-color__on-surface-variant));\n }\n\n #shape[outlined][selected] {\n background-color: rgb(var(--mdw-bg));\n }\n\n .colored[outlined][selected] {\n color: rgb(var(--mdw-ink));\n }\n\n #icon {\n font-size: inherit;\n font-variation-settings: 'FILL' 1;\n }\n\n #icon[toggle] {\n font-variation-settings: 'FILL' 0;\n }\n\n #icon[selected] {\n font-variation-settings: 'FILL' 1;\n }\n\n #outline[focused] {\n opacity: 1;\n\n color: inherit;\n }\n\n #outline[selected] {\n opacity: 0;\n }\n\n /** Disabled */\n .colored[disabled] {\n cursor: not-allowed;\n\n color: rgba(var(--mdw-color__on-surface), 0.38);\n }\n\n #shape[disabled][filled],\n #shape[disabled][outlined][selected] {\n background-color: rgba(var(--mdw-color__on-surface), 0.12);\n }\n\n .colored[disabled][filled],\n .colored[disabled][outlined][selected] {\n color: rgba(var(--mdw-color__on-surface), 0.38);\n }\n\n `\n .autoRegister('mdw-icon-button');\n", "const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n // @ts-ignore Skip cast\n entry.target.onResizeObserved(entry);\n }\n});\n\n/**\n * @param {typeof import('../core/CustomElement.js').default} Base\n */\nexport default function ResizeObserverMixin(Base) {\n return Base\n .set({\n observeResizeOnConnected: true,\n })\n .methods({\n /** @param {ResizeObserverEntry} entry */\n onResizeObserved(entry) {\n // Virtual function\n },\n observeResize() {\n resizeObserver.observe(this);\n },\n unobserveResize() {\n resizeObserver.unobserve(this);\n },\n })\n .on({\n connected() {\n if (!this.observeResizeOnConnected) return;\n this.observeResize();\n },\n disconnected() {\n this.unobserveResize();\n },\n });\n}\n", "import '../components/Icon.js';\nimport DensityMixin from './DensityMixin.js';\nimport ShapeMixin from './ShapeMixin.js';\n\n/** @typedef {import('../core/CustomElement.js').default} CustomElement */\n\n/**\n * @param {ReturnType<import('./ControlMixin.js').default>} Base\n */\nexport default function TextFieldMixin(Base) {\n return Base\n .mixin(DensityMixin)\n .mixin(ShapeMixin)\n .set({\n stateLayer: true,\n })\n .observe({\n type: { empty: 'text' },\n icon: 'string',\n label: 'string',\n filled: 'boolean',\n outlined: 'boolean',\n inputPrefix: 'string',\n inputSuffix: 'string',\n trailingIcon: 'string',\n trailingIconInk: 'string',\n supporting: 'string',\n error: 'string',\n placeholder: { nullParser: String }, // DOMString\n })\n .observe({\n erroredState({ error, _invalid, _userInteracted }) { return _userInteracted && Boolean(error || _invalid); },\n })\n .expressions({\n computePlaceholder({ filled, outlined, label, placeholder }) {\n if (filled || outlined) return placeholder;\n return placeholder ?? label;\n },\n\n shouldShowSupporting({ erroredState, supporting }) {\n return erroredState || (supporting != null);\n },\n\n computeSupportingText({ error, erroredState, _validationMessage, supporting }) {\n return (error || (erroredState && _validationMessage) || supporting) ?? '';\n },\n\n populatedState({ value, _badInput }) {\n return !!value || _badInput;\n },\n _showLabelText({ label, filled, outlined }) {\n return label && (filled || outlined);\n },\n })\n .html`\n <div id=label-text mdw-if={_showLabelText} aria-hidden=true\n outlined={outlined}\n populated={populatedState}\n focused={focusedState}\n icon={icon}\n trailing-icon={trailingIcon}\n disabled={disabledState}\n errored={erroredState}>{label}</div>\n <div mdw-if={shouldShowSupporting} id=supporting disabled={disabledState} errored={erroredState}>\n {computeSupportingText}\n <slot id=supporting-slot name=supporting></slot>\n </div>\n `\n .on({\n composed({ html, inline }) {\n const { control, outline, shape, outlineLeft, outlineRight, state } = this.refs;\n control.setAttribute('placeholder', '{computePlaceholder}');\n control.setAttribute('aria-label', '{label}');\n control.setAttribute('input-suffix', '{inputSuffix}');\n control.setAttribute('errored', '{erroredState}');\n control.setAttribute('aria-describedby', 'supporting');\n control.removeAttribute('aria-labelledby');\n control.classList.add('inline');\n\n state.setAttribute('mdw-if', '{!outlined}');\n shape.setAttribute('role', 'none');\n shape.setAttribute('filled', '{filled}');\n shape.setAttribute('icon', '{icon}');\n shape.setAttribute('trailingIcon', '{trailingIcon}');\n shape.setAttribute('populated', '{populatedState}');\n shape.setAttribute('focused', '{focusedState}');\n shape.setAttribute('label', '{label}');\n shape.setAttribute('shape-top', inline(({ shapeTop, filled }) => shapeTop || filled));\n shape.append(\n state,\n outline,\n control,\n html`\n <mdw-icon mdw-if={icon} id=icon aria-hidden=true disabled={disabledState}>{icon}</mdw-icon>\n <span mdw-if={inputPrefix} class=inline id=prefix aria-hidden=true focused={focusedState} populated={populatedState}>{inputPrefix}</span>\n <span mdw-if={inputSuffix} class=inline id=suffix aria-hidden=true focused={focusedState} populated={populatedState}>{inputSuffix}</span>\n <mdw-icon mdw-if={trailingIcon} id=trailing-icon ink={trailingIconInk} aria-hidden=true disabled={disabledState}>{trailingIcon}</mdw-icon>\n <div mdw-if={filled} id=indicator aria-hidden=true focused={focusedState} hovered={hoveredState} errored={erroredState} disabled={disabledState}></div>\n `,\n );\n\n outline.setAttribute('label', '{label}');\n outline.setAttribute('errored', '{erroredState}');\n outlineLeft.after(html`\n <div id=gap mdw-if={label} label={label} populated={populatedState} focused={focusedState}>\n <div id=gap-slot focused={focusedState}></div>\n <span id=gap-label>{label}</span>\n </div>\n `);\n\n outlineLeft.setAttribute('focused', '{focusedState}');\n outlineRight.setAttribute('focused', '{focusedState}');\n },\n sizeChanged(oldValue, newValue) {\n this.refs.control.style.setProperty('--size', `${newValue}ch`);\n },\n })\n .css`\n /* https://m3.material.io/components/text-fields/specs */\n\n /**\n * States: Enabled / Hover / Focus / Error / Error Hover / Error Focus\n * Input: on-surface / on-surface / on-surface / on-surface / on-surface / on-surface\n * Inline: on-surface-variant / on-surface-variant / on-surface-variant / on-surface-variant / on-surface-variant / on-surface-variant\n * Label: on-surface-variant / on-surface* / ink / error / on-error-container / error\n * Indicator: on-surface-variant / on-surface / ink / error / on-error-container / error\n * Caret: (any) / (any) / ink / (any) / (any) / error\n * Outline: outline / on-surface / ink / error / on-error-container / error\n * Selection: on-* / on-* / ink / error / on-error-container / error\n *\n *\n * *Filled hovered unpopulated label may be on-surface-variant instead\n *\n * Input: Always on-surface\n * Inline: Always on-surface-variant\n * Indicator: same as label\n * Label: same as indicator\n * Outline: outline default, same as label+indicator on :hover or :focus\n * Caret: same as label+indicator+outline (cannot inherit color or use currentColor)\n * Selection: (cannot inherit color or use currentColor)\n */\n\n :host {\n --mdw-shape__size: var(--mdw-shape__extra-small);\n /* --mdw-shape__size: 8px; */\n /* --mdw-shape__size__bottom-start-size: var(--mdw-shape__size); */\n /* --mdw-shape__size__bottom-end-size: var(--mdw-shape__size); */\n --mdw-text-field__ratio: calc(var(--mdw-density) * 0.125 + 1);\n\n --control__margin-top: calc(var(--mdw-typescale__body-small__line-height) / 2);\n --control__padding-top: calc((var(--mdw-text-field__ratio) * 16px) - calc(var(--mdw-typescale__body-small__line-height) / 2));\n --control__padding-bottom: calc(var(--mdw-text-field__ratio) * 16px);\n --control__margin-bottom: 0px;\n\n --inline-color: rgb(var(--mdw-color__on-surface-variant));\n\n --descriptor-opacity: 0.5;\n --mdw-ink: var(--mdw-color__primary);\n --mdw-bg: var(--mdw-color__surface-container-highest);\n\n --mdw-type__font: var(--mdw-typescale__body-large__font);\n --mdw-type__letter-spacing: var(--mdw-typescale__body-large__letter-spacing);\n\n display: inline-block;\n\n /* State layer */\n color: rgb(var(--mdw-color__on-surface));\n\n font: var(--mdw-type__font);\n letter-spacing: var(--mdw-type__letter-spacing);\n }\n\n :host([icon]) {\n --padding-inline-start: 12px;\n }\n\n :host([trailing-icon]) {\n --padding-inline-end: 12px;\n }\n\n :host(:is([color], [ink])) {\n background-color: transparent;\n color: rgb(var(--mdw-color__on-surface));\n }\n\n /** Guard against bleed */\n #shape[label][outlined] {\n --mdw-shape__size__top-start-size: min(var(--mdw-shape__size), 12px);\n --mdw-shape__size__bottom-start-size: min(var(--mdw-shape__size), 12px);\n --mdw-shape__size__top-end-size: min(var(--mdw-shape__size), 12px);\n --mdw-shape__size__bottom-end-size: min(var(--mdw-shape__size), 12px);\n -webkit-mask-box-image-width: min(var(--mdw-shape__size), 12px);\n }\n\n #shape {\n position: relative;\n\n display: flex;\n\n align-items: center;\n overflow: visible;\n\n cursor: inherit;\n\n z-index: 0;\n\n background-color: transparent;\n\n font-weight: inherit;\n font-size: inherit;\n line-height: inherit;\n font-family: inherit;\n letter-spacing: inherit;\n\n transition: none 200ms cubic-bezier(0.0, 0.0, 0.2, 1);\n }\n\n #shape:where([filled],[outlined]) {\n padding-inline: 16px;\n }\n\n #shape:where([filled],[color]) {\n background-color: rgb(var(--mdw-bg));\n color: rgb(var(--mdw-color__on-surface));\n }\n\n #shape[outlined] {\n background-color: transparent;\n }\n\n #label-text,\n #indicator {\n color: rgb(var(--mdw-color__on-surface-variant))\n }\n\n :is(#label-text, #indicator)[focused] {\n color: rgb(var(--mdw-ink))\n }\n\n #shape:where([filled],[outlined])[icon] {\n padding-inline-start: 12px;\n }\n\n #shape[trailing-icon] {\n padding-inline-end: 12px;\n }\n\n #shape[focused] {\n transition: none 100ms cubic-bezier(0.4, 0.0, 1, 1);\n }\n\n #shape[shape-top] {\n --mdw-shape__size__bottom-start-size: 0px;\n --mdw-shape__size__bottom-end-size: 0px;\n --mdw-shape__mask: linear-gradient(transparent 50%, black 50%);\n }\n\n #prefix,\n #suffix,\n #control::placeholder {\n opacity: var(--descriptor-opacity);\n\n color: var(--inline-color);\n\n transition-duration: inherit;\n transition-property: opacity;\n transition-timing-function: inherit;\n will-change: opacity;\n }\n\n :host([label]:is([filled],[outlined])) {\n --descriptor-opacity: 0;\n }\n\n #control {\n position: relative;\n inset: auto;\n align-self: flex-start;\n\n display: inline;\n\n box-sizing: border-box;\n\n block-size: auto;\n min-block-size: none;\n inline-size: 100%;\n min-inline-size: none;\n flex: 1;\n border-block-start: solid var(--control__margin-top) transparent;\n border-block-end: solid var(--control__margin-bottom) transparent;\n padding-block: var(--control__padding-top) var(--control__padding-bottom);\n\n appearance: none;\n caret-color: rgb(var(--mdw-ink));\n cursor: auto;\n\n transform: none;\n\n visibility: visible;\n\n background-color: transparent;\n border-color: transparent;\n color: inherit;\n /* rgb(var(--mdw-color__on-surface)); */\n\n font-weight: inherit;\n font-size: inherit;\n line-height: inherit;\n font-family: inherit;\n letter-spacing: inherit;\n\n transition-duration: inherit;\n transition-property: color;\n transition-timing-function: inherit;\n }\n\n #suffix,\n #prefix {\n /* Symmetrical to allow centering */\n margin-block: var(--control__margin-top) var(--control__margin-bottom);\n padding-block: var(--control__padding-top) var(--control__padding-bottom);\n }\n\n /* stylelint-disable-next-line plugin/no-unsupported-browser-features */\n #control::selection {\n background-color: rgb(var(--mdw-ink));\n color: rgb(var(--mdw-color__surface));\n }\n\n #state {\n --mdw-state__focused-opacity: 0;\n --mdw-state__pressed-opacity: 0;\n }\n\n mdw-icon {\n --mdw-icon__size: 24px;\n align-self: center;\n\n color: var(--inline-color);\n }\n\n #icon {\n order: -2;\n\n margin-inline-end: 16px;\n\n font-size: 24px;\n }\n\n #prefix {\n order: -1;\n }\n\n #suffix {\n order: 1;\n }\n\n #trailing-icon {\n order: 2;\n\n margin-inline-start: 16px;\n }\n\n #indicator {\n position: absolute;\n inset-block-end: 0;\n inset-inline: 0;\n\n border-block-end: 2px solid currentColor;\n\n pointer-events: none;\n\n transform: scaleY(0.5);\n z-index: 1; /* Force new layer to avoid repaint */\n\n transition-duration: inherit;\n transition-property: transform;\n transition-timing-function: inherit;\n will-change: transform;\n }\n\n #indicator[focused] {\n transform: scaleY(1);\n\n }\n\n /** Label Text **/\n\n #label-text {\n position: absolute;\n inset-block-start: 0;\n inset-inline: 0;\n\n display: block;\n overflow-x: clip;\n overflow-y: visible;\n\n padding-inline: 16px;\n\n pointer-events: none;\n\n opacity: 1;\n transform: translateY(calc((var(--control__margin-top) + var(--control__padding-top) + 100% + var(--control__padding-bottom) + var(--control__margin-bottom)) / 2)) translateY(-50%);\n z-index: 4;\n /* FireFox bug */\n\n color: rgb(var(--mdw-color__on-surface-variant));\n\n text-overflow: ellipsis;\n white-space: nowrap;\n\n transition-duration: 200ms;\n transition-property: inset-inline-start, font-size, transform;\n /* transition-timing-function: inherit; */\n /*Expand*/\n\n will-change: inset-inline-start, font-size, transform;\n }\n\n @supports (-moz-appearance:none ) {\n #label-text {\n /* Firefox clips Y as well as X */\n overflow-x: hidden;\n }\n }\n\n #label-text[focused] {\n color: rgb(var(--mdw-ink));\n }\n\n #label-text[icon] {\n inset-inline-start: calc(12px + 24px);\n }\n\n #label-text[trailing-icon] {\n inset-inline-end: calc(24px + 12px);\n }\n\n #label-text:is([focused], [populated]) {\n transform: translateY(calc(var(--mdw-text-field__ratio) * 8px));\n\n font: var(--mdw-typescale__body-small__font);\n /* Not spec: Should only use font-size and line-height */\n letter-spacing: var(--mdw-typescale__body-small__letter-spacing);\n }\n\n #label-text[outlined]:is([focused], [populated]) {\n inset-inline: 0;\n\n transform: translateY(-50%);\n }\n\n :is(#prefix, #suffix):is([focused], [populated]) {\n opacity: 1;\n }\n\n /* If no label */\n #control:is(:focus, :not(:placeholder-shown))::placeholder {\n opacity: 0.70;\n }\n\n #control[input-suffix] {\n text-align: end;\n }\n\n /** Outlined **/\n\n #outline::before {\n content: none;\n }\n\n .outline-section {\n position: relative;\n\n border: 1px solid currentColor;\n }\n\n .outline-section[focused] {\n border-width: 2px;\n }\n\n #outline-left {\n /* stylelint-disable-next-line liberty/use-logical-spec */\n border-right-width: 0;\n /* stylelint-disable-next-line liberty/use-logical-spec */\n border-top-left-radius: inherit;\n /* stylelint-disable-next-line liberty/use-logical-spec */\n border-bottom-left-radius: inherit;\n }\n\n #outline-right {\n /* stylelint-disable-next-line liberty/use-logical-spec */\n border-left-width: 0;\n /* stylelint-disable-next-line liberty/use-logical-spec */\n border-top-right-radius: inherit;\n /* stylelint-disable-next-line liberty/use-logical-spec */\n border-bottom-right-radius: inherit;\n }\n\n #outline {\n display: grid;\n grid-auto-flow: column;\n grid-template-columns: 1fr 0 1fr;\n\n color: rgb(var(--mdw-color__outline));\n }\n\n #outline[label] {\n grid-template-columns: 12px minmax(0,auto) minmax(12px, 1fr);\n }\n\n #outline[hovered] {\n color: rgb(var(--mdw-color__on-surface));\n }\n\n #outline[focused] {\n color: rgb(var(--mdw-ink));\n }\n\n .outline-section {\n min-inline-size: 12px;\n }\n\n .outline-section::before,\n .outline-section::after {\n max-inline-size: none;\n }\n\n .outline-left {\n grid-column: calc(2 - var(--mdw-dir, 1)) / span 1; /* 1 on LTR, 3 on RTL */\n }\n\n .outline-right {\n grid-column: calc(2 + var(--mdw-dir, 1)) / span 1;\n }\n\n #gap {\n position: relative;\n\n display: inline-block;\n overflow: clip hidden;\n\n max-inline-size: 100%;\n grid-column: 2;\n\n font: var(--mdw-typescale__body-small__font);\n /* Not spec: Should only use font-size and line-height */\n letter-spacing: var(--mdw-typescale__body-small__letter-spacing);\n\n /* Close gap */\n transition-duration: inherit;\n transition-property: padding;\n transition-timing-function: inherit;\n }\n\n #gap-label {\n display: inline-block;\n overflow: clip hidden;\n\n padding-inline: 4px;\n\n color:transparent;\n\n white-space: nowrap;\n }\n\n #gap::after {\n content: '';\n\n position: absolute;\n inset: 0;\n\n border-block-end: solid 1px currentColor;\n }\n\n #gap[focused]::after {\n border-block-end-width: 2px;\n }\n\n #gap-slot {\n position: absolute;\n inset: 0;\n\n }\n\n #gap-slot::before,\n #gap-slot::after {\n content: '';\n\n position: absolute;\n inset: 0;\n\n border-block-start: solid 1px currentColor;\n\n transition: transform 200ms;\n will-change: transform;\n }\n\n #gap-slot[focused]::before,\n #gap-slot[focused]::after {\n border-block-start-width: 2px;\n }\n\n @supports(-webkit-mask-box-image: none) {\n #outline[focused] {\n /** Fake 2px outline */\n filter:\n drop-shadow(1px 0px 0px currentColor)\n drop-shadow(0px 1px 0px currentColor)\n drop-shadow(-1px 0px 0px currentColor)\n drop-shadow(0px -1px 0px currentColor);\n }\n\n #outline::before {\n content: '';\n\n position: absolute;\n inset: 0;\n\n grid-column: calc(2 - var(--mdw-dir, 1)) / span 1;\n /* stylelint-disable-next-line liberty/use-logical-spec */\n margin-right: -0.99px;\n border: none;\n\n background-color: currentColor;\n -webkit-mask-box-image: var(--mdw-shape__mask-image__edges)\n 8 fill /\n auto\n stretch;\n -webkit-mask-box-image-width: auto 0 auto auto;\n }\n\n #outline::after {\n grid-column: calc(2 + var(--mdw-dir, 1)) / span 1;\n grid-row: 1;\n\n /* stylelint-disable-next-line liberty/use-logical-spec */\n margin-left: -0.99px;\n -webkit-mask-box-image-width: auto auto auto 0;\n }\n\n .outline-section {\n border: none;\n }\n\n #gap::after {\n border: none;\n\n background-color: currentColor;\n -webkit-mask-box-image: var(--mdw-shape__mask-image__edges)\n 8 fill /\n auto\n stretch;\n -webkit-mask-box-image-width: 0 0 auto 0;\n }\n\n #gap-slot::before,\n #gap-slot::after {\n border: none;\n\n background-color: currentColor;\n\n -webkit-mask-box-image: var(--mdw-shape__mask-image__edges)\n 8 fill /\n auto\n stretch;\n -webkit-mask-box-image-width: auto 0 0 0;\n }\n }\n\n #gap-slot::before {\n /* stylelint-disable-next-line liberty/use-logical-spec */\n margin-right: -0.99px;\n\n transform: var(--gap-transform, scaleX(0.5));\n transform-origin: 0 0;\n }\n\n #gap-slot::after {\n /* stylelint-disable-next-line liberty/use-logical-spec */\n margin-left: -0.99px;\n\n transform: var(--gap-transform, scaleX(0.5));\n transform-origin: 100% 0;\n }\n\n #gap:is([focused], [populated]) {\n /* Open gap */\n --gap-transform: scaleX(0);\n }\n\n #gap:empty {\n padding: 0;\n }\n\n #shape[label][filled] {\n align-items: flex-start;\n }\n\n :host([filled]) {\n --mdw-shape__size__bottom-start-size: 0px;\n --mdw-shape__size__bottom-end-size: 0px;\n --mdw-text-field__ratio: calc(var(--mdw-density) * 0.25 + 1);\n }\n\n :host(:is([filled][label])) {\n --control__margin-top: calc((var(--mdw-text-field__ratio) * 8px) + var(--mdw-typescale__body-small__line-height));\n --control__padding-top: 0px;\n --control__padding-bottom: calc(var(--mdw-text-field__ratio) * 4px);\n --control__margin-bottom: calc(var(--mdw-text-field__ratio) * 4px);\n }\n\n #supporting {\n min-block-size: var(--mdw-typescale__body-small__line-height);\n margin-block-start: 4px;\n margin-inline: 16px;\n\n font-weight: var(--mdw-typescale__body-small__font-weight); /* Not spec */\n font-size: var(--mdw-typescale__body-small__font-size);\n line-height: var(--mdw-typescale__body-small__line-height);\n font-family: var(--mdw-typescale__body-small__font-family); /* Not spec */\n letter-spacing: var(--mdw-typescale__body-small__letter-spacing); /* Not spec */\n }\n\n /* Error States */\n\n #control[errored] {\n caret-color: rgb(var(--mdw-color__error));\n }\n\n #control[errored]::selection {\n background-color: rgb(var(--mdw-color__on-error-container));\n }\n\n :is(#indicator, #label-text, #supporting, #outline)[errored] {\n color: rgb(var(--mdw-color__error));\n }\n\n :is(#indicator, #label-text, #supporting, #outline)[errored]:where([hovered]) {\n color: rgb(var(--mdw-color__on-error-container));\n }\n\n :is(#indicator, #label-text, #supporting, #outline)[errored]:where([focused]) {\n color: rgb(var(--mdw-color__error));\n }\n\n /* stylelint-disable-next-line selector-max-compound-selectors */\n #shape[disabled],\n #shape[disabled] #control {\n cursor: not-allowed;\n }\n\n #outline[disabled] {\n color: rgba(var(--mdw-color__outline), 0.12);\n }\n\n #label-text[disabled] {\n color: rgba(var(--mdw-color__on-surface), 0.38);\n }\n\n #supporting[disabled] {\n color: rgba(var(--mdw-color__on-surface), 0.38);\n }\n\n .inline[disabled] {\n color: rgba(var(--mdw-color__on-surface), 0.38);\n }\n\n mdw-icon[disabled] {\n color: rgba(var(--mdw-color__on-surface), 0.38);\n }\n\n #shape[disabled] {\n background-color: rgba(var(--mdw-color__on-surface), calc(0.04));\n color: rgba(var(--mdw-color__on-surface), 0.38);\n }\n\n #indicator[disabled] {\n color: rgba(var(--mdw-color__on-surface), 0.38);\n }\n\n #shape[disabled][outlined] {\n background-color: transparent;\n }\n \n `;\n}\n", "import CustomElement from '../core/CustomElement.js';\nimport PopupMixin from '../mixins/PopupMixin.js';\nimport ShapeMixin from '../mixins/ShapeMixin.js';\nimport SurfaceMixin from '../mixins/SurfaceMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\nexport default CustomElement\n .extend()\n .mixin(ThemableMixin)\n .mixin(SurfaceMixin)\n .mixin(ShapeMixin)\n .mixin(PopupMixin)\n .on({\n composed() {\n const { shape, surface, dialog } = this.refs;\n surface.append(shape);\n dialog.prepend(surface);\n },\n })\n .autoRegister('mdw-popup');\n", "/* https://www.w3.org/WAI/ARIA/apg/patterns/combobox/ */\n\nimport CustomElement from '../core/CustomElement.js';\nimport InputMixin from '../mixins/InputMixin.js';\nimport ResizeObserverMixin from '../mixins/ResizeObserverMixin.js';\nimport StateMixin from '../mixins/StateMixin.js';\nimport TextFieldMixin from '../mixins/TextFieldMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\nimport Popup from './Popup.js';\n\n/** @typedef {import('./Listbox.js').default} Listbox */\n\n/** @type {InstanceType<import('./Popup.js').default>} */\nlet sharedPopup;\n\n/** @return {InstanceType<import('./Popup.js').default>} */\nfunction getSharedPopup() {\n if (!sharedPopup) {\n sharedPopup = new Popup();\n sharedPopup.scrollable = true;\n sharedPopup.shapeStyle = 'extra-small';\n sharedPopup.color = 'surface';\n sharedPopup.matchSourceWidth = true;\n }\n return sharedPopup;\n}\n\nexport default CustomElement\n .extend()\n .mixin(ThemableMixin)\n .mixin(StateMixin)\n .mixin(InputMixin)\n .mixin(TextFieldMixin)\n .mixin(ResizeObserverMixin)\n .observe({\n suggestInline: 'boolean',\n _expanded: 'boolean',\n _listbox: {\n type: 'object',\n /** @type {Listbox} */\n value: null,\n },\n _focusedValue: 'string',\n _focusedIndex: { value: -1 },\n _focusedPosInSet: { value: -1 },\n _listboxSize: { value: -1 },\n _draftInput: { type: 'string', nullable: false },\n })\n .observe({\n _hasListbox({ _listbox }) {\n return _listbox ? 'listbox' : null;\n },\n })\n .set({\n _onListboxChangeListener: null,\n })\n .define({\n stateTargetElement() { return this.refs.control; },\n })\n .methods({\n onResizeObserved() {\n if (!this._expanded) return;\n const popup = getSharedPopup();\n popup.updatePopupPosition(this.refs.shape);\n },\n /**\n * @param {Event} event\n */\n onListboxChange(event) {\n const selectedItem = this._listbox.selectedOptions.item(0);\n this.selectOption(selectedItem);\n this.closeListbox();\n // Revert focus back\n this.refs.control.focus();\n },\n showListbox() {\n // Move contents of list slot into top-layer\n // Should only have one element\n\n const { _listbox, refs } = this;\n if (!_listbox) return;\n this._expanded = true;\n const { control, ariaListbox, shape } = refs;\n control.setAttribute('role', 'combobox');\n ariaListbox.setAttribute('aria-hidden', 'false');\n const popup = getSharedPopup();\n document.body.append(popup);\n popup.replaceChildren(_listbox);\n _listbox.selectedIndex = -1;\n popup.showPopup(shape, false);\n },\n closeListbox() {\n this._expanded = false;\n const { _listbox } = this;\n if (!_listbox) return;\n const popup = getSharedPopup();\n this.refs.ariaListbox.setAttribute('aria-hidden', 'true');\n this.replaceChildren(_listbox);\n popup.close(undefined, false);\n // TODO: Animate\n popup.remove();\n },\n\n /**\n * @param {{label:string, value:string}} option\n * @return {void}\n */\n selectOption(option) {\n this.render({\n selectedOption: option,\n });\n\n const { _draftInput, _value, _input } = this;\n const { label: suggestion, value } = option;\n\n if (_draftInput && suggestion && suggestion.toLowerCase().startsWith(_draftInput.toLowerCase())) {\n _input.value = _draftInput + suggestion.slice(_draftInput.length);\n _input.setSelectionRange(_value.length, suggestion.length);\n } else {\n _input.value = suggestion;\n _input.setSelectionRange(suggestion.length, suggestion.length);\n }\n this._value = value;\n },\n })\n .on({\n _focusedIndexChanged(previous, current) {\n const _listbox = this._listbox;\n const previousItem = _listbox.item(previous);\n if (previousItem) {\n previousItem.focused = false;\n }\n const currentItem = _listbox.item(current);\n if (currentItem) {\n this._focusedPosInSet = current + 1;\n currentItem.focused = true;\n this.selectOption(currentItem);\n } else {\n this._focusedPosInSet = -1;\n }\n },\n })\n .childEvents({\n control: {\n input(event) {\n if (!this._listbox) return;\n // Intercept event and dispatch a new one.\n // This allow authors to modify listbox (filter) and value (custom pattern)\n event.stopPropagation();\n this.dispatchEvent(new InputEvent('input', {\n composed: true,\n data: event.data,\n bubbles: true,\n dataTransfer: event.dataTransfer,\n detail: event.detail,\n inputType: event.inputType,\n view: event.view,\n targetRanges: event.getTargetRanges(),\n isComposing: event.isComposing,\n }));\n this._draftInput = event.currentTarget.value;\n this._focusedIndex = -1;\n if (!this._expanded && this._listbox.length) {\n this.showListbox();\n }\n },\n keydown(event) {\n switch (event.key) {\n case 'ArrowUp':\n case 'Up':\n if (!this._expanded) return;\n if (this._focusedIndex <= 0) {\n this._focusedIndex = (this._listbox.length - 1);\n } else {\n this._focusedIndex--;\n }\n break;\n case 'ArrowDown':\n case 'Down':\n if (this._expanded) {\n if (this._focusedIndex >= this._listbox.length - 1) {\n this._focusedIndex = 0;\n } else {\n this._focusedIndex++;\n }\n } else {\n if (!this._listbox) return;\n this.showListbox();\n this._focusedIndex = 0;\n }\n break;\n case 'Escape':\n if (!this._expanded) return;\n this.closeListbox();\n break;\n case 'Tab':\n this.closeListbox();\n event.stopPropagation();\n return; // Don't prevent default\n default:\n return;\n }\n event.stopPropagation(); // Avoid kbd within kbd (sub menus)\n event.preventDefault();\n },\n },\n slot: {\n /**\n * @param {{currentTarget: HTMLSlotElement}} event\n * @type {any}\n */\n slotchange({ currentTarget }) {\n if (this._expanded) return;\n /** @type {Listbox[]} */\n const [listbox] = currentTarget.assignedElements();\n const { _listbox } = this;\n if (_listbox === listbox) {\n // Internal already matches\n return;\n }\n if (_listbox) {\n // Unbind and release\n _listbox.removeEventListener('change', this._onListboxChangeListener);\n this._onListboxChangeListener = null;\n }\n if (listbox) {\n // Bind and store\n this._onListboxChangeListener = this.onListboxChange.bind(this);\n listbox.addEventListener('change', this._onListboxChangeListener);\n }\n this._listbox = listbox;\n },\n },\n })\n .events({\n blur({ relatedTarget }) {\n if (!this._expanded) return;\n // Ignore if focus lost to pop-up (likely pointerdown).\n if (relatedTarget && getSharedPopup().contains(relatedTarget)) return;\n this.closeListbox();\n },\n })\n .expressions({\n ariaExpandedAttrValue({ _hasListbox, _expanded }) {\n return _hasListbox ? `${_expanded}` : null;\n },\n ariaControlsAttrValue({ _hasListbox }) {\n return _hasListbox ? 'aria-listbox' : null;\n },\n ariaAutocompleteAttrValue({ _hasListbox, suggestInline }) {\n return _hasListbox\n ? (suggestInline ? 'both' : 'list')\n : null;\n },\n ariaActiveDescendantAttrValue({ _hasListbox, _expanded, _focusedValue }) {\n return _hasListbox\n // eslint-disable-next-line unicorn/no-nested-ternary\n ? ((_expanded && _focusedValue) ? 'aria-active' : '')\n : null;\n },\n })\n .on({\n composed() {\n const { control } = this.refs;\n // Can't cross DOM boundaries\n control.setAttribute('aria-activedescendant', '{ariaActiveDescendantAttrValue}');\n control.setAttribute('aria-autocomplete', '{ariaAutocompleteAttrValue}');\n control.setAttribute('aria-controls', '{ariaControlsAttrValue}');\n control.setAttribute('aria-expanded', '{ariaExpandedAttrValue}');\n },\n })\n .html`\n <slot id=slot></slot>\n <div id=aria-listbox role=listbox>\n <div id=aria-active role=option aria-setsize=\"{_listbox.length}\" aria-posinset={_focusedPosInSet} aria-label={selectedOption.label}></div>\n </div>\n `\n .css`\n #slot {\n display: none;\n }\n\n #aria-listbox {\n display: none;\n }\n `\n .autoRegister('mdw-input');\n", "import Box from './Box.js';\n\nexport default Box\n .extend()\n .css`\n :host {\n font: var(--mdw-typescale__label-large__font);\n letter-spacing: var(--mdw-typescale__body-large__letter-spacing);\n }\n \n :host([size=\"medium\"]) {\n font: var(--mdw-typescale__label-medium__font);\n letter-spacing: var(--mdw-typescale__body-medium__letter-spacing);\n }\n \n :host([size=\"small\"]) {\n font: var(--mdw-typescale__label-small__font);\n letter-spacing: var(--mdw-typescale__body-small__letter-spacing);\n }\n `\n .autoRegister('mdw-label');\n", "/* https://m3.material.io/foundations/layout/applying-layout/window-size-classes */\n\nimport CustomElement from '../core/CustomElement.js';\nimport { ELEMENT_STYLER_TYPE } from '../core/customTypes.js';\n\nexport default CustomElement\n .extend()\n .observe({\n navBar: 'string',\n navRail: 'string',\n navDrawer: 'string',\n oneFlexible: 'boolean',\n oneFixed: 'boolean',\n twoFlexible: 'boolean',\n twoFixed: 'boolean',\n paneTwoActive: 'boolean',\n paneOneColumns: 'integer',\n paneTwoColumns: 'integer',\n padding: 'integer',\n panes: 'integer',\n _touchDeltaX: 'integer',\n _touchStartX: 'integer',\n _navDrawerTranslateX: {\n empty: '-100%',\n },\n _navDrawerDuration: {\n empty: 0,\n },\n })\n .observe({\n hasTwo: {\n type: 'boolean',\n reflect: 'write',\n get({ twoFlexible, twoFixed }) {\n return twoFlexible || twoFixed;\n },\n },\n singlePane: {\n type: 'boolean',\n reflect: 'write',\n get({ oneFlexible, oneFixed, twoFlexible, twoFixed }) {\n return (oneFlexible || oneFixed) && !(twoFlexible || twoFixed);\n },\n },\n _navDrawerStyle: {\n ...ELEMENT_STYLER_TYPE,\n get({ _navDrawerTranslateX, _navDrawerDuration }) {\n return {\n target: 'slot-nav-drawer',\n styles: {\n transform: `translateX(${_navDrawerTranslateX})`,\n },\n timing: {\n duration: _navDrawerDuration,\n },\n };\n },\n },\n })\n .set({\n /** @type {Map<string, MediaQueryList>} */\n registeredMediaQueries: null,\n refreshedOpenStatesFlag: false,\n _windowResizeListener: null,\n })\n /* Slots should follow tab order */\n .html`\n <slot id=slot-nav-drawer name=nav-drawer state={navDrawer}></slot>\n <div id=scrim state={navDrawer}></div>\n <slot id=slot-nav-rail name=nav-rail state={navRail}></slot>\n <slot id=slot-app-bar name=app-bar></slot>\n <slot id=slot class=\"pane pane1\" columns={paneOneColumns} slotted={oneFlexible}></slot>\n <slot id=slot-fixed name=fixed class=\"pane pane1\" columns={paneOneColumns} slotted={oneFixed} ></slot>\n <slot id=slot-two name=two class=\"pane pane2\" panes={panes} columns={paneTwoColumns} slotted={twoFlexible}></slot>\n <slot id=slot-two-fixed name=two-fixed class=\"pane pane2\" panes={panes} columns={paneTwoColumns} slotted={twoFixed} ></slot>\n <slot id=slot-nav-bar name=nav-bar state={navBar}></slot>\n `\n .methods({\n refreshLayoutValues() {\n /**\n * Prefer content to navigation (eg: Don't shrink content for nav)\n * Prefer 2nd pane always\n * Breakpoints ( x = 16, | = 24 )\n * - Nav Pane1 Pane2 Columns Nav Detail Content Width Use?\n * - Modal 4col x 0 x 0 0 0 0 YES\n * - Rail 4col 80 x 360 x 80 0 360 472 NO\n * - Modal 8col x 600 x 0 0 600 632 YES\n * - Modal 8col | 600 | 0 0 600 648 YES\n * - Rail 8col 80 | 600 | 80 0 600 728 YES\n * - Drawer 4col 360 | 360 | 360 0 360 768 NO\n * - Modal 4col 4col | 360 | 360 | 360 360 720 792 YES\n * - Modal Fixed 4col | 360 | 360 | 360 360 720 792 YES\n * - Rail 4col 4col 80 | 360 | 360 | 80 360 720 872 YES\n * - Rail Fixed 4col 80 | 360 | 360 | 80 360 720 872 YES\n * - Modal 12col | 840 | 0 0 840 888 If Single Pane + No Rail\n * - Rail 12col 80 | 840 | 80 0 840 968 If Single Pane\n * - Drawer 8col 360 | 600 | 360 0 600 1008 NO (Loses Content)\n * - Modal Fixed 8col | 360 | 600 | 0 600 960 1032 If No Rail\n * - Rail Fixed 8col 80 | 360 | 600 | 80 600 960 1112 YES\n * - Drawer 4col 4col 360 | 360 | 360 | 360 360 720 1152 NO (Modal 4/4 has more content)\n * - Drawer Fixed 4col 360 | 360 | 360 | 360 360 720 1152 NO (Modal F/8 has more content)\n * - Drawer 12col 360 | 840 | 360 0 840 1248 If Single Pane\n * - Modal 8col 8col | 600 | 600 | 0 600 1200 1272 *If No Rail\n * - Modal Fixed 12col | 360 | 840 | 0 840 1200 1272 *If No Rail\n * - Rail 8col 8col 80 | 600 | 600 | 80 600 1200 1352 YES\n * - Rail Fixed 12col 80 | 360 | 840 | 80 840 1200 1352 YES\n * - Drawer Fixed 8col 360 | 360 | 600 | 360 600 960 1392 *If No Rail\n * - Drawer 8col 8col 360 | 600 | 600 | 360 600 720 1632 *If No Rail\n * - Drawer Fixed 12col 360 | 360 | 840 | 360 840 1200 1632 YES\n * - Modal 12col 12col | 840 | 840 | 0 840 1680 1752 If No Rail + No Nav Drawer\n * - Rail 12col 12col 80 | 840 | 840 | 80 840 1680 1832 If No Drawer\n * - Drawer 12col 12col 360 | 840 | 840 | 360 840 1680 2112 YES\n */\n\n /**\n * SORTED + FILTERED\n * - Nav Pane1 Pane2 Columns Nav Detail Content Width\n * - Modal 4col x 0 x 0 0 0 0\n * - Modal 8col x 600 x 0 0 600 632\n * - Modal 8col | 600 | 0 0 600 648\n * - Modal 12col | 840 | 0 0 840 888\n * - Rail 8col 80 | 600 | 80 0 600 728\n * - Rail 12col 80 | 840 | 80 0 840 968\n * - Drawer 12col 360 | 840 | 360 0 840 1248\n * - Modal 4col 4col | 360 | 360 | 0 360 720 792\n * - Modal 8col 8col | 600 | 600 | 0 600 1200 1272\n * - Modal 12col 12col | 840 | 840 | 0 840 1680 1752\n * - Modal Fixed 4col | 360 | 360 | 0 360 720 792\n * - Modal Fixed 8col | 360 | 600 | 0 600 960 1032\n * - Modal Fixed 12col | 360 | 840 | 0 840 1200 1272\n * - Drawer 8col 8col 360 | 600 | 600 | 360 600 720 1632\n * - Drawer Fixed 8col 360 | 360 | 600 | 360 600 960 1392\n * - Rail 4col 4col 80 | 360 | 360 | 80 360 720 872\n * - Rail 8col 8col 80 | 600 | 600 | 80 600 1200 1352\n * - Rail 12col 12col 80 | 840 | 840 | 80 840 1680 1832\n * - Rail Fixed 4col 80 | 360 | 360 | 80 360 720 872\n * - Rail Fixed 8col 80 | 360 | 600 | 80 600 960 1112\n * - Rail Fixed 12col 80 | 360 | 840 | 80 840 1200 1352\n * - Drawer 12col 12col 360 | 840 | 840 | 360 840 1680 2112\n * - Drawer Fixed 12col 360 | 360 | 840 | 360 840 1200 1632\n */\n\n const { innerWidth } = window;\n /** @type {[number, 'modal'|'rail'|'drawer', 4|8|12|'fixed', number, number][]} */\n const breakpointTable = [\n [1632, 'drawer', 'fixed', 12, 24],\n [2112, 'drawer', 12, 12, 24],\n [1352, 'rail', 'fixed', 12, 24],\n [1112, 'rail', 'fixed', 8, 24],\n [872, 'rail', 'fixed', 4, 24],\n [1832, 'rail', 12, 12, 24],\n [1352, 'rail', 8, 8, 24],\n [872, 'rail', 4, 4, 24],\n [1392, 'drawer', 'fixed', 8, 24],\n [1632, 'drawer', 8, 8, 24],\n [1272, 'modal', 'fixed', 12, 24],\n [1032, 'modal', 'fixed', 8, 24],\n [792, 'modal', 'fixed', 4, 24],\n [1752, 'modal', 12, 12, 24],\n [1272, 'modal', 8, 8, 24],\n [792, 'modal', 4, 4, 24],\n [1248, 'drawer', 12, 0, 24],\n [960, 'rail', 12, 0, 24],\n [728, 'rail', 8, 0, 24],\n [888, 'modal', 12, 0, 24],\n [648, 'modal', 8, 0, 24],\n [632, 'modal', 8, 0, 16],\n [0, 'modal', 4, 0, 16],\n ];\n breakpointTable.some(([minWidth, nav, column1, column2, padding]) => {\n if (innerWidth < minWidth) return false;\n if (column2 && !this.hasTwo) return false;\n if (nav === 'rail') {\n if (!this.navRail) return false;\n this.navRail = 'fixed';\n if (this.navDrawer) this.navDrawer = 'closed';\n if (this.navBar) this.navBar = 'closed';\n } else if (nav === 'drawer') {\n if (!this.navDrawer) return false;\n if (this.navRail) this.navRail = 'closed';\n if (this.navBar) this.navBar = 'closed';\n this.navDrawer = 'fixed';\n } else {\n if (this.navRail) this.navRail = 'closed';\n if (this.navDrawer) this.navDrawer = 'closed';\n if (this.navBar) this.navBar = 'open';\n }\n this.padding = padding;\n if (column2) {\n this.panes = 2;\n if (this.oneFixed) {\n this.paneOneColumns = 4;\n this.paneTwoColumns = column2;\n } else if (this.twoFixed) {\n this.paneOneColumns = column2;\n this.paneTwoColumns = 4;\n }\n } else {\n this.panes = 1;\n this.paneOneColumns = /** @type {number} */ (column1);\n this.paneTwoColumns = this.hasTwo\n ? /** @type {number} */ (column1)\n : null;\n }\n return true;\n });\n },\n checkTouchFinished() {\n if (this.navDrawer !== 'open') return;\n const { _touchDeltaX, refs } = this;\n const clientWidth = refs.slotNavDrawer.clientWidth;\n const visibility = (_touchDeltaX + clientWidth) / clientWidth;\n if (visibility < 0.5) {\n this._navDrawerTranslateX = '-100%';\n this._navDrawerDuration = 200 * visibility;\n this.navDrawer = 'closed';\n } else {\n this._navDrawerTranslateX = '0';\n this._navDrawerDuration = 200 * (0.5 * visibility);\n }\n },\n })\n .events({\n '~touchstart'(event) {\n if (this.navDrawer !== 'open') return;\n if (!event.touches.length) return;\n let [{ clientX, pageX }] = event.touches;\n clientX ??= pageX - window.scrollX; // Safari\n this._touchStartX = clientX;\n },\n '~touchmove'({ touches }) {\n if (this.navDrawer !== 'open') return;\n if (!touches.length) return;\n let [{ clientX, pageX }] = touches;\n clientX ??= pageX - window.scrollX; // Safari\n const delta = Math.min(clientX - this._touchStartX, 0);\n\n this._touchDeltaX = delta;\n this._navDrawerTranslateX = `${delta}px`;\n this._navDrawerDuration = 0;\n },\n touchcancel: 'checkTouchFinished',\n '~touchend': 'checkTouchFinished',\n })\n .rootEvents({\n slotchange({ target }) {\n const slotElement = /** @type HTMLSlotElement */ (target);\n const slotted = slotElement.assignedElements().length > 0;\n switch (slotElement.name) {\n case 'nav-rail':\n this.navRail = slotted ? 'closed' : null;\n break;\n case 'nav-bar':\n this.navBar = slotted ? 'closed' : null;\n break;\n case 'nav-drawer':\n this.navDrawer = slotted ? 'closed' : null;\n break;\n case 'fixed':\n this.oneFixed = slotted;\n break;\n case 'two':\n this.twoFlexible = slotted;\n break;\n case 'two-fixed':\n this.twoFixed = slotted;\n break;\n default:\n this.oneFlexible = slotted;\n break;\n }\n this.refreshLayoutValues();\n },\n })\n .childEvents({\n scrim: {\n click() {\n this.navDrawer = 'closed';\n },\n },\n })\n .on({\n navDrawerChanged(previous, current) {\n this._navDrawerTranslateX = current === 'closed' ? '-100%' : '0';\n this._navDrawerDuration = current === 'fixed' ? 0 : 200;\n },\n connected() {\n this._windowResizeListener = this.refreshLayoutValues.bind(this);\n window.addEventListener('resize', this._windowResizeListener);\n },\n disconnected() {\n window.removeEventListener('resize', this._windowResizeListener);\n },\n })\n .css`\n :host {\n --mdw-grid__columns: 4;\n --mdw-content__max-width: 1040px;\n --mdw-content__padding: 16px;\n --mdw-layout__spacer-width: 24px;\n --mdw-layout__nav-drawer__ratio: 0;\n --mdw-layout__nav-drawer-width: 360px;\n --mdw-layout__nav-rail__ratio: 0;\n --mdw-layout__nav-rail-width: 80px;\n --mdw-layout__pane1-width: minmax(0, 1fr);\n --mdw-layout__pane2-width: 0;\n --mdw-layout__window-padding: 16px;\n\n display: grid;\n grid-template-rows: auto 1fr auto;\n grid-template-columns:\n calc(var(--mdw-layout__nav-drawer-width) * var(--mdw-layout__nav-drawer__ratio))\n calc(var(--mdw-layout__nav-rail-width) * var(--mdw-layout__nav-rail__ratio))\n var(--mdw-layout__window-padding)\n var(--mdw-layout__pane1-width)\n var(--mdw-layout__window-padding)\n var(--mdw-layout__pane2-width) 0;\n grid-template-areas: \n \"nav-drawer nav-rail app-bar app-bar app-bar pane2 .\"\n \"nav-drawer nav-rail . pane1 . pane2 .\"\n \"nav-drawer nav-rail nav-bar nav-bar nav-bar nav-bar .\";\n overflow-x: clip;\n\n font: var(--mdw-typescale__body-large__font);\n letter-spacing: var(--mdw-typescale__body-large__letter-spacing);\n }\n\n :host(:where([pane-two-active])) {\n grid-template-areas: \n \"nav-drawer nav-rail app-bar app-bar app-bar pane1 .\"\n \"nav-drawer nav-rail . pane2 . pane1 .\"\n \"nav-drawer nav-rail nav-bar nav-bar nav-bar nav-bar .\";\n }\n\n :host(:where([panes=\"2\"])) {\n --mdw-content__max-width: auto;\n --mdw-layout__pane2-width: 1fr;\n grid-template-columns:\n calc(var(--mdw-layout__nav-drawer-width) * var(--mdw-layout__nav-drawer__ratio))\n calc(var(--mdw-layout__nav-rail-width) * var(--mdw-layout__nav-rail__ratio))\n var(--mdw-layout__window-padding)\n var(--mdw-layout__pane1-width)\n var(--mdw-layout__spacer-width)\n var(--mdw-layout__pane2-width)\n var(--mdw-layout__window-padding);\n\n grid-template-areas: \n \"nav-drawer nav-rail app-bar app-bar app-bar pane2 .\"\n \"nav-drawer nav-rail . pane1 . pane2 .\"\n \"nav-drawer nav-rail nav-bar nav-bar nav-bar nav-bar .\";\n }\n\n :host(:where([nav-rail=\"fixed\"])) {\n --mdw-layout__nav-rail__ratio: 1;\n }\n\n :host(:where([nav-drawer=\"fixed\"])) {\n --mdw-layout__nav-drawer__ratio: 1;\n }\n\n :host(:where([padding=\"24\"])) {\n --mdw-layout__window-padding: 24px;\n --mdw-content__padding: 24px;\n }\n\n :host(:where([panes=\"2\"][one-fixed])) {\n --mdw-layout__pane1-width: 360px;\n }\n\n :host(:where([panes=\"2\"][two-fixed])) {\n --mdw-layout__pane2-width: 360px;\n }\n\n #scrim {\n position:fixed;\n inset: 0;\n\n pointer-events: none;\n\n opacity: 0;\n z-index: 25;\n\n background-color: rgb(var(--mdw-color__scrim));\n\n transition: opacity 200ms;\n }\n\n #scrim[state=\"open\"] {\n pointer-events: auto;\n\n opacity: 0.38;\n }\n\n .pane {\n overflow: visible;\n }\n\n .pane[columns=\"8\"] {\n /* stylelint-disable-next-line rule-selector-property-disallowed-list */\n --mdw-grid__columns: 8;\n }\n\n .pane[columns=\"12\"] {\n /* stylelint-disable-next-line rule-selector-property-disallowed-list */\n --mdw-grid__columns: 12;\n }\n\n .pane1 {\n grid-area: pane1;\n\n box-sizing: content-box;\n inline-size: 100%;\n max-inline-size: var(--mdw-content__max-width, auto);\n margin-inline: auto;\n }\n\n .pane1[slotted] {\n display: block;\n }\n\n .pane2 {\n --mdw-content__padding: 0;\n grid-area: pane2;\n\n visibility: hidden;\n }\n\n .pane2[active] {\n inset-inline-end: 0;\n\n box-sizing: border-box;\n inline-size: 100%;\n padding-inline: var(--mdw-content__padding);\n\n visibility: visible;\n }\n\n .pane2[slotted] {\n display: block;\n }\n\n .pane2[panes=\"2\"] {\n position: sticky;\n inset: 0;\n\n overflow-y: auto;\n\n block-size: 100vh;\n\n visibility: visible;\n }\n\n #slot-app-bar {\n display: contents; /* Allow sticky */\n\n z-index: 2;\n }\n\n #slot-nav-bar {\n display: contents;\n grid-area: nav-bar;\n }\n\n #slot-nav-bar[state=\"closed\"] {\n display: none;\n }\n\n #slot-nav-rail {\n display: none;\n grid-area: nav-rail;\n\n z-index: 3;\n }\n\n #slot-nav-rail[state=\"fixed\"] {\n display: block;\n }\n\n #slot-nav-drawer {\n position: fixed;\n\n display: block;\n grid-area: nav-drawer;\n\n /** Initially hidden */\n transform: translateX(-100%);\n visibility: hidden;\n z-index: 26;\n\n transition-delay: 0s, 200ms;\n transition-duration: 200ms, 0s;\n transition-property: transform, visibility;\n transition-timing-function: cubic-bezier(0.3, 0, 0.8, 0.15);\n }\n\n #slot-nav-drawer:is([state=\"open\"],[state=\"fixed\"]) {\n transform: translateX(0);\n visibility: visible;\n\n transition-delay: 0s, 0s;\n transition-timing-function: cubic-bezier(0.05, 0.7, 0.1, 1); \n }\n `\n .autoRegister('mdw-layout');\n", "import AriaReflectorMixin from '../mixins/AriaReflectorMixin.js';\nimport DensityMixin from '../mixins/DensityMixin.js';\n\nimport Box from './Box.js';\n\n/** @typedef {'compact'} DeprecatedHTMLMenuElementProperties */\n\nexport default Box\n .extend()\n .mixin(DensityMixin)\n .mixin(AriaReflectorMixin)\n .set({\n _ariaRole: 'list',\n color: { empty: 'surface' },\n })\n .css`\n /* https://m3.material.io/components/lists/specs */\n\n :host {\n --mdw-bg: var(--mdw-color__surface);\n --mdw-ink: var(--mdw-color__on-surface);\n display: flex;\n flex-direction: column;\n\n padding-block: 8px;\n\n background-color: rgb(var(--mdw-bg));\n color: rgb(var(--mdw-ink));\n }\n\n `\n .autoRegister('mdw-list');\n", "import CustomElement from '../core/CustomElement.js';\nimport ShapeMixin from '../mixins/ShapeMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\nexport default CustomElement\n .extend()\n .mixin(ThemableMixin)\n .mixin(ShapeMixin)\n .observe({\n selected: 'boolean',\n icon: 'string',\n errored: 'boolean',\n disabled: 'boolean',\n hovered: 'boolean',\n focused: 'boolean',\n })\n .define({\n /** Alias for Selected (QoL) */\n checked: {\n get() { return this.selected; },\n set(value) { this.selected = value; },\n },\n })\n .html`\n <div id=inner-shape class=shape selected={selected}></div>\n `.on({\n composed() {\n const { outline } = this.refs;\n outline.removeAttribute('mdw-if');\n outline.setAttribute('selected', '{selected}');\n },\n })\n .css`\n /* https://m3.material.io/components/radio-button/specs */\n\n :host {\n --disabled-opacity: 0.38;\n --mdw-ink: rgb(var(--mdw-color__primary));\n /* Use CSS Variables to force filter to reapply (Chrome Bug) */\n --color: rgb(var(--mdw-color__on-surface-variant));\n --mdw-shape__size: var(--mdw-shape__full);\n position: relative;\n\n display: inline-block;\n\n block-size: 20px;\n inline-size: 20px;\n\n background-color: transparent;\n\n transition: opacity 200ms;\n }\n\n #outline {\n filter:\n drop-shadow(1px 0px 0px var(--color))\n drop-shadow(0px 1px 0px var(--color))\n drop-shadow(-1px 0px 0px var(--color))\n drop-shadow(0px -1px 0px var(--color))\n ;\n\n color: var(--color);\n\n will-change: filter, color;\n }\n\n #inner-shape {\n position: absolute;\n inset: 0;\n\n transform: scale(0);\n\n background-color: var(--color);\n\n transition: transform 200ms, background-color 100ms;\n }\n\n :host([hovered]) {\n --color: rgb(var(--mdw-color__on-surface));\n }\n\n :host([focused]) {\n --color: rgb(var(--mdw-color__on-surface));\n }\n\n :host([selected]) {\n --color: rgb(var(--mdw-ink));\n }\n\n :host([errored]) {\n --color: rgb(var(--mdw-color__error));\n }\n\n :host([disabled]) {\n --color: rgba(var(--mdw-color__on-surface));\n opacity: var(--disabled-opacity);\n }\n\n #inner-shape[selected] {\n transform: scale(0.5);\n }\n\n `\n .autoRegister('mdw-radio-icon');\n", "// https://www.w3.org/WAI/ARIA/apg/patterns/listbox/\n\nimport './CheckboxIcon.js';\nimport './RadioIcon.js';\nimport './Divider.js';\nimport './Icon.js';\n\nimport CustomElement from '../core/CustomElement.js';\nimport AriaReflectorMixin from '../mixins/AriaReflectorMixin.js';\nimport RippleMixin from '../mixins/RippleMixin.js';\nimport StateMixin from '../mixins/StateMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\nexport default CustomElement\n .extend()\n .mixin(ThemableMixin)\n .mixin(StateMixin)\n .mixin(RippleMixin)\n .mixin(AriaReflectorMixin)\n .set({\n _ariaRole: 'listitem',\n delegatesFocus: false,\n stateLayer: true,\n })\n .observe({\n leading: 'string',\n avatar: 'string',\n avatarColor: { value: 'primary-container' },\n avatarSrc: 'string',\n src: 'string',\n alt: 'string',\n icon: 'string',\n href: 'string',\n iconInk: 'string',\n iconSrc: 'string',\n checkbox: 'string',\n radio: 'string',\n selectionColor: { value: 'primary' },\n selected: 'boolean',\n supporting: 'string',\n trailing: 'string',\n trailingIcon: 'string',\n trailingIconInk: 'string',\n trailingIconSrc: 'string',\n divider: 'boolean',\n video: 'boolean',\n lines: 'integer',\n _supportingSlotted: 'boolean',\n })\n .observe({\n // Alias since not form-associated\n disabledState({ disabled }) {\n return disabled;\n },\n\n })\n .expressions({\n isInteractive({ href }) {\n return href != null;\n },\n hasSupporting() {\n return Boolean(this.supporting || this._supportingSlotted);\n },\n checkboxClass() {\n return this.checkbox || 'leading';\n },\n radioClass() {\n return this.radio || 'leading';\n },\n })\n .html`\n <a id=anchor mdw-if={href} href={href} disabled={disabledState} aria-labelledby=content></a>\n <mdw-checkbox-icon id=checkbox mdw-if={checkbox} aria-hidden=true class={checkboxClass} color={selectionColor} disabled={disabledState} icon=check selected={selected}></mdw-checkbox-icon>\n <mdw-radio-icon id=radio mdw-if={radio} aria-hidden=true class={radioClass} disabled={disabledState} ink={selectionColor} selected={selected}></mdw-radio-icon>\n <mdw-box mdw-if={avatar} id=avatar color={avatarColor} type-style=title-medium src={AvatarSrc}\n aria-hidden=true>{avatar}</mdw-box>\n <mdw-icon mdw-if={icon} id=icon ink={iconInk} src={iconSrc} aria-hidden=true>{icon}</mdw-icon>\n <img id=img mdw-if={src} src={src} alt={alt} video={video} />\n <slot name=leading>{leading}</slot>\n <div id=content has-supporting={hasSupporting} lines={lines}>\n <slot id=slot></slot>\n <slot id=supporting name=supporting class=text lines={lines}>{supporting}</slot>\n </div>\n <mdw-icon mdw-if={trailingIcon} id=trailing-icon ink={trailingIconInk} src={trailingIconSrc} aria-hidden=true>{trailingIcon}</mdw-icon>\n <slot id=trailing name=trailing role=note>{trailing}</slot>\n <mdw-divider mdw-if={divider} id=divider divder={divider}></mdw-divider>\n `\n .on({\n composed() {\n const { state, rippleContainer, anchor } = this.refs;\n anchor.append(\n state,\n rippleContainer,\n );\n state.setAttribute('state-disabled', 'focus hover');\n },\n disabledStateChanged(oldValue, newValue) {\n this.updateAriaProperty('ariaDisabled', newValue ? 'true' : 'false');\n },\n })\n .css`\n /* https://m3.material.io/components/lists/specs */\n\n :host {\n --mdw-shape__size: 0px;\n /* Grid does not auto collapse columns, leaving gaps */\n\n display: flex;\n align-items: center;\n gap: 16px;\n\n border: none;\n padding-block: 8px;\n padding-inline: 16px 24px;\n\n cursor: auto;\n\n outline: none;\n\n color: inherit;\n\n text-decoration: none;\n }\n\n :host([href]) {\n cursor: pointer;\n }\n\n #anchor {\n position: absolute;\n inset: 0;\n\n outline: none;\n\n color: inherit;\n\n }\n\n :host([video]) {\n padding-inline-start: 0;\n }\n\n :host([lines=\"3\"]) {\n align-items: flex-start;\n\n padding-block: 12px;\n }\n\n #content {\n display: inline-flex;\n align-items: flex-start;\n flex-direction: column;\n justify-content: center;\n\n flex: 1;\n\n padding-block: calc(8px + (var(--mdw-density) * 2px));\n }\n\n #content:is([has-supporting], [lines=\"2\"]) {\n box-sizing: border-box;\n min-block-size: calc(8px + calc(48px + var(--mdw-density) * 2px));\n padding-block: calc(4px + var(--mdw-density) * 2px);\n }\n\n #content:is([lines=\"3\"]) {\n box-sizing: border-box;\n min-block-size: calc(8px + calc(48px + var(--mdw-density) * 2px));\n padding-block: calc(0 + var(--mdw-density) * 2px);\n }\n\n #icon {\n font-size: 24px;\n }\n\n #trailing-icon {\n font-size: 24px;\n }\n\n #divider {\n position: absolute;\n inset-block-end: 0;\n\n display: block;\n\n color: rgb(var(--mdw-color__surface-container-highest));\n }\n\n #divider[divider=\"inset\"] {\n padding-inline: 16px 24px;\n }\n\n #slot {\n max-block-size: var(--mdw-typescale__body-large__line-height) * 2;\n\n /* background-color: rgba(255,0,0,0.10); */\n\n color: var(--mdw-color__on-surface);\n\n font: var(--mdw-typescale__body-large__font);\n letter-spacing: var(--mdw-typescale__body-large__letter-spacing);\n }\n\n #supporting {\n max-block-size: calc(var(--mdw-typescale__body-medium__line-height) * 2);\n\n /* background-color: rgba(0,255,0,0.10); */\n\n color: var(--mdw-color__on-surface-variant);\n\n font: var(--mdw-typescale__body-medium__font);\n letter-spacing: var(--mdw-typescale__body-medium__letter-spacing);\n }\n\n #trailing {\n color: var(--mdw-color__on-surface-variant);\n\n font: var(--mdw-typescale__body-medium__font);\n letter-spacing: var(--mdw-typescale__body-medium__letter-spacing);\n }\n\n #slot, #supporting {\n display: block;\n overflow-x: hidden;\n overflow-y: hidden;\n\n text-align: start;\n text-overflow: ellipsis;\n text-transform: none;\n white-space: normal;\n word-break: break-word;\n }\n\n #supporting[lines=\"2\"] {\n min-block-size: var(--mdw-typescale__body-medium__line-height);\n max-block-size: var(--mdw-typescale__body-medium__line-height);\n }\n\n #supporting[lines=\"3\"] {\n min-block-size: calc(var(--mdw-typescale__body-medium__line-height) * 2);\n max-block-size: calc(var(--mdw-typescale__body-medium__line-height) * 2);\n }\n\n @supports(width: 1lh) {\n #slot {\n max-block-size: 1lh;\n }\n\n #supporting {\n max-block-size: 2lh;\n }\n\n #supporting[lines=\"2\"] {\n min-block-size: 1lh;\n max-block-size: 1lh;\n }\n\n #supporting[lines=\"3\"] {\n min-block-size: 2lh;\n max-block-size: 2lh;\n }\n }\n\n @supports(-webkit-line-clamp:1) {\n #slot {\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 1;\n }\n\n #supporting {\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n }\n\n #supporting[lines=\"2\"] {\n -webkit-line-clamp: 1;\n }\n }\n\n #avatar {\n display: flex;\n align-items: center;\n justify-content: center;\n\n block-size: 40px;\n inline-size: 40px;\n\n border-radius: 50%;\n }\n\n #img {\n block-size: 56px;\n max-block-size: 56px;\n inline-size: 56px;\n max-inline-size: 56px;\n\n object-fit: cover;\n object-position: center center;\n }\n\n #img[video] {\n block-size: 64px;\n max-block-size: 64px;\n inline-size: 114px;\n max-inline-size: 114px;\n }\n\n #checkbox {\n /* stylelint-disable-next-line declaration-property-value-disallowed-list */\n margin: 3px;\n }\n\n #radio {\n /* stylelint-disable-next-line declaration-property-value-disallowed-list */\n margin: 2px;\n }\n\n .trailing {\n order: 1;\n }\n\n :host([disabled]) {\n opacity: 0.38;\n\n color: rgb(var(--mdw-color__on-surface));\n }\n `\n .childEvents({\n supporting: {\n /** @param {Event & {currentTarget: HTMLSlotElement}} event */\n slotchange({ currentTarget }) {\n this._supportingSlotted = currentTarget.assignedNodes().length !== 0;\n },\n },\n })\n .autoRegister('mdw-list-item');\n", "// https://www.w3.org/WAI/ARIA/apg/patterns/listbox/\n\nimport ListItem from './ListItem.js';\n\n// https://html.spec.whatwg.org/multipage/form-elements.html#htmloptionelement\n\nexport default class ListOption extends ListItem\n .extend()\n .setStatic({\n formAssociated: true,\n })\n .set({\n _ariaRole: 'none',\n delegatesFocus: true,\n _index: -1,\n _selectedDirty: false,\n isInteractive: true,\n })\n .observe({\n // ListOption.prototype._form = ListOption.prop('_form');\n _label: { attr: 'label', reflect: true, nullParser: String },\n defaultSelected: { attr: 'selected', reflect: true, type: 'boolean' },\n _selected: 'boolean',\n _value: { attr: 'value', reflect: true },\n _formDisabled: 'boolean',\n })\n .observe({\n selected: {\n reflect: false,\n type: 'boolean',\n get({ _selectedDirty, defaultSelected, _selected }) {\n if (!_selectedDirty) return defaultSelected;\n return _selected;\n },\n /** @param {boolean} value */\n set(value) {\n this._selectedDirty = true;\n this._selected = value;\n },\n },\n disabledState({ _formDisabled, disabled }) {\n if (_formDisabled) return true;\n return !!disabled;\n },\n })\n .define({\n index() { return this._index; },\n form() { return (this.parentElement)?.form; },\n label: {\n get() { return this._label ?? this.textContent; },\n /** @param {string} value */\n set(value) {\n this._label = value;\n },\n },\n value: {\n get() { return this._value ?? this.textContent; },\n /** @param {string} value */\n set(value) { this._label = value; },\n },\n })\n .methods({\n /** @param {boolean} formDisabled */\n formDisabledCallback(formDisabled) {\n this._formDisabled = formDisabled;\n },\n /** @type {HTMLElement['focus']} */\n focus(...options) {\n this.refs.anchor.focus(...options);\n },\n })\n .on({\n composed({ inline }) {\n const { anchor, state, content } = this.refs;\n\n // Form Associated elements cannot receive focus unless using delegatesFocus\n // Workaround by redirecting focus to an inner element\n // Reuse HTMLAnchorElement with no HREF\n // Issues: Siblings (images) are not contained within tree\n\n anchor.setAttribute('disabled', '{disabledState}');\n anchor.setAttribute('role', 'option');\n anchor.setAttribute('aria-disabled', inline(({ disabledState }) => `${disabledState}`));\n anchor.setAttribute('tabindex', '0');\n anchor.setAttribute('aria-selected', inline(({ selected }) => `${selected}`));\n anchor.setAttribute('selected', '{selected}');\n anchor.removeAttribute('href');\n anchor.removeAttribute('mdw-if');\n\n content.setAttribute('selected', '{selected}');\n\n state.setAttribute('state-disabled', 'focus');\n },\n _labelChanged(previous, current) {\n const { anchor } = this.refs;\n if (current == null) {\n anchor.setAttribute('aria-labelledby', 'content');\n anchor.removeAttribute('aria-label');\n } else {\n anchor.setAttribute('aria-label', current);\n anchor.removeAttribute('aria-labelledby');\n }\n },\n selectedChanged(previous, current) {\n // Used by HTMLCollection\n this.classList.toggle('mdw-list-option__selected', current);\n this.dispatchEvent(new Event('mdw-list-option:changed', { bubbles: true, composed: true }));\n },\n })\n .css`\n :host {\n --mdw-bg: var(--mdw-color__secondary-container);\n --mdw-ink: var(--mdw-color__on-secondary-container);\n cursor: pointer;\n \n z-index: 0;\n }\n \n :host([href]) {\n cursor: pointer;\n }\n \n :host([disabled]) {\n cursor: not-allowed;\n pointer-events: none;\n }\n \n #content {\n -webkit-user-select: none;\n user-select: none;\n }\n \n #content[selected] {\n color: rgb(var(--mdw-ink));\n }\n \n #anchor {\n z-index: -1;\n }\n \n #anchor[selected] {\n background-color: rgb(var(--mdw-bg));\n color: rgb(var(--mdw-ink));\n }\n ` {\n static { this.autoRegister('mdw-list-option'); }\n\n /**\n * @param {string} [text]\n * @param {string} [value]\n * @param {boolean} [defaultSelected]\n * @param {boolean} [selected]\n */\n constructor(text, value, defaultSelected, selected) {\n super();\n if (text !== undefined) {\n this.text = text;\n }\n if (value !== undefined) {\n this._value = value;\n }\n if (defaultSelected !== undefined) {\n this.defaultSelected = defaultSelected;\n }\n if (selected !== undefined) {\n this._selected = selected;\n }\n }\n\n connectedCallback() {\n super.connectedCallback();\n if (!this.hasAttribute('tabindex')) {\n this.tabIndex = 0;\n }\n }\n}\n", "/**\n * @see https://html.spec.whatwg.org/multipage/common-dom-interfaces.html#htmloptionscollection\n * @template {HTMLOptionElement} T1\n * @template {HTMLOptGroupElement} T2\n * @param {Object} options\n * @param {HTMLElement} options.host\n * @param {HTMLCollectionOf<T1>} options.collection\n * @param {typeof T1} options.OptionConstructor\n * @param {typeof T2} options.GroupConstructor\n * @return {HTMLCollectionOf<T1> & HTMLOptionsCollection}\n */\nexport function constructHTMLOptionsCollectionProxy({ host, collection, OptionConstructor, GroupConstructor }) {\n /**\n * @param {T1} element\n * @param {HTMLElement|number} [before]\n * @return {void}\n */\n // eslint-disable-next-line func-style\n const add = function add(element, before) {\n let beforeElement;\n let index = -1;\n if (typeof before === 'number') {\n if (before >= 0 && before < collection.length - 1) {\n index = before;\n }\n } else if (before instanceof HTMLElement) {\n beforeElement = before;\n }\n if (index !== -1) {\n beforeElement = collection.item(index);\n }\n if (beforeElement) {\n beforeElement.before(element);\n } else {\n host.append(element);\n }\n };\n /**\n * @param {number} index\n * @return {void}\n */\n // eslint-disable-next-line func-style\n const remove = function remove(index) {\n collection.item(index)?.remove();\n };\n\n Object.defineProperty(collection, 'selectedIndex', {\n get() {\n for (let i = 0; i < collection.length; i++) {\n if (collection[i].selected) {\n return i;\n }\n }\n return -1;\n },\n set(value) {\n for (let i = 0; i < collection.length; i++) {\n collection[i].selected = (i === value);\n }\n },\n });\n const newCollection = new Proxy(collection, {\n get(target, p, receiver) {\n switch (p) {\n case 'add':\n return add;\n case 'remove':\n return remove;\n default:\n return target[p];\n }\n },\n set(target, p, newValue, receiver) {\n let index = Number.NaN;\n switch (typeof p) {\n case 'string':\n index = Number.parseInt(p, 10);\n break;\n case 'number':\n index = p;\n break;\n default:\n case 'symbol':\n return Reflect.set(target, p, newValue, receiver);\n }\n if (Number.isNaN(index)) {\n return Reflect.set(target, p, newValue, receiver);\n }\n const currentSize = collection.length;\n while (index > collection.length) {\n add(new OptionConstructor());\n }\n if (index === currentSize) {\n if (newValue != null) {\n add(newValue);\n }\n } else if (index >= 0) {\n remove(index);\n if (newValue !== null) {\n add(newValue, index);\n }\n }\n },\n });\n return newCollection;\n}\n", "import { constructHTMLOptionsCollectionProxy } from '../dom/HTMLOptionsCollectionProxy.js';\nimport FormAssociatedMixin from '../mixins/FormAssociatedMixin.js';\nimport KeyboardNavMixin from '../mixins/KeyboardNavMixin.js';\nimport StateMixin from '../mixins/StateMixin.js';\n\nimport List from './List.js';\nimport ListOption from './ListOption.js';\n\n/** @implements {HTMLSelectElement} */\n// @ts-expect-error Can't implement index signatures (use `item()`)\nexport default List\n .extend()\n .mixin(StateMixin)\n .mixin(FormAssociatedMixin)\n .mixin(KeyboardNavMixin)\n .observe({\n multiple: 'boolean',\n size: { type: 'integer', empty: 0 },\n })\n .set({\n _ariaRole: 'listbox',\n delegatesFocus: true,\n /** @type {HTMLCollectionOf<ListOption> & HTMLOptionsCollection} */\n _optionsCollection: null,\n /** @type {HTMLCollectionOf<ListOption>} */\n _selectedOptionsCollection: null,\n _handlingSelectedness: false,\n })\n .define({\n options() {\n if (!this._optionsCollection) {\n this._optionsCollection = constructHTMLOptionsCollectionProxy({\n host: this,\n collection: this.getElementsByTagName(ListOption.elementName),\n OptionConstructor: ListOption,\n GroupConstructor: ListOption,\n });\n }\n return this._optionsCollection;\n },\n\n /** @return {HTMLCollectionOf<ListOption>} */\n selectedOptions() {\n // eslint-disable-next-line no-return-assign\n return (this._selectedOptionsCollection\n ??= (\n /** @type {HTMLCollectionOf<ListOption>} */\n (this.getElementsByClassName('mdw-list-option__selected')))\n );\n },\n\n type() { return 'select'; },\n\n kbdNavQuery() { return ListOption.elementName; },\n\n kbdNavFocusableWhenDisabled() { return true; },\n })\n .define({\n length() { return this.options.length; },\n\n selectedIndex: {\n get() {\n const [selectedItem] = this.selectedOptions;\n if (!selectedItem) return -1;\n return Array.prototype.indexOf.call(this.options, selectedItem);\n },\n set(value) {\n const itemToSelect = this.options[value];\n for (const option of this.options) {\n option.selected = (option === itemToSelect);\n }\n this._value = this.value;\n },\n },\n value: {\n get() {\n return this.selectedOptions[0]?.value ?? '';\n },\n /** @param {string} v */\n set(v) {\n let newValue = '';\n const vString = `${v}`;\n for (const option of this.options) {\n if ((option.selected = (option.value === vString))) {\n newValue = vString;\n }\n }\n this._value = newValue;\n },\n },\n add() { return this.options.add; },\n })\n .on({\n disabledStateChanged(oldValue, newValue) {\n this._kbdFocusable = !newValue;\n this.tabIndex = newValue ? -1 : 0;\n },\n multipleChanged(oldValue, newValue) {\n this.updateAriaProperty('ariaMultiSelectable', newValue ? 'true' : 'false');\n },\n _formResetChanged(oldValue, newValue) {\n // TODO: Unset dirty\n },\n connected() {\n if (!this.hasAttribute('tabindex')) {\n this.tabIndex = 0;\n }\n },\n })\n .methods({\n * _selectedOptionsGenerator() {\n for (const el of this.options) {\n if (!el.selected) continue;\n yield el;\n }\n },\n * [Symbol.iterator]() {\n for (const el of this.options) {\n yield el;\n }\n },\n focus() {\n this.focusCurrentOrFirst();\n },\n /**\n * @param {number} index\n * @return {ListOption|null}\n */\n item(index) { return this.options[index]; },\n /**\n * @param {string} name ID of ListOption\n * @return {ListOption|null}\n */\n namedItem(name) {\n for (const option of this.options) {\n if (option.id === name) {\n return option;\n }\n }\n return null;\n },\n /** @param {Event} event */\n onListboxClick(event) {\n const target = event.target;\n if (!(target instanceof ListOption)) return;\n event.stopPropagation();\n if (target.disabledState) return;\n\n let sendUpdateNotifications = false;\n this._handlingSelectedness = true;\n\n // Perform unselect\n if (target.selected) {\n // Unselect condition\n if (!this.required || (this.multiple && this.selectedOptions.length > 1)) {\n sendUpdateNotifications = true;\n target.selected = false;\n }\n } else {\n if (!this.multiple) {\n // Unselect all other values\n for (const option of this.selectedOptions) {\n option.selected = false;\n }\n }\n\n target.selected = true;\n sendUpdateNotifications = true;\n }\n\n this._value = this.value;\n this._handlingSelectedness = false;\n\n if (sendUpdateNotifications) {\n this.dispatchEvent(new Event('input', { bubbles: true, composed: true }));\n this.dispatchEvent(new Event('change', { bubbles: true }));\n }\n },\n })\n .css`\n :host(:disabled) {\n cursor: not-allowed;\n pointer-events: none;\n }\n \n :host([internals-disabled]) {\n cursor: not-allowed;\n pointer-events: none;\n }\n `\n .events({\n 'mdw-list-option:changed'(event) {\n event.stopPropagation();\n if (this.multiple) return;\n if (this._handlingSelectedness) return;\n\n const target = /** @type {ListOption} */ (/** @type {unknown} */ (event.target));\n if (target.selected) return;\n this._handlingSelectedness = true;\n\n // Programmatic selection of option means deselection of others\n for (const option of this.selectedOptions) {\n if (option !== target) {\n option.selected = false;\n }\n }\n\n this._value = this.value;\n this._handlingSelectedness = false;\n },\n focus() {\n // Manual delegates focus because disabled items need to be focusable\n this.focusCurrentOrFirst();\n },\n keydown(event) {\n if (event.key === 'Spacebar' || event.key === ' ') {\n const target = event.target;\n if (!(target instanceof ListOption)) return;\n event.stopPropagation();\n event.preventDefault();\n this.onListboxClick.call(this, event);\n }\n },\n click: 'onListboxClick',\n })\n .childEvents({\n slot: {\n slotchange() {\n this.refreshTabIndexes();\n let index = 0;\n for (const el of this.options) {\n el._index = index++;\n }\n // Refresh internal value\n this._value = this.value;\n },\n },\n })\n .autoRegister('mdw-listbox');\n", "// https://www.w3.org/TR/wai-aria-practices/#menu\n\nimport './Surface.js';\nimport CustomElement from '../core/CustomElement.js';\nimport { attemptFocus } from '../core/dom.js';\nimport DensityMixin from '../mixins/DensityMixin.js';\nimport KeyboardNavMixin from '../mixins/KeyboardNavMixin.js';\nimport PopupMixin from '../mixins/PopupMixin.js';\nimport ShapeMixin from '../mixins/ShapeMixin.js';\nimport SurfaceMixin from '../mixins/SurfaceMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\nexport default CustomElement\n .extend()\n .mixin(ThemableMixin)\n .mixin(SurfaceMixin)\n .mixin(ShapeMixin)\n .mixin(PopupMixin)\n .mixin(DensityMixin)\n .mixin(KeyboardNavMixin)\n .set({\n scrollable: true,\n flow: 'corner',\n _useScrim: false,\n /** @type {WeakRef<HTMLElement>} */\n _cascader: null,\n /** @type {WeakRef<HTMLElement>} */\n _submenu: null,\n })\n .define({\n kbdNavChildren() {\n const items = [...this.querySelectorAll('mdw-menu-item')];\n // eslint-disable-next-line unicorn/prefer-set-has\n const submenuItems = [...this.querySelectorAll(':scope mdw-menu mdw-menu-item')];\n return items.filter((el) => !submenuItems.includes(el));\n },\n _dialog() {\n return /** @type {HTMLDialogElement} */ (this.refs.dialog);\n },\n cascader: {\n get() {\n return this._cascader?.deref();\n },\n /**\n * @param {HTMLElement} value\n */\n set(value) {\n this._cascader = value ? new WeakRef(value) : null;\n },\n },\n submenu: {\n get() {\n return this._submenu?.deref();\n },\n /**\n * @param {HTMLElement} value\n */\n set(value) {\n this._submenu = value ? new WeakRef(value) : null;\n },\n },\n })\n .on({\n composed() {\n const { shape, surface, dialog, scrim } = this.refs;\n surface.append(shape);\n dialog.prepend(surface);\n scrim.setAttribute('invisible', '');\n\n // Wrap slot in scroller\n },\n })\n .css`\n /* https://m3.material.io/components/menus/specs */\n\n :host {\n --mdw-shape__size: var(--mdw-shape__extra-small);\n --mdw-bg: var(--mdw-color__surface-container);\n --mdw-ink: var(--mdw-color__on-surface);\n\n --mdw-surface__shadow__resting: var(--mdw-surface__shadow__2);\n --mdw-surface__shadow__raised: var(--mdw-surface__shadow__resting);\n display: block;\n\n inline-size: auto;\n min-inline-size: calc(var(--mdw-menu__inline-base) * 2);\n max-inline-size: 100vw;\n }\n\n #shape {\n background-color: rgb(var(--mdw-bg));\n }\n\n #form {\n display: contents;\n }\n `\n .methods({\n showModal(...args) {\n this._useScrim = true;\n const result = this.showPopup(...args);\n this._useScrim = false;\n return result;\n },\n focus() {\n const [firstItem] = this.kbdNavChildren;\n if (!attemptFocus(firstItem)) {\n this.focusNext(firstItem);\n }\n },\n /**\n * @param {HTMLElement} cascader Element that calls for submenu cascade\n */\n cascade(cascader) {\n this.cascader = cascader;\n this.showPopup(cascader, true, 'adjacent');\n },\n })\n .events({\n 'mdw-menu-item:cascade'(event) {\n const menuItem = event.target;\n const subMenuId = event.detail;\n event.stopPropagation();\n\n const submenu = this.getRootNode().getElementById(subMenuId);\n this.submenu = submenu;\n submenu.cascade(menuItem);\n },\n 'mdw-menu-item:cascader-blur'() {\n const submenu = this.submenu;\n // Wait for focus event (if mouse focus on sub menu item)\n queueMicrotask(() => {\n // Stay open if submenu is focused\n if (submenu && submenu.matches(':focus-within,:focus')) return;\n\n submenu.close(false);\n });\n },\n\n '~click'(event) {\n if (this !== event.target) return;\n // Clicked self (scrim-like)\n event.stopPropagation();\n this.close(true);\n },\n keydown(event) {\n if (!this.open) return;\n\n switch (event.key) {\n case 'Tab':\n // Hide menu allowing focus to revert to calling element\n // If close is successfully, focus will return to spawning element\n // and browser will then tab from spawning to next.\n // If close is not successful, stop event.\n if (!this.close()) {\n event.stopPropagation();\n event.preventDefault();\n }\n break;\n // Unless menu hiding is cancelled\n case 'ArrowLeft':\n case 'ArrowRight':\n // if (!this.submenu) break;\n if (getComputedStyle(this).direction === 'rtl') {\n if (event.key === 'ArrowLeft') break;\n } else if (event.key === 'ArrowRight') break;\n // Fallthrough;\n case 'Escape':\n case 'Esc':\n event.stopPropagation();\n event.preventDefault();\n this.close(true);\n break;\n default:\n }\n },\n focusout() {\n if (!this.open) return;\n if (this.modal) return;\n // Wait until end of event loop cycle to see if focus really is lost\n queueMicrotask(() => {\n if (this.matches(':focus-within')) return;\n const { cascader, submenu } = this;\n\n if (cascader && cascader.matches(':is(:focus-within,:focus)')) return;\n if (submenu && submenu.matches(':is(:focus-within,:focus)')) return;\n this.close(false);\n });\n },\n })\n .autoRegister('mdw-menu');\n", "// https://www.w3.org/TR/wai-aria-practices/#menu\n\nimport FormAssociatedMixin from '../mixins/FormAssociatedMixin.js';\n\nimport './Icon.js';\nimport ListOption from './ListOption.js';\n\nexport default class MenuItem extends ListOption\n .extend()\n .mixin(FormAssociatedMixin)\n .set({\n _cascadeTimeout: null,\n CASCADE_TIMEOUT: 500,\n _cascading: false,\n })\n .define({\n type() {\n if (this.radio != null) return 'radio';\n if (this.checkbox != null) return 'checkbox';\n return null;\n },\n })\n .observe({\n /** ID of menu to cascade */\n cascades: 'string',\n /** Can be null */\n _defaultValue: {\n attr: 'value',\n reflect: true,\n nullParser: String,\n empty: null,\n },\n })\n .observe({\n /** Never returns null */\n defaultValue: {\n reflect: false,\n get() {\n return this._defaultValue ?? '';\n },\n /** @param {string} value */\n set(value) {\n this._defaultValue = value;\n },\n },\n value: {\n reflect: false,\n get() {\n return this._defaultValue ?? 'on';\n },\n /**\n * @param {string} value\n * @return {void}\n */\n set(value) {\n this._defaultValue = value;\n },\n },\n })\n .overrides({\n formIPCEvent(event) {\n if (event.target instanceof HTMLFormElement && event.target !== this.form) {\n console.warn('Control.formIPCEvent: Abort from wrong form');\n return;\n }\n if (this.type !== 'radio') {\n console.warn('Control.formIPCEvent: Abort from not radio');\n return;\n }\n const [name, value] = event.detail;\n if (this.name !== name) return;\n if (value === this.value) return;\n if (this.value === '1') {\n console.log('unchecking', this.name, this.value);\n this.selected = false;\n } else {\n this.selected = false;\n }\n },\n })\n .expressions({\n computeTrailingIcon({ trailingIcon, cascades }) {\n if (!trailingIcon && cascades) return 'arrow_right';\n return trailingIcon;\n },\n })\n .methods({\n unscheduleCascade() {\n clearTimeout(this._cascadeTimeout);\n this._cascadeTimeout = null;\n },\n scheduleCascade() {\n if (this._cascadeTimeout) return;\n this._cascadeTimeout = setTimeout(this.cascade.bind(this), this.CASCADE_TIMEOUT);\n },\n cascade() {\n this.unscheduleCascade();\n this._cascading = true;\n // Dispatch event asking for cascade.\n // Captured by parent mdw-menu and used to track current submenu\n this.dispatchEvent(new CustomEvent('mdw-menu-item:cascade', { detail: this.cascades, bubbles: true }));\n this._cascading = false;\n },\n })\n .on({\n _selectedChanged(oldValue, newValue) {\n console.log('_selectedChanged', oldValue, newValue);\n if (newValue) {\n this.elementInternals.setFormValue(this.value);\n if (this.type === 'radio') {\n this._notifyRadioChange(this.name, this.value);\n }\n } else {\n this.elementInternals.setFormValue(null);\n }\n if (this._selectedDirty) {\n this.dispatchEvent(new Event('change', { bubbles: true }));\n }\n },\n })\n .events({\n mouseenter() {\n if (this.disabledState) return;\n if (document.activeElement !== this) {\n this.focus();\n }\n if (!this.cascades) return;\n this.scheduleCascade();\n },\n mouseout: 'unscheduleCascade',\n '~click'() {\n if (this.disabledState) return;\n if (this.type === 'radio') {\n if (this.required) return;\n this.selected = true;\n } else if (this.type === 'checkbox') {\n if (this.required) return;\n this.selected = !this.selected;\n return;\n }\n\n if (this.cascades) {\n this.cascade();\n }\n },\n keydown(event) {\n if (this.disabledState) return;\n switch (event.key) {\n case 'Enter':\n case ' ':\n event.stopPropagation();\n event.preventDefault();\n this.click();\n break;\n case 'ArrowLeft':\n case 'ArrowRight':\n if (!this.cascades) break;\n if (getComputedStyle(this).direction === 'rtl') {\n if (event.key === 'ArrowRight') break;\n } else if (event.key === 'ArrowLeft') break;\n event.stopPropagation();\n event.preventDefault();\n this.cascade();\n break;\n default:\n }\n },\n /**\n * Closes submenu if focus leaves cascader to something else (sibling menu item)\n * RelatedTarget is unreliable on Webkit\n */\n blur() {\n if (!this.cascades) return;\n if (this._cascading) return;\n this.dispatchEvent(new CustomEvent('mdw-menu-item:cascader-blur', { detail: this.cascades, bubbles: true }));\n },\n })\n .on({\n composed({ inline, html }) {\n const { checkbox: checkboxRef, radio: radioRef, anchor, trailing, trailingIcon } = this.refs;\n checkboxRef.remove();\n radioRef.remove();\n\n anchor.setAttribute('role', inline(({ checkbox, radio }) => {\n if (checkbox != null) return 'menuitemcheckbox';\n if (radio != null) return 'menuitemradio';\n return 'menuitem';\n }));\n\n // MenuItems use checked instead of selected as in list items.\n anchor.setAttribute('ariaChecked', anchor.getAttribute('aria-selected'));\n\n anchor.after(html`\n <mdw-icon id=selection\n mdw-if=${({ checkbox, radio }) => checkbox ?? radio ?? false}\n class=${({ checkbox, radio }) => checkbox || radio || 'leading'}\n selected={selected}>check</mdw-icon>\n `);\n\n trailing.setAttribute('type-style', 'label-large');\n\n trailingIcon.setAttribute('mdw-if', '{computeTrailingIcon}');\n trailingIcon.textContent = '{computeTrailingIcon}';\n },\n _formResetChanged(oldValue, newValue) {\n if (!newValue) return;\n this._selected = this.defaultSelected;\n },\n })\n .css`\n /* https://m3.material.io/components/menus/specs */\n\n :host {\n gap: 12px;\n\n padding-inline: 12px;\n\n cursor: pointer;\n\n white-space: nowrap;\n }\n\n #content {\n padding-block: calc(4px + (var(--mdw-density) * 2px))\n }\n\n #icon {\n transition-duration: 100ms;\n transition-property: opacity;\n will-change: opacity;\n }\n\n #trailing,\n #icon {\n color: rgb(var(--mdw-color__on-surface-variant));\n }\n\n #selection {\n opacity: 0;\n\n font-size: 18px;\n }\n\n #selection.trailing {\n font-size: 24px;\n }\n\n #selection[selected] {\n opacity: 1;\n }\n\n :host([disabled]) {\n cursor: not-allowed;\n }\n\n #anchor[selected] {\n background-color: transparent;\n color: inherit;\n }\n\n #content[selected] {\n color: inherit;\n }\n `\n .autoRegister('mdw-menu-item')\n .tsClassFix() {}\n", "const IDLE_TIMEOUT_MS = 500;\n\n/**\n * @param {typeof import('../core/CustomElement.js').default} Base\n */\nexport default function ScrollListenerMixin(Base) {\n return Base\n .observe({\n _scrollListenerPositionX: { type: 'float', empty: 0, reflect: false },\n _scrollListenerPositionY: { type: 'float', empty: 0, reflect: false },\n _scrollListenerLastIdle: { type: 'float', empty: 0 },\n _scrollListenerLastScroll: { type: 'float', empty: 0 },\n _scrollListenerLastResize: { type: 'float', empty: 0 },\n })\n .set({\n /** @type {WeakRef<EventTarget>} */\n _scroller: null,\n /** @type {EventListener} */\n _scrollerScrollListener: null,\n /** @type {EventListener} */\n _scrollerResizeListener: null,\n _scrollDebounce: null,\n })\n .methods({\n _scrollListenerOnScrollIdle() {\n this._scrollListenerLastIdle = performance.now();\n },\n\n /** @param {Event} event */\n _scrollListenerOnScrollerScroll(event) {\n this._scrollListenerPositionY = (event.currentTarget === window)\n ? window.scrollY\n : /** @type {HTMLElement} */ (event.currentTarget).scrollTop;\n\n this._scrollListenerPositionX = (event.currentTarget === window)\n ? window.scrollX\n : /** @type {HTMLElement} */ (event.currentTarget).scrollLeft;\n\n this._scrollListenerLastScroll = performance.now();\n clearTimeout(this._scrollDebounce);\n this._scrollDebounce = setTimeout(() => this._scrollListenerOnScrollIdle(), IDLE_TIMEOUT_MS);\n },\n\n /** @param {Event} event */\n _scrollListenerOnScrollerResize(event) {\n this._scrollListenerLastResize = performance.now();\n },\n\n /**\n * @param {EventTarget} [scroller]\n * @return {boolean}\n */\n startScrollListener(scroller) {\n scroller ??= this.offsetParent;\n if (!scroller) return false;\n\n if (scroller === document.body) {\n // console.log('scroller is body, attaching to window');\n scroller = window;\n }\n\n this._scroller = new WeakRef(scroller);\n this._scrollerScrollListener = this._scrollListenerOnScrollerScroll.bind(this);\n this._scrollerResizeListener = this._scrollListenerOnScrollerResize.bind(this);\n scroller.addEventListener('scroll', this._scrollerScrollListener, { passive: true });\n scroller.addEventListener('resize', this._scrollerResizeListener, { passive: true });\n this._scrollListenerPositionX = 0;\n this._scrollListenerPositionY = 0;\n return true;\n },\n })\n .define({\n /** @return {Window|HTMLElement} */\n _scrollListenerScroller() {\n return this._scroller.deref();\n },\n })\n .define({\n\n _scrollListenerScrollerScrollHeight() {\n const scroller = this._scrollListenerScroller;\n if (scroller === window) {\n return document.documentElement.scrollHeight;\n }\n return scroller.scrollHeight;\n },\n _scrollListenerScrollerClientHeight() {\n const scroller = this._scrollListenerScroller;\n if (scroller === window) {\n return window.innerHeight;\n }\n // @ts-expect-error Skip Element cast\n return scroller.clientHeight;\n },\n })\n .methods({\n /**\n * @param {EventTarget} [scroller]\n * @return {boolean}\n */\n _scrollListenerClear(scroller) {\n scroller ??= this._scroller?.deref();\n if (!scroller) return false;\n if (!this._scrollerScrollListener) return false;\n scroller.removeEventListener('scroll', this._scrollerScrollListener);\n return true;\n },\n });\n}\n", "import { ELEMENT_STYLER_TYPE } from '../core/customTypes.js';\n\nimport ScrollListenerMixin from './ScrollListenerMixin.js';\n\n/**\n * Hides sticky element when scrolling down\n * @param {typeof import('../core/CustomElement.js').default} Base\n */\nexport default function SemiStickyMixin(Base) {\n return Base\n .mixin(ScrollListenerMixin)\n .observe({\n _semiStickyHeight: { type: 'float', empty: 0 },\n _semiStickyOffsetY: { type: 'float', empty: 0 },\n _semiStickyWidth: { type: 'float', empty: 0 },\n _semiStickyOffsetX: { type: 'float', empty: 0 },\n _semiStickyTranslateY: { type: 'float', empty: 0 },\n _semiStickyTranslateX: { type: 'float', empty: 0 },\n _semiStickyDuration: { type: 'float', empty: 0 },\n _semiStickyEasing: { empty: 'ease-in' },\n _semiStickyAnchor: {\n /** @type {'top'|'start'|'end'|'bottom'|'left'|'right'} */\n empty: 'top',\n },\n stickyAlways: 'boolean',\n })\n .methods({\n /** @return {HTMLElement} */\n _getSemiStickyElement() { return this; },\n _refreshSemiStickyMetrics() {\n const semiStickyElement = this._getSemiStickyElement();\n this._semiStickyHeight = semiStickyElement.offsetHeight;\n this._semiStickyWidth = semiStickyElement.offsetWidth;\n // No way to measure offset when stickied ?\n semiStickyElement.style.position = 'relative';\n this._semiStickyOffsetY = semiStickyElement.offsetTop;\n this._semiStickyOffsetX = semiStickyElement.offsetLeft;\n semiStickyElement.style.position = 'sticky';\n },\n })\n .observe({\n _semiStickyStyleStyle: {\n ...ELEMENT_STYLER_TYPE,\n get({ _semiStickyTranslateX, _semiStickyTranslateY, _semiStickyDuration, _semiStickyEasing }) {\n return {\n target: this._getSemiStickyElement(),\n styles: {\n transform: `translateX(${_semiStickyTranslateX}px) translateY(${_semiStickyTranslateY}px)`,\n },\n timing: {\n duration: _semiStickyDuration,\n easing: _semiStickyEasing,\n },\n };\n },\n },\n })\n .on({\n _scrollListenerLastResizeChanged() {\n if (this._semiStickyAnchor !== 'bottom') return;\n // Chrome Bug: When window resizes bottom sticky needs to be recomputed\n // Force style recalculation\n const semiStickyElement = this._getSemiStickyElement();\n semiStickyElement.style.setProperty('bottom', 'auto');\n // eslint-disable-next-line no-unused-expressions\n semiStickyElement.clientHeight;\n semiStickyElement.style.removeProperty('bottom');\n this.propChangedCallback('_scrollListenerPositionY', this._scrollListenerPositionY, this._scrollListenerPositionY);\n },\n _scrollListenerPositionYChanged(oldValue, newValue) {\n const delta = newValue - oldValue;\n if (this._semiStickyAnchor === 'top') {\n this._semiStickyDuration = 0;\n this._semiStickyTranslateY = (this.stickyAlways || newValue < this._semiStickyOffsetY)\n ? 0\n : Math.min(0, Math.max(this._semiStickyTranslateY - delta, -this._semiStickyHeight));\n } else if (this._semiStickyAnchor === 'bottom') {\n this._semiStickyDuration = 0;\n const anchor = this._scrollListenerScrollerClientHeight + newValue;\n const distanceFromAnchor = this._semiStickyOffsetY - anchor;\n this._semiStickyTranslateY = this.stickyAlways\n ? 0\n : Math.max(0, Math.min(\n this._semiStickyTranslateY + delta,\n this._semiStickyHeight + Math.min(0, distanceFromAnchor),\n ));\n }\n },\n _scrollListenerLastIdleChanged() {\n if (this.stickyAlways) return;\n this._refreshSemiStickyMetrics();\n if (this._semiStickyAnchor === 'top') {\n const { offsetTop } = this.refs.surface;\n const offset = this._scrollListenerPositionY - offsetTop;\n const delta = offset - this._semiStickyTranslateY;\n const visibility = delta / this._semiStickyHeight;\n\n if (visibility <= 0) return;\n if (visibility >= 1) return;\n if (visibility <= 0.5 || offsetTop < this._semiStickyHeight) {\n // Reveal all\n this._semiStickyDuration = 250;\n this._semiStickyEasing = 'ease-in';\n this._semiStickyTranslateY = 0;\n // this._semiStickyHeadlineOpacity = 1;\n } else {\n this._semiStickyDuration = 200;\n this._semiStickyEasing = 'ease-out';\n // Don't hide past origin\n this._semiStickyTranslateY = Math.max(\n this._semiStickyOffsetY - this._scrollListenerPositionY,\n -this._semiStickyHeight,\n );\n }\n } else if (this._semiStickyAnchor === 'bottom') {\n const max = this._semiStickyHeight;\n const visibility = (max - this._semiStickyTranslateY) / max;\n if (visibility <= 0) return;\n if (visibility >= 1) return;\n if (visibility >= 0.5) {\n // Reveal all\n this._semiStickyDuration = 250;\n this._semiStickyEasing = 'ease-in';\n this._semiStickyTranslateY = 0;\n // this._semiStickyHeadlineOpacity = 1;\n } else {\n this._semiStickyDuration = 200;\n this._semiStickyEasing = 'ease-out';\n const anchor = this._scrollListenerScrollerClientHeight + this._scrollListenerPositionY;\n const distanceFromAnchor = this._semiStickyOffsetY - anchor;\n // Don't hide past origin\n this._semiStickyTranslateY = this._semiStickyHeight + Math.min(0, distanceFromAnchor);\n }\n }\n },\n connected() {\n const semiStickyElement = this._getSemiStickyElement();\n // Connect scroll when element gets first size\n const resizeObserver = new ResizeObserver(() => {\n this.startScrollListener(semiStickyElement.offsetParent ?? window);\n resizeObserver.disconnect();\n this._refreshSemiStickyMetrics();\n });\n resizeObserver.observe(semiStickyElement);\n this._refreshSemiStickyMetrics();\n },\n disconnected() {\n this._scrollListenerClear();\n },\n });\n}\n", "import './Icon.js';\nimport './Ripple.js';\nimport './Badge.js';\n\nimport CustomElement from '../core/CustomElement.js';\nimport RippleMixin from '../mixins/RippleMixin.js';\nimport ShapeMixin from '../mixins/ShapeMixin.js';\nimport StateMixin from '../mixins/StateMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\n/** @typedef {'charset'|'coords'|'name'|'shape'} DeprecatedHTMLAnchorElementProperties */\n\nexport default class NavItem extends CustomElement\n .extend()\n .mixin(ThemableMixin)\n .mixin(StateMixin)\n .mixin(RippleMixin)\n .mixin(ShapeMixin)\n .set({\n delegatesFocus: true,\n stateLayer: true,\n })\n .observe({\n showLabel: 'string',\n active: 'boolean',\n icon: 'string',\n src: 'string',\n href: 'string',\n badge: 'string',\n ariaLabel: 'string', // watch attribute and emit callback\n })\n .methods({\n /** @type {HTMLElement['focus']} */\n focus(...args) {\n this.refs.anchor.focus(...args);\n },\n })\n .html`\n <mdw-icon id=icon aria-hidden=true src={src} active={active}>{icon}</mdw-icon>\n <a id=anchor\n aria-current=${({ active }) => (active ? 'page' : null)}\n aria-describedby=badge\n aria-label={ariaLabel}\n aria-labelledby=${({ ariaLabel }) => (ariaLabel ? null : 'slot')}\n href=${({ href }) => href ?? '#'}>\n </a>\n <slot id=slot active={active} show-label={showLabel} aria-hidden=true></slot>\n <mdw-badge part=badge id=badge badge={badge} show-label={showLabel} aria-hidden=true>{badge}</mdw-badge>\n `\n .on({\n composed({ html }) {\n const { shape, state, rippleContainer } = this.refs;\n shape.append(html`\n <mdw-ripple id=ripple ripple-origin=center keep-alive hold-ripple ripple-state=${({ active }) => ((active) ? null : 'complete')}></mdw-ripple>\n ${state}\n ${rippleContainer}\n `);\n shape.setAttribute('active', '{active}');\n shape.removeAttribute('color');\n },\n })\n .css`\n /* https://m3.material.io/components/navigation-bar/specs */\n /* https://m3.material.io/components/navigation-drawer/specs */\n /* https://m3.material.io/components/navigation-rail/specs */\n\n :host {\n --mdw-badge__scale: 0;\n --mdw-shape__size: var(--mdw-shape__full);\n --mdw-nav-item__offset-y: 0;\n position: relative;\n\n display: grid;\n align-content: center;\n align-items: flex-start;\n grid-auto-flow: row;\n grid-auto-rows: minmax(20px, min-content);\n grid-template-rows: [icon] minmax(32px, 1fr);\n grid-template-columns: [icon] minmax(56px, 1fr);\n\n justify-items: center;\n row-gap: 4px;\n\n box-sizing: border-box;\n\n padding-inline: 0;\n\n cursor: pointer;\n /* stylelint-disable-next-line plugin/no-unsupported-browser-features */\n user-select: none;\n\n font: var(--mdw-typescale__label-large__font);\n letter-spacing: var(--mdw-typescale__label-large__letter-spacing);\n\n text-align: center;\n }\n\n :host(:not([color])) {\n --mdw-ink: var(--mdw-color__on-secondary-container);\n --mdw-bg: var(--mdw-color__secondary-container);\n }\n\n :host([color]) {\n background-color: transparent;\n color: rgb(var(--mdw-color__on-surface-variant));\n }\n\n #slot {\n display: contents;\n align-items: center;\n flex-direction: column;\n grid-area: label;\n justify-content: center;\n\n grid-column: 1 /4;\n\n grid-row: 2;\n\n flex: 1;\n\n cursor: inherit;\n outline: none;\n\n transform: translateY(var(--mdw-nav-item__offset-y));\n\n color: rgb(var(--mdw-color__on-surface-variant));\n\n transition: opacity, color, transform 200ms;\n will-change: opacity, transform;\n }\n\n #anchor {\n position: absolute;\n inset: 0;\n\n outline: none;\n\n z-index: 5;\n }\n\n #shape {\n position: absolute;\n /* stylelint-disable-next-line liberty/use-logical-spec */\n top: 50%;\n /* stylelint-disable-next-line liberty/use-logical-spec */\n right: auto;\n /* stylelint-disable-next-line liberty/use-logical-spec */\n bottom: auto;\n /* stylelint-disable-next-line liberty/use-logical-spec */\n left: 50%;\n\n block-size: 100%;\n inline-size: 100%;\n max-inline-size: 56px;\n\n grid-column: icon;\n grid-row: 1 / 1;\n\n transform: translateX(-50%) translateY(-50%) translateY(var(--mdw-nav-item__offset-y));\n z-index: 0;\n\n background-color: transparent;\n\n transition: transform 200ms;\n will-change: transform;\n }\n\n #icon {\n position: relative;\n align-self: center;\n\n grid-area: icon;\n\n transform: translateY(var(--mdw-nav-item__offset-y));\n z-index: 3;\n\n color: rgb(var(--mdw-color__on-surface-variant));\n\n font-size: 24px;\n font-variation-settings: 'FILL' 0;\n\n transition: transform 200ms;\n will-change: transform;\n }\n\n #state {\n z-index: 2;\n }\n\n #badge {\n --mdw-badge__scale: 0;\n position: absolute;\n /* stylelint-disable-next-line liberty/use-logical-spec */\n top: 50%;\n /* stylelint-disable-next-line liberty/use-logical-spec */\n left: 50%;\n\n overflow: hidden;\n\n max-inline-size: 50%;\n grid-column: 1 / 4;\n\n grid-row: 1 / 2;\n\n transform: translateY(-100%) translateY(var(--mdw-nav-item__offset-y)) scale(var(--mdw-badge__scale));\n z-index: 4;\n\n text-align: start;\n text-overflow: ellipsis;\n text-transform: none;\n white-space: nowrap;\n word-break: normal;\n\n transition: transform 200ms;\n will-change: transform;\n }\n\n #badge[badge] {\n --mdw-badge__scale: 1;\n }\n\n #ripple {\n opacity: 1;\n\n color: rgb(var(--mdw-bg));\n }\n\n #ripple-container {\n z-index:1;\n }\n\n #shape[active] {\n color: rgb(var(--mdw-ink));\n }\n\n #icon[active] {\n color: rgb(var(--mdw-ink));\n\n font-variation-settings: 'FILL' 1;\n }\n\n #slot[active] {\n color: inherit;\n }\n\n :host([show-label]) {\n --mdw-nav-item__offset-y: 12px;\n }\n\n :host([show-label=\"active\"][active]) {\n --mdw-nav-item__offset-y: 0;\n }\n `\n .childEvents({\n anchor: {\n click() {\n /* Prevent Default (false) if no href */\n return this.href != null;\n },\n keydown({ key, repeat }) {\n if (key !== ' ') return true;\n if (!repeat) this.click();\n return false;\n },\n },\n })\n .autoRegister('mdw-nav-item')\n .tsClassFix() {\n addRipple(...args) {\n if (!this.active) return null;\n return super.addRipple(...args);\n }\n}\n", "import NavItem from './NavItem.js';\nimport Surface from './Surface.js';\n\nexport default Surface\n .extend()\n .css`\n /* https://m3.material.io/components/navigation-bar/specs */\n /* https://m3.material.io/components/navigation-drawer/specs */\n /* https://m3.material.io/components/navigation-rail/specs */\n\n :host {\n --mdw-ink: var(--mdw-color__on-surface);\n --mdw-bg: var(--mdw-color__surface);\n\n z-index:2;\n\n color: rgb(var(--mdw-ink));\n\n font: var(--mdw-typescale__label-medium__font);\n letter-spacing: var(--mdw-typescale__label-medium__letter-spacing);\n }\n `\n .set({\n elevated: true,\n color: 'surface',\n })\n .events({\n '~click'(event) {\n // Abort if not child\n if (event.target === this) return;\n if (event.target instanceof NavItem === false) return;\n for (const el of this.querySelectorAll('*')) {\n if (el instanceof NavItem === false) continue;\n el.active = (el === event.target);\n }\n },\n })\n .autoRegister('mdw-nav');\n", "import SemiStickyMixin from '../mixins/SemiStickyMixin.js';\n\nimport Nav from './Nav.js';\n\nexport default Nav\n .extend()\n .mixin(SemiStickyMixin)\n .observe({\n _semiStickyAnchor: { empty: 'bottom' },\n })\n .css`\n /* https://m3.material.io/components/navigation-bar/specs */\n\n :host {\n --mdw-bg: var(--mdw-color__surface-container);\n \n position: sticky;\n inset-block-end: 0;\n order:1; /* Nav Bars are at top of tab order, but bottom of page */\n\n display: grid;\n align-content: flex-start;\n align-items: flex-start;\n gap: 8px;\n\n grid-area: nav-bar;\n grid-auto-columns: minmax(48px, 1fr);\n grid-auto-flow: column;\n\n overflow: hidden; /* Don't expand viewport when contents translates */\n\n box-sizing: border-box;\n min-block-size: 80px;\n inline-size: 100%;\n\n flex-shrink: 0;\n\n transform: translateY(0);\n\n box-shadow: none;\n\n text-align: center;\n\n will-change: transform;\n }\n\n #slot {\n pointer-events: auto;\n }\n\n `\n .autoRegister('mdw-nav-bar');\n", "import NavItem from './NavItem.js';\n\nexport default NavItem\n .extend()\n .css`\n /* https://m3.material.io/components/navigation-bar/specs */\n /* https://m3.material.io/components/navigation-drawer/specs */\n /* https://m3.material.io/components/navigation-rail/specs */\n\n :host {\n grid-auto-rows: minmax(20px, min-content);\n grid-template-rows: [icon] minmax(32px, 1fr);\n grid-template-columns: auto [icon] minmax(56px, 1fr) auto;\n\n padding-block: 12px; /* Spec 16px bottom is based on 1em not 1lh */\n }\n\n #slot {\n display: block;\n }\n\n :host(:empty) {\n font-size: 0;\n line-height: 0;\n }\n\n #slot[show-label] {\n grid-column: 1 /4;\n\n grid-row: 2;\n\n opacity: 0;\n }\n\n #shape {\n grid-column: 2;\n grid-row: 1 / 1;\n }\n\n #slot[show-label=\"never\"] {\n block-size: 0;\n }\n\n #slot[show-label=\"active\"][active] {\n opacity: 1;\n }\n\n `\n .autoRegister('mdw-nav-bar-item');\n", "import Nav from './Nav.js';\n\nexport default Nav\n .extend()\n .observe({\n align: { value: /** @type {'start'|'center'|'end'} */ (null) },\n })\n .on({\n composed({ html }) {\n const { slot } = this.refs;\n slot.before(html`<slot id=start name=start></slot>`);\n slot.setAttribute('align', '{align}');\n },\n })\n .css`\n /* https://m3.material.io/components/navigation-rail/specs */\n\n :host{\n position: relative;\n \n inset-block-start: 0;\n inset-inline-start: 0;\n align-self: flex-start;\n\n display: grid;\n align-content: flex-start;\n flex-direction: column;\n gap:0;\n grid-template-rows: auto minmax(0,1fr);\n grid-template-columns: 100%;\n justify-items: stretch;\n\n min-block-size: 100vh;\n max-block-size: 100vh;\n min-inline-size: 80px;\n max-inline-size: 80px;\n\n text-align: center;\n }\n\n #start {\n display: flex;\n align-items: center;\n flex-direction: column;\n gap: 12px;\n }\n\n #slot {\n align-self: center;\n\n display: flex;\n align-items: stretch;\n flex-direction: column;\n gap: 12px;\n overflow-x: clip;\n overflow-y: auto;\n\n box-sizing: border-box;\n max-block-size: 100%;\n inline-size: min-content;\n\n }\n\n #slot[align=\"start\"] {\n align-self: flex-start;\n }\n\n #slot[align=\"end\"] {\n align-self: flex-end;\n }\n\n `\n .autoRegister('mdw-nav-rail');\n", "import NavRail from './NavRail.js';\n\nexport default NavRail\n .extend()\n .observe({\n shapeEnd: {\n type: 'boolean',\n empty: true,\n },\n })\n .css`\n /* https://m3.material.io/components/navigation-drawer/specs */\n :host {\n --mdw-shape__size: var(--mdw-shape__large, 16px);\n --mdw-shape__size__top-start-size: 0px;\n\n --mdw-nav-item__badge__position: static;\n --mdw-nav-item__badge__transform: none;\n --mdw-nav-item__badge__grid-area: badge;\n --mdw-nav-item__label__padding-block: 18px;\n --mdw-nav-item__label__padding-inline: 52px 0;\n --mdw-nav-item__anchor__display: block;\n --mdw-nav-item__indicator__grid-area: auto;\n --mdw-bg: var(--mdw-color__surface-container-low);\n\n display: grid;\n grid-template-columns: 1fr;\n\n min-block-size: 100vh;\n max-block-size: 100vh;\n inline-size: 360px;\n max-inline-size: calc(100vw - 56px);\n padding-inline: 0;\n\n box-shadow: none;\n }\n\n #slot {\n gap: 0;\n\n inline-size: auto;\n padding-inline: 12px;\n }\n\n `\n .autoRegister('mdw-nav-drawer');\n", "import NavItem from './NavItem.js';\n\nexport default NavItem\n .extend()\n .css`\n /* https://m3.material.io/components/navigation-bar/specs */\n /* https://m3.material.io/components/navigation-drawer/specs */\n /* https://m3.material.io/components/navigation-rail/specs */\n\n :host {\n align-self: stretch;\n\n display: flex;\n align-items: center;\n gap: 12px;\n grid-template:\n \"icon label badge\" minmax(56px, min-content)\n / 24px 1fr minmax(0, min-content);\n justify-items: flex-start;\n\n min-block-size: 56px; \n\n padding-inline: 16px 24px;\n }\n\n #icon {\n grid-area: icon;\n }\n\n #slot {\n display: block;\n\n text-align: start;\n }\n\n :host([active]) {\n color: rgb(var(--mdw-ink));\n }\n\n #shape {\n max-inline-size: none;\n grid-column: auto;\n grid-row: 1 / 2;\n }\n\n #badge-text {\n z-index: 1;\n }\n `\n .on({\n composed({ html }) {\n this.refs.badge.replaceWith(html`<span id=\"badge-text\">{badge}</span>`);\n },\n })\n .autoRegister('mdw-nav-drawer-item');\n", "/* https://m3.material.io/components/navigation-rail/specs */\n\nimport NavItem from './NavItem.js';\n\nexport default NavItem\n .extend()\n .css`\n :host {\n grid-auto-flow: row;\n grid-auto-rows: minmax(20px, auto);\n grid-template-rows: [icon] minmax(32px, 1fr);\n grid-template-columns: [icon] minmax(56px, 1fr);\n\n min-block-size: 56px;\n flex: none;\n padding-inline: 12px;\n }\n\n #slot {\n display: contents;\n overflow-wrap: anywhere;\n\n word-break: break-all;\n word-break: break-word;\n }\n\n #badge {\n max-inline-size:40px;\n grid-column: 1 / 2;\n }\n `\n .autoRegister('mdw-nav-rail-item');\n", "/* https://m3.material.io/components/progress-indicators/specs */\n\nimport CustomElement from '../core/CustomElement.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\n// https://html.spec.whatwg.org/multipage/form-elements.html#the-progress-element\n\nexport default CustomElement\n .extend()\n .mixin(ThemableMixin)\n .observe({\n circle: 'boolean',\n value: 'float',\n max: 'float',\n autoHide: 'boolean',\n _determinateStyle: 'string',\n })\n .observe({\n _valueAsFraction: {\n type: 'float',\n get({ value, max }) {\n return (value / (max || 100));\n },\n changedCallback(oldValue, newValue) {\n this._determinateStyle = `\n --previous:${oldValue ?? newValue ?? 0};\n --value:${newValue ?? 0};\n `;\n },\n },\n })\n .define({\n position() {\n return /** @type {HTMLProgressElement} */ (this.refs.progress).position;\n },\n labels() {\n return /** @type {HTMLProgressElement} */ (this.refs.progress).labels;\n },\n })\n .html`\n <div id=determinate style=\"{_determinateStyle}\">\n <progress id=progress value={value} max={max} circle={circle}></progress>\n <div mdw-if={circle} id=circle>\n <div id=semi1 class=semi></div>\n <div id=semi2 class=semi></div>\n </div>\n </div>\n <div mdw-if={!value} id=indeterminate>\n <div mdw-if={!circle} id=indeterminate-line>\n <div id=line1 class=line value={value}></div>\n <div id=line2 class=line value={value}></div>\n </div>\n <div mdw-if={circle} id=indeterminate-circle>\n <div id=arc2 class=arc></div>\n <div id=arc3 class=arc></div>\n <div id=arc4 class=arc></div>\n </div>\n </div>\n `\n .css`\n /* Base Styles */\n\n :host {\n --mdw-bg: var(--mdw-color__surface-container-highest);\n --mdw-ink: var(--mdw-color__primary);\n --mdw-progress__opacity__duration: 500ms;\n position: relative;\n\n display: inline-block;\n overflow: hidden;\n vertical-align: middle;\n\n min-block-size: 4px;\n inline-size: 100%;\n\n opacity: 1;\n\n background-color: rgb(var(--mdw-bg));\n color: rgb(var(--mdw-ink));\n\n transition: opacity 500ms 275ms;\n }\n\n :host([auto-hide]) {\n will-change: opacity;\n }\n\n :host([auto-hide][value=\"100\"]) {\n opacity:0;\n\n transition: opacity 1s 1s;\n }\n\n #determinate {\n --previous: 0;\n --value: 0;\n }\n\n #progress {\n position: absolute;\n inset: 0;\n\n box-sizing: border-box;\n block-size: 100%;\n inline-size: 100%;\n border: none; /* FireFox */\n\n -moz-appearance: none;\n appearance: none;\n\n opacity:0;\n transform: scaleX(var(--value, 0));\n transform-origin: 0 0;\n\n background-color: currentColor;\n color: inherit;\n\n transition: transform 275ms, opacity var(--mdw-progress__opacity__duration);\n will-change: transform, opacity;\n }\n\n #progress::-webkit-progress-bar {\n display: none;\n }\n\n #progress::-moz-progress-bar {\n display: none; /* Doesn't always work */\n\n block-size: 0;\n }\n\n #progress[value] {\n opacity:1;\n transform: scaleX(var(--value, 0));\n }\n `\n .css`\n /* Line Styles */\n\n /* https://github.com/material-components/material-components-android/blob/ed77ab36ccac98df24e55060d58406c5981a9062/lib/java/com/google/android/material/progressindicator/ */\n\n :host {\n --mdw-progress__line1-head__timing: cubic-bezier(0.2, 0.8, 0, 1.0);\n --mdw-progress__line1-tail__timing: cubic-bezier(0.4, 0.0, 1.0, 1.0);\n --mdw-progress__line2-head__timing: cubic-bezier(0.0, 0.65, 0, 1.0);\n --mdw-progress__line2-tail__timing: cubic-bezier(0.1, 0.45, 0, 1.0);\n --mdw-progress__line__duration: 1800ms;\n }\n\n @media (prefers-reduced-motion) {\n :host {\n --mdw-progress__line__duration: 18000ms\n }\n }\n\n .line {\n opacity: 1;\n\n transition: opacity var(--mdw-progress__opacity__duration);\n will-change: opacity;\n }\n\n .line,\n .line::after {\n position: absolute;\n inset: 0;\n\n overflow: hidden;\n\n animation-duration: var(--mdw-progress__line__duration);\n animation-timing-function: linear;\n animation-iteration-count: infinite;\n animation-fill-mode: forwards;\n }\n\n .line::after {\n content: '';\n\n background-color: currentColor;\n\n animation: inherit;\n will-change: transform;\n }\n\n #line1 {\n animation-name: l1h;\n }\n\n #line2 {\n animation-name: l2h;\n }\n\n #line1::after {\n animation-name: l1t;\n }\n\n #line2::after {\n animation-name: l2t;\n }\n\n .line[value] {\n opacity: 0;\n visibility: hidden;\n\n transition: opacity var(--mdw-progress__opacity__duration), visibility 1ms var(--mdw-progress__opacity__duration);\n }\n\n /**\n * L1H = 1267 / +533 = 70.39% - 100%\n * L1T = 1000 / +567 = 55.56% - 87.05%\n * L2H = 0333 / +850 = 18.50% - 65.72%\n * L2T = 0000 / +750 = 0% - 41.67%\n * Total = 1800ms\n *\n * t l1h l1t l2h l2t\n * --------------------------------------\n * 0.0000 0.0000 0.0000 0.0000 0.0000\n * 0.1850 0.0000 0.0000 0.0000 0.5899\n * 0.4167 0.0000 0.0000 0.7374 1.0000\n * 0.5556 0.0000 0.0000 0.9072 1.0000\n * 0.6572 0.0000 0.1544 1.0000 1.0000\n * 0.7039 0.0000 0.2939 1.0000 1.0000\n * 0.8706 0.7918 1.0000 1.0000 1.0000\n * 1.0000 1.0000 1.0000 1.0000 1.0000\n */\n\n @keyframes l1h {\n 0% {\n transform: translateX(0%);\n }\n\n 70.4% {\n transform: translateX(0%);\n\n animation-timing-function: var(--mdw-progress__line1-head__timing);\n }\n\n 100% {\n transform: translateX(100%);\n }\n }\n @keyframes l1t {\n 0% {\n transform: translateX(-100%);\n }\n\n 55.6% {\n transform: translateX(-100%);\n\n animation-timing-function: var(--mdw-progress__line1-tail__timing);\n }\n\n 87.1% {\n transform: translateX(0%);\n }\n\n 100% {\n transform: translateX(0%);\n }\n }\n @keyframes l2h {\n 0% {\n transform: translateX(0%);\n }\n\n 18.5% {\n transform: translateX(0%);\n\n animation-timing-function: var(--mdw-progress__line2-head__timing);\n }\n\n 65.72% {\n transform: translateX(100%);\n }\n\n to {\n transform: translateX(100%);\n }\n }\n @keyframes l2t {\n 0% {\n transform: translateX(-100%);\n\n animation-timing-function: var(--mdw-progress__line2-tail__timing);\n }\n\n 41.67% {\n transform: translateX(0%);\n }\n\n to {\n transform: translateX(0%);\n }\n }\n\n `\n .css`\n /* Circle Styles */\n /* stylelint-disable liberty/use-logical-spec */\n /** https://github.com/material-components/material-components-android/blob/ed77ab36ccac98df24e55060d58406c5981a9062/lib/java/com/google/android/material/progressindicator/CircularIndeterminateAnimatorDelegate.java */\n\n :host {\n --mdw-progress__circle__timing: cubic-bezier(0.4, 0.0, 0.2, 1);\n --mdw-progress__circle__margin: 4px;\n --mdw-progress__circle__duration: 5400ms;\n --mdw-progress__circle__duration__expand: 667ms;\n --mdw-progress__circle__duration__collapse: 667ms;\n --mdw-progress__circle__duration__fade-in: 333ms;\n --mdw-progress__circle__duration__complete-end: 333ms;\n }\n\n @media (prefers-reduced-motion) {\n :host {\n --mdw-progress__circle__duration: 54000ms;\n }\n }\n\n #circle {\n --startA: min(0.5, var(--previous));\n --endA: min(0.5, var(--value));\n --travelA: max(\n calc(var(--startA) - var(--endA)),\n calc(var(--endA) - var(--startA))\n );\n --delayA: max(0, calc(var(--previous) - 0.5));\n --startB: max(0, calc(var(--previous) - 0.5));\n --endB: max(0, calc(var(--value) - 0.5));\n --travelB: max(\n calc(var(--startB) - var(--endB)),\n calc(var(--endB) - var(--startB))\n );\n --delayB: max(0, 0.5 - calc(var(--previous)));\n\n position: absolute;\n inset: 0;\n }\n\n :host([circle]) {\n block-size: 48px;\n inline-size: 48px;\n }\n\n :host([circle]:not([color])) {\n background-color: transparent;\n }\n\n #progress[circle] {\n visibility: hidden;\n }\n\n .semi {\n position: absolute;\n inset: var(--mdw-progress__circle__margin);\n\n overflow: hidden;\n\n box-sizing: border-box;\n }\n\n #semi1 {\n left: 50%;\n }\n\n #semi2 {\n right: 50%;\n }\n\n .semi::after {\n content: \"\";\n\n position: absolute;\n inset: 0;\n\n box-sizing: border-box;\n border: solid currentcolor 4px;\n\n transform: rotate(var(--rotation));\n\n background-color: transparent;\n border-radius: 50%;\n\n transition: transform 400ms;\n transition-timing-function: linear;\n }\n\n #semi1::after {\n --rotation: min(180deg, calc(var(--value) * 360deg));\n left: -100%;\n\n clip-path: inset(0 50% 0 0);\n\n transition-delay: calc(var(--delayA) * var(--mdw-progress__circle__duration__expand));\n transition-duration: calc(var(--travelA) * var(--mdw-progress__circle__duration__expand));\n }\n\n #semi2::after {\n --rotation: max(0deg, calc(var(--value) * 360deg - 180deg));\n right: -100%;\n\n clip-path: inset(0 0 0 50%);\n\n transition-delay: calc(var(--delayB) * var(--mdw-progress__circle__duration__expand));\n transition-duration: calc(var(--travelB) * var(--mdw-progress__circle__duration__expand));\n }\n\n #indeterminate-circle {\n position: absolute;\n inset: 0;\n\n display: block;\n\n animation: rotate-cw calc(var(--mdw-progress__circle__duration) / 4) linear infinite;\n }\n\n .arc {\n position: absolute;\n inset: var(--mdw-progress__circle__margin);\n\n overflow: hidden;\n\n box-sizing: border-box;\n\n animation: rotate-jump var(--mdw-progress__circle__duration) steps(1,end) infinite;\n }\n\n .arc::after {\n content: \"\";\n\n position: absolute;\n inset: 0;\n\n box-sizing: border-box;\n border: solid currentcolor 4px;\n\n background-color: transparent;\n border-radius: 50%;\n\n animation: grow-shrink calc(var(--mdw-progress__circle__duration) / 4) var(--mdw-progress__circle__timing) infinite;\n }\n\n #arc2 {\n bottom: 50%;\n left: 50%;\n\n transform-origin: 0 100%;\n }\n\n #arc3 {\n top: 50%;\n right: 50%;\n\n transform-origin: 100% 0;\n }\n\n #arc4 {\n top: 50%;\n left: 50%;\n\n transform-origin: 0 0;\n }\n\n #arc2:after {\n bottom: -100%;\n left: -100%;\n\n clip-path: polygon(0% 0%, 50% 0%, 50% 50%, 100% 50%, 100% 100%, 0% 100%);\n }\n\n #arc3:after {\n top: -100%;\n right: -100%;\n\n clip-path: inset(0 50% 50% 0);\n }\n\n #arc4:after {\n top: -100%;\n left: -100%;\n\n clip-path: inset(0 50% 0 0);\n }\n\n @keyframes rotate-cw {\n from {\n transform: rotate(0deg);\n }\n\n to {\n transform: rotate(360deg);\n }\n }\n\n @keyframes rotate-jump {\n 0% { transform: scaleX(1) rotate(0deg); }\n\n 12.5% { transform: scaleX(-1) rotate(-270deg); }\n\n 25% { transform: scaleX(1) rotate(270deg); }\n\n 37.5% {transform: scaleX(-1) rotate(-180deg);}\n\n 50% { transform: scaleX(1) rotate(180deg); }\n\n 62.5% { transform: scaleX(-1) rotate(-90deg); }\n\n 75% { transform: scaleX(1) rotate(90deg); }\n\n 87.5% { transform: scaleX(-1) rotate(0deg); }\n\n to { transform: scaleX(1) rotate(0deg); }\n }\n\n @keyframes grow-shrink {\n from {\n transform: rotate(calc(0.01 * 360deg));\n }\n\n 50% {\n transform: rotate(calc(0.73 * 360deg));\n }\n\n to {\n transform: rotate(calc(0.01 * 360deg));\n }\n }\n `\n .autoRegister('mdw-progress');\n", "/* https://m3.material.io/components/radio/specs */\n\nimport './RadioIcon.js';\n\nimport CustomElement from '../core/CustomElement.js';\nimport InputMixin from '../mixins/InputMixin.js';\nimport RippleMixin from '../mixins/RippleMixin.js';\nimport StateMixin from '../mixins/StateMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\nimport TouchTargetMixin from '../mixins/TouchTargetMixin.js';\n\nexport default CustomElement\n .extend()\n .mixin(ThemableMixin)\n .mixin(StateMixin)\n .mixin(RippleMixin)\n .mixin(InputMixin)\n .mixin(TouchTargetMixin)\n .set({\n type: 'radio',\n stateLayer: true,\n })\n .html`\n <div id=radio errored={erroredState} selected={checked}>\n <mdw-radio-icon id=icon errored={erroredState} disabled={disabledState}\n selected={checked} focused={focusedState} hovered={hoveredState}></mdw-radio-icon>\n </div>\n <slot id=slot></slot>\n `\n .rootEvents({\n click(event) {\n const { control } = this.refs;\n if (event.target !== control) {\n // Label-like click\n event.stopPropagation();\n control.click();\n }\n },\n })\n .on({\n composed() {\n const { radio, rippleContainer, state } = this.refs;\n radio.append(state, rippleContainer);\n },\n })\n .css`\n /* stylelint-disable liberty/use-logical-spec */\n\n :host {\n --mdw-ink: var(--mdw-color__primary);\n --mdw-shape__size: var(--mdw-shape__full);\n display: inline-grid;\n align-items: baseline;\n gap: 12px;\n grid-auto-flow: column;\n grid-template-rows: minmax(20px, auto);\n grid-template-columns: 20px;\n justify-content: flex-start;\n\n cursor: pointer;\n\n transition: none 100ms cubic-bezier(0.4, 0.0, 1, 1);\n }\n\n :host(:disabled) {\n cursor: not-allowed;\n\n opacity: 0.38;\n }\n\n :host([internals-disabled]) {\n cursor: not-allowed;\n\n opacity: 0.38;\n }\n\n :host(:empty) {\n vertical-align: -11.5%;\n\n line-height: 20px;\n }\n\n #control {\n grid-column: 1/1;\n\n cursor: inherit;\n }\n\n #state {\n pointer-events: auto;\n }\n\n #state,\n #ripple-container {\n top: 50%;\n left: 50%;\n\n block-size: 40px;\n inline-size: 40px;\n\n transform: translateX(-50%) translateY(-50%);\n\n border-radius: 50%;\n }\n\n #radio {\n position: relative;\n\n display: inline-flex;\n\n grid-column: 1 / 1;\n\n pointer-events: none;\n\n transform: translateY(11.5%);\n\n color: rgb(var(--mdw-color__on-surface));\n }\n\n #radio[selected] {\n color: rgb(var(--mdw-ink));\n }\n\n #radio[disabled] {\n color: rgb(var(--mdw-color__on-surface));\n }\n\n #radio[errored] {\n color: rgb(var(--mdw-color__error));\n }\n\n :host(:empty) #radio {\n transform: none;\n }\n\n #icon {\n --mdw-ink: inherit;\n --disabled-opacity: 1;\n }\n `\n .autoRegister('mdw-radio');\n", "import CustomElement from '../core/CustomElement.js';\nimport { ELEMENT_STYLER_TYPE } from '../core/customTypes.js';\nimport AriaToolbarMixin from '../mixins/AriaToolbarMixin.js';\nimport SemiStickyMixin from '../mixins/SemiStickyMixin.js';\nimport ShapeMixin from '../mixins/ShapeMixin.js';\nimport SurfaceMixin from '../mixins/SurfaceMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\nexport default CustomElement\n .extend()\n .mixin(ThemableMixin)\n .mixin(SurfaceMixin)\n .mixin(ShapeMixin)\n .mixin(AriaToolbarMixin)\n .mixin(SemiStickyMixin)\n .set({\n elevated: true,\n })\n .observe({\n _raised: 'boolean',\n _headlineOpacity: { type: 'float', default: 0 },\n headline: 'string',\n size: { value: /** @type {'small'|'medium'|'large'|null} */ (null) },\n /** Convert native to observable */\n ariaLabel: 'string',\n color: { empty: 'surface' },\n })\n .overrides({\n _getSemiStickyElement() { return this.refs.surface; },\n })\n .observe({\n _headlineStyle: {\n ...ELEMENT_STYLER_TYPE,\n get({ size, _headlineOpacity }) {\n if (size !== 'medium' && size !== 'large') return null;\n return {\n target: 'headline',\n styles: {\n opacity: _headlineOpacity ?? 0,\n },\n timing: {\n duration: 200,\n },\n };\n },\n },\n })\n .html`\n <slot id=leading name=leading on-slotchange={refreshTabIndexes}></slot>\n <div id=headline ink={ink} color={color} type-style={typeStyle} on-slotchange={refreshTabIndexes}>\n {headline}\n <slot id=headline-slot></slot>\n </div>\n <slot id=trailing name=trailing on-slotchange={refreshTabIndexes}></slot>\n <div mdw-if=${({ size }) => size === 'medium' || size === 'large'} id=companion aria-hidden=true size={size} color={color} raised={_raised}>\n <slot id=companion-slot name=companion size={size}>{headline}</span>\n </div>\n `\n .on({\n composed({ inline }) {\n const { surface, shape, leading, headline, trailing } = this.refs;\n shape.append(leading, headline, trailing);\n surface.append(shape);\n surface.setAttribute('size', '{size}');\n surface.setAttribute('role', 'toolbar');\n surface.setAttribute('aria-label', '{ariaLabel}');\n surface.setAttribute(\n 'aria-labelledby',\n inline(({ ariaLabel }) => (ariaLabel ? null : 'headline')),\n );\n surface.setAttribute('raised', '{_raised}');\n shape.setAttribute('raised', '{_raised}');\n },\n _scrollListenerPositionYChanged(oldValue, newValue) {\n this._raised = (newValue > this._semiStickyOffsetY);\n if (this.size === 'medium' || this.size === 'large') {\n const max = this.refs.companion.scrollHeight;\n const min = (0.5 * max);\n this._headlineOpacity = Math.max(0, Math.min(1, (newValue - min) / (max - min)));\n }\n },\n _scrollListenerLastIdleChanged() {\n if (this._headlineOpacity > 0) {\n // Fill in opacity on idle\n this._headlineOpacity = 1;\n }\n },\n _semiStickyTranslateYChanged(oldValue, newValue) {\n if (newValue === 0) {\n this._headlineOpacity = 1;\n }\n },\n })\n .define({\n ariaActiveDescendantElement: {\n get() {\n // @ts-ignore Accessibility Object Model\n return this.refs.surface.ariaActiveDescendantElement;\n },\n set(value) {\n // @ts-ignore Accessibility Object Model\n this.refs.surface.ariaActiveDescendantElement = value;\n },\n },\n })\n .css`\n /* https://m3.material.io/components/bottom-app-bar/specs */\n\n :host {\n --mdw-bg: var(--mdw-color__surface);\n --mdw-ink: var(--mdw-color__on-surface);\n display: contents;\n\n z-index:2;\n }\n\n #surface {\n position: sticky;\n inset-block-end: auto;\n\n grid-area: app-bar;\n\n margin: inherit; /** Pass through */\n\n padding: inherit; /** Pass through */\n\n filter: none; /* Never receive shadow */\n\n transform: translateY(0);\n\n z-index: 5;\n\n background-color: rgb(var(--mdw-bg));\n\n transition: grid-template-columns 100ms, background-color 100ms;\n\n will-change: transform;\n }\n\n #shape{\n position: initial;\n inset: initial;\n\n display: grid;\n\n align-items: center;\n gap: 12px;\n grid-auto-flow: row;\n grid-template-rows: minmax(64px,min-content);\n grid-template-columns: minmax(auto,1fr) minmax(0,auto) minmax(auto,1fr);\n overflow-x: clip; /* Clip oversized touch targets to avoid scroll-bars */\n overflow-y: visible;\n\n box-sizing: border-box;\n max-inline-size: calc(var(--mdw-content__max-width, 100%) + (2 * var(--mdw-content__padding, 16px) - 4px));\n margin-inline: auto;\n\n /* 16px from icon */\n /* inset = (button.width / 2) - (icon.width / 2) */\n /* paddingInline = 16px - inset */\n /* paddingInlineStart = 16px - ((48px / 2) - (24px / 2)) */\n /* paddingInlineEnd = 16px - ((48px / 2) - (30px / 2)) */\n\n padding-inline: calc(var(--mdw-content__padding, 16px) - 8px);\n\n pointer-events: auto;\n\n z-index: initial;\n\n background-color: transparent;\n\n color: rgb(var(--mdw-ink));\n }\n\n #leading {\n justify-self: flex-start;\n\n display: flex;\n align-items: center;\n\n grid-column: 1;\n grid-row: 1;\n }\n\n #headline {\n display: inline-block;\n\n overflow: clip hidden;\n\n max-inline-size: 100%;\n\n grid-column: 2;\n grid-row: 1;\n\n font: var(--mdw-typescale__title-large__font);\n letter-spacing: var(--mdw-typescale__title-large__letter-spacing);\n\n text-overflow: ellipsis;\n text-transform: none;\n white-space: nowrap;\n word-break: break-word;\n\n transition-duration: 200ms;\n transition-property: transform, opacity, color, background-color;\n }\n\n #trailing {\n justify-self: flex-end;\n\n display: flex;\n align-items: center;\n gap: 8px;\n justify-content: flex-end;\n\n grid-column: 3;\n grid-row: 1;\n\n color: var(--mdw-color__on-surface-variant);\n }\n\n /* Medium */\n #companion {\n position: relative;\n\n display: flex;\n align-items: flex-end;\n\n /**\n * Total Height = 112px\n * Bar = 12 + 40 + 12 (64)\n * Companion = 112px - 64\n * Companion Bottom = 20px\n * Companion = 28px\n * Shift up = 1lh - 28px\n */\n /* stylelint-disable-next-line declaration-property-value-disallowed-list */\n margin-block-start: calc(28px - var(--mdw-typescale__headline-small__line-height));\n padding-block-end: 20px;\n padding-inline: 16px;\n\n background-color: rgb(var(--mdw-bg));\n\n box-shadow: none;\n\n font: var(--mdw-typescale__headline-small__font);\n letter-spacing: var(--mdw-typescale__headline-small__letter-spacing);\n white-space: nowrap;\n }\n\n #companion[size=\"large\"] {\n /**\n * Total Height = 152px\n * Bar = 12 + 40 + 12 (64)\n * Companion = 152px - 64\n * Companion Bottom = 20px\n * Companion = 68px\n * Shift up = 2lh - 68px\n */\n\n min-block-size: calc(2 * var(--mdw-typescale__headline-medium__line-height));\n /* stylelint-disable-next-line declaration-property-value-disallowed-list */\n margin-block-start: calc(68px - (2 * var(--mdw-typescale__headline-medium__line-height)));\n\n font: var(--mdw-typescale__headline-medium__font);\n letter-spacing: var(--mdw-typescale__headline-medium__letter-spacing);\n white-space: normal;\n }\n\n @supports(width: 1lh) {\n #companion {\n /* stylelint-disable-next-line declaration-property-value-disallowed-list */\n margin-block-start: calc(28px - 1lh);\n }\n\n #companion[size=\"large\"] {\n min-block-size: 2lh;\n /* stylelint-disable-next-line declaration-property-value-disallowed-list */\n margin-block-start: calc(68px - 2lh);\n }\n }\n\n #companion-slot {\n display: block;\n overflow-x: clip;\n overflow-y: hidden;\n\n text-overflow: ellipsis;\n text-transform: none;\n word-break: break-word;\n }\n\n #companion-slot[size=\"large\"] {\n max-block-size: calc(2 * var(--mdw-typescale__headline-medium__line-height));\n }\n\n @supports(-webkit-line-clamp: 2) {\n #companion-slot[size=\"large\"] {\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 2;\n\n max-block-size: none;\n }\n }\n\n #surface[size=\"small\"] {\n gap: 4px;\n grid-template-columns: auto 1fr auto;\n }\n\n #headline:is([size=\"medium\"],[size=\"large\"]) {\n opacity: 0;\n\n will-change: opacity;\n }\n\n #surface:where([color=\"none\"], [color=\"transparent\"]),\n #companion:where([color=\"none\"], [color=\"transparent\"]) {\n background-color: transparent;\n }\n\n #surface[raised]:where([color=\"surface\"],[color=\"none\"],[color=\"transparent\"]),\n #companion[raised]:where([color=\"surface\"],[color=\"none\"],[color=\"transparent\"]) {\n background-color: rgb(var(--mdw-color__surface-container));\n }\n\n `\n .autoRegister('mdw-top-app-bar');\n", "import TopAppBar from './TopAppBar.js';\n\n/* @implements {HTMLSelectElement} */\nexport default TopAppBar\n .extend()\n .undefine('headline')\n // .undefine('_headlineOpacity')\n .undefine('size')\n .undefine('_headlineStyle')\n .observe({\n placeholder: { type: 'string', empty: 'Search' },\n color: { empty: 'surface-container-high' },\n shapeStyle: { empty: 'full' },\n kbdNav: { empty: 'false' },\n })\n .define({\n /** @return {HTMLInputElement} */\n input() { return this.refs.input; },\n value: {\n get() { return this.refs.input.value; },\n set(value) {\n this.refs.input.value = value;\n },\n },\n })\n .html`\n <mdw-input id=input placeholder={placeholder} aria-label={placeholder}></mdw-input>\n `\n .css`\n :host {\n --mdw-bg: var(--mdw-color__surface-container-high);\n padding-block: 16px;\n }\n\n #surface {\n background-color: transparent;\n }\n\n #leading:not([slotted]),\n #trailing:not([slotted]) {\n display: none;\n }\n\n #shape {\n display: flex;\n align-items: center;\n gap: 16px;\n\n padding-inline: 16px;\n\n background-color: rgb(var(--mdw-bg));\n }\n\n #input {\n --mdw-state__hovered-opacity: 0;\n flex: 1;\n }\n `\n .methods({\n /** @param {{currentTarget:HTMLSlotElement}} event */\n onSlotChange({ currentTarget }) {\n currentTarget.toggleAttribute('slotted', currentTarget.assignedNodes().length >= 0);\n },\n })\n .childEvents({\n leading: { slotchange: 'onSlotChange' },\n trailing: { slotchange: 'onSlotChange' },\n input: {\n change(event) {\n // Change events are not composed. Rethrow.\n event.stopPropagation();\n this.dispatchEvent(new Event('change', { bubbles: true }));\n },\n },\n })\n .on({\n composed() {\n const { companion, headline, input, surface } = this.refs;\n companion.remove();\n headline.replaceWith(input);\n surface.removeAttribute('aria-labelledby');\n },\n })\n\n .autoRegister('mdw-search');\n", "import './Icon.js';\n\nimport Button from './Button.js';\n\nexport default Button\n .extend()\n .observe({\n type: { empty: 'radio' },\n innerSegmentedButton: 'boolean',\n })\n .set({\n focusableOnDisabled: true,\n })\n .on({\n composed({ html, inline }) {\n const { shape, icon, outline, control, slot, state } = this.refs;\n\n slot.before(html`\n <div id=icons>\n ${icon}\n <mdw-icon selected={checked} id=check-icon aria-hidden=true>check</mdw-icon>\n </div>\n `);\n shape.setAttribute('selected', '{checked}');\n\n icon.removeAttribute('mdw-if');\n icon.setAttribute('has-icon', '{hasIcon}');\n icon.setAttribute('selected', '{checked}');\n outline.setAttribute('inner-segmented-button', '{innerSegmentedButton}');\n outline.setAttribute('shape-start', '{shapeStart}');\n outline.setAttribute('shape-end', '{shapeEnd}');\n control.setAttribute('role', 'option');\n control.setAttribute('aria-checked', inline(\n ({ type, checked }) => (type === 'checkbox' ? `${(!!checked)}` : null),\n ));\n control.setAttribute('aria-selected', inline(\n ({ type, checked }) => (type === 'checkbox' ? null : `${!!checked}`),\n ));\n\n state.setAttribute('state-disabled', 'focus');\n },\n constructed() {\n this.outlined = true;\n },\n })\n .css`\n /* https://m3.material.io/components/segmented-buttons/specs */\n\n :host {\n --mdw-shape__size: var(--mdw-shape__full);\n --mdw-ink: var(--mdw-color__on-surface);\n gap: 8px;\n\n min-inline-size: 24px;\n padding-inline-start: max(12px, calc(16px + (var(--mdw-density) * 2px)));\n padding-inline-end: max(20px, calc(24px + (var(--mdw-density) * 2px)));\n\n color: rgb(var(--mdw-ink));\n }\n\n :host([inner-segmented-button]) {\n --mdw-shape__size: 0px;\n }\n\n #outline {\n inset-inline-end: -1px;\n }\n\n #outline[shape-end] {\n inset-inline-end: 0;\n }\n\n #shape[selected] {\n background-color: rgb(var(--mdw-bg));\n }\n\n #icons {\n position: relative;\n\n display: inline-flex;\n }\n\n #icon {\n box-sizing: border-box;\n inline-size: 0;\n\n opacity: 1;\n }\n\n #icon[has-icon] {\n inline-size: 18px;\n\n opacity: 1;\n }\n\n #icon[selected] {\n inline-size: 18px;\n\n opacity: 0;\n }\n\n #check-icon {\n position: absolute;\n inset: 0;\n\n display: block;\n\n overflow: visible;\n\n margin: 0;\n\n opacity: 0;\n\n font-size: 18px;\n font-variation-settings: 'FILL' 1;\n }\n\n #check-icon[selected] {\n opacity: 1;\n\n font-size: 18px;\n }\n\n #icon[disabled] {\n color: rgba(var(--mdw-color__on-surface), 0.38);\n }\n\n #shape[disabled][selected] {\n background-color: rgba(var(--mdw-color__on-surface), 0.12);\n }\n `\n .autoRegister('mdw-segmented-button');\n", "import AriaReflectorMixin from '../mixins/AriaReflectorMixin.js';\nimport KeyboardNav from '../mixins/KeyboardNavMixin.js';\n\nimport Box from './Box.js';\nimport SegmentedButton from './SegmentedButton.js';\n\n/** @typedef {'compact'} DeprecatedHTMLMenuElementProperties */\n\nexport default Box\n .extend()\n .mixin(KeyboardNav)\n .mixin(AriaReflectorMixin)\n .define({\n kbdNavQuery() {\n return SegmentedButton.elementName;\n },\n })\n .set({\n _ariaRole: 'listbox',\n })\n .childEvents({\n slot: {\n slotchange() {\n this.refreshTabIndexes();\n const list = /** @type {NodeListOf<InstanceType<SegmentedButton>>} */ (this.kbdNavChildren);\n for (const [index, child] of list.entries()) {\n child.shapeStart = index === 0;\n child.innerSegmentedButton = index > 0 && index < list.length - 1;\n child.shapeEnd = index === list.length - 1;\n }\n },\n },\n })\n .css`\n /* https://m3.material.io/components/segmented-buttons/specs */\n\n :host {\n --mdw-bg: var(--mdw-color__secondary-container);\n --mdw-ink: var(--mdw-color__on-secondary-container);\n\n display: inline-flex;\n overflow-x: auto;\n overflow-y: hidden;\n }\n\n :host([color]) {\n background-color: transparent;\n }\n\n #slot {\n display: grid;\n grid-auto-flow: column;\n\n flex: none;\n }\n\n `\n .on({\n constructed() {\n this.setAttribute('aria-orientation', 'horizontal');\n },\n })\n .autoRegister('mdw-segmented-button-group');\n", "import CustomElement from '../core/CustomElement.js';\nimport ControlMixin from '../mixins/ControlMixin.js';\nimport StateMixin from '../mixins/StateMixin.js';\nimport TextFieldMixin from '../mixins/TextFieldMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\n/* @implements {HTMLSelectElement} */\nexport default CustomElement\n .extend()\n .mixin(ThemableMixin)\n .mixin(StateMixin)\n .mixin(ControlMixin)\n .mixin(TextFieldMixin)\n .observe({\n trailingIcon: { empty: 'arrow_drop_down' },\n })\n .overrides({\n controlTagName: 'select',\n controlVoidElement: false,\n type: 'select-one',\n })\n .define({\n _select() {\n return /** @type {HTMLSelectElement} */ (this.refs.control);\n },\n /** Readonly values */\n multiple: { value: false },\n size: { value: 1 },\n })\n .html`<slot id=slot></slot>`\n .childEvents({\n slot: {\n /** @param {Event & {currentTarget:HTMLSlotElement}} event */\n slotchange(event) {\n const select = this._select;\n select.replaceChildren(\n ...event.currentTarget.assignedNodes()\n .map((child) => child.cloneNode(true)),\n );\n this._value = select.value;\n },\n },\n })\n .on({\n composed({ template }) {\n const { slot, prefix, suffix, control } = this.refs;\n control.setAttribute('icon', '{icon}');\n template.append(slot);\n prefix.remove();\n suffix.remove();\n },\n _formResetChanged(oldValue, newValue) {\n if (!newValue) return;\n this._select.value = this.querySelector('option[selected]')?.value ?? '';\n },\n })\n .css`\n #slot {\n display: none;\n }\n \n #shape {\n padding: 0;\n \n cursor: pointer;\n }\n \n #shape[disabled] {\n cursor: not-allowed;\n }\n \n #icon {\n position: absolute;\n \n /* padding-inline-start: 12px; */\n }\n \n #trailing-icon {\n position: absolute;\n inset-inline-end: 16px;\n }\n \n #control {\n padding-inline-start: 16px;\n padding-inline-end: calc(16px + 24px + 16px);\n accent-color: rgb(var(--mdw-ink));\n \n cursor: inherit;\n }\n \n #control[icon] {\n margin-inline-start: calc(16px + 24px);\n padding-inline-start: 0;\n }\n \n option {\n accent-color: rgb(var(--mdw-ink));\n \n min-block-size: var(--mdw-typescale__label-large__line-height);\n \n appearance: none;\n \n background-color: rgb(var(--mdw-color__surface)) !important;\n border-radius: 0;\n color: rgb(var(--mdw-color__on-surface)) !important;\n \n font: var(--mdw-typescale__label-large__font);\n letter-spacing: var(--mdw-typescale__label-large__letter-spacing);\n }\n `\n .autoRegister('mdw-select');\n", "import ShapeMixin from '../mixins/ShapeMixin.js';\n\nimport Box from './Box.js';\n\nexport default Box\n .extend()\n .mixin(ShapeMixin)\n .on({\n composed() {\n const { shape, outline } = this.refs;\n shape.before(outline);\n shape.remove();\n },\n })\n .css`\n :host {\n position: relative;\n\n overflow: hidden;\n\n z-index: auto;\n\n background-color: var(--mdw-shape__bg, transparent);\n\n border-start-start-radius: calc(var(--mdw-shape__rounded) * var(--mdw-shape__size__top-start-size));\n border-start-end-radius: calc(var(--mdw-shape__rounded) * var(--mdw-shape__size__top-end-size));\n border-end-start-radius: calc(var(--mdw-shape__rounded) * var(--mdw-shape__size__bottom-start-size));\n border-end-end-radius: calc(var(--mdw-shape__rounded) * var(--mdw-shape__size__bottom-end-size));\n\n transition-delay: 1ms;\n transition-duration: 200ms;\n transition-property: background-color, color;\n will-change: background-color, color;\n\n }\n\n :host([color]) {\n background-color: rgb(var(--mdw-bg));\n }\n\n :host(:where([ink],[color])) {\n color: rgb(var(--mdw-ink));\n }\n\n :host([outlined]) {\n background-color: transparent;\n }\n\n :host(:is([color=\"none\"], [color=\"transparent\"])) {\n background-color: transparent;\n }\n\n @supports(-webkit-mask-box-image: none) {\n :host {\n -webkit-mask-box-image: var(--mdw-shape__mask-border-source)\n 8 fill /\n var(--mdw-shape__size)\n stretch;\n\n -webkit-mask: var(--mdw-shape__mask);\n\n transition-duration: 200ms, 200ms, 200ms;\n transition-property: background-color, color, -webkit-mask-box-image-width;\n will-change: background-color, color, -webkit-mask-box-image;\n }\n }\n `\n .autoRegister('mdw-shape');\n", "import CustomElement from '../core/CustomElement.js';\nimport { isRtl } from '../core/dom.js';\nimport InputMixin from '../mixins/InputMixin.js';\nimport StateMixin from '../mixins/StateMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\n/**\n * @param {string} value\n * @param {number} onNaN\n * @return {number}\n */\nfunction parseFloat(value, onNaN = 0) {\n const number = Number.parseFloat(value);\n if (Number.isNaN(number)) return onNaN;\n return number;\n}\n\n/**\n * @param {string} value\n * @param {string} min\n * @param {string} max\n * @return {?number}\n */\nfunction valueAsFraction(value, min, max) {\n const nValue = parseFloat(value);\n const nMin = parseFloat(min);\n const nMax = parseFloat(max, 100);\n\n return (nValue - nMin) / (nMax - nMin);\n}\n\nexport default CustomElement\n .extend()\n .mixin(ThemableMixin)\n .mixin(StateMixin)\n .mixin(InputMixin)\n .set({\n stateLayer: true,\n type: 'range',\n })\n .observe({\n ticks: 'string',\n showLabel: { type: 'boolean', reflect: false },\n _previewValue: { nullable: false },\n _roundedValue: 'float',\n _isHoveringThumb: 'boolean',\n _lastDispatchedChangeValue: 'string',\n })\n .methods({\n /**\n * @param {(MouseEvent|TouchEvent) & {currentTarget:HTMLInputElement}} event\n * @return {void}\n */\n onControlMouseOrTouch(event) {\n const input = event.currentTarget;\n if (input.disabled) return;\n\n if (this.disabledState) return;\n\n if (event.type === 'touchend') {\n this._isHoveringThumb = false;\n return;\n }\n\n let offsetX;\n let clientX;\n let pageX;\n let isActive;\n\n const isTouch = 'touches' in event;\n if (isTouch) {\n if (event.touches.length) {\n const [touch] = event.touches;\n isActive = true;\n // @ts-ignore Might exist\n ({ offsetX, clientX, pageX } = touch);\n }\n } else {\n // Ignore mouse drag-over\n // Firefox doesn't report `:active`\n // eslint-disable-next-line no-bitwise\n isActive = (event.buttons & 1) === 1\n && (event.type === 'mousedown' || input.matches(':active'));\n ({ offsetX, clientX, pageX } = event);\n }\n\n if (offsetX == null) {\n clientX ??= pageX - window.scrollX; // Safari\n offsetX = clientX - input.getBoundingClientRect().left;\n }\n\n const { clientWidth } = input;\n let position = (offsetX / clientWidth);\n if (position > 1) {\n position = 1;\n } else if (position < 0) {\n position = 0;\n }\n\n if (isActive) {\n this._isHoveringThumb = true;\n const { min, max, step } = this;\n\n const nMin = parseFloat(min);\n const nMax = parseFloat(max, 100);\n const nStep = parseFloat(step, 1);\n\n if (isRtl(this)) {\n position = 1 - position;\n }\n const currentValue = position * (nMax - nMin) + nMin;\n let roundedValue = Math.round(currentValue / nStep) * nStep;\n\n if (nStep < 1) {\n // Floating Point Numbers need to be rounded off based on step\n // eg: 3.4 / 10 with step of 0.1 yields 0.33999999999999997\n const log10 = Math.floor(Math.log10(nStep)); // e value in scientific notation\n const scale = 10 ** (-1 * log10); // multiplier to scale up to integer\n roundedValue = Math.round(roundedValue * scale) / scale;\n }\n\n this._roundedValue = roundedValue;\n this._previewValue = roundedValue.toString(10);\n return;\n }\n\n if (isTouch) return;\n\n let fractionalValue = valueAsFraction(this.value, this.min, this.max);\n if (isRtl(this)) {\n fractionalValue = 1 - fractionalValue;\n }\n const thumbOffset = fractionalValue * clientWidth;\n const thumbMin = thumbOffset - 20;\n const thumbMax = thumbOffset + 20;\n this._isHoveringThumb = offsetX >= thumbMin && offsetX <= thumbMax;\n },\n\n /** @param {Event} event */\n onLeaveEvent({ currentTarget }) {\n if (document.activeElement === currentTarget) return;\n this._isHoveringThumb = false;\n },\n\n /**\n * @param {(MouseEvent|TouchEvent) & {currentTarget:HTMLInputElement}} event\n * @return {void}\n */\n onControlFinish(event) {\n const input = event.currentTarget;\n if (input.disabled) return;\n event.preventDefault();\n input.valueAsNumber = this._roundedValue;\n this._value = input.value;\n if (this._lastDispatchedChangeValue !== this._value) {\n this._lastDispatchedChangeValue = this._value;\n input.dispatchEvent(new Event('change', { bubbles: true }));\n }\n },\n })\n .events({\n blur: 'onLeaveEvent',\n mouseout: 'onLeaveEvent',\n })\n .childEvents({\n control: {\n '~mousedown': 'onControlMouseOrTouch',\n '~mousemove': 'onControlMouseOrTouch',\n '~mouseout': 'onControlMouseOrTouch',\n '~touchmove': 'onControlMouseOrTouch',\n '~touchstart': 'onControlMouseOrTouch',\n // @ts-expect-error Old spec\n '~touchleave': 'onControlMouseOrTouch',\n '~touchcancel': 'onControlMouseOrTouch',\n '~touchend': 'onControlMouseOrTouch',\n touchend: 'onControlFinish',\n click: 'onControlFinish',\n },\n })\n .expressions({\n computeTrackStyle({ ticks, _previewValue, min, max }) {\n return [\n ticks ? `--ticks:${ticks}` : null,\n `--value:${valueAsFraction(_previewValue, min, max)}`,\n ].filter(Boolean).join(';') || null;\n },\n _thumbLabelHidden({ _isHoveringThumb, focusedState }) {\n return (!_isHoveringThumb && !focusedState);\n },\n })\n .html`\n <div id=track style={computeTrackStyle} aria-hidden=true disabled={disabledState}>\n <div mdw-if={ticks} id=ticks></div>\n <div id=track-active></div>\n <div id=thumb-anchor>\n <div id=thumb></div>\n <div id=thumb-label\n hidden={_thumbLabelHidden}\n text={_previewValue}></div>\n </div>\n </div>\n `\n .on({\n composed() {\n const { thumb, state, control } = this.refs;\n thumb.append(state);\n control.removeAttribute('aria-labelledby');\n },\n valueChanged(oldValue, newValue) {\n this._previewValue = newValue;\n },\n })\n .css`\n /* https://m3.material.io/components/sliders/specs */\n\n :host {\n --mdw-ink: var(--mdw-color__on-primary);\n --mdw-bg: var(--mdw-color__primary);\n\n display: block;\n vertical-align: middle;\n\n min-block-size: 40px;\n min-inline-size: 88px;\n\n background-color: transparent;\n }\n\n :host,\n :host([color]) {\n background-color: transparent;\n }\n\n #control {\n inset:0;\n\n overflow: visible;\n\n block-size: 100%;\n min-block-size: 0;\n inline-size: 100%;\n min-inline-size: 0;\n\n appearance: none;\n\n cursor: pointer;\n\n transform: none;\n\n background-color: transparent;\n }\n\n #control::-webkit-slider-runnable-track {\n /* stylelint-disable-next-line declaration-property-value-disallowed-list */\n margin-inline: -10px;\n\n appearance: none;\n\n background-color: transparent;\n }\n\n @supports (-moz-appearance:none ){\n #control {\n inset-inline: -10px;\n\n inline-size: calc(100% + 20px);\n }\n }\n\n #control::-moz-range-track {\n inline-size: calc(100% + 20px) !important;\n\n appearance: none;\n }\n\n #control::-webkit-slider-thumb {\n display: block;\n\n block-size: 20px;\n inline-size: 20px;\n\n -webkit-appearance: none;\n cursor: inherit;\n\n transform: scale(2);\n\n background-color: transparent; /* Safari */\n\n border-radius: 50%;\n box-shadow: none; /* Safari */\n }\n\n #control::-moz-range-thumb {\n display: block;\n\n box-sizing: content-box;\n block-size: 20px;\n inline-size: 20px;\n border: none;\n\n appearance: none;\n cursor: inherit;\n\n transform: scale(2);\n\n background-color: transparent;\n border-radius: 50%;\n }\n\n #track {\n --value: 0.5;\n position: absolute;\n inset-block-start: 50%;\n inset-inline: 0;\n\n block-size: 4px;\n margin-block-start: -2px;\n\n pointer-events: none;\n user-select: none;\n\n background-color: rgb(var(--mdw-color__surface-container-highest));\n border-radius: inherit;\n }\n\n #thumb {\n position: absolute;\n inset-block-start: -18px;\n inset-inline-start: -20px;\n\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n\n block-size: 40px;\n inline-size: 40px;\n\n pointer-events: none;\n\n border-radius: 50%;\n\n color: rgb(var(--mdw-bg));\n }\n\n #thumb::before {\n content: '';\n\n display: block;\n\n block-size: 20px;\n inline-size: 20px;\n\n background-color: currentColor;\n border-radius: 50%;\n\n transition: background-color 100ms;\n }\n\n /* Inactive ticks */\n\n #ticks::before,\n #ticks::after {\n content: '';\n\n position: absolute;\n inset: 0;\n\n padding-inline: 10px;\n\n background-clip: content-box;\n /* stylelint-disable-next-line plugin/no-unsupported-browser-features */\n background-image: radial-gradient(circle at center, var(--tick-color) 0, var(--tick-color) 1px, transparent 0);\n background-position: center center;\n background-repeat: repeat-x;\n background-size: 0 100%;\n background-size: calc(100% / var(--ticks, 0)) 2px;\n }\n\n #ticks::before {\n --tick-color: rgb(var(--mdw-color__on-surface-variant));\n }\n\n #ticks::after {\n --tick-color: rgb(var(--mdw-ink));\n /* TODO: Use single-paint implementation */\n padding-inline-end: calc(100% - (100% * var(--value)) + 10px);\n\n z-index: 1;\n\n will-change: padding-inline-end;\n }\n /* Active Indicator */\n #track-active {\n position: absolute;\n inset: 0;\n\n overflow: hidden;\n\n border-radius: 99px;\n }\n\n #track-active::before {\n content: '';\n\n position: absolute;\n inset: 0;\n\n transform: scaleX(var(--value));\n transform-origin: calc(100% * calc(-0.5 * var(--mdw-dir, 1) + 0.5)) 0;\n\n background-color: rgb(var(--mdw-bg));\n\n will-change: transform;\n }\n\n #thumb-anchor {\n position: absolute;\n\n inset-inline-start: calc(var(--value) * 100%);\n\n display: flex;\n align-items: flex-start;\n flex-direction: column;\n\n z-index: 24;\n\n /* stylelint-disable-next-line liberty/use-logical-spec */\n will-change: inset-inline-start, left, right;\n }\n\n #thumb-label {\n position: absolute;\n /* stylelint-disable-next-line liberty/use-logical-spec */\n left: 0;\n inset-block-end: 14px;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n box-sizing: content-box;\n margin-block-end: 6px;\n\n transform: translateX(-50%) scale(1);\n transform-origin: 50% 100%;\n\n font-weight: var(--mdw-typescale__label-medium__font-weight);\n line-height: var(--mdw-typescale__label-medium__line-height);\n font-family: var(--mdw-typescale__label-medium__font-family);\n letter-spacing: var(--mdw-typescale__label-medium__letter-spacing);\n\n transition: transform 200ms;\n will-change: transform;\n }\n\n #thumb-label:is([hidden],[text=\"\"]) {\n transform: translateX(-50%) scale(0);\n }\n\n #thumb-label::before {\n content: attr(text);\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n min-block-size: 28px;\n min-inline-size: 28px;\n\n z-index: 1;\n\n background-color: rgb(var(--mdw-bg));\n border-radius: 50%;\n color: rgb(var(--mdw-ink));\n }\n\n #thumb-label::after {\n /* Values from Figma SVG */\n --x-start: 14.6446%; /*4.1005px*/\n --x-end: 85.3554%;\n --y: 70.7106%; /*24.0416px*/\n\n content: \"\";\n\n position: absolute;\n inset: 0;\n inset-block-end: -6px;\n\n clip-path: polygon(var(--x-start) var(--y), var(--x-end) var(--y), 50% 100%, var(--x-start) var(--y));\n\n background-color: rgb(var(--mdw-bg));\n }\n\n #track[disabled] {\n --mdw-bg: var(--mdw-color__on-surface);\n cursor: not-allowed;\n\n opacity: 0.38;\n\n background-color: rgb(var(--mdw-color__on-surface), calc(0.12 / 0.38));\n }\n `\n .autoRegister('mdw-slider');\n", "// https://w3c.github.io/aria/#status\n\nimport { EVENT_HANDLER_TYPE } from '../core/customTypes.js';\nimport AriaReflectorMixin from '../mixins/AriaReflectorMixin.js';\nimport DensityMixin from '../mixins/DensityMixin.js';\n\nimport './Button.js';\nimport './IconButton.js';\n\nimport Surface from './Surface.js';\n\nexport default Surface\n .extend()\n .mixin(DensityMixin)\n .mixin(AriaReflectorMixin)\n .set({\n _ariaRole: 'status',\n elevated: true,\n })\n .observe({\n open: 'boolean',\n persistent: 'boolean',\n action: 'string',\n actionInk: { empty: 'inverse-primary' },\n actionTypeStyle: { empty: 'label-large' },\n closeButton: 'boolean',\n closeIcon: { empty: 'close' },\n closeInk: { empty: 'inherit' },\n onaction: EVENT_HANDLER_TYPE,\n })\n .methods({\n async close() {\n if (!this.dispatchEvent(new Event('close', { cancelable: true }))) return;\n if (!this.open) return;\n this.open = false;\n if (window.getComputedStyle(this).transitionDuration === '0s') return;\n await new Promise((resolve) => {\n this.addEventListener('transitionend', resolve, { once: true });\n });\n },\n show() {\n this.open = true;\n },\n /** @param {string} text */\n update(text) {\n this.textContent = text;\n },\n })\n .html`\n <div id=content></div>\n <mdw-button mdw-if={action} id=action class=button ink={actionInk} type-style={actionTypeStyle}>{action}</mdw-button>\n <mdw-icon-button mdw-if={closeButton} id=close class=button icon={closeIcon} ink={closeInk}>Close</mdw-button>\n `\n .on({\n composed() {\n const { content, slot } = this.refs;\n content.append(slot);\n },\n })\n .childEvents({\n action: {\n '~click'() {\n if (!this.dispatchEvent(new Event('action', { cancelable: true }))) return;\n this.close();\n },\n },\n close: {\n '~click'() {\n this.close();\n },\n },\n })\n .css`\n /* https://m3.material.io/components/snackbar/specs */\n\n :host {\n --mdw-shape__size: var(--mdw-shape__small);\n --mdw-surface__shadow: var(--mdw-surface__shadow__3);\n --mdw-shape__bg: rgb(var(--mdw-color__inverse-surface));\n --mdw-ink: var(--mdw-color__inverse-on-surface);\n\n --mdw-type__line-height: var(--mdw-typescale__body-medium__line-height);\n display: flex;\n align-items: center;\n\n padding-inline: 16px;\n\n opacity: 0;\n transform: translateY(25%) scaleY(0.25);\n transform-origin: bottom center;\n visibility: hidden; /* Remove from tab order */\n z-index: 24;\n\n font: var(--mdw-typescale__body-medium__font);\n letter-spacing: var(--mdw-typescale__body-medium__letter-spacing);\n\n transition: transform 200ms, opacity 200ms, visibility 200ms;\n }\n\n :host([action]) {\n gap: 8px;\n\n padding-inline-end: 8px;\n }\n\n :host([close-button]) {\n gap: 4px;\n\n padding-inline-end: 4px;\n }\n\n :host([open]) {\n opacity: 1;\n transform: scale(1);\n visibility: visible;\n }\n\n #content {\n display: flex;\n align-items: center;\n\n flex: 1;\n padding-block: max(2px, calc(14px + (var(--mdw-density) * 2px)));\n }\n\n #slot {\n display: block;\n overflow-x: hidden;\n overflow-y: hidden;\n\n max-block-size: calc(var(--mdw-type__line-height) * 2);\n\n text-align: start;\n text-overflow: ellipsis;\n text-transform: none;\n white-space: normal;\n word-break: break-word;\n }\n\n @supports(width: 1lh) {\n #slot {\n max-block-size: 2lh;\n }\n }\n\n @supports(-webkit-line-clamp:1) {\n #slot {\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 2;\n }\n }\n `\n .autoRegister('mdw-snackbar');\n", "import './Icon.js';\nimport './Shape.js';\nimport CustomElement from '../core/CustomElement.js';\nimport ShapeMixin from '../mixins/ShapeMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\nexport default CustomElement\n .extend()\n .mixin(ThemableMixin)\n .mixin(ShapeMixin)\n .observe({\n selected: 'boolean',\n icon: 'string',\n errored: 'boolean',\n disabled: 'boolean',\n selectedIcon: 'string',\n unselectedIcon: 'string',\n src: 'string',\n selectedSrc: 'string',\n unselectedSrc: 'string',\n hovered: 'boolean',\n pressed: 'boolean',\n focused: 'boolean',\n dragValue: 'float',\n color: { empty: 'primary' },\n })\n .observe({\n /** Alias for Selected (QoL) */\n checked: {\n type: 'boolean',\n get({ selected }) { return selected; },\n /** @param {boolean} value */\n set(value) { this.selected = value; },\n },\n _active({ disabled, pressed, focused, hovered }) {\n return !disabled && (pressed || focused || hovered);\n },\n })\n .observe({\n _thumbColor({ color, _active }) {\n return _active ? `${color}-container` : '';\n },\n _iconInk({ disabled, selected, color }) {\n if (!selected) return 'surface-container-highest';\n if (disabled) return 'on-surface';\n return `on-${color}-container`;\n },\n })\n .expressions({\n hasIcon({ icon, src, unselectedIcon, unselectedSrc }) {\n return Boolean(icon || src || unselectedIcon || unselectedSrc);\n },\n })\n .html`\n <div id=thumb selected={checked} pressed={pressed} disabled={disabled}>\n <mdw-shape id=thumb-shape shape-style=full selected={checked} pressed={pressed} hovered={hovered} focused={focused} icon={hasIcon}\n color={_thumbColor} active={_active} ink={_thumbInk} disabled={disabled}></mdw-shape>\n <mdw-icon ink={_iconInk} class=icon id=icon src={src} selected={checked}>{icon}</mdw-icon>\n <mdw-icon ink={_iconInk} class=icon id=selected-icon src={selectedIconSrc} selected={checked}>{selectedIcon}</mdw-icon>\n <mdw-icon ink={_iconInk} class=icon id=unselected-icon src={unselectedIconSrc} selected={checked}>{unselectedIcon}</mdw-icon>\n <slot id=slot selected={checked}></slot>\n </div>\n `\n .on({\n composed() {\n const { outline, shape: track } = this.refs;\n track.id = 'track';\n track.setAttribute('selected', '{checked}');\n track.setAttribute('disabled', '{disabled}');\n outline.removeAttribute('mdw-if');\n outline.setAttribute('selected', '{checked}');\n outline.setAttribute('errored', '{errored}');\n outline.setAttribute('disabled', '{disabled}');\n },\n dragValueChanged(oldValue, newValue) {\n if (newValue == null) {\n this.refs.thumb.style.removeProperty('--mdw-switch__value');\n this.refs.thumb.style.removeProperty('transition-duration');\n } else {\n this.refs.thumb.style.setProperty('--mdw-switch__value', `${newValue}`);\n this.refs.thumb.style.setProperty('transition-duration', '0s');\n }\n },\n })\n .css`\n /* https://m3.material.io/components/switch/specs */\n\n :host {\n --mdw-ink: var(--mdw-color__on-primary);\n --mdw-bg: var(--mdw-color__primary);\n --mdw-shape__size: var(--mdw-shape__full);\n --mdw-switch__value: 0;\n\n position: relative;\n\n display: inline-block;\n vertical-align: middle;\n\n box-sizing: border-box;\n block-size: 32px;\n inline-size: 52px;\n container-type: inline-size;\n container-name: switch-icon;\n }\n\n :host([selected]) {\n --mdw-switch__value: 1;\n }\n\n :host([disabled]) {\n opacity: 0.38;\n }\n\n #track{\n position: absolute;\n inset: 0;\n\n background-color: rgb(var(--mdw-color__surface-container-highest));\n }\n\n #track[selected] {\n background-color: rgb(var(--mdw-bg));\n }\n\n #track[disabled] {\n opacity: calc(0.12/0.38);\n }\n\n #track[disabled][selected] {\n background-color: rgb(var(--mdw-color__on-surface));\n }\n\n #outline {\n filter:\n drop-shadow(1px 0px 0px currentColor)\n drop-shadow(0px 1px 0px currentColor)\n drop-shadow(-1px 0px 0px currentColor)\n drop-shadow(0px -1px 0px currentColor);\n\n color: rgb(var(--mdw-color__outline));\n }\n\n #outline:is([pressed],[focused]) {\n color: rgb(var(--mdw-color__outline));\n }\n\n #outline[disabled] {\n color: rgb(var(--mdw-color__on-surface));\n }\n\n #outline[selected] {\n color: transparent;\n }\n\n /** Thumb (state) **/\n\n #thumb {\n --thumb-color: var(--mdw-ink);\n position: absolute;\n inset-block: 0;\n inset-inline-start: 0;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n transform: translateX(calc(var(--mdw-dir, 1) * var(--mdw-switch__value) * (52px - 100%)));\n\n aspect-ratio: 1/1;\n }\n\n :dir(rtl) #thumb {\n --mdw-dir: -1;\n }\n\n @supports(width: 1cqw) {\n #thumb {\n transform: translateX(calc(var(--mdw-dir, 1) * var(--mdw-switch__value) * (100cqw - 100%)));\n }\n }\n\n #slot {\n color: rgb(var(--mdw-color__on-surface));\n }\n\n #slot[selected] {\n color: rgb(var(--mdw-bg));\n }\n\n /** Thumb Shape **/\n\n #thumb-shape {\n --mdw-shape__size: inherit;\n\n position: absolute;\n\n inset: 2px;\n\n transform: scale(calc(16/28));\n z-index: 0;\n }\n\n #thumb-shape[icon] {\n transform: scale(calc(24/28));\n }\n\n #thumb-shape:not([selected]) {\n --mdw-bg: var(--mdw-color__outline);\n --mdw-ink: var(--mdw-color__surface-container-highest);\n }\n\n #thumb-shape[selected] {\n transform: scale(calc(24/28));\n }\n\n #thumb-shape[selected]:not([active]) {\n --mdw-bg: var(--thumb-color);\n }\n\n #thumb-shape[pressed]:not([disabled]) {\n transform: scale(1);\n }\n\n /** Thumb Icons **/\n\n .icon {\n position: absolute;\n /* stylelint-disable-next-line liberty/use-logical-spec */\n top: 50%;\n /* stylelint-disable-next-line liberty/use-logical-spec */\n left: 50%;\n\n opacity: 0;\n transform: translateX(-50%) translateY(-50%);\n\n font-size: 16px;\n\n /* border-radius: 50%; */\n }\n\n .icon:not([src]):empty {\n display: none;\n }\n\n #icon, #unselected-icon {\n opacity: 1;\n\n font-variation-settings: 'FILL' 0;\n }\n\n #unselected-icon[selected] {\n opacity: 0;\n }\n\n #selected-icon[selected] {\n opacity: 1;\n }\n\n #icon[selected] {\n font-variation-settings: 'FILL' 1;\n }\n\n #thumb[disabled] {\n color: rgb(var(--mdw-color__on-surface));\n }\n `\n .css`\n /* https://m3.material.io/components/switch/specs */\n\n :host {\n /*FastOutLinearInInterpolator*/\n --mdw-switch__transition-timing__collapse: cubic-bezier(0.4, 0.0, 1, 1);\n --mdw-switch__transition-duration__collapse: 375ms;\n /*LinearOutSlowInInterpolator*/\n --mdw-switch__transition-timing__expand: cubic-bezier(0.0, 0.0, 0.2, 1);\n --mdw-switch__transition-duration__expand: 500ms;\n --scale-delay: var(--mdw-switch__transition-duration);\n\n --mdw-switch__transition-duration: var(--mdw-switch__transition-duration__collapse);\n --mdw-switch__transition-timing: var(--mdw-switch__transition-timing__collapse);\n --mdw-switch__transition-delay__color: calc(var(--mdw-switch__transition-duration) / 2);\n --mdw-switch__transition-delay__translate: calc(var(--mdw-switch__transition-duration) / 2);\n --mdw-switch__transition-delay__scale: calc(var(--mdw-switch__transition-duration) / 2);\n\n transition-delay: var(--mdw-switch__transition-delay__color);\n transition-duration: calc(var(--mdw-switch__transition-duration) / 2);\n /* 2 legged animation */\n transition-timing-function: var(--mdw-switch__transition-timing);\n }\n\n #track {\n transition-delay: var(--mdw-switch__transition-delay__color);\n transition-duration: inherit;\n transition-property: background-color;\n transition-timing-function: inherit;\n }\n\n #outline {\n transition-delay: var(--mdw-switch__transition-delay__color);\n transition-duration: inherit;\n transition-property: background-color, color;\n transition-timing-function: inherit;\n }\n\n #thumb {\n transition-delay: var(--mdw-switch__transition-delay__translate);\n transition-duration: inherit;\n transition-property: transform;\n transition-timing-function: inherit;\n }\n\n #thumb-shape, .icon {\n /* (selected => unselected): stall color+scale */\n transition-delay: var(--mdw-switch__transition-delay__scale), var(--mdw-switch__transition-delay__color), var(--mdw-switch__transition-delay__color);\n transition-duration: inherit;\n transition-property: transform, background-color, color;\n transition-timing-function: inherit;\n }\n\n :host([icon]) {\n --mdw-switch__transition-delay__translate: 0s;\n }\n\n .icon {\n transition-property: transform, opacity, color;\n }\n\n /* unselected => selected */\n :host([selected]) {\n --mdw-switch__transition-delay__color: 0s;\n --mdw-switch__transition-delay__scale: 0s;\n /* --mdw-switch__transition-delay__translate: 0s; */\n --mdw-switch__transition-duration: var(--mdw-switch__transition-duration__expand);\n --mdw-switch__transition-timing: var(--mdw-switch__transition-timing__expand);\n }\n\n /* active => selected */\n :host([selected][pressed]) {\n /* --mdw-switch__transition-delay__color: 0s; */\n /* --mdw-switch__transition-delay__scale: 0s; */\n --mdw-switch__transition-delay__translate: 0s;\n }\n\n /* selected => unselected */\n :host(:not([selected])) {\n /* --mdw-switch__transition-delay__color: 0s; */\n /* --mdw-switch__transition-delay__scale: 0s; */\n --mdw-switch__transition-delay__translate: 0s;\n }\n\n /* unselected => active */\n :host([pressed]:not([selected])) {\n /* --mdw-switch__transition-delay__color: 0s; */\n --mdw-switch__transition-delay__scale: 0s;\n /* --mdw-switch__transition-delay__translate: 0s; */\n }\n `\n .autoRegister('mdw-switch-icon');\n", "import './SwitchIcon.js';\nimport CustomElement from '../core/CustomElement.js';\nimport InputMixin from '../mixins/InputMixin.js';\nimport StateMixin from '../mixins/StateMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\nimport TouchTargetMixin from '../mixins/TouchTargetMixin.js';\n\nexport default CustomElement\n .extend()\n .mixin(ThemableMixin)\n .mixin(InputMixin) // Label as root\n .mixin(StateMixin)\n .mixin(TouchTargetMixin)\n // Switches have their own pressed animation (No ripple)\n .set({\n type: 'checkbox',\n stateLayer: true,\n })\n .observe({\n icon: 'string',\n selectedIcon: 'string',\n unselectedIcon: 'string',\n src: 'string',\n selectedSrc: 'string',\n unselectedSrc: 'string',\n })\n .html`\n <mdw-switch-icon id=switch\n color={color} ink={ink} selected={checked} hovered={hoveredState}\n focused={focusedState} pressed={pressedState} disabled={disabledState}\n icon={icon}\n selected-icon={selectedIcon}\n unselected-icon={unselectedIcon}\n src={src}\n selected-src={selectedSrc}\n unselected-src={unselectedSrc}\n >\n </mdw-switch-icon>\n <slot id=slot></slot>\n `\n .rootEvents({\n click(event) {\n const { control } = this.refs;\n if (event.target !== control) {\n // Label-like click\n event.stopPropagation();\n control.click();\n }\n },\n })\n .on({\n composed() {\n const { switch: switchEl, state, control } = this.refs;\n switchEl.append(state, control);\n control.setAttribute('role', 'switch');\n },\n })\n .methods({\n /**\n * @param {(MouseEvent|TouchEvent) & {currentTarget:HTMLInputElement}} event\n * @return {void}\n */\n onControlMouseOrTouch(event) {\n const input = event.currentTarget;\n if (input.disabled) return;\n\n if (this.disabledState) return;\n\n if (event.type === 'touchend') {\n // this._isHoveringThumb = false;\n return;\n }\n\n let offsetX;\n let clientX;\n let pageX;\n let isActive;\n\n const isTouch = 'touches' in event;\n if (isTouch) {\n if (event.touches.length) {\n const [touch] = event.touches;\n isActive = true;\n // @ts-ignore Might exist\n ({ offsetX, clientX, pageX } = touch);\n }\n } else {\n // Ignore mouse drag-over\n // Firefox doesn't report `:active`\n // eslint-disable-next-line no-bitwise\n isActive = (event.buttons & 1) === 1\n && (event.type === 'mousedown' || input.matches(':active'));\n ({ offsetX, clientX, pageX } = event);\n }\n\n if (!isActive) return;\n\n if (offsetX == null) {\n clientX ??= pageX - window.scrollX; // Safari\n offsetX = clientX - input.getBoundingClientRect().left;\n }\n\n const { clientWidth } = input;\n let position = (offsetX / clientWidth);\n if (position > 1) {\n position = 1;\n } else if (position < 0) {\n position = 0;\n }\n\n // this._isHoveringThumb = true;\n\n let currentValue = this.refs.switch.dragValue;\n if (currentValue == null) {\n currentValue = this.checked ? 1 : 0;\n }\n const pixels = offsetX - (clientWidth / 2);\n const currentPixels = this.refs.switch.clientWidth - (this.refs.switch.clientHeight);\n // console.log(pixels, currentPixels, currentPixels * currentValue, pixels / currentPixels);\n const newRatio = pixels / currentPixels;\n const newValue = Math.max(Math.min(currentValue + newRatio, 1), 0);\n // this.refs.switch.dragValue = newValue;\n // event.preventDefault();\n },\n })\n .childEvents({\n control: {\n '~pointermove': 'onControlMouseOrTouch',\n },\n })\n .css`\n /* https://m3.material.io/components/switch/specs */\n\n :host {\n --mdw-ink: var(--mdw-color__on-primary);\n --mdw-bg: var(--mdw-color__primary);\n position: relative;\n\n display: inline-flex;\n align-items: center;\n\n gap: 12px;\n vertical-align: middle;\n\n cursor: pointer;\n }\n\n #control {\n cursor: inherit;\n }\n\n #touch-target {\n z-index: 0;\n }\n\n #label {\n display: contents;\n\n cursor: pointer;\n\n /* border-radius: 50%; */\n }\n\n /** Switch **/\n\n #switch {\n --mdw-bg: inherit;\n --mdw-ink: inherit;\n flex:1;\n\n pointer-events: none;\n }\n\n /** State **/\n\n #state {\n position: absolute;\n /* stylelint-disable-next-line liberty/use-logical-spec */\n top: 50%;\n /* stylelint-disable-next-line liberty/use-logical-spec */\n left: 50%;\n\n block-size: 100%;\n min-block-size: 40px;\n inline-size: 100%;\n min-inline-size: 40px;\n\n pointer-events: none;\n\n transform: translateX(-50%) translateY(-50%);\n\n border-radius: 50%;\n }\n\n #state[touched] {\n /* Pressed state already has an animation */\n /* stylelint-disable-next-line rule-selector-property-disallowed-list */\n --mdw-state__pressed-opacity: 0;\n }\n\n /** Disabled **/\n\n :host(:disabled) {\n --mdw-ink: var(--mdw-color__on-surface); /* selected icon */\n --mdw-bg: var(--mdw-color__surface);\n cursor: not-allowed;\n\n opacity: 0.38;\n }\n\n :host([internals-disabled]) {\n --mdw-ink: var(--mdw-color__on-surface); /* selected icon */\n --mdw-bg: var(--mdw-color__surface);\n cursor: not-allowed;\n\n opacity: 0.38;\n }\n\n #switch[disabled] {\n opacity: 1;\n }\n `\n .autoRegister('mdw-switch');\n", "// https://w3c.github.io/aria/#tab\n\nimport './Icon.js';\n\nimport CustomElement from '../core/CustomElement.js';\nimport RippleMixin from '../mixins/RippleMixin.js';\nimport ScrollListenerMixin from '../mixins/ScrollListenerMixin.js';\nimport ShapeMixin from '../mixins/ShapeMixin.js';\nimport StateMixin from '../mixins/StateMixin.js';\n\nexport default CustomElement\n .extend()\n .mixin(ShapeMixin)\n .mixin(StateMixin)\n .mixin(RippleMixin)\n .mixin(ScrollListenerMixin)\n .define({\n stateTargetElement() { return this.refs.anchor; },\n /**\n * Used to compute primary indicator size.\n * Default to 24.\n */\n labelMetrics() {\n const { slot, icon } = this.refs;\n const target = slot.clientWidth ? slot : icon;\n return {\n width: target.clientWidth,\n left: target.offsetLeft,\n };\n },\n })\n .set({\n delegatesFocus: true,\n stateLayer: true,\n })\n .observe({\n active: 'boolean',\n icon: 'string',\n src: 'string',\n href: 'string',\n ariaLabel: 'string',\n })\n .methods({\n /** @type {HTMLElement['focus']} */\n focus(options) {\n this.refs.anchor.focus(options);\n },\n })\n .html`\n <a id=anchor role=tab\n aria-label={ariaLabel}\n aria-controls=${({ href }) => (href?.startsWith('#') ? href.slice(1) : null)}\n aria-selected=${({ active }) => (active ? 'true' : 'false')}\n aria-disabled=${({ disabledState }) => `${disabledState}`}\n disabled={disabledState}\n href=${({ href }) => href ?? '#'}>\n <mdw-icon mdw-if=${(data) => data.icon || data.src} id=icon aria-hidden=true src={src} active={active}>{icon}</mdw-icon>\n <slot id=slot></slot>\n </a>\n `\n .on({\n composed() {\n const { shape, rippleContainer, state } = this.refs;\n shape.append(state, rippleContainer);\n state.setAttribute('state-disabled', 'focus');\n },\n })\n .events({\n keydown(event) {\n if (event.key === ' ') {\n event.preventDefault(); // Avoid vertical scroll\n this.refs.anchor.click();\n }\n },\n })\n .childEvents({\n anchor: {\n click(event) {\n if (this.disabledState) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n const { href } = this;\n if (!href) {\n event.preventDefault();\n return;\n }\n if (href.startsWith('#')) {\n const root = /** @type {HTMLElement} */ this.getRootNode();\n const el = root.querySelector(href);\n if (!el) {\n console.warn('Unknown element', href);\n return;\n }\n event.preventDefault();\n el.scrollIntoView({ block: 'nearest', inline: 'start' });\n }\n },\n },\n })\n .css`\n /* https://m3.material.io/components/tabs/specs */\n\n :host {\n display: inline-flex;\n\n min-inline-size: 64px;\n\n cursor: pointer;\n }\n\n #anchor {\n display: flex;\n align-items: center;\n flex-direction: column;\n justify-content: center;\n\n box-sizing: border-box;\n block-size: 100%;\n inline-size: 100%;\n flex: 1;\n\n padding-block: 6px;\n padding-inline: 12px;\n\n cursor: pointer;\n outline: none;\n\n color: inherit;\n\n text-decoration: inherit;\n }\n\n #icon {\n padding-block: 4px;\n\n font-size: 24px;\n font-variation-settings: 'FILL' 0;\n\n }\n\n #shape[disabled],\n #anchor[disabled] {\n cursor: not-allowed;\n\n background-color: rgba(var(--mdw-color__on-surface), 0.12);\n color: rgba(var(--mdw-color__on-surface), 0.38);\n }\n\n :host([active]) {\n color: rgb(var(--mdw-ink));\n }\n\n #icon[active] {\n font-variation-settings: 'FILL' 1;\n }\n\n #slot {\n display: block;\n overflow-x: hidden;\n overflow-y: hidden;\n\n max-block-size: var(--mdw-typescale__title-small__line-height);\n\n max-inline-size: 100%;\n\n cursor: inherit;\n outline: none;\n\n opacity: var(--mdw-nav-item__anchor__opacity, 1);\n transform: translateY(var(--mdw-nav-item__offset-y, 0));\n\n color: inherit;\n\n font: var(--mdw-typescale__title-small__font);\n letter-spacing: var(--mdw-typescale__title-small__letter-spacing);\n text-align: center;\n text-decoration: inherit;\n text-overflow: ellipsis;\n text-transform: none;\n white-space: nowrap;\n word-break: break-word;\n\n transition: opacity, color, transform 200ms;\n will-change: opacity, transform;\n }\n `\n .autoRegister('mdw-tab');\n", "const registeredElements = new Set();\n\n/** @type {MutationObserver} */\nlet rtlObserver;\n\n/**\n * @param {typeof import('../core/CustomElement.js').default} Base\n */\nexport default function RTLObserverMixin(Base) {\n return Base\n .observe({\n pageIsRTL: {\n type: 'boolean',\n value: document.documentElement.dir === 'rtl',\n },\n })\n .on({\n connected() {\n if (!rtlObserver) {\n rtlObserver = new MutationObserver(() => {\n const isRTL = document.documentElement.dir === 'rtl';\n for (const el of registeredElements) {\n el.pageIsRTL = isRTL;\n }\n });\n rtlObserver.observe(document.documentElement, { attributeFilter: ['dir'] });\n }\n registeredElements.add(this);\n },\n disconnected() {\n registeredElements.delete(this);\n },\n });\n}\n", "// https://w3c.github.io/aria/#tablist\n\nimport CustomElement from '../core/CustomElement.js';\nimport KeyboardNavMixin from '../mixins/KeyboardNavMixin.js';\nimport RTLObserverMixin from '../mixins/RTLObserverMixin.js';\nimport ResizeObserverMixin from '../mixins/ResizeObserverMixin.js';\nimport ShapeMixin from '../mixins/ShapeMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\nimport Tab from './Tab.js';\n\nexport default CustomElement\n .extend()\n .mixin(ThemableMixin)\n .mixin(KeyboardNavMixin)\n .mixin(ResizeObserverMixin)\n .mixin(RTLObserverMixin)\n .mixin(ShapeMixin)\n .set({\n /** @type {WeakRef<HTMLElement>} */\n _tabContentRef: null,\n _tabContentScrollListener: null,\n /** @type {HTMLCollectionOf<InstanceType<Tab>>} */\n _tabCollection: null,\n /**\n * @type {{\n * left:number,\n * width:number,\n * right:number,\n * center: number,\n * label: {left:number, width:number},\n * index: number,\n * }[]}\n */\n _tabMetrics: null,\n _isRTL: null,\n })\n .define({\n tabContent: {\n get() {\n return this._tabContentRef?.deref();\n },\n /** @param {HTMLElement} value */\n set(value) {\n const oldValue = this._tabContentRef?.deref();\n if (oldValue) {\n oldValue.removeEventListener('scroll', this._tabContentScrollListener);\n }\n if (value) {\n this._tabContentRef = new WeakRef(value);\n this._tabContentScrollListener = this.observeTabContent.bind(this);\n value.addEventListener('scroll', this._tabContentScrollListener);\n this.observeTabContent();\n } else {\n this._tabContentRef = null;\n }\n },\n },\n })\n .observe({\n tabContentId: {\n /**\n * @param {string} oldValue\n * @param {string} newValue\n */\n changedCallback(oldValue, newValue) {\n // @ts-ignore Skip cast\n this.tabContent = newValue ? document.getElementById(newValue) : null;\n },\n },\n active: 'boolean',\n secondary: 'boolean',\n _indicatorStyle: { value: 'opacity: 0' },\n color: { empty: 'surface-primary' },\n })\n .define({\n tabs() {\n // eslint-disable-next-line no-return-assign\n return this._tabCollection ??= /** @type {HTMLCollectionOf<InstanceType<Tab>>} */ (\n this.getElementsByTagName(Tab.elementName)\n );\n },\n })\n .observe({\n /** Internal observed property */\n _selectedIndex: {\n type: 'integer',\n empty: -1,\n /**\n * @param {number} oldValue\n * @param {number} newValue\n */\n changedCallback(oldValue, newValue) {\n this.active = newValue !== -1;\n },\n },\n })\n .define({\n kbdNavQuery() {\n return Tab.elementName;\n },\n ariaOrientationDefault() {\n return /** @type {'horizontal'|'vertical'} */ ('horizontal');\n },\n /** @return {NodeListOf<InstanceType<Tab>>} */\n childTabItems() {\n return (this.querySelectorAll(Tab.elementName));\n },\n tabMetrics() {\n // eslint-disable-next-line no-return-assign\n return this._tabMetrics ??= [...this.tabs].map((tab, index) => ({\n left: tab.offsetLeft,\n width: tab.offsetWidth,\n right: tab.offsetLeft + tab.offsetWidth,\n center: tab.offsetLeft + (tab.offsetWidth / 2),\n label: tab.labelMetrics,\n index,\n }));\n },\n selectedIndex: {\n get() {\n let index = 0;\n for (const tab of this.tabs) {\n if (tab.active) return index;\n index++;\n }\n return -1;\n },\n set(value) {\n let index = 0;\n for (const el of this.tabs) {\n if (index === value) {\n el.active = true;\n this._selectedIndex = index;\n } else {\n el.active = false;\n }\n index++;\n }\n },\n },\n })\n .define({\n selectedItem: {\n /**\n * @return {InstanceType<Tab>}\n */\n get() {\n for (const tab of this.tabs) {\n if (tab.active) return tab;\n }\n return null;\n },\n /**\n * @param {InstanceType<Tab>} value\n * @return {InstanceType<Tab>}\n */\n set(value) {\n let index = 0;\n for (const tab of this.tabs) {\n if (tab === value) {\n this.selectedIndex = index;\n return value;\n }\n index++;\n }\n return null;\n },\n },\n })\n .methods({\n clearCache() {\n this._tabMetrics = null;\n },\n /** @param {InstanceType<Tab>} [tab] */\n updateIndicatorByTab(tab) {\n tab ??= this.selectedItem ?? this.tabs.item(0);\n\n const width = this.secondary ? tab.clientWidth : tab.labelMetrics.width;\n const position = this.secondary ? tab.offsetLeft : tab.offsetLeft + tab.labelMetrics.left;\n this._indicatorStyle = `--width: ${width}; --offset: ${position}px`;\n },\n updateIndicator(animate = false) {\n this.updateIndicatorByTab();\n if (!animate) {\n this.refs.indicator.style.setProperty('--transition-ratio', '0');\n }\n },\n /** @param {number} percentage */\n updateIndicatorByPosition(percentage) {\n const metrics = this.tabMetrics;\n\n // Tab panels are equal-width whereas tablist may be variable\n\n const clamped = Math.min(Math.max(percentage, 0), 1);\n const decimalIndex = (metrics.length - 1) * clamped;\n const leftIndex = Math.floor(decimalIndex);\n const rightIndex = Math.ceil(decimalIndex);\n\n const leftMetrics = metrics[leftIndex];\n if (!leftMetrics) return;\n\n const rightMetrics = metrics[rightIndex];\n\n let width;\n let activeTab;\n /** Center-based position */\n let center;\n if (leftMetrics === rightMetrics) {\n width = this.secondary ? leftMetrics.width : leftMetrics.label.width;\n activeTab = this.tabs.item(leftIndex);\n center = leftMetrics.center;\n } else {\n const leftRatio = 1 - (decimalIndex - leftIndex);\n const rightRatio = 1 - leftRatio;\n const leftWidth = leftRatio * (this.secondary ? leftMetrics.width : leftMetrics.label.width);\n const rightWidth = rightRatio * (this.secondary ? rightMetrics.width : rightMetrics.label.width);\n const activeIndex = leftRatio > rightRatio ? leftIndex : rightIndex;\n const distance = rightMetrics.center - leftMetrics.center;\n width = leftWidth + rightWidth;\n activeTab = this.tabs.item(activeIndex);\n center = leftMetrics.center + (distance * rightRatio);\n }\n\n if (!activeTab.active) {\n for (const tab of this.tabs) {\n tab.active = tab === activeTab;\n }\n this.active = true;\n }\n\n this._indicatorStyle = `--width: ${width}; --offset: ${center - (width / 2)}px`;\n this.refs.indicator.style.setProperty('--transition-ratio', '0');\n },\n /** @param {number} index */\n updateIndicatorByIndex(index) {\n this.updateIndicatorByTab(this.tabs.item(index ?? this._selectedIndex));\n },\n observeTabContent() {\n const tabContent = this.tabContent;\n if (!tabContent) return;\n let start = tabContent.scrollLeft;\n if (this.pageIsRTL) {\n start *= -1;\n }\n const width = tabContent.clientWidth;\n const max = tabContent.scrollWidth - width;\n const percentage = max === 0 ? 0 : start / max;\n this.updateIndicatorByPosition(percentage);\n },\n onResizeObserved() {\n this.clearCache();\n this.updateIndicator();\n },\n })\n\n .set({\n ariaRole: 'tablist',\n })\n .html`\n <slot id=slot ink={ink} type-style={typeStyle}></slot>\n <div id=indicator aria-hidden=true style={_indicatorStyle} active={active} secondary={secondary}>\n <div id=indicator-start class=indicator-piece></div>\n <div id=indicator-center class=indicator-piece></div>\n <div id=indicator-end class=indicator-piece></div>\n </div>\n `\n .on({\n composed() {\n const { shape, indicator } = this.refs;\n shape.append(indicator);\n },\n pageIsRTLChanged() {\n this.clearCache();\n this.updateIndicator();\n },\n activeChanged(oldValue, newValue) {\n if (newValue) {\n // Update indicator position without transition\n this.updateIndicator();\n }\n },\n secondaryChanged() {\n this.updateIndicator();\n },\n _selectedIndexChanged(oldValue, newValue) {\n this.updateIndicatorByIndex(newValue);\n },\n })\n .events({\n '~click'({ target }) {\n // Abort if not child\n if (target === this) return;\n if (target instanceof Tab) {\n // TODO: Override colors from scroll events\n }\n },\n })\n .childEvents({\n slot: {\n slotchange() {\n this.clearCache();\n this.updateIndicator();\n },\n },\n })\n .css`\n /* https://m3.material.io/components/tabs/specs */\n\n :host {\n --mdw-ink: var(--mdw-color__primary);\n --mdw-shape__bg: rgb(var(--mdw-color__surface));\n position: relative;\n position: sticky;\n inset-block-start: 0;\n inset-inline: 0;\n\n display: grid;\n align-items: stretch;\n grid-auto-columns: minmax(auto, 1fr);\n grid-auto-flow: column;\n justify-content: space-evenly;\n overflow-y: hidden;\n\n box-sizing: border-box;\n min-block-size: 48px;\n inline-size: 100%;\n flex:none;\n\n color: inherit;\n\n text-align: center;\n\n will-change: transform;\n }\n\n #indicator {\n --corner: 3;\n --width: 24;\n --offset: 0;\n --visibility: 0;\n --transition-ratio: 1;\n position: absolute;\n inset-block-end: 0;\n inset-inline: 0;\n\n overflow-y: clip;\n\n block-size: 3px;\n inline-size: 100%;\n\n pointer-events: none;\n\n opacity: 1;\n transform: translateY(calc(100% * (1 - var(--visibility))));\n\n color: inherit;\n\n transition: transform 200ms;\n will-change: transform;\n }\n\n .indicator-piece {\n position: absolute;\n inset-block: 0;\n\n opacity: 1;\n /* opacity: 0.60; */\n transform-origin: 0 0;\n z-index:1;\n\n background-color: currentColor;\n\n transition: transform;\n transition-duration: calc(200ms * var(--transition-ratio));\n will-change: transform;\n }\n\n #indicator-start {\n /* stylelint-disable-next-line liberty/use-logical-spec */\n left: 0;\n\n inline-size: calc(2 * 1px * var(--corner));\n\n transform: translateX(var(--offset));\n\n /* stylelint-disable-next-line liberty/use-logical-spec */\n border-top-left-radius: calc(1px * var(--corner));\n }\n\n #indicator-center {\n /* Chrome has rendering issues upscaling small elements */\n --precision: 100;\n\n position: absolute;\n /* stylelint-disable-next-line liberty/use-logical-spec */\n left: calc(1px * var(--corner));\n\n inline-size: calc(1px * var(--precision));\n\n transform: translateX(var(--offset)) scaleX(calc((var(--width) - (2 * var(--corner))) / var(--precision)));\n\n }\n\n #indicator-end {\n position: absolute;\n /* stylelint-disable-next-line liberty/use-logical-spec */\n left: 0;\n\n inline-size: calc(2 * 1px * var(--corner));\n\n transform:\n translateX(var(--offset))\n translateX(calc(-2px * var(--corner)))\n translateX(calc(var(--width) * 1px));\n\n /* stylelint-disable-next-line liberty/use-logical-spec */\n border-top-right-radius: calc(1px * var(--corner));\n }\n\n #indicator[active] {\n --visibility: 1;\n color: rgb(var(--mdw-ink));\n }\n\n #indicator[secondary] {\n --corner: 0;\n }\n\n :host([scrollable]) {\n grid-auto-columns: max-content;\n justify-content: flex-start;\n overflow-x: auto;\n\n padding-inline: 48px\n }\n `\n .autoRegister('mdw-tab-list');\n", "import AriaReflectorMixin from '../mixins/AriaReflectorMixin.js';\n\nimport Box from './Box.js';\n\nexport default Box\n .extend()\n .mixin(AriaReflectorMixin)\n .set({\n _ariaRole: 'tabpanel',\n })\n .observe({\n active: {\n type: 'boolean',\n changedCallback(oldValue, newValue) {\n this.updateAriaProperty('ariaHidden', newValue ? 'false' : 'true');\n },\n },\n peeking: 'boolean',\n })\n .css`\n :host {\n overflow-y: auto;\n scroll-snap-align: center;\n\n min-block-size: 100%;\n max-block-size: 100%;\n min-inline-size: 100%;\n max-inline-size: 100%;\n\n visibility: hidden;\n\n will-change: visibility; \n }\n\n :host(:is([active],[peeking])) {\n /* Safari bug: Visiblity not changing without !important or layout reflow */\n visibility: visible !important;\n }\n `\n .autoRegister('mdw-tab-panel');\n", "import './TabList.js'; /* TabList must register before TabContent */\nimport CustomElement from '../core/CustomElement.js';\nimport ResizeObserverMixin from '../mixins/ResizeObserverMixin.js';\n\nimport TabPanel from './TabPanel.js';\n\nexport default CustomElement\n .extend()\n .mixin(ResizeObserverMixin)\n .set({\n /** @type {InstanceType<TabPanel>[]} */\n _panelNodes: [],\n /**\n * @type {{\n * left:number,\n * width:number,\n * right:number,\n * center: number,\n * index: number,\n * }[]}\n */\n _panelMetrics: null,\n })\n .observe({\n /** Internal observed property */\n _selectedIndex: {\n type: 'integer',\n empty: -1,\n },\n })\n .define({\n panels() {\n return this._panelNodes;\n },\n panelMetrics() {\n // eslint-disable-next-line no-return-assign\n return this._panelMetrics ??= [...this._panelNodes].map((panel, index) => ({\n left: panel.offsetLeft,\n width: panel.offsetWidth,\n right: panel.offsetLeft + panel.offsetWidth,\n center: panel.offsetLeft + (panel.offsetWidth / 2),\n index,\n }));\n },\n })\n .define({\n selectedIndex: {\n get() {\n let index = 0;\n for (const panel of this.panels) {\n if (panel.active) return index;\n index++;\n }\n return -1;\n },\n set(value) {\n let index = 0;\n for (const el of this.panels) {\n if (index === value) {\n el.active = true;\n this._selectedIndex = index;\n } else {\n el.active = false;\n }\n index++;\n }\n },\n },\n })\n .define({\n selectedPanel: {\n /**\n * @return {InstanceType<TabPanel>}\n */\n get() {\n return this.panels.find((panel) => panel.active);\n },\n /**\n * @param {InstanceType<TabPanel>} value\n * @return {InstanceType<TabPanel>}\n */\n set(value) {\n const index = this.panels.indexOf(value);\n if (index === -1) return null;\n this.selectedIndex = index;\n return value;\n },\n },\n })\n .html`<slot id=slot></slot>`\n .methods({\n onResizeObserved() {\n this._panelMetrics = null;\n this.updatePanels();\n // Resize should not change panel visibility (Chrome Bug?)\n },\n updatePanels() {\n const start = this.scrollLeft;\n const width = this.clientWidth;\n const end = start + width;\n for (const metric of this.panelMetrics) {\n const visibleWidth = (start > metric.right) || (end < metric.left) // Offscreen ?\n ? 0\n : (\n (start >= metric.left) // Scroll at or over panel left point?\n ? metric.right - start // Measure from panel right\n : end - metric.left // Measure from panel left\n );\n const percentage = visibleWidth / width;\n const panel = this.panels[metric.index];\n panel.active = percentage >= 0.5;\n // TODO: Investigate possible subpixel imprecision\n panel.peeking = percentage > 0 && percentage < 0.5;\n }\n },\n })\n .childEvents({\n slot: {\n slotchange(event) {\n const slot = /** @type {HTMLSlotElement} */ (event.currentTarget);\n // @ts-ignore Skip cast\n this._panelNodes = slot.assignedElements()\n .filter((el) => el.tagName === TabPanel.elementName.toUpperCase());\n this.updatePanels();\n },\n },\n })\n .events({\n scroll: 'updatePanels',\n })\n .css`\n :host {\n display: grid;\n grid-auto-columns: 100%;\n grid-auto-flow: column;\n grid-template-columns: 100%;\n overflow-x: auto;\n scroll-behavior: smooth;\n scroll-snap-type: x mandatory;\n scrollbar-width: none;\n\n flex-grow: 1;\n -webkit-scroll-snap-type-x: mandatory;\n scroll-snap-type-x: mandatory;\n -webkit-scroll-snap-points-x: repeat(100%);\n scroll-snap-points-x: repeat(100%);\n overscroll-behavior-x: none;\n\n will-change: transform; /* Avoid repaint on scroll */\n }\n `\n .autoRegister('mdw-tab-content');\n", "import CustomElement, { cloneAttributeCallback } from '../core/CustomElement.js';\nimport ControlMixin from '../mixins/ControlMixin.js';\nimport ResizeObserverMixin from '../mixins/ResizeObserverMixin.js';\nimport StateMixin from '../mixins/StateMixin.js';\nimport TextFieldMixin from '../mixins/TextFieldMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\nconst DOMString = { nullParser: String, value: '' };\n\n/**\n * @see https://html.spec.whatwg.org/multipage/form-elements.html#the-textarea-element\n * -implements {HTMLTextAreaElement}\n */\nexport default CustomElement\n .extend()\n .mixin(ThemableMixin)\n .mixin(StateMixin)\n .mixin(ControlMixin)\n .mixin(TextFieldMixin)\n .mixin(ResizeObserverMixin)\n .set({\n supportsCSSLineHeightUnit: CSS.supports('height', '1lh'),\n type: 'textarea',\n _resizing: false,\n })\n .overrides({\n controlTagName: 'textarea',\n controlVoidElement: false,\n })\n .observe({\n fixed: { type: 'boolean' },\n minRows: { attr: 'minrows', type: 'integer', nullable: false },\n maxRows: { attr: 'maxrows', type: 'integer', nullable: false },\n _lineHeight: 'string',\n cols: { type: 'integer', empty: 0 },\n dirName: { attr: 'dirname', ...DOMString },\n maxLength: { attr: 'maxlength', type: 'integer', empty: 0 },\n minLength: { attr: 'minlength', type: 'integer', empty: 0 },\n placeholder: DOMString,\n rows: { type: 'integer', empty: 1 },\n wrap: DOMString,\n // Not in spec, but plays nice with HTML linters\n defaultValueAttr: { attr: 'value', ...DOMString },\n })\n .define({\n _textarea() { return /** @type {HTMLTextAreaElement} */ (this.refs.control); },\n })\n .define({\n defaultValue: {\n get() { return this._textarea.defaultValue; },\n set(value) {\n const previousValue = this._textarea.defaultValue;\n this._textarea.defaultValue = value;\n const newValue = this._textarea.defaultValue;\n if (previousValue !== newValue) {\n this.propChangedCallback('defaultValue', previousValue, newValue);\n }\n this.textContent = this._textarea.defaultValue;\n },\n },\n textLength() { return this._textarea.textLength; },\n select() { return this._textarea.select; },\n\n selectionDirection: {\n get() { return this._textarea.selectionDirection; },\n set(value) { this._textarea.selectionDirection = value; },\n },\n\n selectionStart: {\n get() { return this._textarea.selectionStart; },\n set(value) { this._textarea.selectionStart = value; },\n },\n\n selectionEnd: {\n get() { return this._textarea.selectionEnd; },\n set(value) { this._textarea.selectionEnd = value; },\n },\n\n setRangeText() { return this._textarea.setRangeText; },\n\n setSelectionRange() { return this._textarea.setSelectionRange; },\n\n })\n .methods({\n resize() {\n if (this._resizing) return;\n this._resizing = true;\n const textarea = this._textarea;\n let userHeight = textarea.style.getPropertyValue('height');\n\n // if (this.placeholder) textarea.removeAttribute('placeholder');\n\n if (!this.supportsCSSLineHeightUnit) {\n const { lineHeight } = window.getComputedStyle(textarea);\n this._lineHeight = lineHeight;\n }\n\n if (this.minRows > 1 && textarea.rows < this.minRows) {\n textarea.rows = this.minRows;\n } else if (this.maxRows && textarea.rows > this.maxRows) {\n textarea.rows = this.maxRows;\n }\n if (!this.fixed) {\n // Auto-grow\n while (textarea.clientHeight < textarea.scrollHeight) {\n if (userHeight) {\n textarea.style.removeProperty('height');\n userHeight = null;\n }\n if (this.maxRows && textarea.rows === this.maxRows) break;\n const lastClientHeight = textarea.clientHeight;\n textarea.rows++;\n if (lastClientHeight === textarea.clientHeight) {\n textarea.rows--;\n break;\n }\n }\n // Auto-shrink\n while (!userHeight && textarea.clientHeight >= textarea.scrollHeight) {\n if (textarea.rows === 1) break;\n if (this.minRows > 1 && textarea.rows === this.minRows) break;\n const lastClientHeight = textarea.clientHeight;\n textarea.rows--;\n if ((lastClientHeight === textarea.clientHeight)\n || (textarea.scrollHeight > textarea.clientHeight)) {\n textarea.rows++;\n break;\n }\n }\n }\n if (textarea.selectionEnd === textarea.value.length) {\n textarea.scrollTop = textarea.scrollHeight;\n }\n this.rows = textarea.rows;\n this._resizing = false;\n // if (this.placeholder) textarea.setAttribute('placeholder', this.placeholder);\n },\n\n /** @param {ResizeObserverEntry} entry */\n onResizeObserved(entry) {\n if (this.matches(':active')) return;\n this.resize();\n },\n })\n .childEvents({\n slot: {\n /**\n * @param {Event & {currentTarget:HTMLSlotElement}} event\n * @return {void}\n */\n slotchange({ currentTarget }) {\n const textarea = /** @type {HTMLTextAreaElement} */ (this.refs.control);\n const previousValue = textarea.defaultValue;\n textarea.replaceChildren(\n ...currentTarget.assignedNodes().map((child) => child.cloneNode(true)),\n );\n\n const newValue = textarea.defaultValue;\n if (previousValue !== newValue) {\n this.propChangedCallback('defaultValue', previousValue, newValue);\n }\n },\n },\n control: {\n input() {\n this.resize();\n },\n },\n })\n .on({\n composed() {\n const { control } = this.refs;\n // Spec\n control.removeAttribute('placeholder');\n control.setAttribute('rows', '{rows}');\n\n // Custom\n control.setAttribute('input-prefix', '{inputPrefix}');\n control.setAttribute('input-suffix', '{inputSuffix}');\n control.setAttribute('fixed', '{fixed}');\n control.setAttribute('icon', '{icon}');\n },\n defaultValueAttrChanged(oldValue, newValue) {\n this.defaultValue = newValue;\n },\n defaultValueChanged() {\n this._value = this._textarea.value;\n this.resize();\n },\n _lineHeightChanged(oldValue, newValue) {\n this.refs.shape.style.setProperty('--line-height', newValue);\n },\n // Animate API does not override user-resize. Must use inline-styles\n minRowsChanged(oldValue, newValue) {\n this.refs.shape.style.setProperty('--min-rows', `${newValue || 'none'}`);\n this.resize();\n },\n maxRowsChanged(oldValue, newValue) {\n this.refs.shape.style.setProperty('--max-rows', `${newValue || 'none'}`);\n this.resize();\n },\n rowsChanged() {\n this.resize();\n },\n _formResetChanged(oldValue, newValue) {\n if (!newValue) return;\n this._textarea.value = this.defaultValue;\n this._value = this._textarea.value;\n },\n attrs: {\n cols: cloneAttributeCallback('cols', 'control'),\n dirname: cloneAttributeCallback('dirname', 'control'),\n minlength: cloneAttributeCallback('minlength', 'control'),\n maxlength: cloneAttributeCallback('maxlength', 'control'),\n placeholder: cloneAttributeCallback('placeholder', 'control'),\n minrows: cloneAttributeCallback('minrows', 'control'),\n maxrows: cloneAttributeCallback('maxrows', 'control'),\n },\n })\n .css`\n /* https://m3.material.io/components/text-fields/specs */\n\n :host {\n display: inline-grid;\n grid-auto-flow: row;\n grid-template-rows: minmax(0, 100%);\n }\n\n :host(:is([filled][label])) {\n --control__margin-top: calc((var(--mdw-text-field__ratio) * 8px) + var(--mdw-typescale__body-small__line-height));\n --control__padding-top: 0px;\n --control__padding-bottom: calc((var(--mdw-text-field__ratio) * 8px) - 1px);\n --control__margin-bottom: 1px;\n }\n\n #shape {\n --max-rows: none;\n --line-height: var(--mdw-typescale__body-large__line-height);\n --expected-height: calc(var(--line-height)\n + var(--control__margin-top)\n + var(--control__padding-top)\n + var(--control__padding-bottom)\n + var(--control__margin-bottom));\n max-block-size: 100%;\n grid-row: 1 / 1;\n padding: 0;\n }\n\n @supports(height: 1lh) {\n #shape {\n --line-height: 1lh;\n }\n }\n\n #slot {\n display: none;\n }\n\n #control {\n -ms-overflow-style: -ms-autohiding-scrollbar;\n overflow-y: auto;\n -webkit-overflow-scrolling: touch;\n\n box-sizing: content-box;\n block-size: min-content;\n\n min-block-size: var(--line-height);\n /* Avoid clipping on manual resize */\n max-block-size: calc(100% - (var(--control__margin-top)\n + var(--control__padding-top)\n + var(--control__padding-bottom)\n + var(--control__margin-bottom)));\n inline-size: calc(100% - 32px) !important; /* !important to override user-agent resize */\n\n padding-inline: 16px;\n\n /* https://github.com/w3c/csswg-drafts/issues/7542 */\n form-sizing: normal;\n }\n\n #control[minrows] {\n min-block-size: calc((var(--min-rows) * var(--line-height)));\n }\n\n #control[maxrows] {\n max-block-size: calc((var(--max-rows) * var(--line-height)));\n }\n\n #control[icon] {\n padding-inline-start: 0;\n }\n\n #control:is([icon], [input-prefix]) {\n padding-inline-start: 0;\n }\n\n #control:is([trailing-icon], [input-suffix]) {\n padding-inline-end: 0;\n }\n\n #suffix {\n padding-inline-end: 16px;\n }\n\n mdw-icon {\n align-self: flex-start;\n\n margin-block-start: calc((var(--expected-height) - var(--mdw-icon__size)) / 2);\n }\n\n #control[fixed] {\n /* stylelint-disable-next-line plugin/no-unsupported-browser-features */\n resize: none;\n }\n `\n .autoRegister('mdw-textarea');\n", "import Headline from './Headline.js';\n\nexport default Headline\n .extend()\n .expressions({\n computeAriaLevel({ ariaLevel, size }) {\n if (ariaLevel) return ariaLevel;\n if (size === 'medium') return '5';\n if (size === 'small') return '6';\n return '4';\n },\n })\n .css`\n :host {\n font: var(--mdw-typescale__title-large__font);\n letter-spacing: var(--mdw-typescale__title-large__letter-spacing);\n }\n \n :host([size=\"medium\"]) {\n font: var(--mdw-typescale__title-medium__font);\n letter-spacing: var(--mdw-typescale__title-medium__letter-spacing);\n }\n \n :host([size=\"small\"]) {\n font: var(--mdw-typescale__title-small__font);\n letter-spacing: var(--mdw-typescale__title-small__letter-spacing);\n }\n `\n .autoRegister('mdw-title');\n", "import { css } from '../core/template.js';\n\nimport {\n generateThemeCSS,\n generateTypographyGlobalCSS,\n themeOptionsFromSearchParams,\n} from './index.js';\n\nconst rules = [\n generateThemeCSS(themeOptionsFromSearchParams(new URL(import.meta.url).searchParams)),\n generateTypographyGlobalCSS(),\n].join('\\n');\n\nconst parsed = css`${rules}`;\nif (parsed instanceof HTMLStyleElement) {\n document.head.append(parsed);\n} else {\n document.adoptedStyleSheets = [\n ...document.adoptedStyleSheets,\n parsed,\n ];\n}\n", "import { COLOR_KEYWORDS } from '../utils/color_keywords.js';\nimport { getScheme } from '../utils/material-color/helper.js';\nimport { svgToCSSURL } from '../utils/svg.js';\n\n/**\n * @typedef {Object} ThemeOptions\n * @prop {string} [color]\n * @prop {Iterable<[string,string?]>} [custom] Map()\n * @prop {'auto'|'light'|'dark'} [lightness='auto']\n * @return {string}\n */\n\n/**\n * @param {string} shape\n * @return {string}\n */\nfunction getShapeMaskSVG(shape) {\n return [\n '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">',\n `<defs><path id=\"a\" d=\"${shape}\"/></defs>`,\n '<use href=\"#a\" transform=\"scale(.666)\"/>',\n '<use href=\"#a\" transform=\"translate(8) scale(.666)\"/>',\n '<use href=\"#a\" transform=\"matrix(.666 0 0 .666 0 8)\"/>',\n '<use href=\"#a\" transform=\"matrix(.666 0 0 .666 8 8)\"/>',\n '<path d=\"M8 0h8v24H8Z\"/><path d=\"M0 8h24v8H0Z\"/>',\n '</svg>',\n ].join('');\n}\n\n/**\n * @param {string} shape\n * @param {'top-left'|'top-right'|'bottom-left'|'bottom-right'} corner\n * @param {boolean} [convex]\n * @return {string}\n */\nfunction getShapeCornerSVGs(shape, corner, convex) {\n const path = `<path ${[\n `d=\"${shape}\"`,\n 'vector-effect=\"non-scaling-stroke\"',\n `transform-origin=\"${corner.replace('-', ' ')}\"`,\n 'stroke-linejoin=\"miter\"',\n 'transform=\"scale(2)\"',\n `stroke-width=\"${convex ? 4 : 2}px\"`,\n 'stroke=\"black\"',\n 'fill=\"none\"',\n ].join(' ')}/>`;\n\n return [\n '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">',\n convex\n ? [\n '<mask id=\"m\">',\n '<rect x=\"0\" y=\"0\" width=\"24\" height=\"24\" fill=\"white\"/>',\n `<path d=\"${shape}\" transform-origin=\"${corner.replace('-', ' ')}\" transform=\"scale(2)\"/>`,\n '</mask>',\n `<g mask=\"url(#m)\">${path}</g>`,\n ].join('')\n : path,\n '</svg>',\n ].join('');\n}\n\n/**\n * @return {string}\n */\nfunction getShapeEdgesSVGs() {\n return [\n '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">',\n '<rect x=\"0\" y=\"0\" width=\"24\" height=\"24\" vector-effect=\"non-scaling-stroke\" stroke-width=\"2px\" stroke=\"black\" fill=\"none\"/>',\n '</svg>',\n ].join('');\n}\n\nconst CIRCLE_PATH = 'M0 12A12 12 0 1012 0 12 12 0 000 12Z';\n// const SQUIRCLE_PATH = 'M12 24C17.2583 24 20.1815 24 22.0908 22.0908 24 20.1815 24 17.2583 24 12 24 6.7417 24 3.8185 22.0908 1.9092 20.1815-0 17.2583-0 12-0 6.7417-0 3.8185-0 1.9092 1.9092-0 3.8185-0 6.7417-0 12-0 17.2583-0 20.1815 1.9092 22.0908 3.8185 24 6.7417 24 12 24Z';\nconst DIAMOND_PATH = 'M 0 12 12 0 24 12 12 24 Z';\nconst SQUIRCLE_PATH = 'M12 24C17.2583 24 20.1815 24 22.0908 22.0908 24 20.1815 24 17.2583 24 12 24 6.7417 24 3.8185 22.0908 1.9092 20.1815-0 17.2583-0 12-0 6.7417-0 3.8185-0 1.9092 1.9092-0 3.8185-0 6.7417-0 12-0 17.2583-0 20.1815 1.9092 22.0908 3.8185 24 6.7417 24 12 24Z';\nconst HALF_NOTCH_PATH = 'M0 6H6V0H18V6H24V18H18V24H6V18H0Z';\n\nconst SHAPE_ROUNDED_DEFAULT = {\n size: {\n extraSmall: '4px',\n small: '8px',\n medium: '12px',\n large: '16px',\n extraLarge: '28px',\n full: '32px',\n },\n /** @type {string?} */\n mask: CIRCLE_PATH, // CIRCLE_PATH\n convex: false,\n};\n\nconst SHAPE_CUT_DEFAULT = {\n ...SHAPE_ROUNDED_DEFAULT,\n size: {\n extraSmall: '4px',\n small: '8px',\n medium: '12px',\n large: '16px',\n extraLarge: '28px',\n full: '32px',\n },\n mask: DIAMOND_PATH,\n};\n\nconst SHAPE_SQUIRCLE_DEFAULT = {\n ...SHAPE_ROUNDED_DEFAULT,\n mask: SQUIRCLE_PATH,\n};\n\nconst SP = 1 / 16;\n\nconst TYPOGRAPHY_DEFAULT = {\n face: {\n brand: '\"Roboto Medium\", Roboto, -apple-system, BlinkMacSystemFont, \"Segoe UI Variable Display\", Helvetica, \"Segoe UI\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\"',\n plain: '\"Roboto Regular\", Roboto, -apple-system, BlinkMacSystemFont, \"Segoe UI Variable Text\", Helvetica, \"Segoe UI\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\"',\n weight: {\n regular: 400,\n medium: 500,\n },\n },\n scale: {\n display: {\n large: {\n fontFamily: 'var(--mdw-typeface__brand)',\n lineHeight: 64,\n fontSize: 57,\n letterSpacing: 0,\n weight: 'var(--mdw-typeface__weight-regular)',\n },\n medium: {\n fontFamily: 'var(--mdw-typeface__brand)',\n lineHeight: 52,\n fontSize: 45,\n letterSpacing: 0,\n weight: 'var(--mdw-typeface__weight-regular)',\n },\n small: {\n fontFamily: 'var(--mdw-typeface__brand)',\n lineHeight: 44,\n fontSize: 36,\n letterSpacing: 0,\n weight: 'var(--mdw-typeface__weight-regular)',\n },\n },\n headline: {\n large: {\n fontFamily: 'var(--mdw-typeface__brand)',\n lineHeight: 40,\n fontSize: 32,\n letterSpacing: 0,\n weight: 'var(--mdw-typeface__weight-regular)',\n },\n medium: {\n fontFamily: 'var(--mdw-typeface__brand)',\n lineHeight: 36,\n fontSize: 28,\n letterSpacing: 0,\n weight: 'var(--mdw-typeface__weight-regular)',\n },\n small: {\n fontFamily: 'var(--mdw-typeface__brand)',\n lineHeight: 32,\n fontSize: 24,\n letterSpacing: 0,\n weight: 'var(--mdw-typeface__weight-regular)',\n },\n },\n title: {\n large: {\n fontFamily: 'var(--mdw-typeface__brand)',\n lineHeight: 28,\n fontSize: 22,\n letterSpacing: 0,\n weight: 'var(--mdw-typeface__weight-medium)', // Figma style has regular\n },\n medium: {\n fontFamily: 'var(--mdw-typeface__plain)',\n lineHeight: 24,\n fontSize: 16,\n letterSpacing: 0.15,\n weight: 'var(--mdw-typeface__weight-medium)',\n },\n small: {\n fontFamily: 'var(--mdw-typeface__plain)',\n lineHeight: 20,\n fontSize: 14,\n letterSpacing: 0.1,\n weight: 'var(--mdw-typeface__weight-medium)',\n },\n },\n label: {\n large: {\n fontFamily: 'var(--mdw-typeface__plain)',\n lineHeight: 20,\n fontSize: 14,\n letterSpacing: 0.1,\n weight: 'var(--mdw-typeface__weight-medium)',\n },\n medium: {\n fontFamily: 'var(--mdw-typeface__plain)',\n lineHeight: 16,\n fontSize: 12,\n letterSpacing: 0.5,\n weight: 'var(--mdw-typeface__weight-medium)',\n },\n small: {\n fontFamily: 'var(--mdw-typeface__plain)',\n lineHeight: 16,\n fontSize: 11,\n letterSpacing: 0.5,\n weight: 'var(--mdw-typeface__weight-medium)',\n },\n },\n body: {\n large: {\n fontFamily: 'var(--mdw-typeface__plain)',\n lineHeight: 24,\n fontSize: 16,\n letterSpacing: 0.5, // Figma text has 0.15\n weight: 'var(--mdw-typeface__weight-regular)',\n },\n medium: {\n fontFamily: 'var(--mdw-typeface__plain)',\n lineHeight: 20,\n fontSize: 14,\n letterSpacing: 0.25,\n weight: 'var(--mdw-typeface__weight-regular)',\n },\n small: {\n fontFamily: 'var(--mdw-typeface__brand)',\n lineHeight: 16,\n fontSize: 12,\n letterSpacing: 0.4,\n weight: 'var(--mdw-typeface__weight-regular)',\n },\n },\n },\n};\n\n/**\n * @param {typeof TYPOGRAPHY_DEFAULT} config\n * @return {string}\n */\nexport function generateTypographyCSS(config = TYPOGRAPHY_DEFAULT) {\n return /* css */ `\n :root {\n --mdw-typeface__brand: ${config.face.brand};\n --mdw-typeface__weight-regular: ${config.face.weight.regular};\n --mdw-typeface__weight-medium: ${config.face.weight.medium};\n --mdw-typeface__plain: ${config.face.plain};\n\n --mdw-typescale__display-large__font-family: ${config.scale.display.large.fontFamily};\n --mdw-typescale__display-large__line-height: calc(${config.scale.display.large.lineHeight} * 0.0625rem);\n --mdw-typescale__display-large__font-size: calc(${config.scale.display.large.fontSize} * 0.0625rem);\n --mdw-typescale__display-large__letter-spacing: calc(${config.scale.display.large.letterSpacing} * 0.0625rem);\n --mdw-typescale__display-large__font-weight: ${config.scale.display.large.weight};\n\n --mdw-typescale__display-medium__font-family: ${config.scale.display.medium.fontFamily};\n --mdw-typescale__display-medium__line-height: calc(${config.scale.display.medium.lineHeight} * 0.0625rem);\n --mdw-typescale__display-medium__font-size: calc(${config.scale.display.medium.fontSize} * 0.0625rem);\n --mdw-typescale__display-medium__letter-spacing: calc(${config.scale.display.medium.letterSpacing} * 0.0625rem);\n --mdw-typescale__display-medium__font-weight: ${config.scale.display.medium.weight};\n\n --mdw-typescale__display-small__font-family: ${config.scale.display.small.fontFamily};\n --mdw-typescale__display-small__line-height: calc(${config.scale.display.small.lineHeight} * 0.0625rem);\n --mdw-typescale__display-small__font-size: calc(${config.scale.display.small.fontSize} * 0.0625rem);\n --mdw-typescale__display-small__letter-spacing: calc(${config.scale.display.small.letterSpacing} * 0.0625rem);\n --mdw-typescale__display-small__font-weight: ${config.scale.display.small.weight};\n\n --mdw-typescale__headline-large__font-family: ${config.scale.headline.large.fontFamily};\n --mdw-typescale__headline-large__line-height: calc(${config.scale.headline.large.lineHeight} * 0.0625rem);\n --mdw-typescale__headline-large__font-size: calc(${config.scale.headline.large.fontSize} * 0.0625rem);\n --mdw-typescale__headline-large__letter-spacing: calc(${config.scale.headline.large.letterSpacing} * 0.0625rem);\n --mdw-typescale__headline-large__font-weight: ${config.scale.headline.large.weight};\n\n --mdw-typescale__headline-medium__font-family: ${config.scale.headline.medium.fontFamily};\n --mdw-typescale__headline-medium__line-height: calc(${config.scale.headline.medium.lineHeight} * 0.0625rem);\n --mdw-typescale__headline-medium__font-size: calc(${config.scale.headline.medium.fontSize} * 0.0625rem);\n --mdw-typescale__headline-medium__letter-spacing: calc(${config.scale.headline.medium.letterSpacing} * 0.0625rem);\n --mdw-typescale__headline-medium__font-weight: ${config.scale.headline.medium.weight};\n\n --mdw-typescale__headline-small__font-family: ${config.scale.headline.small.fontFamily};\n --mdw-typescale__headline-small__line-height: calc(${config.scale.headline.small.lineHeight} * 0.0625rem);\n --mdw-typescale__headline-small__font-size: calc(${config.scale.headline.small.fontSize} * 0.0625rem);\n --mdw-typescale__headline-small__letter-spacing: calc(${config.scale.headline.small.letterSpacing} * 0.0625rem);\n --mdw-typescale__headline-small__font-weight: ${config.scale.headline.small.weight};\n\n --mdw-typescale__title-large__font-family: ${config.scale.title.large.fontFamily};\n --mdw-typescale__title-large__line-height: calc(${config.scale.title.large.lineHeight} * 0.0625rem);\n --mdw-typescale__title-large__font-size: calc(${config.scale.title.large.fontSize} * 0.0625rem);\n --mdw-typescale__title-large__letter-spacing: calc(${config.scale.title.large.letterSpacing} * 0.0625rem);\n --mdw-typescale__title-large__font-weight: ${config.scale.title.large.weight};\n\n --mdw-typescale__title-medium__font-family: ${config.scale.title.medium.fontFamily};\n --mdw-typescale__title-medium__line-height: calc(${config.scale.title.medium.lineHeight} * 0.0625rem);\n --mdw-typescale__title-medium__font-size: calc(${config.scale.title.medium.fontSize} * 0.0625rem);\n --mdw-typescale__title-medium__letter-spacing: calc(${config.scale.title.medium.letterSpacing} * 0.0625rem);\n --mdw-typescale__title-medium__font-weight: ${config.scale.title.medium.weight};\n\n --mdw-typescale__title-small__font-family: ${config.scale.title.small.fontFamily};\n --mdw-typescale__title-small__line-height: calc(${config.scale.title.small.lineHeight} * 0.0625rem);\n --mdw-typescale__title-small__font-size: calc(${config.scale.title.small.fontSize} * 0.0625rem);\n --mdw-typescale__title-small__letter-spacing: calc(${config.scale.title.small.letterSpacing} * 0.0625rem);\n --mdw-typescale__title-small__font-weight: ${config.scale.title.small.weight};\n\n --mdw-typescale__label-large__font-family: ${config.scale.label.large.fontFamily};\n --mdw-typescale__label-large__line-height: calc(${config.scale.label.large.lineHeight} * 0.0625rem);\n --mdw-typescale__label-large__font-size: calc(${config.scale.label.large.fontSize} * 0.0625rem);\n --mdw-typescale__label-large__letter-spacing: calc(${config.scale.label.large.letterSpacing} * 0.0625rem);\n --mdw-typescale__label-large__font-weight: ${config.scale.label.large.weight};\n\n --mdw-typescale__label-medium__font-family: ${config.scale.label.medium.fontFamily};\n --mdw-typescale__label-medium__line-height: calc(${config.scale.label.medium.lineHeight} * 0.0625rem);\n --mdw-typescale__label-medium__font-size: calc(${config.scale.label.medium.fontSize} * 0.0625rem);\n --mdw-typescale__label-medium__letter-spacing: calc(${config.scale.label.medium.letterSpacing} * 0.0625rem);\n --mdw-typescale__label-medium__font-weight: ${config.scale.label.medium.weight};\n\n --mdw-typescale__label-small__font-family: ${config.scale.label.small.fontFamily};\n --mdw-typescale__label-small__line-height: calc(${config.scale.label.small.lineHeight} * 0.0625rem);\n --mdw-typescale__label-small__font-size: calc(${config.scale.label.small.fontSize} * 0.0625rem);\n --mdw-typescale__label-small__letter-spacing: calc(${config.scale.label.small.letterSpacing} * 0.0625rem);\n --mdw-typescale__label-small__font-weight: ${config.scale.label.small.weight};\n\n --mdw-typescale__body-large__font-family: ${config.scale.body.large.fontFamily};\n --mdw-typescale__body-large__line-height: calc(${config.scale.body.large.lineHeight} * 0.0625rem);\n --mdw-typescale__body-large__font-size: calc(${config.scale.body.large.fontSize} * 0.0625rem);\n --mdw-typescale__body-large__letter-spacing: calc(${config.scale.body.large.letterSpacing} * 0.0625rem);\n --mdw-typescale__body-large__font-weight: ${config.scale.body.large.weight};\n\n --mdw-typescale__body-medium__font-family: ${config.scale.body.medium.fontFamily};\n --mdw-typescale__body-medium__line-height: calc(${config.scale.body.medium.lineHeight} * 0.0625rem);\n --mdw-typescale__body-medium__font-size: calc(${config.scale.body.medium.fontSize} * 0.0625rem);\n --mdw-typescale__body-medium__letter-spacing: calc(${config.scale.body.medium.letterSpacing} * 0.0625rem);\n --mdw-typescale__body-medium__font-weight: ${config.scale.body.medium.weight};\n\n --mdw-typescale__body-small__font-family: ${config.scale.body.small.fontFamily};\n --mdw-typescale__body-small__line-height: calc(${config.scale.body.small.lineHeight} * 0.0625rem);\n --mdw-typescale__body-small__font-size: calc(${config.scale.body.small.fontSize} * 0.0625rem);\n --mdw-typescale__body-small__letter-spacing: calc(${config.scale.body.small.letterSpacing} * 0.0625rem);\n --mdw-typescale__body-small__font-weight: ${config.scale.body.small.weight};\n }`;\n}\n\n/** @return {string} */\nexport function generateTypographyGlobalCSS() {\n return /* css */ `\n :root {${['display', 'headline', 'title', 'label', 'body']\n .map((style) => ['large', 'medium', 'small']\n .map((size) => `--mdw-typescale__${style}-${size}__font: ${\n [\n `var(--mdw-typescale__${style}-${size}__font-weight)`,\n `var(--mdw-typescale__${style}-${size}__font-size)/var(--mdw-typescale__${style}-${size}__line-height)`,\n `var(--mdw-typescale__${style}-${size}__font-family)`,\n ].join(' ')\n };`).join('\\n'))\n .join('\\n')}}`;\n}\n\n/**\n * @param {typeof SHAPE_ROUNDED_DEFAULT} config\n * @return {string}\n */\nexport function generateShapeCSS(config = SHAPE_ROUNDED_DEFAULT) {\n return /* css */`\n :root {\n --mdw-shape__extra-small: ${config.size.extraSmall};\n --mdw-shape__small: ${config.size.small};\n --mdw-shape__medium: ${config.size.medium};\n --mdw-shape__large: ${config.size.large};\n --mdw-shape__extra-large: ${config.size.extraLarge};\n --mdw-shape__full: ${config.size.full};\n --mdw-shape__rounded: ${config.mask ? '0' : '1'};\n --mdw-shape__outline__background: ${config.mask ? 'currentColor' : 'transparent'};\n --mdw-shape__convex: ${config.convex ? '1' : '0'};\n --mdw-shape__mask-border-source: ${config.mask ? svgToCSSURL(getShapeMaskSVG(config.mask)) : 'none'};\n --mdw-shape__mask-image__top-left: ${config.mask ? svgToCSSURL(getShapeCornerSVGs(config.mask, 'top-left')) : 'none'};\n --mdw-shape__mask-image__top-right: ${config.mask ? svgToCSSURL(getShapeCornerSVGs(config.mask, 'top-right')) : 'none'};\n --mdw-shape__mask-image__bottom-right: ${config.mask ? svgToCSSURL(getShapeCornerSVGs(config.mask, 'bottom-right')) : 'none'};\n --mdw-shape__mask-image__bottom-left: ${config.mask ? svgToCSSURL(getShapeCornerSVGs(config.mask, 'bottom-left')) : 'none'};\n --mdw-shape__mask-image__edges: ${config.mask ? svgToCSSURL(getShapeEdgesSVGs()) : 'none'};\n }\n `;\n}\n\n/**\n * @param {string} content\n * @return {HTMLStyleElement } element\n */\nfunction addStyle(content) {\n const element = document.createElement('style');\n element.textContent = content;\n document.head.append(element);\n return element;\n}\n\n/**\n * @param {ThemeOptions} options\n * @return {string}\n */\nexport function generateColorCSS({ color = '#6750A4', custom = [], lightness = 'light' }) {\n /** @type {[string,string][]} */\n const parsedColors = [...custom]\n .map(([name, hex]) => [name, COLOR_KEYWORDS.get(hex) || hex || COLOR_KEYWORDS.get(name)]);\n const scheme = getScheme(color, parsedColors);\n if (lightness === 'dark') {\n return scheme.dark;\n }\n return scheme.light;\n}\n\n/**\n * @param {ThemeOptions} options\n * @return {void}\n */\nexport function setupTheme({ color = '#6750A4', custom = [], lightness = 'auto' }) {\n /** @type {[string,string][]} */\n const parsedColors = [...custom]\n .map(([name, hex]) => [name, COLOR_KEYWORDS.get(hex) || hex || COLOR_KEYWORDS.get(name)]);\n const scheme = getScheme(color, parsedColors);\n if (lightness === 'dark') {\n addStyle(scheme.dark);\n } else {\n addStyle(scheme.light);\n if (lightness !== 'light') {\n addStyle(scheme.dark).media = '(prefers-color-scheme:dark)';\n }\n }\n addStyle(generateShapeCSS());\n addStyle(generateTypographyCSS());\n}\n\n/**\n * @param {URLSearchParams} searchParams\n * @return {ThemeOptions}\n */\nexport function themeOptionsFromSearchParams(searchParams) {\n const color = searchParams.get('color') || '#6750A4';\n\n /** @type {[string,string?][]} */\n const custom = searchParams.getAll('custom')\n .flatMap((c) => c.split(','))\n .map((c) => c.split(':'));\n\n const lightness = searchParams.get('lightness') ?? 'auto';\n return { color, custom, lightness };\n}\n\n/**\n * @param {ThemeOptions} options\n * @return {string}\n */\nexport function generateThemeCSS({ color = '#6750A4', custom = [], lightness = 'auto' }) {\n const shapeCss = generateShapeCSS();\n const typographyCss = generateTypographyCSS();\n let colorCss;\n if (lightness === 'light' || lightness === 'dark') {\n colorCss = generateColorCSS({ color, custom, lightness });\n } else {\n colorCss = `\n ${generateColorCSS({ color, custom, lightness: 'light' })}\n @media (prefers-color-scheme:dark) {\n :root { color-scheme: dark; }\n ${generateColorCSS({ color, custom, lightness: 'dark' })}\n }`;\n }\n return [\n shapeCss,\n typographyCss,\n colorCss,\n ].join('\\n');\n}\n", "// https://developer.mozilla.org/en-US/docs/Web/CSS/color_value/color_keywords\nexport const COLOR_KEYWORDS = new Map([\n ['black', '#000000'],\n ['silver', '#c0c0c0'],\n ['gray', '#808080'],\n ['white', '#ffffff'],\n ['maroon', '#800000'],\n ['red', '#ff0000'],\n ['purple', '#800080'],\n ['fuchsia', '#ff00ff'],\n ['green', '#008000'],\n ['lime', '#00ff00'],\n ['olive', '#808000'],\n ['yellow', '#ffff00'],\n ['navy', '#000080'],\n ['blue', '#0000ff'],\n ['teal', '#008080'],\n ['aqua', '#00ffff'],\n ['orange', '#ffa500'],\n ['aliceblue', '#f0f8ff'],\n ['antiquewhite', '#faebd7'],\n ['aquamarine', '#7fffd4'],\n ['azure', '#f0ffff'],\n ['beige', '#f5f5dc'],\n ['bisque', '#ffe4c4'],\n ['blanchedalmond', '#ffebcd'],\n ['blueviolet', '#8a2be2'],\n ['brown', '#a52a2a'],\n ['burlywood', '#deb887'],\n ['cadetblue', '#5f9ea0'],\n ['chartreuse', '#7fff00'],\n ['chocolate', '#d2691e'],\n ['coral', '#ff7f50'],\n ['cornflowerblue', '#6495ed'],\n ['cornsilk', '#fff8dc'],\n ['crimson', '#dc143c'],\n ['cyan', '00ffff'],\n ['darkblue', '#00008b'],\n ['darkcyan', '#008b8b'],\n ['darkgoldenrod', '#b8860b'],\n ['darkgray', '#a9a9a9'],\n ['darkgreen', '#006400'],\n ['darkgrey', '#a9a9a9'],\n ['darkkhaki', '#bdb76b'],\n ['darkmagenta', '#8b008b'],\n ['darkolivegreen', '#556b2f'],\n ['darkorange', '#ff8c00'],\n ['darkorchid', '#9932cc'],\n ['darkred', '#8b0000'],\n ['darksalmon', '#e9967a'],\n ['darkseagreen', '#8fbc8f'],\n ['darkslateblue', '#483d8b'],\n ['darkslategray', '#2f4f4f'],\n ['darkslategrey', '#2f4f4f'],\n ['darkturquoise', '#00ced1'],\n ['darkviolet', '#9400d3'],\n ['deeppink', '#ff1493'],\n ['deepskyblue', '#00bfff'],\n ['dimgray', '#696969'],\n ['dimgrey', '#696969'],\n ['dodgerblue', '#1e90ff'],\n ['firebrick', '#b22222'],\n ['floralwhite', '#fffaf0'],\n ['forestgreen', '#228b22'],\n ['gainsboro', '#dcdcdc'],\n ['ghostwhite', '#f8f8ff'],\n ['gold', '#ffd700'],\n ['goldenrod', '#daa520'],\n ['greenyellow', '#adff2f'],\n ['grey', '#808080'],\n ['honeydew', '#f0fff0'],\n ['hotpink', '#ff69b4'],\n ['indianred', '#cd5c5c'],\n ['indigo', '#4b0082'],\n ['ivory', '#fffff0'],\n ['khaki', '#f0e68c'],\n ['lavender', '#e6e6fa'],\n ['lavenderblush', '#fff0f5'],\n ['lawngreen', '#7cfc00'],\n ['lemonchiffon', '#fffacd'],\n ['lightblue', '#add8e6'],\n ['lightcoral', '#f08080'],\n ['lightcyan', '#e0ffff'],\n ['lightgoldenrodyellow', '#fafad2'],\n ['lightgray', '#d3d3d3'],\n ['lightgreen', '#90ee90'],\n ['lightgrey', '#d3d3d3'],\n ['lightpink', '#ffb6c1'],\n ['lightsalmon', '#ffa07a'],\n ['lightseagreen', '#20b2aa'],\n ['lightskyblue', '#87cefa'],\n ['lightslategray', '#778899'],\n ['lightslategrey', '#778899'],\n ['lightsteelblue', '#b0c4de'],\n ['lightyellow', '#ffffe0'],\n ['limegreen', '#32cd32'],\n ['linen', '#faf0e6'],\n ['magenta', '#ff00ff'],\n ['mediumaquamarine', '#66cdaa'],\n ['mediumblue', '#0000cd'],\n ['mediumorchid', '#ba55d3'],\n ['mediumpurple', '#9370db'],\n ['mediumseagreen', '#3cb371'],\n ['mediumslateblue', '#7b68ee'],\n ['mediumspringgreen', '#00fa9a'],\n ['mediumturquoise', '#48d1cc'],\n ['mediumvioletred', '#c71585'],\n ['midnightblue', '#191970'],\n ['mintcream', '#f5fffa'],\n ['mistyrose', '#ffe4e1'],\n ['moccasin', '#ffe4b5'],\n ['navajowhite', '#ffdead'],\n ['oldlace', '#fdf5e6'],\n ['olivedrab', '#6b8e23'],\n ['orangered', '#ff4500'],\n ['orchid', '#da70d6'],\n ['palegoldenrod', '#eee8aa'],\n ['palegreen', '#98fb98'],\n ['paleturquoise', '#afeeee'],\n ['palevioletred', '#db7093'],\n ['papayawhip', '#ffefd5'],\n ['peachpuff', '#ffdab9'],\n ['peru', '#cd853f'],\n ['pink', '#ffc0cb'],\n ['plum', '#dda0dd'],\n ['powderblue', '#b0e0e6'],\n ['rosybrown', '#bc8f8f'],\n ['royalblue', '#4169e1'],\n ['saddlebrown', '#8b4513'],\n ['salmon', '#fa8072'],\n ['sandybrown', '#f4a460'],\n ['seagreen', '#2e8b57'],\n ['seashell', '#fff5ee'],\n ['sienna', '#a0522d'],\n ['skyblue', '#87ceeb'],\n ['slateblue', '#6a5acd'],\n ['slategray', '#708090'],\n ['slategrey', '#708090'],\n ['snow', '#fffafa'],\n ['springgreen', '#00ff7f'],\n ['steelblue', '#4682b4'],\n ['tan', '#d2b48c'],\n ['thistle', '#d8bfd8'],\n ['tomato', '#ff6347'],\n ['turquoise', '#40e0d0'],\n ['violet', '#ee82ee'],\n ['wheat', '#f5deb3'],\n ['whitesmoke', '#f5f5f5'],\n ['yellowgreen', '#9acd32'],\n ['rebeccapurple', '#663399'],\n]);\n", "/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// This file is automatically generated. Do not modify it.\n\n/**\n * Utility methods for mathematical operations.\n */\n\n/**\n * The signum function.\n * @param {number} num\n * @return {1|-1|0} 1 if num > 0, -1 if num < 0, and 0 if num = 0\n */\nexport function signum(num) {\n if (num < 0) {\n return -1;\n }\n if (num === 0) {\n return 0;\n }\n return 1;\n}\n\n/**\n * The linear interpolation function.\n * @param {number} start\n * @param {number} stop\n * @param {number} amount\n * @return {number} start if amount = 0 and stop if amount = 1\n */\nexport function lerp(start, stop, amount) {\n return (1 - amount) * start + amount * stop;\n}\n\n/**\n * Clamps an integer between two integers.\n * @param {number} min\n * @param {number} max\n * @param {number} input\n * @return {number} input when min <= input <= max, and either min or max\n * otherwise.\n */\nexport function clampInt(min, max, input) {\n if (input < min) {\n return min;\n } if (input > max) {\n return max;\n }\n\n return input;\n}\n\n/**\n * Clamps an integer between two floating-point numbers.\n * @param {number} min\n * @param {number} max\n * @param {number} input\n * @return {number} input when min <= input <= max, and either min or max\n * otherwise.\n */\nexport function clampDouble(min, max, input) {\n if (input < min) {\n return min;\n } if (input > max) {\n return max;\n }\n\n return input;\n}\n\n/**\n * Sanitizes a degree measure as an integer.\n * @param {number} degrees\n * @return {number} a degree measure between 0 (inclusive) and 360\n * (exclusive).\n */\nexport function sanitizeDegreesInt(degrees) {\n degrees %= 360;\n if (degrees < 0) {\n degrees += 360;\n }\n return degrees;\n}\n\n/**\n * Sanitizes a degree measure as a floating-point number.\n * @param {number} degrees\n * @return {number} a degree measure between 0.0 (inclusive) and 360.0\n * (exclusive).\n */\nexport function sanitizeDegreesDouble(degrees) {\n degrees %= 360;\n if (degrees < 0) {\n degrees += 360;\n }\n return degrees;\n}\n\n/**\n * Sign of direction change needed to travel from one angle to\n * another.\n *\n * For angles that are 180 degrees apart from each other, both\n * directions have the same travel distance, so either direction is\n * shortest. The value 1.0 is returned in this case.\n * @param {number} from The angle travel starts from, in degrees.\n * @param {number} to The angle travel ends at, in degrees.\n * @return {number} -1 if decreasing from leads to the shortest travel\n * distance, 1 if increasing from leads to the shortest travel\n * distance.\n */\nexport function rotationDirection(from, to) {\n const increasingDifference = sanitizeDegreesDouble(to - from);\n return increasingDifference <= 180 ? 1 : -1;\n}\n\n/**\n * Distance of two points on a circle, represented using degrees.\n * @param {number} a\n * @param {number} b\n * @return {number}\n */\nexport function differenceDegrees(a, b) {\n return 180 - Math.abs(Math.abs(a - b) - 180);\n}\n\n/**\n * Multiplies a 1x3 row vector with a 3x3 matrix.\n * @param {number[]} row\n * @param {number[][]} matrix\n * @return {number[]}\n */\nexport function matrixMultiply(row, matrix) {\n const a = row[0] * matrix[0][0] + row[1] * matrix[0][1] + row[2] * matrix[0][2];\n const b = row[0] * matrix[1][0] + row[1] * matrix[1][1] + row[2] * matrix[1][2];\n const c = row[0] * matrix[2][0] + row[1] * matrix[2][1] + row[2] * matrix[2][2];\n return [a, b, c];\n}\n", "/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// This file is automatically generated. Do not modify it.\n\nimport * as mathUtils from './math.js';\n\n/**\n * Color science utilities.\n *\n * Utility methods for color science constants and color space\n * conversions that aren't HCT or CAM16.\n */\n\nconst SRGB_TO_XYZ = [\n [0.412_338_95, 0.357_620_64, 0.180_510_42],\n [0.2126, 0.7152, 0.0722],\n [0.019_321_41, 0.119_163_82, 0.950_344_78],\n];\n\nconst XYZ_TO_SRGB = [\n [\n 3.241_377_479_238_868_5,\n -1.537_665_240_285_185_1,\n -0.498_853_668_462_680_53,\n ],\n [\n -0.969_145_251_300_532_1,\n 1.875_885_345_106_787_2,\n 0.041_565_856_169_120_61,\n ],\n [\n 0.055_620_936_896_913_05,\n -0.203_955_245_647_421_23,\n 1.057_179_911_122_033_5,\n ],\n];\n\nconst WHITE_POINT_D65 = [95.047, 100, 108.883];\n\n/**\n * Converts a color from RGB components to ARGB format.\n * @param {number} red\n * @param {number} green\n * @param {number} blue\n * @return {number}\n */\nexport function argbFromRgb(red, green, blue) {\n return (255 << 24 | (red & 255) << 16 | (green & 255) << 8 | blue & 255)\n >>> 0;\n}\n\n/**\n * Converts a color from linear RGB components to ARGB format.\n * @param {number[]} linrgb\n * @return {number}\n */\nexport function argbFromLinrgb(linrgb) {\n const r = delinearized(linrgb[0]);\n const g = delinearized(linrgb[1]);\n const b = delinearized(linrgb[2]);\n return argbFromRgb(r, g, b);\n}\n\n/**\n * Returns the alpha component of a color in ARGB format.\n * @param {number} argb\n * @return {number}\n */\nexport function alphaFromArgb(argb) {\n return argb >> 24 & 255;\n}\n\n/**\n * Returns the red component of a color in ARGB format.\n * @param {number} argb\n * @return {number}\n */\nexport function redFromArgb(argb) {\n return argb >> 16 & 255;\n}\n\n/**\n * Returns the green component of a color in ARGB format.\n * @param {number} argb\n * @return {number}\n */\nexport function greenFromArgb(argb) {\n return argb >> 8 & 255;\n}\n\n/**\n * Returns the blue component of a color in ARGB format.\n * @param {number} argb\n * @return {number}\n */\nexport function blueFromArgb(argb) {\n return argb & 255;\n}\n\n/**\n * Returns whether a color in ARGB format is opaque.\n * @param {number} argb\n * @return {boolean}\n */\nexport function isOpaque(argb) {\n return alphaFromArgb(argb) >= 255;\n}\n\n/**\n * Converts a color from ARGB to XYZ.\n * @param {number} x\n * @param {number} y\n * @param {number} z\n * @return {number}\n */\nexport function argbFromXyz(x, y, z) {\n const matrix = XYZ_TO_SRGB;\n const linearR = matrix[0][0] * x + matrix[0][1] * y + matrix[0][2] * z;\n const linearG = matrix[1][0] * x + matrix[1][1] * y + matrix[1][2] * z;\n const linearB = matrix[2][0] * x + matrix[2][1] * y + matrix[2][2] * z;\n const r = delinearized(linearR);\n const g = delinearized(linearG);\n const b = delinearized(linearB);\n return argbFromRgb(r, g, b);\n}\n\n/**\n * Converts a color from XYZ to ARGB.\n * @param {number} argb\n * @return {number[]}\n */\nexport function xyzFromArgb(argb) {\n const r = linearized(redFromArgb(argb));\n const g = linearized(greenFromArgb(argb));\n const b = linearized(blueFromArgb(argb));\n return mathUtils.matrixMultiply([r, g, b], SRGB_TO_XYZ);\n}\n\n/**\n * Converts a color represented in Lab color space into an ARGB\n * integer.\n * @param {number} l\n * @param {number} a\n * @param {number} b\n * @return {number}\n */\nexport function argbFromLab(l, a, b) {\n const whitePoint = WHITE_POINT_D65;\n const fy = (l + 16) / 116;\n const fx = a / 500 + fy;\n const fz = fy - b / 200;\n const xNormalized = labInvf(fx);\n const yNormalized = labInvf(fy);\n const zNormalized = labInvf(fz);\n const x = xNormalized * whitePoint[0];\n const y = yNormalized * whitePoint[1];\n const z = zNormalized * whitePoint[2];\n return argbFromXyz(x, y, z);\n}\n\n/**\n * Converts a color from ARGB representation to L*a*b*\n * representation.\n * @param {number} argb the ARGB representation of a color\n * @return {number[]} a Lab object representing the color\n */\nexport function labFromArgb(argb) {\n const linearR = linearized(redFromArgb(argb));\n const linearG = linearized(greenFromArgb(argb));\n const linearB = linearized(blueFromArgb(argb));\n const matrix = SRGB_TO_XYZ;\n const x = matrix[0][0] * linearR + matrix[0][1] * linearG + matrix[0][2] * linearB;\n const y = matrix[1][0] * linearR + matrix[1][1] * linearG + matrix[1][2] * linearB;\n const z = matrix[2][0] * linearR + matrix[2][1] * linearG + matrix[2][2] * linearB;\n const whitePoint = WHITE_POINT_D65;\n const xNormalized = x / whitePoint[0];\n const yNormalized = y / whitePoint[1];\n const zNormalized = z / whitePoint[2];\n const fx = labF(xNormalized);\n const fy = labF(yNormalized);\n const fz = labF(zNormalized);\n const l = 116 * fy - 16;\n const a = 500 * (fx - fy);\n const b = 200 * (fy - fz);\n return [l, a, b];\n}\n\n/**\n * Converts an L* value to an ARGB representation.\n * @param {number} lstar L* in L*a*b*\n * @return {number} ARGB representation of grayscale color with lightness\n * matching L*\n */\nexport function argbFromLstar(lstar) {\n const y = yFromLstar(lstar);\n const component = delinearized(y);\n return argbFromRgb(component, component, component);\n}\n\n/**\n * Computes the L* value of a color in ARGB representation.\n * @param {number} argb ARGB representation of a color\n * @return {number} L*, from L*a*b*, coordinate of the color\n */\nexport function lstarFromArgb(argb) {\n const y = xyzFromArgb(argb)[1];\n return 116 * labF(y / 100) - 16;\n}\n\n/**\n * Converts an L* value to a Y value.\n *\n * L* in L*a*b* and Y in XYZ measure the same quantity, luminance.\n *\n * L* measures perceptual luminance, a linear scale. Y in XYZ\n * measures relative luminance, a logarithmic scale.\n * @param {number} lstar L* in L*a*b*\n * @return {number} Y in XYZ\n */\nexport function yFromLstar(lstar) {\n return 100 * labInvf((lstar + 16) / 116);\n}\n\n/**\n * Converts a Y value to an L* value.\n *\n * L* in L*a*b* and Y in XYZ measure the same quantity, luminance.\n *\n * L* measures perceptual luminance, a linear scale. Y in XYZ\n * measures relative luminance, a logarithmic scale.\n * @param {number} y Y in XYZ\n * @return {number} L* in L*a*b*\n */\nexport function lstarFromY(y) {\n return labF(y / 100) * 116 - 16;\n}\n\n/**\n * Linearizes an RGB component.\n * @param {number} rgbComponent 0 <= rgb_component <= 255, represents R/G/B\n * channel\n * @return {number} 0.0 <= output <= 100.0, color channel converted to\n * linear RGB space\n */\nexport function linearized(rgbComponent) {\n const normalized = rgbComponent / 255;\n if (normalized <= 0.040_449_936) {\n return (normalized / 12.92) * 100;\n }\n return ((normalized + 0.055) / 1.055) ** 2.4 * 100;\n}\n\n/**\n * Delinearizes an RGB component.\n * @param {number} rgbComponent 0.0 <= rgb_component <= 100.0, represents\n * linear R/G/B channel\n * @return {number} 0 <= output <= 255, color channel converted to regular\n * RGB space\n */\nexport function delinearized(rgbComponent) {\n const normalized = rgbComponent / 100;\n let delinearized = 0;\n delinearized = normalized <= 0.003_130_8 ? normalized * 12.92 : 1.055 * normalized ** (1 / 2.4) - 0.055;\n return mathUtils.clampInt(0, 255, Math.round(delinearized * 255));\n}\n\n/**\n * Returns the standard white point; white on a sunny day.\n * @return {number[]} The white point\n */\nexport function whitePointD65() {\n return WHITE_POINT_D65;\n}\n\n/**\n * RGBA component\n * @typedef Rgba\n * @prop {number} r Red value should be between 0-255\n * @prop {number} g Green value should be between 0-255\n * @prop {number} b Blue value should be between 0-255\n * @prop {number} a Alpha value should be between 0-255\n */\n\n/**\n * Return RGBA from a given int32 color\n * @param {number} argb ARGB representation of a int32 color.\n * @return {Rgba} RGBA representation of a int32 color.\n */\nexport function rgbaFromArgb(argb) {\n const r = redFromArgb(argb);\n const g = greenFromArgb(argb);\n const b = blueFromArgb(argb);\n const a = alphaFromArgb(argb);\n return { r, g, b, a };\n}\n\n/**\n * Return int32 color from a given RGBA component\n * @param {Rgba} rgba RGBA representation of a int32 color.\n * @return {number} ARGB representation of a int32 color.\n */\nexport function argbFromRgba({ r, g, b, a }) {\n const rValue = clampComponent(r);\n const gValue = clampComponent(g);\n const bValue = clampComponent(b);\n const aValue = clampComponent(a);\n return (aValue << 24) | (rValue << 16) | (gValue << 8) | bValue;\n}\n\n/**\n * @param {number} value\n * @return {number}\n */\nfunction clampComponent(value) {\n if (value < 0) return 0;\n if (value > 255) return 255;\n return value;\n}\n\n/**\n *\n * @param {number} t\n * @return {number}\n */\nfunction labF(t) {\n const e = 216 / 24_389;\n const kappa = 24_389 / 27;\n if (t > e) {\n return t ** (1 / 3);\n }\n return (kappa * t + 16) / 116;\n}\n\n/**\n *\n * @param {number} ft\n * @return {number}\n */\nfunction labInvf(ft) {\n const e = 216 / 24_389;\n const kappa = 24_389 / 27;\n const ft3 = ft * ft * ft;\n if (ft3 > e) {\n return ft3;\n }\n return (116 * ft - 16) / kappa;\n}\n", "/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as utils from '../utils/color.js';\nimport * as math from '../utils/math.js';\n\n/**\n * In traditional color spaces, a color can be identified solely by the\n * observer's measurement of the color. Color appearance models such as CAM16\n * also use information about the environment where the color was\n * observed, known as the viewing conditions.\n *\n * For example, white under the traditional assumption of a midday sun white\n * point is accurately measured as a slightly chromatic blue by CAM16. (roughly,\n * hue 203, chroma 3, lightness 100)\n *\n * This class caches intermediate values of the CAM16 conversion process that\n * depend only on viewing conditions, enabling speed ups.\n */\nexport default class ViewingConditions {\n /** sRGB-like viewing conditions. */\n static DEFAULT = ViewingConditions.make();\n\n /**\n * Create ViewingConditions from a simple, physically relevant, set of\n * parameters.\n * @param whitePoint White point, measured in the XYZ color space.\n * default = D65, or sunny day afternoon\n * @param {number} adaptingLuminance The luminance of the adapting field. Informally,\n * how bright it is in the room where the color is viewed. Can be\n * calculated from lux by multiplying lux by 0.0586. default = 11.72,\n * or 200 lux.\n * @param {number} backgroundLstar The lightness of the area surrounding the color.\n * measured by L* in L*a*b*. default = 50.0\n * @param {number} surround A general description of the lighting surrounding the\n * color. 0 is pitch dark, like watching a movie in a theater. 1.0 is a\n * dimly light room, like watching TV at home at night. 2.0 means there\n * is no difference between the lighting on the color and around it.\n * default = 2.0\n * @param {boolean} discountingIlluminant Whether the eye accounts for the tint of the\n * ambient lighting, such as knowing an apple is still red in green light.\n * default = false, the eye does not perform this process on\n * self-luminous objects like displays.\n * @return {ViewingConditions}\n */\n static make(\n whitePoint = utils.whitePointD65(),\n adaptingLuminance = ((200 / Math.PI) * utils.yFromLstar(50)) / 100,\n backgroundLstar = 50,\n surround = 2,\n discountingIlluminant = false,\n ) {\n const xyz = whitePoint;\n const rW = xyz[0] * 0.401_288 + xyz[1] * 0.650_173 + xyz[2] * -0.051_461;\n const gW = xyz[0] * -0.250_268 + xyz[1] * 1.204_414 + xyz[2] * 0.045_854;\n const bW = xyz[0] * -0.002_079 + xyz[1] * 0.048_952 + xyz[2] * 0.953_127;\n const f = 0.8 + surround / 10;\n const c = f >= 0.9 ? math.lerp(0.59, 0.69, (f - 0.9) * 10)\n : math.lerp(0.525, 0.59, (f - 0.8) * 10);\n let d = discountingIlluminant\n ? 1\n : f * (1 - (1 / 3.6) * Math.exp((-adaptingLuminance - 42) / 92));\n d = d > 1 ? 1 : (d < 0 ? 0 : d);\n const nc = f;\n const rgbD = [\n d * (100 / rW) + 1 - d,\n d * (100 / gW) + 1 - d,\n d * (100 / bW) + 1 - d,\n ];\n const k = 1 / (5 * adaptingLuminance + 1);\n const k4 = k * k * k * k;\n const k4F = 1 - k4;\n const fl = k4 * adaptingLuminance\n + 0.1 * k4F * k4F * Math.cbrt(5 * adaptingLuminance);\n const n = utils.yFromLstar(backgroundLstar) / whitePoint[1];\n const z = 1.48 + Math.sqrt(n);\n const nbb = 0.725 / n ** 0.2;\n const ncb = nbb;\n const rgbAFactors = [\n ((fl * rgbD[0] * rW) / 100) ** 0.42,\n ((fl * rgbD[1] * gW) / 100) ** 0.42,\n ((fl * rgbD[2] * bW) / 100) ** 0.42,\n ];\n const rgbA = [\n (400 * rgbAFactors[0]) / (rgbAFactors[0] + 27.13),\n (400 * rgbAFactors[1]) / (rgbAFactors[1] + 27.13),\n (400 * rgbAFactors[2]) / (rgbAFactors[2] + 27.13),\n ];\n const aw = (2 * rgbA[0] + rgbA[1] + 0.05 * rgbA[2]) * nbb;\n return new ViewingConditions(n, aw, nbb, ncb, c, nc, rgbD, fl, fl ** 0.25, z);\n }\n\n /**\n * Parameters are intermediate values of the CAM16 conversion process. Their\n * names are shorthand for technical color science terminology, this class\n * would not benefit from documenting them individually. A brief overview\n * is available in the CAM16 specification, and a complete overview requires\n * a color science textbook, such as Fairchild's Color Appearance Models.\n * @param {number} n\n * @param {number} aw\n * @param {number} nbb\n * @param {number} ncb\n * @param {number} c\n * @param {number} nc\n * @param {number[]} rgbD\n * @param {number} fl\n * @param {number} fLRoot\n * @param {number} z\n */\n constructor(n, aw, nbb, ncb, c, nc, rgbD, fl, fLRoot, z) {\n this.n = n;\n this.aw = aw;\n this.nbb = nbb;\n this.ncb = ncb;\n this.c = c;\n this.nc = nc;\n this.rgbD = rgbD;\n this.fl = fl;\n this.fLRoot = fLRoot;\n this.z = z;\n }\n}\n", "/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as utils from '../utils/color.js';\nimport * as math from '../utils/math.js';\n\nimport ViewingConditions from './ViewingConditions.js';\n\n/**\n * CAM16, a color appearance model. Colors are not just defined by their hex\n * code, but rather, a hex code and viewing conditions.\n *\n * CAM16 instances also have coordinates in the CAM16-UCS space, called J*, a*,\n * b*, or jstar, astar, bstar in code. CAM16-UCS is included in the CAM16\n * specification, and should be used when measuring distances between colors.\n *\n * In traditional color spaces, a color can be identified solely by the\n * observer's measurement of the color. Color appearance models such as CAM16\n * also use information about the environment where the color was\n * observed, known as the viewing conditions.\n *\n * For example, white under the traditional assumption of a midday sun white\n * point is accurately measured as a slightly chromatic blue by CAM16. (roughly,\n * hue 203, chroma 3, lightness 100)\n */\nexport default class Cam16 {\n /**\n * @param {number} argb ARGB representation of a color.\n * @return {Cam16} CAM16 color, assuming the color was viewed in default viewing\n * conditions.\n */\n static fromInt(argb) {\n return Cam16.fromIntInViewingConditions(argb, ViewingConditions.DEFAULT);\n }\n\n /**\n * @param {number} argb ARGB representation of a color.\n * @param {ViewingConditions} viewingConditions Information about the environment where the color\n * was observed.\n * @return {Cam16} CAM16 color.\n */\n static fromIntInViewingConditions(argb, viewingConditions) {\n const red = (argb & 0x00_FF_00_00) >> 16;\n const green = (argb & 0x00_00_FF_00) >> 8;\n const blue = (argb & 0x00_00_00_FF);\n const redL = utils.linearized(red);\n const greenL = utils.linearized(green);\n const blueL = utils.linearized(blue);\n const x = 0.412_338_95 * redL + 0.357_620_64 * greenL + 0.180_510_42 * blueL;\n const y = 0.2126 * redL + 0.7152 * greenL + 0.0722 * blueL;\n const z = 0.019_321_41 * redL + 0.119_163_82 * greenL + 0.950_344_78 * blueL;\n\n const rC = 0.401_288 * x + 0.650_173 * y - 0.051_461 * z;\n const gC = -0.250_268 * x + 1.204_414 * y + 0.045_854 * z;\n const bC = -0.002_079 * x + 0.048_952 * y + 0.953_127 * z;\n\n const rD = viewingConditions.rgbD[0] * rC;\n const gD = viewingConditions.rgbD[1] * gC;\n const bD = viewingConditions.rgbD[2] * bC;\n\n const rAF = ((viewingConditions.fl * Math.abs(rD)) / 100) ** 0.42;\n const gAF = ((viewingConditions.fl * Math.abs(gD)) / 100) ** 0.42;\n const bAF = ((viewingConditions.fl * Math.abs(bD)) / 100) ** 0.42;\n\n const rA = (math.signum(rD) * 400 * rAF) / (rAF + 27.13);\n const gA = (math.signum(gD) * 400 * gAF) / (gAF + 27.13);\n const bA = (math.signum(bD) * 400 * bAF) / (bAF + 27.13);\n\n const a = (11 * rA + -12 * gA + bA) / 11;\n const b = (rA + gA - 2 * bA) / 9;\n const u = (20 * rA + 20 * gA + 21 * bA) / 20;\n const p2 = (40 * rA + 20 * gA + bA) / 20;\n const atan2 = Math.atan2(b, a);\n const atanDegrees = (atan2 * 180) / Math.PI;\n const hue = atanDegrees < 0 ? atanDegrees + 360\n : (atanDegrees >= 360 ? atanDegrees - 360\n : atanDegrees);\n const hueRadians = (hue * Math.PI) / 180;\n\n const ac = p2 * viewingConditions.nbb;\n const j = 100\n * (ac / viewingConditions.aw) ** (viewingConditions.c * viewingConditions.z);\n const q = (4 / viewingConditions.c) * Math.sqrt(j / 100)\n * (viewingConditions.aw + 4) * viewingConditions.fLRoot;\n const huePrime = hue < 20.14 ? hue + 360 : hue;\n const eHue = 0.25 * (Math.cos((huePrime * Math.PI) / 180 + 2) + 3.8);\n const p1 = (50_000 / 13) * eHue * viewingConditions.nc * viewingConditions.ncb;\n const t = (p1 * Math.sqrt(a * a + b * b)) / (u + 0.305);\n const alpha = t ** 0.9\n * (1.64 - 0.29 ** viewingConditions.n) ** 0.73;\n const c = alpha * Math.sqrt(j / 100);\n const m = c * viewingConditions.fLRoot;\n const s = 50\n * Math.sqrt((alpha * viewingConditions.c) / (viewingConditions.aw + 4));\n const jstar = ((1 + 100 * 0.007) * j) / (1 + 0.007 * j);\n const mstar = (1 / 0.0228) * Math.log(1 + 0.0228 * m);\n const astar = mstar * Math.cos(hueRadians);\n const bstar = mstar * Math.sin(hueRadians);\n\n return new Cam16(hue, c, j, q, m, s, jstar, astar, bstar);\n }\n\n /**\n * @param {number} j CAM16 lightness\n * @param {number} c CAM16 chroma\n * @param {number} h CAM16 hue\n * @return {Cam16}\n */\n static fromJch(j, c, h) {\n return Cam16.fromJchInViewingConditions(j, c, h, ViewingConditions.DEFAULT);\n }\n\n /**\n * @param {number} j CAM16 lightness\n * @param {number} c CAM16 chroma\n * @param {number} h CAM16 hue\n * @param {ViewingConditions} viewingConditions Information about the environment where the color\n * was observed.\n */\n static fromJchInViewingConditions(j, c, h, viewingConditions) {\n const q = (4 / viewingConditions.c) * Math.sqrt(j / 100)\n * (viewingConditions.aw + 4) * viewingConditions.fLRoot;\n const m = c * viewingConditions.fLRoot;\n const alpha = c / Math.sqrt(j / 100);\n const s = 50\n * Math.sqrt((alpha * viewingConditions.c) / (viewingConditions.aw + 4));\n const hueRadians = (h * Math.PI) / 180;\n const jstar = ((1 + 100 * 0.007) * j) / (1 + 0.007 * j);\n const mstar = (1 / 0.0228) * Math.log(1 + 0.0228 * m);\n const astar = mstar * Math.cos(hueRadians);\n const bstar = mstar * Math.sin(hueRadians);\n return new Cam16(h, c, j, q, m, s, jstar, astar, bstar);\n }\n\n /**\n * @param {number} jstar CAM16-UCS lightness.\n * @param {number} astar CAM16-UCS a dimension. Like a* in L*a*b*, it is a Cartesian\n * coordinate on the Y axis.\n * @param {number} bstar CAM16-UCS b dimension. Like a* in L*a*b*, it is a Cartesian\n * coordinate on the X axis.\n * @return {Cam16}\n */\n static fromUcs(jstar, astar, bstar) {\n return Cam16.fromUcsInViewingConditions(jstar, astar, bstar, ViewingConditions.DEFAULT);\n }\n\n /**\n * @param {number} jstar CAM16-UCS lightness.\n * @param {number} astar CAM16-UCS a dimension. Like a* in L*a*b*, it is a Cartesian\n * coordinate on the Y axis.\n * @param {number} bstar CAM16-UCS b dimension. Like a* in L*a*b*, it is a Cartesian\n * coordinate on the X axis.\n * @param {ViewingConditions} viewingConditions Information about the environment where the color\n * was observed.\n */\n static fromUcsInViewingConditions(jstar, astar, bstar, viewingConditions) {\n const a = astar;\n const b = bstar;\n const m = Math.sqrt(a * a + b * b);\n const M = (Math.exp(m * 0.0228) - 1) / 0.0228;\n const c = M / viewingConditions.fLRoot;\n let h = Math.atan2(b, a) * (180 / Math.PI);\n if (h < 0) {\n h += 360;\n }\n const j = jstar / (1 - (jstar - 100) * 0.007);\n return Cam16.fromJchInViewingConditions(j, c, h, viewingConditions);\n }\n\n /**\n * Given color expressed in XYZ and viewed in [viewingConditions], convert to\n * CAM16.\n * @param {number} x\n * @param {number} y\n * @param {number} z\n * @param {ViewingConditions} viewingConditions\n * @return {Cam16}\n */\n static fromXyzInViewingConditions(x, y, z, viewingConditions) {\n // Transform XYZ to 'cone'/'rgb' responses\n\n const rC = 0.401_288 * x + 0.650_173 * y - 0.051_461 * z;\n const gC = -0.250_268 * x + 1.204_414 * y + 0.045_854 * z;\n const bC = -0.002_079 * x + 0.048_952 * y + 0.953_127 * z;\n\n // Discount illuminant\n const rD = viewingConditions.rgbD[0] * rC;\n const gD = viewingConditions.rgbD[1] * gC;\n const bD = viewingConditions.rgbD[2] * bC;\n\n // chromatic adaptation\n const rAF = ((viewingConditions.fl * Math.abs(rD)) / 100) ** 0.42;\n const gAF = ((viewingConditions.fl * Math.abs(gD)) / 100) ** 0.42;\n const bAF = ((viewingConditions.fl * Math.abs(bD)) / 100) ** 0.42;\n const rA = (math.signum(rD) * 400 * rAF) / (rAF + 27.13);\n const gA = (math.signum(gD) * 400 * gAF) / (gAF + 27.13);\n const bA = (math.signum(bD) * 400 * bAF) / (bAF + 27.13);\n\n // redness-greenness\n const a = (11 * rA + -12 * gA + bA) / 11;\n // yellowness-blueness\n const b = (rA + gA - 2 * bA) / 9;\n\n // auxiliary components\n const u = (20 * rA + 20 * gA + 21 * bA) / 20;\n const p2 = (40 * rA + 20 * gA + bA) / 20;\n\n // hue\n const atan2 = Math.atan2(b, a);\n const atanDegrees = (atan2 * 180) / Math.PI;\n const hue = atanDegrees < 0 ? atanDegrees + 360\n : (atanDegrees >= 360 ? atanDegrees - 360\n : atanDegrees);\n const hueRadians = (hue * Math.PI) / 180;\n\n // achromatic response to color\n const ac = p2 * viewingConditions.nbb;\n\n // CAM16 lightness and brightness\n const J = 100\n * (ac / viewingConditions.aw) ** (viewingConditions.c * viewingConditions.z);\n const Q = (4 / viewingConditions.c) * Math.sqrt(J / 100)\n * (viewingConditions.aw + 4) * (viewingConditions.fLRoot);\n\n const huePrime = (hue < 20.14) ? hue + 360 : hue;\n const eHue = (1 / 4) * (Math.cos((huePrime * Math.PI) / 180 + 2) + 3.8);\n const p1 = (50_000 / 13) * eHue * viewingConditions.nc * viewingConditions.ncb;\n const t = (p1 * Math.sqrt(a * a + b * b)) / (u + 0.305);\n const alpha = t ** 0.9\n * (1.64 - 0.29 ** viewingConditions.n) ** 0.73;\n // CAM16 chroma, colorfulness, chroma\n const C = alpha * Math.sqrt(J / 100);\n const M = C * viewingConditions.fLRoot;\n const s = 50\n * Math.sqrt((alpha * viewingConditions.c) / (viewingConditions.aw + 4));\n\n // CAM16-UCS components\n const jstar = ((1 + 100 * 0.007) * J) / (1 + 0.007 * J);\n const mstar = Math.log(1 + 0.0228 * M) / 0.0228;\n const astar = mstar * Math.cos(hueRadians);\n const bstar = mstar * Math.sin(hueRadians);\n return new Cam16(hue, C, J, Q, M, s, jstar, astar, bstar);\n }\n\n /**\n * All of the CAM16 dimensions can be calculated from 3 of the dimensions, in\n * the following combinations:\n * - {j or q} and {c, m, or s} and hue\n * - jstar, astar, bstar\n * Prefer using a static method that constructs from 3 of those dimensions.\n * This constructor is intended for those methods to use to return all\n * possible dimensions.\n * @param {number} hue\n * @param {number} chroma informally, colorfulness / color intensity. like saturation\n * in HSL, except perceptually accurate.\n * @param {number} j lightness\n * @param {number} q brightness; ratio of lightness to white point's lightness\n * @param {number} m colorfulness\n * @param {number} s saturation; ratio of chroma to white point's chroma\n * @param {number} jstar CAM16-UCS J coordinate\n * @param {number} astar CAM16-UCS a coordinate\n * @param {number} bstar CAM16-UCS b coordinate\n */\n constructor(hue, chroma, j, q, m, s, jstar, astar, bstar) {\n /** @readonly */\n this.hue = hue;\n /** @readonly */\n this.chroma = chroma;\n /** @readonly */\n this.j = j;\n /** @readonly */\n this.q = q;\n /** @readonly */\n this.m = m;\n /** @readonly */\n this.s = s;\n /** @readonly */\n this.jstar = jstar;\n /** @readonly */\n this.astar = astar;\n /** @readonly */\n this.bstar = bstar;\n }\n\n /**\n * CAM16 instances also have coordinates in the CAM16-UCS space, called J*,\n * a*, b*, or jstar, astar, bstar in code. CAM16-UCS is included in the CAM16\n * specification, and is used to measure distances between colors.\n * @param {Cam16} other\n * @return {number}\n */\n distance(other) {\n const dJ = this.jstar - other.jstar;\n const dA = this.astar - other.astar;\n const dB = this.bstar - other.bstar;\n const dEPrime = Math.sqrt(dJ * dJ + dA * dA + dB * dB);\n const dE = 1.41 * dEPrime ** 0.63;\n return dE;\n }\n\n /**\n * @return {number} ARGB representation of color, assuming the color was viewed in\n * default viewing conditions, which are near-identical to the default\n * viewing conditions for sRGB.\n */\n toInt() {\n return this.viewed(ViewingConditions.DEFAULT);\n }\n\n /**\n * @param {ViewingConditions} viewingConditions Information about the environment where the color\n * will be viewed.\n * @return {number} ARGB representation of color\n */\n viewed(viewingConditions) {\n const alpha = this.chroma === 0 || this.j === 0\n ? 0\n : this.chroma / Math.sqrt(this.j / 100);\n\n const t = (alpha / (1.64 - 0.29 ** viewingConditions.n) ** 0.73) ** (1 / 0.9);\n const hRad = (this.hue * Math.PI) / 180;\n\n const eHue = 0.25 * (Math.cos(hRad + 2) + 3.8);\n const ac = viewingConditions.aw\n * (this.j / 100) ** (1 / viewingConditions.c / viewingConditions.z);\n const p1 = eHue * (50_000 / 13) * viewingConditions.nc * viewingConditions.ncb;\n const p2 = ac / viewingConditions.nbb;\n\n const hSin = Math.sin(hRad);\n const hCos = Math.cos(hRad);\n\n const gamma = (23 * (p2 + 0.305) * t)\n / (23 * p1 + 11 * t * hCos + 108 * t * hSin);\n const a = gamma * hCos;\n const b = gamma * hSin;\n const rA = (460 * p2 + 451 * a + 288 * b) / 1403;\n const gA = (460 * p2 - 891 * a - 261 * b) / 1403;\n const bA = (460 * p2 - 220 * a - 6300 * b) / 1403;\n\n const rCBase = Math.max(0, (27.13 * Math.abs(rA)) / (400 - Math.abs(rA)));\n const rC = math.signum(rA) * (100 / viewingConditions.fl)\n * rCBase ** (1 / 0.42);\n const gCBase = Math.max(0, (27.13 * Math.abs(gA)) / (400 - Math.abs(gA)));\n const gC = math.signum(gA) * (100 / viewingConditions.fl)\n * gCBase ** (1 / 0.42);\n const bCBase = Math.max(0, (27.13 * Math.abs(bA)) / (400 - Math.abs(bA)));\n const bC = math.signum(bA) * (100 / viewingConditions.fl)\n * bCBase ** (1 / 0.42);\n const rF = rC / viewingConditions.rgbD[0];\n const gF = gC / viewingConditions.rgbD[1];\n const bF = bC / viewingConditions.rgbD[2];\n\n const x = 1.862_067_86 * rF - 1.011_254_63 * gF + 0.149_186_77 * bF;\n const y = 0.387_526_54 * rF + 0.621_447_44 * gF - 0.008_973_98 * bF;\n const z = -0.015_841_5 * rF - 0.034_122_94 * gF + 1.049_964_44 * bF;\n\n const argb = utils.argbFromXyz(x, y, z);\n return argb;\n }\n\n /**\n * XYZ representation of CAM16 seen in [viewingConditions].\n * @param {ViewingConditions} viewingConditions\n * @return {number[]}\n */\n xyzInViewingConditions(viewingConditions) {\n const alpha = (this.chroma === 0 || this.j === 0)\n ? 0\n : this.chroma / Math.sqrt(this.j / 100);\n\n const t = (alpha / (1.64 - 0.29 ** viewingConditions.n) ** 0.73) ** (1 / 0.9);\n const hRad = (this.hue * Math.PI) / 180;\n\n const eHue = 0.25 * (Math.cos(hRad + 2) + 3.8);\n const ac = viewingConditions.aw\n * (this.j / 100) ** (1 / viewingConditions.c / viewingConditions.z);\n const p1 = eHue * (50_000 / 13) * viewingConditions.nc * viewingConditions.ncb;\n\n const p2 = (ac / viewingConditions.nbb);\n\n const hSin = Math.sin(hRad);\n const hCos = Math.cos(hRad);\n\n const gamma = (23 * (p2 + 0.305) * t)\n / (23 * p1 + 11 * t * hCos + 108 * t * hSin);\n const a = gamma * hCos;\n const b = gamma * hSin;\n const rA = (460 * p2 + 451 * a + 288 * b) / 1403;\n const gA = (460 * p2 - 891 * a - 261 * b) / 1403;\n const bA = (460 * p2 - 220 * a - 6300 * b) / 1403;\n\n const rCBase = Math.max(0, (27.13 * Math.abs(rA)) / (400 - Math.abs(rA)));\n const rC = math.signum(rA) * (100 / viewingConditions.fl)\n * rCBase ** (1 / 0.42);\n const gCBase = Math.max(0, (27.13 * Math.abs(gA)) / (400 - Math.abs(gA)));\n const gC = math.signum(gA) * (100 / viewingConditions.fl)\n * gCBase ** (1 / 0.42);\n const bCBase = Math.max(0, (27.13 * Math.abs(bA)) / (400 - Math.abs(bA)));\n const bC = math.signum(bA) * (100 / viewingConditions.fl)\n * bCBase ** (1 / 0.42);\n const rF = rC / viewingConditions.rgbD[0];\n const gF = gC / viewingConditions.rgbD[1];\n const bF = bC / viewingConditions.rgbD[2];\n\n const x = 1.862_067_86 * rF - 1.011_254_63 * gF + 0.149_186_77 * bF;\n const y = 0.387_526_54 * rF + 0.621_447_44 * gF - 0.008_973_98 * bF;\n const z = -0.015_841_5 * rF - 0.034_122_94 * gF + 1.049_964_44 * bF;\n\n return [x, y, z];\n }\n}\n", "/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as colorUtils from '../utils/color.js';\nimport * as mathUtils from '../utils/math.js';\n\nimport Cam16 from './Cam16.js';\nimport ViewingConditions from './ViewingConditions.js';\n\nexport const SCALED_DISCOUNT_FROM_LINRGB = [\n [\n 0.001_200_833_568_784_504,\n 0.002_389_694_492_170_889,\n 0.000_279_574_288_586_112_4,\n ],\n [\n 0.000_589_108_665_137_599_9,\n 0.002_978_550_257_343_875_8,\n 0.000_327_066_610_400_839_8,\n ],\n [\n 0.000_101_466_924_916_405_72,\n 0.000_536_421_435_918_669_4,\n 0.003_297_940_177_071_207_6,\n ],\n];\n\nexport const LINRGB_FROM_SCALED_DISCOUNT = [\n [\n 1373.219_870_959_423_1,\n -1100.425_119_075_482_1,\n -7.278_681_089_101_213,\n ],\n [\n -271.815_969_077_903,\n 559.658_046_594_073_3,\n -32.460_474_827_911_94,\n ],\n [\n 1.962_289_959_966_566_6,\n -57.173_814_538_844_006,\n 308.723_319_781_238_5,\n ],\n];\n\nexport const Y_FROM_LINRGB = [0.2126, 0.7152, 0.0722];\n\nexport const CRITICAL_PLANES = [\n 0.015_176_349_177_441_876, 0.045_529_047_532_325_624, 0.075_881_745_887_209_38,\n 0.106_234_444_242_093_13, 0.136_587_142_596_976_85, 0.166_939_840_951_860_62,\n 0.197_292_539_306_744_34, 0.227_645_237_661_628_1, 0.257_997_936_016_511_9,\n 0.288_350_634_371_395_63, 0.318_830_090_443_053_2, 0.350_925_934_958_123,\n 0.384_831_493_309_642_6, 0.420_574_803_010_494_66, 0.458_183_274_052_838,\n 0.497_683_725_027_402_3, 0.539_102_415_980_638_1, 0.582_465_078_404_089_8,\n 0.627_796_942_691_410_7, 0.675_122_763_349_862_3, 0.724_466_842_212_892_1,\n 0.775_853_049_866_786, 0.829_304_845_476_233, 0.884_845_295_169_849_8,\n 0.942_497_089_126_609, 1.002_282_557_486_903_9, 1.064_223_685_197_357_7,\n 1.128_342_125_885_829_7, 1.194_659_214_852_212_8, 1.263_195_981_251_186_4,\n 1.333_973_159_534_903_4, 1.407_011_200_216_447, 1.482_330_280_008_641_5,\n 1.559_950_311_387_327_2, 1.639_890_951_623_367_7, 1.722_171_611_323_410_5,\n 1.806_811_462_515_637_7, 1.893_829_446_313_407_3, 1.983_244_280_186_685_2,\n 2.075_074_464_868_551, 2.169_338_290_921_623_4, 2.266_053_844_987_206_3,\n 2.365_239_015_737_95, 2.466_911_499_553_200_7, 2.571_088_805_934_576_4,\n 2.677_788_262_677_978_5, 2.787_027_020_816_925_7, 2.898_822_059_350_997,\n 3.013_190_189_772_090_7, 3.130_148_060_400_286_3, 3.249_712_160_540_222_6,\n 3.371_898_824_468_108_7, 3.496_724_235_258_794_6, 3.624_204_428_461_639,\n 3.754_355_295_633_311, 3.887_192_587_735_158, 4.022_731_918_402_185,\n 4.160_988_767_090_289, 4.301_978_482_107_941, 4.445_716_283_538_092,\n 4.592_217_266_055_746, 4.741_496_401_646_282, 4.893_568_542_229_298,\n 5.048_448_422_192_488, 5.206_150_660_839_72, 5.366_689_764_757_337_5,\n 5.530_080_130_102_386_5, 5.696_336_044_816_294, 5.865_471_690_767_354,\n 6.037_501_145_825_082, 6.212_438_385_869_475, 6.390_297_286_737_924,\n 6.571_091_626_112_461, 6.754_835_085_349_804_5, 6.941_541_251_256_611,\n 7.131_223_617_812_143, 7.323_895_587_840_543, 7.519_570_474_634_666_5,\n 7.718_261_503_533_434_5, 7.919_981_813_454_504, 8.124_744_458_384_042,\n 8.332_562_408_825_165, 8.543_448_553_206_703, 8.757_415_699_253_682,\n 8.974_476_575_321_063, 9.194_643_831_691_977, 9.417_930_041_841_839,\n 9.644_347_703_669_503, 9.873_909_240_696_694, 10.106_627_003_236_781,\n 10.342_513_269_534_024, 10.581_580_246_874_27, 10.823_840_072_668_1,\n 11.069_304_815_507_364, 11.317_986_476_196_008, 11.569_896_988_756_009,\n 11.825_048_221_409_341, 12.083_451_977_536_606, 12.345_119_996_613_247,\n 12.610_063_955_123_938, 12.878_295_467_455_942, 13.149_826_086_772_048,\n 13.424_667_305_863_72, 13.702_830_557_985_108, 13.984_327_217_668_513,\n 14.269_168_601_521_828, 14.557_365_969_008_56, 14.848_930_523_210_871,\n 15.143_873_411_576_273, 15.442_205_726_648_32, 15.743_938_506_781_891,\n 16.049_082_736_843_37, 16.357_649_348_896_34, 16.669_649_222_873_04,\n 16.985_093_187_232_053, 17.303_992_019_602_69, 17.626_356_447_416_25,\n 17.952_197_148_524_76, 18.281_524_751_807_332, 18.614_349_837_764_564,\n 18.950_682_939_101_38, 19.290_534_541_298_456, 19.633_915_083_172_692,\n 19.980_834_957_426_89, 20.331_304_511_189_067, 20.685_334_046_541_502,\n 21.042_933_821_039_977, 21.404_114_048_223_256, 21.768_884_898_113_22,\n 22.137_256_497_705_877, 22.509_238_931_453_28, 22.884_842_241_736_916,\n 23.264_076_429_332_462, 23.646_951_453_866_3, 24.033_477_234_264_016,\n 24.423_663_649_190_83, 24.817_520_537_484_558, 25.215_057_698_580_89,\n 25.616_284_892_931_38, 26.021_211_842_414_342, 26.429_848_230_738_664,\n 26.842_203_703_840_827, 27.258_287_870_275_353, 27.678_110_301_598_522,\n 28.101_680_532_745_97, 28.529_008_062_403_893, 28.960_102_353_374_22,\n 29.394_972_832_933_96, 29.833_628_893_188_45, 30.276_079_891_419_332,\n 30.722_335_150_426_627, 31.172_403_958_865_512, 31.626_295_571_577_85,\n 32.084_019_209_918_37, 32.545_584_062_075_92, 33.010_999_283_389_665,\n 33.480_273_996_660_3, 33.953_417_292_456_834, 34.430_438_229_418_264,\n 34.911_345_834_551_085, 35.396_149_103_522_07, 35.884_857_000_946_71,\n 36.377_478_460_673_49, 36.874_022_386_063_82, 37.374_497_650_267_89,\n 37.878_913_096_496_59, 38.387_277_538_289_26, 38.899_599_759_777_85,\n 39.415_888_515_946_97, 39.936_152_532_890_54, 40.460_400_508_064_545,\n 40.988_641_110_536_29, 41.520_882_981_230_194, 42.057_134_733_170_16,\n 42.597_404_951_718_396, 43.141_702_194_811_224, 43.690_034_993_191_3,\n 44.242_411_850_636_97, 44.798_841_244_188_324, 45.359_331_624_370_17,\n 45.923_891_415_412_09, 46.492_529_015_465_52, 47.065_252_796_817_916,\n 47.642_071_106_104_09, 48.222_992_264_514_68, 48.808_024_568_002_054,\n 49.397_176_287_483_3, 49.990_455_669_040_8, 50.587_870_934_119_984,\n 51.189_430_279_724_725, 51.795_141_878_610_14, 52.405_013_879_472_88,\n 53.019_054_407_139_2, 53.637_271_562_750_364, 54.259_673_423_945_976,\n 54.886_268_045_044_93, 55.517_063_457_223_934, 56.152_067_668_694_24,\n 56.791_288_664_875_74, 57.434_734_408_569_16, 58.082_412_840_126_21,\n 58.734_331_877_617_365, 59.390_499_416_998_07, 60.050_923_332_272_51,\n 60.715_611_475_655_585, 61.384_571_677_733_11, 62.057_811_747_619_894,\n 62.735_339_473_115_9, 63.417_162_620_860_914, 64.103_288_936_486_92,\n 64.793_726_144_769_21, 65.488_481_949_775_29, 66.187_564_035_012_24,\n 66.890_980_063_572_58, 67.598_737_678_278_08, 68.310_844_501_822_22,\n 69.027_308_136_910_93, 69.748_136_166_401_64, 70.473_336_153_441_07,\n 71.202_915_641_601_04, 71.936_882_155_013_12, 72.675_243_198_501_72,\n 73.418_006_257_715_42, 74.165_178_799_257_33, 74.916_768_270_813_6,\n 75.672_782_101_280_72, 76.433_227_700_891_46, 77.198_112_461_339_3,\n 77.967_443_755_901_67, 78.741_228_939_561_74, 79.519_475_349_129_04,\n 80.302_190_303_358_69, 81.089_381_103_069_34, 81.881_055_031_259_99,\n 82.677_219_353_225_41, 83.477_881_316_670_6, 84.283_048_151_823_72,\n 85.092_727_071_548_08, 85.906_925_271_453_02, 86.725_649_930_003_43,\n 87.548_908_208_628_19, 88.376_707_251_827_7, 89.209_054_187_280_1,\n 90.045_956_125_946_55, 90.887_420_162_175_18, 91.733_453_373_804_38,\n 92.584_062_822_264_91, 93.439_255_552_680_66, 94.299_038_593_969_02,\n 95.163_418_958_939_69, 96.032_403_644_392_74, 96.905_999_631_215_9,\n 97.784_213_884_480_44, 98.667_053_353_536_6, 99.554_524_972_107_76,\n];\n\n/**\n * Sanitizes a small enough angle in radians.\n * @param {number} angle An angle in radians; must not deviate too much\n * from 0.\n * @return {number} A coterminal angle between 0 and 2pi.\n */\nfunction sanitizeRadians(angle) {\n return (angle + Math.PI * 8) % (Math.PI * 2);\n}\n\n/**\n * Delinearizes an RGB component, returning a floating-point\n * number.\n * @param {number} rgbComponent 0.0 <= rgb_component <= 100.0, represents\n * linear R/G/B channel\n * @return {number} 0.0 <= output <= 255.0, color channel converted to\n * regular RGB space\n */\nfunction trueDelinearized(rgbComponent) {\n const normalized = rgbComponent / 100;\n let delinearized = 0;\n delinearized = normalized <= 0.003_130_8 ? normalized * 12.92 : 1.055 * normalized ** (1 / 2.4) - 0.055;\n return delinearized * 255;\n}\n\n/**\n * @param {number} component\n * @return {number}\n */\nfunction chromaticAdaptation(component) {\n const af = Math.abs(component) ** 0.42;\n return mathUtils.signum(component) * 400 * af / (af + 27.13);\n}\n\n/**\n * Returns the hue of a linear RGB color in CAM16.\n * @param {number[]} linrgb The linear RGB coordinates of a color.\n * @return {number} The hue of the color in CAM16, in radians.\n */\nfunction hueOf(linrgb) {\n const scaledDiscount = mathUtils.matrixMultiply(linrgb, SCALED_DISCOUNT_FROM_LINRGB);\n const rA = chromaticAdaptation(scaledDiscount[0]);\n const gA = chromaticAdaptation(scaledDiscount[1]);\n const bA = chromaticAdaptation(scaledDiscount[2]);\n // redness-greenness\n const a = (11 * rA + -12 * gA + bA) / 11;\n // yellowness-blueness\n const b = (rA + gA - 2 * bA) / 9;\n return Math.atan2(b, a);\n}\n\n/**\n *\n * @param {number} a\n * @param {number} b\n * @param {number} c\n * @return {boolean}\n */\nfunction areInCyclicOrder(a, b, c) {\n const deltaAB = sanitizeRadians(b - a);\n const deltaAC = sanitizeRadians(c - a);\n return deltaAB < deltaAC;\n}\n\n/**\n * Solves the lerp equation.\n * @param {number} source The starting number.\n * @param {number} mid The number in the middle.\n * @param {number} target The ending number.\n * @return {number} A number t such that lerp(source, target, t) = mid.\n */\nfunction intercept(source, mid, target) {\n return (mid - source) / (target - source);\n}\n\n/**\n *\n * @param {number[]} source\n * @param {number} t\n * @param {number[]} target\n * @return {[number,number,number]}\n */\nfunction lerpPoint(source, t, target) {\n return [\n source[0] + (target[0] - source[0]) * t,\n source[1] + (target[1] - source[1]) * t,\n source[2] + (target[2] - source[2]) * t,\n ];\n}\n\n/**\n * Intersects a segment with a plane.\n * @param {number[]} source The coordinates of point A.\n * @param {number} coordinate The R-, G-, or B-coordinate of the plane.\n * @param {number[]} target The coordinates of point B.\n * @param {number} axis The axis the plane is perpendicular with. (0: R, 1:\n * G, 2: B)\n * @return {number[]} The intersection point of the segment AB with the plane\n * R=coordinate, G=coordinate, or B=coordinate\n */\nfunction setCoordinate(source, coordinate, target, axis) {\n const t = intercept(source[axis], coordinate, target[axis]);\n return lerpPoint(source, t, target);\n}\n\n/**\n * @param {number} x\n * @return {boolean}\n */\nfunction isBounded(x) {\n return x >= 0 && x <= 100;\n}\n\n/**\n * Returns the nth possible vertex of the polygonal intersection.\n * @param {number} y The Y value of the plane\n * @param {number} n The zero-based index of the point. 0 <= n <= 11.\n * @return {number[]} The nth possible vertex of the polygonal intersection\n * of the y plane and the RGB cube, in linear RGB coordinates, if\n * it exists. If this possible vertex lies outside of the cube,\n * [-1.0, -1.0, -1.0] is returned.\n */\nfunction nthVertex(y, n) {\n const kR = Y_FROM_LINRGB[0];\n const kG = Y_FROM_LINRGB[1];\n const kB = Y_FROM_LINRGB[2];\n const coordA = n % 4 <= 1 ? 0 : 100;\n const coordB = n % 2 === 0 ? 0 : 100;\n if (n < 4) {\n const g = coordA;\n const b = coordB;\n const r = (y - g * kG - b * kB) / kR;\n if (isBounded(r)) {\n return [r, g, b];\n }\n return [-1, -1, -1];\n }\n if (n < 8) {\n const b = coordA;\n const r = coordB;\n const g = (y - r * kR - b * kB) / kG;\n if (isBounded(g)) {\n return [r, g, b];\n }\n return [-1, -1, -1];\n }\n const r = coordA;\n const g = coordB;\n const b = (y - r * kR - g * kG) / kB;\n if (isBounded(b)) {\n return [r, g, b];\n }\n return [-1, -1, -1];\n}\n\n/**\n * Finds the segment containing the desired color.\n * @param {number} y The Y value of the color.\n * @param {number} targetHue The hue of the color.\n * @return {[number[], number[]]} A list of two sets of linear RGB coordinates, each\n * corresponding to an endpoint of the segment containing the\n * desired color.\n */\nfunction bisectToSegment(y, targetHue) {\n let left = [-1, -1, -1];\n let right = left;\n let leftHue = 0;\n let rightHue = 0;\n let initialized = false;\n let uncut = true;\n\n for (let n = 0; n < 12; n++) {\n const mid = nthVertex(y, n);\n if (mid[0] < 0) {\n continue;\n }\n const midHue = hueOf(mid);\n if (!initialized) {\n left = mid;\n right = mid;\n leftHue = midHue;\n rightHue = midHue;\n initialized = true;\n continue;\n }\n if (uncut || areInCyclicOrder(leftHue, midHue, rightHue)) {\n uncut = false;\n if (areInCyclicOrder(leftHue, targetHue, midHue)) {\n right = mid;\n rightHue = midHue;\n } else {\n left = mid;\n leftHue = midHue;\n }\n }\n }\n return [left, right];\n}\n\n/**\n *\n * @param {number[]} a\n * @param {number[]} b\n * @return {number[]}\n */\nfunction midpoint(a, b) {\n return [\n (a[0] + b[0]) / 2,\n (a[1] + b[1]) / 2,\n (a[2] + b[2]) / 2,\n ];\n}\n\n/**\n * @param {number} x\n * @return {number}\n */\nfunction criticalPlaneBelow(x) {\n return Math.floor(x - 0.5);\n}\n\n/**\n * @param {number} x\n * @return {number}\n */\nfunction criticalPlaneAbove(x) {\n return Math.ceil(x - 0.5);\n}\n\n/**\n * Finds a color with the given Y and hue on the boundary of the\n * cube.\n * @param {number} y The Y value of the color.\n * @param {number} targetHue The hue of the color.\n * @return {number[]} The desired color, in linear RGB coordinates.\n */\nfunction bisectToLimit(y, targetHue) {\n const segment = bisectToSegment(y, targetHue);\n let left = segment[0];\n let leftHue = hueOf(left);\n let right = segment[1];\n for (let axis = 0; axis < 3; axis++) {\n if (left[axis] !== right[axis]) {\n let lPlane = -1;\n let rPlane = 255;\n if (left[axis] < right[axis]) {\n lPlane = criticalPlaneBelow(\n trueDelinearized(left[axis]),\n );\n rPlane = criticalPlaneAbove(\n trueDelinearized(right[axis]),\n );\n } else {\n lPlane = criticalPlaneAbove(\n trueDelinearized(left[axis]),\n );\n rPlane = criticalPlaneBelow(\n trueDelinearized(right[axis]),\n );\n }\n for (let i = 0; i < 8; i++) {\n if (Math.abs(rPlane - lPlane) <= 1) {\n break;\n } else {\n const mPlane = Math.floor((lPlane + rPlane) / 2);\n const midPlaneCoordinate = CRITICAL_PLANES[mPlane];\n const mid = setCoordinate(left, midPlaneCoordinate, right, axis);\n const midHue = hueOf(mid);\n if (areInCyclicOrder(leftHue, targetHue, midHue)) {\n right = mid;\n rPlane = mPlane;\n } else {\n left = mid;\n leftHue = midHue;\n lPlane = mPlane;\n }\n }\n }\n }\n }\n return midpoint(left, right);\n}\n\n/**\n * @param {number} adapted\n * @return {number}\n */\nfunction inverseChromaticAdaptation(adapted) {\n const adaptedAbs = Math.abs(adapted);\n const base = Math.max(0, 27.13 * adaptedAbs / (400 - adaptedAbs));\n return mathUtils.signum(adapted) * base ** (1 / 0.42);\n}\n\n/**\n * Finds a color with the given hue, chroma, and Y.\n * @param {number} hueRadians The desired hue in radians.\n * @param {number} chroma The desired chroma.\n * @param {number} y The desired Y.\n * @return {number} The desired color as a hexadecimal integer, if found; 0\n * otherwise.\n */\nfunction findResultByJ(hueRadians, chroma, y) {\n // Initial estimate of j.\n let j = Math.sqrt(y) * 11;\n // ===========================================================\n // Operations inlined from Cam16 to avoid repeated calculation\n // ===========================================================\n const viewingConditions = ViewingConditions.DEFAULT;\n const tInnerCoeff = 1 / (1.64 - 0.29 ** viewingConditions.n) ** 0.73;\n const eHue = 0.25 * (Math.cos(hueRadians + 2) + 3.8);\n const p1 = eHue * (50_000 / 13) * viewingConditions.nc * viewingConditions.ncb;\n const hSin = Math.sin(hueRadians);\n const hCos = Math.cos(hueRadians);\n for (let iterationRound = 0; iterationRound < 5; iterationRound++) {\n // ===========================================================\n // Operations inlined from Cam16 to avoid repeated calculation\n // ===========================================================\n const jNormalized = j / 100;\n const alpha = chroma === 0 || j === 0 ? 0 : chroma / Math.sqrt(jNormalized);\n const t = (alpha * tInnerCoeff) ** (1 / 0.9);\n const ac = viewingConditions.aw\n * jNormalized ** (1 / viewingConditions.c / viewingConditions.z);\n const p2 = ac / viewingConditions.nbb;\n const gamma = (23 * (p2 + 0.305) * t)\n / (23 * p1 + 11 * t * hCos + 108 * t * hSin);\n const a = gamma * hCos;\n const b = gamma * hSin;\n const rA = (460 * p2 + 451 * a + 288 * b) / 1403;\n const gA = (460 * p2 - 891 * a - 261 * b) / 1403;\n const bA = (460 * p2 - 220 * a - 6300 * b) / 1403;\n const rCScaled = inverseChromaticAdaptation(rA);\n const gCScaled = inverseChromaticAdaptation(gA);\n const bCScaled = inverseChromaticAdaptation(bA);\n const linrgb = mathUtils.matrixMultiply(\n [rCScaled, gCScaled, bCScaled],\n LINRGB_FROM_SCALED_DISCOUNT,\n );\n // ===========================================================\n // Operations inlined from Cam16 to avoid repeated calculation\n // ===========================================================\n if (linrgb[0] < 0 || linrgb[1] < 0 || linrgb[2] < 0) {\n return 0;\n }\n const kR = Y_FROM_LINRGB[0];\n const kG = Y_FROM_LINRGB[1];\n const kB = Y_FROM_LINRGB[2];\n const fnj = kR * linrgb[0] + kG * linrgb[1] + kB * linrgb[2];\n if (fnj <= 0) {\n return 0;\n }\n if (iterationRound === 4 || Math.abs(fnj - y) < 0.002) {\n if (linrgb[0] > 100.01 || linrgb[1] > 100.01 || linrgb[2] > 100.01) {\n return 0;\n }\n return colorUtils.argbFromLinrgb(linrgb);\n }\n // Iterates with Newton method,\n // Using 2 * fn(j) / j as the approximation of fn'(j)\n j -= (fnj - y) * j / (2 * fnj);\n }\n return 0;\n}\n\n/**\n * Finds an sRGB color with the given hue, chroma, and L*, if\n * possible.\n * @param {number} hueDegrees The desired hue, in degrees.\n * @param {number} chroma The desired chroma.\n * @param {number} lstar The desired L*.\n * @return {number} A hexadecimal representing the sRGB color. The color\n * has sufficiently close hue, chroma, and L* to the desired\n * values, if possible; otherwise, the hue and L* will be\n * sufficiently close, and chroma will be maximized.\n */\nexport function solveToInt(hueDegrees, chroma, lstar) {\n if (chroma < 0.0001 || lstar < 0.0001 || lstar > 99.9999) {\n return colorUtils.argbFromLstar(lstar);\n }\n hueDegrees = mathUtils.sanitizeDegreesDouble(hueDegrees);\n const hueRadians = hueDegrees / 180 * Math.PI;\n const y = colorUtils.yFromLstar(lstar);\n const exactAnswer = findResultByJ(hueRadians, chroma, y);\n if (exactAnswer !== 0) {\n return exactAnswer;\n }\n const linrgb = bisectToLimit(y, hueRadians);\n return colorUtils.argbFromLinrgb(linrgb);\n}\n\n/**\n * Finds an sRGB color with the given hue, chroma, and L*, if\n * possible.\n * @param {number} hueDegrees The desired hue, in degrees.\n * @param {number} chroma The desired chroma.\n * @param {number} lstar The desired L*.\n * @return {Cam16} An CAM16 object representing the sRGB color. The color\n * has sufficiently close hue, chroma, and L* to the desired\n * values, if possible; otherwise, the hue and L* will be\n * sufficiently close, and chroma will be maximized.\n */\nexport function solveToCam(hueDegrees, chroma, lstar) {\n return Cam16.fromInt(solveToInt(hueDegrees, chroma, lstar));\n}\n", "/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * A color system built using CAM16 hue and chroma, and L* from\n * L*a*b*.\n *\n * Using L* creates a link between the color system, contrast, and thus\n * accessibility. Contrast ratio depends on relative luminance, or Y in the XYZ\n * color space. L*, or perceptual luminance can be calculated from Y.\n *\n * Unlike Y, L* is linear to human perception, allowing trivial creation of\n * accurate color tones.\n *\n * Unlike contrast ratio, measuring contrast in L* is linear, and simple to\n * calculate. A difference of 40 in HCT tone guarantees a contrast ratio >= 3.0,\n * and a difference of 50 guarantees a contrast ratio >= 4.5.\n */\n\nimport * as utils from '../utils/color.js';\n\nimport Cam16 from './Cam16.js';\nimport ViewingConditions from './ViewingConditions.js';\nimport * as hctSolver from './hctSolver.js';\n\n/**\n * HCT, hue, chroma, and tone. A color system that provides a perceptually\n * accurate color measurement system that can also accurately render what colors\n * will appear as in different lighting environments.\n */\nexport default class Hct {\n /**\n * @param hue 0 <= hue < 360; invalid values are corrected.\n * @param chroma 0 <= chroma < ?; Informally, colorfulness. The color\n * returned may be lower than the requested chroma. Chroma has a different\n * maximum for any given hue and tone.\n * @param tone 0 <= tone <= 100; invalid values are corrected.\n * @return HCT representation of a color in default viewing conditions.\n */\n\n /**\n * @param {number} hue\n * @param {number} chroma\n * @param {number} tone\n * @return {Hct}\n */\n static from(hue, chroma, tone) {\n return new Hct(hctSolver.solveToInt(hue, chroma, tone));\n }\n\n /**\n * @param {number} argb ARGB representation of a color.\n * @return {Hct} HCT representation of a color in default viewing conditions\n */\n static fromInt(argb) {\n return new Hct(argb);\n }\n\n /** @type {number} */\n internalHue;\n\n /** @type {number} */\n internalChroma;\n\n /** @type {number} */\n internalTone;\n\n /** @param {number} argb */\n constructor(argb) {\n const cam = Cam16.fromInt(argb);\n this.internalHue = cam.hue;\n this.internalChroma = cam.chroma;\n this.internalTone = utils.lstarFromArgb(argb);\n this.argb = argb;\n }\n\n /** @return {number} */\n toInt() {\n return this.argb;\n }\n\n /**\n * A number, in degrees, representing ex. red, orange, yellow, etc.\n * Ranges from 0 <= hue < 360.\n * @return {number}\n */\n get hue() {\n return this.internalHue;\n }\n\n /**\n * @param {number} newHue 0 <= newHue < 360; invalid values are corrected.\n * Chroma may decrease because chroma has a different maximum for any given\n * hue and tone.\n */\n set hue(newHue) {\n this.setInternalState(\n hctSolver.solveToInt(\n newHue,\n this.internalChroma,\n this.internalTone,\n ),\n );\n }\n\n /** @return {number} */\n get chroma() {\n return this.internalChroma;\n }\n\n /**\n * @param {number} newChroma 0 <= newChroma < ?\n * Chroma may decrease because chroma has a different maximum for any given\n * hue and tone.\n */\n set chroma(newChroma) {\n this.setInternalState(\n hctSolver.solveToInt(\n this.internalHue,\n newChroma,\n this.internalTone,\n ),\n );\n }\n\n /**\n * Lightness. Ranges from 0 to 100.\n * @return {number}\n */\n get tone() {\n return this.internalTone;\n }\n\n /**\n * @param {number} newTone 0 <= newTone <= 100; invalid valids are corrected.\n * Chroma may decrease because chroma has a different maximum for any given\n * hue and tone.\n */\n set tone(newTone) {\n this.setInternalState(\n hctSolver.solveToInt(\n this.internalHue,\n this.internalChroma,\n newTone,\n ),\n );\n }\n\n /**\n * @private\n * @param {number} argb\n */\n setInternalState(argb) {\n const cam = Cam16.fromInt(argb);\n this.internalHue = cam.hue;\n this.internalChroma = cam.chroma;\n this.internalTone = utils.lstarFromArgb(argb);\n this.argb = argb;\n }\n\n /**\n * Translates a color into different [ViewingConditions].\n *\n * Colors change appearance. They look different with lights on versus off,\n * the same color, as in hex code, on white looks different when on black.\n * This is called color relativity, most famously explicated by Josef Albers\n * in Interaction of Color.\n *\n * In color science, color appearance models can account for this and\n * calculate the appearance of a color in different settings. HCT is based on\n * CAM16, a color appearance model, and uses it to make these calculations.\n *\n * See [ViewingConditions.make] for parameters affecting color appearance.\n * @param {ViewingConditions} vc\n * @return {Hct}\n */\n inViewingConditions(vc) {\n // 1. Use CAM16 to find XYZ coordinates of color in specified VC.\n const cam = Cam16.fromInt(this.toInt());\n const viewedInVc = cam.xyzInViewingConditions(vc);\n\n // 2. Create CAM16 of those XYZ coordinates in default VC.\n const recastInVc = Cam16.fromXyzInViewingConditions(\n viewedInVc[0],\n viewedInVc[1],\n viewedInVc[2],\n ViewingConditions.make(),\n );\n\n // 3. Create HCT from:\n // - CAM16 using default VC with XYZ coordinates in specified VC.\n // - L* converted from Y in XYZ coordinates in specified VC.\n const recastHct = Hct.from(\n recastInVc.hue,\n recastInVc.chroma,\n utils.lstarFromY(viewedInVc[1]),\n );\n return recastHct;\n }\n}\n", "/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Cam16 from './hct/Cam16.js';\nimport Hct from './hct/Hct.js';\nimport * as colorUtils from './utils/color.js';\nimport * as mathUtils from './utils/math.js';\n\n/**\n * Functions for blending in HCT and CAM16.\n */\n\n/**\n * Blend the design color's HCT hue towards the key color's HCT\n * hue, in a way that leaves the original color recognizable and\n * recognizably shifted towards the key color.\n * @param {number} designColor ARGB representation of an arbitrary color.\n * @param {number} sourceColor ARGB representation of the main theme color.\n * @return {number} The design color with a hue shifted towards the\n * system's color, a slightly warmer/cooler variant of the design\n * color's hue.\n */\nexport function harmonize(designColor, sourceColor) {\n const fromHct = Hct.fromInt(designColor);\n const toHct = Hct.fromInt(sourceColor);\n const differenceDegrees = mathUtils.differenceDegrees(fromHct.hue, toHct.hue);\n const rotationDegrees = Math.min(differenceDegrees * 0.5, 15);\n const outputHue = mathUtils.sanitizeDegreesDouble(\n fromHct.hue\n + rotationDegrees * mathUtils.rotationDirection(fromHct.hue, toHct.hue),\n );\n return Hct.from(outputHue, fromHct.chroma, fromHct.tone).toInt();\n}\n\n/**\n * Blend in CAM16-UCS space.\n * @param {number} from ARGB representation of color\n * @param {number} to ARGB representation of color\n * @param {number} amount how much blending to perform; 0.0 >= and <= 1.0\n * @return {number} from, blended towards to. Hue, chroma, and tone will\n * change.\n */\nexport function cam16Ucs(from, to, amount) {\n const fromCam = Cam16.fromInt(from);\n const toCam = Cam16.fromInt(to);\n const fromJ = fromCam.jstar;\n const fromA = fromCam.astar;\n const fromB = fromCam.bstar;\n const toJ = toCam.jstar;\n const toA = toCam.astar;\n const toB = toCam.bstar;\n const jstar = fromJ + (toJ - fromJ) * amount;\n const astar = fromA + (toA - fromA) * amount;\n const bstar = fromB + (toB - fromB) * amount;\n return Cam16.fromUcs(jstar, astar, bstar).toInt();\n}\n\n/**\n * Blends hue from one color into another. The chroma and tone of\n * the original color are maintained.\n * @param {number} from ARGB representation of color\n * @param {number} to ARGB representation of color\n * @param {number} amount how much blending to perform; 0.0 >= and <= 1.0\n * @return {number} from, with a hue blended towards to. Chroma and tone\n * are constant.\n */\nexport function hctHue(from, to, amount) {\n const ucs = cam16Ucs(from, to, amount);\n const ucsCam = Cam16.fromInt(ucs);\n const fromCam = Cam16.fromInt(from);\n const blended = Hct.from(\n ucsCam.hue,\n fromCam.chroma,\n colorUtils.lstarFromArgb(from),\n );\n return blended.toInt();\n}\n", "/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Hct from '../hct/Hct.js';\n\n/**\n * A convenience class for retrieving colors that are constant in hue and\n * chroma, but vary in tone.\n */\nexport default class TonalPalette {\n /**\n * @param {number} argb ARGB representation of a color\n * @return {TonalPalette} Tones matching that color's hue and chroma.\n */\n static fromInt(argb) {\n const hct = Hct.fromInt(argb);\n return TonalPalette.fromHueAndChroma(hct.hue, hct.chroma);\n }\n\n /**\n * @param {number} hue HCT hue\n * @param {number} chroma HCT chroma\n * @return {TonalPalette} Tones matching hue and chroma.\n */\n static fromHueAndChroma(hue, chroma) {\n return new TonalPalette(hue, chroma);\n }\n\n /** @type {Map<number, number>} */\n #cache = new Map();\n\n /**\n * @private\n * @param {number} hue\n * @param {number} chroma\n */\n constructor(hue, chroma) {\n this.hue = hue;\n this.chroma = chroma;\n }\n\n /**\n * @param {number} tone HCT tone, measured from 0 to 100.\n * @return {number} ARGB representation of a color with that tone.\n */\n tone(tone) {\n let argb = this.#cache.get(tone);\n if (argb === undefined) {\n argb = Hct.from(this.hue, this.chroma, tone).toInt();\n this.#cache.set(tone, argb);\n }\n return argb;\n }\n\n /**\n * @param {number} tone HCT tone.\n * @return {Hct} HCT representation of a color with that tone.\n */\n getHct(tone) {\n return Hct.fromInt(this.tone(tone));\n }\n}\n", "/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Hct from '../hct/Hct.js';\n\nimport TonalPalette from './TonalPalette.js';\n\n/**\n * Set of colors to generate a [CorePalette] from\n * @typedef CorePaletteColors\n * @prop {number} primary\n * @prop {number} [secondary]\n * @prop {number} [tertiary]\n * @prop {number} [neutral]\n * @prop {number} [neutralVariant]\n * @prop {number} [error]\n */\n\n/**\n * An intermediate concept between the key color for a UI theme, and a full\n * color scheme. 5 sets of tones are generated, all except one use the same hue\n * as the key color, and all vary in chroma.\n */\nexport default class CorePalette {\n /**\n * @param {boolean} content\n * @param {CorePaletteColors} colors\n * @return {CorePalette}\n */\n static #createPaletteFromColors(content, colors) {\n const palette = new CorePalette(colors.primary, content);\n if (colors.secondary) {\n const p = new CorePalette(colors.secondary, content);\n palette.a2 = p.a1;\n }\n if (colors.tertiary) {\n const p = new CorePalette(colors.tertiary, content);\n palette.a3 = p.a1;\n }\n if (colors.error) {\n const p = new CorePalette(colors.error, content);\n palette.error = p.a1;\n }\n if (colors.neutral) {\n const p = new CorePalette(colors.neutral, content);\n palette.n1 = p.n1;\n }\n if (colors.neutralVariant) {\n const p = new CorePalette(colors.neutralVariant, content);\n palette.n2 = p.n2;\n }\n return palette;\n }\n\n /**\n * @param {number} argb ARGB representation of a color\n * @return {CorePalette}\n */\n static of(argb) {\n return new CorePalette(argb, false);\n }\n\n /**\n * @param {number} argb ARGB representation of a color\n * @return {CorePalette}\n */\n static contentOf(argb) {\n return new CorePalette(argb, true);\n }\n\n /**\n * Create a [CorePalette] from a set of colors\n * @param {CorePaletteColors} colors\n * @return {CorePalette}\n */\n static fromColors(colors) {\n return CorePalette.#createPaletteFromColors(false, colors);\n }\n\n /**\n * Create a content [CorePalette] from a set of colors\n * @param {CorePaletteColors} colors\n * @return {CorePalette}\n */\n static contentFromColors(colors) {\n return CorePalette.#createPaletteFromColors(true, colors);\n }\n\n /** @type {TonalPalette} */\n a1;\n\n /** @type {TonalPalette} */\n a2;\n\n /** @type {TonalPalette} */\n a3;\n\n /** @type {TonalPalette} */\n n1;\n\n /** @type {TonalPalette} */\n n2;\n\n /** @type {TonalPalette} */\n error;\n\n /**\n * @param {number} argb\n * @param {boolean} isContent\n */\n constructor(argb, isContent) {\n const hct = Hct.fromInt(argb);\n const { hue } = hct;\n const { chroma } = hct;\n if (isContent) {\n this.a1 = TonalPalette.fromHueAndChroma(hue, chroma);\n this.a2 = TonalPalette.fromHueAndChroma(hue, chroma / 3);\n this.a3 = TonalPalette.fromHueAndChroma(hue + 60, chroma / 2);\n this.n1 = TonalPalette.fromHueAndChroma(hue, Math.min(chroma / 12, 6)); // Bump from 4\n this.n2 = TonalPalette.fromHueAndChroma(hue, Math.min(chroma / 6, 8));\n } else {\n this.a1 = TonalPalette.fromHueAndChroma(hue, Math.max(48, chroma));\n this.a2 = TonalPalette.fromHueAndChroma(hue, 16);\n this.a3 = TonalPalette.fromHueAndChroma(hue + 60, 24);\n this.n1 = TonalPalette.fromHueAndChroma(hue, 6); // Bump from 4\n this.n2 = TonalPalette.fromHueAndChroma(hue, 8);\n }\n this.error = TonalPalette.fromHueAndChroma(25, 84);\n }\n}\n", "/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport CorePalette from '../palettes/CorePalette.js';\n\n/**\n * Represents a Material color scheme, a mapping of color roles to colors.\n */\nexport default class Scheme {\n /**\n * @param {number} argb ARGB representation of a color.\n * @return {Scheme} Light Material color scheme, based on the color's hue.\n */\n static light(argb) {\n return Scheme.lightFromCorePalette(CorePalette.of(argb));\n }\n\n /**\n * @param {number} argb ARGB representation of a color.\n * @return {Scheme} Dark Material color scheme, based on the color's hue.\n */\n static dark(argb) {\n return Scheme.darkFromCorePalette(CorePalette.of(argb));\n }\n\n /**\n * @param {number} argb ARGB representation of a color.\n * @return {Scheme} Light Material content color scheme, based on the color's hue.\n */\n static lightContent(argb) {\n return Scheme.lightFromCorePalette(CorePalette.contentOf(argb));\n }\n\n /**\n * @param {number} argb ARGB representation of a color.\n * @return {Scheme} Dark Material content color scheme, based on the color's hue.\n */\n static darkContent(argb) {\n return Scheme.darkFromCorePalette(CorePalette.contentOf(argb));\n }\n\n /**\n * Light scheme from core palette\n * @param {CorePalette} core\n * @return {Scheme}\n */\n static lightFromCorePalette(core) {\n return new Scheme({\n primary: core.a1.tone(40),\n onPrimary: core.a1.tone(100),\n primaryContainer: core.a1.tone(90),\n onPrimaryContainer: core.a1.tone(10),\n secondary: core.a2.tone(40),\n onSecondary: core.a2.tone(100),\n secondaryContainer: core.a2.tone(90),\n onSecondaryContainer: core.a2.tone(10),\n tertiary: core.a3.tone(40),\n onTertiary: core.a3.tone(100),\n tertiaryContainer: core.a3.tone(90),\n onTertiaryContainer: core.a3.tone(10),\n error: core.error.tone(40),\n onError: core.error.tone(100),\n errorContainer: core.error.tone(90),\n onErrorContainer: core.error.tone(10),\n background: core.n1.tone(98),\n onBackground: core.n1.tone(10),\n surface: core.n1.tone(98),\n onSurface: core.n1.tone(10),\n surfaceDim: core.n1.tone(87),\n surfaceBright: core.n1.tone(98),\n surfaceContainerLowest: core.n1.tone(100),\n surfaceContainerLow: core.n1.tone(96),\n surfaceContainer: core.n1.tone(94),\n surfaceContainerHigh: core.n1.tone(92),\n surfaceContainerHighest: core.n1.tone(90),\n surfaceVariant: core.n2.tone(90),\n onSurfaceVariant: core.n2.tone(30),\n outline: core.n2.tone(50),\n outlineVariant: core.n2.tone(80),\n shadow: core.n1.tone(0),\n scrim: core.n1.tone(0),\n inverseSurface: core.n1.tone(20),\n inverseOnSurface: core.n1.tone(95),\n inversePrimary: core.a1.tone(80),\n });\n }\n\n /**\n * Dark scheme from core palette\n * @param {CorePalette} core\n * @return {Scheme}\n */\n static darkFromCorePalette(core) {\n return new Scheme({\n primary: core.a1.tone(80),\n onPrimary: core.a1.tone(20),\n primaryContainer: core.a1.tone(30),\n onPrimaryContainer: core.a1.tone(90),\n secondary: core.a2.tone(80),\n onSecondary: core.a2.tone(20),\n secondaryContainer: core.a2.tone(30),\n onSecondaryContainer: core.a2.tone(90),\n tertiary: core.a3.tone(80),\n onTertiary: core.a3.tone(20),\n tertiaryContainer: core.a3.tone(30),\n onTertiaryContainer: core.a3.tone(90),\n error: core.error.tone(80),\n onError: core.error.tone(20),\n errorContainer: core.error.tone(30),\n onErrorContainer: core.error.tone(90), // Fix Typo\n background: core.n1.tone(6),\n onBackground: core.n1.tone(90),\n surface: core.n1.tone(6),\n onSurface: core.n1.tone(90),\n surfaceDim: core.n1.tone(6),\n surfaceBright: core.n1.tone(24),\n surfaceContainerLowest: core.n1.tone(4),\n surfaceContainerLow: core.n1.tone(10),\n surfaceContainer: core.n1.tone(12),\n surfaceContainerHigh: core.n1.tone(17),\n surfaceContainerHighest: core.n1.tone(22),\n surfaceVariant: core.n2.tone(30),\n onSurfaceVariant: core.n2.tone(80),\n outline: core.n2.tone(60),\n outlineVariant: core.n2.tone(30),\n shadow: core.n1.tone(0),\n scrim: core.n1.tone(0),\n inverseSurface: core.n1.tone(90),\n inverseOnSurface: core.n1.tone(20),\n inversePrimary: core.a1.tone(40),\n });\n }\n\n /**\n * @param {Object} props\n * @param {number} props.primary\n * @param {number} props.onPrimary\n * @param {number} props.primaryContainer\n * @param {number} props.onPrimaryContainer\n * @param {number} props.secondary\n * @param {number} props.onSecondary\n * @param {number} props.secondaryContainer\n * @param {number} props.onSecondaryContainer\n * @param {number} props.tertiary\n * @param {number} props.onTertiary\n * @param {number} props.tertiaryContainer\n * @param {number} props.onTertiaryContainer\n * @param {number} props.error\n * @param {number} props.onError\n * @param {number} props.errorContainer\n * @param {number} props.onErrorContainer\n * @param {number} props.background\n * @param {number} props.onBackground\n * @param {number} props.surface\n * @param {number} props.onSurface\n * @param {number} props.surfaceDim\n * @param {number} props.surfaceBright\n * @param {number} props.surfaceContainerLowest\n * @param {number} props.surfaceContainerLow\n * @param {number} props.surfaceContainer\n * @param {number} props.surfaceContainerHigh\n * @param {number} props.surfaceContainerHighest\n * @param {number} props.surfaceVariant\n * @param {number} props.onSurfaceVariant\n * @param {number} props.outline\n * @param {number} props.outlineVariant\n * @param {number} props.shadow\n * @param {number} props.scrim\n * @param {number} props.inverseSurface\n * @param {number} props.inverseOnSurface\n * @param {number} props.inversePrimary\n */\n constructor(props) {\n this.props = props;\n }\n\n /** @return {number} */\n get primary() {\n return this.props.primary;\n }\n\n /** @return {number} */\n get onPrimary() {\n return this.props.onPrimary;\n }\n\n /** @return {number} */\n get primaryContainer() {\n return this.props.primaryContainer;\n }\n\n /** @return {number} */\n get onPrimaryContainer() {\n return this.props.onPrimaryContainer;\n }\n\n /** @return {number} */\n get secondary() {\n return this.props.secondary;\n }\n\n /** @return {number} */\n get onSecondary() {\n return this.props.onSecondary;\n }\n\n /** @return {number} */\n get secondaryContainer() {\n return this.props.secondaryContainer;\n }\n\n /** @return {number} */\n get onSecondaryContainer() {\n return this.props.onSecondaryContainer;\n }\n\n /** @return {number} */\n get tertiary() {\n return this.props.tertiary;\n }\n\n /** @return {number} */\n get onTertiary() {\n return this.props.onTertiary;\n }\n\n /** @return {number} */\n get tertiaryContainer() {\n return this.props.tertiaryContainer;\n }\n\n /** @return {number} */\n get onTertiaryContainer() {\n return this.props.onTertiaryContainer;\n }\n\n /** @return {number} */\n get error() {\n return this.props.error;\n }\n\n /** @return {number} */\n get onError() {\n return this.props.onError;\n }\n\n /** @return {number} */\n get errorContainer() {\n return this.props.errorContainer;\n }\n\n /** @return {number} */\n get onErrorContainer() {\n return this.props.onErrorContainer;\n }\n\n /** @return {number} */\n get background() {\n return this.props.background;\n }\n\n /** @return {number} */\n get onBackground() {\n return this.props.onBackground;\n }\n\n /** @return {number} */\n get surface() {\n return this.props.surface;\n }\n\n /** @return {number} */\n get onSurface() {\n return this.props.onSurface;\n }\n\n /** @return {number} */\n get surfaceDim() {\n return this.props.surfaceDim;\n }\n\n /** @return {number} */\n get surfaceBright() {\n return this.props.surfaceBright;\n }\n\n /** @return {number} */\n get surfaceContainerLowest() {\n return this.props.surfaceContainerLowest;\n }\n\n /** @return {number} */\n get surfaceContainerLow() {\n return this.props.surfaceContainerLow;\n }\n\n /** @return {number} */\n get surfaceContainer() {\n return this.props.surfaceContainer;\n }\n\n /** @return {number} */\n get surfaceContainerHigh() {\n return this.props.surfaceContainerHigh;\n }\n\n /** @return {number} */\n get surfaceContainerHighest() {\n return this.props.surfaceContainerHighest;\n }\n\n /** @return {number} */\n get surfaceVariant() {\n return this.props.surfaceVariant;\n }\n\n /** @return {number} */\n get onSurfaceVariant() {\n return this.props.onSurfaceVariant;\n }\n\n /** @return {number} */\n get outline() {\n return this.props.outline;\n }\n\n /** @return {number} */\n get outlineVariant() {\n return this.props.outlineVariant;\n }\n\n /** @return {number} */\n get shadow() {\n return this.props.shadow;\n }\n\n /** @return {number} */\n get scrim() {\n return this.props.scrim;\n }\n\n /** @return {number} */\n get inverseSurface() {\n return this.props.inverseSurface;\n }\n\n /** @return {number} */\n get inverseOnSurface() {\n return this.props.inverseOnSurface;\n }\n\n /** @return {number} */\n get inversePrimary() {\n return this.props.inversePrimary;\n }\n\n toJSON() {\n return {\n ...this.props,\n };\n }\n}\n", "import { harmonize } from './blend.js';\nimport CorePalette from './palettes/CorePalette.js';\nimport Scheme from './scheme/Scheme.js';\nimport * as colorUtils from './utils/color.js';\n\n/** @typedef {import(\"./palettes/TonalPalette.js\").default} TonalPalette */\n\n/**\n * @param {string} value\n * @return {number}\n */\nfunction parseIntHex(value) {\n // tslint:disable-next-line:ban\n return Number.parseInt(value, 16);\n}\n\n/**\n * @param {string} hex String representing color as hex code. Accepts strings with or\n * without leading #, and string representing the color using 3, 6, or 8\n * hex characters.\n * @return {number} ARGB representation of color.\n */\nfunction argbFromHex(hex) {\n hex = hex.replace('#', '');\n const isThree = hex.length === 3;\n const isSix = hex.length === 6;\n const isEight = hex.length === 8;\n if (!isThree && !isSix && !isEight) {\n throw new Error(`unexpected hex ${hex}`);\n }\n let r = 0;\n let g = 0;\n let b = 0;\n if (isThree) {\n r = parseIntHex(hex.slice(0, 1).repeat(2));\n g = parseIntHex(hex.slice(1, 2).repeat(2));\n b = parseIntHex(hex.slice(2, 3).repeat(2));\n } else if (isSix) {\n r = parseIntHex(hex.slice(0, 2));\n g = parseIntHex(hex.slice(2, 4));\n b = parseIntHex(hex.slice(4, 6));\n } else if (isEight) {\n r = parseIntHex(hex.slice(2, 4));\n g = parseIntHex(hex.slice(4, 6));\n b = parseIntHex(hex.slice(6, 8));\n }\n\n return (\n ((255 << 24) | ((r & 0x0_FF) << 16) | ((g & 0x0_FF) << 8) | (b & 0x0_FF))\n >>> 0);\n}\n\n/**\n * @param {number} argb ARGB representation of a color.\n * @return {string} Hex string representing color, ex. #ff0000 for red.\n */\nfunction hexFromArgb(argb) {\n const r = colorUtils.redFromArgb(argb);\n const g = colorUtils.greenFromArgb(argb);\n const b = colorUtils.blueFromArgb(argb);\n const outParts = [r.toString(16), g.toString(16), b.toString(16)];\n\n // Pad single-digit output values\n for (const [i, part] of outParts.entries()) {\n if (part.length === 1) {\n outParts[i] = `0${part}`;\n }\n }\n\n return `#${outParts.join('')}`;\n}\n\n/**\n * @param {number} argb\n * @return {string}\n */\nfunction cssVarFromArgb(argb) {\n return [\n colorUtils.redFromArgb(argb),\n colorUtils.greenFromArgb(argb),\n colorUtils.blueFromArgb(argb),\n ].join(',');\n}\n\n/**\n * @param {Scheme} scheme\n * @return {string}\n */\nfunction cssVariablesFromScheme(scheme) {\n return /* css */`\n :root {\n --mdw-color__primary: ${cssVarFromArgb(scheme.primary)};\n --mdw-color__on-primary: ${cssVarFromArgb(scheme.onPrimary)};\n --mdw-color__primary-container: ${cssVarFromArgb(scheme.primaryContainer)};\n --mdw-color__on-primary-container: ${cssVarFromArgb(scheme.onPrimaryContainer)};\n --mdw-color__secondary: ${cssVarFromArgb(scheme.secondary)};\n --mdw-color__on-secondary: ${cssVarFromArgb(scheme.onSecondary)};\n --mdw-color__secondary-container: ${cssVarFromArgb(scheme.secondaryContainer)};\n --mdw-color__on-secondary-container: ${cssVarFromArgb(scheme.onSecondaryContainer)};\n --mdw-color__tertiary: ${cssVarFromArgb(scheme.tertiary)};\n --mdw-color__on-tertiary: ${cssVarFromArgb(scheme.onTertiary)};\n --mdw-color__tertiary-container: ${cssVarFromArgb(scheme.tertiaryContainer)};\n --mdw-color__on-tertiary-container: ${cssVarFromArgb(scheme.onTertiaryContainer)};\n --mdw-color__error: ${cssVarFromArgb(scheme.error)};\n --mdw-color__on-error: ${cssVarFromArgb(scheme.onError)};\n --mdw-color__error-container: ${cssVarFromArgb(scheme.errorContainer)};\n --mdw-color__on-error-container: ${cssVarFromArgb(scheme.onErrorContainer)};\n --mdw-color__background: ${cssVarFromArgb(scheme.background)};\n --mdw-color__on-background: ${cssVarFromArgb(scheme.onBackground)};\n --mdw-color__surface: ${cssVarFromArgb(scheme.surface)};\n --mdw-color__on-surface: ${cssVarFromArgb(scheme.onSurface)};\n --mdw-color__surface-dim: ${cssVarFromArgb(scheme.surfaceDim)};\n --mdw-color__surface-bright: ${cssVarFromArgb(scheme.surfaceBright)};\n --mdw-color__surface-container-lowest: ${cssVarFromArgb(scheme.surfaceContainerLowest)};\n --mdw-color__surface-container-low: ${cssVarFromArgb(scheme.surfaceContainerLow)};\n --mdw-color__surface-container: ${cssVarFromArgb(scheme.surfaceContainer)};\n --mdw-color__surface-container-high: ${cssVarFromArgb(scheme.surfaceContainerHigh)};\n --mdw-color__surface-container-highest: ${cssVarFromArgb(scheme.surfaceContainerHighest)};\n --mdw-color__on-surface-variant: ${cssVarFromArgb(scheme.onSurfaceVariant)};\n --mdw-color__outline: ${cssVarFromArgb(scheme.outline)};\n --mdw-color__outline-variant: ${cssVarFromArgb(scheme.outlineVariant)};\n --mdw-color__shadow: ${cssVarFromArgb(scheme.shadow)};\n --mdw-color__scrim: ${cssVarFromArgb(scheme.scrim)};\n --mdw-color__inverse-surface: ${cssVarFromArgb(scheme.inverseSurface)};\n --mdw-color__inverse-on-surface: ${cssVarFromArgb(scheme.inverseOnSurface)};\n --mdw-color__inverse-primary: ${cssVarFromArgb(scheme.inversePrimary)};\n }\n `;\n}\n\n/**\n * @param {string} name\n * @param {TonalPalette} tonalPalette\n * @param {boolean} [isDark]\n */\nfunction cssVariablesFromCustom(name, tonalPalette, isDark) {\n return /* css */`\n :root {\n --mdw-color__${name}: ${cssVarFromArgb(tonalPalette.tone(isDark ? 80 : 40))};\n --mdw-color__on-${name}: ${cssVarFromArgb(tonalPalette.tone(isDark ? 20 : 100))};\n --mdw-color__${name}-container: ${cssVarFromArgb(tonalPalette.tone(isDark ? 30 : 90))};\n --mdw-color__on-${name}-container: ${cssVarFromArgb(tonalPalette.tone(isDark ? 90 : 10))};\n }\n `;\n}\n\n/**\n * @param {string} mainColor as hex\n * @param {Iterable<[string,string]>} [customColors]\n * @return {Record<string, string>}\n */\nexport function getScheme(mainColor, customColors = []) {\n const argbColor = argbFromHex(mainColor);\n const lightRules = [cssVariablesFromScheme(Scheme.light(argbColor))];\n const darkRules = [cssVariablesFromScheme(Scheme.dark(argbColor))];\n const lightContentRules = [cssVariablesFromScheme(Scheme.lightContent(argbColor))];\n const darkContentRules = [cssVariablesFromScheme(Scheme.darkContent(argbColor))];\n for (const [name, color] of customColors) {\n const argbCustom = argbFromHex(color);\n const blended = harmonize(argbCustom, argbColor);\n const { a1: tp } = CorePalette.of(blended);\n const { a1: ctp } = CorePalette.contentOf(blended);\n\n lightRules.push(cssVariablesFromCustom(name, tp));\n darkRules.push(cssVariablesFromCustom(name, tp, true));\n lightContentRules.push(cssVariablesFromCustom(name, ctp));\n darkContentRules.push(cssVariablesFromCustom(name, ctp, true));\n }\n return {\n light: lightRules.join('\\n'),\n dark: darkRules.join('\\n'),\n lightContent: lightContentRules.join('\\n'),\n darkContent: darkContentRules.join('\\n'),\n };\n}\n", "/**\n * Uses UTF-8 charset instead of base64 for better compression\n * @param {string} svg\n * @return {string}\n */\nexport function svgToCSSURL(svg) {\n return `url('data:image/svg+xml;charset=UTF-8,${svg\n .replaceAll('\\n', ' ')\n .replaceAll('#', '%23')\n .replaceAll('(', '%28')\n .replaceAll(')', '%29')}')`;\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["ThemableMixin", "Base", "palette", "typeStyle", "BLANK_TEXT", "BLANK_COMMENT", "BLANK_DIV", "createEmptyTextNode", "createEmptyComment", "BLANK_COMMENT", "CompositionAdapter", "options", "changes", "data", "domNode", "index", "metadata", "key", "newIndex", "change", "skipOnMatch", "metadataAtIndex", "sameKey", "isPartial", "failedFastPath", "oldIndex", "previousMetadata", "correctMetadata", "domNodeToRemove", "render", "element", "startIndex", "length", "comment", "createEmptyComment", "generateCSSStyleSheets", "styles", "style", "sheet", "styleElementWrappers", "generateHTMLStyleElements", "styleElement", "attrValueFromDataValue", "value", "attrNameFromPropName", "name", "attrNameWords", "prev", "curr", "IS_FIREFOX", "isFocused", "element", "attemptFocus", "options", "isRtl", "jsonMergePatch_exports", "__export", "applyMergePatch", "buildMergePatch", "hasMergePatch", "target", "patch", "key", "value", "previous", "current", "arrayStrategy", "index", "changes", "previousKeys", "DEFAULT_NULL_PARSER", "DEFAULT_BOOLEAN_PARSER", "v", "DEFAULT_NUMBER_PARSER", "DEFAULT_STRING_PARSER", "DEFAULT_OBJECT_PARSER", "o", "DEFAULT_OBJECT_COMPARATOR", "a", "b", "hasMergePatch", "DEFAULT_ARRAY_COMPARATOR", "DEFAULT_OBJECT_DIFF", "buildMergePatch", "emptyFromType", "type", "buildProxy", "proxyTarget", "set", "deepSet", "prefix", "target", "p", "value", "arg", "defaultParserFromType", "parseObserverOptions", "name", "typeOrOptions", "object", "options", "enumerable", "attr", "reflect", "empty", "changedCallback", "parsedType", "parsed", "attrNameFromPropName", "parser", "nullParser", "parsedEmpty", "isFn", "diff", "INIT_SYMBOL", "DEFAULT_OBSERVER_CONFIGURATION", "observeFunction", "fn", "args", "thisPoked", "thisPokedDeep", "argWatchers", "arg", "poked", "pokedDeep", "proxy", "buildProxy", "thisProxy", "defaultValue", "watcher", "reusable", "deepPropString", "defineObservableProperty", "object", "key", "options", "config", "DEFAULT_OBSERVER_CONFIGURATION", "parseObserverOptions", "detectChange", "oldValue", "value", "newValue", "changes", "internalGet", "internalSet", "onInvalidate", "observeResult", "uniqueProps", "prop", "descriptor", "INIT_SYMBOL", "generatedUIDs", "generateUID", "prefix", "n", "id", "_inactiveDocument", "_cssStyleSheetConstructable", "generateFragment", "fromString", "inlineFunctions", "addInlineFunction", "fn", "internalName", "generateUID", "cssStyleSheetsCache", "styleElementCache", "css", "array", "substitutions", "content", "sheet", "style", "fragmentCache", "html", "strings", "tempSlots", "replacements", "sub", "tempId", "compiledString", "fragment", "id", "element", "writeDOMAttribute", "state", "value", "nodeIndex", "attrName", "element", "writeDOMText", "writeDOMElementAttachedState", "commentIndex", "comment", "createEmptyComment", "show", "writeDOMHideElementOnInit", "executeSearch", "search", "args", "cachedValue", "result", "subResult", "searchWithExpression", "changes", "data", "searchWithProp", "searchWithDeepProp", "scope", "prop", "STRING_INTERPOLATION_REGEX", "propFromObject", "prop", "source", "deepPropFromObject", "nameArray", "scope", "valueFromPropName", "value", "child", "_interpolationState", "_bindCompositionEventListeners", "bindCompositionEventListeners_fn", "_interpolateNode", "interpolateNode_fn", "_tagElement", "tagElement_fn", "_interpolateIterable", "interpolateIterable_fn", "_Composition", "parts", "__privateAdd", "__publicField", "generateFragment", "part", "listener", "key", "changes", "data", "options", "instanceFragment", "target", "isShadowRoot", "initState", "nodes", "tag", "textNodes", "element", "__privateMethod", "textNode", "currentIndex", "index", "action", "draw", "ranSearch", "actions", "result", "executeSearch", "search", "TREE_WALKER_FILTER", "treeWalker", "node", "idAttr", "attr", "nextNode", "generateCSSStyleSheets", "generateHTMLStyleElements", "id", "Composition", "context", "event", "parsedValue", "nodeValue", "nodeName", "nodeType", "text", "trimmed", "length", "segments", "STRING_INTERPOLATION_REGEX", "segment", "newNode", "createEmptyTextNode", "query", "negate", "doubleNegate", "isEvent", "textNodeIndex", "prev", "hyphenIndex", "eventType", "flags", "type", "handleEvent", "deepProp", "inlineFunctions", "parsedProps", "subquery", "isSubquery", "subSearch", "expression", "propsUsed", "deepPropsUsed", "defaultValue", "invocation", "inlineFunctionOptions", "searchWithExpression", "observeResult", "observeFunction", "uniqueProps", "uniqueDeepProps", "deepPropString", "searchWithProp", "searchWithDeepProp", "__privateGet", "subnode", "nodeEntry", "writeDOMText", "writeDOMAttribute", "writeDOMElementAttachedState", "writeDOMHideElementOnInit", "generateUID", "valueName", "iterableName", "elementAnchor", "newComposition", "injections", "state", "instanceAnchorElement", "anchorNode", "createEmptyComment", "CompositionAdapter", "adapter", "iterable", "changeList", "innerChanges", "needTargetAll", "iterator", "change", "resource", "ICustomElement", "cloneAttributeCallback", "name", "target", "oldValue", "newValue", "element", "EVENT_PREFIX_REGEX", "_refsProxy", "_refsCache", "_refsCompositionCache", "_composition", "_template", "template_get", "_CustomElement", "ICustomElement", "args", "__privateAdd", "__publicField", "callback", "s", "config", "__privateGet", "__privateSet", "Composition", "collection", "parts", "composition", "array", "substitutions", "css", "schema", "elementName", "strings", "html", "source", "options", "value", "symbol", "mixin", "typeOrOptions", "customCallback", "changes", "defineObservableProperty", "prop", "props", "propWatchers", "watcher", "index", "listeners", "key", "listenerOptions", "flags", "type", "deepProp", "parsedProps", "listenerMap", "tag", "attrNameFromPropName", "nameOrCallbacks", "callbacks", "fn", "arrayPropName", "lcName", "cacheEntry", "previousDataValue", "parsedValue", "reflect", "attr", "needsWrite", "stringValue", "attrValueFromDataValue", "patch", "applyMergePatch", "formattedTag", "tagIndex", "listener", "e", "addInlineFunction", "CustomElement", "DensityMixin", "Base", "ShapeMixin", "Base", "Badge_default", "CustomElement", "ThemableMixin", "DensityMixin", "ShapeMixin", "FlexableMixin", "Base", "Box_default", "CustomElement", "ThemableMixin", "FlexableMixin", "Body_default", "Box_default", "AriaReflectorMixin", "Base", "name", "value", "attrName", "oldValue", "newValue", "DEFAULT_ELEMENT_QUERY", "KeyboardNavMixin", "Base", "current", "first", "candidate", "attemptFocus", "loop", "reverse", "foundCurrent", "array", "options", "currentlyFocusedChild", "currentTabIndexChild", "firstFocusableChild", "child", "event", "currentItem", "item", "isRtl", "AriaToolbarMixin", "Base", "KeyboardNavMixin", "SurfaceMixin", "Base", "hoveredState", "pressedState", "Surface_default", "CustomElement", "ThemableMixin", "FlexableMixin", "SurfaceMixin", "ShapeMixin", "surface", "shape", "BottomAppBar_default", "Surface_default", "AriaToolbarMixin", "AriaReflectorMixin", "svgAliasMap", "unaliased", "documentLoadedStyleSheets", "Icon", "CustomElement", "ThemableMixin", "_slottedText", "result", "svgPath", "_svgAlias", "viewBox", "svg", "_computedSVGPath", "src", "currentTarget", "href", "parentNode", "link", "name", "path", "width", "height", "FORM_IPC_EVENT", "DOMString", "FormAssociatedMixin", "Base", "_invalid", "_userInteracted", "_defaultValue", "value", "type", "checked", "_valueBehavior", "_value", "v", "_checked", "_formDisabled", "disabled", "error", "key", "newTarget", "form", "event", "name", "state", "mode", "ControlMixin", "Base", "FormAssociatedMixin", "control", "options", "validityState", "newValidity", "key", "error", "template", "html", "ariaLabel", "oldValue", "newValue", "cloneAttributeCallback", "currentTarget", "IMPLICIT_SUBMISSION_BLOCKING_TYPES", "DOMString", "InputMixin", "Base", "ControlMixin", "control", "oldValue", "newValue", "input", "cloneAttributeCallback", "checked", "value", "event", "form", "defaultButton", "submissionBlockers", "element", "EVENT_HANDLER_TYPE", "v", "name", "oldValue", "newValue", "button", "fn", "eventName", "queuedPropsByElement", "previousAnimationsByElement", "elementStylerMicrotaskCallback", "name", "previousAnimations", "previousAnimation", "value", "target", "styles", "timing", "currentAnimation", "ELEMENT_STYLER_TYPE", "oldValue", "newValue", "queuedProps", "hasQueue", "Ripple_default", "CustomElement", "oldValue", "newValue", "ELEMENT_STYLER_TYPE", "_positionX", "_positionY", "_radius", "x", "y", "size", "hypotenuse", "parentWidth", "parentHeight", "width", "height", "animationName", "RippleMixin", "Base", "element", "ripple", "x", "y", "hold", "rippleContainer", "Ripple_default", "event", "rect", "lastRipple", "oldValue", "pressed", "lastInteractionWasTouch", "StateMixin", "Base", "disabled", "_hovered", "hovered", "_focused", "focused", "_pressed", "pressed", "_lastInteraction", "event", "Button_default", "CustomElement", "ThemableMixin", "DensityMixin", "SurfaceMixin", "ShapeMixin", "StateMixin", "RippleMixin", "InputMixin", "icon", "svg", "src", "svgPath", "ariaLabel", "_slotInnerText", "options", "shape", "state", "rippleContainer", "surface", "control", "currentTarget", "value", "form", "duplicatedButton", "SUPPORTS_INERT", "Card_default", "CustomElement", "ThemableMixin", "FlexableMixin", "SurfaceMixin", "ShapeMixin", "FormAssociatedMixin", "StateMixin", "AriaReflectorMixin", "EVENT_HANDLER_TYPE", "disabledState", "slot", "surface", "shape", "outline", "CheckboxIcon_default", "CustomElement", "ThemableMixin", "ShapeMixin", "value", "html", "outline", "shape", "TouchTargetMixin", "Base", "Checkbox_default", "CustomElement", "ThemableMixin", "StateMixin", "RippleMixin", "InputMixin", "TouchTargetMixin", "indeterminate", "checked", "indeterminateIcon", "icon", "event", "control", "checkbox", "state", "rippleContainer", "Chip_default", "Button_default", "inline", "slot", "outline", "icon", "ink", "iconInk", "Divider_default", "CustomElement", "ThemableMixin", "DialogActions_default", "CustomElement", "canAnchorPopup", "options", "pageX", "pageY", "directionX", "directionY", "clientX", "clientY", "anchor", "rect", "width", "height", "popup", "top", "right", "bottom", "left", "margin", "pageTop", "pageBottom", "pageRight", "pageLeft", "offsetX", "offsetY", "fullSize", "visibility", "CustomElement", "supportsHTMLDialogElement", "OPEN_POPUPS", "onWindowResize", "lastOpenPopup", "onPopState", "event", "key", "cancelEvent", "onBeforeUnload", "PopupMixin", "Base", "anchor", "flow", "layoutElement", "width", "height", "initialRect", "anchorOptions", "isPageRTL", "xStart", "xEnd", "preferences", "anchorResult", "preference", "result", "canAnchorPopup", "currentTarget", "hasContent", "node", "source", "focus", "previousFocus", "newState", "previousState", "scrollRestoration", "returnValue", "returnFocus", "main", "attemptFocus", "len", "i", "entry", "open", "listTabbables", "root", "treeWalker", "focusables", "node", "el", "focusOnTree", "autofocus", "forward", "attemptFocus", "Dialog_default", "CustomElement", "ThemableMixin", "SurfaceMixin", "ShapeMixin", "PopupMixin", "currentTarget", "hasContent", "event", "returnValue", "form", "e", "d", "prepend", "append", "surface", "shape", "dialog", "slot", "tabbables", "focusNext", "focused", "cancelEvent", "activeElement", "ExtendedFab_default", "Button_default", "Tooltip_default", "Surface_default", "AriaReflectorMixin", "oldValue", "newValue", "TooltipTriggerMixin", "Base", "_tooltip", "_idleDebounce", "_pendingHide", "_watchedParents", "_resizeObserver", "_intersectObserver", "_TooltipTrigger", "args", "__privateAdd", "__publicField", "event", "__privateSet", "__privateGet", "entries", "threshold", "entry", "child", "type", "timeout", "touch", "offsetParent", "parent", "hoverStyle", "domRect", "anchorOptions", "isPageRTL", "xStart", "xEnd", "preferences", "anchorResult", "preference", "result", "canAnchorPopup", "TooltipTrigger", "template", "html", "Fab_default", "ExtendedFab_default", "TooltipTriggerMixin", "slot", "tooltipSlot", "control", "shape", "icon", "FilterChip_default", "Chip_default", "trailingIcon", "dropdown", "trailingSrc", "shape", "icon", "control", "outline", "slot", "checkIcon", "Headline_default", "Box_default", "ThemableMixin", "ariaLevel", "size", "slot", "IconButton_default", "Button_default", "TooltipTriggerMixin", "type", "checked", "event", "input", "clickEvent", "slot", "shape", "tooltipSlot", "icon", "control", "outline", "anchor", "el", "resizeObserver", "entries", "entry", "ResizeObserverMixin", "Base", "TextFieldMixin", "Base", "DensityMixin", "ShapeMixin", "error", "_invalid", "_userInteracted", "filled", "outlined", "label", "placeholder", "erroredState", "supporting", "_validationMessage", "value", "_badInput", "html", "inline", "control", "outline", "shape", "outlineLeft", "outlineRight", "state", "shapeTop", "oldValue", "newValue", "Popup_default", "CustomElement", "ThemableMixin", "SurfaceMixin", "ShapeMixin", "PopupMixin", "shape", "surface", "dialog", "sharedPopup", "getSharedPopup", "Popup_default", "Input_default", "CustomElement", "ThemableMixin", "StateMixin", "InputMixin", "TextFieldMixin", "ResizeObserverMixin", "_listbox", "event", "selectedItem", "refs", "control", "ariaListbox", "shape", "popup", "option", "_draftInput", "_value", "_input", "suggestion", "value", "previous", "current", "previousItem", "currentItem", "currentTarget", "listbox", "relatedTarget", "_hasListbox", "_expanded", "suggestInline", "_focusedValue", "Label_default", "Box_default", "Layout_default", "CustomElement", "twoFlexible", "twoFixed", "oneFlexible", "oneFixed", "ELEMENT_STYLER_TYPE", "_navDrawerTranslateX", "_navDrawerDuration", "innerWidth", "minWidth", "nav", "column1", "column2", "padding", "_touchDeltaX", "refs", "clientWidth", "visibility", "event", "clientX", "pageX", "touches", "delta", "target", "slotElement", "slotted", "previous", "current", "List_default", "Box_default", "DensityMixin", "AriaReflectorMixin", "RadioIcon_default", "CustomElement", "ThemableMixin", "ShapeMixin", "value", "outline", "ListItem_default", "CustomElement", "ThemableMixin", "StateMixin", "RippleMixin", "AriaReflectorMixin", "disabled", "href", "state", "rippleContainer", "anchor", "oldValue", "newValue", "currentTarget", "_ListOption", "ListItem_default", "_selectedDirty", "defaultSelected", "_selected", "value", "_formDisabled", "disabled", "formDisabled", "options", "inline", "anchor", "state", "content", "disabledState", "selected", "previous", "current", "text", "ListOption", "constructHTMLOptionsCollectionProxy", "host", "collection", "OptionConstructor", "GroupConstructor", "add", "element", "before", "beforeElement", "index", "remove", "i", "value", "target", "p", "receiver", "newValue", "currentSize", "Listbox_default", "List_default", "StateMixin", "FormAssociatedMixin", "KeyboardNavMixin", "constructHTMLOptionsCollectionProxy", "ListOption", "selectedItem", "value", "itemToSelect", "option", "v", "newValue", "vString", "oldValue", "el", "index", "name", "event", "target", "sendUpdateNotifications", "Menu_default", "CustomElement", "ThemableMixin", "SurfaceMixin", "ShapeMixin", "PopupMixin", "DensityMixin", "KeyboardNavMixin", "items", "submenuItems", "el", "value", "shape", "surface", "dialog", "scrim", "args", "result", "firstItem", "attemptFocus", "cascader", "event", "menuItem", "subMenuId", "submenu", "MenuItem", "ListOption", "FormAssociatedMixin", "value", "event", "name", "trailingIcon", "cascades", "oldValue", "newValue", "inline", "html", "checkboxRef", "radioRef", "anchor", "trailing", "checkbox", "radio", "ScrollListenerMixin", "Base", "event", "scroller", "SemiStickyMixin", "Base", "ScrollListenerMixin", "semiStickyElement", "ELEMENT_STYLER_TYPE", "_semiStickyTranslateX", "_semiStickyTranslateY", "_semiStickyDuration", "_semiStickyEasing", "oldValue", "newValue", "delta", "anchor", "distanceFromAnchor", "offsetTop", "visibility", "max", "resizeObserver", "NavItem", "CustomElement", "ThemableMixin", "StateMixin", "RippleMixin", "ShapeMixin", "args", "active", "ariaLabel", "href", "html", "shape", "state", "rippleContainer", "key", "repeat", "Nav_default", "Surface_default", "event", "NavItem", "el", "NavBar_default", "Nav_default", "SemiStickyMixin", "NavBarItem_default", "NavItem", "NavRail_default", "Nav_default", "html", "slot", "NavDrawer_default", "NavRail_default", "NavDrawerItem_default", "NavItem", "html", "NavRailItem_default", "NavItem", "Progress_default", "CustomElement", "ThemableMixin", "value", "max", "oldValue", "newValue", "Radio_default", "CustomElement", "ThemableMixin", "StateMixin", "RippleMixin", "InputMixin", "TouchTargetMixin", "event", "control", "radio", "rippleContainer", "state", "TopAppBar_default", "CustomElement", "ThemableMixin", "SurfaceMixin", "ShapeMixin", "AriaToolbarMixin", "SemiStickyMixin", "ELEMENT_STYLER_TYPE", "size", "_headlineOpacity", "inline", "surface", "shape", "leading", "headline", "trailing", "ariaLabel", "oldValue", "newValue", "max", "min", "value", "Search_default", "TopAppBar_default", "value", "currentTarget", "event", "companion", "headline", "input", "surface", "SegmentedButton_default", "Button_default", "html", "inline", "shape", "icon", "outline", "control", "slot", "state", "type", "checked", "SegmentedButtonGroup_default", "Box_default", "KeyboardNavMixin", "AriaReflectorMixin", "SegmentedButton_default", "list", "index", "child", "Select_default", "CustomElement", "ThemableMixin", "StateMixin", "ControlMixin", "TextFieldMixin", "event", "select", "child", "template", "slot", "prefix", "suffix", "control", "oldValue", "newValue", "Shape_default", "Box_default", "ShapeMixin", "shape", "outline", "parseFloat", "value", "onNaN", "number", "valueAsFraction", "min", "max", "nValue", "nMin", "nMax", "Slider_default", "CustomElement", "ThemableMixin", "StateMixin", "InputMixin", "event", "input", "offsetX", "clientX", "pageX", "isActive", "isTouch", "touch", "clientWidth", "position", "step", "nStep", "isRtl", "currentValue", "roundedValue", "scale", "fractionalValue", "thumbOffset", "thumbMin", "thumbMax", "currentTarget", "ticks", "_previewValue", "_isHoveringThumb", "focusedState", "thumb", "state", "control", "oldValue", "newValue", "Snackbar_default", "Surface_default", "DensityMixin", "AriaReflectorMixin", "EVENT_HANDLER_TYPE", "resolve", "text", "content", "slot", "SwitchIcon_default", "CustomElement", "ThemableMixin", "ShapeMixin", "selected", "value", "disabled", "pressed", "focused", "hovered", "color", "_active", "icon", "src", "unselectedIcon", "unselectedSrc", "outline", "track", "oldValue", "newValue", "Switch_default", "CustomElement", "ThemableMixin", "InputMixin", "StateMixin", "TouchTargetMixin", "event", "control", "switchEl", "state", "input", "offsetX", "clientX", "pageX", "isActive", "touch", "clientWidth", "position", "currentValue", "pixels", "currentPixels", "newRatio", "newValue", "Tab_default", "CustomElement", "ShapeMixin", "StateMixin", "RippleMixin", "ScrollListenerMixin", "slot", "icon", "target", "options", "href", "active", "disabledState", "data", "shape", "rippleContainer", "state", "event", "el", "registeredElements", "rtlObserver", "RTLObserverMixin", "Base", "isRTL", "el", "TabList_default", "CustomElement", "ThemableMixin", "KeyboardNavMixin", "ResizeObserverMixin", "RTLObserverMixin", "ShapeMixin", "value", "oldValue", "newValue", "Tab_default", "tab", "index", "el", "width", "position", "animate", "percentage", "metrics", "clamped", "decimalIndex", "leftIndex", "rightIndex", "leftMetrics", "rightMetrics", "activeTab", "center", "leftRatio", "rightRatio", "leftWidth", "rightWidth", "activeIndex", "distance", "tabContent", "start", "max", "shape", "indicator", "target", "TabPanel_default", "Box_default", "AriaReflectorMixin", "oldValue", "newValue", "TabContent_default", "CustomElement", "ResizeObserverMixin", "panel", "index", "value", "el", "start", "width", "end", "metric", "percentage", "event", "slot", "TabPanel_default", "DOMString", "TextArea_default", "CustomElement", "ThemableMixin", "StateMixin", "ControlMixin", "TextFieldMixin", "ResizeObserverMixin", "value", "previousValue", "newValue", "textarea", "userHeight", "lineHeight", "lastClientHeight", "entry", "currentTarget", "child", "control", "oldValue", "cloneAttributeCallback", "Title_default", "Headline_default", "ariaLevel", "size", "loader_exports", "theming_exports", "__export", "generateColorCSS", "generateShapeCSS", "generateThemeCSS", "generateTypographyCSS", "generateTypographyGlobalCSS", "setupTheme", "themeOptionsFromSearchParams", "COLOR_KEYWORDS", "signum", "num", "lerp", "start", "stop", "amount", "clampInt", "min", "max", "input", "sanitizeDegreesDouble", "degrees", "rotationDirection", "from", "to", "differenceDegrees", "a", "b", "matrixMultiply", "row", "matrix", "c", "SRGB_TO_XYZ", "XYZ_TO_SRGB", "WHITE_POINT_D65", "argbFromRgb", "red", "green", "blue", "argbFromLinrgb", "linrgb", "r", "delinearized", "g", "b", "redFromArgb", "argb", "greenFromArgb", "blueFromArgb", "argbFromXyz", "x", "y", "z", "matrix", "XYZ_TO_SRGB", "linearR", "linearG", "linearB", "r", "delinearized", "g", "b", "argbFromRgb", "xyzFromArgb", "argb", "linearized", "redFromArgb", "greenFromArgb", "blueFromArgb", "matrixMultiply", "SRGB_TO_XYZ", "argbFromLstar", "lstar", "y", "yFromLstar", "component", "delinearized", "argbFromRgb", "lstarFromArgb", "argb", "xyzFromArgb", "labF", "labInvf", "lstarFromY", "linearized", "rgbComponent", "normalized", "clampInt", "whitePointD65", "WHITE_POINT_D65", "labF", "kappa", "labInvf", "ft", "ft3", "_ViewingConditions", "whitePoint", "whitePointD65", "adaptingLuminance", "yFromLstar", "backgroundLstar", "surround", "discountingIlluminant", "xyz", "rW", "gW", "bW", "f", "c", "lerp", "d", "nc", "rgbD", "k", "k4", "k4F", "fl", "n", "z", "nbb", "ncb", "rgbAFactors", "rgbA", "aw", "fLRoot", "ViewingConditions", "__publicField", "Cam16", "argb", "ViewingConditions", "viewingConditions", "red", "green", "blue", "redL", "linearized", "greenL", "blueL", "x", "y", "z", "rC", "gC", "bC", "rD", "gD", "bD", "rAF", "gAF", "bAF", "rA", "signum", "gA", "bA", "a", "b", "u", "p2", "atanDegrees", "hue", "hueRadians", "j", "q", "huePrime", "eHue", "alpha", "c", "m", "s", "jstar", "mstar", "astar", "bstar", "h", "J", "Q", "C", "M", "chroma", "other", "dJ", "dA", "dB", "t", "hRad", "ac", "p1", "hSin", "hCos", "gamma", "rCBase", "gCBase", "bCBase", "rF", "gF", "bF", "argbFromXyz", "SCALED_DISCOUNT_FROM_LINRGB", "LINRGB_FROM_SCALED_DISCOUNT", "Y_FROM_LINRGB", "CRITICAL_PLANES", "sanitizeRadians", "angle", "trueDelinearized", "rgbComponent", "normalized", "delinearized", "chromaticAdaptation", "component", "af", "signum", "hueOf", "linrgb", "scaledDiscount", "matrixMultiply", "rA", "gA", "bA", "a", "b", "areInCyclicOrder", "c", "deltaAB", "deltaAC", "intercept", "source", "mid", "target", "lerpPoint", "t", "setCoordinate", "coordinate", "axis", "isBounded", "x", "nthVertex", "y", "n", "kR", "kG", "kB", "coordA", "coordB", "g", "r", "bisectToSegment", "targetHue", "left", "right", "leftHue", "rightHue", "initialized", "uncut", "midHue", "midpoint", "criticalPlaneBelow", "criticalPlaneAbove", "bisectToLimit", "segment", "lPlane", "rPlane", "i", "mPlane", "midPlaneCoordinate", "inverseChromaticAdaptation", "adapted", "adaptedAbs", "base", "findResultByJ", "hueRadians", "chroma", "j", "viewingConditions", "ViewingConditions", "tInnerCoeff", "p1", "hSin", "hCos", "iterationRound", "jNormalized", "p2", "gamma", "rCScaled", "gCScaled", "bCScaled", "fnj", "argbFromLinrgb", "solveToInt", "hueDegrees", "lstar", "argbFromLstar", "sanitizeDegreesDouble", "yFromLstar", "exactAnswer", "Hct", "hue", "chroma", "tone", "solveToInt", "argb", "cam", "Cam16", "lstarFromArgb", "newHue", "newChroma", "newTone", "vc", "viewedInVc", "recastInVc", "ViewingConditions", "lstarFromY", "harmonize", "designColor", "sourceColor", "fromHct", "Hct", "toHct", "differenceDegrees", "rotationDegrees", "outputHue", "sanitizeDegreesDouble", "rotationDirection", "TonalPalette", "argb", "hct", "Hct", "hue", "chroma", "#cache", "tone", "_createPaletteFromColors", "createPaletteFromColors_fn", "_CorePalette", "argb", "colors", "_a", "__privateMethod", "isContent", "hct", "Hct", "hue", "chroma", "TonalPalette", "CorePalette", "content", "palette", "p", "__privateAdd", "Scheme", "argb", "CorePalette", "core", "props", "parseIntHex", "value", "argbFromHex", "hex", "isThree", "isSix", "isEight", "r", "g", "b", "cssVarFromArgb", "argb", "redFromArgb", "greenFromArgb", "blueFromArgb", "cssVariablesFromScheme", "scheme", "cssVariablesFromCustom", "name", "tonalPalette", "isDark", "getScheme", "mainColor", "customColors", "argbColor", "argbFromHex", "lightRules", "Scheme", "darkRules", "lightContentRules", "darkContentRules", "color", "argbCustom", "blended", "harmonize", "tp", "CorePalette", "ctp", "svgToCSSURL", "svg", "getShapeMaskSVG", "shape", "getShapeCornerSVGs", "corner", "convex", "path", "getShapeEdgesSVGs", "CIRCLE_PATH", "DIAMOND_PATH", "SQUIRCLE_PATH", "SHAPE_ROUNDED_DEFAULT", "CIRCLE_PATH", "SHAPE_CUT_DEFAULT", "DIAMOND_PATH", "SHAPE_SQUIRCLE_DEFAULT", "SQUIRCLE_PATH", "SP", "TYPOGRAPHY_DEFAULT", "generateTypographyCSS", "config", "generateTypographyGlobalCSS", "style", "size", "generateShapeCSS", "svgToCSSURL", "getShapeMaskSVG", "getShapeCornerSVGs", "getShapeEdgesSVGs", "addStyle", "content", "element", "generateColorCSS", "color", "custom", "lightness", "parsedColors", "name", "hex", "COLOR_KEYWORDS", "scheme", "getScheme", "setupTheme", "themeOptionsFromSearchParams", "searchParams", "c", "generateThemeCSS", "shapeCss", "typographyCss", "colorCss", "rules", "generateThemeCSS", "themeOptionsFromSearchParams", "generateTypographyGlobalCSS", "parsed", "css"]
7
7
  }