@lmvz-ds/components 0.14.1 → 0.16.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/dist/cjs/app-globals-V2Kpy_OQ.js +3 -0
- package/dist/cjs/app-globals-V2Kpy_OQ.js.map +1 -0
- package/dist/cjs/{assets-BnJmIx_h.js → assets-XY-cBmal.js} +5 -2
- package/dist/cjs/assets-XY-cBmal.js.map +1 -0
- package/dist/cjs/header-integration_7.cjs.entry.js +1024 -0
- package/dist/cjs/header-integration_7.cjs.entry.js.map +1 -0
- package/dist/cjs/{Effect-CpZhfb0D.js → icons-BOM23oli.js} +1010 -236
- package/dist/cjs/icons-BOM23oli.js.map +1 -0
- package/dist/cjs/{index-9ZJx0550.js → index-B1Puzu82.js} +11 -651
- package/dist/cjs/index-B1Puzu82.js.map +1 -0
- package/dist/cjs/{index-QRnWYctw.js → index-ww_DCXU7.js} +431 -426
- package/dist/cjs/index-ww_DCXU7.js.map +1 -0
- package/dist/cjs/index.cjs.js +13 -12
- package/dist/cjs/index.cjs.js.map +1 -0
- package/dist/cjs/lmvz-action.cjs.entry.js +5 -2
- package/dist/cjs/lmvz-action.cjs.entry.js.map +1 -0
- package/dist/cjs/lmvz-card.cjs.entry.js +7 -4
- package/dist/cjs/lmvz-card.cjs.entry.js.map +1 -0
- package/dist/cjs/lmvz-chip.cjs.entry.js +5 -2
- package/dist/cjs/lmvz-chip.cjs.entry.js.map +1 -0
- package/dist/cjs/lmvz-components.cjs.js +6 -3
- package/dist/cjs/lmvz-components.cjs.js.map +1 -0
- package/dist/cjs/loader.cjs.js +5 -2
- package/dist/cjs/loader.cjs.js.map +1 -0
- package/dist/collection/api/ds.constants.js +1 -0
- package/dist/collection/api/ds.constants.js.map +1 -0
- package/dist/collection/api/index.js +1 -0
- package/dist/collection/api/index.js.map +1 -0
- package/dist/collection/collection-manifest.json +2 -1
- package/dist/collection/components/lmvz-action/lmvz-action.js +2 -1
- package/dist/collection/components/lmvz-action/lmvz-action.js.map +1 -0
- package/dist/collection/components/lmvz-button/lmvz-button.css +4 -0
- package/dist/collection/components/lmvz-button/lmvz-button.js +3 -2
- package/dist/collection/components/lmvz-button/lmvz-button.js.map +1 -0
- package/dist/collection/components/lmvz-card/lmvz-card.css +4 -0
- package/dist/collection/components/lmvz-card/lmvz-card.js +4 -3
- package/dist/collection/components/lmvz-card/lmvz-card.js.map +1 -0
- package/dist/collection/components/lmvz-chip/lmvz-chip.js +3 -2
- package/dist/collection/components/lmvz-chip/lmvz-chip.js.map +1 -0
- package/dist/collection/components/lmvz-header/lmvz-header.js +17 -10
- package/dist/collection/components/lmvz-header/lmvz-header.js.map +1 -0
- package/dist/collection/components/lmvz-icon/icons.js +1 -0
- package/dist/collection/components/lmvz-icon/icons.js.map +1 -0
- package/dist/collection/components/lmvz-icon/lmvz-icon.js +8 -7
- package/dist/collection/components/lmvz-icon/lmvz-icon.js.map +1 -0
- package/dist/collection/components/lmvz-icon/public.js +1 -0
- package/dist/collection/components/lmvz-icon/public.js.map +1 -0
- package/dist/collection/components/lmvz-icon/test/icons.unit.js +1 -0
- package/dist/collection/components/lmvz-icon/test/icons.unit.js.map +1 -0
- package/dist/collection/components/lmvz-input/lmvz-input.js +35 -28
- package/dist/collection/components/lmvz-input/lmvz-input.js.map +1 -0
- package/dist/collection/components/lmvz-menuitem/lmvz-menuitem.js +5 -2
- package/dist/collection/components/lmvz-menuitem/lmvz-menuitem.js.map +1 -0
- package/dist/collection/components/lmvz-select/lmvz-select.css +197 -0
- package/dist/collection/components/lmvz-select/lmvz-select.js +224 -0
- package/dist/collection/components/lmvz-select/lmvz-select.js.map +1 -0
- package/dist/collection/index.js +1 -0
- package/dist/collection/index.js.map +1 -0
- package/dist/collection/integration/header-integration.js +5 -4
- package/dist/collection/integration/header-integration.js.map +1 -0
- package/dist/collection/utils/aria/aria-validation-controller.js +1 -0
- package/dist/collection/utils/aria/aria-validation-controller.js.map +1 -0
- package/dist/collection/utils/aria/element-activation-controller.js +1 -0
- package/dist/collection/utils/aria/element-activation-controller.js.map +1 -0
- package/dist/collection/utils/aria/list-keyboard-controller.js +7 -4
- package/dist/collection/utils/aria/list-keyboard-controller.js.map +1 -0
- package/dist/collection/utils/assets.js +1 -0
- package/dist/collection/utils/assets.js.map +1 -0
- package/dist/collection/utils/component.js +7 -4
- package/dist/collection/utils/component.js.map +1 -0
- package/dist/collection/utils/effect.js +1 -0
- package/dist/collection/utils/effect.js.map +1 -0
- package/dist/collection/utils/environment.js +1 -0
- package/dist/collection/utils/environment.js.map +1 -0
- package/dist/collection/utils/http.js +1 -0
- package/dist/collection/utils/http.js.map +1 -0
- package/dist/collection/utils/http.unit.js +1 -0
- package/dist/collection/utils/http.unit.js.map +1 -0
- package/dist/collection/utils/public.js +1 -0
- package/dist/collection/utils/public.js.map +1 -0
- package/dist/collection/utils/reactive-controller-host.js +1 -0
- package/dist/collection/utils/reactive-controller-host.js.map +1 -0
- package/dist/collection/utils/validation/svg.js +1 -0
- package/dist/collection/utils/validation/svg.js.map +1 -0
- package/dist/components/header-integration.d.ts +11 -0
- package/dist/components/header-integration.js +2 -0
- package/dist/components/header-integration.js.map +1 -0
- package/dist/components/index.d.ts +4 -0
- package/dist/components/index.js +2 -1
- package/dist/components/index.js.map +1 -0
- package/dist/components/lmvz-action.js +2 -1
- package/dist/components/lmvz-action.js.map +1 -0
- package/dist/components/lmvz-button.js +2 -1
- package/dist/components/lmvz-button.js.map +1 -0
- package/dist/components/lmvz-card.js +2 -1
- package/dist/components/lmvz-card.js.map +1 -0
- package/dist/components/lmvz-chip.js +2 -1
- package/dist/components/lmvz-chip.js.map +1 -0
- package/dist/components/lmvz-header.js +2 -1
- package/dist/components/lmvz-header.js.map +1 -0
- package/dist/components/lmvz-icon.js +2 -1
- package/dist/components/lmvz-icon.js.map +1 -0
- package/dist/components/lmvz-input.js +2 -1
- package/dist/components/lmvz-input.js.map +1 -0
- package/dist/components/lmvz-menuitem.js +2 -1
- package/dist/components/lmvz-menuitem.js.map +1 -0
- package/dist/components/lmvz-select.d.ts +11 -0
- package/dist/components/lmvz-select.js +2 -0
- package/dist/components/lmvz-select.js.map +1 -0
- package/dist/components/p-B2g3aN-E.js +2 -0
- package/dist/components/p-B2g3aN-E.js.map +1 -0
- package/dist/components/p-BXdOuZTp.js +2 -0
- package/dist/components/p-BXdOuZTp.js.map +1 -0
- package/dist/components/p-BfTCfPZ1.js +3 -2
- package/dist/components/p-BfTCfPZ1.js.map +1 -0
- package/dist/components/p-BpCjj39Z.js +2 -0
- package/dist/components/p-BpCjj39Z.js.map +1 -0
- package/dist/components/p-BsHYIl56.js +2 -0
- package/dist/components/p-BsHYIl56.js.map +1 -0
- package/dist/components/p-C5rqq3bf.js +2 -0
- package/dist/components/p-C5rqq3bf.js.map +1 -0
- package/dist/components/p-CI0tffvo.js +2 -0
- package/dist/components/p-CI0tffvo.js.map +1 -0
- package/dist/components/p-CN0JX9-m.js +2 -1
- package/dist/components/p-CN0JX9-m.js.map +1 -0
- package/dist/components/p-ClmDNIy4.js +2 -0
- package/dist/components/p-ClmDNIy4.js.map +1 -0
- package/dist/components/p-DQEkWkMh.js +2 -0
- package/dist/components/p-DQEkWkMh.js.map +1 -0
- package/dist/components/p-X5fEFT9T.js +2 -0
- package/dist/components/p-X5fEFT9T.js.map +1 -0
- package/dist/components/p-vIq2biqy.js +13 -0
- package/dist/components/p-vIq2biqy.js.map +1 -0
- package/dist/esm/app-globals-DQuL1Twl.js +3 -0
- package/dist/esm/app-globals-DQuL1Twl.js.map +1 -0
- package/dist/esm/{assets-CvV1KMMV.js → assets-BD98wsl7.js} +4 -1
- package/dist/esm/assets-BD98wsl7.js.map +1 -0
- package/dist/esm/header-integration_7.entry.js +1016 -0
- package/dist/esm/header-integration_7.entry.js.map +1 -0
- package/dist/esm/{Effect-DyamyJqO.js → icons-D1lxdRXP.js} +975 -174
- package/dist/esm/icons-D1lxdRXP.js.map +1 -0
- package/dist/esm/{index-CekEw3_K.js → index-DoNkkDv1.js} +6 -1
- package/dist/esm/index-DoNkkDv1.js.map +1 -0
- package/dist/esm/{index-smGPjoDX.js → index-WeqgWisK.js} +11 -651
- package/dist/esm/index-WeqgWisK.js.map +1 -0
- package/dist/esm/index.js +7 -5
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/lmvz-action.entry.js +5 -2
- package/dist/esm/lmvz-action.entry.js.map +1 -0
- package/dist/esm/lmvz-card.entry.js +7 -4
- package/dist/esm/lmvz-card.entry.js.map +1 -0
- package/dist/esm/lmvz-chip.entry.js +5 -2
- package/dist/esm/lmvz-chip.entry.js.map +1 -0
- package/dist/esm/lmvz-components.js +7 -4
- package/dist/esm/lmvz-components.js.map +1 -0
- package/dist/esm/loader.js +6 -3
- package/dist/esm/loader.js.map +1 -0
- package/dist/ext-libs.d.ts +1 -0
- package/dist/lmvz-components/index.esm.js +2 -1
- package/dist/lmvz-components/index.esm.js.map +1 -0
- package/dist/lmvz-components/lmvz-components.esm.js +2 -1
- package/dist/lmvz-components/lmvz-components.esm.js.map +1 -0
- package/dist/lmvz-components/p-33485219.entry.js +2 -0
- package/dist/lmvz-components/p-33485219.entry.js.map +1 -0
- package/dist/lmvz-components/p-76032c32.entry.js +2 -0
- package/dist/lmvz-components/p-76032c32.entry.js.map +1 -0
- package/dist/lmvz-components/p-7aeec9a8.entry.js +7 -0
- package/dist/lmvz-components/p-7aeec9a8.entry.js.map +1 -0
- package/dist/lmvz-components/p-84e0a9dd.entry.js +2 -0
- package/dist/lmvz-components/p-84e0a9dd.entry.js.map +1 -0
- package/dist/lmvz-components/p-CkJb8WVZ.js +2 -0
- package/dist/lmvz-components/p-CkJb8WVZ.js.map +1 -0
- package/dist/lmvz-components/p-DQuL1Twl.js +2 -1
- package/dist/lmvz-components/p-DQuL1Twl.js.map +1 -0
- package/dist/lmvz-components/p-WeqgWisK.js +3 -0
- package/dist/lmvz-components/p-WeqgWisK.js.map +1 -0
- package/dist/lmvz-components/p-Z9X0_ik0.js +2 -0
- package/dist/lmvz-components/p-Z9X0_ik0.js.map +1 -0
- package/dist/lmvz-components/p-eP0oxQ44.js +13 -0
- package/dist/lmvz-components/p-eP0oxQ44.js.map +1 -0
- package/dist/manifest.json +392 -68
- package/dist/stencil.config.base.js +45 -0
- package/dist/stencil.config.base.js.map +1 -0
- package/dist/stencil.config.dev.js +22 -0
- package/dist/stencil.config.dev.js.map +1 -0
- package/dist/stencil.config.integration.js +27 -0
- package/dist/stencil.config.integration.js.map +1 -0
- package/dist/stencil.config.js +16 -0
- package/dist/stencil.config.js.map +1 -0
- package/dist/stencil.config.prod.js +30 -0
- package/dist/stencil.config.prod.js.map +1 -0
- package/dist/types/Users/patrick.nemenz/workspace/lmvz/lmvz-ds/packages/components/.stencil/stencil.config.base.d.ts +2 -0
- package/dist/types/Users/patrick.nemenz/workspace/lmvz/lmvz-ds/packages/components/.stencil/stencil.config.d.ts +2 -0
- package/dist/types/Users/patrick.nemenz/workspace/lmvz/lmvz-ds/packages/components/.stencil/stencil.config.dev.d.ts +2 -0
- package/dist/types/Users/patrick.nemenz/workspace/lmvz/lmvz-ds/packages/components/.stencil/stencil.config.integration.d.ts +2 -0
- package/dist/types/Users/patrick.nemenz/workspace/lmvz/lmvz-ds/packages/components/.stencil/stencil.config.prod.d.ts +2 -0
- package/dist/types/components/lmvz-action/lmvz-action.d.ts +1 -1
- package/dist/types/components/lmvz-button/lmvz-button.d.ts +2 -2
- package/dist/types/components/lmvz-card/lmvz-card.d.ts +1 -1
- package/dist/types/components/lmvz-header/lmvz-header.d.ts +4 -4
- package/dist/types/components/lmvz-icon/lmvz-icon.d.ts +4 -4
- package/dist/types/components/lmvz-input/lmvz-input.d.ts +4 -4
- package/dist/types/components/lmvz-menuitem/lmvz-menuitem.d.ts +3 -3
- package/dist/types/components/lmvz-select/lmvz-select.d.ts +24 -0
- package/dist/types/components.d.ts +173 -3
- package/dist/types/index.d.ts +1 -1
- package/dist/types/integration/header-integration.d.ts +5 -0
- package/dist/types/utils/aria/aria-validation-controller.d.ts +1 -1
- package/dist/types/utils/aria/element-activation-controller.d.ts +1 -1
- package/dist/types/utils/component.d.ts +2 -2
- package/dist/types/utils/http.d.ts +3 -3
- package/dist/types/utils/validation/svg.d.ts +1 -1
- package/hydrate/index.js +998 -436
- package/hydrate/index.mjs +998 -436
- package/package.json +37 -73
- package/readme.md +2 -2
- package/dist/cjs/aria-loader-BBKbBZLq.js +0 -76
- package/dist/cjs/component-CRc6eHcV.js +0 -138
- package/dist/cjs/element-activation-controller-DC_6T0Rt.js +0 -31
- package/dist/cjs/icons-Brr4vqiE.js +0 -653
- package/dist/cjs/index-Bp6Dd2i1.js +0 -94
- package/dist/cjs/lmvz-button.cjs.entry.js +0 -73
- package/dist/cjs/lmvz-header.cjs.entry.js +0 -142
- package/dist/cjs/lmvz-icon.cjs.entry.js +0 -87
- package/dist/cjs/lmvz-input.cjs.entry.js +0 -177
- package/dist/cjs/lmvz-menuitem.cjs.entry.js +0 -34
- package/dist/cjs/reactive-controller-host-DWpVosFu.js +0 -189
- package/dist/collection/utils/typing.js +0 -1
- package/dist/components/p-B3JVFwO1.js +0 -1
- package/dist/components/p-BaPwpeMs.js +0 -1
- package/dist/components/p-CSRpdnrt.js +0 -1
- package/dist/components/p-DK2hpvEW.js +0 -12
- package/dist/components/p-DcMNH3fv.js +0 -1
- package/dist/components/p-DugBvwmd.js +0 -1
- package/dist/esm/aria-loader-DB71Xewa.js +0 -69
- package/dist/esm/component-B3JVFwO1.js +0 -132
- package/dist/esm/element-activation-controller-CN0JX9-m.js +0 -29
- package/dist/esm/icons-C69Um2xB.js +0 -649
- package/dist/esm/index-BfTCfPZ1.js +0 -92
- package/dist/esm/lmvz-button.entry.js +0 -71
- package/dist/esm/lmvz-header.entry.js +0 -140
- package/dist/esm/lmvz-icon.entry.js +0 -85
- package/dist/esm/lmvz-input.entry.js +0 -175
- package/dist/esm/lmvz-menuitem.entry.js +0 -32
- package/dist/esm/reactive-controller-host-1nFoJEdT.js +0 -186
- package/dist/lmvz-components/p-0e5aa1a3.entry.js +0 -1
- package/dist/lmvz-components/p-18c18de4.entry.js +0 -1
- package/dist/lmvz-components/p-5775a56c.entry.js +0 -1
- package/dist/lmvz-components/p-814ee542.entry.js +0 -1
- package/dist/lmvz-components/p-9faac8f3.entry.js +0 -1
- package/dist/lmvz-components/p-B3JVFwO1.js +0 -1
- package/dist/lmvz-components/p-B3j8zrhV.js +0 -1
- package/dist/lmvz-components/p-BEoSvNlI.js +0 -1
- package/dist/lmvz-components/p-BTpia82J.js +0 -1
- package/dist/lmvz-components/p-BfTCfPZ1.js +0 -6
- package/dist/lmvz-components/p-CN0JX9-m.js +0 -1
- package/dist/lmvz-components/p-D7GrtdQF.js +0 -1
- package/dist/lmvz-components/p-DyamyJqO.js +0 -1
- package/dist/lmvz-components/p-c61f7daa.entry.js +0 -1
- package/dist/lmvz-components/p-c6bae21b.entry.js +0 -1
- package/dist/lmvz-components/p-cM67HC0Z.js +0 -12
- package/dist/lmvz-components/p-d4b68381.entry.js +0 -1
- package/dist/lmvz-components/p-smGPjoDX.js +0 -2
- package/dist/types/utils/typing.d.ts +0 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["lmvzInputCss","inputIdCounter","LmvzInput","__stencil_proxyCustomElement","ReactiveControllerHost","validationEl","this","el","lmvzInput","internals","nativeInputElement","inputId","initialValue","nativeError","errorFromProp","helperId","helperText","undefined","showErrorMessage","error","Boolean","errorMessage","errorId","describedBy","ids","push","length","join","value","label","placeholder","disabled","readonly","required","name","type","autocomplete","inputmode","autocorrect","autocapitalize","spellcheck","autofocus","minlength","maxlength","pattern","min","max","step","form","setValue","newValue","input","val","setFormValue","emit","focusInput","focus","blurInput","blur","select","checkValidity","reportValidity","getInputElement","Promise","resolve","componentOnReady","constructor","registerHost","addController","AriaValidationController","reValidateOnPropChanges","componentWillLoad","super","formAssociatedCallback","formResetCallback","setValidity","formStateRestoreCallback","state","handleValueChange","isInternalChange","handleDisabledChange","handleInput","event","target","handleChange","updateNativeError","handleFocus","handleBlur","fromEvent","render","hasValue","shouldFloatLabel","h","key","class","classNames","htmlFor","floating","id","ref","readOnly","onInput","onChange","onFocus","onBlur","role"],"sources":["src/components/lmvz-input/lmvz-input.css?tag=lmvz-input&encapsulation=scoped","src/components/lmvz-input/lmvz-input.tsx"],"sourcesContent":["@import '~@lmvz-ds/lib-styles/define-layers.css';\n@import '~@lmvz-ds/lib-styles/fragments/_routerFont.css' layer(lmvz-ds.theme);\n\n:host {\n display: block;\n font-family: var(--lmvz-global-font-family-default);\n /* Component Variables Mapping */\n --input-radius: var(--lmvz-component-input-radius-default);\n --input-bg: var(--lmvz-semantic-color-surface-input-primary);\n --input-border-color: var(--lmvz-semantic-color-border-default);\n --input-border-color-hover: var(--lmvz-semantic-color-border-hover);\n --input-border-color-focus: var(--lmvz-semantic-color-status-on-selected);\n --input-border-width: var(--lmvz-semantic-border-width-default);\n --input-height: 48px; /* From Figma input-size=48 */\n --input-padding-x: 16px;\n\n --label-color: var(--lmvz-semantic-color-on-surface-input-secondary);\n --input-text-color: var(--lmvz-semantic-color-on-surface-input-primary);\n --helper-text-color: var(--lmvz-semantic-color-on-surface-input-secondary);\n --error-text-color: var(--lmvz-semantic-color-status-on-danger);\n\n --label-floating-scale: 0.85; /* 14px -> 12px approx */\n --label-minimized-top: -6px;\n --label-minimized-bg: var(--input-bg);\n --label-minimized-padding-x: 4px;\n\n /* Disabled state uses opacity token */\n --input-disabled-opacity: var(--lmvz-component-input-disabled-opacity);\n}\n\n.input-container {\n display: flex;\n flex-direction: column;\n position: relative;\n width: 100%;\n}\n\n.input-wrapper {\n background-color: var(--input-bg);\n border: var(--input-border-width) solid var(--input-border-color);\n border-radius: var(--input-radius);\n display: flex;\n align-items: center;\n height: var(--input-height);\n padding: 0 var(--input-padding-x);\n position: relative;\n transition: border-color 0.2s ease;\n gap: 8px; /* input-gap-x */\n}\n\n:host([disabled]) .input-wrapper {\n opacity: var(--input-disabled-opacity);\n cursor: not-allowed;\n pointer-events: none;\n}\n\n.input-container:focus-within .input-wrapper {\n border-color: var(--input-border-color-focus);\n outline: 2px solid var(--input-border-color-focus);\n outline-offset: 2px;\n}\n\n/* Enhanced focus indicator for keyboard users */\n.input-container:has(input:focus-visible) .input-wrapper {\n box-shadow: 0 0 0 3px rgb(0 86 214 / 20%);\n}\n\n/* Error State */\n:host([error]) .input-wrapper {\n border-color: var(--error-text-color);\n}\n\n:host([error]):focus-within .input-wrapper {\n border-color: var(--error-text-color);\n outline-color: var(--error-text-color);\n}\n\n/* Hover State - Use CSS pseudo-selector instead of class */\n:host(:not([disabled])) .input-wrapper:hover {\n border-color: var(--input-border-color-hover);\n}\n\n.label-input-group {\n position: relative;\n flex-grow: 1;\n display: flex;\n align-items: center;\n height: 100%;\n}\n\nlabel {\n position: absolute;\n left: 0;\n top: 50%;\n transform: translateY(-50%);\n color: var(--label-color);\n font-size: 14px; /* body-md size from Figma */\n font-family: Router, sans-serif;\n font-weight: 400;\n pointer-events: none;\n transition: all 0.2s ease-out;\n background-color: transparent;\n padding: 0;\n margin: 0;\n line-height: normal;\n white-space: nowrap;\n}\n\nlabel.floating {\n top: 0; /* Align to top border area */\n transform: translateY(-50%) scale(0.85); /* Scale down */\n transform-origin: left top;\n background-color: var(--label-minimized-bg);\n padding: 0 var(--label-minimized-padding-x);\n left: -2px; /* Adjust for padding/border visual alignment */\n color: var(--input-text-color); /* Darker when floating */\n font-weight: 500; /* Medium weight when minimized */\n}\n\n.required-indicator {\n color: var(--error-text-color);\n margin-left: 2px;\n}\n\ninput {\n border: none;\n background: transparent;\n width: 100%;\n height: 100%;\n color: var(--input-text-color);\n font-family: inherit;\n font-size: 14px;\n outline: none;\n padding: 0;\n margin: 0;\n font-weight: 400; /* Regular weight */\n}\n\ninput::placeholder {\n color: var(--label-color);\n}\n\ndiv:empty {\n display: none;\n}\n\n[role='status'] {\n padding-top: 8px; /* space-gap-component-input-helper-text */\n padding-left: 12px; /* input-md-padding-x for helper text indent */\n font-size: 12px;\n color: var(--helper-text-color);\n font-family: Router, sans-serif;\n font-weight: 500; /* Medium weight */\n}\n\n[role='alert'] {\n padding-top: 8px;\n padding-left: 12px;\n font-size: 12px;\n color: var(--error-text-color);\n font-family: Router, sans-serif;\n font-weight: 500;\n}\n\n::slotted(lmvz-button) {\n /* Minimize padding for (icon) buttons due to height constraints */\n --lmvz-button-padding: 4px;\n}\n","import { AttachInternals, Component, Element, Event, type EventEmitter, h, Method, Prop, State, Watch } from '@stencil/core';\nimport classNames from 'classnames';\nimport type { Input } from '../../api';\nimport { AriaValidationController, type AriaValidationHost } from '../../utils/aria/aria-validation-controller';\nimport { componentOnReady } from '../../utils/component';\nimport { ReactiveControllerHost } from '../../utils/reactive-controller-host';\n\nlet inputIdCounter = 0;\n\n/**\n * Input component with floating label, (form) validation, and slotted content support.\n *\n * @example\n * ```html\n * <lmvz-input\n * label=\"Email\"\n * type=\"email\"\n * required\n * autocomplete=\"email\"\n * helper-text=\"We'll never share your email\"\n * ></lmvz-input>\n * ```\n *\n * @example\n * ```typescript\n * const input = document.querySelector('lmvz-input');\n * input.addEventListener('input', (e) => console.log(e.target.value));\n * await input.focus();\n * ```\n *\n * @slot before-input - Content to the left of the input. If interactive (e.g., clear button), use an lmvz-button element.\n * Example: <lmvz-button slot=\"before-input\" aria-label=\"Clear input\" tabindex=\"0\"><lmvz-icon icon=\"close-sm\"></lmvz-icon></lmvz-button>\n * @slot after-input - Content to the right of the input. If interactive (e.g., password toggle), use an lmvz-button element.\n * Example: <lmvz-button slot=\"after-input\" aria-label=\"Toggle password visibility\" tabindex=\"0\"><lmvz-icon icon=\"eye\"></lmvz-icon></lmvz-button>\n */\n@Component({\n tag: 'lmvz-input',\n styleUrl: './lmvz-input.css',\n scoped: true,\n formAssociated: true,\n})\nexport class LmvzInput extends ReactiveControllerHost implements AriaValidationHost {\n @Element() readonly el!: HTMLElement;\n get validationEl() {\n return this.el;\n }\n @Event() lmvzInput!: EventEmitter<string>;\n\n @AttachInternals() internals!: ElementInternals;\n\n private nativeInputElement?: HTMLInputElement;\n private inputId = `lmvz-input-${inputIdCounter++}`;\n private initialValue = '';\n\n /**\n * Internal state tracking native validation\n */\n @State() private nativeError = false;\n\n /**\n * Track if error was manually set via prop\n */\n private errorFromProp = false;\n\n private get helperId(): string | undefined {\n return this.helperText ? `${this.inputId}-helper` : undefined;\n }\n\n private get showErrorMessage() {\n return this.error && Boolean(this.errorMessage);\n }\n\n private get errorId(): string {\n return `${this.inputId}-error`;\n }\n\n /**\n * reactively updated via depedency of `error`\n */\n private get describedBy(): string | undefined {\n const ids: string[] = [];\n if (this.helperId) ids.push(this.helperId);\n if (this.showErrorMessage) ids.push(this.errorId);\n return ids.length > 0 ? ids.join(' ') : undefined;\n }\n\n /**\n * * PUBLIC API\n */\n\n /**\n * Value of the input\n */\n @Prop({ mutable: true }) value?: string;\n\n /**\n * Label text for the input\n */\n @Prop() label!: string;\n\n /**\n * Helper text displayed below the input\n */\n @Prop() helperText?: string;\n\n /**\n * Placeholder text\n */\n @Prop() placeholder?: string;\n\n /**\n * Whether the input is disabled\n * @default false\n */\n @Prop({ reflect: true }) disabled = false;\n\n /**\n * Whether the input is readonly\n * @default false\n */\n @Prop({ reflect: true }) readonly = false;\n\n /**\n * Whether the input is required\n * @default false\n */\n @Prop({ reflect: true }) required = false;\n\n /**\n * Name attribute for the input\n */\n @Prop() name?: string;\n\n /**\n * Type of the input\n * @default 'text'\n */\n @Prop() type: Input.Type = 'text';\n\n /**\n * Error message to display when error is true\n */\n @Prop() errorMessage?: string;\n\n /**\n * Autocomplete attribute for form autofill\n */\n @Prop() autocomplete?: Input.Autocomplete;\n\n /**\n * Input mode for mobile keyboards\n */\n @Prop() inputmode?: Input.Inputmode;\n\n /**\n * Autocorrect attribute for mobile keyboards\n * @default undefined\n */\n @Prop() autocorrect?: 'on' | 'off';\n\n /**\n * Autocapitalize attribute for mobile keyboards\n * @default undefined\n */\n @Prop() autocapitalize?: Input.Autocapitalize;\n\n /**\n * Spellcheck attribute\n * @default undefined\n */\n @Prop() spellcheck?: boolean;\n\n /**\n * Whether the input should autofocus\n * @default false\n */\n @Prop() autofocus = false;\n\n /**\n * Minimum length for text inputs\n */\n @Prop() minlength?: number;\n\n /**\n * Maximum length for text inputs\n */\n @Prop() maxlength?: number;\n\n /**\n * Validation pattern (regex)\n */\n @Prop() pattern?: string;\n\n /**\n * Minimum value for number/date inputs\n */\n @Prop() min?: number | string;\n\n /**\n * Maximum value for number/date inputs\n */\n @Prop() max?: number | string;\n\n /**\n * Step interval for number inputs\n */\n @Prop() step?: number | string;\n\n /**\n * Form id to associate with\n */\n @Prop() form?: string;\n\n /**\n * Whether the input is in an error state\n * When not set manually, this will automatically reflect native HTML5 validation state\n * @default false\n */\n @Prop({ reflect: true })\n get error(): boolean {\n return this.errorFromProp || this.nativeError;\n }\n set error(value: boolean) {\n this.errorFromProp = value;\n }\n\n @Method()\n async setValue(newValue: string | undefined) {\n const input = this.nativeInputElement;\n const val = newValue ?? '';\n\n if (input) {\n input.value = val;\n }\n this.value = val;\n this.internals.setFormValue?.(val); // undefined in stencil test environment\n this.lmvzInput.emit(val);\n }\n\n /**\n * Sets focus on the input\n */\n @Method()\n async focusInput() {\n this.nativeInputElement?.focus();\n }\n\n /**\n * Removes focus from the input\n */\n @Method()\n async blurInput() {\n this.nativeInputElement?.blur();\n }\n\n /**\n * Selects the text in the input\n */\n @Method()\n async select() {\n this.nativeInputElement?.select();\n }\n\n /**\n * Returns whether the input satisfies its validation constraints\n */\n @Method()\n async checkValidity(): Promise<boolean> {\n return this.nativeInputElement?.checkValidity?.() ?? false;\n }\n\n /**\n * Reports validation errors to the user\n */\n @Method()\n async reportValidity(): Promise<boolean> {\n return this.nativeInputElement?.reportValidity?.() ?? false;\n }\n\n /**\n * Returns the native HTMLInputElement.\n *\n * Promise resolves when the element is ready and the input is available. If the input is not yet rendered, it waits for the component to be ready.\n */\n @Method()\n async getInputElement(): Promise<HTMLInputElement | undefined> {\n if (!this.nativeInputElement) {\n await new Promise((resolve) => componentOnReady(this.el, resolve));\n }\n return Promise.resolve(this.nativeInputElement);\n }\n\n /**\n * * Lifecycle & Reactivity\n */\n\n constructor() {\n super();\n this.addController(\n new AriaValidationController(this, {\n reValidateOnPropChanges: true,\n }),\n );\n }\n\n override componentWillLoad() {\n this.initialValue = this.value ?? '';\n super.componentWillLoad();\n }\n\n formAssociatedCallback(form: HTMLFormElement | undefined) {\n if (!form) return;\n this.internals.setFormValue?.(this.value ?? ''); // undefined in stencil test environment\n }\n\n formResetCallback() {\n this.internals.setValidity({});\n this.setValue(this.initialValue);\n }\n\n formStateRestoreCallback(state: string) {\n this.setValue(state);\n }\n\n @Watch('value')\n protected handleValueChange(newValue: string | undefined) {\n if (!this.nativeInputElement) return;\n\n const isInternalChange = this.nativeInputElement.value === newValue;\n if (isInternalChange) return;\n\n this.setValue(newValue);\n }\n\n @Watch('disabled')\n protected handleDisabledChange(disabled: boolean) {\n if (disabled && this.nativeInputElement) {\n this.nativeInputElement.blur();\n }\n }\n\n /**\n * Fires whenever the input changes\n */\n private handleInput = (event: InputEvent) => {\n const input = event.target as HTMLInputElement;\n\n this.setValue(input.value);\n };\n\n /**\n * Fires when value changes and input loses focus.\n */\n private handleChange = (event: Event) => {\n const input = (event.target as HTMLInputElement) ?? this.nativeInputElement;\n this.updateNativeError(input);\n };\n\n private handleFocus = () => {};\n\n /**\n * Fires when the input loses focus\n */\n private handleBlur = (event: FocusEvent) => {\n const input = event.target as HTMLInputElement;\n input.reportValidity?.();\n };\n\n /**\n * Updates the nativeError state based on the validity of the input.\n * validity may not exist in test environments\n */\n private updateNativeError(fromEvent?: HTMLInputElement) {\n const input = fromEvent ?? this.nativeInputElement;\n if (!input) return;\n this.nativeError = !(input.checkValidity?.() ?? true);\n }\n\n render() {\n const hasValue = Boolean(this.value);\n const shouldFloatLabel = hasValue || Boolean(this.placeholder);\n\n return (\n <div\n class={classNames('input-container', {\n 'interaction-filled': hasValue,\n })}\n >\n <div class=\"input-wrapper\">\n <slot name=\"before-input\"></slot>\n\n <div class=\"label-input-group\">\n <label htmlFor={this.inputId} class={classNames({ floating: shouldFloatLabel })}>\n {this.label}\n {this.required && (\n <span class=\"required-indicator\" aria-hidden=\"true\">\n {' '}\n *\n </span>\n )}\n </label>\n <input\n id={this.inputId}\n ref={(el) => (this.nativeInputElement = el)}\n type={this.type}\n min={this.min}\n max={this.max}\n step={this.step}\n value={this.value}\n name={this.name}\n placeholder={this.placeholder}\n disabled={this.disabled}\n readOnly={this.readonly}\n required={this.required}\n form={this.form}\n autocomplete={this.autocomplete}\n inputmode={this.inputmode}\n autocorrect={this.autocorrect}\n autocapitalize={this.autocapitalize}\n spellcheck={this.spellcheck}\n autofocus={this.autofocus}\n minlength={this.minlength}\n maxlength={this.maxlength}\n pattern={this.pattern}\n aria-invalid={this.error ? 'true' : 'false'}\n aria-required={this.required ? 'true' : 'false'}\n aria-describedby={this.describedBy}\n aria-errormessage={this.errorId}\n onInput={this.handleInput}\n onChange={this.handleChange}\n onFocus={this.handleFocus}\n onBlur={this.handleBlur}\n />\n </div>\n\n <slot name=\"after-input\"></slot>\n </div>\n\n <div id={this.helperId} role=\"status\">\n {this.helperText || null}\n </div>\n\n <div id={this.errorId} role=\"alert\">\n {(this.showErrorMessage && this.errorMessage) || null}\n </div>\n </div>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{L as o,d as s}from"./p-X5fEFT9T.js";const t=o;const p=s;export{t as LmvzMenuitem,p as defineCustomElement};
|
|
2
|
+
//# sourceMappingURL=lmvz-menuitem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":[],"mappings":"","ignoreList":[]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Components, JSX } from "../types/components";
|
|
2
|
+
|
|
3
|
+
interface LmvzSelect extends Components.LmvzSelect, HTMLElement {}
|
|
4
|
+
export const LmvzSelect: {
|
|
5
|
+
prototype: LmvzSelect;
|
|
6
|
+
new (): LmvzSelect;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Used to define this component and all nested components recursively.
|
|
10
|
+
*/
|
|
11
|
+
export const defineCustomElement: () => void;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{p as e,d as l,h as t,c as a,t as s}from"./p-C5rqq3bf.js";import{R as o,a as c}from"./p-CI0tffvo.js";const i="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTIwLjMzMzQgOC42NjY2M0wxMi4wMDAxIDE3TDMuNjY2NzUgOC42NjY2MyIgc3Ryb2tlPSJibGFjayIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+Cjwvc3ZnPgo=";const r=()=>`@layer lmvz-ds.reset, lmvz-ds.theme, lmvz-ds.components, lmvz-ds.overrides; @layer lmvz-ds.theme { @font-face { font-family: Router; src: local('Router-Book'), url('/assets/fonts/Router-Book.woff') format('woff'), local('Router'); font-weight: 400 normal; } @font-face { font-family: Router; src: local('Router-Medium'), url('/assets/fonts/Router-Medium.woff') format('woff'), local('Router'); font-weight: 500; } @font-face { font-family: Router; src: local('Router-Bold'), url('/assets/fonts/Router-Bold.woff') format('woff'), local('Router'); font-weight: 700 bold; } } .sc-lmvz-select-h { display: block; font-family: var(--lmvz-global-font-family-default, Router); --lmvz-internal-select-floating-label-top-offset: 0.375rem; padding-top: var(--lmvz-internal-select-floating-label-top-offset); --lmvz-select-radius: var(--lmvz-component-input-radius-default, 999px); --lmvz-select-bg: var(--lmvz-semantic-color-int-secondary, #f0f0f0); --lmvz-select-bg-hover: var(--lmvz-semantic-color-int-secondary-hover, #e0e0e0); --lmvz-select-text-color: var(--lmvz-semantic-color-int-on-secondary, #000000); --lmvz-select-label-color: var(--lmvz-semantic-color-on-surface-input-primary, #000000); --lmvz-select-padding-x: var(--lmvz-component-input-md-padding-x, clamp(0.75rem, 0.69rem + 0.26vw, 1rem)); --lmvz-select-gap: var(--lmvz-component-input-md-gap-x, clamp(0.25rem, 0.16rem + 0.39vw, 0.63rem)); --lmvz-select-height: 40px; --lmvz-select-label-font-size: var(--lmvz-component-component-typography-body-sm-font-size, 0.75rem); --lmvz-select-label-top-offset: calc(var(--lmvz-internal-select-floating-label-top-offset) * -1); --lmvz-select-label-minimized-padding-x: 4px; --lmvz-select-disabled-opacity: var(--lmvz-component-input-disabled-opacity, 40%); --lmvz-select-helper-color: var(--lmvz-semantic-color-on-surface-input-secondary, #7a7a7a); --lmvz-select-focus-color: var(--lmvz-semantic-color-status-on-selected, #0e7ab4); --lmvz-select-error-color: var(--lmvz-semantic-color-status-on-danger, #e52a31); } .select-wrapper.sc-lmvz-select { position: relative; height: var(--lmvz-select-height); } label.sc-lmvz-select { position: absolute; top: 50%; left: var(--lmvz-select-padding-x); font-size: var(--lmvz-select-label-font-size); color: var(--lmvz-select-label-color); line-height: normal; white-space: nowrap; pointer-events: none; z-index: 2; transform: translateY(-50%); transform-origin: left top; transition: top 0.2s ease-out, transform 0.2s ease-out, opacity 0.2s ease-out, padding 0.2s ease-out; } label.assistive-label.sc-lmvz-select { opacity: 0; padding: 0; } label.floating-label.sc-lmvz-select { top: var(--lmvz-select-label-top-offset); transform: translateY(0) scale(0.85); left: calc(var(--lmvz-select-padding-x) - 2px); background-color: var(--lmvz-select-bg); padding: 0 var(--lmvz-select-label-minimized-padding-x); opacity: 1; font-weight: 500; } label.sc-lmvz-select > span[aria-hidden='true'].sc-lmvz-select, div[aria-hidden='true'].sc-lmvz-select > span.sc-lmvz-select:first-child > span[aria-hidden='true'].sc-lmvz-select { color: var(--lmvz-select-error-color); margin-left: 2px; display: inline-block; line-height: 0; vertical-align: middle; } div[aria-hidden].sc-lmvz-select { display: flex; align-items: center; gap: var(--lmvz-select-gap); height: 100%; padding: 0 var(--lmvz-select-padding-x); border-radius: var(--lmvz-select-radius); background-color: var(--lmvz-select-bg); cursor: pointer; position: relative; z-index: 1; transition: background-color 0.15s ease; } .sc-lmvz-select-h:not([disabled]) .select-wrapper.sc-lmvz-select:hover div[aria-hidden].sc-lmvz-select { background-color: var(--lmvz-select-bg-hover); } .select-wrapper.sc-lmvz-select:focus-within div[aria-hidden].sc-lmvz-select { outline: 2px solid var(--lmvz-select-focus-color); outline-offset: 2px; } div[aria-hidden].sc-lmvz-select > span.sc-lmvz-select:first-child { flex: 1 0 0; font-size: var(--lmvz-component-component-typography-body-md-font-size, 0.875rem); font-weight: var(--lmvz-global-font-weight-500, 500); color: var(--lmvz-select-text-color); line-height: 1.4; letter-spacing: var(--lmvz-component-body-md-letter-spacing, 0); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } div[aria-hidden].sc-lmvz-select > span.sc-lmvz-select:last-child { flex-shrink: 0; display: flex; align-items: center; justify-content: center; } img.sc-lmvz-select { display: block; width: var(--lmvz-component-icon-size-xs, clamp(0.75rem, 0.69rem + 0.26vw, 1rem)); height: var(--lmvz-component-icon-size-xs, clamp(0.75rem, 0.69rem + 0.26vw, 1rem)); } select.sc-lmvz-select { appearance: none; position: absolute; inset: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer; z-index: 2; border: none; background: transparent; margin: 0; padding: 0; } [disabled].sc-lmvz-select-h .select-wrapper.sc-lmvz-select { opacity: var(--lmvz-select-disabled-opacity); pointer-events: none; cursor: not-allowed; } [role='status'].sc-lmvz-select { margin-top: 4px; padding-left: var(--lmvz-select-padding-x); font-size: var(--lmvz-select-label-font-size); color: var(--lmvz-select-helper-color); line-height: normal; }`;let n=0;const d=e(class e extends o{get el(){return this}get validationEl(){return this.el}selectId=`lmvz-select-${n++}`;nativeSelectEl;constructor(e){super(false);if(e!==false){this.__registerHost()}this.lmvzChange=l(this,"lmvzChange");this.addController(new c(this))}lmvzChange;value;label;helperText;disabled=false;required=false;name;selectedLabel="";get hasValue(){return Boolean(this.value)}componentDidLoad(){this.syncSelectedLabel();super.componentDidLoad()}handleValueChange(e){if(this.nativeSelectEl&&this.nativeSelectEl.value!==(e??"")){this.nativeSelectEl.value=e??""}this.syncSelectedLabel()}syncSelectedLabel(){if(!this.nativeSelectEl)return;const e=this.nativeSelectEl.selectedIndex;this.selectedLabel=e>=0?this.nativeSelectEl.options[e]?.text??"":""}handleChange=e=>{const l=e.target;this.value=l.value;this.syncSelectedLabel();this.lmvzChange.emit(l.value)};render(){const e=this.hasValue;const l=e;return t(a,{key:"7d1abb943f79e90451b43c9221801b80a2f61346"},t("div",{key:"ded3e45246ab38e89d444c59239cdc63a2c4d4fc",class:"select-wrapper"},t("label",{key:"cb68ff79976c2fb55d4cc827f9e90ba2597a8a43",htmlFor:this.selectId,class:l?"floating-label":"assistive-label"},this.label,this.required&&l&&t("span",{key:"ab77eaea1645b95d90f00ffb609bbd7a1704f7bc","aria-hidden":"true"}," *")),t("div",{key:"45cee00478a6cc31c10dddf69d8e6687fc8f440d","aria-hidden":"true"},t("span",{key:"0c5d425ea8843234aa6abd94a207377e2a675686"},e?this.selectedLabel:this.label,this.required&&!e&&t("span",{key:"ebef5322371ee0253b50dd801b80cbb6402c067a","aria-hidden":"true"}," *")),t("span",{key:"a12d31dc29563444f728133f181b48914d31705b"},t("img",{key:"dd3f175d1ca2b9ccc6c2bfa2075e5da62016a896",src:i,alt:""}))),t("select",{key:"a196f3b824177d1b45971c38341bf6a2939dda82",id:this.selectId,ref:e=>this.nativeSelectEl=e,name:this.name,disabled:this.disabled,required:this.required,"aria-label":this.label,onChange:this.handleChange},!e&&t("option",{key:"536cc559def0e9ffa4b2150693ece9a597c238d1",value:"",disabled:true,selected:true,hidden:true}),t("slot",{key:"ad9fed96b9f8c1d8257511bb1d5ab5ee756973ce"}))),this.helperText&&t("div",{key:"4723b44d781c900be5aae7ece2a0be04b6c744b9",role:"status"},this.helperText))}static get watchers(){return{value:[{handleValueChange:0}]}}static get style(){return r()}},[774,"lmvz-select",{value:[1025],label:[1],helperText:[1,"helper-text"],disabled:[516],required:[516],name:[1],selectedLabel:[32]},undefined,{value:[{handleValueChange:0}]}]);function m(){if(typeof customElements==="undefined"){return}const e=["lmvz-select"];e.forEach((e=>{switch(e){case"lmvz-select":if(!customElements.get(s(e))){customElements.define(s(e),d)}break}}))}const v=d;const f=m;export{v as LmvzSelect,f as defineCustomElement};
|
|
2
|
+
//# sourceMappingURL=lmvz-select.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["chevronDownSvg","lmvzSelectCss","selectIdCounter","LmvzSelect","__stencil_proxyCustomElement","ReactiveControllerHost","validationEl","this","el","selectId","nativeSelectEl","constructor","registerHost","addController","AriaValidationController","lmvzChange","value","label","helperText","disabled","required","name","selectedLabel","hasValue","Boolean","componentDidLoad","syncSelectedLabel","super","handleValueChange","newValue","idx","selectedIndex","options","text","handleChange","event","select","target","emit","render","shouldShowLabel","h","Host","key","class","htmlFor","src","alt","id","ref","onChange","selected","hidden","role"],"sources":["src/assets/icons/chevron-down.svg","src/components/lmvz-select/lmvz-select.css?tag=lmvz-select&encapsulation=scoped","src/components/lmvz-select/lmvz-select.tsx"],"sourcesContent":["<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M20.3334 8.66663L12.0001 17L3.66675 8.66663\" stroke=\"black\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n</svg>\n","@import '~@lmvz-ds/lib-styles/define-layers.css';\n@import '~@lmvz-ds/lib-styles/fragments/_routerFont.css' layer(lmvz-ds.theme);\n\n:host {\n display: block;\n font-family: var(--lmvz-global-font-family-default);\n /* Extra top space to accommodate the floating label */\n\n --lmvz-internal-select-floating-label-top-offset: 0.375rem;\n\n padding-top: var(--lmvz-internal-select-floating-label-top-offset);\n\n /* Component variable mapping */\n --lmvz-select-radius: var(--lmvz-component-input-radius-default);\n --lmvz-select-bg: var(--lmvz-semantic-color-int-secondary);\n --lmvz-select-bg-hover: var(--lmvz-semantic-color-int-secondary-hover);\n --lmvz-select-text-color: var(--lmvz-semantic-color-int-on-secondary);\n --lmvz-select-label-color: var(--lmvz-semantic-color-on-surface-input-primary);\n --lmvz-select-padding-x: var(--lmvz-component-input-md-padding-x);\n --lmvz-select-gap: var(--lmvz-component-input-md-gap-x);\n --lmvz-select-height: 40px;\n --lmvz-select-label-font-size: var(--lmvz-component-component-typography-body-sm-font-size);\n --lmvz-select-label-top-offset: calc(var(--lmvz-internal-select-floating-label-top-offset) * -1);\n --lmvz-select-label-minimized-padding-x: 4px;\n --lmvz-select-disabled-opacity: var(--lmvz-component-input-disabled-opacity);\n --lmvz-select-helper-color: var(--lmvz-semantic-color-on-surface-input-secondary);\n --lmvz-select-focus-color: var(--lmvz-semantic-color-status-on-selected);\n --lmvz-select-error-color: var(--lmvz-semantic-color-status-on-danger);\n}\n\n.select-wrapper {\n position: relative;\n height: var(--lmvz-select-height);\n}\n\n/* Floating label – positioned above the trigger when a value is selected */\nlabel {\n position: absolute;\n top: 50%;\n left: var(--lmvz-select-padding-x);\n font-size: var(--lmvz-select-label-font-size);\n color: var(--lmvz-select-label-color);\n line-height: normal;\n white-space: nowrap;\n pointer-events: none;\n z-index: 2;\n transform: translateY(-50%);\n transform-origin: left top;\n transition:\n top 0.2s ease-out,\n transform 0.2s ease-out,\n opacity 0.2s ease-out,\n padding 0.2s ease-out;\n}\n\nlabel.assistive-label {\n opacity: 0;\n padding: 0;\n}\n\nlabel.floating-label {\n top: var(--lmvz-select-label-top-offset);\n transform: translateY(0) scale(0.85);\n left: calc(var(--lmvz-select-padding-x) - 2px);\n background-color: var(--lmvz-select-bg);\n padding: 0 var(--lmvz-select-label-minimized-padding-x);\n opacity: 1;\n font-weight: 500;\n}\n\nlabel > span[aria-hidden='true'],\ndiv[aria-hidden='true'] > span:first-child > span[aria-hidden='true'] {\n color: var(--lmvz-select-error-color);\n margin-left: 2px;\n display: inline-block;\n line-height: 0;\n vertical-align: middle;\n}\n\n/* Visual pill trigger */\ndiv[aria-hidden] {\n display: flex;\n align-items: center;\n gap: var(--lmvz-select-gap);\n height: 100%;\n padding: 0 var(--lmvz-select-padding-x);\n border-radius: var(--lmvz-select-radius);\n background-color: var(--lmvz-select-bg);\n cursor: pointer;\n position: relative;\n z-index: 1;\n transition: background-color 0.15s ease;\n}\n\n:host(:not([disabled])) .select-wrapper:hover div[aria-hidden] {\n background-color: var(--lmvz-select-bg-hover);\n}\n\n.select-wrapper:focus-within div[aria-hidden] {\n outline: 2px solid var(--lmvz-select-focus-color);\n outline-offset: 2px;\n}\n\ndiv[aria-hidden] > span:first-child {\n flex: 1 0 0;\n font-size: var(--lmvz-component-component-typography-body-md-font-size);\n font-weight: var(--lmvz-global-font-weight-500);\n color: var(--lmvz-select-text-color);\n line-height: 1.4;\n letter-spacing: var(--lmvz-component-body-md-letter-spacing);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\ndiv[aria-hidden] > span:last-child {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\nimg {\n display: block;\n width: var(--lmvz-component-icon-size-xs);\n height: var(--lmvz-component-icon-size-xs);\n}\n\n/* Native select – absolutely covers the trigger, invisible, intercepts clicks */\nselect {\n appearance: none;\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n opacity: 0;\n cursor: pointer;\n z-index: 2;\n border: none;\n background: transparent;\n margin: 0;\n padding: 0;\n}\n\n:host([disabled]) .select-wrapper {\n opacity: var(--lmvz-select-disabled-opacity);\n pointer-events: none;\n cursor: not-allowed;\n}\n\n[role='status'] {\n margin-top: 4px;\n padding-left: var(--lmvz-select-padding-x);\n font-size: var(--lmvz-select-label-font-size);\n color: var(--lmvz-select-helper-color);\n line-height: normal;\n}\n","import { Component, Element, Event, type EventEmitter, h, Host, Prop, State, Watch } from '@stencil/core';\nimport chevronDownSvg from '../../assets/icons/chevron-down.svg';\nimport { AriaValidationController, type AriaValidationHost } from '../../utils/aria/aria-validation-controller';\nimport { ReactiveControllerHost } from '../../utils/reactive-controller-host';\n\nlet selectIdCounter = 0;\n\n/**\n * Select component with floating label and pill-shaped trigger.\n * Wraps a native `<select>` element for full keyboard and form support.\n *\n * @example\n * ```html\n * <lmvz-select label=\"Country\" name=\"country\">\n * <option value=\"ch\">Switzerland</option>\n * <option value=\"de\">Germany</option>\n * <option value=\"at\">Austria</option>\n * </lmvz-select>\n * ```\n *\n * @example\n * ```typescript\n * const select = document.querySelector('lmvz-select');\n * select.addEventListener('lmvzChange', (e) => console.log(e.detail));\n * ```\n *\n * @slot default - Native `<option>` or `<optgroup>` elements.\n */\n@Component({\n tag: 'lmvz-select',\n styleUrl: './lmvz-select.css',\n scoped: true,\n})\nexport class LmvzSelect extends ReactiveControllerHost implements AriaValidationHost {\n @Element() readonly el!: HTMLElement;\n get validationEl() {\n return this.el;\n }\n\n private selectId = `lmvz-select-${selectIdCounter++}`;\n private nativeSelectEl?: HTMLSelectElement;\n\n constructor() {\n super();\n this.addController(new AriaValidationController(this));\n }\n\n /**\n * Emitted when the user selects a new option. Detail contains the new value.\n */\n @Event() lmvzChange!: EventEmitter<string>;\n\n /**\n * Currently selected value.\n */\n @Prop({ mutable: true }) value?: string;\n\n /**\n * Label text displayed as a placeholder when no value is selected,\n * and floated above the trigger when a value is present.\n */\n @Prop() label!: string;\n\n /**\n * Helper text displayed below the select field.\n */\n @Prop() helperText?: string;\n\n /**\n * Whether the select is disabled.\n * @default false\n */\n @Prop({ reflect: true }) disabled = false;\n\n /**\n * Whether a value is required.\n * @default false\n */\n @Prop({ reflect: true }) required = false;\n\n /**\n * Name attribute passed to the native select for form submission.\n */\n @Prop() name?: string;\n\n @State() private selectedLabel = '';\n\n private get hasValue() {\n return Boolean(this.value);\n }\n\n override componentDidLoad() {\n this.syncSelectedLabel();\n super.componentDidLoad();\n }\n\n @Watch('value')\n protected handleValueChange(newValue: string | undefined) {\n if (this.nativeSelectEl && this.nativeSelectEl.value !== (newValue ?? '')) {\n this.nativeSelectEl.value = newValue ?? '';\n }\n this.syncSelectedLabel();\n }\n\n private syncSelectedLabel() {\n if (!this.nativeSelectEl) return;\n const idx = this.nativeSelectEl.selectedIndex;\n this.selectedLabel = idx >= 0 ? (this.nativeSelectEl.options[idx]?.text ?? '') : '';\n }\n\n private handleChange = (event: Event) => {\n const select = event.target as HTMLSelectElement;\n this.value = select.value;\n this.syncSelectedLabel();\n this.lmvzChange.emit(select.value);\n };\n\n render() {\n const hasValue = this.hasValue;\n const shouldShowLabel = hasValue;\n\n return (\n <Host>\n <div class=\"select-wrapper\">\n <label htmlFor={this.selectId} class={shouldShowLabel ? 'floating-label' : 'assistive-label'}>\n {this.label}\n {this.required && shouldShowLabel && <span aria-hidden=\"true\"> *</span>}\n </label>\n\n <div aria-hidden=\"true\">\n <span>\n {hasValue ? this.selectedLabel : this.label}\n {this.required && !hasValue && <span aria-hidden=\"true\"> *</span>}\n </span>\n <span>\n <img src={chevronDownSvg} alt=\"\" />\n </span>\n </div>\n\n <select\n id={this.selectId}\n ref={(el) => (this.nativeSelectEl = el)}\n name={this.name}\n disabled={this.disabled}\n required={this.required}\n aria-label={this.label}\n onChange={this.handleChange}\n >\n {!hasValue && <option value=\"\" disabled selected hidden></option>}\n <slot />\n </select>\n </div>\n\n {this.helperText && <div role=\"status\">{this.helperText}</div>}\n </Host>\n );\n }\n}\n"],"mappings":"2GAAA,MAAMA,EAAiB,qUCAvB,MAAMC,EAAgB,IAAM,oyKCK5B,IAAIC,EAAkB,E,MA4BTC,EAAWC,EAAA,MAAAD,UAAQE,E,qBAE9B,gBAAIC,GACF,OAAOC,KAAKC,E,CAGNC,SAAW,eAAeP,MAC1BQ,eAER,WAAAC,CAAAC,G,sFAEEL,KAAKM,cAAc,IAAIC,EAAyBP,MACjD,CAKQQ,WAKgBC,MAMjBC,MAKAC,WAMiBC,SAAW,MAMXC,SAAW,MAK5BC,KAESC,cAAgB,GAEjC,YAAYC,GACV,OAAOC,QAAQjB,KAAKS,M,CAGb,gBAAAS,GACPlB,KAAKmB,oBACLC,MAAMF,kB,CAIE,iBAAAG,CAAkBC,GAC1B,GAAItB,KAAKG,gBAAkBH,KAAKG,eAAeM,SAAWa,GAAY,IAAK,CACzEtB,KAAKG,eAAeM,MAAQa,GAAY,E,CAE1CtB,KAAKmB,mB,CAGC,iBAAAA,GACN,IAAKnB,KAAKG,eAAgB,OAC1B,MAAMoB,EAAMvB,KAAKG,eAAeqB,cAChCxB,KAAKe,cAAgBQ,GAAO,EAAKvB,KAAKG,eAAesB,QAAQF,IAAMG,MAAQ,GAAM,E,CAG3EC,aAAgBC,IACtB,MAAMC,EAASD,EAAME,OACrB9B,KAAKS,MAAQoB,EAAOpB,MACpBT,KAAKmB,oBACLnB,KAAKQ,WAAWuB,KAAKF,EAAOpB,MAAM,EAGpC,MAAAuB,GACE,MAAMhB,EAAWhB,KAAKgB,SACtB,MAAMiB,EAAkBjB,EAExB,OACEkB,EAACC,EAAI,CAAAC,IAAA,4CACHF,EAAA,OAAAE,IAAA,2CAAKC,MAAM,kBACTH,EAAA,SAAAE,IAAA,2CAAOE,QAAStC,KAAKE,SAAUmC,MAAOJ,EAAkB,iBAAmB,mBACxEjC,KAAKU,MACLV,KAAKa,UAAYoB,GAAmBC,EAAA,QAAAE,IAAA,yDAAkB,QAAM,OAG/DF,EAAA,OAAAE,IAAA,yDAAiB,QACfF,EAAA,QAAAE,IAAA,4CACGpB,EAAWhB,KAAKe,cAAgBf,KAAKU,MACrCV,KAAKa,WAAaG,GAAYkB,EAAA,QAAAE,IAAA,yDAAkB,QAAM,OAEzDF,EAAA,QAAAE,IAAA,4CACEF,EAAA,OAAAE,IAAA,2CAAKG,IAAK9C,EAAgB+C,IAAI,OAIlCN,EAAA,UAAAE,IAAA,2CACEK,GAAIzC,KAAKE,SACTwC,IAAMzC,GAAQD,KAAKG,eAAiBF,EACpCa,KAAMd,KAAKc,KACXF,SAAUZ,KAAKY,SACfC,SAAUb,KAAKa,SAAQ,aACXb,KAAKU,MACjBiC,SAAU3C,KAAK2B,eAEbX,GAAYkB,EAAA,UAAAE,IAAA,2CAAQ3B,MAAM,GAAGG,SAAQ,KAACgC,SAAQ,KAACC,OAAM,OACvDX,EAAA,QAAAE,IAAA,+CAIHpC,KAAKW,YAAcuB,EAAA,OAAAE,IAAA,2CAAKU,KAAK,UAAU9C,KAAKW,Y","ignoreList":[]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{p as t,h as e,c as s,t as i}from"./p-C5rqq3bf.js";import{g as n,a as r,l as o,i as a,b as c,c as h,m as l,d as u,e as d,f,h as m,j as v,k as p,s as g,n as w,o as z,p as y,q as b,t as k,u as x,v as S,w as E,x as C,y as D,z as O,A as _,B as V,C as I,D as L,E as M,F as P,G as R,H as j,I as B,J as N,K as T,L as $,M as A,N as H,O as F,P as K,Q as q,R as G,S as J,T as U,U as W,_ as Y,V as Q,W as X,X as Z,Y as tt,Z as et,$ as st,a0 as it,a1 as nt,a2 as rt,a3 as ot,a4 as at,a5 as ct,a6 as ht,a7 as lt,a8 as ut,a9 as dt,aa as ft,r as mt,ab as vt,ac as pt,ad as gt,ae as wt}from"./p-BsHYIl56.js";import{R as zt,a as yt}from"./p-CI0tffvo.js";import{c as bt}from"./p-ClmDNIy4.js";const kt=Symbol.for("effect/Brand/Refined");const xt=(t,e)=>[{message:t,meta:e}];function St(...t){const e=t.length===2?e=>t[0](e)?r(e):o(t[1](e)):e=>l(t[0](e),{onNone:()=>r(e),onSome:o});return Object.assign((t=>n(e(t),a)),{[kt]:kt,option:t=>h(e(t)),either:e,is:t=>c(e(t))})}const Et=(t,e,s,i)=>_({_tag:"Complete",key:t,exit:e,entryStats:s,timeToLiveMillis:i});const Ct=(t,e)=>_({_tag:"Pending",key:t,deferred:e});const Dt=(t,e)=>_({_tag:"Refreshing",deferred:t,complete:e});const Ot=Symbol.for("effect/Cache/MapKey");class _t{current;[Ot]=Ot;previous=undefined;next=undefined;constructor(t){this.current=t}[A](){return H(q(this.current),K(q(this.previous)),K(q(this.next)),F(this))}[G](t){if(this===t){return true}return It(t)&&U(this.current,t.current)&&U(this.previous,t.previous)&&U(this.next,t.next)}}const Vt=t=>new _t(t);const It=t=>J(t,Ot);class Lt{head=undefined;tail=undefined;add(t){if(t!==this.tail){if(this.tail===undefined){this.head=t;this.tail=t}else{const e=t.previous;const s=t.next;if(s!==undefined){t.next=undefined;if(e!==undefined){e.next=s;s.previous=e}else{this.head=s;this.head.previous=undefined}}this.tail.next=t;t.previous=this.tail;this.tail=t}}}remove(){const t=this.head;if(t!==undefined){const e=t.next;if(e!==undefined){t.next=undefined;this.head=e;this.head.previous=undefined}else{this.head=undefined;this.tail=undefined}}return t}}const Mt=()=>new Lt;const Pt=(t,e,s,i,n,r)=>({map:t,keys:e,accesses:s,updating:i,hits:n,misses:r});const Rt=()=>Pt(L(),Mt(),$(),T(false),0,0);const jt="effect/Cache";const Bt=Symbol.for(jt);const Nt={_Key:t=>t,_Error:t=>t,_Value:t=>t};const Tt="effect/ConsumerCache";const $t=Symbol.for(Tt);const At={_Key:t=>t,_Error:t=>t,_Value:t=>t};const Ht=t=>t;const Ft=t=>({loadedMillis:t});class Kt{capacity;context;fiberId;lookup;timeToLive;[Bt]=Nt;[$t]=At;cacheState;constructor(t,e,s,i,n){this.capacity=t;this.context=e;this.fiberId=s;this.lookup=i;this.timeToLive=n;this.cacheState=Rt()}get(t){return d(this.getEither(t),p)}get cacheStats(){return g((()=>Ht({hits:this.cacheState.hits,misses:this.cacheState.misses,size:w(this.cacheState.map)})))}getOption(t){return z((()=>l(y(this.cacheState.map,t),{onNone:()=>{const e=Vt(t);this.trackAccess(e);this.trackMiss();return b(k())},onSome:t=>this.resolveMapValue(t)})))}getOptionComplete(t){return z((()=>l(y(this.cacheState.map,t),{onNone:()=>{const e=Vt(t);this.trackAccess(e);this.trackMiss();return b(k())},onSome:t=>this.resolveMapValue(t,true)})))}contains(t){return g((()=>x(this.cacheState.map,t)))}entryStats(t){return g((()=>{const e=y(this.cacheState.map,t);if(S(e)){switch(e.value._tag){case"Complete":{const t=e.value.entryStats.loadedMillis;return E(Ft(t))}case"Pending":{return k()}case"Refreshing":{const t=e.value.complete.entryStats.loadedMillis;return E(Ft(t))}}}return k()}))}getEither(t){return z((()=>{const e=t;let s=undefined;let i=undefined;let n=C(y(this.cacheState.map,e));if(n===undefined){i=D(this.fiberId);s=Vt(e);if(x(this.cacheState.map,e)){n=C(y(this.cacheState.map,e))}else{O(this.cacheState.map,e,Ct(s,i))}}if(n===undefined){this.trackAccess(s);this.trackMiss();return d(this.lookupValueOf(t,i),r)}else{return V(this.resolveMapValue(n),l({onNone:()=>this.getEither(t),onSome:t=>b(o(t))}))}}))}invalidate(t){return g((()=>{I(this.cacheState.map,t)}))}invalidateWhen(t,e){return g((()=>{const s=y(this.cacheState.map,t);if(S(s)&&s.value._tag==="Complete"){if(s.value.exit._tag==="Success"){if(e(s.value.exit.value)){I(this.cacheState.map,t)}}}}))}get invalidateAll(){return g((()=>{this.cacheState.map=L()}))}refresh(t){return M((e=>z((()=>{const s=t;const i=D(this.fiberId);let n=C(y(this.cacheState.map,s));if(n===undefined){if(x(this.cacheState.map,s)){n=C(y(this.cacheState.map,s))}else{O(this.cacheState.map,s,Ct(Vt(s),i))}}if(n===undefined){return W(this.lookupValueOf(t,i))}else{switch(n._tag){case"Complete":{if(this.hasExpired(e,n.timeToLiveMillis)){const e=C(y(this.cacheState.map,s));if(U(e,n)){I(this.cacheState.map,s)}return W(this.get(t))}return H(this.lookupValueOf(t,i),Q((()=>{const t=C(y(this.cacheState.map,s));if(U(t,n)){const t=Dt(i,n);O(this.cacheState.map,s,t);return true}return false})),W)}case"Pending":{return Y(n.deferred)}case"Refreshing":{return Y(n.deferred)}}}}))))}set(t,e){return M((s=>g((()=>{const i=s.unsafeCurrentTimeMillis();const n=t;const r=X(e);const o=Et(Vt(n),r,Ft(i),i+Z(u(this.timeToLive(r))));O(this.cacheState.map,n,o)}))))}get size(){return g((()=>w(this.cacheState.map)))}get values(){return g((()=>{const t=[];for(const e of this.cacheState.map){if(e[1]._tag==="Complete"&&e[1].exit._tag==="Success"){t.push(e[1].exit.value)}}return t}))}get entries(){return g((()=>{const t=[];for(const e of this.cacheState.map){if(e[1]._tag==="Complete"&&e[1].exit._tag==="Success"){t.push([e[0],e[1].exit.value])}}return t}))}get keys(){return g((()=>{const t=[];for(const e of this.cacheState.map){if(e[1]._tag==="Complete"&&e[1].exit._tag==="Success"){t.push(e[0])}}return t}))}resolveMapValue(t,e=false){return M((s=>{switch(t._tag){case"Complete":{this.trackAccess(t.key);if(this.hasExpired(s,t.timeToLiveMillis)){I(this.cacheState.map,t.key.current);return b(k())}this.trackHit();return d(t.exit,E)}case"Pending":{this.trackAccess(t.key);this.trackHit();if(e){return b(k())}return d(Y(t.deferred),E)}case"Refreshing":{this.trackAccess(t.complete.key);this.trackHit();if(this.hasExpired(s,t.complete.timeToLiveMillis)){if(e){return b(k())}return d(Y(t.deferred),E)}return d(t.complete.exit,E)}}}))}trackHit(){this.cacheState.hits=this.cacheState.hits+1}trackMiss(){this.cacheState.misses=this.cacheState.misses+1}trackAccess(t){P(this.cacheState.accesses,t);if(R(this.cacheState.updating,false,true)){let t=true;while(t){const e=j(this.cacheState.accesses,B);if(e===B){t=false}else{this.cacheState.keys.add(e)}}let e=w(this.cacheState.map);t=e>this.capacity;while(t){const s=this.cacheState.keys.remove();if(s!==undefined){if(x(this.cacheState.map,s.current)){I(this.cacheState.map,s.current);e=e-1;t=e>this.capacity}}else{t=false}}N(this.cacheState.updating,false)}}hasExpired(t,e){return t.unsafeCurrentTimeMillis()>e}lookupValueOf(t,e){return M((s=>z((()=>{const i=t;return H(this.lookup(t),rt(this.context),nt,V((t=>{const n=s.unsafeCurrentTimeMillis();const r=Ft(n);const o=Et(Vt(i),t,r,n+Z(u(this.timeToLive(t))));O(this.cacheState.map,i,o);return et(it(e,t),t)})),tt((()=>et(st(e),g((()=>{I(this.cacheState.map,i)}))))))}))))}}const qt=t=>{const e=u(t.timeToLive);return Gt({capacity:t.capacity,lookup:t.lookup,timeToLive:()=>e})};const Gt=t=>d(f([m(),v]),(([e,s])=>new Kt(t.capacity,e,s,t.lookup,(e=>u(t.timeToLive(e))))));const Jt=qt;const Ut=function(){const t=Symbol.for("effect/Data/Error/plainArgs");const e={BaseEffectError:class extends ot{constructor(e){super(e?.message,e?.cause?{cause:e.cause}:undefined);if(e){Object.assign(this,e);Object.defineProperty(this,t,{value:e,enumerable:false})}}toJSON(){return{...this[t],...this}}}};return e.BaseEffectError}();const Wt=t=>{const e={BaseEffectError:class extends Ut{_tag=t}};e.BaseEffectError.prototype.name=t;return e.BaseEffectError};class Yt extends(Wt("FetchError")){}class Qt extends(Wt("NotFoundError")){}const Xt=(t,e)=>at((function*(){const s=yield*ct({try:()=>fetch(t,e),catch:t=>new Yt({cause:t})});if(s.status===404){return yield*ht(new Qt({url:s.url}))}return s}));class Zt extends(Wt("ResponseTextError")){constructor(t){super(new Error(`Failed to read response text`,{cause:t}))}}const te=t=>ct({try:()=>t.text(),catch:t=>new Zt(t)});const ee=St(ne,(()=>xt("SVG data is malformed")));class se extends(Wt("BrandValidationError")){constructor(t,e){super(new Error(`Brand validation failed for type ${e}.`,{cause:t}))}}const ie=t=>lt({try:()=>ee(t),catch:t=>new se(t,"SVGString")});function ne(t){if(typeof t!=="string"){return false}try{const e=new DOMParser;const s=e.parseFromString(t,"image/svg+xml");return s.documentElement.nodeName==="svg"}catch{return false}}const re=()=>ee(`<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"></svg>`);const oe=()=>Jt({capacity:200,timeToLive:ft,lookup:t=>ut((function*(){const e=t;const s=bt(`${e}.svg`,"icons");const i=yield*Xt(s);const n=yield*te(i);return yield*ie(n)}))});let ae=null;function ce(t){const e=t;return ut((function*(){if(!ae){ae=yield*oe()}return yield*ae.get(e)}))}function he(){return ut((function*(){if(ae){yield*ae.invalidateAll}else{dt("Attempted to clear icon cache before it was initialized")}}))}const le=()=>`.sc-lmvz-icon-h{--lmvz-icon-color:var(--lmvz-component-color, var(--lmvz-semantic-color-on-surface-input-primary, #000000));display:inline-block;line-height:0;svg{display:block}svg>path{stroke:var(--lmvz-icon-color);fill:none}}[size='xs'].sc-lmvz-icon-h{svg{width:var(--lmvz-component-icon-size-xs, clamp(0.75rem, 0.69rem + 0.26vw, 1rem));height:var(--lmvz-component-icon-size-xs, clamp(0.75rem, 0.69rem + 0.26vw, 1rem))}}[size='sm'].sc-lmvz-icon-h{svg{width:var(--lmvz-component-icon-size-sm, clamp(0.88rem, 0.81rem + 0.26vw, 1.13rem));height:var(--lmvz-component-icon-size-sm, clamp(0.88rem, 0.81rem + 0.26vw, 1.13rem))}}[size='md'].sc-lmvz-icon-h{svg{width:var(--lmvz-component-icon-size-md, clamp(1rem, 0.88rem + 0.52vw, 1.5rem));height:var(--lmvz-component-icon-size-md, clamp(1rem, 0.88rem + 0.52vw, 1.5rem))}}[size='lg'].sc-lmvz-icon-h{svg{width:var(--lmvz-component-icon-size-lg, clamp(1.5rem, 1.38rem + 0.52vw, 2rem));height:var(--lmvz-component-icon-size-lg, clamp(1.5rem, 1.38rem + 0.52vw, 2rem))}}[size='inherit'].sc-lmvz-icon-h{svg{width:inherit;height:inherit}}[weight='light'].sc-lmvz-icon-h{svg>path{stroke-width:1}}[weight='medium'].sc-lmvz-icon-h{svg>path{stroke-width:1.5}}[weight='bold'].sc-lmvz-icon-h{svg>path{stroke-width:2}}[weight='filled'].sc-lmvz-icon-h{svg>path{stroke-width:2;fill:var(--lmvz-icon-color)}}`;const ue=t(class t extends zt{intersectionObserver;ariaValidationController=new yt(this);get el(){return this}validationEl;icon;weight="medium";size="md";iconData;visible=false;ariaLabel;get ariaHidden(){return!this.ariaLabel}constructor(t){super(false);if(t!==false){this.__registerHost()}this.addController(this.ariaValidationController)}connectedCallback(){this.waitUntilVisible((()=>{this.visible=true;this.loadIconPathData()}));super.connectedCallback()}disconnectedCallback(){if(this.intersectionObserver){this.intersectionObserver.disconnect();this.intersectionObserver=undefined}super.disconnectedCallback()}async loadIconPathData(){const{icon:t,visible:e}=this;if(!t||!e){return}this.iconData=await mt(ce(this.icon).pipe(vt((e=>pt(`Error loading icon "${t}":`,e.message,e.cause,e.stack))),gt((()=>wt(re())))))}componentDidRender(){this.validationEl=this.el.querySelector("svg");this.ariaValidationController.revalidateAria();super.componentDidRender()}render(){return e(s,{key:"f5c2f8025d0e9598d903e72770ebca6cad01961c",role:"img","aria-hidden":`${this.ariaHidden}`,innerHTML:this.iconData})}waitUntilVisible(t,e=50){if(typeof window==="undefined"||!window.IntersectionObserver){t();return}this.intersectionObserver=new IntersectionObserver((e=>{e.some((e=>{if(e.isIntersecting){this.intersectionObserver?.disconnect();this.intersectionObserver=undefined;t();return true}return false}))}),{rootMargin:`${e}px`});this.intersectionObserver.observe(this.el)}static get assetsDirs(){return["../../assets/icons"]}static get watchers(){return{icon:[{loadIconPathData:0}]}}static get style(){return le()}},[514,"lmvz-icon",{icon:[513],weight:[513],size:[513],ariaLabel:[513,"aria-label"],iconData:[32],visible:[32]},undefined,{icon:[{loadIconPathData:0}]}]);function de(){if(typeof customElements==="undefined"){return}const t=["lmvz-icon"];t.forEach((t=>{switch(t){case"lmvz-icon":if(!customElements.get(i(t))){customElements.define(i(t),ue)}break}}))}export{ue as L,he as c,de as d};
|
|
2
|
+
//# sourceMappingURL=p-B2g3aN-E.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["RefinedConstructorsTypeId","Symbol","for","error","message","meta","refined","args","either","length","unbranded","Either.right","Either.left","Option.match","onNone","onSome","Object","assign","Either.getOrThrowWith","identity","option","Option.getRight","is","Either.isRight","complete","key","exit","entryStats","timeToLiveMillis","Data.struct","_tag","pending","deferred","refreshing","MapKeyTypeId","MapKeyImpl","current","previous","undefined","next","constructor","this","Hash.symbol","pipe","Hash.hash","Hash.combine","Hash.cached","Equal.symbol","that","isMapKey","Equal.equals","makeMapKey","u","hasProperty","KeySetImpl","head","tail","add","remove","makeKeySet","makeCacheState","map","keys","accesses","updating","hits","misses","initialCacheState","MutableHashMap.empty","MutableQueue.unbounded","MutableRef.make","CacheSymbolKey","CacheTypeId","cacheVariance","_Key","_","_Error","_Value","ConsumerCacheSymbolKey","ConsumerCacheTypeId","consumerCacheVariance","makeCacheStats","options","makeEntryStats","loadedMillis","CacheImpl","capacity","context","fiberId","lookup","timeToLive","cacheState","get","core.map","getEither","Either.merge","cacheStats","core.sync","size","MutableHashMap.size","getOption","core.suspend","MutableHashMap.get","mapKey","trackAccess","trackMiss","core.succeed","Option.none","value","resolveMapValue","getOptionComplete","contains","MutableHashMap.has","Option.isSome","loaded","Option.some","k","Option.getOrUndefined","Deferred.unsafeMake","MutableHashMap.set","lookupValueOf","core.flatMap","invalidate","MutableHashMap.remove","invalidateWhen","when","invalidateAll","refresh","effect.clockWith","clock","core.asVoid","hasExpired","found","effect.when","mapValue","Deferred.await","set","now","unsafeCurrentTimeMillis","lookupResult","Exit.succeed","Duration.toMillis","Duration.decode","values","entry","push","entries","ignorePending","trackHit","MutableQueue.offer","MutableRef.compareAndSet","loop","MutableQueue.poll","MutableQueue.EmptyMutableQueue","MutableRef.set","input","core.provideContext","core.exit","stats","core.zipRight","Deferred.done","core.onInterrupt","Deferred.interrupt","make","makeWith","fiberRuntime.all","core.context","core.fiberId","internal.make","Error","plainArgsSymbol","O","BaseEffectError","core.YieldableError","super","cause","defineProperty","enumerable","toJSON","TaggedError","tag","prototype","name","FetchError","Data.TaggedError","NotFoundError","httpClient","init","Effect.gen","response","Effect.tryPromise","try","fetch","catch","status","Effect.fail","url","ResponseTextError","responseAsText","res","text","SVGString","Brand.refined","isValidSVG","Brand.error","BrandValidationError","type","createValidSVGString","svg","Effect.try","parser","DOMParser","doc","parseFromString","documentElement","nodeName","emptyDefaultSvg","createIconCache","Cache.make","Duration.infinity","assetPath","createAssetUrlSafely","responseString","cacheInstance","fetchIconSvg","clearIconCache","Effect.logWarning","lmvzIconCss","LmvzIcon","__stencil_proxyCustomElement","ReactiveControllerHost","intersectionObserver","ariaValidationController","AriaValidationController","validationEl","icon","weight","iconData","visible","ariaLabel","ariaHidden","registerHost","addController","connectedCallback","waitUntilVisible","loadIconPathData","disconnectedCallback","disconnect","Effect.runPromise","Effect.tapError","Effect.logError","stack","Effect.catchAll","Effect.succeed","componentDidRender","el","querySelector","revalidateAria","render","h","Host","role","innerHTML","callback","rootMargin","window","IntersectionObserver","some","isIntersecting","observe"],"sources":["../../node_modules/.pnpm/effect@3.21.0/node_modules/effect/dist/esm/Brand.js","../../node_modules/.pnpm/effect@3.21.0/node_modules/effect/dist/esm/internal/cache.js","../../node_modules/.pnpm/effect@3.21.0/node_modules/effect/dist/esm/Cache.js","../../node_modules/.pnpm/effect@3.21.0/node_modules/effect/dist/esm/Data.js","src/utils/http.ts","src/utils/validation/svg.ts","src/components/lmvz-icon/icons.ts","src/components/lmvz-icon/lmvz-icon.css?tag=lmvz-icon&encapsulation=scoped","src/components/lmvz-icon/lmvz-icon.tsx"],"sourcesContent":["/**\n * This module provides types and utility functions to create and work with branded types,\n * which are TypeScript types with an added type tag to prevent accidental usage of a value in the wrong context.\n *\n * The `refined` and `nominal` functions are both used to create branded types in TypeScript.\n * The main difference between them is that `refined` allows for validation of the data, while `nominal` does not.\n *\n * The `nominal` function is used to create a new branded type that has the same underlying type as the input, but with a different name.\n * This is useful when you want to distinguish between two values of the same type that have different meanings.\n * The `nominal` function does not perform any validation of the input data.\n *\n * On the other hand, the `refined` function is used to create a new branded type that has the same underlying type as the input,\n * but with a different name, and it also allows for validation of the input data.\n * The `refined` function takes a predicate that is used to validate the input data.\n * If the input data fails the validation, a `BrandErrors` is returned, which provides information about the specific validation failure.\n *\n * @since 2.0.0\n */\nimport * as Arr from \"./Array.js\";\nimport * as Either from \"./Either.js\";\nimport { identity, unsafeCoerce } from \"./Function.js\";\nimport * as Option from \"./Option.js\";\n/**\n * @since 2.0.0\n * @category symbols\n */\nexport const BrandTypeId = /*#__PURE__*/Symbol.for(\"effect/Brand\");\n/**\n * @since 2.0.0\n * @category symbols\n */\nexport const RefinedConstructorsTypeId = /*#__PURE__*/Symbol.for(\"effect/Brand/Refined\");\n/**\n * Returns a `BrandErrors` that contains a single `RefinementError`.\n *\n * @since 2.0.0\n * @category constructors\n */\nexport const error = (message, meta) => [{\n message,\n meta\n}];\n/**\n * Takes a variable number of `BrandErrors` and returns a single `BrandErrors` that contains all refinement errors.\n *\n * @since 2.0.0\n * @category constructors\n */\nexport const errors = (...errors) => Arr.flatten(errors);\nexport function refined(...args) {\n const either = args.length === 2 ? unbranded => args[0](unbranded) ? Either.right(unbranded) : Either.left(args[1](unbranded)) : unbranded => {\n return Option.match(args[0](unbranded), {\n onNone: () => Either.right(unbranded),\n onSome: Either.left\n });\n };\n return Object.assign(unbranded => Either.getOrThrowWith(either(unbranded), identity), {\n [RefinedConstructorsTypeId]: RefinedConstructorsTypeId,\n option: args => Option.getRight(either(args)),\n either,\n is: args => Either.isRight(either(args))\n });\n}\n/**\n * This function returns a `Brand.Constructor` that **does not apply any runtime checks**, it just returns the provided value.\n * It can be used to create nominal types that allow distinguishing between two values of the same type but with different meanings.\n *\n * If you also want to perform some validation, see {@link refined}.\n *\n * **Example**\n *\n * ```ts\n * import * as assert from \"node:assert\"\n * import { Brand } from \"effect\"\n *\n * type UserId = number & Brand.Brand<\"UserId\">\n *\n * const UserId = Brand.nominal<UserId>()\n *\n * console.log(UserId(1))\n * // 1\n * ```\n *\n * @since 2.0.0\n * @category constructors\n */\nexport const nominal = () => {\n // @ts-expect-error\n return Object.assign(args => args, {\n [RefinedConstructorsTypeId]: RefinedConstructorsTypeId,\n option: args => Option.some(args),\n either: args => Either.right(args),\n is: _args => true\n });\n};\n/**\n * Combines two or more brands together to form a single branded type.\n * This API is useful when you want to validate that the input data passes multiple brand validators.\n *\n * **Example**\n *\n * ```ts\n * import * as assert from \"node:assert\"\n * import { Brand } from \"effect\"\n *\n * type Int = number & Brand.Brand<\"Int\">\n * const Int = Brand.refined<Int>(\n * (n) => Number.isInteger(n),\n * (n) => Brand.error(`Expected ${n} to be an integer`)\n * )\n * type Positive = number & Brand.Brand<\"Positive\">\n * const Positive = Brand.refined<Positive>(\n * (n) => n > 0,\n * (n) => Brand.error(`Expected ${n} to be positive`)\n * )\n *\n * const PositiveInt = Brand.all(Int, Positive)\n *\n * console.log(PositiveInt(1))\n * // 1\n *\n * assert.throws(() => PositiveInt(1.1))\n * ```\n *\n * @since 2.0.0\n * @category combining\n */\nexport const all = (...brands) => {\n const either = args => {\n let result = Either.right(args);\n for (const brand of brands) {\n const nextResult = brand.either(args);\n if (Either.isLeft(result) && Either.isLeft(nextResult)) {\n result = Either.left([...result.left, ...nextResult.left]);\n } else {\n result = Either.isLeft(result) ? result : nextResult;\n }\n }\n return result;\n };\n // @ts-expect-error\n return Object.assign(args => Either.match(either(args), {\n onLeft: e => {\n throw e;\n },\n onRight: identity\n }), {\n [RefinedConstructorsTypeId]: RefinedConstructorsTypeId,\n option: args => Option.getRight(either(args)),\n either,\n is: args => Either.isRight(either(args))\n });\n};\n/**\n * Retrieves the unbranded value from a `Brand` instance.\n *\n * @since 3.15.0\n * @category getters\n */\nexport const unbranded = unsafeCoerce;\n//# sourceMappingURL=Brand.js.map","import * as Context from \"../Context.js\";\nimport * as Deferred from \"../Deferred.js\";\nimport * as Duration from \"../Duration.js\";\nimport * as Either from \"../Either.js\";\nimport * as Equal from \"../Equal.js\";\nimport * as Exit from \"../Exit.js\";\nimport { pipe } from \"../Function.js\";\nimport * as Hash from \"../Hash.js\";\nimport * as MutableHashMap from \"../MutableHashMap.js\";\nimport * as MutableQueue from \"../MutableQueue.js\";\nimport * as MutableRef from \"../MutableRef.js\";\nimport * as Option from \"../Option.js\";\nimport { hasProperty } from \"../Predicate.js\";\nimport * as effect from \"./core-effect.js\";\nimport * as core from \"./core.js\";\nimport * as Data from \"./data.js\";\nimport { none } from \"./fiberId.js\";\nimport * as fiberRuntime from \"./fiberRuntime.js\";\n/** @internal */\nexport const complete = (key, exit, entryStats, timeToLiveMillis) => Data.struct({\n _tag: \"Complete\",\n key,\n exit,\n entryStats,\n timeToLiveMillis\n});\n/** @internal */\nexport const pending = (key, deferred) => Data.struct({\n _tag: \"Pending\",\n key,\n deferred\n});\n/** @internal */\nexport const refreshing = (deferred, complete) => Data.struct({\n _tag: \"Refreshing\",\n deferred,\n complete\n});\n/** @internal */\nexport const MapKeyTypeId = /*#__PURE__*/Symbol.for(\"effect/Cache/MapKey\");\nclass MapKeyImpl {\n current;\n [MapKeyTypeId] = MapKeyTypeId;\n previous = undefined;\n next = undefined;\n constructor(current) {\n this.current = current;\n }\n [Hash.symbol]() {\n return pipe(Hash.hash(this.current), Hash.combine(Hash.hash(this.previous)), Hash.combine(Hash.hash(this.next)), Hash.cached(this));\n }\n [Equal.symbol](that) {\n if (this === that) {\n return true;\n }\n return isMapKey(that) && Equal.equals(this.current, that.current) && Equal.equals(this.previous, that.previous) && Equal.equals(this.next, that.next);\n }\n}\n/** @internal */\nexport const makeMapKey = current => new MapKeyImpl(current);\n/** @internal */\nexport const isMapKey = u => hasProperty(u, MapKeyTypeId);\nclass KeySetImpl {\n head = undefined;\n tail = undefined;\n add(key) {\n if (key !== this.tail) {\n if (this.tail === undefined) {\n this.head = key;\n this.tail = key;\n } else {\n const previous = key.previous;\n const next = key.next;\n if (next !== undefined) {\n key.next = undefined;\n if (previous !== undefined) {\n previous.next = next;\n next.previous = previous;\n } else {\n this.head = next;\n this.head.previous = undefined;\n }\n }\n this.tail.next = key;\n key.previous = this.tail;\n this.tail = key;\n }\n }\n }\n remove() {\n const key = this.head;\n if (key !== undefined) {\n const next = key.next;\n if (next !== undefined) {\n key.next = undefined;\n this.head = next;\n this.head.previous = undefined;\n } else {\n this.head = undefined;\n this.tail = undefined;\n }\n }\n return key;\n }\n}\n/** @internal */\nexport const makeKeySet = () => new KeySetImpl();\n/**\n * Constructs a new `CacheState` from the specified values.\n *\n * @internal\n */\nexport const makeCacheState = (map, keys, accesses, updating, hits, misses) => ({\n map,\n keys,\n accesses,\n updating,\n hits,\n misses\n});\n/**\n * Constructs an initial cache state.\n *\n * @internal\n */\nexport const initialCacheState = () => makeCacheState(MutableHashMap.empty(), makeKeySet(), MutableQueue.unbounded(), MutableRef.make(false), 0, 0);\n/** @internal */\nconst CacheSymbolKey = \"effect/Cache\";\n/** @internal */\nexport const CacheTypeId = /*#__PURE__*/Symbol.for(CacheSymbolKey);\nconst cacheVariance = {\n /* c8 ignore next */\n _Key: _ => _,\n /* c8 ignore next */\n _Error: _ => _,\n /* c8 ignore next */\n _Value: _ => _\n};\n/** @internal */\nconst ConsumerCacheSymbolKey = \"effect/ConsumerCache\";\n/** @internal */\nexport const ConsumerCacheTypeId = /*#__PURE__*/Symbol.for(ConsumerCacheSymbolKey);\nconst consumerCacheVariance = {\n /* c8 ignore next */\n _Key: _ => _,\n /* c8 ignore next */\n _Error: _ => _,\n /* c8 ignore next */\n _Value: _ => _\n};\n/** @internal */\nexport const makeCacheStats = options => options;\n/** @internal */\nexport const makeEntryStats = loadedMillis => ({\n loadedMillis\n});\nclass CacheImpl {\n capacity;\n context;\n fiberId;\n lookup;\n timeToLive;\n [CacheTypeId] = cacheVariance;\n [ConsumerCacheTypeId] = consumerCacheVariance;\n cacheState;\n constructor(capacity, context, fiberId, lookup, timeToLive) {\n this.capacity = capacity;\n this.context = context;\n this.fiberId = fiberId;\n this.lookup = lookup;\n this.timeToLive = timeToLive;\n this.cacheState = initialCacheState();\n }\n get(key) {\n return core.map(this.getEither(key), Either.merge);\n }\n get cacheStats() {\n return core.sync(() => makeCacheStats({\n hits: this.cacheState.hits,\n misses: this.cacheState.misses,\n size: MutableHashMap.size(this.cacheState.map)\n }));\n }\n getOption(key) {\n return core.suspend(() => Option.match(MutableHashMap.get(this.cacheState.map, key), {\n onNone: () => {\n const mapKey = makeMapKey(key);\n this.trackAccess(mapKey);\n this.trackMiss();\n return core.succeed(Option.none());\n },\n onSome: value => this.resolveMapValue(value)\n }));\n }\n getOptionComplete(key) {\n return core.suspend(() => Option.match(MutableHashMap.get(this.cacheState.map, key), {\n onNone: () => {\n const mapKey = makeMapKey(key);\n this.trackAccess(mapKey);\n this.trackMiss();\n return core.succeed(Option.none());\n },\n onSome: value => this.resolveMapValue(value, true)\n }));\n }\n contains(key) {\n return core.sync(() => MutableHashMap.has(this.cacheState.map, key));\n }\n entryStats(key) {\n return core.sync(() => {\n const option = MutableHashMap.get(this.cacheState.map, key);\n if (Option.isSome(option)) {\n switch (option.value._tag) {\n case \"Complete\":\n {\n const loaded = option.value.entryStats.loadedMillis;\n return Option.some(makeEntryStats(loaded));\n }\n case \"Pending\":\n {\n return Option.none();\n }\n case \"Refreshing\":\n {\n const loaded = option.value.complete.entryStats.loadedMillis;\n return Option.some(makeEntryStats(loaded));\n }\n }\n }\n return Option.none();\n });\n }\n getEither(key) {\n return core.suspend(() => {\n const k = key;\n let mapKey = undefined;\n let deferred = undefined;\n let value = Option.getOrUndefined(MutableHashMap.get(this.cacheState.map, k));\n if (value === undefined) {\n deferred = Deferred.unsafeMake(this.fiberId);\n mapKey = makeMapKey(k);\n if (MutableHashMap.has(this.cacheState.map, k)) {\n value = Option.getOrUndefined(MutableHashMap.get(this.cacheState.map, k));\n } else {\n MutableHashMap.set(this.cacheState.map, k, pending(mapKey, deferred));\n }\n }\n if (value === undefined) {\n this.trackAccess(mapKey);\n this.trackMiss();\n return core.map(this.lookupValueOf(key, deferred), Either.right);\n } else {\n return core.flatMap(this.resolveMapValue(value), Option.match({\n onNone: () => this.getEither(key),\n onSome: value => core.succeed(Either.left(value))\n }));\n }\n });\n }\n invalidate(key) {\n return core.sync(() => {\n MutableHashMap.remove(this.cacheState.map, key);\n });\n }\n invalidateWhen(key, when) {\n return core.sync(() => {\n const value = MutableHashMap.get(this.cacheState.map, key);\n if (Option.isSome(value) && value.value._tag === \"Complete\") {\n if (value.value.exit._tag === \"Success\") {\n if (when(value.value.exit.value)) {\n MutableHashMap.remove(this.cacheState.map, key);\n }\n }\n }\n });\n }\n get invalidateAll() {\n return core.sync(() => {\n this.cacheState.map = MutableHashMap.empty();\n });\n }\n refresh(key) {\n return effect.clockWith(clock => core.suspend(() => {\n const k = key;\n const deferred = Deferred.unsafeMake(this.fiberId);\n let value = Option.getOrUndefined(MutableHashMap.get(this.cacheState.map, k));\n if (value === undefined) {\n if (MutableHashMap.has(this.cacheState.map, k)) {\n value = Option.getOrUndefined(MutableHashMap.get(this.cacheState.map, k));\n } else {\n MutableHashMap.set(this.cacheState.map, k, pending(makeMapKey(k), deferred));\n }\n }\n if (value === undefined) {\n return core.asVoid(this.lookupValueOf(key, deferred));\n } else {\n switch (value._tag) {\n case \"Complete\":\n {\n if (this.hasExpired(clock, value.timeToLiveMillis)) {\n const found = Option.getOrUndefined(MutableHashMap.get(this.cacheState.map, k));\n if (Equal.equals(found, value)) {\n MutableHashMap.remove(this.cacheState.map, k);\n }\n return core.asVoid(this.get(key));\n }\n // Only trigger the lookup if we're still the current value, `completedResult`\n return pipe(this.lookupValueOf(key, deferred), effect.when(() => {\n const current = Option.getOrUndefined(MutableHashMap.get(this.cacheState.map, k));\n if (Equal.equals(current, value)) {\n const mapValue = refreshing(deferred, value);\n MutableHashMap.set(this.cacheState.map, k, mapValue);\n return true;\n }\n return false;\n }), core.asVoid);\n }\n case \"Pending\":\n {\n return Deferred.await(value.deferred);\n }\n case \"Refreshing\":\n {\n return Deferred.await(value.deferred);\n }\n }\n }\n }));\n }\n set(key, value) {\n return effect.clockWith(clock => core.sync(() => {\n const now = clock.unsafeCurrentTimeMillis();\n const k = key;\n const lookupResult = Exit.succeed(value);\n const mapValue = complete(makeMapKey(k), lookupResult, makeEntryStats(now), now + Duration.toMillis(Duration.decode(this.timeToLive(lookupResult))));\n MutableHashMap.set(this.cacheState.map, k, mapValue);\n }));\n }\n get size() {\n return core.sync(() => {\n return MutableHashMap.size(this.cacheState.map);\n });\n }\n get values() {\n return core.sync(() => {\n const values = [];\n for (const entry of this.cacheState.map) {\n if (entry[1]._tag === \"Complete\" && entry[1].exit._tag === \"Success\") {\n values.push(entry[1].exit.value);\n }\n }\n return values;\n });\n }\n get entries() {\n return core.sync(() => {\n const values = [];\n for (const entry of this.cacheState.map) {\n if (entry[1]._tag === \"Complete\" && entry[1].exit._tag === \"Success\") {\n values.push([entry[0], entry[1].exit.value]);\n }\n }\n return values;\n });\n }\n get keys() {\n return core.sync(() => {\n const keys = [];\n for (const entry of this.cacheState.map) {\n if (entry[1]._tag === \"Complete\" && entry[1].exit._tag === \"Success\") {\n keys.push(entry[0]);\n }\n }\n return keys;\n });\n }\n resolveMapValue(value, ignorePending = false) {\n return effect.clockWith(clock => {\n switch (value._tag) {\n case \"Complete\":\n {\n this.trackAccess(value.key);\n if (this.hasExpired(clock, value.timeToLiveMillis)) {\n MutableHashMap.remove(this.cacheState.map, value.key.current);\n return core.succeed(Option.none());\n }\n this.trackHit();\n return core.map(value.exit, Option.some);\n }\n case \"Pending\":\n {\n this.trackAccess(value.key);\n this.trackHit();\n if (ignorePending) {\n return core.succeed(Option.none());\n }\n return core.map(Deferred.await(value.deferred), Option.some);\n }\n case \"Refreshing\":\n {\n this.trackAccess(value.complete.key);\n this.trackHit();\n if (this.hasExpired(clock, value.complete.timeToLiveMillis)) {\n if (ignorePending) {\n return core.succeed(Option.none());\n }\n return core.map(Deferred.await(value.deferred), Option.some);\n }\n return core.map(value.complete.exit, Option.some);\n }\n }\n });\n }\n trackHit() {\n this.cacheState.hits = this.cacheState.hits + 1;\n }\n trackMiss() {\n this.cacheState.misses = this.cacheState.misses + 1;\n }\n trackAccess(key) {\n MutableQueue.offer(this.cacheState.accesses, key);\n if (MutableRef.compareAndSet(this.cacheState.updating, false, true)) {\n let loop = true;\n while (loop) {\n const key = MutableQueue.poll(this.cacheState.accesses, MutableQueue.EmptyMutableQueue);\n if (key === MutableQueue.EmptyMutableQueue) {\n loop = false;\n } else {\n this.cacheState.keys.add(key);\n }\n }\n let size = MutableHashMap.size(this.cacheState.map);\n loop = size > this.capacity;\n while (loop) {\n const key = this.cacheState.keys.remove();\n if (key !== undefined) {\n if (MutableHashMap.has(this.cacheState.map, key.current)) {\n MutableHashMap.remove(this.cacheState.map, key.current);\n size = size - 1;\n loop = size > this.capacity;\n }\n } else {\n loop = false;\n }\n }\n MutableRef.set(this.cacheState.updating, false);\n }\n }\n hasExpired(clock, timeToLiveMillis) {\n return clock.unsafeCurrentTimeMillis() > timeToLiveMillis;\n }\n lookupValueOf(input, deferred) {\n return effect.clockWith(clock => core.suspend(() => {\n const key = input;\n return pipe(this.lookup(input), core.provideContext(this.context), core.exit, core.flatMap(exit => {\n const now = clock.unsafeCurrentTimeMillis();\n const stats = makeEntryStats(now);\n const value = complete(makeMapKey(key), exit, stats, now + Duration.toMillis(Duration.decode(this.timeToLive(exit))));\n MutableHashMap.set(this.cacheState.map, key, value);\n return core.zipRight(Deferred.done(deferred, exit), exit);\n }), core.onInterrupt(() => core.zipRight(Deferred.interrupt(deferred), core.sync(() => {\n MutableHashMap.remove(this.cacheState.map, key);\n }))));\n }));\n }\n}\n/** @internal */\nexport const make = options => {\n const timeToLive = Duration.decode(options.timeToLive);\n return makeWith({\n capacity: options.capacity,\n lookup: options.lookup,\n timeToLive: () => timeToLive\n });\n};\n/** @internal */\nexport const makeWith = options => core.map(fiberRuntime.all([core.context(), core.fiberId]), ([context, fiberId]) => new CacheImpl(options.capacity, context, fiberId, options.lookup, exit => Duration.decode(options.timeToLive(exit))));\n/** @internal */\nexport const unsafeMakeWith = (capacity, lookup, timeToLive) => new CacheImpl(capacity, Context.empty(), none, lookup, exit => Duration.decode(timeToLive(exit)));\n//# sourceMappingURL=cache.js.map","import * as internal from \"./internal/cache.js\";\n/**\n * @since 2.0.0\n * @category symbols\n */\nexport const CacheTypeId = internal.CacheTypeId;\n/**\n * @since 3.6.4\n * @category symbols\n */\nexport const ConsumerCacheTypeId = internal.ConsumerCacheTypeId;\n/**\n * Constructs a new cache with the specified capacity, time to live, and\n * lookup function.\n *\n * @since 2.0.0\n * @category constructors\n */\nexport const make = internal.make;\n/**\n * Constructs a new cache with the specified capacity, time to live, and\n * lookup function, where the time to live can depend on the `Exit` value\n * returned by the lookup function.\n *\n * @since 2.0.0\n * @category constructors\n */\nexport const makeWith = internal.makeWith;\n/**\n * Constructs a new `CacheStats` from the specified values.\n *\n * @since 2.0.0\n * @category constructors\n */\nexport const makeCacheStats = internal.makeCacheStats;\n/**\n * Constructs a new `EntryStats` from the specified values.\n *\n * @since 2.0.0\n * @category constructors\n */\nexport const makeEntryStats = internal.makeEntryStats;\n//# sourceMappingURL=Cache.js.map","import * as core from \"./internal/core.js\";\nimport * as internal from \"./internal/data.js\";\nimport { StructuralPrototype } from \"./internal/effectable.js\";\nimport * as Predicate from \"./Predicate.js\";\n/**\n * @example\n * ```ts\n * import * as assert from \"node:assert\"\n * import { Data, Equal } from \"effect\"\n *\n * const alice = Data.struct({ name: \"Alice\", age: 30 })\n *\n * const bob = Data.struct({ name: \"Bob\", age: 40 })\n *\n * assert.deepStrictEqual(Equal.equals(alice, alice), true)\n * assert.deepStrictEqual(Equal.equals(alice, Data.struct({ name: \"Alice\", age: 30 })), true)\n *\n * assert.deepStrictEqual(Equal.equals(alice, { name: \"Alice\", age: 30 }), false)\n * assert.deepStrictEqual(Equal.equals(alice, bob), false)\n * ```\n *\n * @category constructors\n * @since 2.0.0\n */\nexport const struct = internal.struct;\n/**\n * @category constructors\n * @since 2.0.0\n */\nexport const unsafeStruct = as => Object.setPrototypeOf(as, StructuralPrototype);\n/**\n * @example\n * ```ts\n * import * as assert from \"node:assert\"\n * import { Data, Equal } from \"effect\"\n *\n * const alice = Data.tuple(\"Alice\", 30)\n *\n * const bob = Data.tuple(\"Bob\", 40)\n *\n * assert.deepStrictEqual(Equal.equals(alice, alice), true)\n * assert.deepStrictEqual(Equal.equals(alice, Data.tuple(\"Alice\", 30)), true)\n *\n * assert.deepStrictEqual(Equal.equals(alice, [\"Alice\", 30]), false)\n * assert.deepStrictEqual(Equal.equals(alice, bob), false)\n * ```\n *\n * @category constructors\n * @since 2.0.0\n */\nexport const tuple = (...as) => unsafeArray(as);\n/**\n * @example\n * ```ts\n * import * as assert from \"node:assert\"\n * import { Data, Equal } from \"effect\"\n *\n * const alice = Data.struct({ name: \"Alice\", age: 30 })\n * const bob = Data.struct({ name: \"Bob\", age: 40 })\n *\n * const persons = Data.array([alice, bob])\n *\n * assert.deepStrictEqual(\n * Equal.equals(\n * persons,\n * Data.array([\n * Data.struct({ name: \"Alice\", age: 30 }),\n * Data.struct({ name: \"Bob\", age: 40 })\n * ])\n * ),\n * true\n * )\n * ```\n *\n * @category constructors\n * @since 2.0.0\n */\nexport const array = as => unsafeArray(as.slice(0));\n/**\n * @category constructors\n * @since 2.0.0\n */\nexport const unsafeArray = as => Object.setPrototypeOf(as, internal.ArrayProto);\nconst _case = () => args => args === undefined ? Object.create(StructuralPrototype) : struct(args);\nexport {\n/**\n * Provides a constructor for the specified `Case`.\n *\n * @example\n * ```ts\n * import * as assert from \"node:assert\"\n * import { Data, Equal } from \"effect\"\n *\n * interface Person {\n * readonly name: string\n * }\n *\n * // Creating a constructor for the specified Case\n * const Person = Data.case<Person>()\n *\n * // Creating instances of Person\n * const mike1 = Person({ name: \"Mike\" })\n * const mike2 = Person({ name: \"Mike\" })\n * const john = Person({ name: \"John\" })\n *\n * // Checking equality\n * assert.deepStrictEqual(Equal.equals(mike1, mike2), true)\n * assert.deepStrictEqual(Equal.equals(mike1, john), false)\n *\n * ```\n * @since 2.0.0\n * @category constructors\n */\n_case as case };\n/**\n * Provides a tagged constructor for the specified `Case`.\n *\n * @example\n * ```ts\n * import * as assert from \"node:assert\"\n * import { Data } from \"effect\"\n *\n * interface Person {\n * readonly _tag: \"Person\" // the tag\n * readonly name: string\n * }\n *\n * const Person = Data.tagged<Person>(\"Person\")\n *\n * const mike = Person({ name: \"Mike\" })\n *\n * assert.deepEqual(mike, { _tag: \"Person\", name: \"Mike\" })\n * ```\n *\n * @since 2.0.0\n * @category constructors\n */\nexport const tagged = tag => args => {\n const value = args === undefined ? Object.create(StructuralPrototype) : struct(args);\n value._tag = tag;\n return value;\n};\n/**\n * Provides a constructor for a Case Class.\n *\n * @example\n * ```ts\n * import * as assert from \"node:assert\"\n * import { Data, Equal } from \"effect\"\n *\n * class Person extends Data.Class<{ readonly name: string }> {}\n *\n * // Creating instances of Person\n * const mike1 = new Person({ name: \"Mike\" })\n * const mike2 = new Person({ name: \"Mike\" })\n * const john = new Person({ name: \"John\" })\n *\n * // Checking equality\n * assert.deepStrictEqual(Equal.equals(mike1, mike2), true)\n * assert.deepStrictEqual(Equal.equals(mike1, john), false)\n * ```\n *\n * @since 2.0.0\n * @category constructors\n */\nexport const Class = internal.Structural;\n/**\n * Provides a Tagged constructor for a Case Class.\n *\n * @example\n * ```ts\n * import * as assert from \"node:assert\"\n * import { Data, Equal } from \"effect\"\n *\n * class Person extends Data.TaggedClass(\"Person\")<{ readonly name: string }> {}\n *\n * // Creating instances of Person\n * const mike1 = new Person({ name: \"Mike\" })\n * const mike2 = new Person({ name: \"Mike\" })\n * const john = new Person({ name: \"John\" })\n *\n * // Checking equality\n * assert.deepStrictEqual(Equal.equals(mike1, mike2), true)\n * assert.deepStrictEqual(Equal.equals(mike1, john), false)\n *\n * assert.deepStrictEqual(mike1._tag, \"Person\")\n * ```\n *\n * @since 2.0.0\n * @category constructors\n */\nexport const TaggedClass = tag => {\n class Base extends Class {\n _tag = tag;\n }\n return Base;\n};\n/**\n * @since 2.0.0\n * @category constructors\n */\nexport const Structural = internal.Structural;\n/**\n * Create a constructor for a tagged union of `Data` structs.\n *\n * You can also pass a `TaggedEnum.WithGenerics` if you want to add generics to\n * the constructor.\n *\n * @example\n * ```ts\n * import { Data } from \"effect\"\n *\n * const { BadRequest, NotFound } = Data.taggedEnum<\n * | { readonly _tag: \"BadRequest\"; readonly status: 400; readonly message: string }\n * | { readonly _tag: \"NotFound\"; readonly status: 404; readonly message: string }\n * >()\n *\n * const notFound = NotFound({ status: 404, message: \"Not Found\" })\n * ```\n *\n * @example\n * import { Data } from \"effect\"\n *\n * type MyResult<E, A> = Data.TaggedEnum<{\n * Failure: { readonly error: E }\n * Success: { readonly value: A }\n * }>\n * interface MyResultDefinition extends Data.TaggedEnum.WithGenerics<2> {\n * readonly taggedEnum: MyResult<this[\"A\"], this[\"B\"]>\n * }\n * const { Failure, Success } = Data.taggedEnum<MyResultDefinition>()\n *\n * const success = Success({ value: 1 })\n *\n * @category constructors\n * @since 2.0.0\n */\nexport const taggedEnum = () => new Proxy({}, {\n get(_target, tag, _receiver) {\n if (tag === \"$is\") {\n return Predicate.isTagged;\n } else if (tag === \"$match\") {\n return taggedMatch;\n }\n return tagged(tag);\n }\n});\nfunction taggedMatch() {\n if (arguments.length === 1) {\n const cases = arguments[0];\n return function (value) {\n return cases[value._tag](value);\n };\n }\n const value = arguments[0];\n const cases = arguments[1];\n return cases[value._tag](value);\n}\n/**\n * Provides a constructor for a Case Class.\n *\n * @since 2.0.0\n * @category constructors\n */\nexport const Error = /*#__PURE__*/function () {\n const plainArgsSymbol = /*#__PURE__*/Symbol.for(\"effect/Data/Error/plainArgs\");\n const O = {\n BaseEffectError: class extends core.YieldableError {\n constructor(args) {\n super(args?.message, args?.cause ? {\n cause: args.cause\n } : undefined);\n if (args) {\n Object.assign(this, args);\n // @effect-diagnostics-next-line floatingEffect:off\n Object.defineProperty(this, plainArgsSymbol, {\n value: args,\n enumerable: false\n });\n }\n }\n toJSON() {\n return {\n ...this[plainArgsSymbol],\n ...this\n };\n }\n }\n };\n return O.BaseEffectError;\n}();\n/**\n * @since 2.0.0\n * @category constructors\n */\nexport const TaggedError = tag => {\n const O = {\n BaseEffectError: class extends Error {\n _tag = tag;\n }\n };\n O.BaseEffectError.prototype.name = tag;\n return O.BaseEffectError;\n};\n//# sourceMappingURL=Data.js.map","import { Data, Micro as Effect } from 'effect';\n\nexport class FetchError extends Data.TaggedError('FetchError')<{ cause: unknown }> {}\nexport class NotFoundError extends Data.TaggedError('NotFoundError')<{ url: string }> {}\n\nexport const httpClient = (input: RequestInfo | URL | string, init?: RequestInit) =>\n Effect.gen(function* () {\n const response = yield* Effect.tryPromise({\n try: () => fetch(input, init),\n catch: error => new FetchError({ cause: error }),\n });\n\n if (response.status === 404) {\n return yield* Effect.fail(new NotFoundError({ url: response.url }));\n }\n\n return response;\n });\n\nexport class ResponseTextError extends Data.TaggedError('ResponseTextError')<Error> {\n constructor(error: Error) {\n super(new Error(`Failed to read response text`, { cause: error }));\n }\n}\n\nexport const responseAsText = (res: Response) =>\n Effect.tryPromise({\n try: () => res.text(),\n catch: error => new ResponseTextError(error as Error),\n });\n","import { Brand, Data, Micro as Effect } from 'effect';\n\nexport type SVGString = string & Brand.Brand<'SVG'>;\nexport const SVGString = Brand.refined<SVGString>(isValidSVG, () => Brand.error('SVG data is malformed'));\nexport class BrandValidationError extends Data.TaggedError('BrandValidationError')<Error> {\n constructor(error: Error, type: string) {\n super(new Error(`Brand validation failed for type ${type}.`, { cause: error }));\n }\n}\n\nexport const createValidSVGString = (svg: string) =>\n Effect.try({\n try: () => SVGString(svg),\n catch: error => new BrandValidationError(error as Error, 'SVGString'),\n });\n\nfunction isValidSVG(svg: string): boolean {\n if (typeof svg !== 'string') {\n return false;\n }\n try {\n const parser = new DOMParser();\n const doc = parser.parseFromString(svg, 'image/svg+xml');\n return doc.documentElement.nodeName === 'svg';\n } catch {\n return false;\n }\n}\n","import { Cache, Duration, Effect } from 'effect';\nimport { Icon } from '../..';\nimport { createAssetUrlSafely } from '../../utils/assets';\nimport type { UnwrapEffect } from '../../utils/effect';\nimport { httpClient, responseAsText } from '../../utils/http';\nimport { createValidSVGString, SVGString } from '../../utils/validation/svg';\n\nexport type IconData = SVGString;\nexport type IconCacheKey = `${Icon.IconName}`;\nexport const emptyDefaultSvg = () => SVGString(`<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"></svg>`);\n\n// Create a cache for icon data (concurrent-safe, TTL infinite)\nconst createIconCache = () =>\n Cache.make({\n capacity: 200,\n timeToLive: Duration.infinity,\n lookup: (key: IconCacheKey) =>\n Effect.gen(function* () {\n const name = key as Icon.IconName;\n const assetPath = createAssetUrlSafely(`${name}.svg`, 'icons');\n const res = yield* httpClient(assetPath);\n const responseString = yield* responseAsText(res);\n return yield* createValidSVGString(responseString);\n }),\n });\n\nlet cacheInstance: UnwrapEffect<ReturnType<typeof createIconCache>>[0] | null = null;\n\n/**\n * Fetches an icon from the cache by name, falling back to an empty default SVG if not found.\n *\n * @param name - The name of the icon to fetch from the cache.\n * @returns An Effect that yields a valid SVG string (branded), always.\n *\n * @example\n * ```typescript\n * const iconEffect = fetchIcon('home');\n * ```\n */\nexport function fetchIconSvg(name: Icon.IconName) {\n const key: IconCacheKey = name;\n return Effect.gen(function* () {\n if (!cacheInstance) {\n cacheInstance = yield* createIconCache();\n }\n return yield* cacheInstance.get(key) satisfies Effect.Effect<SVGString, unknown, never>;\n });\n}\n\nexport function clearIconCache() {\n return Effect.gen(function* () {\n if (cacheInstance) {\n yield* cacheInstance.invalidateAll;\n } else {\n Effect.logWarning('Attempted to clear icon cache before it was initialized');\n }\n });\n}\n",":host {\n /**\n * @prop --lmvz-icon-color: The icon's color. This is inferred from the context (e.g. button) but can be overridden if needed, or when the icon is used standalone.\n */\n --lmvz-icon-color: var(--lmvz-component-color, var(--lmvz-semantic-color-on-surface-input-primary));\n\n display: inline-block;\n\n /* prevent additional whitespace */\n line-height: 0;\n\n svg {\n display: block;\n }\n\n svg > path {\n stroke: var(--lmvz-icon-color);\n fill: none;\n }\n}\n\n:host([size='xs']) {\n svg {\n width: var(--lmvz-component-icon-size-xs);\n height: var(--lmvz-component-icon-size-xs);\n }\n}\n:host([size='sm']) {\n svg {\n width: var(--lmvz-component-icon-size-sm);\n height: var(--lmvz-component-icon-size-sm);\n }\n}\n:host([size='md']) {\n svg {\n width: var(--lmvz-component-icon-size-md);\n height: var(--lmvz-component-icon-size-md);\n }\n}\n:host([size='lg']) {\n svg {\n width: var(--lmvz-component-icon-size-lg);\n height: var(--lmvz-component-icon-size-lg);\n }\n}\n:host([size='inherit']) {\n svg {\n width: inherit;\n height: inherit;\n }\n}\n\n:host([weight='light']) {\n svg > path {\n stroke-width: 1;\n }\n}\n:host([weight='medium']) {\n svg > path {\n /* TODO: use semantic token */\n stroke-width: 1.5;\n }\n}\n:host([weight='bold']) {\n svg > path {\n /* TODO: use semantic token */\n stroke-width: 2;\n }\n}\n:host([weight='filled']) {\n svg > path {\n stroke-width: 2;\n fill: var(--lmvz-icon-color);\n }\n}\n","import { Build, Component, Element, h, Host, Prop, State, Watch } from '@stencil/core';\nimport { Effect } from 'effect';\nimport type { Icon } from '../../api';\nimport { AriaValidationController, type AriaValidationHost } from '../../utils/aria/aria-validation-controller';\nimport { ReactiveControllerHost } from '../../utils/reactive-controller-host';\nimport { emptyDefaultSvg, fetchIconSvg, type IconData } from './icons';\n\n/**\n * `lmvz-icon` is a web component that lazy-loads and displays an SVG icon from our predefined icon set.\n * It uses an IntersectionObserver to defer loading the icon until it becomes visible in the viewport. Once loaded, icon data is cached across instances.\n */\n@Component({\n tag: 'lmvz-icon',\n styleUrl: 'lmvz-icon.css',\n scoped: true,\n assetsDirs: ['../../assets/icons'],\n})\nexport class LmvzIcon extends ReactiveControllerHost implements AriaValidationHost {\n private intersectionObserver?: IntersectionObserver;\n private readonly ariaValidationController = new AriaValidationController(this);\n\n @Element() el!: HTMLElement;\n validationEl: HTMLElement | undefined;\n\n /**\n * The name of the icon to display (required).\n */\n @Prop({ reflect: true }) icon!: Icon.IconName;\n\n /**\n * The weight/style of the icon (optional, default is 'medium').\n */\n @Prop({ reflect: true }) weight?: Icon.IconWeight = 'medium';\n\n /**\n * The size of the icon (optional, default is 'md').\n */\n @Prop({ reflect: true }) size?: Icon.Size = 'md';\n\n @State() private iconData?: IconData;\n @State() private visible = false;\n\n @Prop({ reflect: true }) ariaLabel?: string;\n\n private get ariaHidden() {\n return !this.ariaLabel;\n }\n\n constructor() {\n super();\n this.addController(this.ariaValidationController);\n }\n\n override connectedCallback() {\n this.waitUntilVisible(() => {\n this.visible = true;\n this.loadIconPathData();\n });\n super.connectedCallback();\n }\n\n override disconnectedCallback() {\n if (this.intersectionObserver) {\n this.intersectionObserver.disconnect();\n this.intersectionObserver = undefined;\n }\n super.disconnectedCallback();\n }\n\n @Watch('icon')\n private async loadIconPathData() {\n const { icon, visible } = this;\n\n if (!Build.isBrowser || !icon || !visible) {\n return;\n }\n this.iconData = await Effect.runPromise(\n fetchIconSvg(this.icon).pipe(\n Effect.tapError((error) => Effect.logError(`Error loading icon \"${icon}\":`, error.message, error.cause, error.stack)),\n Effect.catchAll(() => Effect.succeed(emptyDefaultSvg())),\n ),\n );\n }\n\n override componentDidRender() {\n this.validationEl = this.el.querySelector('svg') as unknown as HTMLElement;\n this.ariaValidationController.revalidateAria();\n super.componentDidRender();\n }\n\n render() {\n return <Host role=\"img\" aria-hidden={`${this.ariaHidden}`} innerHTML={this.iconData}></Host>;\n }\n\n private waitUntilVisible(callback: () => unknown, rootMargin = 50) {\n if (!Build.isBrowser || typeof window === 'undefined' || !window.IntersectionObserver) {\n callback();\n return;\n }\n\n this.intersectionObserver = new IntersectionObserver(\n (entries) => {\n entries.some((entry) => {\n if (entry.isIntersecting) {\n this.intersectionObserver?.disconnect();\n this.intersectionObserver = undefined;\n callback();\n return true;\n }\n return false;\n });\n },\n { rootMargin: `${rootMargin}px` },\n );\n\n this.intersectionObserver.observe(this.el);\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{p as M,h as e,c as N,t as I}from"./p-C5rqq3bf.js";import{R as i,a as j}from"./p-CI0tffvo.js";import{g as D,c as u}from"./p-DQEkWkMh.js";const g="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDYiIGhlaWdodD0iNzIiIHZpZXdCb3g9IjAgMCA0NiA3MiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzI3Ml80MDUpIj4KPHBhdGggZD0iTTEyLjUgMjAuNjVDMTMuMSAyMC42NSAxNC4yIDIwLjM1IDE0LjcgMjAuMzVDMTYuMSAyMC4zNSAxNy4yIDIxLjQ1IDE3LjIgMjIuODVDMTcuMiAyNC4yNSAxNi4xIDI1LjM1IDE0LjcgMjUuMzVIMi44QzEuMiAyNS4zNSAwIDI0LjE1IDAgMjIuNTVDMCAyMS45NSAwLjIgMjAuNjUgMC4yIDIwLjA1VjUuODQ5OTlDMC4yIDUuMTQ5OTkgMCAzLjk0OTk5IDAgMy4zNDk5OUMwIDEuNzQ5OTkgMS4yIDAuNTQ5OTg4IDIuOCAwLjU0OTk4OEM0LjMgMC41NDk5ODggNS42IDEuNzQ5OTkgNS42IDMuMzQ5OTlDNS42IDMuOTQ5OTkgNS40IDUuMTQ5OTkgNS40IDUuODQ5OTlWMjAuNTVIMTIuNVYyMC42NVpNMjIuMSAyMi43NUMyMi4xIDIyLjE1IDIyLjMgMjAuOTUgMjIuMyAyMC4yNVY1Ljg0OTk5QzIyLjMgNS4xNDk5OSAyMi4xIDMuOTQ5OTkgMjIuMSAzLjQ0OTk5QzIyLjEgMS45NDk5OSAyMy4yIDAuNzQ5OTg4IDI0LjYgMC43NDk5ODhIMjUuMkMyNi40IDAuNzQ5OTg4IDI3LjIgMS41NDk5OSAyNy42IDIuNjQ5OTlMMjggMy40NDk5OUwzMi45IDE0LjA1QzMzLjMgMTQuOTUgMzMuNyAxNi4wNSAzNCAxNi43NUMzNC4zIDE2LjA1IDM0LjcgMTQuOTUgMzUuMSAxNC4wNUw0MCAzLjU0OTk5TDQwLjMgMi41NDk5OUM0MC43IDEuNTQ5OTkgNDEuNSAwLjY0OTk4OCA0Mi42IDAuNjQ5OTg4SDQzLjJDNDQuNyAwLjY0OTk4OCA0NS43IDEuODQ5OTkgNDUuNyAzLjM0OTk5QzQ1LjcgMy45NDk5OSA0NS41IDUuMTQ5OTkgNDUuNSA1Ljc0OTk5VjIwLjE1QzQ1LjUgMjAuODUgNDUuNyAyMi4wNSA0NS43IDIyLjY1QzQ1LjcgMjQuMjUgNDQuNSAyNS40NSA0MyAyNS40NUM0MS40IDI1LjQ1IDQwLjMgMjQuMjUgNDAuMyAyMi42NUM0MC4zIDIxLjk1IDQwLjQgMjAuNzUgNDAuNCAyMC4xNUw0MC42IDE0LjA1QzQwLjYgMTMuMTUgNDAuNyAxMS43NSA0MC43IDEwLjY1TDM3IDE5LjA1QzM2LjcgMTkuNzUgMzYuNiAxOS45NSAzNi40IDIwLjM1QzM2IDIxLjI1IDM1LjMgMjEuODUgMzMuOSAyMS44NUMzMi41IDIxLjg1IDMxLjggMjEuMjUgMzEuNCAyMC40NUMzMS4yIDIwLjA1IDMxLjIgMTkuNzUgMzAuOCAxOS4wNUwyNyAxMC43NUMyNyAxMC43NSAyNy4xIDEzLjE1IDI3LjIgMTQuMDVMMjcuNCAyMC4xNUMyNy40IDIwLjg1IDI3LjUgMjEuOTUgMjcuNSAyMi42NUMyNy41IDI0LjI1IDI2LjQgMjUuNDUgMjQuOCAyNS40NUMyMy4zIDI1LjU1IDIyLjEgMjQuMjUgMjIuMSAyMi43NVpNMjguNyAzMi45NUMyOS4xIDMyLjk1IDMwLjIgMzMuMTUgMzAuNyAzMy4xNUg0MS44QzQyLjMgMzMuMTUgNDMuMiAzMi45NSA0My43IDMyLjk1QzQ0LjkgMzIuOTUgNDUuOCAzMy44NSA0NS44IDM1LjA1QzQ1LjggMzYuMTUgNDQuOSAzNy4xNSA0My43IDM3LjE1QzQzLjMgMzcuMTUgNDIuMyAzNi45NSA0MS44IDM2Ljk1SDMwLjhDMzAuMyAzNi45NSAyOS4yIDM3LjE1IDI4LjggMzcuMTVDMjcuNiAzNy4xNSAyNi43IDM2LjI1IDI2LjcgMzUuMDVDMjYuNiAzMy45NSAyNy41IDMyLjk1IDI4LjcgMzIuOTVaTTIuMSA2Ny4yNUMyLjUgNjcuMjUgMy42IDY3LjQ1IDQuMSA2Ny40NUgxOC41QzE5IDY3LjQ1IDE5LjkgNjcuMjUgMjAuNCA2Ny4yNUMyMS42IDY3LjI1IDIyLjUgNjguMTUgMjIuNSA2OS4zNUMyMi41IDcwLjQ1IDIxLjYgNzEuNDUgMjAuNCA3MS40NUMyMCA3MS40NSAxOSA3MS4yNSAxOC41IDcxLjI1SDQuMUMzLjYgNzEuMjUgMi41IDcxLjQ1IDIuMSA3MS40NUMwLjkgNzEuNDUgMCA3MC41NSAwIDY5LjM1QzAgNjguMjUgMC45IDY3LjI1IDIuMSA2Ny4yNVpNMjEuOSAzNS42NUMyMS45IDM1Ljk1IDIxLjggMzYuMzUgMjEuNiAzNi43NUMyMS4zIDM3LjQ1IDIwLjkgMzguMzUgMjAuNyAzOC44NUwxNC43IDU0LjY1QzE0LjUgNTUuMDUgMTQuNCA1NS41NSAxNC4yIDU2LjM1QzEzLjggNTcuNjUgMTIuNiA1OC4yNSAxMS4yIDU4LjI1SDEwLjhDOS40IDU4LjI1IDguMiA1Ny43NSA3LjggNTYuMzVDNy42IDU1LjU1IDcuNCA1NS4xNSA3LjIgNTQuNjVMMS4yIDM4Ljg1QzEgMzguMzUgMC42IDM3LjU1IDAuMiAzNi44NUMwLjEgMzYuNDUgMCAzNS45NSAwIDM1LjY1QzAgMzQuMTUgMS4yIDMyLjg1IDIuOCAzMi44NUMzLjkgMzIuODUgNSAzMy41NSA1LjMgMzQuNzVDNS41IDM1LjU1IDUuNSAzNi4xNSA2IDM3LjU1TDEwLjIgNDkuNDVDMTAuNSA1MC4zNSAxMC45IDUxLjQ1IDExLjEgNTIuMzVDMTEuMyA1MS40NSAxMS42IDUwLjQ1IDExLjkgNDkuNTVMMTYgMzcuNTVDMTYuNSAzNi4wNSAxNi40IDM1LjY1IDE2LjcgMzQuODVDMTcuMSAzMy42NSAxOC4xIDMyLjg1IDE5LjMgMzIuODVDMjAuOSAzMi44NSAyMS45IDM0LjE1IDIxLjkgMzUuNjVaTTI5LjcgNzEuNDVDMjguMiA3MS40NSAyNy4yIDcwLjQ1IDI3LjIgNjkuMTVDMjcuMiA2OC43NSAyNy4yIDY4LjI1IDI3LjggNjcuNDVMMzcuNCA1My40NUMzNy45IDUyLjc1IDM4LjUgNTIuMDUgMzkuMSA1MS4zNUgzMi4yQzMxLjUgNTEuMzUgMzAuNyA1MS42NSAzMC4xIDUxLjY1QzI4LjcgNTEuNjUgMjcuNiA1MC43NSAyNy42IDQ5LjM1QzI3LjYgNDcuOTUgMjguNyA0Ni45NSAzMC4xIDQ2Ljk1SDQyLjdDNDQuMiA0Ni45NSA0NS4yIDQ3Ljg1IDQ1LjIgNDkuMjVDNDUuMiA0OS42NSA0NSA1MC4zNSA0NC41IDUxLjA1TDM1LjIgNjQuODVDMzQuNyA2NS42NSAzNC4xIDY2LjQ1IDMzLjUgNjcuMDVINDEuMUM0MS45IDY3LjA1IDQyLjcgNjYuNzUgNDMuMyA2Ni43NUM0NC43IDY2Ljc1IDQ1LjcgNjcuNzUgNDUuNyA2OS4wNUM0NS43IDcwLjU1IDQ0LjUgNzEuNTUgNDMuMiA3MS41NUgyOS43VjcxLjQ1WiIgZmlsbD0iYmxhY2siLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8yNzJfNDA1Ij4KPHJlY3Qgd2lkdGg9IjQ2IiBoZWlnaHQ9IjcyIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=";class a{host;elements=[];constructor(M){this.host=M}hostDidRender(){this.host.el.addEventListener("keydown",this.handleKeydown)}updateElements(M){this.elements=M}handleKeydown=M=>{const{key:e}=M;if(!["ArrowDown","ArrowRight","ArrowUp","ArrowLeft"].includes(e))return;const N=D(document);const I=this.getNextFocusableElement(N,["ArrowDown","ArrowRight"].includes(e)?"down":"up");if(I){M.preventDefault();I.focus?.()}};getNextFocusableElement(M,e){if(!M)return undefined;const{elements:N}=this;const I=N.indexOf(M);if(I===-1)return undefined;let i=undefined;if(e==="down"){i=(I+1)%N.length}else if(e==="up"){i=(I-1+N.length)%N.length}if(i==undefined)return undefined;const j=N[i];if(!u(j))return this.getNextFocusableElement(j,e);return j}}const t=()=>`:host{display:flex;width:100vw;flex-direction:row;align-items:center;box-sizing:border-box;background-color:var(--lmvz-semantic-color-surface-primary, #ffffff);--lmvz-header-x-spacing-level-1:var(--lmvz-dimension-8-28, clamp(0.5rem, 0.2rem + 1.29vw, 1.75rem));--lmvz-header-x-spacing-level-2:var(--lmvz-component-buttongroup-wrapper-gap-x, clamp(0.25rem, 0.16rem + 0.39vw, 0.63rem));padding:var(--lmvz-dimension-8-16, clamp(0.5rem, 0.38rem + 0.52vw, 1rem)) var(--lmvz-header-x-spacing-level-1);gap:var(--lmvz-header-x-spacing-level-1);.brand{display:inline-flex;justify-content:center;align-items:center}#fallback-logo-lmvz{height:34px;width:auto}nav{flex-grow:1}.primary-menubar{display:flex;flex-direction:row;align-items:center}.secondary-menubar{display:flex;flex-direction:row;align-items:center;margin-left:var(--lmvz-header-x-spacing-level-2);padding-left:var(--lmvz-header-x-spacing-level-2);border-left:1px solid var(--lmvz-semantic-color-border-default, #e0e0e0)}}`;const r=M(class M extends i{get el(){return this}get validationEl(){return this.el}primarySlot;secondarySlot;secondaryNav;keyboardNavigationController=new a(this);get primaryMenuitems(){return this.primarySlot?.assignedElements({flatten:false})||[]}get secondaryMenuitems(){return this.secondarySlot?.assignedElements({flatten:true})||[]}get role(){return"banner"}lmvzActiveNav;get secondarySlotName(){return`connect-nav-${this.lmvzActiveNav}`}constructor(M){super(false);if(M!==false){this.__registerHost()}this.__attachShadow();this.addController(new j(this,{reValidateOnPropChanges:true}));this.addController(this.keyboardNavigationController)}handleActiveNavChange(){this.updateElementsActive()}componentDidLoad(){this.primarySlot?.addEventListener("slotchange",this.handlePrimaryNavItemsChange.bind(this));this.handlePrimaryNavItemsChange();this.secondarySlot?.addEventListener("slotchange",this.handleSecondaryNavItemsChange.bind(this));super.componentDidLoad()}handlePrimaryNavItemsChange(){const M=this.primaryMenuitems;if(!M.length){console.warn("Primary slot has no assigned elements. Please add navigation items to the primary slot.");return}M.forEach((M=>{M.setAttribute("aria-haspopup","true");M.setAttribute("aria-controls",`nav-secondary`)}));this.updateElementsActive();this.updateKeyboardNavSubjects()}handleSecondaryNavItemsChange(){const M=this.secondaryMenuitems;if(!M.length){return}this.updateKeyboardNavSubjects()}updateKeyboardNavSubjects(){this.keyboardNavigationController.updateElements([...this.primaryMenuitems,...this.secondaryMenuitems])}updateElementsActive(){const M=this.primaryMenuitems;if(!M.length)return;let e="";M.forEach((M=>{const N=M.id===this.lmvzActiveNav;if(N)e=M.textContent||M.id;M.setAttribute("aria-expanded",N?"true":"false")}));if(!e)return;this.secondaryNav?.setAttribute("aria-label",`Untermenü für ${e}`)}delegateFocus(){const M=this.primaryMenuitems[0];if(M){M.focus()}}render(){return e(N,{key:"35883b5d4a92d10b5b010d822fb2233604464f9b",onFocus:this.delegateFocus.bind(this)},e("div",{key:"6fdec3af75bab2b076651b8cfef4aec8e23326a6",class:"brand"},e("slot",{key:"3127b4223b8bebfe425efc7ce45626f37fbf76b9",name:"brand"},e("img",{key:"20b3dd598e320c6950fb08bbd55dd80c47552eaf",id:"fallback-logo-lmvz",src:g,alt:"Lehrmittelverlag Zürich"}))),e("nav",{key:"c3bf07f78930085c1a7b89421506bcd41d139911","aria-label":"Hauptnavigation"},e("div",{key:"fbc5199080f52da4f10c8c14fbbc0877ecc5f31c",role:"menubar",class:"primary-menubar"},e("slot",{key:"4210d213dcf7a1a27a73f2a9cf7ff97fec62f0db",name:"nav-primary",ref:M=>this.primarySlot=M}),e("div",{key:"7b91c269f75e1245f75d471ec5bb7eeabfe1094d",role:"menu",id:"nav-secondary",class:"secondary-menubar",hidden:!this.lmvzActiveNav,ref:M=>this.secondaryNav=M},e("slot",{key:"e23eb0f222b49d912bb45870df6d9b0d01f43788",name:this.secondarySlotName,ref:M=>this.secondarySlot=M})))),e("div",{key:"4b19026d5b2e54aa7aed072ce57de4acaa75cb4f",class:"actions"},e("slot",{key:"8f02d5d178bb60b40604fcd1be74d373d89c911f",name:"actions"})))}static get watchers(){return{lmvzActiveNav:[{handleActiveNavChange:0}]}}static get style(){return t()}},[769,"lmvz-header",{role:[2561],lmvzActiveNav:[1,"lmvz-active-nav"]},undefined,{lmvzActiveNav:[{handleActiveNavChange:0}]}]);function A(){if(typeof customElements==="undefined"){return}const M=["lmvz-header"];M.forEach((M=>{switch(M){case"lmvz-header":if(!customElements.get(I(M))){customElements.define(I(M),r)}break}}))}export{r as L,A as d};
|
|
2
|
+
//# sourceMappingURL=p-BXdOuZTp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["logoSvg","ListKeyboardNavigationController","host","elements","constructor","this","hostDidRender","el","addEventListener","handleKeydown","updateElements","event","key","includes","activeElement","getDeepActiveElement","document","nextElement","getNextFocusableElement","preventDefault","focus","current","direction","undefined","currentIndex","indexOf","nextIndex","length","candidate","canReceiveFocus","lmvzHeaderCss","LmvzHeader","__stencil_proxyCustomElement","ReactiveControllerHost","validationEl","primarySlot","secondarySlot","secondaryNav","keyboardNavigationController","primaryMenuitems","assignedElements","flatten","secondaryMenuitems","role","lmvzActiveNav","secondarySlotName","registerHost","addController","AriaValidationController","reValidateOnPropChanges","handleActiveNavChange","updateElementsActive","componentDidLoad","handlePrimaryNavItemsChange","bind","handleSecondaryNavItemsChange","super","items","console","warn","forEach","setAttribute","updateKeyboardNavSubjects","label","isActive","id","textContent","delegateFocus","firstFocusable","render","h","Host","onFocus","class","name","src","logo","alt","ref","hidden"],"sources":["src/assets/icons/Logo.svg","src/utils/aria/list-keyboard-controller.ts","src/components/lmvz-header/lmvz-header.css?tag=lmvz-header&encapsulation=shadow","src/components/lmvz-header/lmvz-header.tsx"],"sourcesContent":["<svg width=\"46\" height=\"72\" viewBox=\"0 0 46 72\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<g clip-path=\"url(#clip0_272_405)\">\n<path d=\"M12.5 20.65C13.1 20.65 14.2 20.35 14.7 20.35C16.1 20.35 17.2 21.45 17.2 22.85C17.2 24.25 16.1 25.35 14.7 25.35H2.8C1.2 25.35 0 24.15 0 22.55C0 21.95 0.2 20.65 0.2 20.05V5.84999C0.2 5.14999 0 3.94999 0 3.34999C0 1.74999 1.2 0.549988 2.8 0.549988C4.3 0.549988 5.6 1.74999 5.6 3.34999C5.6 3.94999 5.4 5.14999 5.4 5.84999V20.55H12.5V20.65ZM22.1 22.75C22.1 22.15 22.3 20.95 22.3 20.25V5.84999C22.3 5.14999 22.1 3.94999 22.1 3.44999C22.1 1.94999 23.2 0.749988 24.6 0.749988H25.2C26.4 0.749988 27.2 1.54999 27.6 2.64999L28 3.44999L32.9 14.05C33.3 14.95 33.7 16.05 34 16.75C34.3 16.05 34.7 14.95 35.1 14.05L40 3.54999L40.3 2.54999C40.7 1.54999 41.5 0.649988 42.6 0.649988H43.2C44.7 0.649988 45.7 1.84999 45.7 3.34999C45.7 3.94999 45.5 5.14999 45.5 5.74999V20.15C45.5 20.85 45.7 22.05 45.7 22.65C45.7 24.25 44.5 25.45 43 25.45C41.4 25.45 40.3 24.25 40.3 22.65C40.3 21.95 40.4 20.75 40.4 20.15L40.6 14.05C40.6 13.15 40.7 11.75 40.7 10.65L37 19.05C36.7 19.75 36.6 19.95 36.4 20.35C36 21.25 35.3 21.85 33.9 21.85C32.5 21.85 31.8 21.25 31.4 20.45C31.2 20.05 31.2 19.75 30.8 19.05L27 10.75C27 10.75 27.1 13.15 27.2 14.05L27.4 20.15C27.4 20.85 27.5 21.95 27.5 22.65C27.5 24.25 26.4 25.45 24.8 25.45C23.3 25.55 22.1 24.25 22.1 22.75ZM28.7 32.95C29.1 32.95 30.2 33.15 30.7 33.15H41.8C42.3 33.15 43.2 32.95 43.7 32.95C44.9 32.95 45.8 33.85 45.8 35.05C45.8 36.15 44.9 37.15 43.7 37.15C43.3 37.15 42.3 36.95 41.8 36.95H30.8C30.3 36.95 29.2 37.15 28.8 37.15C27.6 37.15 26.7 36.25 26.7 35.05C26.6 33.95 27.5 32.95 28.7 32.95ZM2.1 67.25C2.5 67.25 3.6 67.45 4.1 67.45H18.5C19 67.45 19.9 67.25 20.4 67.25C21.6 67.25 22.5 68.15 22.5 69.35C22.5 70.45 21.6 71.45 20.4 71.45C20 71.45 19 71.25 18.5 71.25H4.1C3.6 71.25 2.5 71.45 2.1 71.45C0.9 71.45 0 70.55 0 69.35C0 68.25 0.9 67.25 2.1 67.25ZM21.9 35.65C21.9 35.95 21.8 36.35 21.6 36.75C21.3 37.45 20.9 38.35 20.7 38.85L14.7 54.65C14.5 55.05 14.4 55.55 14.2 56.35C13.8 57.65 12.6 58.25 11.2 58.25H10.8C9.4 58.25 8.2 57.75 7.8 56.35C7.6 55.55 7.4 55.15 7.2 54.65L1.2 38.85C1 38.35 0.6 37.55 0.2 36.85C0.1 36.45 0 35.95 0 35.65C0 34.15 1.2 32.85 2.8 32.85C3.9 32.85 5 33.55 5.3 34.75C5.5 35.55 5.5 36.15 6 37.55L10.2 49.45C10.5 50.35 10.9 51.45 11.1 52.35C11.3 51.45 11.6 50.45 11.9 49.55L16 37.55C16.5 36.05 16.4 35.65 16.7 34.85C17.1 33.65 18.1 32.85 19.3 32.85C20.9 32.85 21.9 34.15 21.9 35.65ZM29.7 71.45C28.2 71.45 27.2 70.45 27.2 69.15C27.2 68.75 27.2 68.25 27.8 67.45L37.4 53.45C37.9 52.75 38.5 52.05 39.1 51.35H32.2C31.5 51.35 30.7 51.65 30.1 51.65C28.7 51.65 27.6 50.75 27.6 49.35C27.6 47.95 28.7 46.95 30.1 46.95H42.7C44.2 46.95 45.2 47.85 45.2 49.25C45.2 49.65 45 50.35 44.5 51.05L35.2 64.85C34.7 65.65 34.1 66.45 33.5 67.05H41.1C41.9 67.05 42.7 66.75 43.3 66.75C44.7 66.75 45.7 67.75 45.7 69.05C45.7 70.55 44.5 71.55 43.2 71.55H29.7V71.45Z\" fill=\"black\"/>\n</g>\n<defs>\n<clipPath id=\"clip0_272_405\">\n<rect width=\"46\" height=\"72\" fill=\"white\"/>\n</clipPath>\n</defs>\n</svg>\n","import { canReceiveFocus, getDeepActiveElement } from '../component';\nimport type { ReactiveController } from '../reactive-controller-host';\n\nexport type ListKeyboardNavigationHost = {\n el: HTMLElement;\n};\n\n// type Config = {};\n\nexport class ListKeyboardNavigationController implements ReactiveController {\n private elements: Element[] = [];\n\n constructor(\n private readonly host: ListKeyboardNavigationHost,\n // private readonly config?: Config,\n ) {}\n\n hostDidRender() {\n this.host.el.addEventListener('keydown', this.handleKeydown);\n }\n\n updateElements(elements: Element[]) {\n this.elements = elements;\n }\n\n private handleKeydown = (event: KeyboardEvent) => {\n const { key } = event;\n if (!['ArrowDown', 'ArrowRight', 'ArrowUp', 'ArrowLeft'].includes(key)) return;\n\n const activeElement = getDeepActiveElement(document);\n const nextElement = this.getNextFocusableElement(activeElement, ['ArrowDown', 'ArrowRight'].includes(key) ? 'down' : 'up');\n if (nextElement) {\n event.preventDefault();\n (nextElement as HTMLElement).focus?.();\n }\n };\n\n private getNextFocusableElement(current: Element | undefined | null, direction: 'down' | 'up'): Element | undefined {\n if (!current) return undefined;\n const { elements } = this;\n const currentIndex = elements.indexOf(current);\n if (currentIndex === -1) return undefined;\n\n let nextIndex: number | undefined = undefined;\n if (direction === 'down') {\n nextIndex = (currentIndex + 1) % elements.length;\n } else if (direction === 'up') {\n nextIndex = (currentIndex - 1 + elements.length) % elements.length;\n }\n\n if (nextIndex == undefined) return undefined;\n\n const candidate = elements[nextIndex];\n if (!canReceiveFocus(candidate)) return this.getNextFocusableElement(candidate, direction);\n\n return candidate;\n }\n}\n",":host {\n display: flex;\n /* TODO: why does it overflow on smaller screens? */\n width: 100vw;\n flex-direction: row;\n align-items: center;\n box-sizing: border-box;\n\n background-color: var(--lmvz-semantic-color-surface-primary);\n\n --lmvz-header-x-spacing-level-1: var(--lmvz-dimension-8-28);\n --lmvz-header-x-spacing-level-2: var(--lmvz-component-buttongroup-wrapper-gap-x);\n\n padding: var(--lmvz-dimension-8-16) var(--lmvz-header-x-spacing-level-1);\n gap: var(--lmvz-header-x-spacing-level-1);\n\n .brand {\n /* min-width: var(--lmvz-dimension-48-96); */\n display: inline-flex;\n justify-content: center;\n align-items: center;\n }\n\n #fallback-logo-lmvz {\n height: 34px;\n width: auto;\n }\n\n nav {\n flex-grow: 1;\n }\n\n .primary-menubar {\n display: flex;\n flex-direction: row;\n align-items: center;\n }\n .secondary-menubar {\n display: flex;\n flex-direction: row;\n align-items: center;\n /* gap: var(--lmvz-component-buttongroup-wrapper-gap-x); */\n margin-left: var(--lmvz-header-x-spacing-level-2);\n padding-left: var(--lmvz-header-x-spacing-level-2);\n border-left: 1px solid var(--lmvz-semantic-color-border-default);\n }\n}\n","import { Component, Element, h, Host, Prop, Watch } from '@stencil/core';\nimport logo from '../../assets/icons/Logo.svg';\nimport { AriaValidationController, type AriaValidationHost } from '../../utils/aria/aria-validation-controller';\nimport { ListKeyboardNavigationController, type ListKeyboardNavigationHost } from '../../utils/aria/list-keyboard-controller';\nimport { ReactiveControllerHost } from '../../utils/reactive-controller-host';\n\n/**\n * An accessible, application-style navigation header component, that renders two connected levels of navigation.\n *\n * @slot brand - The branding area, typically containing a logo and/or site title.\n *\n * @slot nav-primary - The first level of the navigation.\n * This is required and must only contain <lmvz-menuitem> elements.\n * Each menuitem should have an id, which will be used to link it to the corresponding secondary nav items.\n *\n * @slot connect-nav-`lmvzActiveNav` - The second level of the navigation. This is optional and must also contain <lmvz-menuitem> elements.\n * Only if the secondary nav items' `slot=\"${name}\"` matches \"connect-nav-`lmvzActiveNav`\"\n * (including lmvzActiveNav from the component's props),\n * then these secondary items will be displayed in the second level navigation.\n *\n * @slot actions - An optional slot for actions, such as user profile, settings, logout, etc. This content is aligned to the right side of the header.\n */\n@Component({\n tag: 'lmvz-header',\n styleUrl: './lmvz-header.css',\n shadow: true,\n})\nexport class LmvzHeader extends ReactiveControllerHost implements AriaValidationHost, ListKeyboardNavigationHost {\n @Element() readonly el!: HTMLElement;\n get validationEl() {\n return this.el;\n }\n\n private primarySlot?: HTMLSlotElement;\n private secondarySlot?: HTMLSlotElement;\n private secondaryNav?: HTMLElement;\n\n private keyboardNavigationController = new ListKeyboardNavigationController(this);\n\n private get primaryMenuitems() {\n return this.primarySlot?.assignedElements({ flatten: false }) || [];\n }\n\n private get secondaryMenuitems() {\n return this.secondarySlot?.assignedElements({ flatten: true }) || [];\n }\n\n @Prop({ reflect: true }) get role() {\n return 'banner';\n }\n\n @Prop() lmvzActiveNav?: string;\n\n get secondarySlotName() {\n return `connect-nav-${this.lmvzActiveNav}`;\n }\n\n constructor() {\n super();\n this.addController(new AriaValidationController(this, { reValidateOnPropChanges: true }));\n this.addController(this.keyboardNavigationController);\n }\n\n @Watch('lmvzActiveNav')\n handleActiveNavChange() {\n this.updateElementsActive();\n }\n\n override componentDidLoad() {\n this.primarySlot?.addEventListener('slotchange', this.handlePrimaryNavItemsChange.bind(this));\n this.handlePrimaryNavItemsChange(); // initial check for already assigned elements\n this.secondarySlot?.addEventListener('slotchange', this.handleSecondaryNavItemsChange.bind(this));\n super.componentDidLoad();\n }\n\n private handlePrimaryNavItemsChange() {\n const items = this.primaryMenuitems;\n if (!items.length) {\n console.warn('Primary slot has no assigned elements. Please add navigation items to the primary slot.');\n return;\n }\n\n items.forEach((el) => {\n el.setAttribute('aria-haspopup', 'true');\n el.setAttribute('aria-controls', `nav-secondary`);\n });\n this.updateElementsActive();\n this.updateKeyboardNavSubjects();\n }\n\n private handleSecondaryNavItemsChange() {\n const items = this.secondaryMenuitems;\n if (!items.length) {\n // It's valid to have no secondary items for a given primary item, so we just return early without warning\n return;\n }\n this.updateKeyboardNavSubjects();\n }\n\n private updateKeyboardNavSubjects() {\n this.keyboardNavigationController.updateElements([...this.primaryMenuitems, ...this.secondaryMenuitems]);\n }\n\n private updateElementsActive() {\n const items = this.primaryMenuitems;\n if (!items.length) return;\n\n let label = '';\n items.forEach((el) => {\n const isActive = el.id === this.lmvzActiveNav;\n if (isActive) label = el.textContent || el.id;\n el.setAttribute('aria-expanded', isActive ? 'true' : 'false');\n });\n if (!label) return;\n\n this.secondaryNav?.setAttribute('aria-label', `Untermenü für ${label}`);\n }\n\n private delegateFocus() {\n // If the header itself receives focus, delegate it to the first focusable element in the primary nav\n const firstFocusable = this.primaryMenuitems[0] as HTMLElement | undefined;\n if (firstFocusable) {\n firstFocusable.focus();\n }\n }\n\n render() {\n return (\n <Host onFocus={this.delegateFocus.bind(this)}>\n <div class=\"brand\">\n <slot name=\"brand\">\n <img id=\"fallback-logo-lmvz\" src={logo} alt=\"Lehrmittelverlag Zürich\" />\n </slot>\n {/* brand image, title, etc. */}\n </div>\n\n <nav aria-label=\"Hauptnavigation\">\n <div role=\"menubar\" class=\"primary-menubar\">\n <slot name=\"nav-primary\" ref={(el) => (this.primarySlot = el)}></slot>\n\n <div role=\"menu\" id=\"nav-secondary\" class=\"secondary-menubar\" hidden={!this.lmvzActiveNav} ref={(el) => (this.secondaryNav = el)}>\n <slot name={this.secondarySlotName} ref={(el) => (this.secondarySlot = el)}></slot>\n </div>\n </div>\n </nav>\n\n <div class=\"actions\">\n <slot name=\"actions\"></slot>\n {/* user avatar, name, settings, etc. */}\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
function r(r){return r&&r.__esModule&&Object.prototype.hasOwnProperty.call(r,"default")?r
|
|
1
|
+
function r(r){return r&&r.__esModule&&Object.prototype.hasOwnProperty.call(r,"default")?r["default"]:r}var n={exports:{}};
|
|
2
2
|
/*!
|
|
3
3
|
Copyright (c) 2018 Jed Watson.
|
|
4
4
|
Licensed under the MIT License (MIT), see
|
|
5
5
|
http://jedwatson.github.io/classnames
|
|
6
|
-
*/
|
|
6
|
+
*/var t;function e(){if(t)return n.exports;t=1;(function(r){(function(){var n={}.hasOwnProperty;function t(){var r="";for(var n=0;n<arguments.length;n++){var t=arguments[n];if(t){r=f(r,e(t))}}return r}function e(r){if(typeof r==="string"||typeof r==="number"){return r}if(typeof r!=="object"){return""}if(Array.isArray(r)){return t.apply(null,r)}if(r.toString!==Object.prototype.toString&&!r.toString.toString().includes("[native code]")){return r.toString()}var e="";for(var u in r){if(n.call(r,u)&&r[u]){e=f(e,u)}}return e}function f(r,n){if(!n){return r}if(r){return r+" "+n}return r+n}if(r.exports){t.default=t;r.exports=t}else{window.classNames=t}})()})(n);return n.exports}var f=e();var u=r(f);export{u as c};
|
|
7
|
+
//# sourceMappingURL=p-BfTCfPZ1.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["hasOwn","hasOwnProperty","classNames","classes","i","arguments","length","arg","appendClass","parseValue","Array","isArray","apply","toString","Object","prototype","includes","key","call","value","newClass","module","exports","default","window"],"sources":["../../node_modules/.pnpm/classnames@2.5.1/node_modules/classnames/index.js"],"sourcesContent":["/*!\n\tCopyright (c) 2018 Jed Watson.\n\tLicensed under the MIT License (MIT), see\n\thttp://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\n\tfunction classNames () {\n\t\tvar classes = '';\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (arg) {\n\t\t\t\tclasses = appendClass(classes, parseValue(arg));\n\t\t\t}\n\t\t}\n\n\t\treturn classes;\n\t}\n\n\tfunction parseValue (arg) {\n\t\tif (typeof arg === 'string' || typeof arg === 'number') {\n\t\t\treturn arg;\n\t\t}\n\n\t\tif (typeof arg !== 'object') {\n\t\t\treturn '';\n\t\t}\n\n\t\tif (Array.isArray(arg)) {\n\t\t\treturn classNames.apply(null, arg);\n\t\t}\n\n\t\tif (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes('[native code]')) {\n\t\t\treturn arg.toString();\n\t\t}\n\n\t\tvar classes = '';\n\n\t\tfor (var key in arg) {\n\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\tclasses = appendClass(classes, key);\n\t\t\t}\n\t\t}\n\n\t\treturn classes;\n\t}\n\n\tfunction appendClass (value, newClass) {\n\t\tif (!newClass) {\n\t\t\treturn value;\n\t\t}\n\t\n\t\tif (value) {\n\t\t\treturn value + ' ' + newClass;\n\t\t}\n\t\n\t\treturn value + newClass;\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\tdefine('classnames', [], function () {\n\t\t\treturn classNames;\n\t\t});\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n"],"mappings":";;;;;6DAOC,WAGA,IAAIA,EAAS,GAAGC,eAEhB,SAASC,IACR,IAAIC,EAAU,GAEd,IAAK,IAAIC,EAAI,EAAGA,EAAIC,UAAUC,OAAQF,IAAK,CAC1C,IAAIG,EAAMF,UAAUD,GACpB,GAAIG,EAAK,CACRJ,EAAUK,EAAYL,EAASM,EAAWF,GAC9C,CACA,CAEE,OAAOJ,CACT,CAEC,SAASM,EAAYF,GACpB,UAAWA,IAAQ,iBAAmBA,IAAQ,SAAU,CACvD,OAAOA,CACV,CAEE,UAAWA,IAAQ,SAAU,CAC5B,MAAO,EACV,CAEE,GAAIG,MAAMC,QAAQJ,GAAM,CACvB,OAAOL,EAAWU,MAAM,KAAML,EACjC,CAEE,GAAIA,EAAIM,WAAaC,OAAOC,UAAUF,WAAaN,EAAIM,SAASA,WAAWG,SAAS,iBAAkB,CACrG,OAAOT,EAAIM,UACd,CAEE,IAAIV,EAAU,GAEd,IAAK,IAAIc,KAAOV,EAAK,CACpB,GAAIP,EAAOkB,KAAKX,EAAKU,IAAQV,EAAIU,GAAM,CACtCd,EAAUK,EAAYL,EAASc,EACnC,CACA,CAEE,OAAOd,CACT,CAEC,SAASK,EAAaW,EAAOC,GAC5B,IAAKA,EAAU,CACd,OAAOD,CACV,CAEE,GAAIA,EAAO,CACV,OAAOA,EAAQ,IAAMC,CACxB,CAEE,OAAOD,EAAQC,CACjB,CAEC,GAAqCC,EAAOC,QAAS,CACpDpB,EAAWqB,QAAUrB,EACrBmB,EAAAC,QAAiBpB,CACnB,KAKQ,CACNsB,OAAOtB,WAAaA,CACtB,CACA,EArEA,E","ignoreList":[]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{p as t,d as o,h as e,c as r,t as n}from"./p-C5rqq3bf.js";import{c as a}from"./p-BfTCfPZ1.js";import{R as l,a as m}from"./p-CI0tffvo.js";import{E as i}from"./p-CN0JX9-m.js";import{i as s,f as d}from"./p-DQEkWkMh.js";const c=()=>` @layer lmvz-ds.reset, lmvz-ds.theme, lmvz-ds.components, lmvz-ds.overrides; @layer lmvz-ds.theme { @font-face { font-family: Router; src: local('Router-Book'), url('/assets/fonts/Router-Book.woff') format('woff'), local('Router'); font-weight: 400 normal; } @font-face { font-family: Router; src: local('Router-Medium'), url('/assets/fonts/Router-Medium.woff') format('woff'), local('Router'); font-weight: 500; } @font-face { font-family: Router; src: local('Router-Bold'), url('/assets/fonts/Router-Bold.woff') format('woff'), local('Router'); font-weight: 700 bold; } } @layer lmvz-ds.reset { body { margin: 0; } h1, h2, h3, h4, h5, h6 { margin: 0; } } :host { button { --lmvz-button-color: var(--lmvz-component-color, var(--lmvz-semantic-color-int-on-primary, #ffffff)); --lmvz-button-padding-inline: var(--lmvz-button-padding, var(--lmvz-component-input-md-padding-x, clamp(0.75rem, 0.69rem + 0.26vw, 1rem))); --lmvz-button-padding-block: var(--lmvz-button-padding, var(--lmvz-component-input-md-padding-y, clamp(0.75rem, 0.69rem + 0.26vw, 1rem))); --lmvz-button-gap: var(--lmvz-component-input-md-gap-x, clamp(0.25rem, 0.16rem + 0.39vw, 0.63rem)); --lmvz-button-font: var(--lmvz-typography-body-lg, 400 clamp(1rem, 0.97rem + 0.13vw, 1.13rem) / 1.4 Router); --lmvz-button-radius: var(--lmvz-component-input-radius-default, 999px); --lmvz-button-border-width: 0; --lmvz-button-border-color: transparent; --lmvz-button-background: var(--lmvz-semantic-color-int-primary, #000000); display: inline-flex; align-items: center; justify-content: center; gap: var(--lmvz-button-gap); padding-block: var(--lmvz-button-padding-block); padding-inline: var(--lmvz-button-padding-inline); border-radius: var(--lmvz-button-radius); border: var(--lmvz-button-border-width) solid var(--lmvz-button-border-color); background-color: var(--lmvz-button-background); color: var(--lmvz-button-color); cursor: pointer; font: var(--lmvz-button-font); text-align: center; text-decoration: none; white-space: nowrap; transition: background-color 0.15s ease, color 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease; } button > * { font: inherit; color: inherit; } button:focus-visible { outline: var(--lmvz-semantic-border-width-default, 1px) solid var(--lmvz-semantic-color-status-selected, #f1f9fe); outline-offset: var(--lmvz-component-input-sm-padding-x, clamp(0.5rem, 0.44rem + 0.26vw, 0.75rem)); } button:is([disabled], .disabled) { cursor: not-allowed; pointer-events: none; opacity: var(--lmvz-component-input-disabled-opacity, 40%); } button:not([disabled]):hover { --lmvz-button-background: var(--lmvz-semantic-color-int-primary-hover, #2e2e2e); } button:not([disabled]):active { --lmvz-button-background: var(--lmvz-semantic-color-int-primary-active, #545454); } button.secondary { --lmvz-button-background: var(--lmvz-semantic-color-int-secondary, #f0f0f0); --lmvz-button-color: var(--lmvz-semantic-color-int-on-secondary, #000000); --lmvz-button-border-width: var(--lmvz-semantic-border-width-default, 1px); --lmvz-button-border-color: var(--lmvz-semantic-color-border-default, #e0e0e0); } button.secondary:not([disabled], .disabled):hover { --lmvz-button-background: var(--lmvz-semantic-color-int-secondary-hover, #e0e0e0); --lmvz-button-border-color: var(--lmvz-semantic-color-border-hover, #c7c7c7); } button.secondary:not([disabled], .disabled):active { --lmvz-button-background: var(--lmvz-semantic-color-int-secondary-active, #d4d4d4); --lmvz-button-border-color: var(--lmvz-semantic-color-border-active, #d4d4d4); } button.tertiary { --lmvz-button-background: var(--lmvz-semantic-color-int-tertiary, #ffffff); --lmvz-button-color: var(--lmvz-semantic-color-int-on-tertiary, #545454); } button.tertiary:not([disabled], .disabled):hover { --lmvz-button-background: var(--lmvz-semantic-color-int-tertiary-hover, #f0f0f0); } button.tertiary:not([disabled], .disabled):active { --lmvz-button-background: var(--lmvz-semantic-color-int-tertiary-active, #e0e0e0); } button.small { --lmvz-button-padding-inline: var(--lmvz-component-input-sm-padding-x, clamp(0.5rem, 0.44rem + 0.26vw, 0.75rem)); --lmvz-button-padding-block: var(--lmvz-component-input-sm-padding-y, clamp(0.5rem, 0.44rem + 0.26vw, 0.75rem)); --lmvz-button-gap: var(--lmvz-component-input-sm-gap-x, clamp(0.25rem, 0.16rem + 0.39vw, 0.63rem)); --lmvz-button-font: var(--lmvz-typography-body-md, 400 clamp(0.88rem, 0.84rem + 0.13vw, 1rem) / 1.4 Router); } button.large { --lmvz-button-padding-inline: var(--lmvz-component-input-lg-padding-x, clamp(0.88rem, 0.78rem + 0.39vw, 1.25rem)); --lmvz-button-padding-block: var(--lmvz-component-input-lg-padding-y, clamp(0.88rem, 0.78rem + 0.39vw, 1.25rem)); --lmvz-button-gap: var(--lmvz-component-input-lg-gap-x, clamp(0.25rem, 0.16rem + 0.39vw, 0.63rem)); --lmvz-button-font: var(--lmvz-typography-body-lg, 400 clamp(1rem, 0.97rem + 0.13vw, 1.13rem) / 1.4 Router); } display: contents; } ::slotted(*) { --lmvz-component-color: var(--lmvz-button-color); } `;const v=t(class t extends l{get el(){return this}validationEl;inheritedAttributes={};formEl=null;formButtonEl=null;lmvzActivation;get ti(){return 0}scale="default";variant="secondary";disabled=false;type="button";form;constructor(t){super(false);if(t!==false){this.__registerHost()}this.__attachShadow();this.lmvzActivation=o(this,"lmvzActivation");this.addController(new m(this));this.addController(new i(this,{localHandler:this.handleClick.bind(this),keys:["Enter"]}))}connectedCallback(){this.inheritedAttributes=s(this.el);super.connectedCallback()}renderHiddenButton(){const t=this.formEl=d(this.form,this.el);if(!t)return;const{formButtonEl:o}=this;if(o!==null&&t.contains(o))return;const e=this.formButtonEl=document.createElement("button");e.type="submit";e.style.display="none";e.disabled=this.disabled;t.appendChild(e)}submitForm(t){if(this.formEl&&this.formButtonEl){t.preventDefault();this.formButtonEl.click()}}handleClick=t=>{if(this.type==="submit"){this.submitForm(t)}};render(){this.renderHiddenButton();return e(r,{key:"c6f44d3765d579e04ab91272747035d8589e2ff2","aria-disabled":this.disabled?"true":null},e("button",{key:"9d48dfc7a6a23df1eda46e9c9035520789a08d4c",ref:t=>this.validationEl=t,disabled:this.disabled,class:a(this.variant,{[this.scale??""]:!!this.scale,disabled:this.disabled}),...this.inheritedAttributes},e("slot",{key:"95e9fb932e477c7d6e933d2c00e6a3728e55c256"})))}static get delegatesFocus(){return true}static get style(){return c()}},[785,"lmvz-button",{ti:[2562,"tabindex"],scale:[513],variant:[513],disabled:[516],type:[1],form:[1]}]);function u(){if(typeof customElements==="undefined"){return}const t=["lmvz-button"];t.forEach((t=>{switch(t){case"lmvz-button":if(!customElements.get(n(t))){customElements.define(n(t),v)}break}}))}export{v as L,u as d};
|
|
2
|
+
//# sourceMappingURL=p-BpCjj39Z.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["lmvzButtonCss","LmvzButton","__stencil_proxyCustomElement","ReactiveControllerHost","validationEl","inheritedAttributes","formEl","formButtonEl","lmvzActivation","ti","scale","variant","disabled","type","form","constructor","registerHost","this","addController","AriaValidationController","ElementActivationController","localHandler","handleClick","bind","keys","connectedCallback","inheritAriaAttributes","el","super","renderHiddenButton","findFormByRef","contains","newFormButtonEl","document","createElement","style","display","appendChild","submitForm","ev","preventDefault","click","render","h","Host","key","ref","e","class","classNames"],"sources":["src/components/lmvz-button/lmvz-button.css?tag=lmvz-button&encapsulation=shadow","src/components/lmvz-button/lmvz-button.tsx"],"sourcesContent":["@import '~@lmvz-ds/lib-styles/define-layers.css';\n\n@import '~@lmvz-ds/lib-styles/fragments/_routerFont.css' layer(lmvz-ds.theme);\n@import '~@lmvz-ds/lib-styles/fragments/_reset.css' layer(lmvz-ds.reset);\n\n:host {\n /* * the (invalid nested) import will be handled by postcss */\n /* stylelint-disable-next-line no-invalid-position-at-import-rule */\n @import '~@lmvz-ds/lib-styles/fragments/_buttons.css';\n\n display: contents;\n}\n\n::slotted(*) {\n --lmvz-component-color: var(--lmvz-button-color);\n}\n","import { Component, Element, Event, Host, Prop, h, type EventEmitter } from '@stencil/core';\nimport classNames from 'classnames';\nimport type { Button } from '../../api';\nimport { AriaValidationController, type AriaValidationHost } from '../../utils/aria/aria-validation-controller';\nimport { ElementActivationController, type ElementActivationHost } from '../../utils/aria/element-activation-controller';\nimport { findFormByRef, inheritAriaAttributes, type Attributes, type FormRef } from '../../utils/component';\nimport { ReactiveControllerHost } from '../../utils/reactive-controller-host';\n\n/**\n * @slot default - Slot for the content of the button\n */\n@Component({\n tag: 'lmvz-button',\n styleUrl: './lmvz-button.css',\n shadow: { delegatesFocus: true },\n})\nexport class LmvzButton extends ReactiveControllerHost implements AriaValidationHost, ElementActivationHost {\n @Element() el!: HTMLLmvzButtonElement;\n\n validationEl: HTMLButtonElement | undefined;\n\n private inheritedAttributes: Attributes = {};\n private formEl: HTMLFormElement | null = null;\n private formButtonEl: HTMLButtonElement | null = null;\n\n /**\n * Event emitted when the button is activated, either by a click or by pressing \"Enter\" when the button is focused.\n */\n @Event() lmvzActivation!: EventEmitter<void>;\n\n @Prop({ reflect: true, attribute: 'tabindex' }) get ti() {\n return 0;\n }\n\n /**\n * Scale of the button\n * @default 'default'\n */\n @Prop({ reflect: true }) scale: Button.Scale = 'default';\n\n /**\n * Variant of the button\n * @default 'secondary', since the primary button should be marked as such in context\n */\n @Prop({ reflect: true }) variant: Button.Variant = 'secondary';\n\n /**\n * Whether the button is disabled\n * @default false\n */\n @Prop({ reflect: true }) disabled = false;\n\n @Prop() type: 'submit' | 'button' = 'button';\n\n /**\n * The HTML form element or form element id. Used to submit a form when the button is not a child of the form.\n */\n @Prop() form?: FormRef;\n\n constructor() {\n super();\n this.addController(new AriaValidationController(this));\n this.addController(\n new ElementActivationController(this, {\n localHandler: this.handleClick.bind(this),\n keys: ['Enter'],\n }),\n );\n }\n\n override connectedCallback() {\n this.inheritedAttributes = inheritAriaAttributes(this.el);\n super.connectedCallback();\n }\n\n /**\n * This renders a hidden native button element inside the associated form.\n * This allows users to submit a form by pressing \"Enter\" when a text\n * field inside of the form is focused, even though our native button is in the Shadow DOM.\n */\n private renderHiddenButton() {\n const formEl = (this.formEl = findFormByRef(this.form, this.el));\n if (!formEl) return;\n\n const { formButtonEl } = this;\n\n // append only once\n if (formButtonEl !== null && formEl.contains(formButtonEl)) return;\n\n const newFormButtonEl = (this.formButtonEl = document.createElement('button'));\n newFormButtonEl.type = 'submit';\n newFormButtonEl.style.display = 'none';\n newFormButtonEl.disabled = this.disabled;\n\n formEl.appendChild(newFormButtonEl);\n }\n\n private submitForm(ev: Event) {\n if (this.formEl && this.formButtonEl) {\n ev.preventDefault();\n this.formButtonEl.click();\n }\n }\n\n private handleClick = (ev: Event) => {\n if (this.type === 'submit') {\n this.submitForm(ev);\n }\n };\n\n render() {\n this.renderHiddenButton();\n\n return (\n <Host aria-disabled={this.disabled ? 'true' : null}>\n <button\n ref={(e) => (this.validationEl = e)}\n disabled={this.disabled}\n class={classNames(this.variant, { [this.scale ?? '']: !!this.scale, disabled: this.disabled })}\n {...this.inheritedAttributes}\n >\n <slot></slot>\n </button>\n </Host>\n );\n }\n}\n"],"mappings":"8NAAA,MAAMA,EAAgB,IAAM,uoK,MCgBfC,EAAWC,EAAA,MAAAD,UAAQE,E,qBAG9BC,aAEQC,oBAAkC,GAClCC,OAAiC,KACjCC,aAAyC,KAKxCC,eAET,MAAoDC,GAClD,OAAO,C,CAOgBC,MAAsB,UAMtBC,QAA0B,YAM1BC,SAAW,MAE5BC,KAA4B,SAK5BC,KAER,WAAAC,CAAAC,G,oHAEEC,KAAKC,cAAc,IAAIC,EAAyBF,OAChDA,KAAKC,cACH,IAAIE,EAA4BH,KAAM,CACpCI,aAAcJ,KAAKK,YAAYC,KAAKN,MACpCO,KAAM,CAAC,WAGZ,CAEQ,iBAAAC,GACPR,KAAKZ,oBAAsBqB,EAAsBT,KAAKU,IACtDC,MAAMH,mB,CAQA,kBAAAI,GACN,MAAMvB,EAAUW,KAAKX,OAASwB,EAAcb,KAAKH,KAAMG,KAAKU,IAC5D,IAAKrB,EAAQ,OAEb,MAAMC,aAAEA,GAAiBU,KAGzB,GAAIV,IAAiB,MAAQD,EAAOyB,SAASxB,GAAe,OAE5D,MAAMyB,EAAmBf,KAAKV,aAAe0B,SAASC,cAAc,UACpEF,EAAgBnB,KAAO,SACvBmB,EAAgBG,MAAMC,QAAU,OAChCJ,EAAgBpB,SAAWK,KAAKL,SAEhCN,EAAO+B,YAAYL,E,CAGb,UAAAM,CAAWC,GACjB,GAAItB,KAAKX,QAAUW,KAAKV,aAAc,CACpCgC,EAAGC,iBACHvB,KAAKV,aAAakC,O,EAIdnB,YAAeiB,IACrB,GAAItB,KAAKJ,OAAS,SAAU,CAC1BI,KAAKqB,WAAWC,E,GAIpB,MAAAG,GACEzB,KAAKY,qBAEL,OACEc,EAACC,EAAI,CAAAC,IAAA,2DAAgB5B,KAAKL,SAAW,OAAS,MAC5C+B,EAAA,UAAAE,IAAA,2CACEC,IAAMC,GAAO9B,KAAKb,aAAe2C,EACjCnC,SAAUK,KAAKL,SACfoC,MAAOC,EAAWhC,KAAKN,QAAS,CAAE,CAACM,KAAKP,OAAS,MAAOO,KAAKP,MAAOE,SAAUK,KAAKL,cAC/EK,KAAKZ,qBAETsC,EAAA,QAAAE,IAAA,8C","ignoreList":[]}
|