le-kit 0.5.2 → 0.5.3
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/LLM_CONTEXT.md +22 -0
- package/dist/cjs/le-bar_16.cjs.entry.js +945 -1257
- package/dist/cjs/le-box.cjs.entry.js +40 -88
- package/dist/cjs/le-breadcrumbs.cjs.entry.js +223 -0
- package/dist/cjs/le-card.cjs.entry.js +11 -11
- package/dist/cjs/le-code-input.cjs.entry.js +76 -110
- package/dist/cjs/le-combobox.cjs.entry.js +126 -153
- package/dist/cjs/le-header-placeholder.cjs.entry.js +1 -1
- package/dist/cjs/le-kit.cjs.js +1 -1
- package/dist/cjs/le-multiselect.cjs.entry.js +149 -171
- package/dist/cjs/le-number-input.cjs.entry.js +89 -129
- package/dist/cjs/le-round-progress.cjs.entry.js +6 -11
- package/dist/cjs/le-segmented-control.cjs.entry.js +77 -87
- package/dist/cjs/le-side-panel-toggle.cjs.entry.js +59 -75
- package/dist/cjs/le-side-panel.cjs.entry.js +130 -137
- package/dist/cjs/le-stack.cjs.entry.js +38 -51
- package/dist/cjs/le-tab-bar.cjs.entry.js +80 -89
- package/dist/cjs/le-tab-panel.cjs.entry.js +21 -39
- package/dist/cjs/le-tab.cjs.entry.js +53 -91
- package/dist/cjs/le-tabs.cjs.entry.js +112 -122
- package/dist/cjs/le-tag.cjs.entry.js +23 -40
- package/dist/cjs/le-text.cjs.entry.js +131 -148
- package/dist/cjs/le-turntable.cjs.entry.js +17 -25
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/collection/collection-manifest.json +1 -0
- package/dist/collection/components/le-bar/le-bar.js +132 -139
- package/dist/collection/components/le-bar/le-bar.js.map +1 -1
- package/dist/collection/components/le-box/le-box.js +41 -88
- package/dist/collection/components/le-box/le-box.js.map +1 -1
- package/dist/collection/components/le-breadcrumbs/le-breadcrumbs.css +72 -0
- package/dist/collection/components/le-breadcrumbs/le-breadcrumbs.js +372 -0
- package/dist/collection/components/le-breadcrumbs/le-breadcrumbs.js.map +1 -0
- package/dist/collection/components/le-button/le-button.js +50 -79
- package/dist/collection/components/le-button/le-button.js.map +1 -1
- package/dist/collection/components/le-card/le-card.js +12 -11
- package/dist/collection/components/le-card/le-card.js.map +1 -1
- package/dist/collection/components/le-checkbox/le-checkbox.js +27 -42
- package/dist/collection/components/le-checkbox/le-checkbox.js.map +1 -1
- package/dist/collection/components/le-code-input/le-code-input.js +77 -110
- package/dist/collection/components/le-code-input/le-code-input.js.map +1 -1
- package/dist/collection/components/le-collapse/le-collapse.js +15 -14
- package/dist/collection/components/le-collapse/le-collapse.js.map +1 -1
- package/dist/collection/components/le-combobox/le-combobox.js +127 -153
- package/dist/collection/components/le-combobox/le-combobox.js.map +1 -1
- package/dist/collection/components/le-component/le-component.js +14 -38
- package/dist/collection/components/le-component/le-component.js.map +1 -1
- package/dist/collection/components/le-current-heading/le-current-heading.js +6 -5
- package/dist/collection/components/le-current-heading/le-current-heading.js.map +1 -1
- package/dist/collection/components/le-dropdown-base/le-dropdown-base.js +139 -165
- package/dist/collection/components/le-dropdown-base/le-dropdown-base.js.map +1 -1
- package/dist/collection/components/le-header/le-header.js +22 -45
- package/dist/collection/components/le-header/le-header.js.map +1 -1
- package/dist/collection/components/le-header-placeholder/le-header-placeholder.js +1 -1
- package/dist/collection/components/le-icon/le-icon.js +14 -14
- package/dist/collection/components/le-icon/le-icon.js.map +1 -1
- package/dist/collection/components/le-multiselect/le-multiselect.js +150 -171
- package/dist/collection/components/le-multiselect/le-multiselect.js.map +1 -1
- package/dist/collection/components/le-navigation/le-navigation.js +118 -128
- package/dist/collection/components/le-navigation/le-navigation.js.map +1 -1
- package/dist/collection/components/le-number-input/le-number-input.js +90 -129
- package/dist/collection/components/le-number-input/le-number-input.js.map +1 -1
- package/dist/collection/components/le-popover/le-popover.css +2 -1
- package/dist/collection/components/le-popover/le-popover.js +101 -126
- package/dist/collection/components/le-popover/le-popover.js.map +1 -1
- package/dist/collection/components/le-popup/le-popup.js +89 -115
- package/dist/collection/components/le-popup/le-popup.js.map +1 -1
- package/dist/collection/components/le-round-progress/le-round-progress.js +7 -12
- package/dist/collection/components/le-round-progress/le-round-progress.js.map +1 -1
- package/dist/collection/components/le-scroll-progress/le-scroll-progress.js +6 -7
- package/dist/collection/components/le-scroll-progress/le-scroll-progress.js.map +1 -1
- package/dist/collection/components/le-segmented-control/le-segmented-control.js +78 -87
- package/dist/collection/components/le-segmented-control/le-segmented-control.js.map +1 -1
- package/dist/collection/components/le-select/le-select.js +88 -110
- package/dist/collection/components/le-select/le-select.js.map +1 -1
- package/dist/collection/components/le-side-panel/le-side-panel.css +10 -1
- package/dist/collection/components/le-side-panel/le-side-panel.js +131 -136
- package/dist/collection/components/le-side-panel/le-side-panel.js.map +1 -1
- package/dist/collection/components/le-side-panel-toggle/le-side-panel-toggle.js +60 -75
- package/dist/collection/components/le-side-panel-toggle/le-side-panel-toggle.js.map +1 -1
- package/dist/collection/components/le-slot/le-slot.js +96 -144
- package/dist/collection/components/le-slot/le-slot.js.map +1 -1
- package/dist/collection/components/le-stack/le-stack.js +39 -51
- package/dist/collection/components/le-stack/le-stack.js.map +1 -1
- package/dist/collection/components/le-string-input/le-string-input.js +41 -84
- package/dist/collection/components/le-string-input/le-string-input.js.map +1 -1
- package/dist/collection/components/le-tab/le-tab.js +54 -91
- package/dist/collection/components/le-tab/le-tab.js.map +1 -1
- package/dist/collection/components/le-tab-bar/le-tab-bar.js +81 -89
- package/dist/collection/components/le-tab-bar/le-tab-bar.js.map +1 -1
- package/dist/collection/components/le-tab-panel/le-tab-panel.js +22 -39
- package/dist/collection/components/le-tab-panel/le-tab-panel.js.map +1 -1
- package/dist/collection/components/le-tabs/le-tabs.js +113 -122
- package/dist/collection/components/le-tabs/le-tabs.js.map +1 -1
- package/dist/collection/components/le-tag/le-tag.js +25 -40
- package/dist/collection/components/le-tag/le-tag.js.map +1 -1
- package/dist/collection/components/le-text/le-text.js +132 -148
- package/dist/collection/components/le-text/le-text.js.map +1 -1
- package/dist/collection/components/le-turntable/le-turntable.js +18 -26
- package/dist/collection/components/le-turntable/le-turntable.js.map +1 -1
- package/dist/collection/dist/components/assets/custom-elements.json +973 -645
- package/dist/collection/dist/components/assets/icons/arrow-left.json +21 -0
- package/dist/collection/dist/components/assets/icons/arrow-right.json +21 -0
- package/dist/collection/dist/components/assets/icons/check.json +12 -0
- package/dist/collection/dist/components/assets/icons/chevron-down.json +1 -2
- package/dist/collection/dist/components/assets/icons/chevron-left.json +12 -0
- package/dist/collection/dist/components/assets/icons/chevron-right.json +12 -0
- package/dist/collection/dist/components/assets/icons/chevron-up.json +12 -0
- package/dist/components/assets/custom-elements.json +973 -645
- package/dist/components/assets/icons/arrow-left.json +21 -0
- package/dist/components/assets/icons/arrow-right.json +21 -0
- package/dist/components/assets/icons/check.json +12 -0
- package/dist/components/assets/icons/chevron-down.json +1 -2
- package/dist/components/assets/icons/chevron-left.json +12 -0
- package/dist/components/assets/icons/chevron-right.json +12 -0
- package/dist/components/assets/icons/chevron-up.json +12 -0
- package/dist/components/le-bar2.js +132 -140
- package/dist/components/le-bar2.js.map +1 -1
- package/dist/components/le-box.js +41 -89
- package/dist/components/le-box.js.map +1 -1
- package/dist/components/le-breadcrumbs.d.ts +11 -0
- package/dist/components/le-breadcrumbs.js +327 -0
- package/dist/components/le-breadcrumbs.js.map +1 -0
- package/dist/components/le-button2.js +405 -619
- package/dist/components/le-button2.js.map +1 -1
- package/dist/components/le-card.js +12 -12
- package/dist/components/le-card.js.map +1 -1
- package/dist/components/le-code-input.js +77 -111
- package/dist/components/le-code-input.js.map +1 -1
- package/dist/components/le-collapse2.js +15 -15
- package/dist/components/le-collapse2.js.map +1 -1
- package/dist/components/le-combobox.js +127 -154
- package/dist/components/le-combobox.js.map +1 -1
- package/dist/components/le-current-heading.js +6 -6
- package/dist/components/le-current-heading.js.map +1 -1
- package/dist/components/le-dropdown-base2.js +139 -166
- package/dist/components/le-dropdown-base2.js.map +1 -1
- package/dist/components/le-header-placeholder.js +1 -1
- package/dist/components/le-header.js +22 -46
- package/dist/components/le-header.js.map +1 -1
- package/dist/components/le-icon2.js +14 -15
- package/dist/components/le-icon2.js.map +1 -1
- package/dist/components/le-multiselect.js +150 -172
- package/dist/components/le-multiselect.js.map +1 -1
- package/dist/components/le-navigation.js +1 -494
- package/dist/components/le-navigation.js.map +1 -1
- package/dist/components/le-navigation2.js +488 -0
- package/dist/components/le-navigation2.js.map +1 -0
- package/dist/components/le-number-input.js +90 -130
- package/dist/components/le-number-input.js.map +1 -1
- package/dist/components/le-popover2.js +103 -128
- package/dist/components/le-popover2.js.map +1 -1
- package/dist/components/le-round-progress.js +7 -12
- package/dist/components/le-round-progress.js.map +1 -1
- package/dist/components/le-scroll-progress.js +6 -8
- package/dist/components/le-scroll-progress.js.map +1 -1
- package/dist/components/le-segmented-control.js +78 -88
- package/dist/components/le-segmented-control.js.map +1 -1
- package/dist/components/le-side-panel-toggle2.js +60 -76
- package/dist/components/le-side-panel-toggle2.js.map +1 -1
- package/dist/components/le-side-panel.js +133 -139
- package/dist/components/le-side-panel.js.map +1 -1
- package/dist/components/le-stack.js +39 -52
- package/dist/components/le-stack.js.map +1 -1
- package/dist/components/le-tab-bar.js +81 -90
- package/dist/components/le-tab-bar.js.map +1 -1
- package/dist/components/le-tab-panel.js +22 -40
- package/dist/components/le-tab-panel.js.map +1 -1
- package/dist/components/le-tab2.js +54 -92
- package/dist/components/le-tab2.js.map +1 -1
- package/dist/components/le-tabs.js +113 -123
- package/dist/components/le-tabs.js.map +1 -1
- package/dist/components/le-tag2.js +24 -41
- package/dist/components/le-tag2.js.map +1 -1
- package/dist/components/le-text.js +132 -149
- package/dist/components/le-text.js.map +1 -1
- package/dist/components/le-turntable.js +18 -26
- package/dist/components/le-turntable.js.map +1 -1
- package/dist/docs.json +294 -2
- package/dist/esm/le-bar_16.entry.js +946 -1258
- package/dist/esm/le-box.entry.js +41 -89
- package/dist/esm/le-box.entry.js.map +1 -1
- package/dist/esm/le-breadcrumbs.entry.js +221 -0
- package/dist/esm/le-breadcrumbs.entry.js.map +1 -0
- package/dist/esm/le-card.entry.js +12 -12
- package/dist/esm/le-card.entry.js.map +1 -1
- package/dist/esm/le-code-input.entry.js +77 -111
- package/dist/esm/le-code-input.entry.js.map +1 -1
- package/dist/esm/le-combobox.entry.js +127 -154
- package/dist/esm/le-combobox.entry.js.map +1 -1
- package/dist/esm/le-header-placeholder.entry.js +1 -1
- package/dist/esm/le-kit.js +1 -1
- package/dist/esm/le-multiselect.entry.js +150 -172
- package/dist/esm/le-multiselect.entry.js.map +1 -1
- package/dist/esm/le-number-input.entry.js +90 -130
- package/dist/esm/le-number-input.entry.js.map +1 -1
- package/dist/esm/le-round-progress.entry.js +7 -12
- package/dist/esm/le-round-progress.entry.js.map +1 -1
- package/dist/esm/le-segmented-control.entry.js +78 -88
- package/dist/esm/le-segmented-control.entry.js.map +1 -1
- package/dist/esm/le-side-panel-toggle.entry.js +60 -76
- package/dist/esm/le-side-panel-toggle.entry.js.map +1 -1
- package/dist/esm/le-side-panel.entry.js +131 -138
- package/dist/esm/le-side-panel.entry.js.map +1 -1
- package/dist/esm/le-stack.entry.js +39 -52
- package/dist/esm/le-stack.entry.js.map +1 -1
- package/dist/esm/le-tab-bar.entry.js +81 -90
- package/dist/esm/le-tab-bar.entry.js.map +1 -1
- package/dist/esm/le-tab-panel.entry.js +22 -40
- package/dist/esm/le-tab-panel.entry.js.map +1 -1
- package/dist/esm/le-tab.entry.js +54 -92
- package/dist/esm/le-tab.entry.js.map +1 -1
- package/dist/esm/le-tabs.entry.js +113 -123
- package/dist/esm/le-tabs.entry.js.map +1 -1
- package/dist/esm/le-tag.entry.js +23 -40
- package/dist/esm/le-tag.entry.js.map +1 -1
- package/dist/esm/le-text.entry.js +132 -149
- package/dist/esm/le-text.entry.js.map +1 -1
- package/dist/esm/le-turntable.entry.js +18 -26
- package/dist/esm/le-turntable.entry.js.map +1 -1
- package/dist/esm/loader.js +1 -1
- package/dist/le-kit/dist/components/assets/custom-elements.json +973 -645
- package/dist/le-kit/dist/components/assets/icons/arrow-left.json +21 -0
- package/dist/le-kit/dist/components/assets/icons/arrow-right.json +21 -0
- package/dist/le-kit/dist/components/assets/icons/check.json +12 -0
- package/dist/le-kit/dist/components/assets/icons/chevron-down.json +1 -2
- package/dist/le-kit/dist/components/assets/icons/chevron-left.json +12 -0
- package/dist/le-kit/dist/components/assets/icons/chevron-right.json +12 -0
- package/dist/le-kit/dist/components/assets/icons/chevron-up.json +12 -0
- package/dist/le-kit/le-kit.esm.js +1 -1
- package/dist/le-kit/p-3067b18f.entry.js +2 -0
- package/dist/le-kit/p-3067b18f.entry.js.map +1 -0
- package/dist/le-kit/p-34c4d97d.entry.js +2 -0
- package/dist/le-kit/p-34c4d97d.entry.js.map +1 -0
- package/dist/le-kit/p-45182541.entry.js +2 -0
- package/dist/le-kit/p-45182541.entry.js.map +1 -0
- package/dist/le-kit/p-52a41c96.entry.js +2 -0
- package/dist/le-kit/p-52a41c96.entry.js.map +1 -0
- package/dist/le-kit/p-55fb5dd2.entry.js +2 -0
- package/dist/le-kit/p-55fb5dd2.entry.js.map +1 -0
- package/dist/le-kit/{p-ab6c1def.entry.js → p-649025f4.entry.js} +2 -2
- package/dist/le-kit/p-649025f4.entry.js.map +1 -0
- package/dist/le-kit/p-67930309.entry.js +2 -0
- package/dist/le-kit/p-67930309.entry.js.map +1 -0
- package/dist/le-kit/p-6d222705.entry.js +2 -0
- package/dist/le-kit/p-6d222705.entry.js.map +1 -0
- package/dist/le-kit/p-8049e0c2.entry.js +2 -0
- package/dist/le-kit/p-8049e0c2.entry.js.map +1 -0
- package/dist/le-kit/p-884f57bd.entry.js +2 -0
- package/dist/le-kit/p-88c70f9d.entry.js +2 -0
- package/dist/le-kit/p-88c70f9d.entry.js.map +1 -0
- package/dist/le-kit/p-96610729.entry.js +2 -0
- package/dist/le-kit/p-96610729.entry.js.map +1 -0
- package/dist/le-kit/p-a34054e0.entry.js +2 -0
- package/dist/le-kit/p-a34054e0.entry.js.map +1 -0
- package/dist/le-kit/p-a388e46a.entry.js +2 -0
- package/dist/le-kit/p-a388e46a.entry.js.map +1 -0
- package/dist/le-kit/p-c0c53650.entry.js +2 -0
- package/dist/le-kit/p-c0c53650.entry.js.map +1 -0
- package/dist/le-kit/p-cbf17514.entry.js +2 -0
- package/dist/le-kit/p-cbf17514.entry.js.map +1 -0
- package/dist/le-kit/p-d934de74.entry.js +2 -0
- package/dist/le-kit/p-d934de74.entry.js.map +1 -0
- package/dist/le-kit/p-de72c8b5.entry.js +2 -0
- package/dist/le-kit/p-de72c8b5.entry.js.map +1 -0
- package/dist/le-kit/p-e3dd0f2a.entry.js +2 -0
- package/dist/le-kit/p-e3dd0f2a.entry.js.map +1 -0
- package/dist/le-kit/p-ee170967.entry.js +2 -0
- package/dist/le-kit/p-ee170967.entry.js.map +1 -0
- package/dist/le-kit/p-eedb2f75.entry.js +2 -0
- package/dist/le-kit/p-eedb2f75.entry.js.map +1 -0
- package/dist/types/components/le-breadcrumbs/le-breadcrumbs.d.ts +57 -0
- package/dist/types/components/le-side-panel/le-side-panel.d.ts +2 -0
- package/dist/types/components.d.ts +84 -0
- package/package.json +1 -1
- package/dist/collection/assets/icons/chevron-down.svg +0 -3
- package/dist/collection/dist/components/assets/icons/chevron-down.svg +0 -3
- package/dist/components/assets/icons/chevron-down.svg +0 -3
- package/dist/le-kit/dist/components/assets/icons/chevron-down.svg +0 -3
- package/dist/le-kit/p-221d379a.entry.js +0 -2
- package/dist/le-kit/p-221d379a.entry.js.map +0 -1
- package/dist/le-kit/p-24112ca3.entry.js +0 -2
- package/dist/le-kit/p-24112ca3.entry.js.map +0 -1
- package/dist/le-kit/p-2c6d080d.entry.js +0 -2
- package/dist/le-kit/p-2c6d080d.entry.js.map +0 -1
- package/dist/le-kit/p-46276e77.entry.js +0 -2
- package/dist/le-kit/p-46276e77.entry.js.map +0 -1
- package/dist/le-kit/p-516c8531.entry.js +0 -2
- package/dist/le-kit/p-6ae60ba5.entry.js +0 -2
- package/dist/le-kit/p-6ae60ba5.entry.js.map +0 -1
- package/dist/le-kit/p-6b69f9a2.entry.js +0 -2
- package/dist/le-kit/p-6b69f9a2.entry.js.map +0 -1
- package/dist/le-kit/p-6d14306f.entry.js +0 -2
- package/dist/le-kit/p-6d14306f.entry.js.map +0 -1
- package/dist/le-kit/p-7bcdf2d4.entry.js +0 -2
- package/dist/le-kit/p-7bcdf2d4.entry.js.map +0 -1
- package/dist/le-kit/p-7cf1e23c.entry.js +0 -2
- package/dist/le-kit/p-7cf1e23c.entry.js.map +0 -1
- package/dist/le-kit/p-85f2fd4d.entry.js +0 -2
- package/dist/le-kit/p-85f2fd4d.entry.js.map +0 -1
- package/dist/le-kit/p-98242429.entry.js +0 -2
- package/dist/le-kit/p-98242429.entry.js.map +0 -1
- package/dist/le-kit/p-ab6c1def.entry.js.map +0 -1
- package/dist/le-kit/p-ae4ead64.entry.js +0 -2
- package/dist/le-kit/p-ae4ead64.entry.js.map +0 -1
- package/dist/le-kit/p-b05d4511.entry.js +0 -2
- package/dist/le-kit/p-b05d4511.entry.js.map +0 -1
- package/dist/le-kit/p-b6ac02ff.entry.js +0 -2
- package/dist/le-kit/p-b6ac02ff.entry.js.map +0 -1
- package/dist/le-kit/p-c24769e2.entry.js +0 -2
- package/dist/le-kit/p-c24769e2.entry.js.map +0 -1
- package/dist/le-kit/p-dc0445ad.entry.js +0 -2
- package/dist/le-kit/p-dc0445ad.entry.js.map +0 -1
- package/dist/le-kit/p-eb5286f2.entry.js +0 -2
- package/dist/le-kit/p-eb5286f2.entry.js.map +0 -1
- package/dist/le-kit/p-f78b1ee6.entry.js +0 -2
- package/dist/le-kit/p-f78b1ee6.entry.js.map +0 -1
- /package/dist/le-kit/{p-516c8531.entry.js.map → p-884f57bd.entry.js.map} +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { r as registerInstance, c as createEvent, a as getElement
|
|
1
|
+
import { r as registerInstance, c as createEvent, h, a as getElement } from './index-DFTm5BqT.js';
|
|
2
2
|
import { c as classnames } from './utils-DZYCZLrF.js';
|
|
3
3
|
|
|
4
4
|
const leCodeInputCss = () => `:host{display:block;--le-input-bg:var(--le-color-surface, #ffffff);--le-input-color:var(--le-color-text-primary, #333333);--le-input-border:var(--le-border-width, 2px) solid var(--le-color-border-input, #007bff);--le-input-radius:var(--le-radius-sm, 4px);--le-input-border-focus:2px solid var(--le-color-focus);--le-input-border-focus-offset:2px}.le-code-input-wrapper{position:relative;display:flex;flex-direction:column}.le-input-label{display:block;margin-bottom:var(--le-spacing-2, 0.5rem);color:var(--le-text-color, inherit);font-size:var(--le-font-size-sm, 0.875rem);font-weight:500}.input-group{position:relative;display:inline-flex;width:fit-content}.ghost-input{position:absolute;inset:0;width:100%;height:100%;opacity:0;z-index:10;cursor:text;color:transparent;background:transparent;caret-color:transparent;border:none;outline:none;letter-spacing:1em;}.ghost-input:disabled{cursor:not-allowed}.visual-container{display:flex;gap:var(--le-spacing-2, 8px);pointer-events:none;}.code-box{position:relative;width:var(--le-code-box-size, 32px);height:var(--le-code-box-size, 42px);display:flex;align-items:center;justify-content:center;background:var(--le-input-bg);border:var(--le-input-border);border-radius:var(--le-input-radius);color:var(--le-input-color);font-size:1.2rem;transition:all 0.15s ease-in-out;box-sizing:border-box;user-select:none}.code-box.active{outline:var(--le-input-border-focus);outline-offset:var(--le-input-border-focus-offset);z-index:1}.code-box.selected{background-color:SelectedItem;outline:var(--le-input-border-focus);outline-offset:var(--le-input-border-focus-offset)}.input-group.has-error .code-box{border:var(--le-input-border-error, 1px solid #ef4444)}.input-group.has-error .code-box.active{border-width:2px}:host(.disabled) .code-box{background-color:var(--le-color-disabled-bg, #f3f4f6);color:var(--le-color-disabled-text, #9ca3af);border-color:var(--le-color-disabled-border, #e5e7eb)}.le-input-description,:host(p){margin-top:var(--le-spacing-1, 0.25rem);color:var(--le-text-muted, #6b7280);font-size:var(--le-font-size-sm, 0.875rem)}`;
|
|
@@ -10,70 +10,80 @@ const LeCodeInput = class {
|
|
|
10
10
|
this.leInput = createEvent(this, "leInput");
|
|
11
11
|
this.leFocus = createEvent(this, "leFocus");
|
|
12
12
|
this.leBlur = createEvent(this, "leBlur");
|
|
13
|
+
/**
|
|
14
|
+
* The value of the input
|
|
15
|
+
*/
|
|
16
|
+
this.value = '';
|
|
17
|
+
/**
|
|
18
|
+
* Length of the code (number of characters)
|
|
19
|
+
*/
|
|
20
|
+
this.length = 6;
|
|
21
|
+
/**
|
|
22
|
+
* The type of code (numeric or alphanumeric)
|
|
23
|
+
* This affects the keyboard layout on mobile devices.
|
|
24
|
+
*/
|
|
25
|
+
this.type = 'text';
|
|
26
|
+
/**
|
|
27
|
+
* Whether the input is disabled
|
|
28
|
+
*/
|
|
29
|
+
this.disabled = false;
|
|
30
|
+
/**
|
|
31
|
+
* Whether the input is read-only
|
|
32
|
+
*/
|
|
33
|
+
this.readonly = false;
|
|
34
|
+
/**
|
|
35
|
+
* Internal validation state (can be set externally manually or via simple check)
|
|
36
|
+
*/
|
|
37
|
+
this.error = false;
|
|
38
|
+
this.isFocused = false;
|
|
39
|
+
this.selectionStart = 0;
|
|
40
|
+
this.selectionEnd = 0;
|
|
41
|
+
this.handleInput = (ev) => {
|
|
42
|
+
const input = ev.target;
|
|
43
|
+
let val = input.value;
|
|
44
|
+
// Enforce length limit
|
|
45
|
+
if (val.length > this.length) {
|
|
46
|
+
val = val.slice(0, this.length);
|
|
47
|
+
// We need to force update the input value if it exceeded length
|
|
48
|
+
// because Stencil prop update might not happen if value is same as prop but input is different
|
|
49
|
+
input.value = val;
|
|
50
|
+
}
|
|
51
|
+
this.value = val;
|
|
52
|
+
this.updateSelection(input);
|
|
53
|
+
this.leInput.emit({
|
|
54
|
+
value: this.value,
|
|
55
|
+
name: this.name,
|
|
56
|
+
externalId: this.externalId,
|
|
57
|
+
});
|
|
58
|
+
};
|
|
59
|
+
this.handleChange = () => {
|
|
60
|
+
this.leChange.emit({
|
|
61
|
+
value: this.value,
|
|
62
|
+
name: this.name,
|
|
63
|
+
externalId: this.externalId,
|
|
64
|
+
});
|
|
65
|
+
};
|
|
66
|
+
this.handleFocus = (ev) => {
|
|
67
|
+
this.isFocused = true;
|
|
68
|
+
const input = ev.target;
|
|
69
|
+
// Move cursor to the end on focus so typing appends to current value
|
|
70
|
+
window.requestAnimationFrame(() => {
|
|
71
|
+
const len = input.value.length;
|
|
72
|
+
input.setSelectionRange(len, len);
|
|
73
|
+
this.updateSelection(input);
|
|
74
|
+
});
|
|
75
|
+
this.leFocus.emit();
|
|
76
|
+
};
|
|
77
|
+
this.handleBlur = () => {
|
|
78
|
+
this.isFocused = false;
|
|
79
|
+
this.leBlur.emit();
|
|
80
|
+
// Trigger change on blur
|
|
81
|
+
this.handleChange();
|
|
82
|
+
};
|
|
83
|
+
this.handleSelect = (ev) => {
|
|
84
|
+
this.updateSelection(ev.target);
|
|
85
|
+
};
|
|
13
86
|
}
|
|
14
|
-
get el() { return getElement(this); }
|
|
15
|
-
/**
|
|
16
|
-
* The value of the input
|
|
17
|
-
*/
|
|
18
|
-
value = '';
|
|
19
|
-
/**
|
|
20
|
-
* The name of the input
|
|
21
|
-
*/
|
|
22
|
-
name;
|
|
23
|
-
/**
|
|
24
|
-
* Label for the input
|
|
25
|
-
*/
|
|
26
|
-
label;
|
|
27
|
-
/**
|
|
28
|
-
* Length of the code (number of characters)
|
|
29
|
-
*/
|
|
30
|
-
length = 6;
|
|
31
|
-
/**
|
|
32
|
-
* Description text displayed below the input
|
|
33
|
-
* in case there is a more complex markup,
|
|
34
|
-
* it can be provided via slot as well
|
|
35
|
-
*/
|
|
36
|
-
description;
|
|
37
|
-
/**
|
|
38
|
-
* The type of code (numeric or alphanumeric)
|
|
39
|
-
* This affects the keyboard layout on mobile devices.
|
|
40
|
-
*/
|
|
41
|
-
type = 'text';
|
|
42
|
-
/**
|
|
43
|
-
* Whether the input is disabled
|
|
44
|
-
*/
|
|
45
|
-
disabled = false;
|
|
46
|
-
/**
|
|
47
|
-
* Whether the input is read-only
|
|
48
|
-
*/
|
|
49
|
-
readonly = false;
|
|
50
|
-
/**
|
|
51
|
-
* External ID for linking with external systems
|
|
52
|
-
*/
|
|
53
|
-
externalId;
|
|
54
|
-
/**
|
|
55
|
-
* Internal validation state (can be set externally manually or via simple check)
|
|
56
|
-
*/
|
|
57
|
-
error = false;
|
|
58
|
-
/**
|
|
59
|
-
* Emitted when the value changes (on blur or Enter)
|
|
60
|
-
*/
|
|
61
|
-
leChange;
|
|
62
|
-
/**
|
|
63
|
-
* Emitted when the input value changes (on keystroke)
|
|
64
|
-
*/
|
|
65
|
-
leInput;
|
|
66
|
-
/**
|
|
67
|
-
* Emitted when the input is focused
|
|
68
|
-
*/
|
|
69
|
-
leFocus;
|
|
70
|
-
/**
|
|
71
|
-
* Emitted when the input is blurred
|
|
72
|
-
*/
|
|
73
|
-
leBlur;
|
|
74
|
-
isFocused = false;
|
|
75
|
-
selectionStart = 0;
|
|
76
|
-
selectionEnd = 0;
|
|
77
87
|
valueChanged(newValue) {
|
|
78
88
|
if (newValue && newValue.length > this.length) {
|
|
79
89
|
this.value = newValue.slice(0, this.length);
|
|
@@ -84,51 +94,6 @@ const LeCodeInput = class {
|
|
|
84
94
|
this.value = this.value.slice(0, this.length);
|
|
85
95
|
}
|
|
86
96
|
}
|
|
87
|
-
handleInput = (ev) => {
|
|
88
|
-
const input = ev.target;
|
|
89
|
-
let val = input.value;
|
|
90
|
-
// Enforce length limit
|
|
91
|
-
if (val.length > this.length) {
|
|
92
|
-
val = val.slice(0, this.length);
|
|
93
|
-
// We need to force update the input value if it exceeded length
|
|
94
|
-
// because Stencil prop update might not happen if value is same as prop but input is different
|
|
95
|
-
input.value = val;
|
|
96
|
-
}
|
|
97
|
-
this.value = val;
|
|
98
|
-
this.updateSelection(input);
|
|
99
|
-
this.leInput.emit({
|
|
100
|
-
value: this.value,
|
|
101
|
-
name: this.name,
|
|
102
|
-
externalId: this.externalId,
|
|
103
|
-
});
|
|
104
|
-
};
|
|
105
|
-
handleChange = () => {
|
|
106
|
-
this.leChange.emit({
|
|
107
|
-
value: this.value,
|
|
108
|
-
name: this.name,
|
|
109
|
-
externalId: this.externalId,
|
|
110
|
-
});
|
|
111
|
-
};
|
|
112
|
-
handleFocus = (ev) => {
|
|
113
|
-
this.isFocused = true;
|
|
114
|
-
const input = ev.target;
|
|
115
|
-
// Move cursor to the end on focus so typing appends to current value
|
|
116
|
-
window.requestAnimationFrame(() => {
|
|
117
|
-
const len = input.value.length;
|
|
118
|
-
input.setSelectionRange(len, len);
|
|
119
|
-
this.updateSelection(input);
|
|
120
|
-
});
|
|
121
|
-
this.leFocus.emit();
|
|
122
|
-
};
|
|
123
|
-
handleBlur = () => {
|
|
124
|
-
this.isFocused = false;
|
|
125
|
-
this.leBlur.emit();
|
|
126
|
-
// Trigger change on blur
|
|
127
|
-
this.handleChange();
|
|
128
|
-
};
|
|
129
|
-
handleSelect = (ev) => {
|
|
130
|
-
this.updateSelection(ev.target);
|
|
131
|
-
};
|
|
132
97
|
updateSelection(input) {
|
|
133
98
|
this.selectionStart = input.selectionStart || 0;
|
|
134
99
|
this.selectionEnd = input.selectionEnd || 0;
|
|
@@ -165,10 +130,11 @@ const LeCodeInput = class {
|
|
|
165
130
|
return boxes;
|
|
166
131
|
}
|
|
167
132
|
render() {
|
|
168
|
-
return (h("le-component", { key: '
|
|
133
|
+
return (h("le-component", { key: 'c9a4a92342645c54aee90091cd860fc439de6334', component: "le-code-input", hostClass: classnames({ 'disabled': this.disabled, 'has-error': this.error }) }, h("div", { key: '50480c7c827ba801421c260c4e6fef88f22dcbd0', class: "le-code-input-wrapper" }, this.label && (h("label", { key: '316653c42c51ea0a443d8401c5adaf3e4821d7c8', class: "le-input-label", htmlFor: this.name }, this.label)), h("div", { key: '803789d07d538e1576dbb0ff7536110ab620632b', class: classnames('input-group', { 'has-error': this.error }) }, h("input", { key: '7bbf221d32aa9363066d799b5b2a4aac2e9ae77f', class: "ghost-input", id: this.name, name: this.name, type: "text", inputMode: this.type === 'number' ? 'numeric' : 'text', pattern: this.type === 'number' ? '[0-9]*' : undefined, autocomplete: "one-time-code", value: this.value, maxLength: this.length, disabled: this.disabled, readOnly: this.readonly, onInput: this.handleInput, onFocus: this.handleFocus, onBlur: this.handleBlur, onSelect: this.handleSelect,
|
|
169
134
|
// Prevent browser autofill background from messing up visual
|
|
170
|
-
spellcheck: false, autoCapitalize: "none", autoCorrect: "off" }), h("div", { key: '
|
|
135
|
+
spellcheck: false, autoCapitalize: "none", autoCorrect: "off" }), h("div", { key: '0ff57ab380039c4bbbbf0e347331eb6885f8ce63', class: "visual-container" }, this.renderBoxes())), !this.error && (h("div", { key: '7da46dfc052457588969a1c9631eb310d80030c4', class: "le-input-description" }, h("le-slot", { key: '7bcfa46fd981286736ea7ec490d65c962ef998d5', name: "description", type: "text", tag: "p", label: "Description" }, h("slot", { key: 'ee810bf920acc45c48b3cbc4ebf9598ac5937923', name: "description" }, this.description)))))));
|
|
171
136
|
}
|
|
137
|
+
get el() { return getElement(this); }
|
|
172
138
|
static get watchers() { return {
|
|
173
139
|
"value": ["valueChanged"]
|
|
174
140
|
}; }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"le-code-input.entry.js","sources":["src/components/le-code-input/le-code-input.css?tag=le-code-input&encapsulation=shadow","src/components/le-code-input/le-code-input.tsx"],"sourcesContent":[":host {\n display: block;\n\n --le-input-bg: var(--le-color-surface, #ffffff);\n --le-input-color: var(--le-color-text-primary, #333333);\n --le-input-border: var(--le-border-width, 2px) solid var(--le-color-border-input, #007bff);\n --le-input-radius: var(--le-radius-sm, 4px);\n --le-input-border-focus: 2px solid var(--le-color-focus);\n --le-input-border-focus-offset: 2px;\n}\n\n.le-code-input-wrapper {\n position: relative;\n display: flex;\n flex-direction: column;\n}\n\n.le-input-label {\n display: block;\n margin-bottom: var(--le-spacing-2, 0.5rem);\n color: var(--le-text-color, inherit);\n font-size: var(--le-font-size-sm, 0.875rem);\n font-weight: 500;\n}\n\n.input-group {\n position: relative;\n display: inline-flex;\n width: fit-content;\n}\n\n.ghost-input {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n opacity: 0;\n z-index: 10;\n cursor: text;\n color: transparent;\n background: transparent;\n caret-color: transparent;\n border: none;\n outline: none;\n letter-spacing: 1em; /* Try to match boxes? */\n}\n\n.ghost-input:disabled {\n cursor: not-allowed;\n}\n\n.visual-container {\n display: flex;\n gap: var(--le-spacing-2, 8px);\n pointer-events: none; /* Let clicks pass to ghost input */\n}\n\n.code-box {\n position: relative;\n width: var(--le-code-box-size, 32px);\n height: var(--le-code-box-size, 42px);\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--le-input-bg);\n border: var(--le-input-border);\n border-radius: var(--le-input-radius);\n color: var(--le-input-color);\n font-size: 1.2rem;\n transition: all 0.15s ease-in-out;\n box-sizing: border-box;\n user-select: none;\n}\n\n.code-box.active {\n outline: var(--le-input-border-focus);\n outline-offset: var(--le-input-border-focus-offset);\n z-index: 1;\n}\n\n.code-box.selected {\n background-color: SelectedItem;\n outline: var(--le-input-border-focus);\n outline-offset: var(--le-input-border-focus-offset);\n}\n\n.input-group.has-error .code-box {\n border: var(--le-input-border-error, 1px solid #ef4444);\n}\n\n.input-group.has-error .code-box.active {\n border-width: 2px;\n}\n\n:host(.disabled) .code-box {\n background-color: var(--le-color-disabled-bg, #f3f4f6);\n color: var(--le-color-disabled-text, #9ca3af);\n border-color: var(--le-color-disabled-border, #e5e7eb);\n}\n\n.le-input-description,\n:host(p) {\n margin-top: var(--le-spacing-1, 0.25rem);\n color: var(--le-text-muted, #6b7280);\n font-size: var(--le-font-size-sm, 0.875rem);\n}\n","import { Component, Prop, Event, EventEmitter, State, h, Element, Watch } from '@stencil/core';\nimport { classnames } from '../../utils/utils';\n\n/**\n * A one-time code input component with individual frames for each character.\n * Supports standard copy/paste and range selection behaviors.\n *\n * @slot description - Additional description text displayed below the input\n *\n * @cssprop --le-code-box-size - Size of each character box (default: 40px width, 48px height)\n * @cssprop --le-input-bg - Input background color\n * @cssprop --le-input-color - Input text color\n * @cssprop --le-input-border - Input border style\n * @cssprop --le-input-border-focus - Input border style when focused\n * @cssprop --le-input-border-error - Input border style when invalid\n * @cssprop --le-input-radius - Input border radius\n */\n@Component({\n tag: 'le-code-input',\n styleUrl: 'le-code-input.css',\n shadow: true,\n})\nexport class LeCodeInput {\n @Element() el: HTMLElement;\n\n /**\n * The value of the input\n */\n @Prop({ mutable: true, reflect: true }) value: string = '';\n\n /**\n * The name of the input\n */\n @Prop() name: string;\n\n /**\n * Label for the input\n */\n @Prop() label: string;\n\n /**\n * Length of the code (number of characters)\n */\n @Prop() length: number = 6;\n\n /**\n * Description text displayed below the input\n * in case there is a more complex markup,\n * it can be provided via slot as well\n */\n @Prop() description?: string;\n\n /**\n * The type of code (numeric or alphanumeric)\n * This affects the keyboard layout on mobile devices.\n */\n @Prop() type: 'text' | 'number' = 'text';\n\n /**\n * Whether the input is disabled\n */\n @Prop() disabled: boolean = false;\n\n /**\n * Whether the input is read-only\n */\n @Prop() readonly: boolean = false;\n\n /**\n * External ID for linking with external systems\n */\n @Prop() externalId: string;\n\n /**\n * Internal validation state (can be set externally manually or via simple check)\n */\n @Prop() error: boolean = false;\n\n /**\n * Emitted when the value changes (on blur or Enter)\n */\n @Event() leChange: EventEmitter<{ value: string; name: string; externalId: string }>;\n\n /**\n * Emitted when the input value changes (on keystroke)\n */\n @Event() leInput: EventEmitter<{ value: string; name: string; externalId: string }>;\n\n /**\n * Emitted when the input is focused\n */\n @Event() leFocus: EventEmitter<void>;\n\n /**\n * Emitted when the input is blurred\n */\n @Event() leBlur: EventEmitter<void>;\n\n @State() private isFocused: boolean = false;\n @State() private selectionStart: number = 0;\n @State() private selectionEnd: number = 0;\n\n @Watch('value')\n valueChanged(newValue: string) {\n if (newValue && newValue.length > this.length) {\n this.value = newValue.slice(0, this.length);\n }\n }\n\n componentWillLoad() {\n if (this.value && this.value.length > this.length) {\n this.value = this.value.slice(0, this.length);\n }\n }\n\n private handleInput = (ev: Event) => {\n const input = ev.target as HTMLInputElement;\n let val = input.value;\n\n // Enforce length limit\n if (val.length > this.length) {\n val = val.slice(0, this.length);\n // We need to force update the input value if it exceeded length\n // because Stencil prop update might not happen if value is same as prop but input is different\n input.value = val;\n }\n\n this.value = val;\n this.updateSelection(input);\n\n this.leInput.emit({\n value: this.value,\n name: this.name,\n externalId: this.externalId,\n });\n };\n\n private handleChange = () => {\n this.leChange.emit({\n value: this.value,\n name: this.name,\n externalId: this.externalId,\n });\n };\n\n private handleFocus = (ev: Event) => {\n this.isFocused = true;\n const input = ev.target as HTMLInputElement;\n\n // Move cursor to the end on focus so typing appends to current value\n window.requestAnimationFrame(() => {\n const len = input.value.length;\n input.setSelectionRange(len, len);\n this.updateSelection(input);\n });\n\n this.leFocus.emit();\n };\n\n private handleBlur = () => {\n this.isFocused = false;\n this.leBlur.emit();\n // Trigger change on blur\n this.handleChange();\n };\n\n private handleSelect = (ev: Event) => {\n this.updateSelection(ev.target as HTMLInputElement);\n };\n\n private updateSelection(input: HTMLInputElement) {\n this.selectionStart = input.selectionStart || 0;\n this.selectionEnd = input.selectionEnd || 0;\n }\n\n /**\n * Helper to determine active index for focus ring\n */\n private getActiveIndex(): number {\n if (!this.isFocused) return -1;\n\n // If we have a range selection, usually focus ring is not shown or shown around selection?\n // We'll stick to showing it at the cursor end (selectionEnd) or start?\n // If range selected, `selectionStart` is start of range.\n\n // If cursor is at the very end (pos == length), we highlight the last box\n if (this.selectionStart === this.length && this.length > 0) {\n return this.length - 1;\n }\n\n return this.selectionStart;\n }\n\n private renderBoxes() {\n const boxes = [];\n const activeIndex = this.getActiveIndex();\n const isRangeSelection = this.selectionEnd - this.selectionStart > 0;\n\n for (let i = 0; i < this.length; i++) {\n const char = this.value ? this.value[i] : '';\n const isActive = this.isFocused && !isRangeSelection && i === activeIndex;\n const isSelected =\n this.isFocused && isRangeSelection && i >= this.selectionStart && i < this.selectionEnd;\n\n boxes.push(\n <div\n class={classnames('code-box', {\n 'active': isActive,\n 'selected': isSelected,\n 'has-value': !!char,\n })}\n >\n {char}\n </div>,\n );\n }\n return boxes;\n }\n\n render() {\n return (\n <le-component\n component=\"le-code-input\"\n hostClass={classnames({ 'disabled': this.disabled, 'has-error': this.error })}\n >\n <div class=\"le-code-input-wrapper\">\n {this.label && (\n <label class=\"le-input-label\" htmlFor={this.name}>\n {this.label}\n </label>\n )}\n\n <div class={classnames('input-group', { 'has-error': this.error })}>\n <input\n class=\"ghost-input\"\n id={this.name}\n name={this.name}\n type=\"text\"\n inputMode={this.type === 'number' ? 'numeric' : 'text'}\n pattern={this.type === 'number' ? '[0-9]*' : undefined}\n autocomplete=\"one-time-code\"\n value={this.value}\n maxLength={this.length}\n disabled={this.disabled}\n readOnly={this.readonly}\n onInput={this.handleInput}\n onFocus={this.handleFocus}\n onBlur={this.handleBlur}\n onSelect={this.handleSelect}\n // Prevent browser autofill background from messing up visual\n spellcheck={false}\n autoCapitalize=\"none\"\n autoCorrect=\"off\"\n />\n\n <div class=\"visual-container\">{this.renderBoxes()}</div>\n </div>\n\n {!this.error && (\n <div class=\"le-input-description\">\n <le-slot name=\"description\" type=\"text\" tag=\"p\" label=\"Description\">\n <slot name=\"description\">{this.description}</slot>\n </le-slot>\n </div>\n )}\n </div>\n </le-component>\n );\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"le-code-input.entry.js","sources":["src/components/le-code-input/le-code-input.css?tag=le-code-input&encapsulation=shadow","src/components/le-code-input/le-code-input.tsx"],"sourcesContent":[":host {\n display: block;\n\n --le-input-bg: var(--le-color-surface, #ffffff);\n --le-input-color: var(--le-color-text-primary, #333333);\n --le-input-border: var(--le-border-width, 2px) solid var(--le-color-border-input, #007bff);\n --le-input-radius: var(--le-radius-sm, 4px);\n --le-input-border-focus: 2px solid var(--le-color-focus);\n --le-input-border-focus-offset: 2px;\n}\n\n.le-code-input-wrapper {\n position: relative;\n display: flex;\n flex-direction: column;\n}\n\n.le-input-label {\n display: block;\n margin-bottom: var(--le-spacing-2, 0.5rem);\n color: var(--le-text-color, inherit);\n font-size: var(--le-font-size-sm, 0.875rem);\n font-weight: 500;\n}\n\n.input-group {\n position: relative;\n display: inline-flex;\n width: fit-content;\n}\n\n.ghost-input {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n opacity: 0;\n z-index: 10;\n cursor: text;\n color: transparent;\n background: transparent;\n caret-color: transparent;\n border: none;\n outline: none;\n letter-spacing: 1em; /* Try to match boxes? */\n}\n\n.ghost-input:disabled {\n cursor: not-allowed;\n}\n\n.visual-container {\n display: flex;\n gap: var(--le-spacing-2, 8px);\n pointer-events: none; /* Let clicks pass to ghost input */\n}\n\n.code-box {\n position: relative;\n width: var(--le-code-box-size, 32px);\n height: var(--le-code-box-size, 42px);\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--le-input-bg);\n border: var(--le-input-border);\n border-radius: var(--le-input-radius);\n color: var(--le-input-color);\n font-size: 1.2rem;\n transition: all 0.15s ease-in-out;\n box-sizing: border-box;\n user-select: none;\n}\n\n.code-box.active {\n outline: var(--le-input-border-focus);\n outline-offset: var(--le-input-border-focus-offset);\n z-index: 1;\n}\n\n.code-box.selected {\n background-color: SelectedItem;\n outline: var(--le-input-border-focus);\n outline-offset: var(--le-input-border-focus-offset);\n}\n\n.input-group.has-error .code-box {\n border: var(--le-input-border-error, 1px solid #ef4444);\n}\n\n.input-group.has-error .code-box.active {\n border-width: 2px;\n}\n\n:host(.disabled) .code-box {\n background-color: var(--le-color-disabled-bg, #f3f4f6);\n color: var(--le-color-disabled-text, #9ca3af);\n border-color: var(--le-color-disabled-border, #e5e7eb);\n}\n\n.le-input-description,\n:host(p) {\n margin-top: var(--le-spacing-1, 0.25rem);\n color: var(--le-text-muted, #6b7280);\n font-size: var(--le-font-size-sm, 0.875rem);\n}\n","import { Component, Prop, Event, EventEmitter, State, h, Element, Watch } from '@stencil/core';\nimport { classnames } from '../../utils/utils';\n\n/**\n * A one-time code input component with individual frames for each character.\n * Supports standard copy/paste and range selection behaviors.\n *\n * @slot description - Additional description text displayed below the input\n *\n * @cssprop --le-code-box-size - Size of each character box (default: 40px width, 48px height)\n * @cssprop --le-input-bg - Input background color\n * @cssprop --le-input-color - Input text color\n * @cssprop --le-input-border - Input border style\n * @cssprop --le-input-border-focus - Input border style when focused\n * @cssprop --le-input-border-error - Input border style when invalid\n * @cssprop --le-input-radius - Input border radius\n */\n@Component({\n tag: 'le-code-input',\n styleUrl: 'le-code-input.css',\n shadow: true,\n})\nexport class LeCodeInput {\n @Element() el: HTMLElement;\n\n /**\n * The value of the input\n */\n @Prop({ mutable: true, reflect: true }) value: string = '';\n\n /**\n * The name of the input\n */\n @Prop() name: string;\n\n /**\n * Label for the input\n */\n @Prop() label: string;\n\n /**\n * Length of the code (number of characters)\n */\n @Prop() length: number = 6;\n\n /**\n * Description text displayed below the input\n * in case there is a more complex markup,\n * it can be provided via slot as well\n */\n @Prop() description?: string;\n\n /**\n * The type of code (numeric or alphanumeric)\n * This affects the keyboard layout on mobile devices.\n */\n @Prop() type: 'text' | 'number' = 'text';\n\n /**\n * Whether the input is disabled\n */\n @Prop() disabled: boolean = false;\n\n /**\n * Whether the input is read-only\n */\n @Prop() readonly: boolean = false;\n\n /**\n * External ID for linking with external systems\n */\n @Prop() externalId: string;\n\n /**\n * Internal validation state (can be set externally manually or via simple check)\n */\n @Prop() error: boolean = false;\n\n /**\n * Emitted when the value changes (on blur or Enter)\n */\n @Event() leChange: EventEmitter<{ value: string; name: string; externalId: string }>;\n\n /**\n * Emitted when the input value changes (on keystroke)\n */\n @Event() leInput: EventEmitter<{ value: string; name: string; externalId: string }>;\n\n /**\n * Emitted when the input is focused\n */\n @Event() leFocus: EventEmitter<void>;\n\n /**\n * Emitted when the input is blurred\n */\n @Event() leBlur: EventEmitter<void>;\n\n @State() private isFocused: boolean = false;\n @State() private selectionStart: number = 0;\n @State() private selectionEnd: number = 0;\n\n @Watch('value')\n valueChanged(newValue: string) {\n if (newValue && newValue.length > this.length) {\n this.value = newValue.slice(0, this.length);\n }\n }\n\n componentWillLoad() {\n if (this.value && this.value.length > this.length) {\n this.value = this.value.slice(0, this.length);\n }\n }\n\n private handleInput = (ev: Event) => {\n const input = ev.target as HTMLInputElement;\n let val = input.value;\n\n // Enforce length limit\n if (val.length > this.length) {\n val = val.slice(0, this.length);\n // We need to force update the input value if it exceeded length\n // because Stencil prop update might not happen if value is same as prop but input is different\n input.value = val;\n }\n\n this.value = val;\n this.updateSelection(input);\n\n this.leInput.emit({\n value: this.value,\n name: this.name,\n externalId: this.externalId,\n });\n };\n\n private handleChange = () => {\n this.leChange.emit({\n value: this.value,\n name: this.name,\n externalId: this.externalId,\n });\n };\n\n private handleFocus = (ev: Event) => {\n this.isFocused = true;\n const input = ev.target as HTMLInputElement;\n\n // Move cursor to the end on focus so typing appends to current value\n window.requestAnimationFrame(() => {\n const len = input.value.length;\n input.setSelectionRange(len, len);\n this.updateSelection(input);\n });\n\n this.leFocus.emit();\n };\n\n private handleBlur = () => {\n this.isFocused = false;\n this.leBlur.emit();\n // Trigger change on blur\n this.handleChange();\n };\n\n private handleSelect = (ev: Event) => {\n this.updateSelection(ev.target as HTMLInputElement);\n };\n\n private updateSelection(input: HTMLInputElement) {\n this.selectionStart = input.selectionStart || 0;\n this.selectionEnd = input.selectionEnd || 0;\n }\n\n /**\n * Helper to determine active index for focus ring\n */\n private getActiveIndex(): number {\n if (!this.isFocused) return -1;\n\n // If we have a range selection, usually focus ring is not shown or shown around selection?\n // We'll stick to showing it at the cursor end (selectionEnd) or start?\n // If range selected, `selectionStart` is start of range.\n\n // If cursor is at the very end (pos == length), we highlight the last box\n if (this.selectionStart === this.length && this.length > 0) {\n return this.length - 1;\n }\n\n return this.selectionStart;\n }\n\n private renderBoxes() {\n const boxes = [];\n const activeIndex = this.getActiveIndex();\n const isRangeSelection = this.selectionEnd - this.selectionStart > 0;\n\n for (let i = 0; i < this.length; i++) {\n const char = this.value ? this.value[i] : '';\n const isActive = this.isFocused && !isRangeSelection && i === activeIndex;\n const isSelected =\n this.isFocused && isRangeSelection && i >= this.selectionStart && i < this.selectionEnd;\n\n boxes.push(\n <div\n class={classnames('code-box', {\n 'active': isActive,\n 'selected': isSelected,\n 'has-value': !!char,\n })}\n >\n {char}\n </div>,\n );\n }\n return boxes;\n }\n\n render() {\n return (\n <le-component\n component=\"le-code-input\"\n hostClass={classnames({ 'disabled': this.disabled, 'has-error': this.error })}\n >\n <div class=\"le-code-input-wrapper\">\n {this.label && (\n <label class=\"le-input-label\" htmlFor={this.name}>\n {this.label}\n </label>\n )}\n\n <div class={classnames('input-group', { 'has-error': this.error })}>\n <input\n class=\"ghost-input\"\n id={this.name}\n name={this.name}\n type=\"text\"\n inputMode={this.type === 'number' ? 'numeric' : 'text'}\n pattern={this.type === 'number' ? '[0-9]*' : undefined}\n autocomplete=\"one-time-code\"\n value={this.value}\n maxLength={this.length}\n disabled={this.disabled}\n readOnly={this.readonly}\n onInput={this.handleInput}\n onFocus={this.handleFocus}\n onBlur={this.handleBlur}\n onSelect={this.handleSelect}\n // Prevent browser autofill background from messing up visual\n spellcheck={false}\n autoCapitalize=\"none\"\n autoCorrect=\"off\"\n />\n\n <div class=\"visual-container\">{this.renderBoxes()}</div>\n </div>\n\n {!this.error && (\n <div class=\"le-input-description\">\n <le-slot name=\"description\" type=\"text\" tag=\"p\" label=\"Description\">\n <slot name=\"description\">{this.description}</slot>\n </le-slot>\n </div>\n )}\n </div>\n </le-component>\n );\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { r as registerInstance, c as createEvent, a as getElement
|
|
1
|
+
import { r as registerInstance, c as createEvent, h, a as getElement } from './index-DFTm5BqT.js';
|
|
2
2
|
|
|
3
3
|
const leComboboxCss = () => `:host{display:inline-block;min-width:200px;--le-combobox-border-color:var(--le-color-primary, #3b82f6)}:host([disabled]){opacity:0.5;pointer-events:none}:host([full-width]){width:100%}.combobox-trigger{display:flex;align-items:center;width:100%;background:var(--le-combobox-bg, var(--le-color-surface, #fff));border:1px solid color-mix(in srgb, var(--le-combobox-border-color) 33%, transparent);border-radius:var(--le-combobox-border-radius, 0.375rem);transition:border-color 0.15s ease, box-shadow 0.15s ease}.combobox-trigger:hover:not(.is-disabled),:host(:focus-within) .combobox-trigger:not(.is-disabled){border-color:var(--le-combobox-border-color)}.combobox-trigger:focus-within{outline:2px solid var(--le-color-focus);outline-offset:2px}.combobox-trigger.is-open{border-color:var(--le-color-primary, #3b82f6)}.combobox-input{flex:1;border:none;outline:none}.combobox-input::part(container){border:none}.combobox-input::part(container):focus-within{outline:none !important}.combobox-input::placeholder{color:color-mix(in srgb, var(--le-color-text-secondary) 66%, transparent)}.combobox-trigger.is-disabled{cursor:not-allowed;background:var(--le-color-surface-disabled, #f9fafb)}.combobox-input:disabled{cursor:not-allowed}.combobox-clear{display:flex;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;padding:0;margin-right:0.25rem;color:var(--le-color-primary, #3b82f6);background:transparent;border:none;border-radius:0.25rem;cursor:pointer;opacity:0.6;transition:opacity 0.15s ease, background-color 0.15s ease}.combobox-clear:hover{opacity:1;background:var(--le-color-surface-hover, #f3f4f6)}.combobox-clear svg{width:0.875rem;height:0.875rem}.combobox-arrow{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:2rem;height:100%;color:var(--le-color-primary, #3b82f6);transition:transform 0.2s ease}.combobox-arrow svg{width:1rem;height:1rem}.combobox-trigger.is-open .combobox-arrow{transform:rotate(180deg)}:host([size='small']) .combobox-trigger{--le-combobox-height:2rem}:host([size='small']) .combobox-input{--le-combobox-padding-x:0.5rem;--le-combobox-font-size:0.75rem}:host([size='large']) .combobox-trigger{--le-combobox-height:3rem}:host([size='large']) .combobox-input{--le-combobox-padding-x:1rem;--le-combobox-font-size:1rem}`;
|
|
4
4
|
|
|
@@ -9,81 +9,136 @@ const LeCombobox = class {
|
|
|
9
9
|
this.leInput = createEvent(this, "leInput");
|
|
10
10
|
this.leOpen = createEvent(this, "leOpen");
|
|
11
11
|
this.leClose = createEvent(this, "leClose");
|
|
12
|
+
/**
|
|
13
|
+
* The options to display in the dropdown.
|
|
14
|
+
*/
|
|
15
|
+
this.options = [];
|
|
16
|
+
/**
|
|
17
|
+
* Placeholder text for the input.
|
|
18
|
+
*/
|
|
19
|
+
this.placeholder = 'Type to search...';
|
|
20
|
+
/**
|
|
21
|
+
* Whether the combobox is disabled.
|
|
22
|
+
*/
|
|
23
|
+
this.disabled = false;
|
|
24
|
+
/**
|
|
25
|
+
* Whether selection is required.
|
|
26
|
+
*/
|
|
27
|
+
this.required = false;
|
|
28
|
+
/**
|
|
29
|
+
* Whether the multiselect should take full width of its container.
|
|
30
|
+
*/
|
|
31
|
+
this.fullWidth = false;
|
|
32
|
+
/**
|
|
33
|
+
* Size variant of the combobox.
|
|
34
|
+
*/
|
|
35
|
+
this.size = 'medium';
|
|
36
|
+
/**
|
|
37
|
+
* Whether to allow custom values not in the options list.
|
|
38
|
+
*/
|
|
39
|
+
this.allowCustom = false;
|
|
40
|
+
/**
|
|
41
|
+
* Minimum characters before showing filtered results.
|
|
42
|
+
*/
|
|
43
|
+
this.minSearchLength = 0;
|
|
44
|
+
/**
|
|
45
|
+
* Text to show when no options match the search.
|
|
46
|
+
*/
|
|
47
|
+
this.emptyText = 'No results found';
|
|
48
|
+
/**
|
|
49
|
+
* Whether the dropdown is currently open.
|
|
50
|
+
*/
|
|
51
|
+
this.open = false;
|
|
52
|
+
this.inputValue = '';
|
|
53
|
+
this.filterOption = (option, query) => {
|
|
54
|
+
if (!query || query.length < this.minSearchLength)
|
|
55
|
+
return true;
|
|
56
|
+
const searchLower = query.toLowerCase();
|
|
57
|
+
return (option.label.toLowerCase().includes(searchLower) ||
|
|
58
|
+
(option.description?.toLowerCase().includes(searchLower) ?? false));
|
|
59
|
+
};
|
|
60
|
+
this.handleOptionSelect = (e) => {
|
|
61
|
+
this.value = e.detail.value;
|
|
62
|
+
this.selectedOption = e.detail.option;
|
|
63
|
+
this.inputValue = e.detail.option.label;
|
|
64
|
+
this.leChange.emit(e.detail);
|
|
65
|
+
};
|
|
66
|
+
this.handleDropdownOpen = () => {
|
|
67
|
+
this.open = true;
|
|
68
|
+
this.leOpen.emit();
|
|
69
|
+
};
|
|
70
|
+
this.handleDropdownClose = () => {
|
|
71
|
+
this.open = false;
|
|
72
|
+
this.leClose.emit();
|
|
73
|
+
// If custom values not allowed, reset input to selected option
|
|
74
|
+
if (!this.allowCustom && this.selectedOption) {
|
|
75
|
+
this.inputValue = this.selectedOption.label;
|
|
76
|
+
}
|
|
77
|
+
else if (!this.allowCustom && !this.selectedOption) {
|
|
78
|
+
this.inputValue = '';
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
this.handleInputChange = (e) => {
|
|
82
|
+
const target = e.target;
|
|
83
|
+
this.inputValue = target.value;
|
|
84
|
+
// Emit input event for custom values
|
|
85
|
+
if (this.allowCustom) {
|
|
86
|
+
this.leInput.emit({ value: this.inputValue });
|
|
87
|
+
}
|
|
88
|
+
// Open dropdown when typing
|
|
89
|
+
if (!this.open && this.inputValue.length >= this.minSearchLength) {
|
|
90
|
+
this.dropdownEl?.show();
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
this.handleInputFocus = () => {
|
|
94
|
+
if (!this.disabled) {
|
|
95
|
+
this.dropdownEl?.show();
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
this.handleInputKeyDown = (e) => {
|
|
99
|
+
if (this.disabled)
|
|
100
|
+
return;
|
|
101
|
+
switch (e.key) {
|
|
102
|
+
case 'ArrowDown':
|
|
103
|
+
e.preventDefault();
|
|
104
|
+
if (!this.open) {
|
|
105
|
+
this.dropdownEl?.show();
|
|
106
|
+
}
|
|
107
|
+
break;
|
|
108
|
+
case 'Enter':
|
|
109
|
+
if (this.allowCustom && this.inputValue && !this.open) {
|
|
110
|
+
// Accept custom value
|
|
111
|
+
this.value = this.inputValue;
|
|
112
|
+
this.leChange.emit({
|
|
113
|
+
value: this.inputValue,
|
|
114
|
+
option: { label: this.inputValue, value: this.inputValue },
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
break;
|
|
118
|
+
case 'Escape':
|
|
119
|
+
if (this.open) {
|
|
120
|
+
this.dropdownEl?.hide();
|
|
121
|
+
}
|
|
122
|
+
break;
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
this.handleClear = (e) => {
|
|
126
|
+
e.stopPropagation();
|
|
127
|
+
this.value = undefined;
|
|
128
|
+
this.selectedOption = undefined;
|
|
129
|
+
this.inputValue = '';
|
|
130
|
+
this.inputEl?.focus();
|
|
131
|
+
this.leChange.emit({
|
|
132
|
+
value: '',
|
|
133
|
+
option: { label: '', value: '' },
|
|
134
|
+
});
|
|
135
|
+
};
|
|
12
136
|
}
|
|
13
|
-
get el() { return getElement(this); }
|
|
14
|
-
/**
|
|
15
|
-
* The options to display in the dropdown.
|
|
16
|
-
*/
|
|
17
|
-
options = [];
|
|
18
|
-
/**
|
|
19
|
-
* The currently selected value.
|
|
20
|
-
*/
|
|
21
|
-
value;
|
|
22
|
-
/**
|
|
23
|
-
* Placeholder text for the input.
|
|
24
|
-
*/
|
|
25
|
-
placeholder = 'Type to search...';
|
|
26
|
-
/**
|
|
27
|
-
* Whether the combobox is disabled.
|
|
28
|
-
*/
|
|
29
|
-
disabled = false;
|
|
30
|
-
/**
|
|
31
|
-
* Whether selection is required.
|
|
32
|
-
*/
|
|
33
|
-
required = false;
|
|
34
|
-
/**
|
|
35
|
-
* Name attribute for form submission.
|
|
36
|
-
*/
|
|
37
|
-
name;
|
|
38
|
-
/**
|
|
39
|
-
* Whether the multiselect should take full width of its container.
|
|
40
|
-
*/
|
|
41
|
-
fullWidth = false;
|
|
42
|
-
/**
|
|
43
|
-
* Size variant of the combobox.
|
|
44
|
-
*/
|
|
45
|
-
size = 'medium';
|
|
46
|
-
/**
|
|
47
|
-
* Whether to allow custom values not in the options list.
|
|
48
|
-
*/
|
|
49
|
-
allowCustom = false;
|
|
50
|
-
/**
|
|
51
|
-
* Minimum characters before showing filtered results.
|
|
52
|
-
*/
|
|
53
|
-
minSearchLength = 0;
|
|
54
|
-
/**
|
|
55
|
-
* Text to show when no options match the search.
|
|
56
|
-
*/
|
|
57
|
-
emptyText = 'No results found';
|
|
58
|
-
/**
|
|
59
|
-
* Whether the dropdown is currently open.
|
|
60
|
-
*/
|
|
61
|
-
open = false;
|
|
62
|
-
/**
|
|
63
|
-
* Emitted when the selected value changes.
|
|
64
|
-
*/
|
|
65
|
-
leChange;
|
|
66
|
-
/**
|
|
67
|
-
* Emitted when the input value changes (for custom values).
|
|
68
|
-
*/
|
|
69
|
-
leInput;
|
|
70
|
-
/**
|
|
71
|
-
* Emitted when the dropdown opens.
|
|
72
|
-
*/
|
|
73
|
-
leOpen;
|
|
74
|
-
/**
|
|
75
|
-
* Emitted when the dropdown closes.
|
|
76
|
-
*/
|
|
77
|
-
leClose;
|
|
78
137
|
handleWindowClick(event) {
|
|
79
138
|
if (!this.el.contains(event.target)) {
|
|
80
139
|
this.dropdownEl?.hide();
|
|
81
140
|
}
|
|
82
141
|
}
|
|
83
|
-
inputValue = '';
|
|
84
|
-
selectedOption;
|
|
85
|
-
dropdownEl;
|
|
86
|
-
inputEl;
|
|
87
142
|
handleValueChange() {
|
|
88
143
|
this.updateSelectedOption();
|
|
89
144
|
}
|
|
@@ -119,89 +174,6 @@ const LeCombobox = class {
|
|
|
119
174
|
this.inputValue = '';
|
|
120
175
|
}
|
|
121
176
|
}
|
|
122
|
-
filterOption = (option, query) => {
|
|
123
|
-
if (!query || query.length < this.minSearchLength)
|
|
124
|
-
return true;
|
|
125
|
-
const searchLower = query.toLowerCase();
|
|
126
|
-
return (option.label.toLowerCase().includes(searchLower) ||
|
|
127
|
-
(option.description?.toLowerCase().includes(searchLower) ?? false));
|
|
128
|
-
};
|
|
129
|
-
handleOptionSelect = (e) => {
|
|
130
|
-
this.value = e.detail.value;
|
|
131
|
-
this.selectedOption = e.detail.option;
|
|
132
|
-
this.inputValue = e.detail.option.label;
|
|
133
|
-
this.leChange.emit(e.detail);
|
|
134
|
-
};
|
|
135
|
-
handleDropdownOpen = () => {
|
|
136
|
-
this.open = true;
|
|
137
|
-
this.leOpen.emit();
|
|
138
|
-
};
|
|
139
|
-
handleDropdownClose = () => {
|
|
140
|
-
this.open = false;
|
|
141
|
-
this.leClose.emit();
|
|
142
|
-
// If custom values not allowed, reset input to selected option
|
|
143
|
-
if (!this.allowCustom && this.selectedOption) {
|
|
144
|
-
this.inputValue = this.selectedOption.label;
|
|
145
|
-
}
|
|
146
|
-
else if (!this.allowCustom && !this.selectedOption) {
|
|
147
|
-
this.inputValue = '';
|
|
148
|
-
}
|
|
149
|
-
};
|
|
150
|
-
handleInputChange = (e) => {
|
|
151
|
-
const target = e.target;
|
|
152
|
-
this.inputValue = target.value;
|
|
153
|
-
// Emit input event for custom values
|
|
154
|
-
if (this.allowCustom) {
|
|
155
|
-
this.leInput.emit({ value: this.inputValue });
|
|
156
|
-
}
|
|
157
|
-
// Open dropdown when typing
|
|
158
|
-
if (!this.open && this.inputValue.length >= this.minSearchLength) {
|
|
159
|
-
this.dropdownEl?.show();
|
|
160
|
-
}
|
|
161
|
-
};
|
|
162
|
-
handleInputFocus = () => {
|
|
163
|
-
if (!this.disabled) {
|
|
164
|
-
this.dropdownEl?.show();
|
|
165
|
-
}
|
|
166
|
-
};
|
|
167
|
-
handleInputKeyDown = (e) => {
|
|
168
|
-
if (this.disabled)
|
|
169
|
-
return;
|
|
170
|
-
switch (e.key) {
|
|
171
|
-
case 'ArrowDown':
|
|
172
|
-
e.preventDefault();
|
|
173
|
-
if (!this.open) {
|
|
174
|
-
this.dropdownEl?.show();
|
|
175
|
-
}
|
|
176
|
-
break;
|
|
177
|
-
case 'Enter':
|
|
178
|
-
if (this.allowCustom && this.inputValue && !this.open) {
|
|
179
|
-
// Accept custom value
|
|
180
|
-
this.value = this.inputValue;
|
|
181
|
-
this.leChange.emit({
|
|
182
|
-
value: this.inputValue,
|
|
183
|
-
option: { label: this.inputValue, value: this.inputValue },
|
|
184
|
-
});
|
|
185
|
-
}
|
|
186
|
-
break;
|
|
187
|
-
case 'Escape':
|
|
188
|
-
if (this.open) {
|
|
189
|
-
this.dropdownEl?.hide();
|
|
190
|
-
}
|
|
191
|
-
break;
|
|
192
|
-
}
|
|
193
|
-
};
|
|
194
|
-
handleClear = (e) => {
|
|
195
|
-
e.stopPropagation();
|
|
196
|
-
this.value = undefined;
|
|
197
|
-
this.selectedOption = undefined;
|
|
198
|
-
this.inputValue = '';
|
|
199
|
-
this.inputEl?.focus();
|
|
200
|
-
this.leChange.emit({
|
|
201
|
-
value: '',
|
|
202
|
-
option: { label: '', value: '' },
|
|
203
|
-
});
|
|
204
|
-
};
|
|
205
177
|
/**
|
|
206
178
|
* Opens the dropdown.
|
|
207
179
|
*/
|
|
@@ -222,8 +194,9 @@ const LeCombobox = class {
|
|
|
222
194
|
}
|
|
223
195
|
render() {
|
|
224
196
|
const hasValue = this.inputValue.length > 0;
|
|
225
|
-
return (h("le-component", { key: '
|
|
197
|
+
return (h("le-component", { key: '2b0d151b589302147ff6a958a1bcbdd9fe973d6e', component: "le-combobox" }, h("le-dropdown-base", { key: '2916e62fe29d92274ec735719675ed4847f19aa9', ref: el => (this.dropdownEl = el), options: this.parsedOptions, value: this.value, disabled: this.disabled, filterFn: this.filterOption, filterQuery: this.inputValue, emptyText: this.emptyText, fullWidth: this.fullWidth, closeOnClickOutside: false, onLeOptionSelect: this.handleOptionSelect, onLeDropdownOpen: this.handleDropdownOpen, onLeDropdownClose: this.handleDropdownClose }, h("div", { key: 'b5ff8b929ce9d204327a11fd191d5c0b4a8bea70', slot: "trigger", class: { 'combobox-trigger': true, 'is-open': this.open } }, h("le-string-input", { key: 'a3cb396b00e753634bd6c132fad9beea9586e0db', mode: "default", hideDescription: true, inputRef: el => (this.inputEl = el), type: "text", class: "combobox-input", value: this.inputValue, placeholder: this.placeholder, disabled: this.disabled, "aria-haspopup": "listbox", "aria-expanded": this.open ? 'true' : 'false', "aria-autocomplete": "list", onInput: this.handleInputChange, onFocus: this.handleInputFocus, onKeyDown: this.handleInputKeyDown }), hasValue && !this.disabled && (h("button", { key: '6f8cf150544c1b33c07acf2bbb51cafb359a9446', type: "button", class: "combobox-clear", onClick: this.handleClear, "aria-label": "Clear", tabIndex: -1 }, h("svg", { key: 'e06af09838a2c451ca322ac5aa1c6360d1b6e527', viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", "stroke-width": "2" }, h("path", { key: '1d03c90b883b4a0c35b4fe6a089c95ba210287cf', d: "M4 4l8 8M12 4l-8 8" })))), h("span", { key: '530f07b37ec61faac0eb5ee9bce312a4f056fc70', class: "combobox-arrow" }, h("svg", { key: 'fd6ee2352adb93ee4fed752caba5552c7a20d5bf', viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", "stroke-width": "2" }, h("path", { key: '4aa7fe6c1aa02681a3fc634124227a1b7263df29', d: "M4 6l4 4 4-4" }))))), this.name && h("input", { key: '388a14c0b95a7a8b5897e684a41c1adbbcd10e46', type: "hidden", name: this.name, value: this.value?.toString() ?? '' })));
|
|
226
198
|
}
|
|
199
|
+
get el() { return getElement(this); }
|
|
227
200
|
static get watchers() { return {
|
|
228
201
|
"value": ["handleValueChange"],
|
|
229
202
|
"options": ["handleOptionsChange"]
|