@shortfuse/materialdesignweb 0.8.0 → 0.9.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.
- package/README.md +32 -24
- package/bin/mdw-css.js +1 -1
- package/components/Badge.js +12 -5
- package/components/Body.js +3 -0
- package/components/BottomAppBar.js +1 -8
- package/components/BottomSheet.js +424 -0
- package/components/Box.js +11 -49
- package/components/Button.js +61 -82
- package/components/Card.js +56 -61
- package/components/Checkbox.js +7 -25
- package/components/CheckboxIcon.js +10 -28
- package/components/Chip.js +13 -11
- package/components/Dialog.js +49 -98
- package/components/Display.js +55 -0
- package/components/Fab.js +83 -17
- package/components/FabContainer.js +48 -0
- package/components/FilterChip.js +34 -32
- package/components/Grid.js +176 -0
- package/components/Headline.js +5 -28
- package/components/Icon.js +54 -69
- package/components/IconButton.js +71 -120
- package/components/Input.js +669 -83
- package/components/InputChip.js +161 -0
- package/components/Label.js +3 -0
- package/components/List.js +1 -5
- package/components/ListItem.js +39 -23
- package/components/ListOption.js +79 -62
- package/components/Listbox.js +19 -10
- package/components/Menu.js +8 -18
- package/components/MenuItem.js +25 -26
- package/components/NavBar.js +53 -19
- package/components/NavDrawer.js +15 -15
- package/components/NavDrawerItem.js +2 -4
- package/components/NavItem.js +40 -33
- package/components/NavRail.js +23 -21
- package/components/NavRailItem.js +5 -2
- package/components/Page.js +105 -0
- package/components/Pane.js +18 -0
- package/components/Popup.js +17 -8
- package/components/Radio.js +2 -5
- package/components/RadioIcon.js +10 -14
- package/components/Ripple.js +11 -7
- package/components/Root.js +209 -0
- package/components/Scrim.js +87 -0
- package/components/Search.js +12 -20
- package/components/SegmentedButton.js +33 -36
- package/components/SegmentedButtonGroup.js +9 -3
- package/components/Select.js +6 -7
- package/components/Shape.js +5 -65
- package/components/SideSheet.js +308 -0
- package/components/Slider.js +71 -34
- package/components/Snackbar.js +22 -16
- package/components/SnackbarContainer.js +42 -0
- package/components/Surface.js +15 -10
- package/components/Switch.js +3 -16
- package/components/SwitchIcon.js +40 -32
- package/components/Tab.js +57 -38
- package/components/TabContent.js +1 -0
- package/components/TabList.js +60 -32
- package/components/TabPanel.js +1 -1
- package/components/Table.js +116 -0
- package/components/TextArea.js +16 -15
- package/components/Title.js +4 -9
- package/components/Tooltip.js +43 -21
- package/components/TopAppBar.js +56 -78
- package/constants/shapes.js +36 -0
- package/constants/typography.js +127 -0
- package/core/Composition.js +354 -192
- package/core/CompositionAdapter.js +11 -12
- package/core/CustomElement.js +588 -236
- package/core/css.js +117 -12
- package/core/customTypes.js +120 -25
- package/core/dom.js +17 -11
- package/core/jsonMergePatch.js +12 -10
- package/core/observe.js +298 -253
- package/core/optimizations.js +9 -9
- package/core/template.js +14 -57
- package/dist/index.min.js +85 -115
- package/dist/index.min.js.map +4 -4
- package/dist/meta.json +1 -1
- package/dom/HTMLOptionsCollectionProxy.js +106 -0
- package/{theming/themableMixinLoader.js → loaders/palette.js} +4 -3
- package/loaders/theme.js +12 -0
- package/mixins/AriaReflectorMixin.js +53 -13
- package/mixins/AriaToolbarMixin.js +3 -0
- package/mixins/ControlMixin.js +76 -33
- package/mixins/DelegatesFocusMixin.js +54 -0
- package/mixins/DensityMixin.js +2 -2
- package/mixins/ElevationMixin.js +62 -0
- package/mixins/FlexableMixin.js +66 -37
- package/mixins/FormAssociatedMixin.js +60 -8
- package/mixins/HyperlinkMixin.js +66 -0
- package/mixins/InputMixin.js +205 -32
- package/mixins/KeyboardNavMixin.js +8 -6
- package/mixins/NavigationListenerMixin.js +33 -0
- package/mixins/PopupMixin.js +176 -208
- package/mixins/ResizeObserverMixin.js +16 -4
- package/mixins/RippleMixin.js +8 -6
- package/mixins/ScrollListenerMixin.js +1 -1
- package/mixins/SemiStickyMixin.js +44 -98
- package/mixins/ShapeMaskedMixin.js +117 -0
- package/mixins/ShapeMixin.js +22 -204
- package/mixins/StateMixin.js +70 -34
- package/mixins/TextFieldMixin.js +107 -143
- package/mixins/ThemableMixin.js +44 -56
- package/mixins/TooltipTriggerMixin.js +291 -359
- package/mixins/TouchTargetMixin.js +1 -1
- package/mixins/TypographyMixin.js +121 -0
- package/package.json +110 -74
- package/services/rtl.js +10 -0
- package/services/svgAlias.js +17 -0
- package/{theming/index.js → services/theme.js} +24 -174
- package/types/bin/mdw-css.d.ts +3 -0
- package/types/bin/mdw-css.d.ts.map +1 -0
- package/types/components/Badge.d.ts +39 -0
- package/types/components/Badge.d.ts.map +1 -0
- package/types/components/Body.d.ts +29 -0
- package/types/components/Body.d.ts.map +1 -0
- package/types/components/BottomAppBar.d.ts +73 -0
- package/types/components/BottomAppBar.d.ts.map +1 -0
- package/types/components/BottomSheet.d.ts +109 -0
- package/types/components/BottomSheet.d.ts.map +1 -0
- package/types/components/Box.d.ts +16 -0
- package/types/components/Box.d.ts.map +1 -0
- package/types/components/Button.d.ts +714 -0
- package/types/components/Button.d.ts.map +1 -0
- package/types/components/Card.d.ts +412 -0
- package/types/components/Card.d.ts.map +1 -0
- package/types/components/Checkbox.d.ts +205 -0
- package/types/components/Checkbox.d.ts.map +1 -0
- package/types/components/CheckboxIcon.d.ts +44 -0
- package/types/components/CheckboxIcon.d.ts.map +1 -0
- package/types/components/Chip.d.ts +1425 -0
- package/types/components/Chip.d.ts.map +1 -0
- package/types/components/Dialog.d.ts +286 -0
- package/types/components/Dialog.d.ts.map +1 -0
- package/types/components/DialogActions.d.ts +4 -0
- package/types/components/DialogActions.d.ts.map +1 -0
- package/types/components/Display.d.ts +45 -0
- package/types/components/Display.d.ts.map +1 -0
- package/types/components/Divider.d.ts +10 -0
- package/types/components/Divider.d.ts.map +1 -0
- package/types/components/Fab.d.ts +741 -0
- package/types/components/Fab.d.ts.map +1 -0
- package/types/components/FabContainer.d.ts +10 -0
- package/types/components/FabContainer.d.ts.map +1 -0
- package/types/components/FilterChip.d.ts +4283 -0
- package/types/components/FilterChip.d.ts.map +1 -0
- package/types/components/Grid.d.ts +37 -0
- package/types/components/Grid.d.ts.map +1 -0
- package/types/components/Headline.d.ts +47 -0
- package/types/components/Headline.d.ts.map +1 -0
- package/types/components/Icon.d.ts +103 -0
- package/types/components/Icon.d.ts.map +1 -0
- package/types/components/IconButton.d.ts +1486 -0
- package/types/components/IconButton.d.ts.map +1 -0
- package/types/components/Input.d.ts +51288 -0
- package/types/components/Input.d.ts.map +1 -0
- package/types/components/InputChip.d.ts +243 -0
- package/types/components/InputChip.d.ts.map +1 -0
- package/types/components/Label.d.ts +29 -0
- package/types/components/Label.d.ts.map +1 -0
- package/types/components/List.d.ts +31 -0
- package/types/components/List.d.ts.map +1 -0
- package/types/components/ListItem.d.ts +349 -0
- package/types/components/ListItem.d.ts.map +1 -0
- package/types/components/ListOption.d.ts +1493 -0
- package/types/components/ListOption.d.ts.map +1 -0
- package/types/components/Listbox.d.ts +12012 -0
- package/types/components/Listbox.d.ts.map +1 -0
- package/types/components/Menu.d.ts +119 -0
- package/types/components/Menu.d.ts.map +1 -0
- package/types/components/MenuItem.d.ts +3109 -0
- package/types/components/MenuItem.d.ts.map +1 -0
- package/types/components/NavBar.d.ts +18 -0
- package/types/components/NavBar.d.ts.map +1 -0
- package/types/components/NavBarItem.d.ts +186 -0
- package/types/components/NavBarItem.d.ts.map +1 -0
- package/types/components/NavDrawer.d.ts +108 -0
- package/types/components/NavDrawer.d.ts.map +1 -0
- package/types/components/NavDrawerItem.d.ts +186 -0
- package/types/components/NavDrawerItem.d.ts.map +1 -0
- package/types/components/NavItem.d.ts +190 -0
- package/types/components/NavItem.d.ts.map +1 -0
- package/types/components/NavRail.d.ts +109 -0
- package/types/components/NavRail.d.ts.map +1 -0
- package/types/components/NavRailItem.d.ts +186 -0
- package/types/components/NavRailItem.d.ts.map +1 -0
- package/types/components/Page.d.ts +24 -0
- package/types/components/Page.d.ts.map +1 -0
- package/types/components/Pane.d.ts +44 -0
- package/types/components/Pane.d.ts.map +1 -0
- package/types/components/Popup.d.ts +76 -0
- package/types/components/Popup.d.ts.map +1 -0
- package/types/components/Progress.d.ts +19 -0
- package/types/components/Progress.d.ts.map +1 -0
- package/types/components/Radio.d.ts +199 -0
- package/types/components/Radio.d.ts.map +1 -0
- package/types/components/RadioIcon.d.ts +46 -0
- package/types/components/RadioIcon.d.ts.map +1 -0
- package/types/components/Ripple.d.ts +34 -0
- package/types/components/Ripple.d.ts.map +1 -0
- package/types/components/Root.d.ts +68 -0
- package/types/components/Root.d.ts.map +1 -0
- package/types/components/Scrim.d.ts +6 -0
- package/types/components/Scrim.d.ts.map +1 -0
- package/types/components/Search.d.ts +16 -0
- package/types/components/Search.d.ts.map +1 -0
- package/types/components/SegmentedButton.d.ts +718 -0
- package/types/components/SegmentedButton.d.ts.map +1 -0
- package/types/components/SegmentedButtonGroup.d.ts +44 -0
- package/types/components/SegmentedButtonGroup.d.ts.map +1 -0
- package/types/components/Select.d.ts +1361 -0
- package/types/components/Select.d.ts.map +1 -0
- package/types/components/Shape.d.ts +10 -0
- package/types/components/Shape.d.ts.map +1 -0
- package/types/components/SideSheet.d.ts +106 -0
- package/types/components/SideSheet.d.ts.map +1 -0
- package/types/components/Slider.d.ts +382 -0
- package/types/components/Slider.d.ts.map +1 -0
- package/types/components/Snackbar.d.ts +65 -0
- package/types/components/Snackbar.d.ts.map +1 -0
- package/types/components/SnackbarContainer.d.ts +6 -0
- package/types/components/SnackbarContainer.d.ts.map +1 -0
- package/types/components/Surface.d.ts +45 -0
- package/types/components/Surface.d.ts.map +1 -0
- package/types/components/Switch.d.ts +183 -0
- package/types/components/Switch.d.ts.map +1 -0
- package/types/components/SwitchIcon.d.ts +169 -0
- package/types/components/SwitchIcon.d.ts.map +1 -0
- package/types/components/Tab.d.ts +879 -0
- package/types/components/Tab.d.ts.map +1 -0
- package/types/components/TabContent.d.ts +122 -0
- package/types/components/TabContent.d.ts.map +1 -0
- package/types/components/TabList.d.ts +6266 -0
- package/types/components/TabList.d.ts.map +1 -0
- package/types/components/TabPanel.d.ts +28 -0
- package/types/components/TabPanel.d.ts.map +1 -0
- package/types/components/Table.d.ts +2 -0
- package/types/components/Table.d.ts.map +1 -0
- package/types/components/TextArea.d.ts +1394 -0
- package/types/components/TextArea.d.ts.map +1 -0
- package/types/components/Title.d.ts +47 -0
- package/types/components/Title.d.ts.map +1 -0
- package/types/components/Tooltip.d.ts +49 -0
- package/types/components/Tooltip.d.ts.map +1 -0
- package/types/components/TopAppBar.d.ts +130 -0
- package/types/components/TopAppBar.d.ts.map +1 -0
- package/types/constants/colorKeywords.d.ts +2 -0
- package/types/constants/colorKeywords.d.ts.map +1 -0
- package/types/constants/shapes.d.ts +38 -0
- package/types/constants/shapes.d.ts.map +1 -0
- package/types/constants/typography.d.ts +212 -0
- package/types/constants/typography.d.ts.map +1 -0
- package/types/core/Composition.d.ts +252 -0
- package/types/core/Composition.d.ts.map +1 -0
- package/types/core/CompositionAdapter.d.ts +92 -0
- package/types/core/CompositionAdapter.d.ts.map +1 -0
- package/types/core/CustomElement.d.ts +302 -0
- package/types/core/CustomElement.d.ts.map +1 -0
- package/types/core/css.d.ts +44 -0
- package/types/core/css.d.ts.map +1 -0
- package/types/core/customTypes.d.ts +26 -0
- package/types/core/customTypes.d.ts.map +1 -0
- package/types/core/dom.d.ts +32 -0
- package/types/core/dom.d.ts.map +1 -0
- package/types/core/jsonMergePatch.d.ts +31 -0
- package/types/core/jsonMergePatch.d.ts.map +1 -0
- package/types/core/observe.d.ts +113 -0
- package/types/core/observe.d.ts.map +1 -0
- package/types/core/optimizations.d.ts +7 -0
- package/types/core/optimizations.d.ts.map +1 -0
- package/types/core/template.d.ts +47 -0
- package/types/core/template.d.ts.map +1 -0
- package/types/core/uid.d.ts +6 -0
- package/types/core/uid.d.ts.map +1 -0
- package/types/dom/HTMLOptionsCollectionProxy.d.ts +18 -0
- package/types/dom/HTMLOptionsCollectionProxy.d.ts.map +1 -0
- package/types/index.d.ts +88 -0
- package/types/index.d.ts.map +1 -0
- package/types/loaders/palette.d.ts +2 -0
- package/types/loaders/palette.d.ts.map +1 -0
- package/types/loaders/theme.d.ts +2 -0
- package/types/loaders/theme.d.ts.map +1 -0
- package/types/mixins/AriaReflectorMixin.d.ts +23 -0
- package/types/mixins/AriaReflectorMixin.d.ts.map +1 -0
- package/types/mixins/AriaToolbarMixin.d.ts +32 -0
- package/types/mixins/AriaToolbarMixin.d.ts.map +1 -0
- package/types/mixins/ControlMixin.d.ts +124 -0
- package/types/mixins/ControlMixin.d.ts.map +1 -0
- package/types/mixins/DelegatesFocusMixin.d.ts +5 -0
- package/types/mixins/DelegatesFocusMixin.d.ts.map +1 -0
- package/types/mixins/DensityMixin.d.ts +5 -0
- package/types/mixins/DensityMixin.d.ts.map +1 -0
- package/types/mixins/ElevationMixin.d.ts +33 -0
- package/types/mixins/ElevationMixin.d.ts.map +1 -0
- package/types/mixins/FlexableMixin.d.ts +13 -0
- package/types/mixins/FlexableMixin.d.ts.map +1 -0
- package/types/mixins/FormAssociatedMixin.d.ts +122 -0
- package/types/mixins/FormAssociatedMixin.d.ts.map +1 -0
- package/types/mixins/HyperlinkMixin.d.ts +22 -0
- package/types/mixins/HyperlinkMixin.d.ts.map +1 -0
- package/types/mixins/InputMixin.d.ts +179 -0
- package/types/mixins/InputMixin.d.ts.map +1 -0
- package/types/mixins/KeyboardNavMixin.d.ts +47 -0
- package/types/mixins/KeyboardNavMixin.d.ts.map +1 -0
- package/types/mixins/NavigationListenerMixin.d.ts +8 -0
- package/types/mixins/NavigationListenerMixin.d.ts.map +1 -0
- package/types/mixins/PopupMixin.d.ts +82 -0
- package/types/mixins/PopupMixin.d.ts.map +1 -0
- package/types/mixins/RTLObserverMixin.d.ts +7 -0
- package/types/mixins/RTLObserverMixin.d.ts.map +1 -0
- package/types/mixins/ResizeObserverMixin.d.ts +12 -0
- package/types/mixins/ResizeObserverMixin.d.ts.map +1 -0
- package/types/mixins/RippleMixin.d.ts +92 -0
- package/types/mixins/RippleMixin.d.ts.map +1 -0
- package/types/mixins/ScrollListenerMixin.d.ts +41 -0
- package/types/mixins/ScrollListenerMixin.d.ts.map +1 -0
- package/types/mixins/SemiStickyMixin.d.ts +50 -0
- package/types/mixins/SemiStickyMixin.d.ts.map +1 -0
- package/types/mixins/ShapeMaskedMixin.d.ts +9 -0
- package/types/mixins/ShapeMaskedMixin.d.ts.map +1 -0
- package/types/mixins/ShapeMixin.d.ts +38 -0
- package/types/mixins/ShapeMixin.d.ts.map +1 -0
- package/types/mixins/StateMixin.d.ts +27 -0
- package/types/mixins/StateMixin.d.ts.map +1 -0
- package/types/mixins/TextFieldMixin.d.ts +1354 -0
- package/types/mixins/TextFieldMixin.d.ts.map +1 -0
- package/types/mixins/ThemableMixin.d.ts +9 -0
- package/types/mixins/ThemableMixin.d.ts.map +1 -0
- package/types/mixins/TooltipTriggerMixin.d.ts +106 -0
- package/types/mixins/TooltipTriggerMixin.d.ts.map +1 -0
- package/types/mixins/TouchTargetMixin.d.ts +3 -0
- package/types/mixins/TouchTargetMixin.d.ts.map +1 -0
- package/types/mixins/TypographyMixin.d.ts +17 -0
- package/types/mixins/TypographyMixin.d.ts.map +1 -0
- package/types/services/rtl.d.ts +3 -0
- package/types/services/rtl.d.ts.map +1 -0
- package/types/services/svgAlias.d.ts +13 -0
- package/types/services/svgAlias.d.ts.map +1 -0
- package/types/services/theme.d.ts +45 -0
- package/types/services/theme.d.ts.map +1 -0
- package/types/utils/cli.d.ts +3 -0
- package/types/utils/cli.d.ts.map +1 -0
- package/types/utils/function.d.ts +3 -0
- package/types/utils/function.d.ts.map +1 -0
- package/types/utils/jsx-runtime.d.ts +20 -0
- package/types/utils/jsx-runtime.d.ts.map +1 -0
- package/types/utils/material-color/blend.d.ts +34 -0
- package/types/utils/material-color/blend.d.ts.map +1 -0
- package/types/utils/material-color/hct/Cam16.d.ts +142 -0
- package/types/utils/material-color/hct/Cam16.d.ts.map +1 -0
- package/types/utils/material-color/hct/Hct.d.ts +93 -0
- package/types/utils/material-color/hct/Hct.d.ts.map +1 -0
- package/types/utils/material-color/hct/ViewingConditions.d.ts +69 -0
- package/types/utils/material-color/hct/ViewingConditions.d.ts.map +1 -0
- package/types/utils/material-color/hct/hctSolver.d.ts +30 -0
- package/types/utils/material-color/hct/hctSolver.d.ts.map +1 -0
- package/types/utils/material-color/helper.d.ts +8 -0
- package/types/utils/material-color/helper.d.ts.map +1 -0
- package/types/utils/material-color/palettes/CorePalette.d.ts +75 -0
- package/types/utils/material-color/palettes/CorePalette.d.ts.map +1 -0
- package/types/utils/material-color/palettes/TonalPalette.d.ts +38 -0
- package/types/utils/material-color/palettes/TonalPalette.d.ts.map +1 -0
- package/types/utils/material-color/scheme/Scheme.d.ts +264 -0
- package/types/utils/material-color/scheme/Scheme.d.ts.map +1 -0
- package/types/utils/material-color/utils/color.d.ts +172 -0
- package/types/utils/material-color/utils/color.d.ts.map +1 -0
- package/types/utils/material-color/utils/math.d.ts +94 -0
- package/types/utils/material-color/utils/math.d.ts.map +1 -0
- package/types/utils/pixelmatch.d.ts +22 -0
- package/types/utils/pixelmatch.d.ts.map +1 -0
- package/types/utils/popup.d.ts +106 -0
- package/types/utils/popup.d.ts.map +1 -0
- package/types/utils/searchParams.d.ts +3 -0
- package/types/utils/searchParams.d.ts.map +1 -0
- package/types/utils/svg.d.ts +7 -0
- package/types/utils/svg.d.ts.map +1 -0
- package/utils/material-color/scheme/Scheme.js +1 -1
- package/utils/pixelmatch.js +360 -0
- package/utils/popup.js +86 -10
- package/utils/searchParams.js +19 -0
- package/components/ExtendedFab.js +0 -32
- package/components/Layout.js +0 -504
- package/components/Nav.js +0 -38
- package/core/DomAdapter.js +0 -586
- package/core/ICustomElement.d.ts +0 -291
- package/core/ICustomElement.js +0 -1
- package/core/test.js +0 -126
- package/core/typings.d.ts +0 -142
- package/core/typings.js +0 -1
- package/mixins/SurfaceMixin.js +0 -127
- package/theming/loader.js +0 -22
- /package/{utils/color_keywords.js → constants/colorKeywords.js} +0 -0
package/dist/index.min.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../
|
|
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"]
|
|
3
|
+
"sources": ["../services/theme.js", "../constants/colorKeywords.js", "../constants/shapes.js", "../constants/typography.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", "../utils/searchParams.js", "../loaders/palette.js", "../core/css.js", "../loaders/theme.js", "../core/optimizations.js", "../core/CompositionAdapter.js", "../core/dom.js", "../core/jsonMergePatch.js", "../core/observe.js", "../core/uid.js", "../core/template.js", "../core/Composition.js", "../core/CustomElement.js", "../mixins/DensityMixin.js", "../mixins/ShapeMixin.js", "../mixins/ThemableMixin.js", "../components/Badge.js", "../mixins/DelegatesFocusMixin.js", "../mixins/TypographyMixin.js", "../mixins/FlexableMixin.js", "../components/Box.js", "../components/Body.js", "../mixins/AriaReflectorMixin.js", "../mixins/KeyboardNavMixin.js", "../mixins/AriaToolbarMixin.js", "../mixins/ElevationMixin.js", "../components/Surface.js", "../components/BottomAppBar.js", "../core/customTypes.js", "../mixins/ResizeObserverMixin.js", "../mixins/StateMixin.js", "../components/Scrim.js", "../components/BottomSheet.js", "../services/svgAlias.js", "../components/Icon.js", "../mixins/NavigationListenerMixin.js", "../mixins/HyperlinkMixin.js", "../mixins/FormAssociatedMixin.js", "../mixins/ControlMixin.js", "../mixins/InputMixin.js", "../components/Ripple.js", "../mixins/RippleMixin.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/Display.js", "../components/Tooltip.js", "../mixins/TooltipTriggerMixin.js", "../components/Fab.js", "../components/FabContainer.js", "../components/FilterChip.js", "../components/Grid.js", "../components/Headline.js", "../components/IconButton.js", "../mixins/TextFieldMixin.js", "../components/Popup.js", "../components/Input.js", "../components/InputChip.js", "../components/Label.js", "../components/List.js", "../mixins/ShapeMaskedMixin.js", "../components/Shape.js", "../components/RadioIcon.js", "../components/ListItem.js", "../components/ListOption.js", "../dom/HTMLOptionsCollectionProxy.js", "../components/Listbox.js", "../components/Menu.js", "../components/MenuItem.js", "../components/NavItem.js", "../components/NavBar.js", "../components/NavBarItem.js", "../components/SideSheet.js", "../components/NavDrawer.js", "../components/NavDrawerItem.js", "../components/NavRail.js", "../components/NavRailItem.js", "../components/Page.js", "../components/Pane.js", "../components/Progress.js", "../components/Radio.js", "../mixins/ScrollListenerMixin.js", "../components/Root.js", "../mixins/SemiStickyMixin.js", "../components/TopAppBar.js", "../components/Search.js", "../components/SegmentedButton.js", "../components/SegmentedButtonGroup.js", "../components/Select.js", "../services/rtl.js", "../components/Slider.js", "../components/Snackbar.js", "../components/SnackbarContainer.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"],
|
|
4
|
+
"sourcesContent": ["import { COLOR_KEYWORDS } from '../constants/colorKeywords.js';\nimport { SHAPE_ROUNDED_DEFAULT } from '../constants/shapes.js';\nimport { TYPOGRAPHY_DEFAULT } from '../constants/typography.js';\nimport { getScheme } from '../utils/material-color/helper.js';\nimport { svgToCSSURL } from '../utils/svg.js';\n\nexport const PALETTES = [\n 'primary',\n 'secondary',\n 'tertiary',\n 'error',\n 'surface',\n];\n\nexport const TYPE_STYLES = [\n 'display',\n 'headline',\n 'title',\n 'label',\n 'body',\n];\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\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", "export const CIRCLE_PATH = 'M0 12A12 12 0 1012 0 12 12 0 000 12Z';\nexport const DIAMOND_PATH = 'M 0 12 12 0 24 12 12 24 Z';\nexport 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';\nexport const HALF_NOTCH_PATH = 'M0 6H6V0H18V6H24V18H18V24H6V18H0Z';\n\nexport const 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\nexport const 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\nexport const SHAPE_SQUIRCLE_DEFAULT = {\n ...SHAPE_ROUNDED_DEFAULT,\n mask: SQUIRCLE_PATH,\n};\n", "export const 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 * @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(40), // (Underlight)\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", "/** @type {URLSearchParams} */\nlet currentSearchParams = null;\n\n/** @return {URLSearchParams} */\nexport function getCurrentSearchParams() {\n if (!currentSearchParams) {\n let url;\n try {\n url = import.meta.url;\n } catch {}\n if (!url) {\n try {\n url = /** @type {HTMLScriptElement} */ (document.currentScript).src;\n } catch {}\n }\n currentSearchParams = new URL(url).searchParams;\n }\n return currentSearchParams;\n}\n", "/** Import this first to ensure ThemableMixin includes custom palettes */\n\nimport { PALETTES } from '../services/theme.js';\nimport { getCurrentSearchParams } from '../utils/searchParams.js';\n\nPALETTES.push(\n ...(\n getCurrentSearchParams()\n .getAll('custom')\n .flatMap((c) => c.split(','))\n .map((c) => c.split(':')[0])\n ),\n);\n", "/** @type {Map<string, CSSStyleSheet>} */\nconst cssStyleSheetsCache = new Map();\n\n/**\n * @param {string} content\n * @param {boolean} [useCache=true]\n * @return {CSSStyleSheet}\n */\nexport function createCSSStyleSheet(content, useCache = true) {\n if (useCache && cssStyleSheetsCache.has(content)) {\n return cssStyleSheetsCache.get(content);\n }\n const sheet = new CSSStyleSheet();\n sheet.replaceSync(content);\n if (useCache) {\n cssStyleSheetsCache.set(content, sheet);\n }\n return sheet;\n}\n\n/** @type {Map<string, HTMLStyleElement>} */\nconst styleElementCache = new Map();\n\n/** @type {Document} */\nlet _inactiveDocument;\n\n/**\n * @param {string} content\n * @param {boolean} [useCache=true]\n * @return {HTMLStyleElement}\n */\nexport function createHTMLStyleElement(content, useCache = true) {\n let style;\n if (useCache && 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 if (useCache) {\n styleElementCache.set(content, style);\n }\n }\n return /** @type {HTMLStyleElement} */ (style.cloneNode(true));\n}\n\n/** @type {boolean} */\nlet _cssStyleSheetConstructable;\n\n/**\n * @param {string} content\n * @param {boolean} [useCache=true]\n */\nexport function createCSS(content, useCache = true) {\n if (_cssStyleSheetConstructable == null) {\n try {\n const sheet = createCSSStyleSheet(content, useCache);\n _cssStyleSheetConstructable = true;\n return sheet;\n } catch {\n _cssStyleSheetConstructable = false;\n }\n }\n return _cssStyleSheetConstructable\n ? createCSSStyleSheet(content, useCache)\n : createHTMLStyleElement(content, useCache);\n}\n\n/**\n * @param {Iterable<HTMLStyleElement|CSSStyleSheet>} styles\n * @param {boolean} [useCache=true]\n * @yields composed CSSStyleSheet\n * @return {Generator<CSSStyleSheet>} composed CSSStyleSheet\n */\nexport function* generateCSSStyleSheets(styles, useCache = true) {\n for (const style of styles) {\n if (style instanceof HTMLStyleElement) {\n yield createCSSStyleSheet(style.textContent, useCache);\n } else if (style.ownerNode) {\n console.warn('Stylesheet is part of style');\n yield createCSSStyleSheet([...style.cssRules].map((r) => r.cssText).join(''), useCache);\n } else {\n yield style;\n }\n }\n}\n\n/** @type {WeakMap<CSSStyleSheet, HTMLStyleElement>} */\nconst styleElementFromStyleSheetCache = new WeakMap();\n\n/**\n * @param {Iterable<HTMLStyleElement|CSSStyleSheet>} styles\n * @param {boolean} [useCache=true]\n * @yields composed HTMLStyleElement\n * @return {Generator<HTMLStyleElement>} composed CSSStyleSheet\n */\nexport function* generateHTMLStyleElements(styles, useCache = true) {\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 (useCache && styleElementFromStyleSheetCache.has(style)) {\n // @ts-ignore Skip cast\n yield styleElementFromStyleSheetCache.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 if (useCache) {\n styleElementFromStyleSheetCache.set(style, styleElement);\n }\n\n // @ts-ignore Skip cast\n yield styleElement.cloneNode(true);\n }\n }\n}\n\n/**\n * @param {TemplateStringsArray|string} array\n * @param {...any} substitutions\n * @return {HTMLStyleElement|CSSStyleSheet}\n */\nexport function css(array, ...substitutions) {\n if (typeof array === 'string') return createCSS(array);\n return createCSS(String.raw({ raw: array }, ...substitutions));\n}\n\n/**\n * @param {TemplateStringsArray|string|HTMLStyleElement|CSSStyleSheet} styles\n * @param {...any} substitutions\n * @return {HTMLStyleElement|CSSStyleSheet}\n */\nexport function addGlobalCss(styles, ...substitutions) {\n /** @type {HTMLStyleElement|CSSStyleSheet} */\n let compiled;\n if (typeof styles === 'string') {\n compiled = css(styles);\n } else if (Array.isArray(styles)) {\n compiled = css(/** @type {TemplateStringsArray} */ (styles), ...substitutions);\n } else {\n compiled = /** @type {HTMLStyleElement|CSSStyleSheet} */ (styles);\n }\n\n if (compiled instanceof HTMLStyleElement) {\n document.head.append(compiled);\n } else {\n document.adoptedStyleSheets = [\n ...document.adoptedStyleSheets,\n compiled,\n ];\n }\n return compiled;\n}\n", "import { addGlobalCss } from '../core/css.js';\nimport {\n generateThemeCSS,\n generateTypographyGlobalCSS,\n themeOptionsFromSearchParams,\n} from '../services/theme.js';\nimport { getCurrentSearchParams } from '../utils/searchParams.js';\n\naddGlobalCss([\n generateThemeCSS(themeOptionsFromSearchParams(getCurrentSearchParams())),\n generateTypographyGlobalCSS(),\n].join('\\n'));\n", "// Micro-optimized functions\n\nlet BLANK_TEXT;\nlet BLANK_COMMENT;\nlet BLANK_DIV;\n\n/** @return {Text} */\nexport function createEmptyTextNode() {\n // eslint-disable-next-line no-return-assign\n return (BLANK_TEXT ??= new Text()).cloneNode();\n}\n\n/** @return {HTMLDivElement} */\nexport function createEmptyDiv() {\n // eslint-disable-next-line no-return-assign\n return (BLANK_DIV ??= document.createElement('div')).cloneNode();\n}\n\n/** @return {Comment} */\nexport function createEmptyComment() {\n // eslint-disable-next-line no-return-assign\n return (BLANK_COMMENT ??= new 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) {\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) {\n this.metadataCache.set(key, metadata);\n } else {\n this.metadataCache = new Map([[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 // eslint-disable-next-line no-multi-assign\n const metadataCache = (this.metadataCache ??= new Map());\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 (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 = 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 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 metadataCache.set(currentKey, 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 metadataCache.set(currentKey, 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", "/* 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/** @type {Map<string, string>} */\nlet attrNameFromPropNameCache;\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 attrNameFromPropNameCache ??= new Map();\n if (attrNameFromPropNameCache.has(name)) {\n return attrNameFromPropNameCache.get(name);\n }\n // eslint-disable-next-line unicorn/prefer-string-replace-all\n const value = name.replace(/[A-Z]/g, (match) => `-${match.toLowerCase()}`);\n attrNameFromPropNameCache.set(name, value);\n return value;\n}\n\nexport const CHROME_VERSION = Number.parseFloat(navigator.userAgent.match(/Chrome\\/([\\d.]+)/)?.[1]);\nexport const FIREFOX_VERSION = Number.parseFloat(navigator.userAgent.match(/Firefox\\/([\\d.]+)/)?.[1]);\nexport const SAFARI_VERSION = CHROME_VERSION || !navigator.userAgent.includes('AppleWebKit')\n ? Number.NaN\n : Number.parseFloat(navigator.userAgent.match(/Version\\/([\\d.]+)/)?.[1]);\n\n/**\n * @param {Element} element\n * @return {boolean}\n */\nexport function isFocused(element) {\n if (!element) return false;\n if (FIREFOX_VERSION < 113 && 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 patch[index] = null;\n continue;\n }\n if (value == null) {\n continue; // Skip undefined\n }\n const changes = buildMergePatch(previous[index], value, arrayStrategy);\n if (changes !== null) {\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 patch[key] = null;\n continue;\n }\n if (value == null) {\n continue; // Skip undefined\n }\n const changes = buildMergePatch(previous[key], value, arrayStrategy);\n if (changes !== null) {\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 {'string' | 'boolean' | 'map' | 'set' | 'float' | 'integer' | 'object' | 'function' | 'array'} ObserverPropertyType */\n\n/**\n * @template {ObserverPropertyType} T\n * @typedef {(\n * T extends 'boolean' ? boolean\n * : T extends 'string' ? string\n * : T extends 'float' | 'integer' ? number\n * : T extends 'array' ? any[]\n * : T extends 'object' ? any\n * : T extends 'function' ? (...args:any) => any\n * : unknown\n * )} ParsedObserverPropertyType\n */\n\n/**\n * @template {ObserverPropertyType} T1\n * @template {any} T2\n * @template {Object} [C=any]\n * @typedef {Object} ObserverOptions\n * @prop {T1} [type]\n * @prop {string} [attr]\n * @prop {boolean} [readonly]\n * @prop {boolean} [enumerable]\n * Defaults to false if type is boolean\n * @prop {boolean} [nullable]\n * @prop {T2} [empty]\n * @prop {T2} [value]\n * @prop {WeakMap<C,T2>} [values]\n * @prop {boolean|'write'|'read'} [reflect]\n * Function used when null passed\n * @prop {(this:C, value:null|undefined)=>T2} [nullParser]\n * @prop {(this:C, value:any)=>T2} [parser]\n * Function used when comparing\n * @prop {(this:C, a:T2, b:T2)=> any} [diff]\n * @prop {(this:C, a:T2, b:T2)=>boolean} [is]\n * @prop {(this:C, data:Partial<C>, fn?: () => T2) => T2} [get]\n * @prop {(this:C, value: T2, fn?:(value2: T2) => any) => any} [set]\n * Simple callback\n * @prop {(this:C, oldValue:T2, newValue:T2, changes:any)=>any} [changedCallback]\n * Named callback\n * @prop {(this:C, name:string, oldValue: T2, newValue: T2, changes:any) => any} [propChangedCallback]\n * Attribute callback\n * @prop {(this:C, name:string, oldValue: string, newValue: string) => any} [attributeChangedCallback]\n * @prop {WeakMap<C, T2>} [computedValues]\n * @prop {[keyof C, (this:C, ...args:any[]) => any][]} [watchers]\n * @prop {WeakSet<C>} [needsSelfInvalidation]\n * @prop {Set<keyof C>} [props]\n */\n\n/**\n * @template {ObserverPropertyType} T1\n * @template {any} [T2=any]\n * @template {string} [K=string]\n * @template {Object} [C=any]\n * @typedef {ObserverOptions<T1, T2, C> & { key: K, values?: WeakMap<C, T2>; attrValues?: WeakMap<C, string> }} ObserverConfiguration\n */\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 // @ts-ignore\n proxyTarget ??= {};\n return new Proxy(proxyTarget, {\n get(target, p) {\n // @ts-ignore\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 /**\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 */\n return (v) => !!v;\n case 'integer':\n // Calls ToNumber(x)\n return Math.round;\n case 'float':\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 */\n return (v) => +v;\n case 'map':\n return Map;\n case 'set':\n return Set;\n case 'object':\n case 'array':\n /**\n * Reflect self\n * @template T\n * @param {T} o\n * @return {T}\n */\n return (o) => o;\n default:\n case 'string':\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 */\n return (v) => `${v}`;\n }\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 {string} K\n * @template {ObserverPropertyType} [T1=any]\n * @template {any} [T2=ParsedObserverPropertyType<T1>]\n * @param {K} name\n * @param {T1|ObserverOptions<T1,T2>} [typeOrOptions='string']\n * @param {any} [object]\n * @return {ObserverConfiguration<T1,T2,K> & ObserverOptions<T1,T2>}\n */\nexport function parseObserverOptions(name, typeOrOptions, object) {\n /** @type {Partial<ObserverOptions<T1,T2>>} */\n const options = (typeof typeOrOptions === 'string')\n ? { type: typeOrOptions }\n : typeOrOptions;\n\n let {\n watchers, value, readonly,\n empty, type,\n enumerable, reflect, attr,\n nullable, parser, nullParser,\n get,\n is, diff,\n props,\n } = options;\n\n watchers ??= [];\n readonly ??= false;\n\n if (empty === undefined) {\n empty = null;\n }\n\n value ??= empty;\n\n if (get && !props) {\n // Custom `get` uses computed values.\n // Invalidate computed value when dependent `prop` changes\n const observeResult = observeFunction(get.bind(object), object, () => value);\n value ??= observeResult.defaultValue;\n const uniqueProps = new Set([\n ...observeResult.props.this,\n ...observeResult.props.args[0],\n ]);\n props = uniqueProps;\n }\n\n /** @type {ObserverPropertyType} */\n if (!type) {\n if (value == null) {\n // @ts-ignore\n type = 'string';\n } else {\n const parsed = typeof value;\n // @ts-ignore\n type = (parsed === 'number')\n ? (Number.isInteger(value) ? 'integer' : 'number')\n : parsed;\n }\n }\n\n enumerable ??= name[0] !== '_';\n reflect ??= enumerable ? type !== 'object' : (attr ? 'write' : false);\n attr ??= (reflect ? attrNameFromPropName(name) : null);\n nullable ??= (type === 'boolean') ? false : (empty == null);\n if (!nullable) {\n empty ??= emptyFromType(type);\n value ??= empty;\n }\n\n // if defined ? value\n // else if boolean ? false\n // else if onNullish ? false\n // else if empty == null\n parser ??= defaultParserFromType(type);\n if (!nullParser) {\n if (nullable) {\n nullParser = () => null;\n } else {\n nullParser = (empty === null)\n ? () => emptyFromType(type)\n : () => empty;\n }\n }\n\n is ??= (type === 'object')\n ? (a, b) => !hasMergePatch(a, b)\n : ((type === 'array') ? () => false : Object.is);\n\n if (diff === undefined) {\n // @ts-ignore\n diff = ((type === 'object') ? (a, b) => buildMergePatch(a, b, 'reference') : null);\n }\n\n return {\n ...options,\n type,\n is,\n diff,\n attr,\n reflect,\n readonly,\n enumerable,\n value,\n parser,\n nullParser,\n key: name,\n props,\n watchers,\n };\n}\n\n/**\n * @this {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 {ObserverConfiguration<?,?,?,?>} config\n * @param {any} oldValue\n * @param {any} value\n * @return {boolean} changed\n */\nfunction detectChange(config, oldValue, value) {\n if (config.get) {\n // TODO: Custom getter vs parser\n }\n\n // Compute real new value after parsing\n const newValue = (value == null)\n ? config.nullParser.call(this, value)\n : config.parser.call(this, value);\n\n // Default change is the newValue\n let changes = newValue;\n\n // Null check\n if (oldValue == null) {\n if (newValue == null) {\n // Both nullish\n return false;\n }\n } else if (newValue != null) {\n // Both non-null, compare\n if (config.diff) {\n // Custom change diff\n changes = config.diff.call(this, oldValue, newValue);\n if (changes == null) {\n // No difference\n return false;\n }\n } else if (config.is.call(this, oldValue, newValue)) {\n // Non-equal\n return false;\n }\n }\n\n // Commit value\n if (config.values) {\n config.values.set(this, newValue);\n } else {\n config.values = new WeakMap([[this, newValue]]);\n }\n\n // Emit change\n\n config.propChangedCallback?.call(this, config.key, oldValue, newValue, changes);\n config.changedCallback?.call(this, oldValue, newValue, changes);\n\n return true;\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 {ObserverOptions<T1, T2, C>} options\n * @return {ObserverConfiguration<T1,T2,K,C>}\n */\nexport function defineObservableProperty(object, key, options) {\n /** @type {ObserverConfiguration<T1,T2,K,C>} */\n // @ts-ignore\n const config = parseObserverOptions(key, options, object);\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 // @ts-ignore\n const oldValue = this[key];\n detectChange.call(this, config, oldValue, value);\n }\n\n /** @return {void} */\n function onInvalidate() {\n // Current value is now invalidated. Recompute and check if changed\n // eslint-disable-next-line no-multi-assign\n\n const oldValue = config.computedValues?.get(this);\n const newValue = this[key];\n config.needsSelfInvalidation?.delete(this);\n detectChange.call(this, config, oldValue, newValue);\n }\n\n if (config.props) {\n for (const prop of config.props) {\n config.watchers.push([prop, onInvalidate]);\n }\n }\n\n /**\n * @this {C}\n * @return {T2}\n */\n function cachedGet() {\n const newValue = config.get.call(this, this, internalGet.bind(this));\n // Store computed value internally. Used by onInvalidate to get previous value\n const computedValues = (config.computedValues ??= new WeakMap());\n computedValues.set(this, newValue);\n return newValue;\n }\n\n /**\n * @this {C}\n * @param {T2} value\n * @return {void}\n */\n function cachedSet(value) {\n if (config.needsSelfInvalidation) {\n config.needsSelfInvalidation.add(this);\n } else {\n config.needsSelfInvalidation = new WeakSet([this]);\n }\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, config, oldValue, newValue);\n }\n\n /** @type {Partial<PropertyDescriptor>} */\n const descriptor = {\n enumerable: config.enumerable,\n configurable: true,\n get: config.get ? cachedGet : internalGet,\n set: config.set ? cachedSet : internalSet,\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 {DocumentFragment} */\nlet _blankFragment;\n\n/** @type {Range} */\nlet _fragmentRange;\n\n/**\n * @param {string} [fromString]\n * @return {DocumentFragment}\n */\nexport function generateFragment(fromString) {\n _inactiveDocument ??= document.implementation.createHTMLDocument();\n if (!fromString) {\n _blankFragment ??= _inactiveDocument.createDocumentFragment();\n return /** @type {DocumentFragment} */ (_blankFragment.cloneNode());\n }\n _fragmentRange ??= _inactiveDocument.createRange();\n return _fragmentRange.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, 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;\n if (fragmentCache.has(compiledString)) {\n fragment = fragmentCache.get(compiledString);\n } else {\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 */\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} [defaults] what\n * @prop {T} [store] what\n * @prop {DocumentFragment|HTMLElement|Element} [target] where\n * @prop {ShadowRoot} [shadowRoot] where\n * @prop {any} [context] `this` on callbacks/events\n * @prop {any} [injections]\n */\n\n/** @typedef {HTMLElementEventMap & { input: InputEvent; } } HTMLElementEventMapFixed */\n\n/**\n * @typedef {(\n * Pick<HTMLElementEventMapFixed,\n * 'auxclick' |\n * 'beforeinput' |\n * 'click' |\n * 'compositionstart' |\n * 'contextmenu' |\n * 'drag' |\n * 'dragenter' |\n * 'dragover' |\n * 'dragstart' |\n * 'drop' |\n * 'invalid' |\n * 'keydown' |\n * 'keypress' |\n * 'keyup' |\n * 'mousedown' |\n * 'mousemove' |\n * 'mouseout' |\n * 'mouseover' |\n * 'mouseup' |\n * 'pointerdown' |\n * 'pointermove' |\n * 'pointerout' |\n * 'pointerover' |\n * 'pointerup' |\n * 'reset' |\n * 'selectstart' |\n * 'submit' |\n * 'touchend' |\n * 'touchmove' |\n * 'touchstart' |\n * 'wheel'\n * >\n * )} HTMLElementCancellableEventMap\n */\n\n/**\n * @typedef {(\n * HTMLElementEventMapFixed\n * & {[P in keyof HTMLElementCancellableEventMap as `~${P}`]: HTMLElementCancellableEventMap[P]}\n * & Record<string, Event|CustomEvent>\n * )} CompositionEventMap\n */\n\n/**\n * @template {any} T\n * @template {keyof CompositionEventMap} [K = keyof CompositionEventMap]\n * @typedef {{\n * type?: K\n * tag?: string,\n * capture?: boolean;\n * once?: boolean;\n * passive?: boolean;\n * signal?: AbortSignal;\n * handleEvent?: (\n * this: T,\n * event: (K extends keyof CompositionEventMap ? CompositionEventMap[K] : Event) & {currentTarget:HTMLElement}\n * ) => any;\n * prop?: string;\n * deepProp?: string[],\n * }} CompositionEventListener\n */\n\n/**\n * @template T\n * @typedef {{\n * [P in keyof CompositionEventMap]?: (keyof T & string)\n * | ((this: T, event: CompositionEventMap[P] & {currentTarget:HTMLElement}) => any)\n * | CompositionEventListener<T, P>\n * }} CompositionEventListenerObject\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 {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} searchIndex\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({ nodes }, value) {\n const { nodeIndex, attrName } = this;\n /** @type {Element} */\n const element = 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 writeDynamicNode({ nodeStates, comments, nodes }, value) {\n const { commentIndex, nodeIndex } = this;\n const nodeState = nodeStates[nodeIndex];\n // eslint-disable-next-line no-bitwise\n const hidden = nodeState & 0b0001;\n const show = value != null && value !== false;\n if (!show) {\n // Should be hidden\n if (hidden) return;\n // Replace whatever node is there with the comment\n let comment = comments[commentIndex];\n if (!comment) {\n comment = createEmptyComment();\n comments[commentIndex] = comment;\n }\n nodes[nodeIndex].replaceWith(comment);\n // eslint-disable-next-line no-bitwise\n nodeStates[nodeIndex] |= 0b0001;\n return;\n }\n // Must be shown\n // Update node first (offscreen rendering)\n const node = nodes[nodeIndex];\n // eslint-disable-next-line no-bitwise\n const isDynamicNode = nodeState & 0b0010;\n\n if (typeof value === 'object') {\n // Not string data, need to replace\n console.warn('Dynamic nodes not supported yet');\n } else if (isDynamicNode) {\n const textNode = new Text(value);\n node.replaceWith(textNode);\n nodes[nodeIndex] = textNode;\n // eslint-disable-next-line no-bitwise\n nodeStates[nodeIndex] &= ~0b0010;\n } else {\n node.data = value;\n }\n\n // Updated, now set hidden state\n\n if (hidden) {\n const comment = comments[commentIndex];\n comment.replaceWith(node);\n // eslint-disable-next-line no-bitwise\n nodeStates[nodeIndex] &= ~0b0001;\n }\n // Done\n}\n\n/**\n * @type {RenderGraphAction['invocation']}\n * @this {RenderGraphAction}\n */\nfunction writeDOMElementAttachedState({ nodeStates, nodes, comments }, value) {\n const { commentIndex, nodeIndex } = this;\n // eslint-disable-next-line no-bitwise\n const hidden = nodeStates[nodeIndex] & 1;\n const show = value != null && value !== false;\n if (show === !hidden) return;\n\n const element = nodes[nodeIndex];\n let comment = comments[commentIndex];\n if (!comment) {\n comment = createEmptyComment();\n comments[commentIndex] = comment;\n }\n if (show) {\n comment.replaceWith(element);\n // eslint-disable-next-line no-bitwise\n nodeStates[nodeIndex] &= ~0b0001;\n } else {\n element.replaceWith(comment);\n // eslint-disable-next-line no-bitwise\n nodeStates[nodeIndex] |= 0b0001;\n }\n}\n\n/**\n * @type {RenderGraphAction['invocation']}\n * @this {RenderGraphAction}\n */\nfunction writeDOMHideNodeOnInit({ comments, nodeStates, nodes }) {\n const { commentIndex, nodeIndex } = this;\n\n const comment = createEmptyComment();\n comments[commentIndex] = comment;\n // eslint-disable-next-line no-bitwise\n nodeStates[nodeIndex] |= 1;\n\n nodes[nodeIndex].replaceWith(comment);\n}\n\n/**\n * @param {RenderGraphSearch} search\n * @param {Parameters<RenderGraphSearch['invocation']>} args\n */\nfunction executeSearch(search, ...args) {\n const [{ caches, searchStates }] = args;\n const { cacheIndex, searchIndex, subSearch, invocation } = search;\n const cachedValue = caches[cacheIndex];\n const searchState = searchStates[searchIndex];\n\n // Ran = 0b0001\n // Dirty = 0b0010\n // eslint-disable-next-line no-bitwise\n if (searchState & 0b0001) {\n // Return last result\n return {\n value: cachedValue,\n // eslint-disable-next-line no-bitwise\n dirty: ((searchState & 0b0010) === 0b0010),\n };\n }\n\n // eslint-disable-next-line no-bitwise\n searchStates[searchIndex] |= 0b0001;\n let result;\n if (invocation) {\n if (subSearch) {\n const subResult = executeSearch(subSearch, ...args);\n // Use last cached value (if any)\n if (!subResult.dirty && cachedValue !== undefined) {\n // eslint-disable-next-line no-bitwise\n searchStates[searchIndex] &= ~0b0010;\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 // Return from cache\n return { value: result, dirty: false };\n }\n }\n\n // Overwrite cache and flag as dirty\n caches[cacheIndex] = result;\n // eslint-disable-next-line no-bitwise\n searchStates[searchIndex] |= 0b0010;\n return { value: result, dirty: true };\n}\n\n/**\n * @type {RenderGraphSearch['invocation']}\n * @this {RenderGraphSearch}\n */\nfunction searchWithExpression({ options: { context, store, injections } }, changes, data) {\n return this.expression.call(\n context,\n store ?? data,\n injections,\n );\n}\n\n/**\n * @type {RenderGraphSearch['invocation']}\n * @this {RenderGraphSearch}\n */\nfunction searchWithProp(state, changes) {\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 {Record<string,any>} [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 {ChildNode} lastChildNode\n * @prop {(Element|Text)[]} nodes\n * @prop {any[]} caches\n * @prop {Comment[]} comments\n * @prop {Uint8Array} nodeStates\n * @prop {Uint8Array} searchStates\n * @prop {Element[]} refs\n * @prop {number} lastChildNodeIndex\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 * @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\nconst compositionCache = new Map();\n\n/** @template T */\nexport default class Composition {\n static EVENT_PREFIX_REGEX = /^([*1~]+)?(.*)$/;\n\n _interpolationState = {\n nodeIndex: -1,\n searchIndex: 0,\n cacheIndex: 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 * @type {Map<Function|string, RenderGraphSearch>}\n */\n searchByQuery;\n\n /**\n * Index of searches by query (dotted notation for deep props)\n * @type {Map<string, RenderGraphAction[]>}\n */\n actionsByPropsUsed;\n\n /** @type {RenderGraphAction[]} */\n postInitActions = [];\n\n /** @type {Set<string>} */\n tagsWithBindings;\n\n /**\n * Array of element tags\n * @type {string[]}\n */\n tags = [];\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 * @type {CompositionAdapter}\n */\n adapter;\n\n /**\n * Collection of events to bind.\n * Indexed by ID\n * @type {Map<string|symbol, CompositionEventListener<any>[]>}\n */\n events;\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 /** @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 * @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 /** @type {Set<string>} */\n temporaryIds;\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 * @template T\n * @param {ConstructorParameters<typeof Composition<T>>} parts\n * @return {Composition<T>}\n */\n static compose(...parts) {\n for (const [cache, comp] of compositionCache) {\n if (cache.length !== parts.length) continue;\n if (parts.every((part, index) => part === cache[index])) {\n return comp;\n }\n }\n\n const composition = new Composition(...parts);\n compositionCache.set(parts, composition);\n return composition;\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 {CompositionEventListener<T>} listener */\n addCompositionEventListener(listener) {\n const key = listener.tag ?? '';\n // eslint-disable-next-line no-multi-assign\n const events = (this.events ??= new Map());\n if (events.has(key)) {\n events.get(key).push(listener);\n } else {\n 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 * @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({\n defaults: data ?? changes,\n ...options,\n });\n }\n\n const instanceFragment = /** @type {DocumentFragment} */ (this.cloneable.cloneNode(true));\n\n const shadowRoot = options.shadowRoot;\n const target = shadowRoot ?? options.target ?? instanceFragment.firstElementChild;\n\n /** @type {InitializationState} */\n const initState = {\n lastChildNode: null,\n lastChildNodeIndex: 0,\n lastElement: null,\n nodeStates: new Uint8Array(this._interpolationState.nodeIndex + 1),\n searchStates: new Uint8Array(this._interpolationState.searchIndex),\n comments: [],\n nodes: [],\n caches: this.initCache.slice(),\n refs: [],\n options,\n };\n\n const { nodes, refs, searchStates, caches } = initState;\n for (const { tag, textNodes } of this.nodesToBind) {\n /** @type {Text} */\n let textNode;\n if (tag === '') {\n if (!textNodes.length) {\n console.warn('why was root tagged?');\n continue;\n }\n console.warn('found empty tag??');\n refs.push(null);\n nodes.push(null);\n textNode = instanceFragment.firstChild;\n } else {\n const element = instanceFragment.getElementById(tag);\n refs.push(element);\n nodes.push(element);\n this.#bindCompositionEventListeners(tag, element, options.context);\n if (!textNodes.length) continue;\n textNode = element.firstChild;\n }\n\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 /**\n * @param {Partial<T>} changes\n * @param {T} data\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 { dirty, value } = executeSearch(action.search, initState, changes, data);\n if (dirty) {\n // console.log('dirty, updating from batch', initState.nodes[action.nodeIndex], 'with', value);\n action.invocation(initState, value, changes, data);\n }\n }\n }\n if (!ranSearch) return;\n searchStates.fill(0);\n };\n\n if (shadowRoot) {\n options.context ??= shadowRoot.host;\n if ('adoptedStyleSheets' in shadowRoot) {\n if (this.adoptedStyleSheets.length) {\n shadowRoot.adoptedStyleSheets = [\n ...shadowRoot.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 (shadowRoot) {\n shadowRoot.append(instanceFragment);\n customElements.upgrade(shadowRoot);\n }\n\n draw.target = target;\n\n /**\n * @param {keyof T & string} prop\n * @param {any} value\n * @param {Partial<T>} [data]\n */\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 = caches[search.cacheIndex];\n if (cachedValue === value) {\n return;\n }\n caches[search.cacheIndex] = value;\n searchStates[search.searchIndex] = 0b0011;\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 searchStates.fill(0);\n };\n draw.state = initState;\n return draw;\n }\n\n /**\n * @param {Attr|Text} node\n * @param {Element|null} [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 || element?.tagName === 'STYLE') {\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 searchIndex: this._interpolationState.searchIndex++,\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 searchIndex: this._interpolationState.searchIndex++,\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 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 commentIndex: this._interpolationState.commentIndex++,\n invocation: writeDynamicNode,\n defaultValue,\n search,\n };\n text.data = typeof defaultValue === 'string' ? defaultValue : '';\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: writeDOMHideNodeOnInit,\n });\n }\n }\n\n this.addAction(action);\n // eslint-disable-next-line no-multi-assign\n const tagsWithBindings = (this.tagsWithBindings ??= new Set());\n tagsWithBindings.add(tag);\n }\n\n /**\n * @param {Element} element\n * @return {string}\n */\n #tagElement(element) {\n if (!element) return '';\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 // eslint-disable-next-line no-multi-assign\n const temporaryIds = (this.temporaryIds ??= new Set());\n 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 * @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 = element.ownerDocument.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 }\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 searchIndex: this._interpolationState.searchIndex++,\n propsUsed,\n deepPropsUsed: [[iterableName]],\n defaultValue: {},\n invocation: null,\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.comments[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 let isArray;\n if (!needTargetAll && !(isArray = Array.isArray(changeList))) {\n const iterator = isArray ? 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 // eslint-disable-next-line no-multi-assign\n const tagsWithBindings = (this.tagsWithBindings ??= new Set());\n 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.tagName === 'TEMPLATE') {\n while (element.contains(node = treeWalker.nextNode()));\n continue;\n }\n\n if (element.tagName === 'SCRIPT') {\n console.warn('<script> element found.');\n while (element.contains(node = treeWalker.nextNode()));\n continue;\n }\n\n if (element.hasAttribute('mdw-for')) {\n while (element.contains(node = treeWalker.nextNode()));\n this.#interpolateIterable(element, options);\n continue;\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.parentElement;\n if (this.#interpolateNode(/** @type {Text} */ (node), element, options)) {\n const nextNode = treeWalker.nextNode();\n node.remove();\n node = nextNode;\n continue;\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\n ? [...this.actionsByPropsUsed.keys()]\n : [];\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 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 // eslint-disable-next-line no-multi-assign\n const searchByQuery = (this.searchByQuery ??= new Map());\n 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 // eslint-disable-next-line no-multi-assign\n const actionsByPropsUsed = (this.actionsByPropsUsed ??= new Map());\n for (const prop of action.search.propsUsed) {\n if (actionsByPropsUsed.has(prop)) {\n actionsByPropsUsed.get(prop).push(action);\n } else {\n actionsByPropsUsed.set(prop, [action]);\n }\n }\n return action;\n }\n}\n", "/* eslint-disable max-classes-per-file */\n\nimport Composition from './Composition.js';\nimport { css } from './css.js';\nimport { attrNameFromPropName, attrValueFromDataValue } from './dom.js';\nimport { applyMergePatch } from './jsonMergePatch.js';\nimport { defineObservableProperty } from './observe.js';\nimport { addInlineFunction, html } from './template.js';\n\n/** @typedef {import('./observe.js').ObserverPropertyType} ObserverPropertyType */\n\n/**\n * @template {any} T\n * @typedef {{\n * [P in keyof T]:\n * T[P] extends (...args:any[]) => infer T2 ? T2\n * : T[P] extends ObserverPropertyType\n * ? import('./observe.js').ParsedObserverPropertyType<T[P]>\n * : T[P] extends {type: ObserverPropertyType}\n * ? import('./observe.js').ParsedObserverPropertyType<T[P]['type']>\n * : T[P] extends ObserverOptions<null, infer T2>\n * ? unknown extends T2 ? string : T2\n * : never\n * }} ParsedProps\n */\n\n/**\n * @template {ObserverPropertyType} T1\n * @template {any} T2\n * @template {Object} [C=any]\n * @typedef {import('./observe.js').ObserverOptions<T1,T2,C>} ObserverOptions\n */\n\n/**\n * @template {{ prototype: unknown; }} T\n * @typedef {T} ClassOf<T>\n */\n\n/**\n * @template {any} [T=any]\n * @template {any[]} [A=any[]]\n * @typedef {abstract new (...args: A) => T} Class\n */\n\n/**\n * @template {any} T1\n * @template {any} [T2=T1]\n * @callback HTMLTemplater\n * @param {TemplateStringsArray} string\n * @param {...(string|DocumentFragment|Element|((this:T1, data:T2) => any))} substitutions\n * @return {DocumentFragment}\n */\n\n/**\n * @template {any} [T1=any]\n * @template {any} [T2=T1]\n * @typedef {Object} CallbackArguments\n * @prop {Composition<T1>} composition\n * @prop {Record<string, HTMLElement>} refs\n * @prop {HTMLTemplater<T1, Partial<T2>>} html\n * @prop {(fn: (this:T1, data: T2) => any) => string} inline\n * @prop {DocumentFragment} template\n * @prop {T1} element\n */\n\n/**\n * @template {any} T1\n * @template {any} [T2=T1]\n * @typedef {{\n * composed?: (this: T1, options: CallbackArguments<T1, T2>) => any,\n * constructed?: (this: T1, options: CallbackArguments<T1, T2>) => any,\n * connected?: (this: T1, options: CallbackArguments<T1, T2>) => any,\n * disconnected?: (this: T1, options: CallbackArguments<T1, T2>) => any,\n * props?: {\n * [P in keyof T1] : (\n * this: T1,\n * oldValue: T1[P],\n * newValue: T1[P],\n * changes:any,\n * element: T1\n * ) => any\n * },\n * attrs?: {[K in keyof any]: (\n * this: T1,\n * oldValue: string,\n * newValue: string,\n * element: T1\n * ) => unknown\n * },\n * } & {\n * [P in keyof T1 & string as `${P}Changed`]?: (\n * this: T1,\n * oldValue: T1[P],\n * newValue: T1[P],\n * changes:any,\n * element: T1\n * ) => any\n * }} CompositionCallback\n */\n\n/**\n * @template {Object} C\n * @typedef {{\n * [P in string] :\n * ObserverPropertyType\n * | ObserverOptions<ObserverPropertyType, unknown, C>\n * | ((this:C, data:Partial<C>, fn?: () => any) => any)\n * }} IDLParameter\n */\n\n/**\n * @template T\n * @typedef {(T | Array<[keyof T & string, T[keyof T]]>)} ObjectOrObjectEntries\n */\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\n/**\n * Web Component that can cache templates for minification or performance\n */\nexport default class CustomElement extends HTMLElement {\n /** @type {string} */\n static elementName;\n\n /** @return {Iterable<string>} */\n static get observedAttributes() {\n return this.attrList.keys();\n }\n\n /** @type {import('./Composition.js').Compositor<?>} */\n compose() {\n // eslint-disable-next-line no-return-assign\n return (this.#composition ??= new Composition());\n }\n\n /** @type {Composition<?>} */\n static _composition = null;\n\n /** @type {Map<string, import('./observe.js').ObserverConfiguration<?,?,?>>} */\n static _props = new Map();\n\n /** @type {Map<string, import('./observe.js').ObserverConfiguration<?,?,?>>} */\n static _attrs = 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 {((callback: CallbackArguments) => any)[]} */\n static _onComposeCallbacks = [];\n\n /** @type {((callback: CallbackArguments) => any)[]} */\n static _onConnectedCallbacks = [];\n\n /** @type {((callback: CallbackArguments) => any)[]} */\n static _onDisconnectedCallbacks = [];\n\n /** @type {((callback: CallbackArguments) => any)[]} */\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 /**\n * Expressions are idempotent functions that are selectively called whenever\n * a render is requested.\n * Expressions are constructed exactly as methods though differ in expected\n * arguments. The first argument should be destructured to ensure each used\n * property is accessed at least once in order to inspect used properties.\n *\n * The Composition API will inspect this function with a proxy for `this` to\n * catalog what observables are used by the expression. This allows the\n * Composition API to build a cache as well as selective invoke the expression\n * only when needed.\n *\n * When used with in element templates, the element itself will be passed as\n * its first argument.\n * ````js\n * Button\n * .prop('filled', 'boolean')\n * .prop('outlined', 'boolean')\n * .expresssions({\n * _isFilledOrOutlined({filled, outlined}) {\n * return (filled || outlined)\n * },\n * })\n * .html`<div custom={_isFilledOrOutlined}></div>`;\n * ````\n *\n * When used with external data source, that data source\n * will be passed to the expression with all properties being `null` at first\n * inspection.\n * ````js\n * const externalData = {first: 'John', last: 'Doe'};\n * ContactCard\n * .expresssions({\n * _fullName({first, last}) {\n * return [first, last].filter(Boolean).join(' ');\n * },\n * })\n * myButton.render(externalData);\n * ````\n *\n * Expressions may be support argumentless calls by using default\n * parameters with `this`.\n * ````js\n * Button\n * .expresssions({\n * isFilledOrOutlined({filled, outlined} = this) {\n * return (filled || outlined)\n * },\n * });\n * myButton.isFilledorOutlined();\n * ````\n * @type {{\n * <\n * CLASS extends typeof CustomElement,\n * ARGS extends ConstructorParameters<CLASS>,\n * INSTANCE extends InstanceType<CLASS>,\n * PROPS extends {\n * [K in keyof any]: K extends `_${any}` ? ((data: INSTANCE, state?: Record<string, any>) => string|boolean|null)\n * : ((data?: INSTANCE, state?: Record<string, any>) => string|boolean|null)\n * } & ThisType<INSTANCE>\n * >(this: CLASS, expressions: PROPS & ThisType<INSTANCE & PROPS>):\n * CLASS & Class<{\n * [K in keyof PROPS]: K extends `_${any}` ? never : () => ReturnType<PROPS[K]> }\n * ,ARGS>\n * }}\n */\n static expressions = /** @type {any} */ (this.set);\n\n static methods = this.set;\n\n /**\n * @type {{\n * <\n * CLASS extends typeof CustomElement,\n * ARGS extends ConstructorParameters<CLASS>,\n * INSTANCE extends InstanceType<CLASS>,\n * PROPS extends Partial<INSTANCE>>\n * (this: CLASS, source: PROPS & ThisType<PROPS & INSTANCE>, options?: Partial<PropertyDescriptor>)\n * : CLASS & Class<PROPS,ARGS>\n * }}\n */\n static overrides = /** @type {any} */ (this.set);\n\n /**\n * @type {{\n * <\n * CLASS extends typeof CustomElement,\n * ARGS extends ConstructorParameters<CLASS>,\n * INSTANCE extends InstanceType<CLASS>,\n * KEY extends string,\n * OPTIONS extends ObserverPropertyType\n * | ObserverOptions<ObserverPropertyType, unknown, INSTANCE>\n * | ((this:INSTANCE, data:Partial<INSTANCE>, fn?: () => any) => any),\n * VALUE extends Record<KEY, OPTIONS extends (...args2:any[]) => infer R ? R\n * : OPTIONS extends ObserverPropertyType ? import('./observe.js').ParsedObserverPropertyType<OPTIONS>\n * : OPTIONS extends {type: 'object'} & ObserverOptions<any, infer R> ? (unknown extends R ? object : R)\n * : OPTIONS extends {type: ObserverPropertyType} ? import('./observe.js').ParsedObserverPropertyType<OPTIONS['type']>\n * : OPTIONS extends ObserverOptions<any, infer R> ? (unknown extends R ? string : R)\n * : never\n * >\n * > (this: CLASS, name: KEY, options: OPTIONS)\n * : CLASS & Class<VALUE,ARGS>;\n * }}\n */\n static props = /** @type {any} */ (this.observe);\n\n static idl = this.prop;\n\n /**\n * @this T\n * @template {typeof CustomElement} 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 // @ts-expect-error not typed\n this[collection] = [...this[collection], callback];\n return;\n }\n // @ts-expect-error any\n this[collection].push(callback);\n }\n\n /**\n * Append parts to composition\n * @type {{\n * <\n * T extends typeof CustomElement,\n * >\n * (this: T, ...parts: ConstructorParameters<typeof Composition<InstanceType<T>>>): T;\n * }}\n */\n static append(...parts) {\n this._addCallback('_onComposeCallbacks', ({ composition }) => {\n composition.append(...parts);\n });\n // @ts-expect-error Can't cast T\n return this;\n }\n\n /**\n * After composition, invokes callback.\n * May be called multiple times.\n * @type {{\n * <\n * T1 extends typeof CustomElement,\n * T2 extends InstanceType<T1>,\n * T3 extends CompositionCallback<T2, T2>['composed'],\n * >\n * (this: T1, callback: T3): T1\n * }}\n */\n static recompose(callback) {\n this._addCallback('_onComposeCallbacks', callback);\n // @ts-expect-error Can't cast T\n return this;\n }\n\n /**\n * Appends styles to composition\n * @type {{\n * <\n * T1 extends typeof CustomElement,\n * T2 extends TemplateStringsArray|HTMLStyleElement|CSSStyleSheet|string>(\n * this: T1,\n * array: T2,\n * ...rest: T2 extends string ? any : T2 extends TemplateStringsArray ? any[] : (HTMLStyleElement|CSSStyleSheet)[]\n * ): T1\n * }}\n */\n static css(array, ...substitutions) {\n this._addCallback('_onComposeCallbacks', ({ composition }) => {\n if (typeof array === 'string' || Array.isArray(array)) {\n // @ts-expect-error Complex cast\n composition.append(css(array, ...substitutions));\n } else {\n // @ts-expect-error Complex cast\n composition.append(array, ...substitutions);\n }\n });\n\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 {{\n * <T extends typeof CustomElement>(this: T, elementName: string): T;\n * }}\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 {{\n * <T extends typeof CustomElement>(\n * this: T,\n * string: TemplateStringsArray,\n * ...substitutions: (string|Element|((this:InstanceType<T>, data:InstanceType<T>, injections?:any) => any))[]\n * ): T\n * }}\n */\n static html(strings, ...substitutions) {\n this._addCallback('_onComposeCallbacks', ({ composition }) => {\n // console.log('onComposed:html', strings);\n composition.append(html(strings, ...substitutions));\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 * @type {{\n * <T1 extends typeof CustomElement, T2 extends T1, T3 extends (Base:T1) => T2>\n * (this: T1,customExtender?: T3|null): T3 extends null ? T1 : T2;\n * }}\n */\n static extend(customExtender) {\n // @ts-expect-error Can't cast T\n return customExtender ? customExtender(this) : class extends this {};\n }\n\n /**\n * Assigns static values to class\n * @type {{\n * <\n * T1 extends typeof CustomElement,\n * T2 extends {\n * [K in keyof any]: (\n * ((this:T1, ...args:any[]) => any)\n * |string|number|boolean|any[]|object)}\n * >\n * (this: T1, source: T2 & ThisType<T1 & T2>):T1 & T2;\n * }}\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 {{\n * <\n * CLASS extends typeof CustomElement,\n * ARGS extends ConstructorParameters<CLASS>,\n * INSTANCE extends InstanceType<CLASS>,\n * PROPS extends object>\n * (this: CLASS, source: PROPS & ThisType<PROPS & INSTANCE>, options?: Partial<PropertyDescriptor>)\n * : CLASS & Class<PROPS,ARGS>\n * }}\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 {{\n * <\n * CLASS extends typeof CustomElement,\n * ARGS extends ConstructorParameters<CLASS>,\n * INSTANCE extends InstanceType<CLASS>,\n * PROPS extends object>\n * (this: CLASS, source: PROPS & ThisType<PROPS & INSTANCE>, options?: Partial<PropertyDescriptor>)\n * : CLASS & Class<PROPS,ARGS>\n * }}\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 {{\n * <\n * BASE extends typeof CustomElement,\n * FN extends (...args:any[]) => any,\n * RETURN extends ReturnType<FN>,\n * SUBCLASS extends ClassOf<RETURN>,\n * (this: BASE, mixin: FN): SUBCLASS & BASE\n * }}\n */\n static mixin(mixin) {\n return mixin(this);\n }\n\n /**\n * Registers class with window.customElements synchronously\n * @type {{\n * <T extends typeof CustomElement>(this: T, elementName?: string, force?: boolean): T;\n * }}\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 attrList() {\n if (!this.hasOwnProperty('_attrs')) {\n this._attrs = new Map(this._attrs);\n }\n return this._attrs;\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 * @type {{\n * <\n * CLASS extends typeof CustomElement,\n * ARGS extends ConstructorParameters<CLASS>,\n * INSTANCE extends InstanceType<CLASS>,\n * KEY extends string,\n * OPTIONS extends ObserverPropertyType\n * | ObserverOptions<ObserverPropertyType, unknown, INSTANCE>\n * | ((this:INSTANCE, data:Partial<INSTANCE>, fn?: () => any) => any),\n * VALUE extends Record<KEY, OPTIONS extends (...args2:any[]) => infer R ? R\n * : OPTIONS extends ObserverPropertyType ? import('./observe').ParsedObserverPropertyType<OPTIONS>\n * : OPTIONS extends {type: 'object'} & ObserverOptions<any, infer R> ? (unknown extends R ? object : R)\n * : OPTIONS extends {type: ObserverPropertyType} ? import('./observe').ParsedObserverPropertyType<OPTIONS['type']>\n * : OPTIONS extends ObserverOptions<any, infer R> ? (unknown extends R ? string : R)\n * : never\n * >\n * > (this: CLASS, name: KEY, options: OPTIONS)\n * : CLASS & Class<VALUE,ARGS>\n * }}\n */\n static prop(name, typeOrOptions) {\n // TODO: Cache and save configuration for reuse (mixins)\n const config = defineObservableProperty(\n /** @type {any} */ (this.prototype),\n name,\n /** @type {any} */ (typeOrOptions),\n );\n\n const { changedCallback, attr, reflect, watchers } = config;\n if (changedCallback) {\n watchers.push([name, changedCallback]);\n }\n // TODO: Inspect possible closure bloat\n config.changedCallback = function wrappedChangedCallback(oldValue, newValue, changes) {\n this._onObserverPropertyChanged.call(this, name, oldValue, newValue, changes);\n };\n\n this.propList.set(name, config);\n\n if (attr && (reflect === true || reflect === 'read')) {\n this.attrList.set(attr, config);\n }\n\n this.onPropChanged(watchers);\n\n // @ts-expect-error Can't cast T\n return this;\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 {{\n * <\n * CLASS extends typeof CustomElement,\n * ARGS extends ConstructorParameters<CLASS>,\n * INSTANCE extends InstanceType<CLASS>,\n * PROPS extends {\n * [P in keyof any] :\n * {\n * enumerable?: boolean;\n * configurable?: boolean;\n * writable?: boolean;\n * value?: any;\n * get?: ((this: INSTANCE) => any);\n * set?: (this: INSTANCE, value: any) => void;\n * } | ((this: INSTANCE, ...args:any[]) => any)\n * },\n * VALUE extends {\n * [KEY in keyof PROPS]: PROPS[KEY] extends (...args2:any[]) => infer R ? R\n * : PROPS[KEY] extends TypedPropertyDescriptor<infer R> ? R : never\n * }>\n * (this: CLASS, props: PROPS & ThisType<PROPS & INSTANCE>): CLASS\n * & Class<VALUE,ARGS>\n * }}\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)) return this;\n const { watchers, attr, reflect } = this.propList.get(name);\n if (watchers.length && this.propChangedCallbacks.has(name)) {\n const propWatchers = this.propChangedCallbacks.get(name);\n for (const watcher of 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 if (attr && (reflect === true || reflect === 'read')) {\n this.attrList.delete(attr);\n }\n this.propList.delete(name);\n\n return this;\n }\n\n /**\n * Creates observable properties on instances\n * @type {{\n * <\n * CLASS extends typeof CustomElement,\n * ARGS extends ConstructorParameters<CLASS>,\n * INSTANCE extends InstanceType<CLASS>,\n * PROPS extends IDLParameter<INSTANCE & VALUE>,\n * VALUE extends {\n * [KEY in keyof PROPS]:\n * PROPS[KEY] extends (...args2:any[]) => infer R ? R\n * : PROPS[KEY] extends ObserverPropertyType ? import('./observe').ParsedObserverPropertyType<PROPS[KEY]>\n * : PROPS[KEY] extends {type: 'object'} & ObserverOptions<any, infer R> ? (unknown extends R ? object : R)\n * : PROPS[KEY] extends {type: ObserverPropertyType} ? import('./observe').ParsedObserverPropertyType<PROPS[KEY]['type']>\n * : PROPS[KEY] extends ObserverOptions<any, infer R> ? (unknown extends R ? string : R)\n * : never\n * },\n * > (this: CLASS, props: PROPS)\n * : CLASS & Class<VALUE,ARGS>\n * }}\n */\n static observe(props) {\n for (const [name, typeOrOptions] of Object.entries(props ?? {})) {\n /** @type {any} */\n const options = (typeof typeOrOptions === 'function')\n ? { reflect: false, get: typeOrOptions }\n : typeOrOptions;\n\n this.prop(name, options);\n }\n // @ts-expect-error Can't cast T\n return this;\n }\n\n /**\n * @type {{\n * <\n * T1 extends typeof CustomElement,\n * T2 extends IDLParameter<T1>>\n * (this: T1, props: T2):T1 & ParsedProps<T2>\n * }}\n */\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 /**\n * @type {{\n * <T extends typeof CustomElement>\n * (\n * this: T,\n * listeners?: import('./Composition').CompositionEventListenerObject<InstanceType<T>>,\n * options?: Partial<import('./Composition').CompositionEventListener<InstanceType<T>>>,\n * ): T;\n * }}\n */\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(/^([*1~]+)?(.*)$/);\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 /**\n * @type {{\n * <T extends typeof CustomElement>\n * (\n * this: T,\n * listenerMap: {\n * [P in keyof any]: import('./Composition').CompositionEventListenerObject<InstanceType<T>>\n * },\n * options?: Partial<import('./Composition').CompositionEventListener<InstanceType<T>>>,\n * ): T;\n * }}\n */\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 CustomElement['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 /**\n * @type {{\n * <\n * T1 extends typeof CustomElement,\n * T2 extends InstanceType<T1>,\n * T3 extends CompositionCallback<T2, T2>,\n * T4 extends keyof T3,\n * >\n * (this: T1, name: T3|T4, callbacks?: T3[T4] & ThisType<T2>): T1\n * }}\n */\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 /**\n * @type {{\n * <\n * T1 extends typeof CustomElement,\n * T2 extends InstanceType<T1>\n * >\n * (\n * this: T1,\n * options: ObjectOrObjectEntries<{\n * [P in keyof T2]? : (\n * this: T2,\n * oldValue: T2[P],\n * newValue: T2[P],\n * changes:any,\n * element: T2\n * ) => void\n * }>,\n * ): T1;\n * }}\n */\n static onPropChanged(options) {\n const entries = Array.isArray(options) ? options : Object.entries(options);\n const { propChangedCallbacks } = this;\n for (const [prop, callback] of entries) {\n if (propChangedCallbacks.has(prop)) {\n propChangedCallbacks.get(prop).push(callback);\n } else {\n propChangedCallbacks.set(prop, [callback]);\n }\n }\n\n // @ts-expect-error Can't cast T\n return this;\n }\n\n /**\n * @type {{\n * <\n * T1 extends typeof CustomElement,\n * T2 extends InstanceType<T1>\n * >\n * (\n * this: T1,\n * options: {\n * [x:string]: (\n * this: T2,\n * oldValue: string,\n * newValue: string,\n * element: T2\n * ) => void\n * },\n * ): T1;\n * }}\n */\n static onAttributeChanged(options) {\n const entries = Array.isArray(options) ? options : Object.entries(options);\n const { attributeChangedCallbacks } = this;\n for (const [name, callback] of entries) {\n if (attributeChangedCallbacks.has(name)) {\n attributeChangedCallbacks.get(name).push(callback);\n } else {\n attributeChangedCallbacks.set(name, [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 {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.constructor.prototype,\n this,\n {\n defaults: this.constructor.prototype,\n store: this,\n shadowRoot: 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 /**\n * @type {{\n * <\n * T extends CustomElement,\n * K extends string = string,\n * >(this:T,\n * name: K,\n * oldValue: K extends keyof T ? T[K] : unknown,\n * newValue: K extends keyof T ? T[K] : unknown,\n * changes?: K extends keyof T ? T[K] extends object ? Partial<T[K]> : T[K] : unknown): void;\n * }}\n */\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 const { _propChangedCallbacks } = this.static;\n if (_propChangedCallbacks.has(name)) {\n for (const callback of _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 { attributeChangedCallbacks } = this.static;\n if (attributeChangedCallbacks.has(name)) {\n for (const callback of attributeChangedCallbacks.get(name)) {\n callback.call(this, oldValue, newValue, this);\n }\n }\n\n // Array.find\n const { attrList } = this.static;\n if (!attrList.has(name)) return;\n\n const config = attrList.get(name);\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(name)) {\n cacheEntry = this.attributeCache.get(name);\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(name, {\n stringValue: newValue, parsedValue,\n });\n }\n // @ts-expect-error any\n this[config.key] = parsedValue;\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 { propList } = this.static;\n if (propList.has(name)) {\n const { reflect, attr } = propList.get(name);\n if (attr && (reflect === true || reflect === 'write')) {\n /** @type {{stringValue:string, parsedValue:any}} */\n let cacheEntry;\n let needsWrite = false;\n const { attributeCache } = this;\n if (attributeCache.has(attr)) {\n cacheEntry = attributeCache.get(attr);\n needsWrite = (cacheEntry.parsedValue !== newValue);\n } else {\n // @ts-ignore skip cast\n cacheEntry = {};\n attributeCache.set(attr, 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 // eslint-disable-next-line no-return-assign\n return (this._propAttributeCache ??= new Map());\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 refs: this.refs,\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: -3; }\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: 4; }\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=outline mdw-if={outlined} class=outline disabled={disabledState} focused={focusedState} pressed={pressedState} hovered={hoveredState}></div>\n `\n .css`\n :host {\n --mdw-shape__size: 0px;\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__inline-start-deg: calc(var(--mdw-dir, 1) * -90deg);\n\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 /* (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 z-index: 0;\n\n border-start-start-radius: calc(var(--mdw-shape__size__top-start-size));\n border-start-end-radius: calc(var(--mdw-shape__size__top-end-size));\n border-end-start-radius: calc(var(--mdw-shape__size__bottom-start-size));\n border-end-end-radius: calc(var(--mdw-shape__size__bottom-end-size));\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 }\n \n :host([shape-bottom]) {\n --mdw-shape__size__top-start-size: 0px;\n --mdw-shape__size__top-end-size: 0px;\n }\n \n :host([shape-start]) {\n --mdw-shape__size__top-end-size: 0px;\n --mdw-shape__size__bottom-end-size: 0px;\n }\n \n :host([shape-end]) {\n --mdw-shape__size__top-start-size: 0px;\n --mdw-shape__size__bottom-start-size: 0px;\n }\n \n `\n .css`\n .outline {\n position: absolute;\n inset: 0;\n\n border-style: solid;\n border-width: 1px;\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 `;\n}\n", "import { PALETTES, TYPE_STYLES } from '../services/theme.js';\n\nconst colorAttributeCSS = 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\nconst inkAttributeCSS = PALETTES.map((palette) => [\n `:host([ink=\"${palette}\"]){`,\n `--mdw-ink: var(--mdw-color__${palette});`,\n '}',\n `:host([ink=\"on-${palette}\"]){`,\n `--mdw-ink: var(--mdw-color__on-${palette});`,\n '}',\n `:host([ink=\"on-${palette}-container\"]){`,\n `--mdw-ink: var(--mdw-color__on-${palette}-container);`,\n '}',\n].join('')).join('');\n\nconst typeStyleAttributeCSS = 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('')).join('');\n\n/**\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(colorAttributeCSS)\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-bg: var(--mdw-color__surface);\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 .css(inkAttributeCSS)\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(typeStyleAttributeCSS);\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\n/* https://m3.material.io/components/badges/specs */\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-bg: 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\n /* Ensure 16px min-height while keeping display:block */\n padding-block: calc(8px - var(--mdw-typescale__body-small__line-height) / 2);\n padding-inline: max(4px, calc(4px + (var(--mdw-density) * 2px)));\n \n background-color: rgb(var(--mdw-bg));\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 min-block-size: 6px;\n min-inline-size: 6px;\n /* stylelint-disable-next-line declaration-property-value-disallowed-list */\n margin: 5px;\n padding: 0\n }\n \n `\n .autoRegister('mdw-badge');\n", "import { CHROME_VERSION, isFocused } from '../core/dom.js';\n\n/** @param {typeof import('../core/CustomElement.js').default} Base */\nexport default function DelegatesFocusMixin(Base) {\n return Base\n .set({\n delegatesFocus: true,\n })\n .extend(CHROME_VERSION >= 111\n ? (BaseClass) => BaseClass\n : (BaseClass) => class extends BaseClass {\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 && isFocused(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 // 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 ${e.type} event.`, this);\n }\n };\n for (const type of ['blur', 'focus', 'focusout', 'focusin']) {\n this.addEventListener(type, listener, { capture: true, once: true });\n }\n super.tabIndex = value;\n for (const type of ['blur', 'focus', 'focusout', 'focusin']) {\n this.removeEventListener(type, listener, { capture: true });\n }\n return;\n }\n\n super.tabIndex = value;\n }\n });\n}\n", "import DelegatesFocusMixin from './DelegatesFocusMixin.js';\n\n/**\n * @param {string} input\n * @return {string}\n */\nfunction parseSize(input) {\n if (!input) return '';\n if (input.includes('px')) return input;\n if (input.includes('em')) return input;\n if (input.includes('ex')) return input;\n return `calc(${input.replace('sp', '')} * 0.0625rem)`;\n}\n\n/** @param {typeof import('../core/CustomElement.js').default} Base */\nexport default function TypographyMixin(Base) {\n return Base\n .mixin(DelegatesFocusMixin)\n .observe({\n textPadding: 'string',\n textPaddingTop: 'string',\n textLeading: 'string',\n textPaddingBottom: 'string',\n })\n .observe({\n _computedTextPaddingTop({ textPaddingTop, textPadding }) {\n return parseSize(textPaddingTop ?? textPadding);\n },\n _computedTextPaddingBottom({ textPaddingBottom, textPadding }) {\n return parseSize(textPaddingBottom ?? textPadding);\n },\n _computedTextLeading({ textLeading }) {\n return parseSize(textLeading);\n },\n })\n .observe({\n _beforeStyle({ _computedTextPaddingTop, _computedTextLeading }) {\n if (_computedTextLeading) {\n return `margin-top:${_computedTextLeading}`;\n }\n if (_computedTextPaddingTop) {\n return `margin-top:${_computedTextPaddingTop}`;\n }\n return '';\n },\n _afterStyle({ _computedTextPaddingBottom }) {\n if (_computedTextPaddingBottom) {\n return `vertical-align:calc(-1em + (-1 * ${_computedTextPaddingBottom}));`;\n }\n return '';\n },\n })\n .html`\n <div id=wrapper style={_wrapperStyle} before={!!_beforeStyle} after={!!_afterStyle}\n ><span id=before mdw-if={!!_beforeStyle} style={_beforeStyle} text-leading={textLeading}></span\n ><span id=content before={!!_beforeStyle} after={!!_afterStyle}><span id=after mdw-if={!!_afterStyle} style={_afterStyle}></span></span\n ></div>\n `\n .recompose(({ refs: { content, slot } }) => {\n content.prepend(slot);\n })\n .css`\n :host {\n display: block;\n }\n\n :host(:where([text-padding],[text-padding-top],[text-padding-bottom])) {\n display: flex;\n }\n\n #wrapper {\n display: contents;\n\n }\n \n #wrapper:where([before], [after]) {\n display: flex;\n align-items: baseline; /* Allows growing element upwards without affecting text selection */\n\n }\n\n #wrapper[before] {\n margin-block-start: -1em;\n }\n\n #wrapper[after] {\n margin-block-end: -1em;\n }\n\n #before {\n display: inline-block;\n\n block-size: 1.4ex; /* Estimate */\n padding-block-start: 1em; /* Padding to be cropped by wrapper */\n }\n @supports(height:1cap) {\n #before {\n block-size: 1cap;\n }\n }\n\n #before[text-leading] {\n block-size: 0;\n }\n\n #content {\n display: contents;\n }\n \n #content:where([before], [after]) {\n display: block;\n }\n\n #after {\n display: inline-block;\n\n padding-block-end: 1em; /* Padding to be cropped by wrapper */\n }\n\n `;\n}\n", "/**\n * @param {typeof import('../core/CustomElement.js').default} Base\n */\nexport default function FlexableMixin(Base) {\n return Base\n .observe({\n block: 'boolean',\n inline: 'boolean',\n row: 'boolean',\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: 'string',\n })\n .css`\n /* https://css-tricks.com/snippets/css/a-guide-to-flexbox/ */\n\n :host{\n display: flex;\n flex-direction: column;\n\n box-sizing: border-box;\n\n }\n\n :host(:is([inline])) {\n display: inline-flex;\n }\n\n :host(:is([block])) {\n display: block;\n }\n \n \n :host(:is([inline][block])) {\n display: inline-block;\n }\n\n :host(:is([row])) {\n flex-direction: row;\n }\n\n :host(:is([row][y=\"start\"], [x=\"start\"]:not([row]))) {\n align-items: flex-start;\n }\n\n :host(:is([row][y=\"end\"], [x=\"end\"]:not([row]))) {\n align-items: flex-end;\n }\n\n :host(:is([row][y=\"center\"], [x=\"center\"]:not([row]))) {\n align-items: center;\n }\n\n :host(:is([row][y=\"between\"], [x=\"between\"]:not([row]))) {\n align-items: space-between;\n }\n\n :host(:is([row][y=\"around\"], [x=\"around\"]:not([row]))) {\n align-items: space-around;\n }\n\n :host(:is([row][y=\"stretch\"], [x=\"stretch\"]:not([row]))) {\n align-items: stretch;\n }\n\n :host(:is([row][x=\"start\"], [y=\"start\"]:not([row]))) {\n justify-content: flex-start;\n }\n\n :host(:is([row][x=\"end\"], [y=\"end\"]:not([row]))) {\n justify-content: flex-end;\n }\n\n :host(:is([row][x=\"center\"], [y=\"center\"]:not([row]))) {\n justify-content: center;\n }\n\n :host(:is([row][x=\"between\"], [y=\"between\"]:not([row]))) {\n justify-content: space-between;\n }\n\n :host(:is([row][x=\"stretch\"], [y=\"stretch\"]:not([row]))) {\n justify-content: stretch;\n }\n\n :host(:is([wrap])) {\n flex-wrap: wrap;\n }\n\n :host(:is([wrap=\"reverse\"])) {\n flex-wrap: wrap-reverse;\n }\n\n :host(:is([gap])) {gap: 0;}\n :host(:is([gap=\"4\"])) {gap: 4px;}\n :host(:is([gap=\"8\"])) {gap: 8px;}\n :host(:is([gap=\"12\"])) {gap: 12px;}\n :host(:is([gap=\"16\"])) {gap: 16px;}\n :host(:is([gap=\"20\"])) {gap: 20px;}\n :host(:is([gap=\"24\"])) {gap: 24px;}\n\n :host(:is([padding])) {padding: 0;}\n :host(:is([padding=\"pane\"])) { padding-inline: var(--mdw-pane__padding-inline, 0) }\n :host(:is([padding=\"4\"])) {padding: 4px;}\n :host(:is([padding=\"8\"])) {padding: 8px;}\n :host(:is([padding=\"12\"])) {padding: 12px;}\n :host(:is([padding=\"16\"])) {padding: 16px;}\n :host(:is([padding=\"20\"])) {padding: 20px;}\n :host(:is([padding=\"24\"])) {padding: 24px;}\n :host(:is([padding-x])) {padding-inline: 0;}\n :host(:is([padding-x=\"4\"])) {padding-inline: 4px;}\n :host(:is([padding-x=\"8\"])) {padding-inline: 8px;}\n :host(:is([padding-x=\"12\"])) {padding-inline: 12px;}\n :host(:is([padding-x=\"16\"])) {padding-inline: 16px;}\n :host(:is([padding-x=\"20\"])) {padding-inline: 20px;}\n :host(:is([padding-x=\"24\"])) {padding-inline: 24px;}\n :host(:is([padding-y])) {padding-block: 0;}\n :host(:is([padding-y=\"4\"])) {padding-block: 4px;}\n :host(:is([padding-y=\"8\"])) {padding-block: 8px;}\n :host(:is([padding-y=\"12\"])) {padding-block: 12px;}\n :host(:is([padding-y=\"16\"])) {padding-block: 16px;}\n :host(:is([padding-y=\"20\"])) {padding-block: 20px;}\n :host(:is([padding-y=\"24\"])) {padding-block: 24px;}\n\n \n `;\n}\n", "import CustomElement from '../core/CustomElement.js';\nimport FlexableMixin from '../mixins/FlexableMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\n/**\n * Boxes 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 .html`<slot id=slot></slot>`\n .css`\n :host(:where([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::slotted([flex-0]) {\n flex: 0;\n }\n\n #slot::slotted([flex-1]) {\n flex: 1;\n }\n\n #slot::slotted([flex-none]) {\n flex: none;\n }\n `\n .autoRegister('mdw-box');\n", "import TypographyMixin from '../mixins/TypographyMixin.js';\n\nimport Box from './Box.js';\n\nexport default Box\n .extend()\n .mixin(TypographyMixin)\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 })\n .set({\n /**\n * Browsers that do no support AriaMixin in ElementInternals need to have\n * their attributes after construction.\n * @type {Map<string, string>}\n */\n onConnectAriaValues: null,\n hasFiredConnected: false,\n })\n .methods({\n /**\n * @param {keyof HTMLElement & keyof ElementInternals} name\n */\n readAriaProperty(name) {\n if (this.elementInternals && name in this.elementInternals) {\n return this.elementInternals[name];\n } if (name in this) {\n return this[name];\n }\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 return this.getAttribute(name);\n },\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 (this.isConnected) {\n 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 } else {\n this.onConnectAriaValues ??= new Map();\n this.onConnectAriaValues.set(name, value);\n // Elements should not add attributes during construction\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 connected() {\n if (!this.onConnectAriaValues) return;\n for (const [key, value] of this.onConnectAriaValues) {\n this.updateAriaProperty(key, value);\n }\n this.onConnectAriaValues = null;\n },\n });\n}\n", "import { attemptFocus, isFocused, isRtl } from '../core/dom.js';\n\nimport AriaReflectorMixin from './AriaReflectorMixin.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 .mixin(AriaReflectorMixin)\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.readAriaProperty('ariaOrientation')\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 (!isFocused(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 && isFocused(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 = isFocused(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 AriaReflectorMixin from './AriaReflectorMixin.js';\nimport 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(AriaReflectorMixin)\n .mixin(KeyboardNavMixin)\n .set({\n ariaOrientationDefault: 'horizontal',\n _ariaRole: 'toolbar',\n });\n}\n", "/**\n * Displays elevation via shadows or underlighting.\n * Uses `filter:drop-shadow` to display elevation.\n * @param {ReturnType<import('./StateMixin.js').default> & ReturnType<import('./ThemableMixin.js').default>} Base\n */\nexport default function ElevationMixin(Base) {\n return Base\n .css`:host {\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-elevation__filter__0__penumbra: drop-shadow(0px 1px 2.5px rgba(var(--mdw-color__shadow), 0));\n --mdw-elevation__filter__1__penumbra: drop-shadow(0px 1px 2.5px rgba(var(--mdw-color__shadow), 0.25));\n --mdw-elevation__filter__2__penumbra: drop-shadow(0px 2px 5px rgba(var(--mdw-color__shadow), 0.25));\n --mdw-elevation__filter__3__penumbra: drop-shadow(0px 4px 7px rgba(var(--mdw-color__shadow), 0.263));\n --mdw-elevation__filter__4__penumbra: drop-shadow(0px 6px 9px rgba(var(--mdw-color__shadow), 0.27));\n --mdw-elevation__filter__5__penumbra: drop-shadow(0px 8px 12px rgba(var(--mdw-color__shadow), 0.30));\n \n --mdw-elevation__filter__0: var(--mdw-surface__shadow__0__umbra) var(--mdw-surface__shadow__0__penumbra);\n --mdw-elevation__filter__1: var(--mdw-surface__shadow__1__umbra) var(--mdw-surface__shadow__1__penumbra);\n --mdw-elevation__filter__2: var(--mdw-surface__shadow__2__umbra) var(--mdw-surface__shadow__2__penumbra);\n --mdw-elevation__filter__3: var(--mdw-surface__shadow__3__umbra) var(--mdw-surface__shadow__3__penumbra);\n --mdw-elevation__filter__4: var(--mdw-surface__shadow__4__umbra) var(--mdw-surface__shadow__4__penumbra);\n --mdw-elevation__filter__5: var(--mdw-surface__shadow__5__umbra) var(--mdw-surface__shadow__5__penumbra);\n */\n\n --mdw-elevation__rgb: var(--mdw-color__shadow);\n\n --mdw-elevation__box-shadow__0: 0px 1px 1px 0px rgba(var(--mdw-elevation__rgb), 0.00), 0px 0px 1px 1px rgba(var(--mdw-elevation__rgb), 0.00);\n --mdw-elevation__box-shadow__1: 0px 1px 2px 0px rgba(var(--mdw-elevation__rgb), 0.30), 0px 1px 3px 1px rgba(var(--mdw-elevation__rgb), 0.15);\n --mdw-elevation__box-shadow__2: 0px 1px 2px 0px rgba(var(--mdw-elevation__rgb), 0.30), 0px 2px 6px 2px rgba(var(--mdw-elevation__rgb), 0.15);\n --mdw-elevation__box-shadow__3: 0px 1px 3px 0px rgba(var(--mdw-elevation__rgb), 0.30), 0px 4px 8px 3px rgba(var(--mdw-elevation__rgb), 0.15);\n --mdw-elevation__box-shadow__4: 0px 2px 3px 0px rgba(var(--mdw-elevation__rgb), 0.30), 0px 6px 10px 4px rgba(var(--mdw-elevation__rgb), 0.15);\n --mdw-elevation__box-shadow__5: 0px 4px 4px 0px rgba(var(--mdw-elevation__rgb), 0.30), 0px 8px 12px 6px rgba(var(--mdw-elevation__rgb), 0.15);\n\n --mdw-elevation__drop-shadow__0: drop-shadow(0px 1px 001px rgba(var(--mdw-elevation__rgb),000)) drop-shadow(0px 1px 2.5px rgba(var(--mdw-elevation__rgb),00000));\n --mdw-elevation__drop-shadow__1: drop-shadow(0px 1px 001px rgba(var(--mdw-elevation__rgb),0.3)) drop-shadow(0px 1px 2.5px rgba(var(--mdw-elevation__rgb),0.250));\n --mdw-elevation__drop-shadow__2: drop-shadow(0px 1px 001px rgba(var(--mdw-elevation__rgb),0.3)) drop-shadow(0px 2px 005px rgba(var(--mdw-elevation__rgb),0.250));\n --mdw-elevation__drop-shadow__3: drop-shadow(0px 1px 1.5px rgba(var(--mdw-elevation__rgb),0.3)) drop-shadow(0px 4px 007px rgba(var(--mdw-elevation__rgb),0.263));\n --mdw-elevation__drop-shadow__4: drop-shadow(0px 2px 1.5px rgba(var(--mdw-elevation__rgb),0.3)) drop-shadow(0px 6px 009px rgba(var(--mdw-elevation__rgb),0.270));\n --mdw-elevation__drop-shadow__5: drop-shadow(0px 4px 2.0px rgba(var(--mdw-elevation__rgb),0.3)) drop-shadow(0px 8px 012px rgba(var(--mdw-elevation__rgb),0.300));\n }`;\n}\n", "import CustomElement from '../core/CustomElement.js';\nimport ElevationMixin from '../mixins/ElevationMixin.js';\nimport FlexableMixin from '../mixins/FlexableMixin.js';\nimport ShapeMixin from '../mixins/ShapeMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\nexport default CustomElement\n .extend()\n .mixin(ThemableMixin)\n .mixin(FlexableMixin)\n .mixin(ElevationMixin)\n .mixin(ShapeMixin)\n .html`<slot id=slot></slot>`\n .css`\n :host {\n --mdw-bg: var(--mdw-color__surface);\n --mdw-ink: var(--mdw-color__on-surface);\n position: relative;\n\n filter: var(--mdw-elevation__drop-shadow__0);\n \n background-color: rgb(var(--mdw-bg));\n color: rgb(var(--mdw-ink));\n \n font: var(--mdw-type__font);\n letter-spacing: var(--mdw-type__letter-spacing);\n\n transition: filter 200ms;\n }\n\n :host(:where([elevation=\"1\"])) { filter: var(--mdw-elevation__drop-shadow__1); }\n :host(:where([elevation=\"2\"])) { filter: var(--mdw-elevation__drop-shadow__2); }\n :host(:where([elevation=\"3\"])) { filter: var(--mdw-elevation__drop-shadow__3); }\n :host(:where([elevation=\"4\"])) { filter: var(--mdw-elevation__drop-shadow__4); }\n :host(:where([elevation=\"5\"])) { filter: var(--mdw-elevation__drop-shadow__5); }\n `\n .autoRegister('mdw-surface');\n", "import 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 .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 align-items: center;\n flex-direction: row;\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", "/** @typedef {import('./CustomElement').default} CustomElement */\n\nimport { attrNameFromPropName } from './dom.js';\n\n/**\n * @see https://html.spec.whatwg.org/multipage/webappapis.html#event-handler-attributes\n * @type {import('./observe.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('./observe.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/**\n * @typedef {Object} QueuedPropsMetadata\n * @prop {boolean} initial\n */\n\n/** @type {WeakMap<CustomElement, Map<string, QueuedPropsMetadata>>} */\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 queuedProps = queuedPropsByElement.get(this);\n const { initial } = queuedProps.get(name);\n queuedProps.delete(name);\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 ...(initial ? { duration: 0 } : null),\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}\n\n/** @type {WeakMap<Element, Function[]>} */\nconst pendingResizeCallbacks = new WeakMap();\nconst pendingConnections = new ResizeObserver((entries) => {\n for (const { target } of entries) {\n if (pendingResizeCallbacks.has(target)) {\n const callbacks = pendingResizeCallbacks.get(target);\n pendingResizeCallbacks.delete(target);\n pendingConnections.unobserve(target);\n for (const callback of callbacks) {\n callback();\n }\n }\n }\n});\n\n/** @type {import('./observe.js').ObserverOptions<'object',ElementStylerOptions, CustomElement>} */\nexport const ELEMENT_ANIMATION_TYPE = {\n type: 'object',\n reflect: false,\n diff: null, // Skip computing entire change\n propChangedCallback(name, oldValue, newValue) {\n if (!newValue) {\n const previousAnimations = previousAnimationsByElement.get(this);\n if (!previousAnimations?.has(name)) {\n // Fast abort\n return;\n }\n }\n const queuedProps = queuedPropsByElement.get(this);\n\n const initial = !this.isConnected;\n if (queuedProps) {\n if (queuedProps.has(name)) return;\n queuedProps.set(name, { initial });\n } else {\n queuedPropsByElement.set(this, new Map([[name, { initial }]]));\n }\n // TODO: Reuse callback instead constructing each tick\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 const callback = elementStylerMicrotaskCallback.bind(this, name);\n if (this.isConnected) {\n queueMicrotask(callback);\n } else if (pendingResizeCallbacks.has(this)) {\n pendingResizeCallbacks.get(this).push(callback);\n } else {\n pendingResizeCallbacks.set(this, [callback]);\n pendingConnections.observe(this);\n }\n },\n};\n\n/**\n * @type {WeakMap<CustomElement, Map<string, HTMLStyleElement|CSSStyleSheet>>}\n */\nconst styleReferences = new WeakMap();\n\n/** @type {boolean} */\nlet useAdoptedStyleSheets = null;\n\n/** @type {import('./observe.js').ObserverOptions<'string',string, CustomElement>} */\nexport const ELEMENT_STYLE_TYPE = {\n type: 'string',\n reflect: false,\n /**\n * @param {string|Record<keyof CSSStyleDeclaration & string, string|number>} value\n * @return {string}\n */\n parser(value) {\n if (!value || typeof value === 'string') {\n return /** @type {string} */ (value);\n }\n return `:host{${\n Object.entries(value).map(([key, rule]) => `${attrNameFromPropName(key)}:${rule}`)\n .join(';')\n }}`;\n },\n propChangedCallback(name, oldValue, newValue) {\n let mapOfStyles;\n\n /** @type {HTMLStyleElement|CSSStyleSheet} */\n let styles;\n if (styleReferences.has(this)) {\n mapOfStyles = styleReferences.get(this);\n if (mapOfStyles.has(name)) {\n styles = mapOfStyles.get(name);\n }\n } else {\n // Skip build if blank\n if (!newValue) return;\n mapOfStyles = new Map();\n styleReferences.set(this, mapOfStyles);\n }\n\n useAdoptedStyleSheets ??= 'adoptedStyleSheets' in ShadowRoot.prototype;\n if (!styles) {\n if (useAdoptedStyleSheets) {\n styles = new CSSStyleSheet();\n this.shadowRoot.adoptedStyleSheets = [\n ...this.shadowRoot.adoptedStyleSheets,\n styles,\n ];\n } else {\n const styleElement = this.ownerDocument.createElement('style');\n this.shadowRoot.prepend(styleElement);\n styles = styleElement;\n }\n mapOfStyles.set(name, styles);\n }\n if (newValue) {\n if (useAdoptedStyleSheets) {\n /** @type {CSSStyleSheet} */(styles).replaceSync(newValue);\n } else if (newValue) {\n /** @type {HTMLStyleElement} */(styles).textContent = newValue;\n }\n styles.disabled = false;\n } else {\n styles.disabled = true;\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 .observe({\n _resizeObserverEnabled: {\n type: 'boolean',\n value: true,\n },\n })\n .methods({\n /** @param {ResizeObserverEntry} entry */\n onResizeObserved(entry) {\n // Virtual function\n },\n observeResize() {\n resizeObserver.observe(this, {\n box: 'border-box',\n });\n },\n unobserveResize() {\n resizeObserver.unobserve(this);\n },\n })\n .on({\n connected() {\n if (!this._resizeObserverEnabled) return;\n this.observeResize();\n },\n disconnected() {\n this.unobserveResize();\n },\n _resizeObserverEnabledChanged(previous, enabled) {\n if (enabled) {\n this.observeResize();\n } else {\n this.unobserveResize();\n }\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 /** True if focus was synthetic */\n _focusedSynthetic: 'boolean',\n _keyPressed: 'boolean',\n /** True if key was released this event loop. (Used to ignore clicks) */\n _keyReleased: 'boolean',\n _pointerPressed: '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({ _keyPressed, _pointerPressed, pressed }) { return _keyPressed || _pointerPressed || pressed; },\n touchedState({ _lastInteraction }) {\n return _lastInteraction === 'touch';\n },\n pointedState({ _lastInteraction }) {\n return _lastInteraction === 'mouse' || _lastInteraction === 'pen';\n },\n })\n .define({\n /** @return {HTMLElement} */\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 pointed={pointedState}\n aria-hidden=true></div>\n `\n .events({\n pointerenter(event) {\n if (!event.isTrusted) return;\n if (!event.isPrimary) return;\n this._pointerPressed = this.stateTargetElement.matches(':active');\n if (event.pointerType === 'touch') return;\n this._hovered = true;\n },\n '~pointerdown'(event) {\n if (!event.isTrusted) return;\n if (!event.isPrimary) return;\n this._lastInteraction = /** @type {'touch'|'mouse'|'pen'} */ (event.pointerType);\n this._pointerPressed = true;\n },\n '~pointerup'(event) {\n if (!event.isTrusted) return;\n if (!event.isPrimary) return;\n this._lastInteraction = /** @type {'touch'|'mouse'|'pen'} */ (event.pointerType);\n this._pointerPressed = false;\n },\n pointercancel(event) {\n if (!event.isTrusted) return;\n if (!event.isPrimary) return;\n this._pointerPressed = this.stateTargetElement.matches(':active');\n },\n pointerleave(event) {\n if (!event.isTrusted) return;\n if (!event.isPrimary) return;\n this._pointerPressed = false;\n this._hovered = false;\n },\n '~keydown'(event) {\n if (!event.isTrusted) return;\n this._lastInteraction = 'key';\n if (event.repeat) return;\n if (event.key !== ' ') return;\n this._keyPressed = true;\n },\n '~keyup'(event) {\n if (!event.isTrusted) return;\n this._lastInteraction = 'key';\n if (event.key !== ' ') return;\n this._keyPressed = false;\n this._keyReleased = true;\n setTimeout(() => {\n this._keyReleased = false;\n });\n },\n blur(event) {\n if (!event.isTrusted) return;\n this._focused = false;\n this._focusedSynthetic = false;\n this._keyPressed = false;\n this._pointerPressed = false;\n if (!this._lastInteraction) return;\n lastInteractionWasTouch = (this._lastInteraction === 'touch');\n this._lastInteraction = null;\n },\n focus(event) {\n if (!event.isTrusted) return;\n this._focusedSynthetic = 'sourceCapabilities' in event\n ? !event.sourceCapabilities\n : (this._lastInteraction === null && !event.relatedTarget);\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._focused = false;\n this._keyPressed = false;\n this._pointerPressed = false;\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 --mdw-state__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\n position: absolute;\n inset: 0;\n\n pointer-events: none;\n\n opacity: var(--mdw-state__opacity);\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 /** Reduce RAM usage by not creating stack contexts */\n @supports(background-color: color-mix(in srgb, red calc(100%), red)) {\n #state {\n opacity: 1;\n\n background-color: color-mix(in srgb, currentColor calc(100% * var(--mdw-state__opacity)), transparent);\n\n transition-property: color, background-color;\n will-change: color, background-color;\n }\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 CustomElement from '../core/CustomElement.js';\n\nexport default CustomElement\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: none;\n\n cursor:pointer;\n\n outline: none; /* Older Chromium Builds */\n \n -webkit-tap-highlight-color: transparent;\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 will-change: opacity;\n }\n\n :host::-webkit-scrollbar {\n display: none;\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 inset-block-start: 0;\n inset-inline-start: 0;\n\n display: block;\n\n block-size: 200%;\n inline-size: 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", "import CustomElement from '../core/CustomElement.js';\nimport { ELEMENT_ANIMATION_TYPE, EVENT_HANDLER_TYPE } from '../core/customTypes.js';\nimport AriaReflectorMixin from '../mixins/AriaReflectorMixin.js';\nimport DelegatesFocusMixin from '../mixins/DelegatesFocusMixin.js';\nimport FlexableMixin from '../mixins/FlexableMixin.js';\nimport ResizeObserverMixin from '../mixins/ResizeObserverMixin.js';\nimport ShapeMixin from '../mixins/ShapeMixin.js';\nimport StateMixin from '../mixins/StateMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\nimport Scrim from './Scrim.js';\n\nconst SUPPORTS_SCROLLEND = 'onscrollend' in window;\n\n/* Weak Collection of Events that cane from drag handle */\nconst dragHandleEvent = new WeakSet();\n\nCustomElement\n .extend()\n .mixin(StateMixin)\n .set({\n stateLayer: true,\n })\n .html`\n <div id=container>\n <div id=icon aria-hidden=true></div>\n </div>\n `\n .recompose(({ refs: { container, state } }) => {\n container.prepend(state);\n })\n .css`\n :host {\n --mdw-state__hovered-opacity: 0;\n --mdw-state__pressed-opacity: 0;\n position: absolute;\n inset-block-start: 0;\n inset-inline: 0;\n align-self: stretch;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n cursor: grab;\n\n outline:none;\n pointer-events: auto;\n user-select: none;\n touch-action: none;\n\n color: rgb(var(--mdw-color__on-surface-variant));\n }\n\n :host(:active) {\n cursor: grabbing !important;\n }\n\n #container {\n position: relative;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n min-block-size: 48px;\n min-inline-size: 48px;\n }\n\n #state {\n border-radius: 50%;\n }\n\n #state[pointed] {\n --mdw-state__focused-opacity: 0;\n }\n \n\n #icon {\n block-size: 4px;\n inline-size: 32px;\n\n background-color: currentColor;\n border-radius: 8px;\n }\n `\n .events({\n touchmove(event) {\n event.preventDefault();\n },\n })\n .autoRegister('mdw-bottom-sheet-handle');\n\nexport default CustomElement\n .extend()\n .mixin(ThemableMixin)\n .mixin(FlexableMixin)\n .mixin(ShapeMixin)\n .mixin(AriaReflectorMixin)\n .mixin(DelegatesFocusMixin)\n .mixin(ResizeObserverMixin)\n .observe({\n shapeTop: {\n type: 'boolean',\n empty: true,\n },\n modal: 'boolean',\n open: 'boolean',\n expanded: 'boolean',\n _lastComputedBlockSize: {\n type: 'float',\n nullable: false,\n },\n _lastOffsetTop: {\n type: 'float',\n nullable: false,\n },\n _animationDuration: {\n type: 'integer',\n value: 0,\n },\n _animationEasing: {\n value: 'ease-out',\n },\n _translateY: { value: '100%' },\n _lastChildScrollTime: 'float',\n _ariaValueNow: {\n type: 'integer',\n },\n dragHandle: 'boolean',\n onopen: EVENT_HANDLER_TYPE,\n onclose: EVENT_HANDLER_TYPE,\n })\n .set({\n _hasCheckedResize: false,\n /** @type {InstanceType<Scrim>} */\n _scrim: null,\n _dragTimestamp: 0,\n /** @type {number} */\n _dragDeltaY: null,\n /** @type {number} */\n _dragStartY: null,\n })\n .observe({\n hostStyles: {\n ...ELEMENT_ANIMATION_TYPE,\n get({\n open, modal, _lastComputedBlockSize, _translateY,\n _animationDuration, _animationEasing,\n }) {\n const computedMargin = (open || modal) ? 0 : `${-1 * _lastComputedBlockSize}px`;\n return {\n styles: {\n marginBottom: computedMargin,\n transform: modal ? `translateY(${_translateY})` : 'none',\n },\n timing: {\n duration: _animationDuration,\n easing: _animationEasing,\n },\n };\n },\n },\n })\n .html`\n <mdw-bottom-sheet-handle id=drag-handle mdw-if={dragHandle} tabindex=0\n role=separator aria-valuemin=-100 aria-valuemax=0 aria-valuenow={_ariaValueNow}></mdw-bottom-sheet-handle>\n <slot id=slot></slot>\n `\n .methods({\n checkForScrim(animate = false) {\n let { open, modal, _scrim } = this;\n if (open && modal) {\n if (!_scrim) {\n _scrim = new Scrim();\n _scrim.addEventListener('click', () => {\n this.open = false;\n if (!this.dispatchEvent(new Event('close', { cancelable: true }))) {\n // Revert if cancelled\n this.open = true;\n }\n });\n this._scrim = _scrim;\n }\n this.before(_scrim);\n _scrim.hidden = false;\n } else if (_scrim) {\n if (!animate) {\n _scrim.remove();\n }\n _scrim.hidden = true;\n }\n },\n checkDragFinished() {\n const { open, _dragStartY, _dragDeltaY, _lastComputedBlockSize, modal, _lastOffsetTop } = this;\n if (!open || !modal || _dragStartY == null || _dragDeltaY == null) return;\n const containerHeight = _lastOffsetTop + _lastComputedBlockSize - 72;\n const min = (_lastComputedBlockSize > containerHeight)\n ? _lastComputedBlockSize - containerHeight\n : 0;\n // visiblity = (max - position) / range\n const visibility = (_lastComputedBlockSize - _dragDeltaY) / (_lastComputedBlockSize - min);\n this._dragStartY = null;\n if (visibility < 0.5) {\n // Should close\n this._animationDuration = 200 * visibility;\n this._animationEasing = 'ease-out';\n this._translateY = '100%';\n this._dragDeltaY = null;\n this.open = false;\n this.dispatchEvent(new Event('close', { cancelable: false }));\n } else {\n // Should snap back to fully open\n this._animationDuration = 250 * (0.5 * visibility);\n this._dragDeltaY = min;\n this._translateY = `${0}px`;\n this._animationEasing = 'ease-in';\n this.expanded = true;\n }\n },\n /** @param {PointerEvent} event */\n onDragHandleActive(event) {\n if (!event.isTrusted) return;\n if (!event.isPrimary) return;\n if (event.pointerType === 'touch') return;\n if (event.buttons !== 1) return;\n dragHandleEvent.add(event);\n },\n /** @param {PointerEvent} event */\n onDragHandleInactive(event) {\n if (!event.isTrusted) return;\n if (!event.isPrimary) return;\n if (event.pointerType === 'touch') return;\n if (event.type !== 'pointerup' && event.buttons !== 1) return;\n this.checkDragFinished();\n },\n /** @param {PointerEvent|TouchEvent} event */\n onPointerOrTouchMove(event) {\n /** @type {{clientY:number,pageY:number}} */\n let source;\n const isTouch = (event.type === 'touchmove');\n if (isTouch) {\n const { touches } = /** @type {TouchEvent} */ (event);\n if (!touches.length) return;\n source = touches[0];\n } else {\n source = /** @type {PointerEvent} */ (event);\n // if (!dragHandleEvent.has(event)) return;\n }\n const { open, _lastChildScrollTime, _dragStartY, _dragTimestamp, expanded } = this;\n if (!open || _dragStartY == null) return;\n if (_lastChildScrollTime && performance.now() - _lastChildScrollTime <= (SUPPORTS_SCROLLEND ? 5000 : 500)) {\n // Assume still scrolling\n return;\n }\n let { clientY, pageY } = source;\n clientY ??= pageY - window.scrollY; // Safari\n const { _lastOffsetTop, _lastComputedBlockSize } = this;\n const containerHeight = _lastOffsetTop + _lastComputedBlockSize - 72;\n const min = _lastComputedBlockSize > containerHeight\n ? _lastComputedBlockSize - containerHeight\n : 0;\n const delta = Math.max((clientY - _dragStartY), min);\n this._dragDeltaY = delta;\n\n if (isTouch && expanded && performance.now() - _dragTimestamp < 100) {\n // Store location, but don't animate until sure not scrolling\n return;\n }\n if (expanded && delta !== min) {\n // Buggy in demos\n // this.expanded = false;\n }\n\n this._animationDuration = 0;\n this._translateY = `${delta}px`;\n },\n })\n .overrides({\n onResizeObserved(entry) {\n this._lastComputedBlockSize = entry.borderBoxSize[0]?.blockSize;\n this._lastOffsetTop = this.offsetTop;\n },\n })\n .events({\n '~pointerdown'(event) {\n if (event.pointerType !== 'touch') {\n if (event.buttons !== 1) return;\n // Pointer down isn't from drag-handle. Ignore\n if (!dragHandleEvent.has(event)) return;\n }\n if (!this.open) return;\n let { clientY, pageY } = event;\n clientY ??= pageY - window.scrollY; // Safari\n this._dragStartY = clientY - (this._dragDeltaY ?? 0);\n this._dragDeltaY = 0;\n this._dragTimestamp = performance.now();\n },\n '~pointermove': 'onPointerOrTouchMove',\n '~pointerup'(event) {\n if (event.pointerType === 'touch') return;\n this.checkDragFinished();\n },\n 'pointerleave'(event) {\n if (event.pointerType === 'touch') return;\n this.checkDragFinished();\n },\n '~touchmove': 'onPointerOrTouchMove',\n touchcancel: 'checkDragFinished',\n '~touchend': 'checkDragFinished',\n /** Scroll events do no bubble but can be captured, passively */\n '*~scroll'() {\n if (!this.modal) return;\n this.checkDragFinished();\n this._lastChildScrollTime = performance.now();\n // Wiping touch state\n this._dragStartY = null;\n this._dragDeltaY = null;\n },\n '*scrollend'() {\n if (!this.modal) return;\n this._lastChildScrollTime = null;\n },\n })\n .childEvents({\n dragHandle: {\n '~pointerdown': 'onDragHandleActive',\n '~pointermove': 'onDragHandleActive',\n },\n })\n .on({\n openChanged(previous, open) {\n // Refresh metrics\n const _lastOffsetTop = this.offsetTop;\n this._lastOffsetTop = _lastOffsetTop;\n // No longer using initial animation timing of 0\n this._animationDuration = open ? 250 : 200;\n if (open) {\n let y = 0;\n if (this.modal) {\n const { _lastComputedBlockSize } = this;\n const containerHeight = _lastOffsetTop + _lastComputedBlockSize;\n if (_lastComputedBlockSize > containerHeight / 2) {\n // Bottom Sheet is oversized, clamp to 50%\n y = _lastComputedBlockSize - (containerHeight / 2);\n }\n }\n this._translateY = `${y}px`;\n this._dragDeltaY = y;\n } else {\n this._translateY = '100%';\n this.expanded = false;\n }\n this._animationEasing = open ? 'ease-in' : 'ease-out';\n this.checkForScrim(true);\n if (open) this.focus();\n },\n modalChanged() {\n this._animationDuration = 0;\n this.checkForScrim(false);\n },\n })\n .css`\n :host {\n --mdw-bg: var(--mdw-color__surface-container-low);\n --mdw-ink: var(--mdw-color__on-surface);\n --mdw-shape__size: var(--mdw-shape__extra-large);\n --mdw-shape__size__bottom-start-size: 0px;\n --mdw-shape__size__bottom-end-size: 0px;\n position: sticky;\n inset-block-end: 0;\n inset-inline: 0;\n\n overflow-y: clip;\n\n overscroll-behavior: none;\n overscroll-behavior: contain;\n\n box-sizing: border-box;\n max-inline-size: 640px;\n margin-inline: auto;\n padding-block-start: 16px;\n\n pointer-events: none;\n\n transform: translateY(100%);\n\n visibility: hidden;\n\n background-color: rgb(var(--mdw-bg));\n color: rgb(var(--mdw-ink));\n\n transition: visibility 200ms;\n \n will-change: transform, margin-block-end, visibility;\n }\n\n :host(:where([open])) {\n pointer-events: auto;\n\n visibility: inherit;\n\n transition: visibility 0s;\n }\n\n :host(:where([modal])) {\n position: fixed; \n\n max-block-size: calc(100% - 72px);\n touch-action: none;\n\n z-index: 24;\n }\n\n :host(:where([expanded])) {\n overflow-y:auto;\n touch-action: auto;\n }\n\n :host(:where([drag-handle])) {\n padding-block-start: 48px;\n }\n `\n .autoRegister('mdw-bottom-sheet');\n", "/** @type {Map<string, {path:string, viewBox:string}>} */\nexport const svgAliasMap = new Map();\nexport const unaliased = new Set();\n\n/**\n * @param {string} name\n * @param {string} path\n * @param {string} [viewBox]\n */\nexport function 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", "// 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';\nimport { svgAliasMap, unaliased } from '../services/svgAlias.js';\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 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 icon: 'string',\n disabled: 'boolean',\n alt: 'string',\n src: 'string',\n svg: 'string',\n svgPath: 'string',\n srcset: 'string',\n sizes: 'string',\n variation: '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 _isConnected: 'boolean',\n })\n .observe({\n _svgAlias: {\n type: 'object',\n get({ icon, variation }) {\n if (!icon) return null;\n const iconName = icon.trim().toLowerCase();\n const suffix = variation ? `#${variation}` : '';\n\n const aliasName = `${iconName}${suffix}`;\n if (svgAliasMap.has(aliasName)) {\n return svgAliasMap.get(aliasName);\n }\n unaliased.add(aliasName);\n\n // Fallback to base version\n if (suffix && svgAliasMap.has(iconName)) {\n return svgAliasMap.get(iconName);\n }\n\n return null;\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 _showFontIcon: {\n type: 'boolean',\n get({ icon, svg, _computedSVGPath, src }) {\n return icon && !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={_showFontIcon} 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 <span id=icon class={fontClass} hidden={!_showFontIcon} aria-hidden=true>{icon}</span>\n `\n .css`\n /* https://material.io/design/iconography/system-icons.html */\n\n :host {\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 line-height: 1;\n\n font-variation-settings: 'FILL' 0;\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([variation=\"fill\"]) {\n font-variation-settings: 'FILL' 1;\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 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 block-size: inherit;\n inline-size: inherit;\n\n fill: currentColor;\n\n object-fit: cover;\n }\n\n #img {\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 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 .extend((BaseClass) => class extends BaseClass {\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 .autoRegister('mdw-icon');\n", "/**\n * Listens for HTMLAnchorElement click events that will trigger navigation\n * and throws a cancelable `mdw:hyperlink` event before firing.\n * Will be supported until Navigation API is widely available\n * @param {typeof import('../core/CustomElement.js').default} Base\n */\nexport default function NavigationListenerMixin(Base) {\n return Base\n .rootEvents({\n click(event) {\n const { target } = event;\n if (!(target instanceof HTMLAnchorElement)) return;\n if (!target.href) return;\n const actionAllowed = target.dispatchEvent(new CustomEvent('mdw:hyperlink', {\n bubbles: true,\n composed: true,\n cancelable: true,\n detail: {\n download: target.download,\n href: target.href,\n hreflang: target.hreflang,\n target: target.target,\n },\n }));\n if (!actionAllowed) {\n // Allow the click event to propagate\n // event.stopPropagation();\n // Don't perform native hyperlink action\n event.preventDefault();\n }\n },\n });\n}\n", "import NavigationListenerMixin from './NavigationListenerMixin.js';\n\n// https://html.spec.whatwg.org/multipage/links.html#dom-hyperlink-protocol-dev\n\n/**\n * @template {keyof URL} T\n * @param {T} name\n * @return {ThisType<URL> & TypedPropertyDescriptor<URL[T]>}\n */\nfunction buildHyperlinkDefinition(name) {\n return {\n get() {\n return new URL(this.href, window.location.href)[name];\n },\n set(value) {\n const { href } = this;\n if (!href) return;\n const url = new URL(href, window.location.href);\n url[name] = value;\n this.href = url.href;\n },\n };\n}\n\n/** @param {typeof import('../core/CustomElement.js').default} Base */\nexport default function HyperlinkMixin(Base) {\n return Base\n .mixin(NavigationListenerMixin)\n .observe({\n href: 'string',\n target: 'string',\n download: 'string',\n ping: 'string',\n rel: 'string',\n hreflang: 'string',\n referrerPolicy: { type: 'string', attr: 'referrerpolicy' },\n })\n .define({\n origin() { return new URL(this.href).origin; },\n protocol: buildHyperlinkDefinition('protocol'),\n username: buildHyperlinkDefinition('username'),\n password: buildHyperlinkDefinition('password'),\n host: buildHyperlinkDefinition('host'),\n hostname: buildHyperlinkDefinition('hostname'),\n port: buildHyperlinkDefinition('port'),\n pathname: buildHyperlinkDefinition('pathname'),\n search: buildHyperlinkDefinition('search'),\n hash: buildHyperlinkDefinition('hash'),\n })\n .html`\n <a id=anchor\n href={href}\n target={target}\n download={download}\n ping={ping}\n rel={rel}\n hreflang={hreflang}\n referrerpolicy={referrerPolicy}\n ></a>\n `\n .methods({\n toString() {\n return this.href;\n },\n });\n}\n", "/* https://html.spec.whatwg.org/multipage/form-control-infrastructure.html */\n\nimport { CHROME_VERSION } from '../core/dom.js';\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 /** @type {FileList} */\n _files: null,\n })\n .observe({\n ariaControls: 'string',\n autocomplete: DOMString,\n name: DOMString,\n readOnly: { attr: 'readonly', type: 'boolean' },\n formNoValidate: { attr: 'formnovalidate', 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 case 'filename':\n default:\n return _value;\n case 'default':\n return _defaultValue ?? '';\n case 'default/on':\n return _defaultValue ?? 'on';\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 case 'filename':\n if (v == null || v === '') {\n this._files = null;\n // Presume overriding class will interpet null as empty\n } else {\n throw new DOMException('InvalidStateError');\n }\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({ _checkedDirty, defaultChecked, _checked }) {\n if (_checkedDirty) return _checked;\n return defaultChecked;\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() {\n if (this.type === 'submit') return !this.formNoValidate;\n if (this.type === 'button' || this.type === 'reset') return false;\n return this.elementInternals.willValidate;\n },\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 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._userInteracted = false; // Reset error states\n this._formReset = false;\n },\n\n /**\n * @param {string|FormData} state\n * @param {'autocomplete'|'restore'} mode\n */\n formStateRestoreCallback(state, mode) {\n if (CHROME_VERSION < 115) {\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 case 'button':\n case 'reset':\n this.elementInternals.setFormValue(null);\n break;\n case 'file': {\n const { elementInternals, _files, name } = this;\n if (!_files || _files.length) {\n elementInternals.setFormValue(null);\n } else {\n const fd = new FormData();\n for (const entry of _files) {\n fd.append(name, entry);\n }\n elementInternals.setFormValue(fd);\n }\n break;\n }\n case 'select-multiple': {\n const formData = new FormData();\n if (this.name) {\n for (const option of this.selectedOptions) {\n formData.append(this.name, option.value);\n }\n }\n this.elementInternals.setFormValue(formData);\n break;\n }\n // case 'select-one':\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 _valueBehaviorChanged(previous, current) {\n if (previous !== 'filename' && current === 'filename') {\n this.value = '';\n }\n },\n typeChanged() {\n this._updateFormAssociatedValue();\n },\n });\n}\n", "/* https://html.spec.whatwg.org/multipage/form-control-infrastructure.html */\n\nimport { cloneAttributeCallback } from '../core/CustomElement.js';\nimport { FIREFOX_VERSION, SAFARI_VERSION } from '../core/dom.js';\n\nimport DelegatesFocusMixin from './DelegatesFocusMixin.js';\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 .mixin(DelegatesFocusMixin)\n .observe({\n ariaLabel: 'string',\n _slotInnerText: 'string',\n })\n .set({\n focusableOnDisabled: false,\n controlTagName: 'input',\n controlVoidElement: true,\n _slotMutationObserver: null,\n })\n .methods({\n /**\n * Default behavior can be overridden\n * @param {string} value\n */\n _onControlValue(value) {\n this._value = value;\n },\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._onControlValue(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 if (this.disabledState) return;\n this.refs.control.click();\n },\n })\n .define({\n stateTargetElement() { return this.refs.control; },\n })\n .methods({\n checkValidity() {\n if (!this.willValidate) return true;\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 .observe({\n _computedAriaLabel({ ariaLabel, _slotInnerText }) {\n return ariaLabel?.trim() || _slotInnerText?.trim() || null;\n },\n })\n .expressions({\n _computedAriaLabelledby({ _computedAriaLabel }) {\n return _computedAriaLabel ? null : 'slot';\n },\n })\n\n .recompose(({ template, html, element }) => {\n template.append(html`\n <${element.controlTagName} id=control\n aria-label={_computedAriaLabel}\n aria-labelledby={_computedAriaLabelledby}\n part=control\n form-disabled={disabledState}\n type={type}\n >${element.controlVoidElement ? '' : `</${element.controlTagName}>`}\n `);\n })\n .on({\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 readOnlyChanged(oldValue, newValue) {\n const control = /** @type {HTMLControlElement} */ (this.refs.control);\n if (this.type === 'checkbox') {\n control.setAttribute('aria-readonly', newValue ? 'true' : 'false');\n } else {\n control.removeAttribute('aria-readonly');\n }\n },\n constructed() {\n const control = /** @type {HTMLControlElement} */ (this.refs.control);\n this._onControlValue(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 click(e) {\n if ((this.type === 'checkbox' && this.readOnly)\n || (this.focusableOnDisabled && this.disabledState)) {\n e.preventDefault();\n e.stopImmediatePropagation();\n }\n },\n input({ currentTarget }) {\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._onControlValue(control.value);\n },\n change({ currentTarget }) {\n const control = /** @type {HTMLControlElement} */ (currentTarget);\n this._valueDirty = true;\n this._onControlValue(control.value);\n this.checkValidity();\n },\n },\n slot: (FIREFOX_VERSION < 116 || SAFARI_VERSION) ? {\n slotchange({ currentTarget }) {\n // Firefox and Safari will not apply label from slots.\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1826194\n // https://commits.webkit.org/263644@main\n // https://bugs.webkit.org/show_bug.cgi?id=260772\n this._slotInnerText = this.textContent;\n if (!this._slotMutationObserver) {\n this._slotMutationObserver = new MutationObserver(() => {\n this._slotInnerText = this.textContent;\n });\n this._slotMutationObserver.observe(currentTarget, { characterData: true });\n }\n },\n } : {},\n })\n .rootEvents({\n change(event) {\n // Change event is NOT composed. Needs to escape shadow DOM\n // @ts-ignore skip constructor cast\n this.dispatchEvent(new event.constructor(event.type, event));\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 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/** Flag redispatched click events to know not to block them */\nconst redispatchedClickEvents = new WeakSet();\n/** Flag root click events to know not to block them */\nconst rootClickEvents = new WeakSet();\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 formTarget: { attr: 'formtarget', ...DOMString },\n _height: { attr: 'height', type: 'integer' },\n _indeterminate: 'boolean',\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 .set({\n _useFormImplicitSubmission: true,\n })\n .define({\n // Alias for typescript\n _input() { return /** @type {HTMLInputElement} */ (this.refs.control); },\n })\n .observe({\n indeterminate: {\n type: 'boolean',\n get({ _indeterminate }) {\n return _indeterminate;\n },\n /** @param {boolean} value */\n set(value) {\n this._input.indeterminate = value;\n this._indeterminate = this._input.indeterminate;\n },\n },\n })\n .overrides({\n controlTagName: 'input',\n })\n .recompose(({ refs: { control } }) => {\n control.setAttribute('checked', '{defaultChecked}');\n control.setAttribute('height', '{_height}');\n control.setAttribute('width', '{_width}');\n control.setAttribute('value', '{_defaultValue}');\n })\n .on({\n // TODO: Bind multiple\n typeChanged() { this.onValueChangingContentAttribute(); },\n checkedChanged() {\n this._input.checked = this.checked;\n this._input.indeterminate = this._indeterminate;\n },\n _indeterminateChanged(previous, current) {\n this._input.indeterminate = current;\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 this._onSetValue(this.defaultValue);\n const input = this._input;\n input.checked = this.defaultChecked;\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 this.indeterminate = false;\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 if (!this._useFormImplicitSubmission) return;\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.dispatchEvent(new PointerEvent(\n 'click',\n { bubbles: true, cancelable: true, composed: true },\n ));\n return;\n }\n if (submissionBlockers.size > 1) return;\n this.form.submit();\n },\n /** @param {Event} event */\n _redispatchControlClickEvent(event) {\n event.stopPropagation();\n // Use constructor to match mouse/pointer properties\n /** @type {Event} */\n // @ts-ignore skip-cast\n const newEvent = (new event.constructor(event.type, event));\n redispatchedClickEvents.add(newEvent);\n return this.dispatchEvent(newEvent);\n },\n /** @param {MouseEvent} event */\n _handleInputClick(event) {\n if (this.disabledState) return;\n const input = this._input;\n switch (input.type) {\n case 'checkbox':\n case 'radio': {\n const { _checkedDirty, _checked, _indeterminate } = this;\n this.checked = input.checked;\n // Event needs to be rethrown and preventDefault inspected\n if (this._redispatchControlClickEvent(event)) return;\n event.preventDefault();\n this._checkedDirty = _checkedDirty;\n this._checked = _checked;\n this._indeterminate = _indeterminate;\n break;\n }\n case 'button':\n case 'submit':\n case 'reset': {\n if (!this._redispatchControlClickEvent(event)) {\n event.preventDefault();\n return;\n }\n const { type } = input;\n if (type !== 'submit' && type !== 'reset') return;\n // If in the composed path is another submit/reset button,\n // Let that button take preference and ignore click.\n\n for (const target of event.composedPath()) {\n if (target === input || target === this) break;\n if ((target instanceof HTMLInputElement || target instanceof HTMLButtonElement)\n && (target.type === 'submit' || target.type === 'reset')) {\n // Inner Native Button\n return;\n }\n if ((target instanceof HTMLElement && target.form instanceof HTMLFormElement\n && (target.type === 'submit' || target.type === 'reset'))) {\n // Inner FACE Button\n return;\n }\n if ((target instanceof HTMLAnchorElement && target.href)) {\n // Inner Anchor Button\n return;\n }\n }\n\n const form = this.elementInternals?.form;\n if (!form) return;\n\n if (type === 'submit') {\n const duplicatedButton = /** @type {HTMLInputElement} */ (input.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 } else if (type === 'reset') {\n form.reset();\n }\n }\n break;\n default:\n }\n },\n })\n .rootEvents({\n click(event) {\n rootClickEvents.add(event);\n const { control } = this.refs;\n if (event.target === control) return;\n // Label-like click\n if (!event.bubbles) return;\n const { disabledState, type } = this;\n if (disabledState) return;\n if (type === 'checkbox' || type === 'radio') {\n event.stopPropagation();\n control.click();\n } else {\n this._handleInputClick(event);\n }\n },\n })\n .events({\n click(event) {\n // If click event came from own shadowRoot, let it through\n if (rootClickEvents.has(event)) return;\n // If click event is a redispatch, let it through\n if (redispatchedClickEvents.has(event)) return;\n if (event.target === this) {\n // Support custom host.dispatchEvent(new Event('click'))\n event.stopImmediatePropagation();\n this.refs.control.click();\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 click: '_handleInputClick',\n input(event) {\n if (this.disabledState) {\n event.preventDefault();\n event.stopImmediatePropagation();\n return;\n }\n const input = /** @type {HTMLInputElement} */ (event.currentTarget);\n this.checked = input.checked;\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.checked = input.checked;\n },\n },\n })\n .methods({\n /** @type {HTMLInputElement['setRangeText']} */\n // @ts-ignore Can't cast?\n setRangeText(...args) { this._input.setRangeText(...args); },\n\n /** @type {HTMLInputElement['setSelectionRange']} */\n setSelectionRange(...args) { this._input.setSelectionRange(...args); },\n\n /** @type {HTMLInputElement['showPicker']} */\n showPicker(...args) { this._input.showPicker(...args); },\n\n /** @type {HTMLInputElement['stepDown']} */\n stepDown(...args) {\n this._input.stepDown(...args);\n this._value = this._input.value;\n },\n\n /** @type {HTMLInputElement['stepUp']} */\n stepUp(...args) {\n this._input.stepUp(...args);\n this._value = this._input.value;\n },\n\n /** @type {HTMLInputElement['select']} */\n select(...args) {\n this._input.select(...args);\n },\n })\n .define({\n files: {\n get() { return this._input.files; },\n set(value) {\n if (value == null && this.type === 'file') {\n // TODO: Clean up single-loop recursion\n this._input.value = ''; // Clears files\n this.value = '';\n } else {\n this._input.files = value;\n }\n },\n },\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 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 .css`\n #control::-webkit-file-upload-button {\n display: none;\n }\n `;\n}\n", "import CustomElement from '../core/CustomElement.js';\nimport { ELEMENT_ANIMATION_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_ANIMATION_TYPE,\n get({ _positionX, _positionY, _radius }) {\n // Skip if not measured\n if (_radius == null) return null;\n return {\n styles: {\n minHeight: `${_radius}px`,\n minWidth: `${_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 { offsetParent } = this;\n if (!offsetParent) return;\n const { clientWidth: parentWidth, clientHeight: parentHeight } = 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.hypot(width, 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.rippleState = '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 // Ripple from pointerdown\n this.addRipple(x, y, true);\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.pressedState || this._keyReleased) return;\n const lastRipple = this._lastRipple;\n if (lastRipple) {\n lastRipple.holdRipple = false;\n }\n // Ripple from programmatic click\n this.addRipple();\n },\n })\n .on({\n pressedStateChanged(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 // Ripple from pressed 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 border-radius: inherit;\n }\n `;\n}\n", "import './Icon.js';\nimport CustomElement from '../core/CustomElement.js';\nimport DensityMixin from '../mixins/DensityMixin.js';\nimport ElevationMixin from '../mixins/ElevationMixin.js';\nimport HyperlinkMixin from '../mixins/HyperlinkMixin.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 ThemableMixin from '../mixins/ThemableMixin.js';\n\n/* https://m3.material.io/components/buttons/specs */\n\nexport default CustomElement\n .extend()\n .mixin(ThemableMixin)\n .mixin(DensityMixin)\n .mixin(StateMixin)\n .mixin(ElevationMixin)\n .mixin(ShapeMixin)\n .mixin(RippleMixin)\n .mixin(InputMixin)\n .mixin(HyperlinkMixin)\n .define({\n stateTargetElement() { return this.refs.control; },\n })\n .set({\n stateLayer: true,\n _allowedTypes: ['button', 'submit', 'reset', 'file'],\n })\n .observe({\n type: {\n empty: 'button',\n /**\n * @param {string} value\n * @param {*} internalSet\n */\n set(value, internalSet) {\n const enumeratedValue = value?.toLowerCase() ?? 'button';\n internalSet(\n this._allowedTypes.includes(enumeratedValue)\n ? enumeratedValue\n : 'button',\n );\n },\n },\n elevated: 'boolean',\n filled: 'string',\n outlined: 'boolean',\n icon: 'string',\n iconInk: 'string',\n src: 'string',\n svg: 'string',\n viewBox: 'string',\n svgPath: 'string',\n })\n .expressions({\n hasIcon({ icon, svg, src, svgPath } = this) {\n return icon ?? svg ?? src ?? svgPath;\n },\n iconVariation({ outlined } = this) {\n return outlined ? null : 'filled';\n },\n })\n .methods({\n /** @type {HTMLElement['focus']} */\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}\n outlined={outlined} variation={iconVariation} aria-hidden=true svg={svg} src={src}\n svg-path={svgPath} view-box={viewBox} icon={icon}></mdw-icon>\n <slot id=slot disabled={disabledState} aria-hidden=true>{_defaultValue}</slot>\n `\n .recompose(({ refs: { anchor, control } }) => {\n control.setAttribute('mdw-if', '{!href}');\n control.setAttribute('role', 'button');\n anchor.setAttribute('mdw-if', '{href}');\n anchor.setAttribute('aria-label', '{_computedAriaLabel}');\n anchor.setAttribute('aria-labelledby', '{_computedAriaLabelledby}');\n })\n .css`\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 transition: box-shadow 200ms;\n will-change: box-shadow;\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 box-shadow: var(--mdw-elevation__box-shadow__1);\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 box-shadow: var(--mdw-elevation__box-shadow__0);\n }\n\n :host(:where([elevated]:hover:not(:active))) {\n box-shadow: var(--mdw-elevation__box-shadow__2);\n }\n\n :host(:where([filled]:hover:not(:active))) {\n box-shadow: var(--mdw-elevation__box-shadow__1);\n }\n\n :host(:where([elevated]:disabled)) {\n box-shadow: var(--mdw-elevation__box-shadow__0);\n }\n\n :host(:where([filled]:disabled)) {\n box-shadow: var(--mdw-elevation__box-shadow__0);\n }\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 :host(: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 :host([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 }\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: inherit;\n }\n }\n `\n .autoRegister('mdw-button');\n", "import { EVENT_HANDLER_TYPE } from '../core/customTypes.js';\nimport AriaReflectorMixin from '../mixins/AriaReflectorMixin.js';\nimport DelegatesFocusMixin from '../mixins/DelegatesFocusMixin.js';\nimport ElevationMixin from '../mixins/ElevationMixin.js';\nimport FormAssociatedMixin from '../mixins/FormAssociatedMixin.js';\nimport HyperlinkMixin from '../mixins/HyperlinkMixin.js';\nimport ShapeMixin from '../mixins/ShapeMixin.js';\nimport StateMixin from '../mixins/StateMixin.js';\n\nimport Box from './Box.js';\n\n/* https://m3.material.io/components/cards/specs */\n\nconst SUPPORTS_INERT = 'inert' in HTMLElement.prototype;\n\nexport default Box\n .extend()\n .mixin(StateMixin)\n .mixin(ElevationMixin)\n .mixin(ShapeMixin)\n .mixin(FormAssociatedMixin) // Tap into FormAssociated for disabledState\n .mixin(AriaReflectorMixin)\n .mixin(DelegatesFocusMixin)\n .mixin(HyperlinkMixin)\n .set({\n _ariaRole: 'figure',\n })\n .observe({\n elevated: 'boolean',\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, disabled }) => disabledState && (!disabled || !SUPPORTS_INERT),\n showButton: ({ actionable, href }) => Boolean(actionable || href),\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={showButton} aria-label={actionLabel} href={href}\n target={target}\n download={download}\n ping={ping}\n rel={rel}\n hreflang={hreflang}\n referrerpolicy={referrerPolicy} id=action disabled={disabledState}></mdw-button>\n <div mdw-if={showBlocker} id=inert-blocker></div>\n `\n .recompose(({ refs: { anchor, inertBlocker, slot } }) => {\n anchor.remove();\n slot.setAttribute('disabled', '{disabledState}');\n inertBlocker.before(slot);\n })\n .css`\n :host {\n --mdw-shape__size: var(--mdw-shape__medium);\n\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 font: var(--mdw-type__font);\n letter-spacing: var(--mdw-type__letter-spacing);\n\n transition: filter 200ms;\n will-change: filter;\n }\n\n :host(:where([elevated],[filled],[outlined])) {\n background-color: rgb(var(--mdw-bg));\n }\n\n :host(:where([elevated])) {\n --mdw-bg: var(--mdw-color__surface-container-low);\n --mdw-ink: var(--mdw-color__on-surface);\n filter: var(--mdw-elevation__drop-shadow__1);\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([filled][actionable])) {\n filter: var(--mdw-elevation__drop-shadow__0);\n }\n\n :host(:where([elevated][actionable]:hover:not(:active))) {\n filter: var(--mdw-elevation__drop-shadow__2);\n }\n\n :host(:where([filled][actionable]:hover:not(:active))) {\n filter: var(--mdw-elevation__drop-shadow__1);\n }\n\n :host([disabled]) {\n cursor: not-allowed;\n\n filter: grayscale();\n opacity: 0.38;\n\n color: rgb(var(--mdw-color__on-surface));\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 :host([disabled][elevated]) {\n background-color: rgba(var(--mdw-color__surface-container-highest));\n }\n\n :host([disabled][filled]) {\n background-color: rgba(var(--mdw-color__surface));\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 .recompose(({ refs: { slot, outline } }) => {\n outline.removeAttribute('pressed');\n outline.removeAttribute('focused');\n\n slot.setAttribute('inert', '{disabledState}');\n slot.setAttribute('disabled', '{disabledState}');\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 #icon {\n position: absolute;\n inset: 0;\n\n opacity: 0;\n\n background-color: rgb(var(--mdw-bg));\n border-radius: inherit;\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 border-width: 2px;\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 .html`\n <mdw-icon id=icon selected={selected} errored={errored} disabled={disabled} icon={icon}></mdw-icon>\n `\n .recompose(({ refs: { outline } }) => {\n outline.removeAttribute('mdw-if');\n outline.setAttribute('selected', '{selected}');\n outline.setAttribute('errored', '{errored}');\n outline.setAttribute('disabled', '{disabled}');\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: inherit;\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 })\n .expressions({\n _determinateIcon({ indeterminate, indeterminateIcon, icon }) {\n return (indeterminate ? indeterminateIcon : icon);\n },\n _iconSelectedState({ checked, indeterminate }) {\n return checked || indeterminate;\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={_iconSelectedState}>\n </mdw-checkbox-icon>\n </div>\n <slot id=slot></slot>\n `\n .recompose(({ refs: { checkbox, state, rippleContainer } }) => {\n checkbox.append(state, rippleContainer);\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 .expressions({\n iconVariation({ elevated }) {\n return elevated ? 'filled' : null;\n },\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 .recompose(({ inline, refs: { slot, outline, icon } }) => {\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 .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} DOMRectLike\n * @prop {number} left\n * @prop {number} right\n * @prop {number} top\n * @prop {number} bottom\n * @prop {number} width\n * @prop {number} height\n */\n\n/**\n * @typedef {Object} CanAnchorPopUpOptions\n * @prop {Element|DOMRectLike} [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|{width:number, height:number}} [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 const pageWidth = document.documentElement.clientWidth;\n const pageHeight = document.documentElement.clientHeight;\n if (pageX == null || pageY == null) {\n const { clientX, clientY, anchor } = options;\n let rect;\n if (anchor) {\n rect = anchor instanceof Element ? anchor.getBoundingClientRect() : anchor;\n } else {\n rect = {\n left: 0,\n width: pageWidth,\n right: pageWidth,\n top: 0,\n bottom: pageHeight,\n height: pageHeight,\n };\n }\n\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.height;\n }\n }\n\n let top;\n let right;\n let bottom;\n let left;\n const margin = options.margin ?? 0;\n\n let pageTop = margin;\n let pageBottom = -margin;\n let pageLeft = margin;\n let pageRight = -margin;\n\n if (window.visualViewport) {\n pageTop += window.visualViewport.offsetTop;\n pageBottom += window.visualViewport.offsetTop + window.visualViewport.height;\n pageLeft += window.visualViewport.offsetLeft;\n pageRight += window.visualViewport.offsetLeft + window.visualViewport.width;\n } else {\n pageBottom += pageHeight;\n pageRight += pageWidth;\n }\n\n const offsetX = options.offsetX ?? 0;\n const offsetY = options.offsetY ?? 0;\n pageX += offsetX;\n pageY += offsetY;\n\n let cssTop = 'auto';\n let cssRight = 'auto';\n let cssBottom = 'auto';\n let cssLeft = 'auto';\n let maxHeight = null;\n let maxWidth = null;\n\n switch (directionY) {\n case 'up':\n bottom = Math.min(pageY, pageBottom);\n top = Math.max(bottom - height, pageTop);\n cssBottom = `${pageHeight - bottom}px`;\n if (top === pageTop) {\n maxHeight = `${bottom - pageTop}px`;\n }\n break;\n case 'center':\n top = Math.max(pageY - height / 2, pageTop);\n bottom = Math.min(pageY + height / 2, pageBottom);\n cssTop = `${top}px`;\n if (bottom === pageBottom) {\n maxHeight = `${pageBottom - pageTop}px`;\n }\n break;\n default:\n top = Math.max(pageY, pageTop);\n bottom = Math.min(top + height, pageBottom);\n cssTop = `${top}px`;\n if (bottom === pageBottom) {\n maxHeight = `${pageBottom - top}px`;\n }\n }\n\n switch (directionX) {\n case 'left':\n right = Math.min(pageX, pageRight);\n left = Math.max(right - width, pageLeft);\n cssRight = `${pageWidth - right}px`;\n if (left === pageLeft) {\n maxWidth = `${right - pageLeft}px`;\n }\n break;\n case 'center':\n left = Math.max(pageX - width / 2, pageLeft);\n right = Math.min(pageX + width / 2, pageRight);\n cssLeft = `${left}px`;\n if (right === pageRight) {\n maxWidth = `${pageRight - pageLeft}px`;\n }\n break;\n default:\n left = Math.max(pageX, pageLeft);\n right = Math.min(left + width, pageRight);\n cssLeft = `${left}px`;\n if (right === pageRight) {\n maxWidth = `${pageRight - left}px`;\n }\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 const transformOriginX = directionX === 'center' ? 'center' : (directionX === 'left' ? 'right' : 'left');\n const transformOriginY = directionY === 'center' ? 'center' : (directionY === 'up' ? 'bottom' : 'top');\n return {\n ...options,\n top,\n right,\n bottom,\n left,\n visibility,\n styles: {\n top: cssTop,\n bottom: cssBottom,\n left: cssLeft,\n right: cssRight,\n maxWidth,\n maxHeight,\n transformOrigin: `${transformOriginY} ${transformOriginX}`,\n },\n };\n}\n", "import { attemptFocus, isRtl } from '../core/dom.js';\nimport { canAnchorPopup } from '../utils/popup.js';\n\nimport DelegatesFocusMixin from './DelegatesFocusMixin.js';\nimport '../components/Scrim.js';\nimport ResizeObserverMixin from './ResizeObserverMixin.js';\n\nconst supportsHTMLDialogElement = typeof HTMLDialogElement !== 'undefined';\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 {any} [pendingResizeOperation]\n * @prop {window['history']['scrollRestoration']} [scrollRestoration]\n */\n\n/** @type {PopupStack[]} */\nconst OPEN_POPUPS = [];\n\n/**\n * @return {void}\n */\nfunction onWindowResize() {\n // Fire in popup order\n for (const { element } of OPEN_POPUPS) {\n element.updatePopupPosition();\n }\n}\n\n/**\n * Prevent focus being given to elements via mouse nav back\n * @param {MouseEvent} event\n */\nfunction onNavMouseDown(event) {\n if (event.button === 3) {\n event.preventDefault();\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 .mixin(DelegatesFocusMixin)\n .mixin(ResizeObserverMixin)\n .observe({\n open: 'boolean',\n modal: 'boolean',\n native: '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 popupMargin: 'float',\n })\n .set({\n useHistory: true,\n returnValue: '',\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 = this._anchor) {\n const flow = this._currentFlow ?? this.flow;\n Object.assign(this.style, {\n top: '0',\n left: '0',\n right: 'auto',\n bottom: 'auto',\n maxWidth: null,\n maxHeight: null,\n });\n\n const layoutElement = this.native ? this._dialog : this;\n Object.assign(layoutElement.style, { width: 'auto', height: 'auto' });\n\n const width = (anchor && this.matchSourceWidth)\n ? anchor.clientWidth\n : 56 * Math.ceil(layoutElement.clientWidth / 56);\n\n layoutElement.style.setProperty('width', `${width}px`);\n\n const height = layoutElement.clientHeight;\n Object.assign(layoutElement.style, { height: null });\n\n /** @type {import('../utils/popup.js').CanAnchorPopUpOptions} */\n const anchorOptions = {\n anchor,\n width,\n height,\n margin: this.popupMargin ?? (window.innerWidth < 648 ? 16 : 24),\n };\n\n const isPageRTL = isRtl(this);\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 let { maxWidth, maxHeight } = anchorResult.styles;\n if (maxWidth || maxHeight) {\n const styles = window.getComputedStyle(this);\n if (styles.maxWidth) {\n maxWidth = `min(${maxWidth}, ${styles.maxWidth})`;\n }\n if (styles.maxHeight) {\n maxHeight = `min(${maxHeight}, ${styles.maxHeight})`;\n }\n }\n Object.assign(this.style, { ...anchorResult.styles, maxWidth, maxHeight });\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 this._source = source;\n this._anchor = source;\n\n const { scrim } = this.refs;\n if (this._useScrim) {\n if (this.native) {\n document.body.append(scrim);\n } else {\n this.before(scrim);\n }\n scrim.hidden = false;\n } else {\n scrim.remove();\n }\n\n const previousFocus = source instanceof HTMLElement ? source : document.activeElement;\n\n if (supportsHTMLDialogElement && focus // Calling show will force focus which is not intended for non-modals\n && !this._dialog.open) {\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 let newState;\n let scrollRestoration;\n let previousState;\n if (this.useHistory) {\n newState = { hash: Math.random().toString(36).slice(2, 18) };\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 scrollRestoration = window.history.scrollRestoration;\n\n window.history.scrollRestoration = 'manual';\n window.history.pushState(newState, document.title);\n window.addEventListener('popstate', onPopState);\n window.addEventListener('beforeunload', onBeforeUnload);\n }\n\n window.addEventListener('mousedown', onNavMouseDown, { capture: true });\n\n window.addEventListener('resize', onWindowResize);\n window.addEventListener('scroll', onWindowResize);\n if (window.visualViewport) {\n window.visualViewport.addEventListener('resize', onWindowResize);\n window.visualViewport.addEventListener('scroll', onWindowResize);\n }\n\n OPEN_POPUPS.push({\n element: this,\n previousFocus,\n state: newState,\n previousState,\n scrollRestoration,\n });\n\n // Overrideable\n if (focus) {\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.native = 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._source = null;\n this._closing = true;\n this.modal = false;\n\n // SCRIM\n this.refs.scrim.hidden = true;\n\n if (this.native) {\n this.native = 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 (this.useHistory) {\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 }\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 window.removeEventListener('mousedown', onNavMouseDown, { capture: true });\n // console.debug('All menus closed');\n }\n this._closing = false;\n return true;\n },\n })\n\n .overrides({\n onResizeObserved(entry) {\n if (!this.open || this._closing) return;\n this.updatePopupPosition();\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([popover]) {\n margin: 0;\n border: 0;\n padding: 0;\n }\n\n :host(::backdrop) {\n display: none;\n }\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\n --mdw-shape__size: 28px;\n\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 inset-block-start: 0;\n inset-inline-start: 0;\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 outline: none; /* Older Chromium Builds */\n\n pointer-events: none;\n\n opacity: 0;\n transform: scale(0);\n\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: 200ms, 0s;\n transition-duration: 0s, 200ms, 200ms;\n transition-property: visibility, opacity, transform;\n transition-timing-function: ease-out;\n\n will-change: visibility, opacity, transform;\n\n }\n\n :host([open]) {\n pointer-events: inherit;\n\n opacity: 1;\n\n transform: none;\n visibility: inherit;\n\n transition-delay: 0s;\n transition-timing-function: ease-in;\n }\n\n :host([native][open]) {\n opacity: 0;\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 block-size: inherit;\n flex: inherit;\n margin:0;\n border: none;\n padding: inherit;\n padding: 0;\n\n pointer-events: inherit;\n\n filter: inherit;\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([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([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: inherit;\n\n filter: inherit;\n transform: inherit;\n visibility: inherit;\n\n background-color: inherit;\n border-radius: 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 block-size: 100%;\n max-block-size: none;\n inline-size: 100%;\n max-inline-size: none;\n\n flex: 1;\n }\n\n \n\n #dialog[scrollable][open]:modal {\n overflow:auto;\n\n block-size:100%;\n min-block-size: none;\n max-block-size: inherit;\n inline-size:100%;\n min-inline-size: none;\n max-inline-size: 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.native) 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 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 {HTMLElement} */\n let node;\n while ((node = /** @type {HTMLElement} */ (treeWalker.nextNode()))) {\n if (node.tagName === 'SLOT') {\n for (const el of (/** @type {HTMLSlotElement} */ (node)).assignedElements()) {\n if ((/** @type {HTMLElement} */ (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 = /** @type {Element} */ (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(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 .define({\n /** Dialogs are not anchored to source */\n _anchor: {\n get() { return null; },\n set() { /* noop */ },\n },\n })\n .set({\n flow: 'center',\n _useScrim: true,\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 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=dialog-inner>\n <mdw-icon mdw-if={icon} id=icon class=content ink=secondary aria-hidden=true icon={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=content name=content></slot>\n <mdw-divider id=divider-bottom size={dividers}></mdw-divider>\n <slot id=actions name=actions>\n <form method=dialog role=none>\n <mdw-button id=cancel type=submit value=cancel autofocus={cancelAutoFocus} formnovalidate>{cancel}</mdw-button>\n <mdw-button id=confirm type=submit value=confirm autofocus={confirmAutoFocus}>{confirm}</mdw-button>\n </form>\n </slot>\n </div>\n `\n .recompose(({ refs: { dialog, dialogInner, content, slot } }) => {\n dialog.setAttribute('aria-labelledby', 'headline');\n dialog.setAttribute('aria-describedby', 'slot');\n\n // Use content slot as content\n // Use default slot as padded content\n slot.classList.add('content');\n content.append(slot);\n\n dialog.prepend(...dialogInner.childNodes);\n dialogInner.remove();\n })\n .css`\n /* https://m3.material.io/components/dialogs/specs */\n\n :host {\n --mdw-bg: var(--mdw-color__surface-container-high);\n --mdw-ink: var(--mdw-color__on-surface);\n position: fixed;\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 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 padding-block-start: 8px;\n\n transform: translateY(-40px) scaleY(0);\n transform-origin: top center !important;\n\n background-color: rgb(var(--mdw-bg));\n color: rgb(var(--mdw-ink));\n\n }\n\n #dialog:modal {\n overflow: visible;\n }\n\n :host([icon]) {\n align-items: center;\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 #actions {\n display: flex;\n align-self: flex-end;\n\n margin-block: 24px;\n padding-inline: 24px;\n }\n `\n .events({\n keydown(event) {\n if (event.key === 'Tab') {\n if (!this.native) {\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 submit(event) {\n if (event.defaultPrevented) return;\n const form = event.target;\n if (form instanceof HTMLFormElement === false) return;\n if (form.method !== 'dialog') return;\n const returnValue = event.submitter?.value;\n this.close(returnValue);\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.native) 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 AriaReflectorMixin from '../mixins/AriaReflectorMixin.js';\nimport TypographyMixin from '../mixins/TypographyMixin.js';\n\nimport Box from './Box.js';\n\nexport default Box\n .extend()\n .mixin(AriaReflectorMixin)\n .mixin(TypographyMixin)\n .set({\n _ariaRole: 'heading',\n _baseAriaLevel: 1,\n })\n .observe({\n ariaLevel: 'string',\n size: {\n type: 'string',\n /** @type {'large'|'medium'|'small'} */\n empty: 'large',\n },\n })\n .observe({\n _computedAriaLevel({ ariaLevel, size, _baseAriaLevel }) {\n if (ariaLevel) return ariaLevel;\n if (size === 'medium') return `${_baseAriaLevel + 1}`;\n if (size === 'small') return `${_baseAriaLevel + 2}`;\n return `${_baseAriaLevel}`;\n },\n })\n\n .on({\n _computedAriaLevelChanged(oldValue, newValue) {\n this.updateAriaProperty('ariaLevel', newValue);\n },\n constructed() {\n this.updateAriaProperty('ariaLevel', this._computedAriaLevel);\n },\n })\n .css`\n :host {\n font: var(--mdw-typescale__display-large__font);\n letter-spacing: var(--mdw-typescale__display-large__letter-spacing);\n }\n \n :host([size=\"medium\"]) {\n font: var(--mdw-typescale__display-medium__font);\n letter-spacing: var(--mdw-typescale__display-medium__letter-spacing);\n }\n \n :host([size=\"small\"]) {\n font: var(--mdw-typescale__display-small__font);\n letter-spacing: var(--mdw-typescale__display-small__letter-spacing);\n } \n `\n .autoRegister('mdw-display');\n", "import CustomElement from '../core/CustomElement.js';\nimport AriaReflectorMixin from '../mixins/AriaReflectorMixin.js';\nimport ShapeMixin from '../mixins/ShapeMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\n/* https://m3.material.io/components/tooltips/specs */\n\nexport default CustomElement\n .extend()\n .mixin(ThemableMixin)\n .mixin(ShapeMixin)\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 })\n .html`\n <div id=hover-target></div>\n <slot id=slot></slot>\n `\n .css`\n :host {\n --mdw-shape__size: var(--mdw-shape__extra-small);\n --mdw-ink: var(--mdw-color__inverse-on-surface);\n --mdw-bg: var(--mdw-color__inverse-surface);\n display: block;\n\n box-sizing: border-box;\n\n /* Ensure 24px min-height while keeping display:block */\n padding-block: calc(12px - var(--mdw-typescale__body-small__line-height) / 2);\n padding-inline: 8px;\n\n pointer-events: none;\n\n opacity: 0;\n transform: scale(0);\n z-index: 28;\n\n background-color: rgb(var(--mdw-bg));\n color: rgb(var(--mdw-ink));\n\n font: var(--mdw-typescale__body-small__font);\n letter-spacing: var(--mdw-typescale__body-small__letter-spacing);\n\n transition: transform 200ms, opacity 200ms;\n }\n\n @supports(width: 1lh) {\n :host {\n padding-block: calc(12px - 0.5lh);\n }\n }\n\n :host([open]) {\n pointer-events: auto;\n\n opacity: 1;\n transform: scale(1);\n }\n\n #hover-target {\n position: absolute;\n inset-block-start: 50%;\n inset-inline-start: 50%;\n\n box-sizing: content-box;\n block-size: 100%;\n inline-size: 100%;\n padding: 8px;\n\n transform: translateX(-50%) translateY(-50%);\n z-index: -1;\n \n }\n `\n .autoRegister('mdw-tooltip');\n", "import '../components/Tooltip.js';\nimport { FIREFOX_VERSION } from '../core/dom.js';\nimport { canAnchorPopup } from '../utils/popup.js';\n\n/** @typedef {import('../components/Tooltip.js').default} Tooltip */\n\n/**\n * @param {ReturnType<import('./StateMixin.js').default>} Base\n */\nexport default function TooltipTriggerMixin(Base) {\n return Base\n .set({\n TOOLTIP_MOUSE_IDLE_MS: 500,\n TOOLTIP_TOUCH_IDLE_MS: 1500,\n /** @type {any} */\n _idleDebounce: null,\n /** @type {HTMLElement[]} */\n _watchedParents: null,\n /** @type {ResizeObserver} */\n _resizeObserver: null,\n /** @type {IntersectionObserver} */\n _intersectObserver: null,\n _parentScrollListener: null,\n tooltipSlotId: 'slot',\n })\n .observe({\n tooltip: 'string',\n autoTooltip: 'boolean',\n })\n .html`<mdw-tooltip id=tooltip></mdw-tooltip>`\n .css`\n #tooltip {\n display:none;\n }\n `\n .methods({\n cancelShowTooltip() {\n // console.log('cancel tooltiptimer');\n clearTimeout(this._idleDebounce);\n },\n /** @param {'mouse'|'touch'|'keyboard'} type */\n scheduleHideTooltip(type) {\n this.cancelShowTooltip();\n if (!this.refs.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.refs.tooltip.open) return;\n let timeout = 0;\n switch (type) {\n case 'mouse':\n timeout = this.TOOLTIP_MOUSE_IDLE_MS;\n break;\n case 'touch':\n timeout = this.TOOLTIP_TOUCH_IDLE_MS;\n break;\n default:\n }\n\n clearTimeout(this._idleDebounce);\n if (timeout) {\n this._idleDebounce = setTimeout(this.showTooltip.bind(this), timeout);\n } else {\n this.showTooltip();\n }\n },\n\n showTooltip() {\n const tooltip = /** @type {InstanceType<Tooltip>} */ (this.refs.tooltip);\n if (tooltip.open) return;\n document.body.append(this.refs.tooltip);\n this.recloneTooltip();\n this.updateTooltipPosition();\n this._resizeObserver.observe(this, { box: 'border-box' });\n this._resizeObserver.observe(tooltip, { box: 'border-box' });\n this._intersectObserver.observe(this);\n this._intersectObserver.observe(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._parentScrollListener);\n }\n window.addEventListener('scroll', this._parentScrollListener);\n\n // console.log('offsetparent', this.offsetParent);\n\n tooltip.open = true;\n },\n\n hideTooltip(cancelSchedule = false) {\n if (cancelSchedule) {\n this.cancelShowTooltip();\n }\n this._resizeObserver.disconnect();\n this._intersectObserver.disconnect();\n let parent;\n while ((parent = this._watchedParents.pop())) {\n parent.removeEventListener('scroll', this._parentScrollListener);\n }\n window.removeEventListener('scroll', this._parentScrollListener);\n const tooltip = /** @type {InstanceType<Tooltip>} */ (this.refs.tooltip);\n tooltip.open = false;\n // TODO: Self-remove on close (hide animation)\n tooltip.remove();\n },\n /**\n * TODO: Throttle multiple calls\n * @param {DOMRect} [domRect]\n * @return {void}\n */\n updateTooltipPosition(domRect) {\n const offset = 8;\n const tooltip = /** @type {InstanceType<Tooltip>} */ (this.refs.tooltip);\n // const margin = 8;\n /** @type {import('../utils/popup.js').CanAnchorPopUpOptions} */\n\n Object.assign(tooltip.style, {\n top: '0',\n left: '0',\n right: 'auto',\n bottom: 'auto',\n position: 'fixed',\n maxWidth: null,\n maxHeight: null,\n });\n\n const anchorOptions = {\n anchor: domRect ?? this.getBoundingClientRect(),\n width: tooltip.clientWidth,\n height: 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 Object.assign(tooltip.style, {\n position: 'fixed',\n ...anchorResult.styles,\n });\n },\n recloneTooltip() {\n let args;\n const tooltip = this.tooltip;\n if (tooltip) {\n args = [tooltip];\n } else {\n args = /** @type {HTMLSlotElement} */ (this.refs[this.tooltipSlotId])\n .assignedNodes()\n .map((child) => child.cloneNode(true));\n }\n\n this.refs.tooltip.replaceChildren(...args);\n },\n closeIfNotHovered() {\n // eslint-disable-next-line unicorn/consistent-function-scoping\n const check = () => {\n if (this.hoveredState) return;\n if (this.refs.tooltip.matches(':hover')) return;\n this.hideTooltip(true);\n };\n if (FIREFOX_VERSION) {\n // Firefox stalls one tick\n requestAnimationFrame(check);\n } else {\n check();\n }\n },\n })\n .childEvents({\n slot: {\n slotchange: 'recloneTooltip',\n },\n tooltip: {\n pointerleave: 'closeIfNotHovered',\n },\n })\n .events({\n '~pointermove'(event) {\n if (event.pointerType === 'touch') return;\n if (this.autoTooltip && !this.disabledState) {\n this.scheduleShowTooltip('mouse');\n }\n },\n '~keydown'({ ctrlKey }) {\n if (ctrlKey) {\n this.hideTooltip(true);\n }\n },\n '~click'() {\n this.hideTooltip(true);\n },\n\n })\n .on({\n constructed() {\n this._watchedParents = [];\n this._parentScrollListener = this.updateTooltipPosition.bind(this, null);\n this._resizeObserver = new ResizeObserver(() => {\n const tooltip = /** @type {InstanceType<Tooltip>} */ (this.refs.tooltip);\n if (tooltip.open) {\n this.updateTooltipPosition();\n }\n });\n const threshold = [0, 0.49, 0.5, 0.51, 1];\n this._intersectObserver = new IntersectionObserver((entries) => {\n const tooltip = /** @type {InstanceType<Tooltip>} */ (this.refs.tooltip);\n // console.log('IO', entries);\n if (!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 === 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 _focusedChanged(previous, current) {\n if (current) {\n if (!this._pointerPressed && !this._focusedSynthetic && this.autoTooltip) {\n this.showTooltip();\n }\n } else {\n this.closeIfNotHovered();\n }\n },\n _hoveredChanged(previous, current) {\n if (current) {\n if (this.autoTooltip && !this.disabledState) {\n this.scheduleShowTooltip('mouse');\n }\n } else {\n this.closeIfNotHovered();\n }\n },\n _pointerPressedChanged(previous, current) {\n if (this._lastInteraction !== 'touch') return;\n if (current) {\n if (this.autoTooltip && !this.disabledState) {\n this.scheduleShowTooltip('touch');\n }\n } else {\n this.scheduleHideTooltip('touch');\n }\n },\n disconnected() {\n this.hideTooltip(true);\n },\n tooltipChanged() {\n this.recloneTooltip();\n },\n });\n}\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 lowered: 'boolean',\n extended: 'boolean',\n fabSize: {\n /** @type {null|'small'|'large'} */\n value: null,\n },\n filled: { empty: 'tonal' },\n elevated: { type: 'boolean', empty: true },\n })\n .observe({\n autoTooltip({ extended }) {\n return !extended;\n },\n })\n .recompose(({ refs: { icon, slot } }) => {\n icon.setAttribute('fab-size', '{fabSize}');\n slot.setAttribute('extended', '{extended}');\n slot.setAttribute('icon', '{icon}');\n })\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 gap: 0;\n grid-area: fab;\n\n min-inline-size: 24px;\n padding: calc(16px + (var(--mdw-density) * 2px));\n\n background-color: rgb(var(--mdw-bg));\n\n box-shadow: var(--mdw-elevation__box-shadow__3);\n color: rgb(var(--mdw-ink));\n\n transition-duration: 200ms;\n\n transition-property: box-shadow, gap, min-inline-size;\n }\n\n :host(:where([extended])) {\n gap: 8px;\n\n min-inline-size: 48px;\n }\n\n #slot {\n display: inline-flex;\n align-items: center;\n\n min-block-size: 24px;\n\n visibility: hidden;\n\n color: transparent;\n\n font-size: 0;\n \n\n transition: color 200ms, font-size 200ms, visibility 200ms;\n }\n\n #slot[extended] {\n visibility: inherit;\n\n color: inherit;\n\n font-size: inherit;\n\n transition: color 200ms, font-size 200ms, visibility 0ms;\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 #icon {\n font-size: 24px;\n }\n\n #icon[fab-size=\"large\"] {\n font-size: 36px;\n }\n\n :host(:where([lowered])) {\n --mdw-bg: var(--mdw-color__surface-container-low);\n box-shadow: var(--mdw-elevation__box-shadow__1);\n }\n\n :host(:where(:hover:not(:active))) {\n box-shadow: var(--mdw-elevation__box-shadow__4);\n }\n\n :host(:where([lowered]:hover:not(:active))) {\n box-shadow: var(--mdw-elevation__box-shadow__2);\n }\n `\n .autoRegister('mdw-fab');\n", "import CustomElement from '../core/CustomElement.js';\nimport { ELEMENT_STYLE_TYPE } from '../core/customTypes.js';\nimport DelegatesFocusMixin from '../mixins/DelegatesFocusMixin.js';\n\nexport default CustomElement\n .extend()\n .mixin(DelegatesFocusMixin)\n .observe({\n hideBreakpoint: { value: 728 },\n })\n .observe({\n _styles: {\n ...ELEMENT_STYLE_TYPE,\n get({ hideBreakpoint }) {\n if (hideBreakpoint) {\n return `@media(min-width:${hideBreakpoint}px){:host{display:none}}`;\n }\n return undefined;\n },\n },\n })\n .html`<slot id=slot></slot>`\n .css`\n :host {\n display: grid;\n align-items: flex-end;\n grid-template:\n \"fab\" auto\n / auto;\n justify-content: flex-end;\n\n margin: 16px;\n\n pointer-events: none;\n\n }\n\n @media (min-width: 648px) {\n :host {\n margin: 24px;\n }\n }\n\n #slot {\n pointer-events: auto;\n }\n `\n .autoRegister('mdw-fab-container');\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 iconVariation({ checked }) {\n return checked ? 'filled' : null;\n },\n })\n .html`\n <mdw-icon mdw-if={!icon} id=check-icon disabled={disabledState} selected={checked} aria-hidden=true icon=check variation=filled></mdw-icon>\n <mdw-icon mdw-if={computedTrailingIcon} id=trailing-icon aria-hidden=true src={trailingSrc} icon={computedTrailingIcon}></mdw-icon>\n `\n .recompose(({ refs: { icon, control, outline, slot, trailingIcon, checkIcon } }) => {\n icon.setAttribute('mdw-if', '{icon}');\n icon.setAttribute('ink', '{iconInk}');\n\n control.removeAttribute('role');\n\n outline.removeAttribute('mdw-if');\n outline.removeAttribute('ink');\n outline.removeAttribute('color');\n outline.setAttribute('selected', '{checked}');\n outline.setAttribute('elevated', '{elevated}');\n outline.setAttribute('icon', '');\n outline.setAttribute('trailing-icon', '{computedTrailingIcon}');\n\n slot.removeAttribute('ink');\n slot.removeAttribute('color');\n\n slot.before(checkIcon);\n slot.after(trailingIcon);\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 background-color: transparent;\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 #outline {\n z-index: -1;\n\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 #outline[elevated] {\n background-color: rgb(var(--mdw-color__surface-container-low));\n border-color: transparent;\n }\n\n #outline[selected] {\n background-color: rgb(var(--mdw-bg));\n border-color: transparent;\n }\n\n :host([selected]) {\n color: rgb(var(--mdw-ink));\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 :host([disabled]:is([elevated], [filled])) {\n background-color: transparent;\n }\n\n #outline[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 { ELEMENT_STYLE_TYPE } from '../core/customTypes.js';\nimport ResizeObserverMixin from '../mixins/ResizeObserverMixin.js';\n\nimport Box from './Box.js';\n\nexport default Box\n .extend()\n .mixin(ResizeObserverMixin)\n .observe({\n grid: 'boolean',\n columns: 'integer',\n _autoColumns: {\n type: 'integer',\n empty: 4,\n },\n _lastInlineSize: 'float',\n })\n .observe({\n _resizeObserverEnabled: {\n type: 'boolean',\n get({ columns }) {\n // Only use resize observer if using grid, not explicit columns\n // and CSS containers are not supported.\n return !columns;\n },\n },\n _computedColumns({ columns, _autoColumns }) {\n if (columns) return columns;\n if (_autoColumns) return _autoColumns;\n return 4;\n },\n })\n .overrides({\n onResizeObserved(entry) {\n const { contentBoxSize } = entry;\n if (!contentBoxSize.length) return;\n const [{ inlineSize }] = contentBoxSize;\n this._lastInlineSize = inlineSize;\n },\n })\n .on({\n _lastInlineSizeChanged(oldValue, inlineSize) {\n if (inlineSize >= 840) {\n this._autoColumns = 12;\n } else if (inlineSize >= 600) {\n this._autoColumns = 8;\n } else {\n this._autoColumns = 4;\n }\n },\n connected() {\n this._lastInlineSize = this.clientWidth;\n },\n })\n .expressions({\n _isFlex({ block, grid }) {\n return !block && !grid;\n },\n })\n .observe({\n _styles: {\n ...ELEMENT_STYLE_TYPE,\n get({ _computedColumns }) {\n if ((_computedColumns || 4) === 4) return '';\n return { gridTemplateColumns: `repeat(${_computedColumns},1fr)` };\n },\n },\n })\n .recompose(({ refs: { slot } }) => {\n slot.setAttribute('grid', '{grid}');\n slot.setAttribute('flex', '{_isFlex}');\n slot.setAttribute('columns', '{_computedColumns}');\n })\n .css`\n :host {\n display: grid;\n column-gap: 16px; /* Gutters */\n grid-auto-flow: row;\n grid-template-columns: repeat(1fr, 4);\n }\n\n :host([y=\"start\"]) { align-items: flex-start; }\n :host([y=\"end\"]) { align-items: flex-end; }\n :host([y=\"center\"]) { align-items: center; }\n :host([y=\"between\"]) { align-items: space-between; }\n :host([y=\"around\"]) { align-items: space-around; }\n :host([y=\"stretch\"]) { align-items: stretch; }\n :host([x=\"start\"]) { justify-content: flex-start; }\n :host([x=\"end\"]) { justify-content: flex-end; }\n :host([x=\"center\"]) { justify-content: center; }\n :host([x=\"between\"]) { justify-content: space-between; }\n :host([x=\"stretch\"]) { justify-content: stretch; }\n\n #slot {\n --mdw-grid__columns: 4;\n --mdw-grid__columns__4: 1;\n --mdw-grid__columns__8: 0;\n --mdw-grid__columns__12: 0;\n }\n\n #slot[columns=\"4\"] {\n --mdw-grid__columns: 4;\n --mdw-grid__columns__4: 1;\n --mdw-grid__columns__8: 0;\n --mdw-grid__columns__12: 0;\n }\n\n #slot[columns=\"8\"] {\n --mdw-grid__columns: 8;\n --mdw-grid__columns__4: 0;\n --mdw-grid__columns__8: 1;\n --mdw-grid__columns__12: 0;\n }\n\n #slot[columns=\"12\"] {\n --mdw-grid__columns: 12;\n --mdw-grid__columns__4: 0;\n --mdw-grid__columns__8: 0;\n --mdw-grid__columns__12: 1;\n }\n\n ::slotted(*) {\n --mdw-grid__column-count: var(--mdw-grid__columns);\n --mdw-grid__column-count__4: var(--mdw-grid__column-count);\n --mdw-grid__column-count__8: var(--mdw-grid__column-count);\n --mdw-grid__column-count__12: var(--mdw-grid__column-count);\n grid-column: auto / span calc(\n (min(var(--mdw-grid__column-count__4), 4) * var(--mdw-grid__columns__4))\n + (min(var(--mdw-grid__column-count__8), 8) * var(--mdw-grid__columns__8))\n + (min(var(--mdw-grid__column-count__12), 12) * var(--mdw-grid__columns__12))\n );\n }\n ::slotted([col-span=\"1\"]) { --mdw-grid__column-count: 1; }\n ::slotted([col-span=\"2\"]) { --mdw-grid__column-count: 2; }\n ::slotted([col-span=\"3\"]) { --mdw-grid__column-count: 3; }\n ::slotted([col-span=\"4\"]) { --mdw-grid__column-count: 4; }\n ::slotted([col-span=\"5\"]) { --mdw-grid__column-count: 5; }\n ::slotted([col-span=\"6\"]) { --mdw-grid__column-count: 6; }\n ::slotted([col-span=\"7\"]) { --mdw-grid__column-count: 7; }\n ::slotted([col-span=\"8\"]) { --mdw-grid__column-count: 8; }\n ::slotted([col-span=\"9\"]) { --mdw-grid__column-count: 9; }\n ::slotted([col-span=\"10\"]) { --mdw-grid__column-count: 10; }\n ::slotted([col-span=\"11\"]) { --mdw-grid__column-count: 11; }\n ::slotted([col-span=\"12\"]) { --mdw-grid__column-count: 12; }\n \n ::slotted([col-span=\"25%\"]) { --mdw-grid__column-count: calc(var(--mdw-grid__columns) / 4); }\n ::slotted([col-span=\"50%\"]) { --mdw-grid__column-count: calc(var(--mdw-grid__columns) / 2); }\n ::slotted([col-span=\"100%\"]) { --mdw-grid__column-count: calc(var(--mdw-grid__columns)); }\n\n ::slotted([col-span-4=\"1\"]) { --mdw-grid__column-count__4: 1; }\n ::slotted([col-span-4=\"2\"]) { --mdw-grid__column-count__4: 2; }\n ::slotted([col-span-4=\"3\"]) { --mdw-grid__column-count__4: 3; }\n ::slotted([col-span-4=\"4\"]) { --mdw-grid__column-count__4: 4; }\n ::slotted([col-span-8=\"1\"]) { --mdw-grid__column-count__8: 1; }\n ::slotted([col-span-8=\"2\"]) { --mdw-grid__column-count__8: 2; }\n ::slotted([col-span-8=\"3\"]) { --mdw-grid__column-count__8: 3; }\n ::slotted([col-span-8=\"4\"]) { --mdw-grid__column-count__8: 4; }\n ::slotted([col-span-8=\"5\"]) { --mdw-grid__column-count__8: 5; }\n ::slotted([col-span-8=\"6\"]) { --mdw-grid__column-count__8: 6; }\n ::slotted([col-span-8=\"7\"]) { --mdw-grid__column-count__8: 7; }\n ::slotted([col-span-8=\"8\"]) { --mdw-grid__column-count__8: 8; }\n ::slotted([col-span-12=\"1\"]) { --mdw-grid__column-count__12: 1; }\n ::slotted([col-span-12=\"2\"]) { --mdw-grid__column-count__12: 2; }\n ::slotted([col-span-12=\"3\"]) { --mdw-grid__column-count__12: 3; }\n ::slotted([col-span-12=\"4\"]) { --mdw-grid__column-count__12: 4; }\n ::slotted([col-span-12=\"5\"]) { --mdw-grid__column-count__12: 5; }\n ::slotted([col-span-12=\"6\"]) { --mdw-grid__column-count__12: 6; }\n ::slotted([col-span-12=\"7\"]) { --mdw-grid__column-count__12: 7; }\n ::slotted([col-span-12=\"8\"]) { --mdw-grid__column-count__12: 8; }\n ::slotted([col-span-12=\"9\"]) { --mdw-grid__column-count__12: 9; }\n ::slotted([col-span-12=\"10\"]) { --mdw-grid__column-count__12: 10; }\n ::slotted([col-span-12=\"11\"]) { --mdw-grid__column-count__12: 11; }\n ::slotted([col-span-12=\"12\"]) { --mdw-grid__column-count__12: 12; }\n\n `\n .autoRegister('mdw-grid');\n", "import Display from './Display.js';\n\nexport default Display\n .extend()\n .set({\n _baseAriaLevel: 4,\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 { ELEMENT_STYLE_TYPE } from '../core/customTypes.js';\nimport TooltipTriggerMixin from '../mixins/TooltipTriggerMixin.js';\n\nimport Button from './Button.js';\n\n/* https://m3.material.io/components/icon-buttons/specs */\n\nexport default Button\n .extend()\n .mixin(TooltipTriggerMixin)\n .set({\n _allowedTypes: ['button', 'submit', 'reset', 'checkbox', 'file'],\n })\n .observe({\n _ariaPressed: {\n get({ type, checked, indeterminate }) {\n if (type !== 'checkbox') return null;\n return indeterminate ? 'mixed' : (checked ? 'true' : 'false');\n },\n },\n _isToggle({ type }) {\n return type === 'checkbox';\n },\n autoTooltip: { empty: true },\n })\n .expressions({\n iconVariation({ checked, outlined, _isToggle }) {\n if (!checked && (_isToggle || outlined)) return null;\n return 'filled';\n },\n })\n .childEvents({\n control: {\n keydown(event) {\n if (event.key !== 'Enter' && event.key !== ' ') 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 input.click();\n },\n },\n })\n .recompose(({ refs: { icon, control, outline } }) => {\n icon.removeAttribute('mdw-if');\n\n control.setAttribute('aria-pressed', '{_ariaPressed}');\n\n outline.setAttribute('toggle', '{_isToggle}');\n outline.setAttribute('selected', '{checked}');\n })\n .observe({\n _styles: {\n ...ELEMENT_STYLE_TYPE,\n get({ checked, disabled, filled, outlined, _isToggle }) {\n if (!_isToggle) return null;\n if (disabled) return null;\n if (outlined) {\n if (checked) {\n return {\n backgroundColor: 'rgb(var(--mdw-bg))',\n };\n }\n return {\n color: 'rgb(var(--mdw-color__on-surface-variant))',\n };\n }\n if (checked) return null; // All else uses checked state\n if (filled == null) return null;\n return {\n backgroundColor: 'rgb(var(--mdw-color__surface-container-highest))',\n color: filled === 'tonal'\n ? 'rgb(var(--mdw-color__on-surface-variant))'\n : 'rgb(var(--mdw-bg))',\n };\n },\n },\n })\n .css`\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 min-block-size: 1em;\n min-inline-size: 1em;\n\n padding: max(8px, calc(8px + (var(--mdw-density) * 2px)));\n\n font-size: 24px;\n\n transition-property: background-color, box-shadow;\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 }\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 background-color: transparent;\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 #slot { display: none; }\n\n #icon {\n pointer-events: none;\n\n font-size: inherit;\n\n /* stylelint-disable-next-line liberty/use-logical-spec */\n transition-property: color, inline-size, width;\n }\n\n #state {\n z-index:1;\n }\n\n #ripple-container {\n z-index:2;\n }\n\n #outline[focused] {\n opacity: 1;\n\n color: inherit;\n }\n \n #outline[focused][toggle] {\n color: rgb(var(--mdw-color__outline));\n }\n\n #outline[selected]:not([disabled]) {\n opacity: 0;\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 .set({\n stateLayer: true,\n })\n .observe({\n type: { empty: 'text' },\n icon: 'string',\n iconVariation: 'string',\n label: 'string',\n filled: 'boolean',\n outlined: 'boolean',\n inputPrefix: 'string',\n inputSuffix: 'string',\n trailingIcon: 'string',\n trailingIconInk: 'string',\n trailingIconLabel: '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 .expressions({\n _shapeShapeTop({ shapeTop, filled }) {\n return shapeTop || filled;\n },\n computedIconVariation({ iconVariation, outlined }) {\n return iconVariation ?? (outlined ? null : 'filled');\n },\n })\n .html`\n <div id=shape role=none filled={filled} icon={icon} trailing-icon={trailingIcon}\n populated={populatedState} focused={focusedState} label={label} outlined={outlined}\n shape-top={_shapeShapeTop}>\n <mdw-icon mdw-if={icon} id=icon aria-hidden=true disabled={disabledState} icon={icon} variation={computedIconVariation}></mdw-icon>\n <div id=inline role=none filled={filled} icon={icon} trailing-icon={trailingIcon}\n populated={populatedState} focused={focusedState} label={label} outlined={outlined}>\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 </div>\n <mdw-icon-button tabindex=-1 disabled={disabledState} mdw-if={trailingIcon} id=trailing-icon ink={trailingIconInk} disabled={disabledState} icon={trailingIcon}>{trailingIconLabel}</mdw-icon-button>\n <div mdw-if={filled} id=indicator aria-hidden=true focused={focusedState} hovered={hoveredState} errored={erroredState} disabled={disabledState}></div>\n </div>\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 `\n .recompose(({ html, refs: { control, outline, state, shape, inline } }) => {\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 outline.append(html`\n <div id=outline-left class=outline-section focused={focusedState}></div>\n <div id=gap label={label} populated={populatedState} focused={focusedState}>\n <div id=gap-slot focused={focusedState}></div>\n <span id=gap-label>{label}</span>\n </div>\n <div id=outline-right class=outline-section focused={focusedState}></div>\n `);\n outline.setAttribute('label', '{label}');\n outline.setAttribute('errored', '{erroredState}');\n shape.prepend(outline, state);\n inline.prepend(control);\n })\n .on({\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 border-radius: 0;\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(: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 }\n\n #shape {\n position: relative;\n\n display: flex;\n\n cursor: inherit;\n\n z-index: 0;\n\n background-color: transparent;\n\n border-start-start-radius: calc(var(--mdw-shape__size__top-start-size));\n border-start-end-radius: calc(var(--mdw-shape__size__top-end-size));\n border-end-start-radius: calc(var(--mdw-shape__size__bottom-start-size));\n border-end-end-radius: calc(var(--mdw-shape__size__bottom-end-size));\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 #inline {\n display: flex;\n\n align-items: center;\n overflow: visible;\n\n flex: 1;\n padding-block: var(--control__margin-top) var(--control__margin-bottom);\n\n cursor: inherit;\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 \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[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 }\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-block;\n\n box-sizing: border-box;\n\n block-size: auto;\n min-block-size: 0;\n inline-size: 100%;\n min-inline-size: 0;\n flex: 1;\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: inherit;\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 text-align: initial;\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 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-start: 12px;\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 /* stylelint-disable-next-line declaration-property-value-disallowed-list */\n margin-inline-end: 12px;\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 {\n position: absolute;\n inset: 0;\n\n border-style: solid;\n border-width: 0px;\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: 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 #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 #inline[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 ElevationMixin from '../mixins/ElevationMixin.js';\nimport PopupMixin from '../mixins/PopupMixin.js';\nimport ShapeMixin from '../mixins/ShapeMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\nexport default CustomElement\n .extend()\n .mixin(ThemableMixin)\n .mixin(ElevationMixin)\n .mixin(ShapeMixin)\n .mixin(PopupMixin)\n .observe({\n elevation: 'integer',\n })\n .css`\n :host {\n filter: var(--mdw-elevation__drop-shadow__0);\n\n transition: filter 200ms;\n }\n\n :host(:where([elevation=\"1\"])) { filter: var(--mdw-elevation__drop-shadow__1); }\n :host(:where([elevation=\"2\"])) { filter: var(--mdw-elevation__drop-shadow__2); }\n :host(:where([elevation=\"3\"])) { filter: var(--mdw-elevation__drop-shadow__3); }\n :host(:where([elevation=\"4\"])) { filter: var(--mdw-elevation__drop-shadow__4); }\n :host(:where([elevation=\"5\"])) { filter: var(--mdw-elevation__drop-shadow__5); }\n `\n .autoRegister('mdw-popup');\n", "/* https://www.w3.org/WAI/ARIA/apg/patterns/combobox/ */\n/* https://learn.microsoft.com/en-us/dotnet/api/system.windows.controls.combobox.iseditable?view=windowsdesktop-7.0#remarks */\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 sharedPopup.flow = 'corner';\n sharedPopup.elevation = 2;\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 autocompleteInline: 'boolean',\n autocompleteList: 'string',\n autosuggestInline: 'boolean',\n /** If true, when listbox is open, arrow navigation will automatically select options. */\n autoSelect: 'boolean',\n _expanded: 'boolean',\n /** If true, when listbox is open, <ESC> accepts current suggestion, same as <Enter>. */\n acceptOnEscape: 'boolean',\n _listbox: {\n type: 'object',\n /** @type {InstanceType<Listbox>} */\n value: null,\n },\n _focusedValue: 'string',\n _focusedPosInSet: { value: -1 },\n _listboxSize: { value: -1 },\n _draftInput: { type: 'string', nullable: false },\n _hasSuggestion: 'boolean',\n _listboxValue: 'string',\n _lastComputedListboxValue: { type: 'string', nullable: false },\n _values: {\n type: 'array',\n /** @type {string[]} */\n value: [],\n },\n _chipSelected: 'boolean',\n })\n .observe({\n _hasListbox({ _listbox }) {\n return !!_listbox;\n },\n _isSelect({ type }) {\n return type.toLowerCase() === 'select-one' || type.toLocaleLowerCase() === 'select-multiple';\n },\n })\n .define({\n listbox() {\n return this._listbox;\n },\n })\n .set({\n /** @type {EventListener} */\n _onListboxChangeListener: null,\n /** @type {EventListener} */\n _onListboxClickListener: null,\n /** @type {EventListener} */\n _onPopupFocusoutListener: null,\n _suggestionText: '',\n _suggestionValue: '',\n /** @type {HTMLOptionElement} */\n _suggestionOption: null,\n })\n .define({\n stateTargetElement() { return this.refs.control; },\n })\n .methods({\n onResizeObserved() {\n if (!this._expanded) return;\n getSharedPopup().updatePopupPosition(this.refs.shape);\n },\n /**\n * Listbox should close if clicking own selection\n * @param {Event} event\n */\n onListboxClick(event) {\n this.closeListbox();\n // Revert focus back\n this.refs.control.focus();\n },\n /**\n * @param {Event} event\n */\n onListboxChange(event) {\n if (this.multiple) {\n const values = [...this._listbox.selectedOptions].map((option) => option.value);\n this._values = values;\n if (this._input.value) {\n this.closeListbox();\n }\n return;\n }\n const option = this._listbox.selectedOptions.item(0);\n this.render({\n selectedOption: option,\n });\n\n const { label: suggestionText, value: suggestionValue } = option;\n this._suggestionText = suggestionText;\n this._suggestionValue = suggestionValue;\n this._suggestionOption = option;\n this._hasSuggestion = true;\n this.acceptSuggestion(true);\n this.closeListbox();\n this.refs.control.focus();\n },\n /** @param {FocusEvent} Event */\n onPopupFocusout({ relatedTarget }) {\n if (!this._expanded) return;\n // Ignore if focus lost to pop-up (likely pointerdown).\n if (relatedTarget) {\n if (this === relatedTarget) return;\n if (this.contains(/** @type {any} */ (relatedTarget))) return;\n if (getSharedPopup().contains(/** @type {any} */ (relatedTarget))) return;\n }\n this.closeListbox();\n },\n applyAutocompleteList() {\n const { _listbox, _draftInput } = this;\n if (!_listbox) return;\n\n const lowerCase = _draftInput.toLowerCase();\n for (const option of _listbox) {\n option.hidden = !option.label.toLowerCase().startsWith(lowerCase);\n }\n },\n showListbox() {\n // Move contents of list slot into top-layer\n // Should only have one element\n\n const _listbox = this._listbox;\n if (!_listbox) return;\n this._expanded = true;\n const { ariaListbox, shape } = this.refs;\n ariaListbox.setAttribute('aria-hidden', 'false');\n const popup = getSharedPopup();\n if ('popover' in popup) {\n this.insertAdjacentElement('afterend', popup);\n popup.popover = 'manual';\n popup.showPopover();\n } else {\n document.body.append(popup);\n }\n popup.replaceChildren(_listbox);\n popup.showPopup(shape, false);\n popup.addEventListener('focusout', this._onPopupFocusoutListener);\n if (!this._isSelect && !this.multiple) {\n _listbox.value = this._listboxValue;\n }\n const [option] = _listbox.selectedOptions;\n if (option) {\n option.scrollIntoView({\n behavior: 'instant',\n block: 'nearest',\n });\n }\n },\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 toggleListbox() {\n if (this._expanded) {\n this.closeListbox();\n } else {\n this.showListbox();\n }\n },\n /**\n * @param {{label:string, value:string}} option\n * @return {void}\n */\n suggestOption(option) {\n this.render({\n selectedOption: option,\n });\n\n const {\n _draftInput: currentInput,\n _input: inputElement,\n _isSelect,\n autocompleteInline,\n _expanded,\n autoSelect,\n } = this;\n const { label: suggestionText, value: suggestionValue } = option;\n\n this._suggestionText = suggestionText;\n this._suggestionValue = suggestionValue;\n this._suggestionOption = option;\n this._hasSuggestion = true;\n if (autoSelect) {\n this.acceptSuggestion(true);\n return;\n }\n\n // Autocomplete Inline\n if ((_isSelect && !this.multiple) || autocompleteInline) {\n let valueText = suggestionText;\n let selectionStart = 0;\n if (_expanded) {\n if (!_isSelect && suggestionText.toLowerCase().startsWith(currentInput.toLowerCase())) {\n valueText = currentInput + suggestionText.slice(currentInput.length);\n selectionStart = currentInput.length;\n } else {\n selectionStart = suggestionText.length;\n }\n } else {\n selectionStart = 0;\n }\n inputElement.value = valueText; // Displayed value\n if (autocompleteInline) {\n inputElement.setSelectionRange(selectionStart, suggestionText.length);\n }\n if (!_expanded) {\n this.acceptSuggestion(true);\n }\n }\n },\n acceptSuggestion(emitChange = false) {\n if (!this._hasSuggestion) return;\n if (this.readOnly) return;\n const { _suggestionText, _suggestionValue, _input, multiple, _listbox, _values } = this;\n if (multiple) {\n const newArray = [..._values.filter(Boolean), _suggestionValue ?? _suggestionText];\n this._values = [...new Set(newArray)];\n } else {\n this.value = _suggestionValue;\n _input.value = _suggestionText;\n this._draftInput = _suggestionText;\n _listbox.value = _suggestionValue;\n }\n if (emitChange) {\n this.dispatchEvent(new Event('change', { bubbles: true }));\n }\n },\n /**\n * @param {Object} options\n * @param {boolean} [options.first] first option\n * @param {boolean} [options.last] first option\n * @param {boolean} [options.next] next fosuable option\n * @param {boolean} [options.previous] previous focusable option\n * @param {string} [options.startsWith] option label starsWith\n * @param {string} [options.value] matches option value\n * @param {string} [options.label] matches option label\n */\n changeSuggestion({ first, last, next, previous, startsWith, value, label }) {\n const _listbox = this._listbox;\n let suggestion;\n let suggestionIndex;\n let current;\n let currentIndex;\n let backup;\n let backupIndex = -1;\n let optionIndex = -1;\n for (const option of _listbox.options) {\n optionIndex++;\n if (!current && option.focused) {\n current = option;\n currentIndex = optionIndex;\n if (suggestion && (!next && !last)) {\n break;\n }\n }\n if (option.hidden) continue;\n if (last) {\n suggestion = option;\n suggestionIndex = optionIndex;\n continue;\n }\n if (first) {\n if (!suggestion) {\n suggestion = option;\n suggestionIndex = optionIndex;\n }\n continue;\n }\n if (startsWith != null) {\n if (!suggestion && option.label.toLowerCase().startsWith(startsWith)) {\n suggestion = option;\n suggestionIndex = optionIndex;\n }\n continue;\n }\n if (value != null) {\n if (!suggestion && option.value === value) {\n suggestion = option;\n suggestionIndex = optionIndex;\n }\n continue;\n }\n if (label != null) {\n if (!suggestion && option.label === label) {\n suggestion = option;\n suggestionIndex = optionIndex;\n }\n continue;\n }\n if (currentIndex === optionIndex) continue;\n if (previous) {\n suggestion = option;\n suggestionIndex = optionIndex;\n } else if (next) {\n if (current) {\n suggestion = option;\n suggestionIndex = optionIndex;\n break;\n } else if (!backup) {\n backup = option;\n backupIndex = optionIndex;\n }\n }\n }\n if (current && current !== suggestion) {\n current.focused = false;\n }\n if (!suggestion) {\n suggestionIndex = backupIndex;\n suggestion = backup;\n this._input.value = this._draftInput;\n }\n if (suggestionIndex === -1) {\n this._focusedPosInSet = -1;\n this._hasSuggestion = false;\n return;\n }\n this._focusedPosInSet = suggestionIndex + 1;\n suggestion.focused = true;\n suggestion.scrollIntoView({\n behavior: 'instant',\n block: 'nearest',\n });\n this.suggestOption(suggestion);\n },\n resetSuggestion() {\n if (this._isSelect) {\n this.changeSuggestion({ label: this._draftInput });\n } else {\n this.changeSuggestion({ value: this._listboxValue });\n }\n },\n refreshMultiple() {\n const { _values, multiple } = this;\n if (!multiple) {\n this.refs.chips.replaceChildren();\n return;\n }\n /** @type {InstanceType<import('./InputChip.js').default>} */\n let element = this.refs.chips.firstElementChild;\n\n for (let i = 0; i < _values.length; i++) {\n const currentValue = _values[i];\n let foundOption;\n if (this.listbox) {\n for (const option of this.listbox.options) {\n if (option.value === currentValue) {\n foundOption = option;\n break;\n }\n }\n }\n\n element ??= this.refs.chips.appendChild(document.createElement('mdw-input-chip'));\n element.closeButton = true;\n element.textContent = foundOption?.label || currentValue;\n element.textContent = foundOption?.label || currentValue;\n element.disabled = this.disabled;\n element.readOnly = this.readOnly;\n // eslint-disable-next-line unicorn/prefer-add-event-listener\n element.onclose ??= this.onChipClose.bind(this);\n element = element.nextElementSibling;\n }\n while (element) {\n const prev = element;\n element = element.nextElementSibling;\n prev.remove();\n }\n this._chipSelected = false;\n this._input.value = '';\n this._draftInput = '';\n this._listboxValue = '';\n if (this.listbox) {\n for (const option of this.listbox.options) {\n option.selected = _values.includes(option.value);\n }\n }\n },\n populateInputFromListbox() {\n if (this.multiple) {\n this.refreshMultiple();\n return;\n }\n if (!this._isSelect) return;\n if (!this._listbox) return;\n\n this._listbox.value = this._value;\n const [option] = this._listbox.selectedOptions;\n if (option) {\n this._input.value = option.label;\n this._draftInput = option.label;\n }\n },\n onChipClose({ currentTarget }) {\n let prev = currentTarget;\n let elementIndex = 0;\n while ((prev = prev.previousSibling)) {\n elementIndex++;\n }\n currentTarget.remove();\n this._values.splice(elementIndex, 1);\n this._values = [...this._values];\n },\n })\n .childEvents({\n control: {\n click() {\n if (!this._isSelect) return;\n if (this.readOnly) return;\n this.toggleListbox();\n },\n input(event) {\n if (!this._hasListbox) 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 const performDefault = 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 if (!performDefault) {\n event.preventDefault();\n return;\n }\n const value = /** @type {HTMLInputElement} */ (event.currentTarget).value;\n this._draftInput = value;\n if (this.autocompleteList != null && this.autocompleteList !== 'custom') {\n this.applyAutocompleteList();\n }\n this.resetSuggestion();\n if (value && !this._expanded && this._listbox.length) {\n this.showListbox();\n }\n // Only inline suggest if appending characters\n if (event.data != null && this.autosuggestInline) {\n this.changeSuggestion({ startsWith: this._draftInput.toLocaleLowerCase() });\n }\n },\n keydown(event) {\n if (!this._listbox) return;\n // Calls to return will not prevent default.\n switch (event.key) {\n case 'Home':\n if (!this._isSelect) return;\n if (this.readOnly) return;\n this.changeSuggestion({ first: true });\n break;\n case 'End':\n this._chipSelected = false;\n if (!this._isSelect) return;\n if (this.readOnly) return;\n this.changeSuggestion({ last: true });\n break;\n case 'ArrowDown':\n case 'Down':\n if (this.disabled) return;\n if (this.readOnly) return;\n this._chipSelected = false;\n if (this.readOnly) return;\n if (event.altKey) {\n this.toggleListbox();\n break;\n }\n if (!this._expanded && !this.autocompleteInline && !this._isSelect) return;\n this.changeSuggestion({ next: true });\n break;\n case 'ArrowUp':\n case 'Up':\n if (this.disabled) return;\n if (this.readOnly) return;\n if (event.altKey) {\n this.toggleListbox();\n break;\n }\n this._chipSelected = false;\n if (!this._expanded && !this.autocompleteInline && !this._isSelect) return;\n this.changeSuggestion({ previous: true });\n break;\n case 'Escape':\n if (!this._expanded) return;\n event.stopImmediatePropagation();\n event.preventDefault();\n if (this.acceptOnEscape) {\n this.acceptSuggestion(true);\n } else {\n this.resetSuggestion();\n }\n this.closeListbox();\n break;\n case 'Space':\n if (this.disabled) return;\n if (this.readOnly) return;\n if (!this._isSelect) return;\n if (!this._listbox) return;\n if (this._expanded) {\n if (this.multiple && this._suggestionOption) {\n this._suggestionOption.selected = !this._suggestionOption.selected;\n this.closeListbox();\n }\n } else {\n this.showListbox();\n }\n break;\n case 'Backspace':\n if (this.disabled) return;\n if (this.readOnly) return;\n if (!this.multiple) return;\n if (this._isSelect) return;\n if (!this._input.value) {\n if (this._chipSelected) {\n this._values.pop();\n this._values = [...this._values];\n } else if (this._values.length) {\n this._chipSelected = true;\n }\n }\n return;\n case 'Tab':\n if (!this._expanded && this.multiple) return;\n this.closeListbox();\n this.acceptSuggestion(true);\n event.stopPropagation();\n return;\n case 'Enter':\n this._chipSelected = false;\n if (!this._expanded) return;\n event.stopImmediatePropagation();\n event.preventDefault();\n this.acceptSuggestion(true);\n this.closeListbox();\n break;\n case ' ':\n return;\n default:\n if (this._isSelect && event.key.length === 1) {\n this.changeSuggestion({ startsWith: event.key.toLocaleLowerCase() });\n break;\n }\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 {InstanceType<Listbox>[]} */\n const [listbox] = currentTarget.assignedElements();\n const _listbox = this._listbox;\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 _listbox.removeEventListener('click', this._onListboxClickListener);\n _listbox._handleFormReset = true;\n }\n this._listbox = listbox;\n if (listbox) {\n // Bind and store\n if (!this.multiple) {\n listbox.required = true; // Don't allow unclick\n }\n\n _listbox._handleFormReset = false;\n listbox.addEventListener('change', this._onListboxChangeListener);\n listbox.addEventListener('click', this._onListboxChangeListener);\n this.populateInputFromListbox();\n }\n },\n },\n trailingIcon: {\n '~click'() {\n if (!this._listbox) return;\n this.toggleListbox();\n this.refs.control.focus();\n },\n },\n })\n .events({\n blur({ relatedTarget }) {\n this._chipSelected = false;\n if (!this._expanded) return;\n // Ignore if focus lost to pop-up (likely pointerdown).\n const popup = getSharedPopup();\n if (popup === relatedTarget) return;\n if (relatedTarget && popup.contains(/** @type {Node} */ (relatedTarget))) return;\n if (popup.matches(':focus-within,:focus')) return;\n this.closeListbox();\n },\n })\n .expressions({\n showTrailingIcon({ trailingIcon, _listbox, _expanded, readOnly }) {\n if (trailingIcon != null) {\n return trailingIcon;\n }\n if (_listbox && !readOnly) {\n return _expanded ? 'arrow_drop_up' : 'arrow_drop_down';\n }\n return null;\n },\n computedTrailingIcon({ trailingIcon, _listbox, _expanded }) {\n if (trailingIcon != null) {\n return trailingIcon;\n }\n if (_listbox) {\n return _expanded ? 'arrow_drop_up' : 'arrow_drop_down';\n }\n return null;\n },\n controlTypeAttrValue({ _isSelect, type }) {\n if (_isSelect) return 'text';\n return type;\n },\n controlReadonlyAttrValue({ _isSelect, type, readOnly }) {\n if (_isSelect) return true;\n return readOnly;\n },\n controlIsSelect({ _isSelect, type }) {\n return _isSelect;\n },\n ariaExpandedAttrValue({ _hasListbox, _expanded }) {\n if (!_hasListbox) return null;\n return `${_expanded}`;\n },\n ariaControlsAttrValue({ _hasListbox }) {\n if (!_hasListbox) return null;\n return 'aria-listbox';\n },\n ariaAutocompleteAttrValue({ _hasListbox, autocompleteList, _isSelect }) {\n if (!_hasListbox) return null;\n if (_isSelect) return null;\n if (autocompleteList != null) {\n return 'both';\n }\n return 'inline';\n },\n ariaActiveDescendantAttrValue({ _hasListbox, _expanded, _focusedValue }) {\n if (!_hasListbox) return null;\n if (_expanded && _focusedValue) return 'aria-active';\n return '';\n },\n controlRoleAttrValue({ _hasListbox }) {\n if (_hasListbox) return 'combobox';\n return null;\n },\n populatedState({ value, _badInput, _draftInput, type }) {\n return !!value || _badInput || !!_draftInput || type === 'datetime-local';\n },\n })\n .recompose(({ refs: { control, trailingIcon, shape, labelText } }) => {\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 control.setAttribute('type', '{controlTypeAttrValue}');\n control.setAttribute('role', '{controlRoleAttrValue}');\n control.setAttribute('readonly', '{controlReadonlyAttrValue}');\n control.setAttribute('autocomplete', 'off');\n control.setAttribute('is-select', '{controlIsSelect}');\n trailingIcon.setAttribute('mdw-if', '{showTrailingIcon}');\n trailingIcon.setAttribute('icon', '{computedTrailingIcon}');\n shape.setAttribute('trailing-icon', '{computedTrailingIcon}');\n labelText.setAttribute('trailing-icon', '{computedTrailingIcon}');\n })\n .overrides({\n _onSetValue(value) {\n if (this.multiple) {\n this._values = value.split(',').filter(Boolean);\n } else if (this._isSelect) {\n this._value = value;\n } else {\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 _onControlValue(value) {\n // Only accept values from accepted suggestions\n if (this.multiple) {\n if (value) {\n this._chipSelected = false;\n }\n return;\n }\n this._value = value;\n },\n })\n .on({\n _valueChanged(previous, current) {\n if (this.multiple) return; // Handled by _values\n if (this._isSelect) {\n this.populateInputFromListbox();\n } else {\n this._listboxValue = current;\n }\n },\n _valuesChanged(previous, current) {\n if (this.multiple && current) {\n this._value = current.join(',');\n this.refreshMultiple();\n }\n },\n _chipSelectedChanged(previous, current) {\n if (!this.multiple) return;\n const element = this.refs.chips.lastElementChild;\n if (element) {\n element.selected = current;\n }\n },\n _listboxValueChanged(previous, current) {\n if (!this._hasListbox) return;\n this._listbox.value = current;\n this._draftInput = current;\n this.changeSuggestion({ value: current });\n },\n _expandedChanged(previous, current) {\n this._useFormImplicitSubmission = !current;\n },\n constructed() {\n this._onListboxChangeListener = this.onListboxChange.bind(this);\n this._onListboxClickListener = this.onListboxClick.bind(this);\n this._onPopupFocusoutListener = this.onPopupFocusout.bind(this);\n document.addEventListener('DOMContentLoaded', () => this.populateInputFromListbox(), { once: true });\n },\n multipleChanged(previous, current) {\n if (this.listbox) {\n this.listbox.multiple = current;\n }\n if (current) {\n this._onSetValue(this._input.value);\n }\n },\n disabledStateChanged() {\n this.refreshMultiple();\n this._chipSelected = false;\n this.closeListbox();\n },\n readOnlyChanged() {\n this.refreshMultiple();\n this._chipSelected = false;\n this.closeListbox();\n },\n })\n .html`\n <div id=chips mdw-if={multiple}></div>\n <slot id=slot></slot>\n <div id=aria-listbox role=listbox mdw-if={_hasListbox}>\n <div id=aria-active role=option aria-hidden=false aria-label={selectedOption.label}\n aria-setsize=\"{_listbox.length}\" aria-posinset={_focusedPosInSet}></div>\n </div>\n `\n .css`\n #slot {\n display: none;\n }\n\n #aria-listbox {\n display: none;\n }\n\n #trailing-icon {\n align-self: center;\n }\n\n #control:where([type=\"button\"], [is-select]) {\n cursor: pointer;\n }\n\n #inline[multiple] {\n gap: 8px;\n }\n\n mdw-input-chip {\n align-self: baseline;\n\n }\n\n #control[multiple] {\n align-self: baseline;\n }\n\n #chips {\n display: contents;\n }\n\n #inline {\n flex-wrap: wrap;\n }\n\n #inline:where([filled],[outlined]) {\n padding-inline: 16px;\n }\n\n #control {\n flex: 1 1 8ch;\n }\n\n #control[is-select][multiple] {\n flex: 1 1 0px;\n }\n `\n .recompose(({ refs: { inline, chips } }) => {\n inline.prepend(chips);\n inline.setAttribute('multiple', '{multiple}');\n })\n .extend((Base) => class Input extends Base {\n /** @type {InstanceType<ReturnType<RippleMixin>>['addRipple']} */\n addRipple(...args) {\n if (!this.active) return null;\n return super.addRipple(...args);\n }\n })\n .autoRegister('mdw-input');\n", "import { EVENT_HANDLER_TYPE } from '../core/customTypes.js';\nimport DelegatesFocusMixin from '../mixins/DelegatesFocusMixin.js';\nimport HyperlinkMixin from '../mixins/HyperlinkMixin.js';\nimport ShapeMixin from '../mixins/ShapeMixin.js';\n\nimport Box from './Box.js';\nimport './Button.js';\nimport './Icon.js';\nimport './IconButton.js';\n\nexport default Box\n .extend()\n .mixin(ShapeMixin)\n .mixin(DelegatesFocusMixin)\n .mixin(HyperlinkMixin)\n .observe({\n avatar: 'boolean',\n closeButton: 'boolean',\n closeIcon: { empty: 'close' },\n closeInk: { empty: 'inherit' },\n readOnly: { attr: 'readonly', type: 'boolean' },\n disabled: 'boolean',\n icon: 'string',\n iconInk: 'string',\n src: 'string',\n svg: 'string',\n viewBox: 'string',\n svgPath: 'string',\n onclose: EVENT_HANDLER_TYPE,\n selected: 'boolean',\n })\n .set({\n outlined: true,\n })\n .expressions({\n hasIcon({ icon, svg, src, svgPath } = this) {\n return icon ?? svg ?? src ?? svgPath;\n },\n showCloseIcon({ disabled, readOnly, closeButton }) {\n return closeButton && !disabled && !readOnly;\n },\n })\n .html`\n <mdw-button\n role=none\n tabindex=-1\n href={href}\n target={target}\n download={download}\n ping={ping}\n rel={rel}\n hreflang={hreflang}\n referrerpolicy={referrerPolicy} id=action disabled={disabled}></mdw-button>\n <mdw-icon mdw-if={hasIcon} id=icon ink={iconInk} disabled={disabled}\n outlined={outlined} variation={iconVariation} aria-hidden=true svg={svg} src={src}\n svg-path={svgPath} view-box={viewBox} icon={icon} avatar={avatar}></mdw-icon>\n <mdw-icon-button role=none disabled={disabled} tabindex=-1 mdw-if={showCloseIcon} id=close class=button icon={closeIcon} ink={closeInk}>Close</mdw-icon-button>\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 position: relative;\n\n display: inline-flex;\n align-items: center;\n flex-direction: row;\n gap: 8px;\n\n padding-block: calc(4px + (var(--mdw-density) * 2px));\n padding-inline: calc(12px + (var(--mdw-density) * 2px));\n\n color: rgb(var(--mdw-ink));\n }\n\n :host(:where([icon])) {\n padding-inline-start: calc(8px + (var(--mdw-density) * 2px));\n }\n\n :host(:where([avatar])) {\n padding-inline-start: calc(4px + (var(--mdw-density) * 2px));\n }\n\n :host(:where([close-button]:not([disabled]):not([readonly]))) {\n padding-inline-end: calc(8px + 18px + 8px + (var(--mdw-density) * 2px));\n }\n\n #action {\n --mdw-shape__size: inherit;\n position: absolute;\n inset: 0;\n\n padding: 0;\n }\n\n #close {\n position: absolute;\n inset-inline-end: calc(8px - 3px);\n \n padding: 3px; /* Pad to 24px */\n\n font-size: 18px;\n }\n\n #icon {\n font-size: 18px;\n }\n\n #icon[avatar] {\n font-size: 24px;\n }\n\n #close::part(control) {\n min-inline-size: calc(18px + (2 * 8px)); /* Reach up to edge of chip */\n }\n\n #outline {\n --mdw-ink: rgb(var(--mdw-color__on-surface-variant));\n }\n\n #outline:is([ink],[color],[disabled]) {\n /* stylelint-disable-next-line rule-selector-property-disallowed-list */\n --mdw-ink: inherit;\n }\n\n :host([disabled]) {\n color: rgba(var(--mdw-color__on-surface), 0.38);\n }\n\n `\n .childEvents({\n action: {\n click() {\n this.dispatchEvent(new Event('action'));\n },\n },\n close: {\n click() {\n this.dispatchEvent(new Event('close'));\n },\n },\n })\n .on({\n selectedChanged(previous, current) {\n this.refs.action._focused = current;\n },\n })\n .recompose(({ refs: { anchor, slot, icon, outline } }) => {\n icon.after(slot);\n anchor.remove();\n slot.setAttribute('disabled', '{disabled}');\n slot.removeAttribute('ink');\n slot.removeAttribute('color');\n outline.removeAttribute('mdw-if');\n outline.setAttribute('ink', '{ink}');\n outline.setAttribute('color', '{color}');\n outline.setAttribute('disabled', '{disabled}');\n })\n .autoRegister('mdw-input-chip');\n", "import TypographyMixin from '../mixins/TypographyMixin.js';\n\nimport Box from './Box.js';\n\nexport default Box\n .extend()\n .mixin(TypographyMixin)\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 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 display: block;\n\n padding-block: 8px;\n\n color: rgb(var(--mdw-ink));\n }\n\n `\n .autoRegister('mdw-list');\n", "/** @param {typeof import('../core/CustomElement.js').default} Base */\nexport default function ShapeMaskedMixin(Base) {\n return Base\n .observe({\n shapeTop: 'boolean',\n shapeBottom: 'boolean',\n shapeStart: 'boolean',\n shapeEnd: 'boolean',\n shapeStyle: 'string',\n })\n .css`\n :host {\n --mdw-shape__size: 0px;\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__mask: none;\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\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 /* (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 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\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 :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 @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;\n transition-property: -webkit-mask-box-image-width;\n will-change: -webkit-mask-box-image;\n }\n }\n `;\n}\n", "import CustomElement from '../core/CustomElement.js';\nimport ShapeMaskedMixin from '../mixins/ShapeMaskedMixin.js';\n\nexport default CustomElement\n .extend()\n .mixin(ShapeMaskedMixin)\n .html`<slot id=slot></slot>`\n .autoRegister('mdw-shape');\n", "import './Shape.js';\n\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 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 <mdw-shape id=inner-shape selected={selected}></div>\n `\n .recompose(({ refs: { outline } }) => {\n outline.removeAttribute('mdw-if');\n outline.setAttribute('selected', '{selected}');\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 border-width: 2px;\n\n color: var(--color);\n\n will-change: color;\n }\n\n #inner-shape {\n position: absolute;\n inset: 0;\n\n transform: scale(0);\n\n background-color: var(--color);\n border-radius: inherit;\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 './Box.js';\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 HyperlinkMixin from '../mixins/HyperlinkMixin.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 .mixin(HyperlinkMixin)\n .set({\n _ariaRole: 'listitem',\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 iconInk: 'string',\n iconSrc: 'string',\n iconVariation: '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: 'string',\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 computedIconVariation({ iconVariation }) {\n return iconVariation ?? 'filled';\n },\n })\n .html`\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} x=center y=center 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={icon} variation={computedIconVariation}></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 icon={trailingIcon}></mdw-icon>\n <slot id=trailing name=trailing role=note>{trailing}</slot>\n <mdw-divider mdw-if={divider} id=divider divider={divider}></mdw-divider>\n `\n .recompose(({ refs: { state, rippleContainer, anchor } }) => {\n anchor.setAttribute('mdw-if', '{href}');\n anchor.setAttribute('aria-labelledby', 'content');\n anchor.append(\n state,\n rippleContainer,\n );\n state.setAttribute('state-disabled', 'focus hover');\n })\n .on({\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;\n\n cursor: auto;\n\n outline: none;\n\n color: inherit;\n\n text-decoration: none;\n }\n\n :host(:where([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([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 inset-inline: 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__label-small__font);\n letter-spacing: var(--mdw-typescale__label-small__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 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 DelegatesFocusMixin from '../mixins/DelegatesFocusMixin.js';\n\nimport ListItem from './ListItem.js';\n\n// https://html.spec.whatwg.org/multipage/form-elements.html#htmloptionelement\n\nexport default ListItem\n .extend()\n .mixin(DelegatesFocusMixin)\n .setStatic({\n formAssociated: true,\n })\n .set({\n _ariaRole: 'none',\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 /** @type {HTMLInputElement} */ (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._value = 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 .expressions({\n anchorAriaLabelledBy({ _label }) {\n return _label ? null : 'content';\n },\n anchorAriaDescribedBy({ _label }) {\n return _label ? 'content' : null;\n },\n computedIconVariation({ iconVariation, selected }) {\n if (iconVariation != null) return iconVariation;\n return selected ? 'filled' : null;\n },\n })\n .recompose(({ inline, refs: { checkbox, radio, anchor, state, content } }) => {\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.setAttribute('aria-labelledby', '{anchorAriaLabelledBy}');\n anchor.setAttribute('aria-describedby', '{anchorAriaDescribedBy}');\n anchor.setAttribute('aria-label', '{_label}');\n anchor.removeAttribute('href');\n anchor.removeAttribute('mdw-if');\n\n // eslint-disable-next-line no-shadow\n checkbox.setAttribute('mdw-if', inline(({ checkbox, icon }) => !icon && checkbox));\n\n // eslint-disable-next-line no-shadow\n radio.setAttribute('mdw-if', inline(({ radio, icon }) => !icon && radio));\n\n content.setAttribute('aria-hidden', 'true');\n content.setAttribute('selected', '{selected}');\n\n state.setAttribute('state-disabled', 'focus');\n })\n .on({\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([hidden]) {\n display: none;\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 pointer-events: 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 .extend((BaseClass) => class extends BaseClass {\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 .autoRegister('mdw-list-option');\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 DelegatesFocusMixin from '../mixins/DelegatesFocusMixin.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 List\n .extend()\n .mixin(StateMixin)\n .mixin(FormAssociatedMixin)\n .mixin(KeyboardNavMixin)\n .mixin(DelegatesFocusMixin)\n .observe({\n multiple: 'boolean',\n size: { type: 'integer', empty: 0 },\n })\n .set({\n _ariaRole: 'listbox',\n /** @type {HTMLCollectionOf<InstanceType<ListOption>> & HTMLOptionsCollection} */\n _optionsCollection: null,\n /** @type {HTMLCollectionOf<InstanceType<ListOption>>} */\n _selectedOptionsCollection: null,\n _handlingSelectedness: false,\n _handleFormReset: true,\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<InstanceType<ListOption>>} */\n selectedOptions() {\n // eslint-disable-next-line no-return-assign\n return (this._selectedOptionsCollection\n ??= (\n /** @type {HTMLCollectionOf<InstanceType<ListOption>>} */\n (this.getElementsByClassName('mdw-list-option__selected')))\n );\n },\n\n type() { return this.multiple ? 'select-multiple' : 'select-one'; },\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 this._handlingSelectedness = true;\n for (const option of this.options) {\n option.selected = (option === itemToSelect);\n }\n this._handlingSelectedness = false;\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 this._handlingSelectedness = true;\n for (const option of this.options) {\n if ((option.selected = (option.value === vString))) {\n newValue = vString;\n }\n }\n this._handlingSelectedness = false;\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 if (!newValue) return;\n if (!this._handleFormReset) return;\n this.value = this.defaultValue;\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.stopImmediatePropagation();\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 this._updateFormAssociatedValue();\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 {InstanceType<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 CustomElement from '../core/CustomElement.js';\nimport { attemptFocus } from '../core/dom.js';\nimport DensityMixin from '../mixins/DensityMixin.js';\nimport ElevationMixin from '../mixins/ElevationMixin.js';\nimport KeyboardNavMixin from '../mixins/KeyboardNavMixin.js';\nimport PopupMixin from '../mixins/PopupMixin.js';\nimport ShapeMixin from '../mixins/ShapeMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\nexport default CustomElement\n .extend()\n .mixin(ThemableMixin)\n .mixin(ElevationMixin)\n .mixin(ShapeMixin)\n .mixin(PopupMixin)\n .mixin(DensityMixin)\n .mixin(KeyboardNavMixin)\n .set({\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 .recompose(({ refs: { scrim } }) => {\n scrim.setAttribute('invisible', '');\n // Wrap slot in scroller\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 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 filter: var(--mdw-elevation__drop-shadow__2);\n\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 if (!submenu) return;\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 { isFocused } from '../core/dom.js';\nimport FormAssociatedMixin from '../mixins/FormAssociatedMixin.js';\n\nimport './Icon.js';\nimport ListOption from './ListOption.js';\n\nexport default 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 (!isFocused(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 .recompose(({ inline, html, refs: { checkbox: checkboxRef, radio: radioRef, anchor, trailing, trailingIcon } }) => {\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} icon=check></mdw-icon>\n `);\n\n trailing.setAttribute('type-style', 'label-large');\n\n trailingIcon.setAttribute('mdw-if', '{computeTrailingIcon}');\n trailingIcon.setAttribute('icon', '{computeTrailingIcon}');\n })\n .on({\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", "import './Icon.js';\nimport './Ripple.js';\nimport './Badge.js';\nimport './Shape.js';\n\nimport CustomElement from '../core/CustomElement.js';\nimport DelegatesFocusMixin from '../mixins/DelegatesFocusMixin.js';\nimport HyperlinkMixin from '../mixins/HyperlinkMixin.js';\nimport RippleMixin from '../mixins/RippleMixin.js';\nimport StateMixin from '../mixins/StateMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\n/** @typedef {'charset'|'coords'|'name'|'shape'} DeprecatedHTMLAnchorElementProperties */\n\nexport default CustomElement\n .extend()\n .mixin(ThemableMixin)\n .mixin(StateMixin)\n .mixin(RippleMixin)\n .mixin(HyperlinkMixin)\n .mixin(DelegatesFocusMixin)\n .set({\n stateLayer: true,\n })\n .observe({\n showLabel: 'string',\n active: 'boolean',\n icon: 'string',\n src: '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 .expressions({\n _anchorAriaCurrent({ active }) {\n return active ? 'page' : null;\n },\n _anchorAriaLabelledby({ ariaLabel }) {\n return ariaLabel ? null : 'slot';\n },\n _anchorHref({ href }) { return href ?? '#'; },\n iconVariation({ active }) {\n return active ? 'filled' : null;\n },\n })\n .html`\n <mdw-icon id=icon aria-hidden=true src={src} active={active} icon={icon} variation={iconVariation}></mdw-icon>\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 .recompose(({ html, refs: { anchor, state, rippleContainer } }) => {\n anchor.setAttribute('aria-current', '{_anchorAriaCurrent}');\n anchor.setAttribute('aria-describedby', 'badge');\n anchor.setAttribute('aria-label', '{ariaLabel}');\n anchor.setAttribute('aria-labelledby', '{_anchorAriaLabelledby}');\n anchor.setAttribute('href', '{_anchorHref}');\n anchor.before(html`\n <mdw-shape id=shape active={active} shape-style=full>\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 </mdw-shape>\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\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 overflow: hidden;\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\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\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\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 .extend((Base) => class NavItem extends Base {\n /** @type {InstanceType<ReturnType<RippleMixin>>['addRipple']} */\n addRipple(...args) {\n if (!this.active) return null;\n return super.addRipple(...args);\n }\n })\n .autoRegister('mdw-nav-item');\n", "import CustomElement from '../core/CustomElement.js';\nimport DelegatesFocusMixin from '../mixins/DelegatesFocusMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\nimport NavItem from './NavItem.js';\n\nexport default CustomElement\n .extend()\n .mixin(DelegatesFocusMixin)\n .mixin(ThemableMixin)\n .observe({\n open: 'boolean',\n autoClose: {\n type: 'float',\n empty: 728,\n },\n })\n .set({\n color: 'surface-container',\n _ariaRole: 'navigation',\n })\n .html`<slot id=slot></slot>`\n .css`\n /* https://m3.material.io/components/navigation-bar/specs */\n\n :host {\n --mdw-bg: var(--mdw-color__surface-container);\n --mdw-ink: var(--mdw-color__on-surface);\n display: none;\n\n align-content: flex-start;\n align-items: flex-start;\n gap: 8px;\n\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 pointer-events: auto;\n\n background-color: rgb(var(--mdw-bg));\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 text-align: center;\n }\n\n :host(:where([open])) {\n display: grid;\n }\n `\n .methods({\n onWindowResize() {\n const { autoClose } = this;\n const containerWidth = window.innerWidth;\n this.open = (autoClose === -1 || containerWidth < autoClose);\n },\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 .on({\n constructed() {\n window.addEventListener('resize', this.onWindowResize.bind(this));\n },\n connected() {\n this.onWindowResize();\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 CustomElement from '../core/CustomElement.js';\nimport { ELEMENT_ANIMATION_TYPE, ELEMENT_STYLE_TYPE, EVENT_HANDLER_TYPE } from '../core/customTypes.js';\nimport { isRtl } from '../core/dom.js';\nimport AriaReflectorMixin from '../mixins/AriaReflectorMixin.js';\nimport DelegatesFocusMixin from '../mixins/DelegatesFocusMixin.js';\nimport ElevationMixin from '../mixins/ElevationMixin.js';\nimport FlexableMixin from '../mixins/FlexableMixin.js';\nimport ResizeObserverMixin from '../mixins/ResizeObserverMixin.js';\nimport ShapeMixin from '../mixins/ShapeMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\nimport Scrim from './Scrim.js';\n\nconst SUPPORTS_SCROLLEND = 'onscrollend' in window;\n\n/**\n * Side sheets may be static.\n * Side sheets may be modal while retaining their own position.\n * Side sheets can have different modal and static max-sizes.\n * Side sheets can be themed with background color and ink.\n * Side sheets can be shaped.\n * Side sheets do not have states\n * Side sheets can have roles\n * Side sheets delegate focus\n * Static side sheets push in and out content.\n * Modal side sheets slide in and out over content.\n * Modal side sheets anchor position does not need to match static position.\n * Modal side sheets must become \"dialog-like\", blocking access to all other elements on the screen.\n * Modal side sheets can display elevation\n */\nexport default CustomElement\n .extend()\n .mixin(ThemableMixin)\n .mixin(FlexableMixin)\n .mixin(ElevationMixin)\n .mixin(ShapeMixin)\n .mixin(AriaReflectorMixin)\n .mixin(DelegatesFocusMixin)\n .mixin(ResizeObserverMixin)\n .observe({\n fixed: 'boolean',\n open: 'boolean',\n inlineEnd: 'boolean',\n _lastComputedInlineSize: {\n type: 'float',\n nullable: false,\n },\n _animationDuration: {\n type: 'integer',\n value: 0,\n },\n _animationEasing: {\n value: 'ease-out',\n },\n _dragDeltaX: 'float',\n _dragStartX: 'float',\n _translateX: { value: '-100%' },\n _lastChildScrollTime: 'float',\n ontoggle: EVENT_HANDLER_TYPE,\n onclose: EVENT_HANDLER_TYPE,\n autoOpen: {\n type: 'float',\n empty: -1,\n },\n autoClose: {\n type: 'float',\n empty: -1,\n },\n fixedBreakpoint: {\n type: 'float',\n empty: 0,\n },\n _isSideSheetRtl: 'boolean',\n color: 'string',\n fixedColor: 'string',\n })\n .set({\n /** @type {InstanceType<Scrim>} */\n _scrim: null,\n })\n .observe({\n _styles: {\n ...ELEMENT_STYLE_TYPE,\n get({ fixed, fixedColor }) {\n if (fixed && fixedColor) {\n return { backgroundColor: `rgb(var(--mdw-color__${fixedColor}))` };\n }\n },\n },\n hostStyles: {\n ...ELEMENT_ANIMATION_TYPE,\n get({\n open, fixed, _isSideSheetRtl, _lastComputedInlineSize, _translateX,\n _animationDuration, _animationEasing,\n }) {\n const computedMargin = (open || !fixed) ? 0 : `${-1 * _lastComputedInlineSize}px`;\n return {\n styles: {\n marginLeft: _isSideSheetRtl ? 0 : computedMargin,\n marginRight: _isSideSheetRtl ? computedMargin : 0,\n transform: fixed ? 'none' : `translateX(${_translateX})`,\n },\n timing: {\n duration: _animationDuration,\n easing: _animationEasing,\n },\n };\n },\n },\n })\n .html`<slot id=slot></slot>`\n .methods({\n checkForScrim(animate = false) {\n let { open, fixed, _scrim } = this;\n if (open && !fixed) {\n if (!_scrim) {\n _scrim = new Scrim();\n _scrim.addEventListener('click', () => {\n this.open = false;\n if (!this.dispatchEvent(new Event('close', { cancelable: true }))) {\n // Revert if cancelled\n this.open = true;\n }\n });\n this._scrim = _scrim;\n }\n this.before(_scrim);\n _scrim.hidden = false;\n } else if (_scrim) {\n if (!animate) {\n _scrim.remove();\n }\n _scrim.hidden = true;\n }\n },\n checkDragFinished() {\n const { open, _dragDeltaX, _lastComputedInlineSize, fixed, _isSideSheetRtl } = this;\n if (!open || fixed || _dragDeltaX == null) return;\n const visibility = (_dragDeltaX + _lastComputedInlineSize) / _lastComputedInlineSize;\n if (visibility < 0.5) {\n // Should close\n this._animationDuration = 200 * visibility;\n this._animationEasing = 'ease-out';\n this._translateX = _isSideSheetRtl ? '-100%' : '100%';\n this.open = false;\n this.dispatchEvent(new Event('close', { cancelable: false }));\n } else {\n // Should snap back to fully open\n this._animationDuration = 250 * (0.5 * visibility);\n this._translateX = '0';\n this._animationEasing = 'ease-in';\n }\n this._dragDeltaY = null;\n this._dragStartY = null;\n },\n onWindowResize() {\n const { autoOpen, fixedBreakpoint, autoClose } = this;\n const containerWidth = window.innerWidth;\n const fixed = (containerWidth >= fixedBreakpoint);\n this.open = fixed\n && autoOpen >= 0\n && (containerWidth >= autoOpen && (autoClose === -1 || containerWidth < autoClose));\n this.fixed = fixed;\n },\n })\n .overrides({\n onResizeObserved(entry) {\n this._lastComputedInlineSize = entry.borderBoxSize[0]?.inlineSize;\n },\n })\n .events({\n '~touchstart'(event) {\n if (!event.touches.length) return;\n const { open, fixed, _isSideSheetRtl } = this;\n if (!open || fixed) return;\n let [{ clientX, pageX }] = event.touches;\n clientX ??= pageX - window.scrollX; // Safari\n this._dragStartX = _isSideSheetRtl\n ? window.innerWidth - clientX\n : clientX;\n this._dragDeltaX = 0;\n },\n '~touchmove'({ touches }) {\n if (!touches.length) return;\n const { open, fixed, _lastChildScrollTime, _dragStartX, _isSideSheetRtl } = this;\n if (!open || fixed || _dragStartX == null) return;\n if (_lastChildScrollTime && performance.now() - _lastChildScrollTime <= (SUPPORTS_SCROLLEND ? 5000 : 500)) {\n // Assume still scrolling\n return;\n }\n let [{ clientX, pageX }] = touches;\n clientX ??= pageX - window.scrollX; // Safari\n\n const delta = _isSideSheetRtl\n ? Math.min((window.innerWidth - clientX) - _dragStartX, 0)\n : Math.min((clientX - _dragStartX), 0);\n\n this._animationDuration = 0;\n this._dragDeltaX = delta;\n this._translateX = `${_isSideSheetRtl ? (-1 * delta) : delta}px`;\n },\n touchcancel: 'checkDragFinished',\n '~touchend': 'checkDragFinished',\n /** Scroll events do no bubble but can be captured, passively */\n '*~scroll'() {\n if (this.fixed) return;\n this.checkDragFinished();\n this._lastChildScrollTime = performance.now();\n // Wiping touch state\n this._dragStartX = null;\n this._dragDeltaX = null;\n },\n '*scrollend'() {\n if (this.fixed) return;\n this._lastChildScrollTime = null;\n },\n })\n .on({\n openChanged(previous, open) {\n // No longer using initial animation timing of 0\n this._animationDuration = open ? 250 : 200;\n this._translateX = open ? '0' : (this.inlineEnd ? '100%' : '-100%');\n this._animationEasing = open ? 'ease-in' : 'ease-out';\n this.checkForScrim(true);\n this.dispatchEvent(new Event('toggle'));\n },\n fixedChanged() {\n this._animationDuration = 0;\n this.checkForScrim(false);\n },\n constructed() {\n window.addEventListener('resize', this.onWindowResize.bind(this));\n },\n connected() {\n this.onWindowResize();\n },\n inlineEndChanged(previous, inlineEnd) {\n this._isSideSheetRtl = isRtl(this) ? !inlineEnd : inlineEnd;\n this._translateX = this.open ? '0' : (this.inlineEnd ? '100%' : '-100%');\n },\n })\n .css`\n :host {\n --mdw-bg: var(--mdw-color__surface-container-low);\n --mdw-ink: var(--mdw-color__on-surface-variant);\n\n position: fixed;\n\n inset-block: 0;\n inset-inline: 0 auto;\n\n display: inline-flex;\n\n overflow-y:auto;\n\n overscroll-behavior: none;\n overscroll-behavior: contain;\n\n box-sizing: border-box;\n block-size: 100vh;\n block-size: 100dvh;\n min-block-size: 100vh;\n min-block-size: 100dvh;\n max-block-size: 100%;\n\n max-inline-size: calc(100vw - 56px);\n grid-column: 1;\n\n transform: translateX(-100%);\n\n visibility: hidden;\n\n z-index: 24;\n\n background-color: rgb(var(--mdw-bg));\n color: rgb(var(--mdw-ink));\n\n transition: visibility 200ms;\n will-change: transform, margin-inline-start, margin-inline-end, visibility;\n }\n\n :host(:where([open])) {\n visibility: inherit;\n\n transition-delay: 0s;\n }\n\n :host(:where[inline-end]) {\n inset-inline: auto 0;\n\n transform: translateX(100%);\n }\n\n :host(:where([fixed])) {\n position: sticky;\n inset-inline: auto;\n\n max-inline-size: none;\n\n transform: none;\n z-index: auto;\n }\n\n :host(:where([inline-end][fixed])) {\n grid-column: 3;\n }\n `\n .autoRegister('mdw-side-sheet');\n", "import SideSheet from './SideSheet.js';\n\nexport default SideSheet\n .extend()\n .observe({\n shapeEnd: {\n type: 'boolean',\n empty: true,\n },\n autoOpen: {\n type: 'float',\n empty: 1248,\n },\n fixedBreakpoint: {\n type: 'float',\n empty: 1248,\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 --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:inline-block;\n\n inline-size: 360px;\n max-inline-size: calc(100vw - 56px);\n padding-inline: 12px;\n }\n\n ::slotted(mdw-divider) {\n padding-inline: 16px;\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 .recompose(({ html, refs: { badge } }) => {\n badge.replaceWith(html`<span id=\"badge-text\">{badge}</span>`);\n })\n .autoRegister('mdw-nav-drawer-item');\n", "import SideSheet from './SideSheet.js';\n\nexport default SideSheet\n .extend()\n .observe({\n align: { value: /** @type {'start'|'center'|'end'} */ (null) },\n autoOpen: {\n type: 'float',\n empty: 728,\n },\n autoClose: {\n type: 'float',\n empty: 1248,\n },\n fixedBreakpoint: {\n type: 'float',\n empty: 728,\n },\n })\n .recompose(({ html, refs: { slot } }) => {\n slot.before(html`<slot id=start name=start></slot>`);\n slot.setAttribute('align', '{align}');\n })\n .css`\n /* https://m3.material.io/components/navigation-rail/specs */\n\n :host{\n align-self: flex-start;\n\n display: inline-grid;\n align-content: flex-start;\n flex-direction: column;\n gap:0;\n grid-template-rows: auto minmax(auto,1fr);\n grid-template-columns: 100%;\n justify-items: stretch;\n overscroll-behavior: none;\n overscroll-behavior: contain;\n\n min-block-size: 0;\n\n text-align: center;\n }\n\n #start {\n display: flex;\n align-items: center;\n flex-direction: column;\n gap: 12px;\n justify-content: center;\n }\n\n #slot {\n align-self: center;\n\n display: flex;\n align-items: stretch;\n flex-direction: column;\n gap: 12px;\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 .autoRegister('mdw-nav-rail');\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(72px, 1fr);\n\n min-block-size: 56px;\n flex: none;\n padding-inline: 4px;\n\n font: var(--mdw-typescale__label-medium__font);\n letter-spacing: var(--mdw-typescale__label-medium__letter-spacing);\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/foundations/layout/applying-layout/window-size-classes */\n\nimport CustomElement from '../core/CustomElement.js';\nimport { ELEMENT_STYLE_TYPE } from '../core/customTypes.js';\nimport DelegatesFocusMixin from '../mixins/DelegatesFocusMixin.js';\nimport ResizeObserverMixin from '../mixins/ResizeObserverMixin.js';\n\nexport default CustomElement\n .extend()\n .mixin(DelegatesFocusMixin)\n .mixin(ResizeObserverMixin)\n .observe({\n paneOne: {\n value: /** @type {'fixed'|'flexible'} */ ('flexible'),\n },\n paneTwo: {\n value: /** @type {'fixed'|'flexible'|null} */ (null),\n },\n paneTwoActive: 'boolean',\n paneTwoBreakpoint: {\n type: 'float',\n empty: 720,\n },\n _lastComputedInlineSize: {\n type: 'float',\n nullable: false,\n },\n })\n .observe({\n _isMultipane({ _lastComputedInlineSize, paneTwo, paneTwoBreakpoint }) {\n return Boolean(paneTwo && _lastComputedInlineSize >= paneTwoBreakpoint);\n },\n })\n .observe({\n _styles: {\n ...ELEMENT_STYLE_TYPE,\n get({ _isMultipane, paneOne, paneTwoActive }) {\n if (_isMultipane) {\n return `:host{grid-template-columns:${paneOne === 'fixed' ? '360px' : '1fr'} ${this.paneTwo === 'fixed' ? '360px' : '1fr'}}`;\n }\n if (paneTwoActive) {\n return ':host{grid-template-columns:1fr 0}#slot{display:none}';\n }\n return ':host{grid-template-columns:1fr 0}#two{display:none}';\n },\n },\n })\n .html`\n <slot id=slot mutli-pane={_isMultipane}></slot>\n <slot id=two name=two mutli-pane={_isMultipane}></slot>\n `\n .css`\n :host {\n --mdw-pane__max-width: 1040px;\n --mdw-pane__margin-inline: 16px;\n --mdw-pane__padding-inline: max(var(--mdw-pane__margin-inline), calc((100% - var(--mdw-pane__max-width)) / 2));\n --mdw-pane__shape__size: 0;\n display: grid;\n column-gap: var(--mdw-page__margin);\n grid-auto-columns: 1fr;\n grid-auto-flow: column;\n\n block-size: 100%;\n\n padding: 0;\n\n font: var(--mdw-typescale__body-large__font);\n letter-spacing: var(--mdw-typescale__body-large__letter-spacing);\n }\n\n @media (min-width: 648px) {\n :host {\n --mdw-pane__margin-inline: 24px;\n }\n }\n\n @media (min-width: 728px) {\n :host {\n --mdw-pane__shape__size: var(--mdw-shape__large);\n }\n }\n\n #slot[multi-pane] {\n --mdw-pane__padding-inline: 24px;\n }\n\n #two[mutli-pane] {\n --mdw-pane__padding-inline: 0 24px;\n position: sticky;\n inset-block:0;\n\n display: block;\n\n overflow-y:auto;\n\n block-size: 100vh;\n block-size: 100dvh;\n }\n `\n .overrides({\n onResizeObserved(entry) {\n this._lastComputedInlineSize = entry.borderBoxSize[0]?.inlineSize;\n },\n })\n .autoRegister('mdw-page');\n", "import ShapeMixin from '../mixins/ShapeMixin.js';\n\nimport Box from './Box.js';\n\nexport default Box\n .extend()\n .mixin(ShapeMixin)\n .css`\n :host {\n --mdw-shape__size: var(--mdw-pane__shape__size, 0);\n --mdw-bg: var(--mdw-color__surface);\n --mdw-ink: var(--mdw-color__on-surface);\n background-color: rgb(var(--mdw-bg));\n color: rgb(var(--mdw-ink));\n \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 .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 .recompose(({ refs: { radio, rippleContainer, state } }) => {\n radio.append(state, rippleContainer);\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", "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 ??= window;\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", "/* https://m3.material.io/foundations/layout/applying-layout/window-size-classes */\n\nimport CustomElement from '../core/CustomElement.js';\nimport { ELEMENT_ANIMATION_TYPE } from '../core/customTypes.js';\nimport DelegatesFocusMixin from '../mixins/DelegatesFocusMixin.js';\nimport ScrollListenerMixin from '../mixins/ScrollListenerMixin.js';\n\nexport default CustomElement\n .extend()\n .mixin(ScrollListenerMixin)\n .mixin(DelegatesFocusMixin)\n .set({\n /** @type {ResizeObserver} */\n _bottomResizeObserver: null,\n })\n .html`\n <slot id=start name=start></slot>\n <div id=bottom>\n <slot id=bottom-slot name=bottom></slot>\n </div>\n <div id=bottom-fixed>\n <slot id=bottom-fixed-slot name=bottom-fixed></slot>\n </div>\n <slot id=slot></slot>\n <slot id=end name=end></slot>\n `\n .observe({\n _bottomHeight: { type: 'float', empty: 0 },\n _bottomOffsetY: { type: 'float', empty: 0 },\n _bottomDuration: { type: 'float', empty: 0 },\n _bottomEasing: { empty: 'ease-in' },\n })\n .observe({\n _sharedBottomStyle({ _bottomOffsetY, _bottomDuration, _bottomEasing, _bottomHeight }) {\n if (!_bottomHeight) return null;\n return {\n styles: {\n transform: `translateY(${_bottomOffsetY}px)`,\n },\n timing: {\n duration: _bottomDuration,\n easing: _bottomEasing,\n },\n };\n },\n })\n .observe({\n _bottomSlotStyle: {\n ...ELEMENT_ANIMATION_TYPE,\n get({ _sharedBottomStyle }) {\n if (!_sharedBottomStyle) return null;\n return {\n target: 'bottom-slot',\n ..._sharedBottomStyle,\n };\n },\n },\n _bottomFixedSlotStyle: {\n ...ELEMENT_ANIMATION_TYPE,\n get({ _sharedBottomStyle }) {\n if (!_sharedBottomStyle) return null;\n return {\n target: 'bottom-fixed-slot',\n ..._sharedBottomStyle,\n };\n },\n },\n })\n .on({\n _scrollListenerPositionYChanged(oldValue, newValue) {\n const delta = newValue - oldValue;\n\n this._bottomDuration = 0;\n // 0 if disabled or has scrolled upto element\n // Valid range : 0 > x > (100% - required)\n const bottomStartsAt = (document.documentElement.scrollHeight - window.innerHeight - 1);\n const distanceFromBottom = bottomStartsAt - newValue;\n const scrollVisible = this._bottomHeight - distanceFromBottom;\n let mustIncludeSpace = 0;\n if (scrollVisible > 0) {\n mustIncludeSpace = scrollVisible;\n }\n\n this._bottomOffsetY = (newValue === 0 || distanceFromBottom < 0)\n ? 0\n : Math.max(0, Math.min(\n this._bottomOffsetY + delta,\n this._bottomHeight - mustIncludeSpace,\n ));\n },\n _scrollListenerLastIdleChanged() {\n const { _bottomHeight, _bottomOffsetY } = this;\n const visibility = (_bottomHeight - _bottomOffsetY) / _bottomHeight;\n if (visibility <= 0) return;\n if (visibility >= 1) return;\n if (visibility < 0.5) {\n const bottomStartsAt = (document.documentElement.scrollHeight - window.innerHeight - 1);\n const { _scrollListenerPositionY } = this;\n const distanceFromBottom = bottomStartsAt - _scrollListenerPositionY;\n const scrollVisible = _bottomHeight - distanceFromBottom;\n\n if (_scrollListenerPositionY !== 0 && distanceFromBottom >= 0 && scrollVisible <= 0) {\n this._bottomDuration = 200;\n this._bottomEasing = 'ease-out';\n this._bottomOffsetY = _bottomHeight;\n return;\n }\n }\n\n // Reveal all\n this._bottomDuration = 250;\n this._bottomEasing = 'ease-in';\n this._bottomOffsetY = 0;\n },\n connected() {\n // eslint-disable-next-line no-multi-assign\n const observer = (this._bottomResizeObserver ??= new ResizeObserver((entries) => {\n for (const { borderBoxSize } of entries) {\n this._bottomHeight = borderBoxSize[0].blockSize;\n }\n }));\n observer.observe(this.refs.bottom);\n this.startScrollListener(window);\n },\n disconnected() {\n this._scrollListenerClear();\n this._bottomResizeObserver.unobserve(this.refs.bottom);\n },\n })\n .css`\n :host {\n position: relative;\n\n display: grid;\n grid-template:\n \"start top end\" auto\n \"start content end\" minmax(auto, 1fr)\n \"start bottom end\" auto\n / minmax(0px, auto) minmax(0px, 100%) minmax(0px, auto);\n\n min-block-size: 100vh;\n min-block-size: 100dvh;\n\n font: var(--mdw-typescale__body-large__font);\n letter-spacing: var(--mdw-typescale__body-large__letter-spacing);\n }\n\n #start {\n display: flex;\n grid-area: start;\n }\n\n #slot {\n display: block;\n grid-area: content;\n overflow-x: clip;\n\n }\n\n #end {\n display: none;\n\n grid-area: end;\n\n block-size: 0;\n }\n\n #bottom {\n position: sticky;\n inset-block-end: 0;\n\n display: block;\n grid-area: bottom;\n overflow-y: hidden;\n\n pointer-events: none;\n\n z-index: 1;\n }\n\n #bottom-slot {\n position: sticky;\n inset-block-end: 0;\n\n display: flex;\n /* Tab order flows from bottom-up */\n flex-direction: column-reverse;\n }\n\n #bottom-fixed {\n position: sticky;\n inset-block-end: 0;\n\n display: block;\n grid-area: bottom; /* Takes but does not dictate size of bottom area */\n\n pointer-events: none;\n\n z-index: 2;\n }\n\n #bottom-fixed-slot {\n position: absolute;\n inset-block-end: 100%;\n\n display: block;\n }\n `\n .autoRegister('mdw-root');\n", "import { ELEMENT_ANIMATION_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 _semiStickyTranslateY: { type: 'float', empty: 0 },\n _semiStickyDuration: { type: 'float', empty: 0 },\n _semiStickyEasing: { empty: 'ease-in' },\n _semiStickyMeasured: 'boolean',\n stickyAlways: 'boolean',\n /** Stick to offsetParent instead of window */\n stickyParent: 'boolean',\n })\n .methods({\n _refreshSemiStickyMetrics() {\n const styles = window.getComputedStyle(this);\n this._semiStickyHeight = this.offsetHeight\n + Number.parseFloat(styles.marginTop) + Number.parseFloat(styles.marginBottom);\n this._semiStickyOffsetY = Number.parseFloat(styles.marginTop);\n this._semiStickyMeasured = true;\n },\n })\n .observe({\n _semiStickyStyleStyle: {\n ...ELEMENT_ANIMATION_TYPE,\n get({\n _semiStickyMeasured, _semiStickyTranslateY, _semiStickyDuration, _semiStickyEasing,\n }) {\n if (!_semiStickyMeasured) return null;\n return {\n styles: {\n transform: `translateY(${_semiStickyTranslateY}px)`,\n },\n timing: {\n duration: _semiStickyDuration,\n easing: _semiStickyEasing,\n },\n };\n },\n },\n })\n .on({\n _scrollListenerPositionYChanged(oldValue, newValue) {\n const delta = newValue - oldValue;\n if (!this._semiStickyMeasured) {\n this._refreshSemiStickyMetrics();\n }\n this._semiStickyDuration = 0;\n // 0 if disabled or if has not scroll passed height\n // Valid range = -100% < x < 0\n this._semiStickyTranslateY = (this.stickyAlways || newValue < this._semiStickyOffsetY)\n ? 0\n : Math.min(Math.max(-this._semiStickyHeight, this._semiStickyTranslateY - delta), 0);\n },\n _scrollListenerLastIdleChanged() {\n if (this.stickyAlways) return;\n this._refreshSemiStickyMetrics();\n const offsetTop = this.offsetTop;\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 },\n connected() {\n this.startScrollListener(this.stickyParent ? this.offsetParent : window);\n },\n disconnected() {\n this._scrollListenerClear();\n },\n });\n}\n", "import CustomElement from '../core/CustomElement.js';\nimport { ELEMENT_ANIMATION_TYPE, ELEMENT_STYLE_TYPE } from '../core/customTypes.js';\nimport AriaToolbarMixin from '../mixins/AriaToolbarMixin.js';\nimport DelegatesFocusMixin from '../mixins/DelegatesFocusMixin.js';\nimport SemiStickyMixin from '../mixins/SemiStickyMixin.js';\nimport ShapeMixin from '../mixins/ShapeMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\n/**\n * Top App Bars should have a background-color that is identical to\n * `transparent`, though an explicit value allows updating the environment's\n * to match the app bar (eg: color system bar).\n *\n * Top corners are shaped when not scrolling to allow matching with pane, but\n * removed when raised\n */\n\nexport default CustomElement\n .extend()\n .mixin(ThemableMixin)\n .mixin(ShapeMixin)\n .mixin(AriaToolbarMixin)\n .mixin(SemiStickyMixin)\n .mixin(DelegatesFocusMixin)\n .observe({\n _raised: 'boolean',\n _headlineOpacity: { type: 'float', default: 0 },\n headline: 'string',\n size: { value: /** @type {'small'|'medium'|'large'|null} */ (null) },\n color: 'string',\n raisedColor: 'string',\n })\n .observe({\n _styles: {\n ...ELEMENT_STYLE_TYPE,\n get({ raisedColor }) {\n if (raisedColor) {\n return '#raised-background:where([raised])'\n + `{background-color:rgb(var(--mdw-color__${raisedColor}))`\n + '}';\n }\n },\n },\n _headlineStyle: {\n ...ELEMENT_ANIMATION_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 .expressions({\n _companionIf({ size }) {\n return size === 'medium' || size === 'large';\n },\n })\n .html`\n <div id=raised-background raised={_raised}></div>\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={_companionIf} 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 _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 .css`\n /* https://m3.material.io/components/bottom-app-bar/specs */\n :host {\n --mdw-bg: var(--mdw-color__surface);\n --mdw-ink: var(--mdw-color__on-surface);\n\n position: sticky;\n inset-block-start: 0;\n\n display: grid;\n\n align-items: center;\n gap: 12px;\n\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\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: var(--mdw-pane__padding-inline, 16px);\n\n pointer-events: auto;\n\n transform: translateY(0);\n z-index: 5;\n\n background-color: rgb(var(--mdw-bg));\n color: rgb(var(--mdw-ink));\n\n transition: grid-template-columns 100ms;\n will-change: transform;\n }\n\n #raised-background {\n position: absolute;\n inset: 0;\n\n z-index: -1;\n\n background-color: transparent;\n\n transition: background-color 200ms;\n }\n\n #raised-background:where([raised]) {\n background-color: rgb(var(--mdw-color__surface-container));\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 :host(:where([color=\"none\"], [color=\"transparent\"])),\n #companion:where([color=\"none\"], [color=\"transparent\"]) {\n background-color: transparent;\n }\n\n #companion[raised]:where([color=\"surface\"],[color=\"none\"],[color=\"transparent\"]) {\n background-color: rgb(var(--mdw-color__surface-container));\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 --mdw-shape__size: var(--mdw-shape__full);\n inset-block-start: 8px;\n\n display: flex;\n align-items: center;\n gap: 16px;\n\n margin-block: 16px;\n\n padding-inline: 16px;\n\n background-color: rgb(var(--mdw-bg));\n }\n\n #leading:not([slotted]),\n #trailing:not([slotted]) {\n display: none;\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 .recompose(({ refs: { companion, headline, input } }) => {\n companion.remove();\n headline.replaceWith(input);\n })\n .autoRegister('mdw-search');\n", "import './Icon.js';\n\nimport Button from './Button.js';\n\n/* https://m3.material.io/components/segmented-buttons/specs */\n\nexport default Button\n .extend()\n .observe({\n type: { empty: 'radio' },\n innerSegmentedButton: 'boolean',\n })\n .set({\n outlined: true,\n focusableOnDisabled: true,\n })\n .recompose(({ html, inline, refs: { icon, outline, control, slot, state } }) => {\n slot.before(html`\n <div id=icons>\n ${icon}\n <mdw-icon selected={checked} id=check-icon aria-hidden=true icon=check variation=filled></mdw-icon>\n </div>\n `);\n\n icon.removeAttribute('mdw-if');\n icon.setAttribute('has-icon', '{hasIcon}');\n icon.setAttribute('selected', '{checked}');\n outline.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 .css`\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 z-index: -1;\n }\n\n #outline[shape-end] {\n inset-inline-end: 0;\n }\n\n #outline[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 block-size: 100%;\n\n margin: 0;\n\n opacity: 0;\n\n font-size: 18px;\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 #outline[disabled][selected] {\n background-color: rgba(var(--mdw-color__on-surface), 0.12);\n }\n `\n .autoRegister('mdw-segmented-button');\n", "import 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 .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 align-items: stretch;\n flex-direction: row;\n justify-content: initial;\n overflow-x: auto;\n overflow-y: hidden;\n\n box-sizing: border-box;\n min-inline-size: 100%;\n flex:none;\n }\n\n :host([color]) {\n background-color: transparent;\n }\n\n #slot {\n display: grid;\n grid-auto-columns: 1fr;\n grid-auto-flow: column;\n\n flex: none;\n }\n\n `\n .on({\n constructed() {\n this.updateAriaProperty('ariaOrientation', '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 .recompose(({ template, refs: { slot, prefix, suffix, control } }) => {\n control.setAttribute('icon', '{icon}');\n template.append(slot);\n prefix.remove();\n suffix.remove();\n })\n .on({\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 { addGlobalCss } from '../core/css.js';\n\nlet globalStylesLoaded = false;\n\n/** @return {void} */\nexport function loadGlobalStyles() {\n if (globalStylesLoaded) return;\n addGlobalCss('html[dir=\"rtl\"]{--mdw-dir: -1;}');\n globalStylesLoaded = true;\n}\n", "import CustomElement from '../core/CustomElement.js';\nimport { SAFARI_VERSION, isFocused, isRtl } from '../core/dom.js';\nimport InputMixin from '../mixins/InputMixin.js';\nimport StateMixin from '../mixins/StateMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\nimport { loadGlobalStyles } from '../services/rtl.js';\n\nloadGlobalStyles();\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 _valueAsText: { nullable: false },\n thumbLabel: {\n type: 'string',\n reflect: 'read',\n },\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._valueAsText = roundedValue.toString(10);\n if (isTouch && SAFARI_VERSION) {\n // Safari does not update input when drag wasn't initiated at thumb\n if (event.type === 'touchstart') {\n // Default touch action on Safari is to magnify when on track\n event.preventDefault();\n }\n const { _input } = this;\n if (_input.valueAsNumber !== roundedValue) {\n _input.valueAsNumber = roundedValue;\n this.dispatchEvent(new Event('input', { bubbles: true, composed: true }));\n }\n }\n\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 (isFocused(/** @type {Element} */ (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 if (event.type === 'click') {\n event.preventDefault();\n }\n input.valueAsNumber = this._roundedValue;\n this._value = input.value;\n if (this._lastDispatchedChangeValue !== this._value) {\n this._lastDispatchedChangeValue = this._value;\n this.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 touchstart: 'onControlMouseOrTouch',\n '~touchmove': 'onControlMouseOrTouch',\n '~touchleave': 'onControlMouseOrTouch',\n '~touchcancel': 'onControlMouseOrTouch',\n '~touchend': 'onControlMouseOrTouch',\n touchend: 'onControlFinish',\n click: 'onControlFinish',\n '~change'(event) {\n // Change event will be rethrown by ControlMixin\n // Track value to avoid double dispatch\n if (this._lastDispatchedChangeValue === this._value) {\n event.stopPropagation();\n }\n this._lastDispatchedChangeValue = this._value;\n },\n },\n })\n .expressions({\n computeTrackStyle({ ticks, _valueAsText, min, max }) {\n return [\n ticks ? `--ticks:${ticks}` : null,\n `--value:${valueAsFraction(_valueAsText, min, max)}`,\n ].filter(Boolean).join(';') || null;\n },\n _thumbLabelHidden({ _isHoveringThumb, focusedState }) {\n return (!_isHoveringThumb && !focusedState);\n },\n _computedThumbLabel({ thumbLabel, _valueAsText }) {\n return thumbLabel ?? _valueAsText;\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={_computedThumbLabel}></div>\n </div>\n </div>\n `\n .recompose(({ refs: { thumb, state, control } }) => {\n thumb.append(state);\n control.removeAttribute('aria-labelledby');\n })\n .on({\n valueChanged(oldValue, newValue) {\n this._valueAsText = 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 #control[disabled] {\n cursor: not-allowed;\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 color: rgb(var(--mdw-bg));\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: currentColor;\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: color 100ms, 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: 2px;\n\n background-clip: content-box;\n background-image: radial-gradient(circle at 1px, currentColor 0, currentColor 1px, transparent 0);\n background-position: -1px 50%;\n background-repeat: repeat-x;\n background-size: calc(100% / (var(--ticks, 0) + 1)) 2px;\n }\n\n #ticks::before {\n color: rgb(var(--mdw-color__on-surface-variant));\n }\n\n #ticks::after {\n /* TODO: Use single-paint implementation */\n padding-inline-end: calc(100% - (100% * var(--value)) + 10px);\n\n z-index: 1;\n\n color: rgb(var(--mdw-ink));\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: currentColor;\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 box-sizing: border-box;\n\n min-block-size: 28px;\n min-inline-size: 28px;\n padding: 4px;\n\n z-index: 1;\n\n background-color: rgb(var(--mdw-bg));\n border-radius: 14px;\n color: rgb(var(--mdw-ink));\n }\n\n #thumb-label::after {\n /* Values from Figma SVG */\n --x-start: 4.1005px; /*4.1005px*/\n --x-end: calc(100% - 4.1005px);\n --y: calc(100% - 9.9584px); /*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: currentColor;\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 CustomElement from '../core/CustomElement.js';\nimport { EVENT_HANDLER_TYPE } from '../core/customTypes.js';\nimport AriaReflectorMixin from '../mixins/AriaReflectorMixin.js';\nimport DensityMixin from '../mixins/DensityMixin.js';\nimport ElevationMixin from '../mixins/ElevationMixin.js';\nimport ShapeMixin from '../mixins/ShapeMixin.js';\nimport ThemableMixin from '../mixins/ThemableMixin.js';\n\nimport './Button.js';\nimport './IconButton.js';\n\nexport default CustomElement\n .extend()\n .mixin(ThemableMixin)\n .mixin(ShapeMixin)\n .mixin(DensityMixin)\n .mixin(AriaReflectorMixin)\n .mixin(ElevationMixin)\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><slot id=slot></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 .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-bg: var(--mdw-color__inverse-surface);\n --mdw-ink: var(--mdw-color__inverse-on-surface);\n --mdw-type__line-height: var(--mdw-typescale__body-medium__line-height);\n\n display: flex;\n align-items: center;\n\n grid-area: snackbar;\n\n padding-inline: 16px; \n\n pointer-events: auto;\n\n filter: var(--mdw-elevation__drop-shadow__3);\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: 22;\n\n background-color: rgb(var(--mdw-bg));\n color: rgb(var(--mdw-ink));\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: inherit;\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 CustomElement from '../core/CustomElement.js';\nimport DelegatesFocusMixin from '../mixins/DelegatesFocusMixin.js';\n\nexport default CustomElement\n .extend()\n .mixin(DelegatesFocusMixin)\n .html`\n <slot id=slot></slot>\n `\n .css`\n :host {\n display: grid;\n align-items: flex-end;\n grid-template:\n \"snackbar\" auto\n / minmax(auto, 60ch);\n \n justify-content: center;\n\n margin: 16px;\n\n pointer-events: none;\n\n }\n\n @media (min-width: 648px) {\n :host {\n grid-template-columns: minmax(auto, 1fr);\n\n margin: 24px;\n }\n }\n\n @media (min-width: 1248px) {\n :host {\n grid-template-columns: minmax(auto, 60ch);\n justify-content: flex-start;\n }\n }\n\n `\n .autoRegister('mdw-snackbar-container');\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';\nimport { loadGlobalStyles } from '../services/rtl.js';\n\nloadGlobalStyles();\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 iconVariation({ selected }) {\n return selected ? 'filled' : null;\n },\n })\n .html`\n <div id=track selected={checked} disabled={disabled}>\n <div id=thumb selected={checked} pressed={pressed} disabled={disabled}>\n <mdw-box block id=thumb-shape selected={checked} pressed={pressed} hovered={hovered} focused={focused} icon={hasIcon}\n color={_thumbColor} active={_active} ink={_thumbInk} disabled={disabled}></mdw-box>\n <mdw-icon ink={_iconInk} class=icon id=icon src={src} selected={checked} icon={icon} variation={iconVariation}></mdw-icon>\n <mdw-icon ink={_iconInk} class=icon id=selected-icon src={selectedIconSrc} selected={checked} icon={selectedIcon} variation=filled></mdw-icon>\n <mdw-icon ink={_iconInk} class=icon id=unselected-icon src={unselectedIconSrc} selected={checked} icon={unselectedIcon}></mdw-icon>\n <slot id=slot selected={checked}></slot>\n </div>\n </div>\n `\n .recompose(({ refs: { outline } }) => {\n outline.removeAttribute('mdw-if');\n outline.setAttribute('selected', '{checked}');\n outline.setAttribute('errored', '{errored}');\n outline.setAttribute('disabled', '{disabled}');\n })\n .on({\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 border-radius: inherit;\n }\n\n #track[selected] {\n background-color: rgb(var(--mdw-bg));\n }\n\n #track[disabled] {\n background-color: rgba(var(--mdw-color__surface-container-highest), calc(0.12/0.38));\n }\n\n #track[disabled][selected] {\n background-color: rgba(var(--mdw-color__on-surface), calc(0.12/0.38));\n }\n\n #outline {\n border-width: 2px;\n\n z-index: 1;\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: rgba(var(--mdw-color__on-surface), calc(0.12/0.38));\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 border-radius: inherit;\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 border-radius:inherit;\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-shape[disabled] {\n background-color: rgb(var(--mdw-color__on-surface));\n }\n\n #thumb-shape[disabled][selected] {\n background-color: rgb(var(--mdw-color__surface));\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\n #unselected-icon[selected] {\n opacity: 0;\n }\n\n #selected-icon[selected] {\n opacity: 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 .recompose(({ refs: { switch: switchEl, state, control } }) => {\n switchEl.append(state, control);\n control.setAttribute('role', 'switch');\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 { CHROME_VERSION } from '../core/dom.js';\nimport DelegatesFocusMixin from '../mixins/DelegatesFocusMixin.js';\nimport HyperlinkMixin from '../mixins/HyperlinkMixin.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 .mixin(HyperlinkMixin)\n .mixin(DelegatesFocusMixin)\n .define({\n stateTargetElement() { return this.refs.anchor; },\n })\n .set({\n stateLayer: true,\n })\n .observe({\n active: 'boolean',\n icon: 'string',\n src: 'string',\n ariaLabel: 'string',\n })\n .methods({\n /** @type {HTMLElement['focus']} */\n focus(options) {\n this.refs.anchor.focus(options);\n },\n computeLabelMetrics() {\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 .expressions({\n anchorAriaControls({ href }) {\n return href?.startsWith('#') ? href.slice(1) : null;\n },\n anchorAriaSelected({ active }) {\n return `${active}`;\n },\n anchorAriaDisabled({ disabledState }) {\n return `${disabledState}`;\n },\n anchorHref({ href }) {\n return href ?? '#';\n },\n iconIf({ icon, src }) {\n return icon || src;\n },\n iconVariation({ active }) {\n return active ? 'filled' : null;\n },\n })\n .html`\n <mdw-icon mdw-if={iconIf} id=icon aria-hidden=true src={src} active={active} icon={icon} variation={iconVariation}></mdw-icon>\n <slot id=slot></slot>\n `\n .recompose(({ refs: { anchor, icon, slot, state } }) => {\n anchor.setAttribute('role', 'tab');\n anchor.setAttribute('aria-label', '{ariaLabel}');\n anchor.setAttribute('aria-controls', '{anchorAriaControls}');\n anchor.setAttribute('aria-selected', '{anchorAriaSelected}');\n anchor.setAttribute('aria-disabled', '{anchorAriaDisabled}');\n anchor.setAttribute('disabled', '{disabledState}');\n anchor.append(icon, slot);\n state.setAttribute('state-disabled', 'focus');\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 /** @type {HTMLElement} */\n const el = root.querySelector(href);\n if (!el) {\n console.warn('Unknown element', href);\n return;\n }\n event.preventDefault();\n // Chrome does not support scrolling two elements at the same time\n // https://bugs.chromium.org/p/chromium/issues/detail?id=1430426\n const behavior = CHROME_VERSION ? 'instant' : 'smooth';\n\n el.scrollTo({ top: 0, behavior });\n el.offsetParent.scrollTo({\n // Scroll-snap will adjust with subpixel precision\n left: el.offsetLeft,\n behavior: 'smooth',\n });\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 flex: none;\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 }\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 #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 SemiStickyMixin from '../mixins/SemiStickyMixin.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 .mixin(SemiStickyMixin)\n .observe({\n scrollable: 'boolean',\n })\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 * tab: InstanceType<Tab>,\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: 'string',\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 if (!(tab instanceof Tab)) {\n customElements.upgrade(tab);\n }\n return {\n left: tab.offsetLeft,\n width: tab.offsetWidth,\n right: tab.offsetLeft + tab.offsetWidth,\n center: tab.offsetLeft + (tab.offsetWidth / 2),\n label: tab.computeLabelMetrics(),\n tab,\n index,\n };\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 searchForTabContent() {\n const { tabContentId, isConnected } = this;\n if (!tabContentId) return;\n if (!isConnected) return;\n this.tabContent = this.getRootNode().getElementById(tabContentId);\n },\n /** @param {InstanceType<Tab>} [tab] */\n updateIndicatorByTab(tab) {\n tab ??= this.selectedItem ?? this.tabs.item(0);\n const metrics = this.tabMetrics.find((m) => m.tab === tab);\n if (!metrics) return;\n const width = this.secondary ? metrics.width : metrics.label.width;\n const position = this.secondary ? metrics.left : metrics.left + metrics.label.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 = leftMetrics.tab;\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.tabMetrics[activeIndex].tab;\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} scrollable={scrollable}></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 constructed() {\n document.addEventListener('DOMContentLoaded', () => this.searchForTabContent(), { once: true });\n },\n connected() {\n this.searchForTabContent();\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 tabContentIdChanged() {\n this.searchForTabContent();\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 this.searchForTabContent();\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-bg: 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 z-index: 4;\n\n color: inherit;\n\n text-align: center;\n\n will-change: transform;\n }\n\n :host(:where([color])) {\n background-color: rgb(var(--mdw-bg));\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 display: flex;\n justify-content: initial;\n }\n\n #slot[scrollable] {\n display: inline-flex;\n\n inline-size: 0;\n flex: 1;\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: inherit !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._panelMetrics = null;\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 onResizeObserved() {\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 .recompose(({ refs: { control } }) => {\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 .on({\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 #icon {\n margin-inline-end: 16px;\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 Display from './Display.js';\n\nexport default Display\n .extend()\n .set({\n _baseAriaLevel: 7,\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"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["theme_exports", "__export", "PALETTES", "TYPE_STYLES", "generateColorCSS", "generateShapeCSS", "generateThemeCSS", "generateTypographyCSS", "generateTypographyGlobalCSS", "setupTheme", "themeOptionsFromSearchParams", "COLOR_KEYWORDS", "CIRCLE_PATH", "DIAMOND_PATH", "SQUIRCLE_PATH", "SHAPE_ROUNDED_DEFAULT", "CIRCLE_PATH", "SHAPE_CUT_DEFAULT", "DIAMOND_PATH", "SHAPE_SQUIRCLE_DEFAULT", "SQUIRCLE_PATH", "TYPOGRAPHY_DEFAULT", "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", "_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", "Cam16", "_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", "_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", "_TonalPalette", "argb", "hct", "Hct", "hue", "chroma", "#cache", "tone", "CorePalette", "_CorePalette", "#createPaletteFromColors", "content", "colors", "palette", "p", "argb", "isContent", "hct", "Hct", "hue", "chroma", "TonalPalette", "Scheme", "_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", "PALETTES", "TYPE_STYLES", "getShapeMaskSVG", "shape", "getShapeCornerSVGs", "corner", "convex", "path", "getShapeEdgesSVGs", "generateTypographyCSS", "config", "TYPOGRAPHY_DEFAULT", "generateTypographyGlobalCSS", "style", "size", "generateShapeCSS", "SHAPE_ROUNDED_DEFAULT", "svgToCSSURL", "addStyle", "content", "element", "generateColorCSS", "color", "custom", "lightness", "parsedColors", "name", "hex", "COLOR_KEYWORDS", "scheme", "getScheme", "setupTheme", "themeOptionsFromSearchParams", "searchParams", "c", "generateThemeCSS", "shapeCss", "typographyCss", "colorCss", "import_meta", "currentSearchParams", "getCurrentSearchParams", "url", "PALETTES", "getCurrentSearchParams", "c", "cssStyleSheetsCache", "createCSSStyleSheet", "content", "useCache", "sheet", "styleElementCache", "_inactiveDocument", "createHTMLStyleElement", "style", "_cssStyleSheetConstructable", "createCSS", "generateCSSStyleSheets", "styles", "styleElementFromStyleSheetCache", "generateHTMLStyleElements", "styleElement", "r", "css", "array", "substitutions", "addGlobalCss", "compiled", "addGlobalCss", "generateThemeCSS", "themeOptionsFromSearchParams", "getCurrentSearchParams", "generateTypographyGlobalCSS", "BLANK_TEXT", "BLANK_COMMENT", "createEmptyTextNode", "BLANK_TEXT", "createEmptyComment", "BLANK_COMMENT", "CompositionAdapter", "options", "changes", "data", "_a", "domNode", "index", "metadata", "key", "newIndex", "change", "skipOnMatch", "metadataAtIndex", "currentKey", "sameKey", "isPartial", "metadataCache", "failedFastPath", "oldIndex", "previousMetadata", "correctMetadata", "domNodeToRemove", "render", "element", "startIndex", "length", "comment", "createEmptyComment", "attrValueFromDataValue", "value", "attrNameFromPropNameCache", "attrNameFromPropName", "name", "match", "_a", "CHROME_VERSION", "FIREFOX_VERSION", "SAFARI_VERSION", "isFocused", "element", "attemptFocus", "options", "isRtl", "jsonMergePatch_exports", "__export", "applyMergePatch", "buildMergePatch", "hasMergePatch", "target", "patch", "key", "value", "previous", "current", "arrayStrategy", "index", "changes", "previousKeys", "emptyFromType", "type", "buildProxy", "proxyTarget", "set", "deepSet", "prefix", "target", "p", "value", "arg", "defaultParserFromType", "v", "o", "observeFunction", "fn", "args", "thisPoked", "thisPokedDeep", "argWatchers", "poked", "pokedDeep", "proxy", "thisProxy", "defaultValue", "watcher", "reusable", "deepPropString", "parseObserverOptions", "name", "typeOrOptions", "object", "options", "watchers", "readonly", "empty", "enumerable", "reflect", "attr", "nullable", "parser", "nullParser", "get", "is", "diff", "props", "observeResult", "parsed", "attrNameFromPropName", "a", "b", "hasMergePatch", "buildMergePatch", "detectChange", "config", "oldValue", "value", "_a", "_b", "newValue", "changes", "defineObservableProperty", "object", "key", "options", "parseObserverOptions", "internalGet", "internalSet", "onInvalidate", "prop", "cachedGet", "cachedSet", "descriptor", "generatedUIDs", "generateUID", "prefix", "n", "id", "_inactiveDocument", "_blankFragment", "_fragmentRange", "generateFragment", "fromString", "inlineFunctions", "addInlineFunction", "fn", "internalName", "generateUID", "fragmentCache", "html", "strings", "substitutions", "tempSlots", "replacements", "sub", "tempId", "compiledString", "fragment", "id", "element", "writeDOMAttribute", "nodes", "value", "nodeIndex", "attrName", "element", "writeDynamicNode", "nodeStates", "comments", "commentIndex", "nodeState", "hidden", "comment", "createEmptyComment", "node", "isDynamicNode", "textNode", "writeDOMElementAttachedState", "show", "writeDOMHideNodeOnInit", "executeSearch", "search", "args", "caches", "searchStates", "cacheIndex", "searchIndex", "subSearch", "invocation", "cachedValue", "searchState", "result", "subResult", "searchWithExpression", "context", "store", "injections", "changes", "data", "searchWithProp", "state", "searchWithDeepProp", "scope", "prop", "STRING_INTERPOLATION_REGEX", "propFromObject", "prop", "source", "deepPropFromObject", "nameArray", "scope", "valueFromPropName", "value", "child", "compositionCache", "Composition", "_Composition", "parts", "generateFragment", "part", "cache", "comp", "index", "composition", "listener", "key", "events", "#bindCompositionEventListeners", "tag", "target", "context", "_a", "event", "changes", "data", "options", "instanceFragment", "shadowRoot", "initState", "nodes", "refs", "searchStates", "caches", "textNodes", "textNode", "element", "currentIndex", "action", "draw", "ranSearch", "actions", "dirty", "executeSearch", "_b", "search", "result", "#interpolateNode", "node", "parsedValue", "nodeValue", "nodeName", "nodeType", "attr", "text", "trimmed", "length", "segments", "STRING_INTERPOLATION_REGEX", "segment", "newNode", "createEmptyTextNode", "query", "negate", "doubleNegate", "isEvent", "textNodeIndex", "prev", "hyphenIndex", "#tagElement", "eventType", "flags", "type", "handleEvent", "deepProp", "inlineFunctions", "parsedProps", "subquery", "isSubquery", "subSearch", "expression", "propsUsed", "deepPropsUsed", "defaultValue", "invocation", "inlineFunctionOptions", "searchWithExpression", "observeResult", "observeFunction", "uniqueProps", "uniqueDeepProps", "deepPropString", "searchWithProp", "searchWithDeepProp", "subnode", "nodeEntry", "writeDynamicNode", "writeDOMAttribute", "writeDOMElementAttachedState", "writeDOMHideNodeOnInit", "id", "generateUID", "#interpolateIterable", "forAttr", "valueName", "iterableName", "elementAnchor", "newComposition", "injections", "state", "instanceAnchorElement", "anchorNode", "createEmptyComment", "CompositionAdapter", "adapter", "iterable", "changeList", "innerChanges", "needTargetAll", "isArray", "iterator", "change", "resource", "treeWalker", "idAttr", "nextNode", "generateCSSStyleSheets", "generateHTMLStyleElements", "n", "actionsByPropsUsed", "cloneAttributeCallback", "name", "target", "oldValue", "newValue", "element", "CustomElement", "_CustomElement", "#composition", "Composition", "collection", "callback", "parts", "composition", "array", "substitutions", "css", "elementName", "strings", "html", "customExtender", "source", "options", "value", "symbol", "mixin", "typeOrOptions", "config", "defineObservableProperty", "changedCallback", "attr", "reflect", "watchers", "changes", "props", "propWatchers", "watcher", "index", "listeners", "key", "listenerOptions", "flags", "type", "prop", "deepProp", "parsedProps", "listenerMap", "tag", "attrNameFromPropName", "nameOrCallbacks", "callbacks", "fn", "arrayPropName", "entries", "propChangedCallbacks", "attributeChangedCallbacks", "#refsProxy", "#refsCache", "#refsCompositionCache", "args", "_propChangedCallbacks", "attrList", "cacheEntry", "previousDataValue", "parsedValue", "#template", "_a", "propList", "needsWrite", "attributeCache", "stringValue", "attrValueFromDataValue", "patch", "applyMergePatch", "formattedTag", "tagIndex", "addInlineFunction", "DensityMixin", "Base", "ShapeMixin", "Base", "colorAttributeCSS", "PALETTES", "palette", "inkAttributeCSS", "typeStyleAttributeCSS", "TYPE_STYLES", "typeStyle", "ThemableMixin", "Base", "Badge_default", "CustomElement", "ThemableMixin", "DensityMixin", "ShapeMixin", "DelegatesFocusMixin", "Base", "CHROME_VERSION", "BaseClass", "value", "isFocused", "listener", "e", "type", "parseSize", "input", "TypographyMixin", "Base", "DelegatesFocusMixin", "textPaddingTop", "textPadding", "textPaddingBottom", "textLeading", "_computedTextPaddingTop", "_computedTextLeading", "_computedTextPaddingBottom", "content", "slot", "FlexableMixin", "Base", "Box_default", "CustomElement", "ThemableMixin", "FlexableMixin", "Body_default", "Box_default", "TypographyMixin", "AriaReflectorMixin", "Base", "name", "attrName", "value", "oldValue", "newValue", "key", "DEFAULT_ELEMENT_QUERY", "KeyboardNavMixin", "Base", "AriaReflectorMixin", "current", "first", "candidate", "attemptFocus", "loop", "reverse", "foundCurrent", "array", "isFocused", "options", "currentlyFocusedChild", "currentTabIndexChild", "firstFocusableChild", "child", "event", "currentItem", "item", "isRtl", "AriaToolbarMixin", "Base", "AriaReflectorMixin", "KeyboardNavMixin", "ElevationMixin", "Base", "Surface_default", "CustomElement", "ThemableMixin", "FlexableMixin", "ElevationMixin", "ShapeMixin", "BottomAppBar_default", "Surface_default", "AriaToolbarMixin", "EVENT_HANDLER_TYPE", "v", "name", "oldValue", "newValue", "button", "fn", "eventName", "queuedPropsByElement", "previousAnimationsByElement", "elementStylerMicrotaskCallback", "name", "previousAnimations", "previousAnimation", "queuedProps", "initial", "value", "target", "styles", "timing", "currentAnimation", "pendingResizeCallbacks", "pendingConnections", "entries", "callbacks", "callback", "ELEMENT_ANIMATION_TYPE", "oldValue", "newValue", "styleReferences", "useAdoptedStyleSheets", "ELEMENT_STYLE_TYPE", "key", "rule", "attrNameFromPropName", "mapOfStyles", "styleElement", "resizeObserver", "entries", "entry", "ResizeObserverMixin", "Base", "previous", "enabled", "_a", "lastInteractionWasTouch", "StateMixin", "Base", "disabled", "_hovered", "hovered", "_focused", "focused", "_keyPressed", "_pointerPressed", "pressed", "_lastInteraction", "event", "Scrim_default", "CustomElement", "SUPPORTS_SCROLLEND", "dragHandleEvent", "CustomElement", "StateMixin", "container", "state", "event", "BottomSheet_default", "ThemableMixin", "FlexableMixin", "ShapeMixin", "AriaReflectorMixin", "DelegatesFocusMixin", "ResizeObserverMixin", "EVENT_HANDLER_TYPE", "ELEMENT_ANIMATION_TYPE", "open", "modal", "_lastComputedBlockSize", "_translateY", "_animationDuration", "_animationEasing", "animate", "_scrim", "Scrim_default", "_dragStartY", "_dragDeltaY", "_lastOffsetTop", "containerHeight", "min", "visibility", "source", "isTouch", "touches", "_lastChildScrollTime", "_dragTimestamp", "expanded", "clientY", "pageY", "delta", "entry", "_a", "previous", "y", "svgAlias_exports", "__export", "addSVGAlias", "svgAliasMap", "unaliased", "name", "path", "viewBox", "documentLoadedStyleSheets", "Icon_default", "CustomElement", "ThemableMixin", "icon", "variation", "iconName", "suffix", "aliasName", "svgAliasMap", "unaliased", "svgPath", "_svgAlias", "viewBox", "svg", "_computedSVGPath", "src", "currentTarget", "href", "parentNode", "link", "BaseClass", "width", "height", "NavigationListenerMixin", "Base", "event", "target", "buildHyperlinkDefinition", "name", "value", "href", "url", "HyperlinkMixin", "Base", "NavigationListenerMixin", "FORM_IPC_EVENT", "DOMString", "FormAssociatedMixin", "Base", "_invalid", "_userInteracted", "_defaultValue", "value", "type", "checked", "_valueBehavior", "_value", "v", "_checkedDirty", "defaultChecked", "_checked", "_formDisabled", "disabled", "error", "key", "_a", "newTarget", "form", "event", "name", "state", "mode", "CHROME_VERSION", "elementInternals", "_files", "fd", "entry", "formData", "option", "previous", "current", "ControlMixin", "Base", "FormAssociatedMixin", "DelegatesFocusMixin", "value", "control", "options", "validityState", "newValidity", "key", "error", "ariaLabel", "_slotInnerText", "_computedAriaLabel", "template", "html", "element", "oldValue", "newValue", "cloneAttributeCallback", "currentTarget", "FIREFOX_VERSION", "SAFARI_VERSION", "event", "IMPLICIT_SUBMISSION_BLOCKING_TYPES", "DOMString", "redispatchedClickEvents", "rootClickEvents", "InputMixin", "Base", "ControlMixin", "_indeterminate", "value", "control", "previous", "current", "oldValue", "newValue", "input", "cloneAttributeCallback", "checked", "event", "form", "defaultButton", "submissionBlockers", "element", "newEvent", "_a", "_checkedDirty", "_checked", "type", "target", "duplicatedButton", "disabledState", "args", "Ripple_default", "CustomElement", "oldValue", "newValue", "ELEMENT_ANIMATION_TYPE", "_positionX", "_positionY", "_radius", "x", "y", "size", "hypotenuse", "offsetParent", "parentWidth", "parentHeight", "width", "height", "animationName", "RippleMixin", "Base", "_a", "element", "ripple", "x", "y", "hold", "rippleContainer", "Ripple_default", "event", "rect", "lastRipple", "oldValue", "pressed", "Button_default", "CustomElement", "ThemableMixin", "DensityMixin", "StateMixin", "ElevationMixin", "ShapeMixin", "RippleMixin", "InputMixin", "HyperlinkMixin", "value", "internalSet", "enumeratedValue", "icon", "svg", "src", "svgPath", "outlined", "options", "anchor", "control", "SUPPORTS_INERT", "Card_default", "Box_default", "StateMixin", "ElevationMixin", "ShapeMixin", "FormAssociatedMixin", "AriaReflectorMixin", "DelegatesFocusMixin", "HyperlinkMixin", "EVENT_HANDLER_TYPE", "disabledState", "disabled", "actionable", "href", "anchor", "inertBlocker", "slot", "outline", "CheckboxIcon_default", "CustomElement", "ThemableMixin", "ShapeMixin", "value", "outline", "TouchTargetMixin", "Base", "Checkbox_default", "CustomElement", "ThemableMixin", "StateMixin", "RippleMixin", "InputMixin", "TouchTargetMixin", "indeterminate", "indeterminateIcon", "icon", "checked", "checkbox", "state", "rippleContainer", "Chip_default", "Button_default", "elevated", "inline", "slot", "outline", "icon", "ink", "iconInk", "Divider_default", "CustomElement", "ThemableMixin", "DialogActions_default", "CustomElement", "canAnchorPopup", "options", "pageX", "pageY", "directionX", "directionY", "pageWidth", "pageHeight", "clientX", "clientY", "anchor", "rect", "width", "height", "popup", "top", "right", "bottom", "left", "margin", "pageTop", "pageBottom", "pageLeft", "pageRight", "offsetX", "offsetY", "cssTop", "cssRight", "cssBottom", "cssLeft", "maxHeight", "maxWidth", "fullSize", "visibility", "supportsHTMLDialogElement", "OPEN_POPUPS", "onWindowResize", "element", "onNavMouseDown", "event", "onPopState", "lastOpenPopup", "key", "cancelEvent", "onBeforeUnload", "PopupMixin", "Base", "DelegatesFocusMixin", "ResizeObserverMixin", "anchor", "flow", "layoutElement", "width", "height", "anchorOptions", "isPageRTL", "isRtl", "xStart", "xEnd", "preferences", "anchorResult", "preference", "result", "canAnchorPopup", "maxWidth", "maxHeight", "styles", "currentTarget", "hasContent", "node", "source", "focus", "scrim", "previousFocus", "newState", "scrollRestoration", "previousState", "returnValue", "returnFocus", "_a", "_b", "_c", "_d", "main", "attemptFocus", "len", "i", "entry", "open", "listTabbables", "root", "treeWalker", "focusables", "node", "el", "focusOnTree", "autofocus", "forward", "attemptFocus", "Dialog_default", "CustomElement", "ThemableMixin", "ShapeMixin", "PopupMixin", "currentTarget", "hasContent", "d", "dialog", "dialogInner", "content", "slot", "event", "tabbables", "focusNext", "focused", "cancelEvent", "activeElement", "_a", "form", "returnValue", "Display_default", "Box_default", "AriaReflectorMixin", "TypographyMixin", "ariaLevel", "size", "_baseAriaLevel", "oldValue", "newValue", "Tooltip_default", "CustomElement", "ThemableMixin", "ShapeMixin", "AriaReflectorMixin", "oldValue", "newValue", "TooltipTriggerMixin", "Base", "type", "timeout", "tooltip", "offsetParent", "cancelSchedule", "parent", "domRect", "anchorOptions", "isPageRTL", "xStart", "xEnd", "preferences", "anchorResult", "preference", "result", "canAnchorPopup", "args", "child", "check", "FIREFOX_VERSION", "event", "ctrlKey", "threshold", "entries", "entry", "previous", "current", "Fab_default", "Button_default", "TooltipTriggerMixin", "extended", "icon", "slot", "FabContainer_default", "CustomElement", "DelegatesFocusMixin", "ELEMENT_STYLE_TYPE", "hideBreakpoint", "FilterChip_default", "Chip_default", "trailingIcon", "dropdown", "trailingSrc", "checked", "icon", "control", "outline", "slot", "checkIcon", "Grid_default", "Box_default", "ResizeObserverMixin", "columns", "_autoColumns", "entry", "contentBoxSize", "inlineSize", "oldValue", "block", "grid", "ELEMENT_STYLE_TYPE", "_computedColumns", "slot", "Headline_default", "Display_default", "IconButton_default", "Button_default", "TooltipTriggerMixin", "type", "checked", "indeterminate", "outlined", "_isToggle", "event", "input", "icon", "control", "outline", "ELEMENT_STYLE_TYPE", "disabled", "filled", "TextFieldMixin", "Base", "DensityMixin", "ShapeMixin", "error", "_invalid", "_userInteracted", "filled", "outlined", "label", "placeholder", "erroredState", "supporting", "_validationMessage", "value", "_badInput", "shapeTop", "iconVariation", "html", "control", "outline", "state", "shape", "inline", "oldValue", "newValue", "Popup_default", "CustomElement", "ThemableMixin", "ElevationMixin", "ShapeMixin", "PopupMixin", "sharedPopup", "getSharedPopup", "Popup_default", "Input_default", "CustomElement", "ThemableMixin", "StateMixin", "InputMixin", "TextFieldMixin", "ResizeObserverMixin", "_listbox", "type", "event", "values", "option", "suggestionText", "suggestionValue", "relatedTarget", "_draftInput", "lowerCase", "ariaListbox", "shape", "popup", "currentInput", "inputElement", "_isSelect", "autocompleteInline", "_expanded", "autoSelect", "valueText", "selectionStart", "emitChange", "_suggestionText", "_suggestionValue", "_input", "multiple", "_values", "newArray", "first", "last", "next", "previous", "startsWith", "value", "label", "suggestion", "suggestionIndex", "current", "currentIndex", "backup", "backupIndex", "optionIndex", "element", "i", "currentValue", "foundOption", "prev", "currentTarget", "elementIndex", "listbox", "trailingIcon", "readOnly", "_hasListbox", "autocompleteList", "_focusedValue", "_badInput", "control", "labelText", "inline", "chips", "Base", "args", "InputChip_default", "Box_default", "ShapeMixin", "DelegatesFocusMixin", "HyperlinkMixin", "EVENT_HANDLER_TYPE", "icon", "svg", "src", "svgPath", "disabled", "readOnly", "closeButton", "previous", "current", "anchor", "slot", "outline", "Label_default", "Box_default", "TypographyMixin", "List_default", "Box_default", "DensityMixin", "AriaReflectorMixin", "ShapeMaskedMixin", "Base", "Shape_default", "CustomElement", "ShapeMaskedMixin", "RadioIcon_default", "CustomElement", "ThemableMixin", "ShapeMixin", "value", "outline", "ListItem_default", "CustomElement", "ThemableMixin", "StateMixin", "RippleMixin", "AriaReflectorMixin", "HyperlinkMixin", "disabled", "href", "iconVariation", "state", "rippleContainer", "anchor", "oldValue", "newValue", "currentTarget", "ListOption_default", "ListItem_default", "DelegatesFocusMixin", "_selectedDirty", "defaultSelected", "_selected", "value", "_formDisabled", "disabled", "_a", "formDisabled", "options", "_label", "iconVariation", "selected", "inline", "checkbox", "radio", "anchor", "state", "content", "disabledState", "icon", "previous", "current", "BaseClass", "text", "constructHTMLOptionsCollectionProxy", "host", "collection", "OptionConstructor", "GroupConstructor", "add", "element", "before", "beforeElement", "index", "remove", "_a", "i", "value", "target", "p", "receiver", "newValue", "currentSize", "Listbox_default", "List_default", "StateMixin", "FormAssociatedMixin", "KeyboardNavMixin", "DelegatesFocusMixin", "constructHTMLOptionsCollectionProxy", "ListOption_default", "selectedItem", "value", "itemToSelect", "option", "_a", "v", "newValue", "vString", "oldValue", "el", "index", "name", "event", "target", "sendUpdateNotifications", "Menu_default", "CustomElement", "ThemableMixin", "ElevationMixin", "ShapeMixin", "PopupMixin", "DensityMixin", "KeyboardNavMixin", "items", "submenuItems", "el", "_a", "value", "scrim", "args", "result", "firstItem", "attemptFocus", "cascader", "event", "menuItem", "subMenuId", "submenu", "MenuItem_default", "ListOption_default", "FormAssociatedMixin", "value", "event", "name", "trailingIcon", "cascades", "oldValue", "newValue", "isFocused", "inline", "html", "checkboxRef", "radioRef", "anchor", "trailing", "checkbox", "radio", "NavItem_default", "CustomElement", "ThemableMixin", "StateMixin", "RippleMixin", "HyperlinkMixin", "DelegatesFocusMixin", "args", "active", "ariaLabel", "href", "html", "anchor", "state", "rippleContainer", "key", "repeat", "Base", "NavBar_default", "CustomElement", "DelegatesFocusMixin", "ThemableMixin", "autoClose", "containerWidth", "event", "NavItem_default", "el", "NavBarItem_default", "NavItem_default", "SUPPORTS_SCROLLEND", "SideSheet_default", "CustomElement", "ThemableMixin", "FlexableMixin", "ElevationMixin", "ShapeMixin", "AriaReflectorMixin", "DelegatesFocusMixin", "ResizeObserverMixin", "EVENT_HANDLER_TYPE", "ELEMENT_STYLE_TYPE", "fixed", "fixedColor", "ELEMENT_ANIMATION_TYPE", "open", "_isSideSheetRtl", "_lastComputedInlineSize", "_translateX", "_animationDuration", "_animationEasing", "computedMargin", "animate", "_scrim", "Scrim_default", "_dragDeltaX", "visibility", "autoOpen", "fixedBreakpoint", "autoClose", "containerWidth", "entry", "_a", "event", "clientX", "pageX", "touches", "_lastChildScrollTime", "_dragStartX", "delta", "previous", "inlineEnd", "isRtl", "NavDrawer_default", "SideSheet_default", "NavDrawerItem_default", "NavItem_default", "html", "badge", "NavRail_default", "SideSheet_default", "html", "slot", "NavRailItem_default", "NavItem_default", "Page_default", "CustomElement", "DelegatesFocusMixin", "ResizeObserverMixin", "_lastComputedInlineSize", "paneTwo", "paneTwoBreakpoint", "ELEMENT_STYLE_TYPE", "_isMultipane", "paneOne", "paneTwoActive", "entry", "_a", "Pane_default", "Box_default", "ShapeMixin", "Progress_default", "CustomElement", "ThemableMixin", "value", "max", "oldValue", "newValue", "Radio_default", "CustomElement", "ThemableMixin", "StateMixin", "RippleMixin", "InputMixin", "TouchTargetMixin", "event", "control", "radio", "rippleContainer", "state", "ScrollListenerMixin", "Base", "event", "scroller", "_a", "Root_default", "CustomElement", "ScrollListenerMixin", "DelegatesFocusMixin", "_bottomOffsetY", "_bottomDuration", "_bottomEasing", "_bottomHeight", "ELEMENT_ANIMATION_TYPE", "_sharedBottomStyle", "oldValue", "newValue", "delta", "distanceFromBottom", "scrollVisible", "mustIncludeSpace", "visibility", "bottomStartsAt", "_scrollListenerPositionY", "entries", "borderBoxSize", "SemiStickyMixin", "Base", "ScrollListenerMixin", "styles", "ELEMENT_ANIMATION_TYPE", "_semiStickyMeasured", "_semiStickyTranslateY", "_semiStickyDuration", "_semiStickyEasing", "oldValue", "newValue", "delta", "offsetTop", "visibility", "TopAppBar_default", "CustomElement", "ThemableMixin", "ShapeMixin", "AriaToolbarMixin", "SemiStickyMixin", "DelegatesFocusMixin", "ELEMENT_STYLE_TYPE", "raisedColor", "ELEMENT_ANIMATION_TYPE", "size", "_headlineOpacity", "oldValue", "newValue", "max", "min", "Search_default", "TopAppBar_default", "value", "currentTarget", "event", "companion", "headline", "input", "SegmentedButton_default", "Button_default", "html", "inline", "icon", "outline", "control", "slot", "state", "type", "checked", "SegmentedButtonGroup_default", "Box_default", "KeyboardNavMixin", "SegmentedButton_default", "list", "index", "child", "Select_default", "CustomElement", "ThemableMixin", "StateMixin", "ControlMixin", "TextFieldMixin", "event", "select", "child", "template", "slot", "prefix", "suffix", "control", "oldValue", "newValue", "_a", "globalStylesLoaded", "loadGlobalStyles", "addGlobalCss", "loadGlobalStyles", "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", "SAFARI_VERSION", "_input", "fractionalValue", "thumbOffset", "thumbMin", "thumbMax", "currentTarget", "isFocused", "ticks", "_valueAsText", "_isHoveringThumb", "focusedState", "thumbLabel", "thumb", "state", "control", "oldValue", "newValue", "Snackbar_default", "CustomElement", "ThemableMixin", "ShapeMixin", "DensityMixin", "AriaReflectorMixin", "ElevationMixin", "EVENT_HANDLER_TYPE", "resolve", "text", "SnackbarContainer_default", "CustomElement", "DelegatesFocusMixin", "loadGlobalStyles", "SwitchIcon_default", "CustomElement", "ThemableMixin", "ShapeMixin", "selected", "value", "disabled", "pressed", "focused", "hovered", "color", "_active", "icon", "src", "unselectedIcon", "unselectedSrc", "outline", "oldValue", "newValue", "Switch_default", "CustomElement", "ThemableMixin", "InputMixin", "StateMixin", "TouchTargetMixin", "switchEl", "state", "control", "event", "input", "offsetX", "clientX", "pageX", "isActive", "touch", "clientWidth", "position", "currentValue", "pixels", "currentPixels", "newRatio", "newValue", "Tab_default", "CustomElement", "ShapeMixin", "StateMixin", "RippleMixin", "ScrollListenerMixin", "HyperlinkMixin", "DelegatesFocusMixin", "options", "slot", "icon", "target", "href", "active", "disabledState", "src", "anchor", "state", "event", "el", "behavior", "CHROME_VERSION", "registeredElements", "rtlObserver", "RTLObserverMixin", "Base", "isRTL", "el", "TabList_default", "CustomElement", "ThemableMixin", "KeyboardNavMixin", "ResizeObserverMixin", "RTLObserverMixin", "ShapeMixin", "SemiStickyMixin", "_a", "value", "oldValue", "Tab_default", "newValue", "tab", "index", "el", "tabContentId", "isConnected", "metrics", "m", "width", "position", "animate", "percentage", "clamped", "decimalIndex", "leftIndex", "rightIndex", "leftMetrics", "rightMetrics", "activeTab", "center", "leftRatio", "rightRatio", "leftWidth", "rightWidth", "activeIndex", "distance", "tabContent", "start", "max", "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", "currentTarget", "child", "control", "oldValue", "cloneAttributeCallback", "Title_default", "Display_default"]
|
|
7
7
|
}
|