le-kit 0.5.1 → 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 +1371 -1043
- 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 +1371 -1043
- 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 +1371 -1043
- 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-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-eb710c8e.entry.js +0 -2
- package/dist/le-kit/p-eb710c8e.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
|
@@ -16,78 +16,144 @@ import { generateId } from "../../utils/utils";
|
|
|
16
16
|
* @slot trigger - The element that triggers the dropdown
|
|
17
17
|
*/
|
|
18
18
|
export class LeDropdownBase {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
19
|
+
constructor() {
|
|
20
|
+
/**
|
|
21
|
+
* The options to display in the dropdown.
|
|
22
|
+
*/
|
|
23
|
+
this.options = [];
|
|
24
|
+
/**
|
|
25
|
+
* Whether multiple selection is allowed.
|
|
26
|
+
*/
|
|
27
|
+
this.multiple = false;
|
|
28
|
+
/**
|
|
29
|
+
* Whether the dropdown is open.
|
|
30
|
+
*/
|
|
31
|
+
this.open = false;
|
|
32
|
+
/**
|
|
33
|
+
* Whether the dropdown is disabled.
|
|
34
|
+
*/
|
|
35
|
+
this.disabled = false;
|
|
36
|
+
/**
|
|
37
|
+
* Current filter query string.
|
|
38
|
+
*/
|
|
39
|
+
this.filterQuery = '';
|
|
40
|
+
/**
|
|
41
|
+
* Placeholder text when no options match filter.
|
|
42
|
+
*/
|
|
43
|
+
this.emptyText = 'No options';
|
|
44
|
+
/**
|
|
45
|
+
* Whether to show checkboxes for multiselect mode.
|
|
46
|
+
*/
|
|
47
|
+
this.showCheckboxes = true;
|
|
48
|
+
/**
|
|
49
|
+
* Maximum height of the dropdown list.
|
|
50
|
+
*/
|
|
51
|
+
this.maxHeight = '300px';
|
|
52
|
+
/**
|
|
53
|
+
* Sets the dropdown to full width of the trigger.
|
|
54
|
+
*/
|
|
55
|
+
this.fullWidth = false;
|
|
56
|
+
/**
|
|
57
|
+
* Whether to close the dropdown when clicking outside.
|
|
58
|
+
* (used to support combobox with input focus)
|
|
59
|
+
*/
|
|
60
|
+
this.closeOnClickOutside = true;
|
|
61
|
+
this.focusedIndex = -1;
|
|
62
|
+
this.filteredOptions = [];
|
|
63
|
+
this.triggerWidth = 0;
|
|
64
|
+
this.handleKeyDown = (e) => {
|
|
65
|
+
if (!this.open)
|
|
66
|
+
return;
|
|
67
|
+
const optionCount = this.filteredOptions.length;
|
|
68
|
+
switch (e.key) {
|
|
69
|
+
case 'ArrowDown':
|
|
70
|
+
e.preventDefault();
|
|
71
|
+
// check for the next non-disabled option and focus
|
|
72
|
+
let nextIndex = this.focusedIndex < optionCount - 1 ? this.focusedIndex + 1 : 0;
|
|
73
|
+
while (this.filteredOptions[nextIndex].disabled) {
|
|
74
|
+
nextIndex = ++nextIndex < optionCount ? nextIndex : 0;
|
|
75
|
+
}
|
|
76
|
+
this.focusedIndex = nextIndex;
|
|
77
|
+
this.scrollToFocused();
|
|
78
|
+
break;
|
|
79
|
+
case 'ArrowUp':
|
|
80
|
+
e.preventDefault();
|
|
81
|
+
// check for the previous non-disabled option and focus
|
|
82
|
+
let prevIndex = this.focusedIndex > 0 ? this.focusedIndex - 1 : optionCount - 1;
|
|
83
|
+
while (this.filteredOptions[prevIndex].disabled) {
|
|
84
|
+
prevIndex = --prevIndex >= 0 ? prevIndex : optionCount - 1;
|
|
85
|
+
}
|
|
86
|
+
this.focusedIndex = prevIndex;
|
|
87
|
+
this.scrollToFocused();
|
|
88
|
+
break;
|
|
89
|
+
case 'Home':
|
|
90
|
+
e.preventDefault();
|
|
91
|
+
// check for the first non-disabled option and focus
|
|
92
|
+
let firstIndex = 0;
|
|
93
|
+
while (this.filteredOptions[firstIndex].disabled) {
|
|
94
|
+
firstIndex++;
|
|
95
|
+
if (firstIndex >= optionCount) {
|
|
96
|
+
firstIndex = -1;
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
this.focusedIndex = firstIndex;
|
|
101
|
+
this.scrollToFocused();
|
|
102
|
+
break;
|
|
103
|
+
case 'End':
|
|
104
|
+
e.preventDefault();
|
|
105
|
+
// check for the last non-disabled option and focus
|
|
106
|
+
let lastIndex = optionCount - 1;
|
|
107
|
+
while (this.filteredOptions[lastIndex].disabled) {
|
|
108
|
+
lastIndex--;
|
|
109
|
+
if (lastIndex < 0) {
|
|
110
|
+
lastIndex = -1;
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
this.focusedIndex = lastIndex;
|
|
115
|
+
this.scrollToFocused();
|
|
116
|
+
break;
|
|
117
|
+
case 'Enter':
|
|
118
|
+
case ' ':
|
|
119
|
+
e.preventDefault();
|
|
120
|
+
if (this.focusedIndex >= 0 && this.focusedIndex < optionCount) {
|
|
121
|
+
const option = this.filteredOptions[this.focusedIndex];
|
|
122
|
+
if (!option || option.disabled)
|
|
123
|
+
return;
|
|
124
|
+
this.leOptionSelect.emit({
|
|
125
|
+
value: option.value ?? option.label,
|
|
126
|
+
option,
|
|
127
|
+
});
|
|
128
|
+
if (!this.multiple) {
|
|
129
|
+
this.hide();
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
break;
|
|
133
|
+
case 'Escape':
|
|
134
|
+
e.preventDefault();
|
|
135
|
+
this.hide();
|
|
136
|
+
break;
|
|
137
|
+
case 'Tab':
|
|
138
|
+
this.hide();
|
|
139
|
+
break;
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
this.handlePopoverOpen = () => {
|
|
143
|
+
this.open = true;
|
|
144
|
+
this.focusedIndex = this.getInitialFocusIndex();
|
|
145
|
+
this.leDropdownOpen.emit();
|
|
146
|
+
// Add keyboard listener
|
|
147
|
+
document.addEventListener('keydown', this.handleKeyDown);
|
|
148
|
+
};
|
|
149
|
+
this.handlePopoverClose = () => {
|
|
150
|
+
this.open = false;
|
|
151
|
+
this.focusedIndex = -1;
|
|
152
|
+
this.leDropdownClose.emit();
|
|
153
|
+
// Remove keyboard listener
|
|
154
|
+
document.removeEventListener('keydown', this.handleKeyDown);
|
|
155
|
+
};
|
|
156
|
+
}
|
|
91
157
|
handleOptionsChange() {
|
|
92
158
|
this.updateFilteredOptions();
|
|
93
159
|
}
|
|
@@ -139,84 +205,6 @@ export class LeDropdownBase {
|
|
|
139
205
|
this.hide();
|
|
140
206
|
}
|
|
141
207
|
}
|
|
142
|
-
handleKeyDown = (e) => {
|
|
143
|
-
if (!this.open)
|
|
144
|
-
return;
|
|
145
|
-
const optionCount = this.filteredOptions.length;
|
|
146
|
-
switch (e.key) {
|
|
147
|
-
case 'ArrowDown':
|
|
148
|
-
e.preventDefault();
|
|
149
|
-
// check for the next non-disabled option and focus
|
|
150
|
-
let nextIndex = this.focusedIndex < optionCount - 1 ? this.focusedIndex + 1 : 0;
|
|
151
|
-
while (this.filteredOptions[nextIndex].disabled) {
|
|
152
|
-
nextIndex = ++nextIndex < optionCount ? nextIndex : 0;
|
|
153
|
-
}
|
|
154
|
-
this.focusedIndex = nextIndex;
|
|
155
|
-
this.scrollToFocused();
|
|
156
|
-
break;
|
|
157
|
-
case 'ArrowUp':
|
|
158
|
-
e.preventDefault();
|
|
159
|
-
// check for the previous non-disabled option and focus
|
|
160
|
-
let prevIndex = this.focusedIndex > 0 ? this.focusedIndex - 1 : optionCount - 1;
|
|
161
|
-
while (this.filteredOptions[prevIndex].disabled) {
|
|
162
|
-
prevIndex = --prevIndex >= 0 ? prevIndex : optionCount - 1;
|
|
163
|
-
}
|
|
164
|
-
this.focusedIndex = prevIndex;
|
|
165
|
-
this.scrollToFocused();
|
|
166
|
-
break;
|
|
167
|
-
case 'Home':
|
|
168
|
-
e.preventDefault();
|
|
169
|
-
// check for the first non-disabled option and focus
|
|
170
|
-
let firstIndex = 0;
|
|
171
|
-
while (this.filteredOptions[firstIndex].disabled) {
|
|
172
|
-
firstIndex++;
|
|
173
|
-
if (firstIndex >= optionCount) {
|
|
174
|
-
firstIndex = -1;
|
|
175
|
-
break;
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
this.focusedIndex = firstIndex;
|
|
179
|
-
this.scrollToFocused();
|
|
180
|
-
break;
|
|
181
|
-
case 'End':
|
|
182
|
-
e.preventDefault();
|
|
183
|
-
// check for the last non-disabled option and focus
|
|
184
|
-
let lastIndex = optionCount - 1;
|
|
185
|
-
while (this.filteredOptions[lastIndex].disabled) {
|
|
186
|
-
lastIndex--;
|
|
187
|
-
if (lastIndex < 0) {
|
|
188
|
-
lastIndex = -1;
|
|
189
|
-
break;
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
this.focusedIndex = lastIndex;
|
|
193
|
-
this.scrollToFocused();
|
|
194
|
-
break;
|
|
195
|
-
case 'Enter':
|
|
196
|
-
case ' ':
|
|
197
|
-
e.preventDefault();
|
|
198
|
-
if (this.focusedIndex >= 0 && this.focusedIndex < optionCount) {
|
|
199
|
-
const option = this.filteredOptions[this.focusedIndex];
|
|
200
|
-
if (!option || option.disabled)
|
|
201
|
-
return;
|
|
202
|
-
this.leOptionSelect.emit({
|
|
203
|
-
value: option.value ?? option.label,
|
|
204
|
-
option,
|
|
205
|
-
});
|
|
206
|
-
if (!this.multiple) {
|
|
207
|
-
this.hide();
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
break;
|
|
211
|
-
case 'Escape':
|
|
212
|
-
e.preventDefault();
|
|
213
|
-
this.hide();
|
|
214
|
-
break;
|
|
215
|
-
case 'Tab':
|
|
216
|
-
this.hide();
|
|
217
|
-
break;
|
|
218
|
-
}
|
|
219
|
-
};
|
|
220
208
|
scrollToFocused() {
|
|
221
209
|
if (!this.listEl || this.focusedIndex < 0)
|
|
222
210
|
return;
|
|
@@ -225,20 +213,6 @@ export class LeDropdownBase {
|
|
|
225
213
|
focusedEl.scrollIntoView({ block: 'nearest' });
|
|
226
214
|
}
|
|
227
215
|
}
|
|
228
|
-
handlePopoverOpen = () => {
|
|
229
|
-
this.open = true;
|
|
230
|
-
this.focusedIndex = this.getInitialFocusIndex();
|
|
231
|
-
this.leDropdownOpen.emit();
|
|
232
|
-
// Add keyboard listener
|
|
233
|
-
document.addEventListener('keydown', this.handleKeyDown);
|
|
234
|
-
};
|
|
235
|
-
handlePopoverClose = () => {
|
|
236
|
-
this.open = false;
|
|
237
|
-
this.focusedIndex = -1;
|
|
238
|
-
this.leDropdownClose.emit();
|
|
239
|
-
// Remove keyboard listener
|
|
240
|
-
document.removeEventListener('keydown', this.handleKeyDown);
|
|
241
|
-
};
|
|
242
216
|
getInitialFocusIndex() {
|
|
243
217
|
// Focus on first selected option, or first option
|
|
244
218
|
const selectableOptions = this.getSelectableOptions();
|
|
@@ -339,7 +313,7 @@ export class LeDropdownBase {
|
|
|
339
313
|
}
|
|
340
314
|
render() {
|
|
341
315
|
const dropdownWidth = this.width || (this.triggerWidth ? `${this.triggerWidth}px` : undefined);
|
|
342
|
-
return (h(Host, { key: '
|
|
316
|
+
return (h(Host, { key: '71c3537d6234aebb8c18fb6c07e5a751568a4b87' }, h("le-popover", { key: 'e02fcd7454cae5a9c197a509d18cd7b91e49fc9e', ref: el => (this.popoverEl = el), position: "bottom", align: "start", showClose: false, closeOnClickOutside: this.closeOnClickOutside, closeOnEscape: true, offset: 4, width: dropdownWidth, minWidth: "150px", "trigger-full-width": this.fullWidth, onLePopoverOpen: this.handlePopoverOpen, onLePopoverClose: this.handlePopoverClose }, h("slot", { key: 'f1a9e3145119f1cfc1b8a535b98b0858758c6265', name: "trigger", slot: "trigger" }), h("slot", { key: '8dd6126a610e167fb2b3c2593677f70c387bd275', name: "header" }), h("div", { key: '708b3916132c36f736f8a88e3408d482a50610fb', class: "dropdown-list", role: "listbox", "aria-multiselectable": this.multiple ? 'true' : undefined, ref: el => (this.listEl = el), style: { maxHeight: this.maxHeight } }, this.renderOptions()))));
|
|
343
317
|
}
|
|
344
318
|
static get is() { return "le-dropdown-base"; }
|
|
345
319
|
static get encapsulation() { return "shadow"; }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"le-dropdown-base.js","sourceRoot":"","sources":["../../../src/components/le-dropdown-base/le-dropdown-base.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Prop,\n State,\n Event,\n EventEmitter,\n Method,\n Element,\n Watch,\n h,\n Host,\n} from '@stencil/core';\nimport { LeOption, LeOptionValue, LeOptionSelectDetail } from '../../types/options';\nimport { generateId } from '../../utils/utils';\n\n/**\n * Internal dropdown base component that provides shared functionality\n * for select, combobox, and multiselect components.\n *\n * Wraps le-popover for positioning and provides:\n * - Option list rendering with groups\n * - Keyboard navigation (↑↓, Enter, Escape, Home/End)\n * - Option filtering support\n * - Single and multi-select modes\n *\n * @cmsInternal true\n * @cmsCategory System\n *\n * @slot trigger - The element that triggers the dropdown\n */\n@Component({\n tag: 'le-dropdown-base',\n styleUrl: 'le-dropdown-base.css',\n shadow: true,\n})\nexport class LeDropdownBase {\n @Element() el: HTMLElement;\n\n /**\n * The options to display in the dropdown.\n */\n @Prop() options: LeOption[] = [];\n\n /**\n * Current value(s) - single value or array for multiselect.\n */\n @Prop() value?: LeOptionValue | LeOptionValue[];\n\n /**\n * Whether multiple selection is allowed.\n */\n @Prop() multiple: boolean = false;\n\n /**\n * Whether the dropdown is open.\n */\n @Prop({ mutable: true, reflect: true }) open: boolean = false;\n\n /**\n * Whether the dropdown is disabled.\n */\n @Prop({ reflect: true }) disabled: boolean = false;\n\n /**\n * Filter function for options.\n * Return true to include the option.\n */\n @Prop() filterFn?: (option: LeOption, query: string) => boolean;\n\n /**\n * Current filter query string.\n */\n @Prop() filterQuery: string = '';\n\n /**\n * Placeholder text when no options match filter.\n */\n @Prop() emptyText: string = 'No options';\n\n /**\n * Whether to show checkboxes for multiselect mode.\n */\n @Prop() showCheckboxes: boolean = true;\n\n /**\n * Maximum height of the dropdown list.\n */\n @Prop() maxHeight: string = '300px';\n\n /**\n * Width of the dropdown. If not set, matches trigger width.\n */\n @Prop() width?: string;\n\n /**\n * Sets the dropdown to full width of the trigger.\n */\n @Prop() fullWidth: boolean = false;\n\n /**\n * Whether to close the dropdown when clicking outside.\n * (used to support combobox with input focus)\n */\n @Prop() closeOnClickOutside: boolean = true;\n\n /**\n * Emitted when an option is selected.\n */\n @Event() leOptionSelect: EventEmitter<LeOptionSelectDetail>;\n\n /**\n * Emitted when the dropdown opens.\n */\n @Event() leDropdownOpen: EventEmitter<void>;\n\n /**\n * Emitted when the dropdown closes.\n */\n @Event() leDropdownClose: EventEmitter<void>;\n\n @State() private focusedIndex: number = -1;\n @State() private filteredOptions: LeOption[] = [];\n\n private popoverEl?: HTMLLePopoverElement;\n private listEl?: HTMLElement;\n private triggerWidth: number = 0;\n\n @Watch('options')\n @Watch('filterQuery')\n handleOptionsChange() {\n this.updateFilteredOptions();\n }\n\n componentWillLoad() {\n this.updateFilteredOptions();\n }\n\n private updateFilteredOptions() {\n // Remember previously focused option\n const focusedOption = this.filteredOptions[this.focusedIndex];\n\n if (!this.filterQuery || !this.filterFn) {\n this.filteredOptions = this.options;\n } else {\n this.filteredOptions = this.options.filter(opt => this.filterFn!(opt, this.filterQuery));\n }\n\n // try to maintain focus on same option if still present\n if (focusedOption) {\n const newIndex = this.filteredOptions.indexOf(focusedOption);\n this.focusedIndex = newIndex >= 0 ? newIndex : this.getInitialFocusIndex();\n } else {\n this.focusedIndex = -1;\n }\n }\n\n private getSelectableOptions(): LeOption[] {\n return this.filteredOptions.filter(opt => !opt.disabled);\n }\n\n private isSelected(option: LeOption): boolean {\n const optValue = option.value ?? option.label;\n if (this.multiple && Array.isArray(this.value)) {\n setTimeout(() => {\n this.popoverEl?.updatePosition();\n }, 50);\n return this.value.includes(optValue);\n }\n return this.value === optValue;\n }\n\n private handleOptionClick(option: LeOption, e: MouseEvent) {\n e.preventDefault();\n e.stopPropagation();\n\n if (option.disabled) return;\n\n this.leOptionSelect.emit({\n value: option.value ?? option.label,\n option,\n });\n\n // Close dropdown for single select\n if (!this.multiple) {\n this.hide();\n }\n }\n\n private handleKeyDown = (e: KeyboardEvent) => {\n if (!this.open) return;\n\n const optionCount = this.filteredOptions.length;\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n // check for the next non-disabled option and focus\n let nextIndex = this.focusedIndex < optionCount - 1 ? this.focusedIndex + 1 : 0;\n while (this.filteredOptions[nextIndex].disabled) {\n nextIndex = ++nextIndex < optionCount ? nextIndex : 0;\n }\n this.focusedIndex = nextIndex;\n this.scrollToFocused();\n break;\n\n case 'ArrowUp':\n e.preventDefault();\n // check for the previous non-disabled option and focus\n let prevIndex = this.focusedIndex > 0 ? this.focusedIndex - 1 : optionCount - 1;\n while (this.filteredOptions[prevIndex].disabled) {\n prevIndex = --prevIndex >= 0 ? prevIndex : optionCount - 1;\n }\n this.focusedIndex = prevIndex;\n this.scrollToFocused();\n break;\n\n case 'Home':\n e.preventDefault();\n // check for the first non-disabled option and focus\n let firstIndex = 0;\n while (this.filteredOptions[firstIndex].disabled) {\n firstIndex++;\n if (firstIndex >= optionCount) {\n firstIndex = -1;\n break;\n }\n }\n this.focusedIndex = firstIndex;\n this.scrollToFocused();\n break;\n\n case 'End':\n e.preventDefault();\n // check for the last non-disabled option and focus\n let lastIndex = optionCount - 1;\n while (this.filteredOptions[lastIndex].disabled) {\n lastIndex--;\n if (lastIndex < 0) {\n lastIndex = -1;\n break;\n }\n }\n this.focusedIndex = lastIndex;\n this.scrollToFocused();\n break;\n\n case 'Enter':\n case ' ':\n e.preventDefault();\n if (this.focusedIndex >= 0 && this.focusedIndex < optionCount) {\n const option = this.filteredOptions[this.focusedIndex];\n if (!option || option.disabled) return;\n this.leOptionSelect.emit({\n value: option.value ?? option.label,\n option,\n });\n if (!this.multiple) {\n this.hide();\n }\n }\n break;\n\n case 'Escape':\n e.preventDefault();\n this.hide();\n break;\n\n case 'Tab':\n this.hide();\n break;\n }\n };\n\n private scrollToFocused() {\n if (!this.listEl || this.focusedIndex < 0) return;\n\n const focusedEl = this.listEl.querySelector(\n `[data-index=\"${this.focusedIndex}\"]`,\n ) as HTMLElement;\n if (focusedEl) {\n focusedEl.scrollIntoView({ block: 'nearest' });\n }\n }\n\n private handlePopoverOpen = () => {\n this.open = true;\n this.focusedIndex = this.getInitialFocusIndex();\n this.leDropdownOpen.emit();\n\n // Add keyboard listener\n document.addEventListener('keydown', this.handleKeyDown);\n };\n\n private handlePopoverClose = () => {\n this.open = false;\n this.focusedIndex = -1;\n this.leDropdownClose.emit();\n\n // Remove keyboard listener\n document.removeEventListener('keydown', this.handleKeyDown);\n };\n\n private getInitialFocusIndex(): number {\n // Focus on first selected option, or first option\n const selectableOptions = this.getSelectableOptions();\n const selectedIndex = selectableOptions.findIndex(opt => this.isSelected(opt));\n return selectedIndex >= 0 ? selectedIndex : 0;\n }\n\n /**\n * Opens the dropdown.\n */\n @Method()\n async show() {\n if (this.disabled) return;\n\n // Capture trigger width for matching dropdown width\n const trigger = this.el.querySelector('[slot=\"trigger\"]') as HTMLElement;\n if (trigger) {\n this.triggerWidth = trigger.offsetWidth;\n }\n\n await this.popoverEl?.show();\n }\n\n /**\n * Closes the dropdown.\n */\n @Method()\n async hide() {\n await this.popoverEl?.hide();\n }\n\n /**\n * Toggles the dropdown.\n */\n @Method()\n async toggle() {\n if (this.open) {\n await this.hide();\n } else {\n await this.show();\n }\n }\n\n private renderIcon(icon: string | undefined, className: string) {\n if (!icon) return null;\n\n if (icon.startsWith('http') || icon.startsWith('/')) {\n return <img class={className} src={icon} alt=\"\" />;\n }\n\n return <span class={className}>{icon}</span>;\n }\n\n private renderOption(option: LeOption, index: number) {\n const isSelected = this.isSelected(option);\n const isFocused = index === this.focusedIndex;\n const optionId = option.id || generateId();\n\n return (\n <div\n class={{\n 'dropdown-option': true,\n 'is-selected': isSelected,\n 'is-focused': isFocused,\n 'is-disabled': !!option.disabled,\n }}\n role=\"option\"\n id={optionId}\n aria-selected={isSelected ? 'true' : 'false'}\n aria-disabled={option.disabled ? 'true' : undefined}\n data-index={index}\n onClick={e => this.handleOptionClick(option, e)}\n onMouseEnter={() => {\n if (!option.disabled) {\n this.focusedIndex = index;\n }\n }}\n >\n {this.renderIcon(option.iconStart, 'option-icon-start')}\n <div class=\"option-content\">\n <span class=\"option-label\">{option.label}</span>\n {option.description && <span class=\"option-description\">{option.description}</span>}\n </div>\n {this.renderIcon(option.iconEnd, 'option-icon-end')}\n {(!this.multiple || this.showCheckboxes) && isSelected && (\n <span class=\"option-check\">\n <svg viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M13.78 4.22a.75.75 0 010 1.06l-7.25 7.25a.75.75 0 01-1.06 0L2.22 9.28a.75.75 0 011.06-1.06L6 10.94l6.72-6.72a.75.75 0 011.06 0z\" />\n </svg>\n </span>\n )}\n </div>\n );\n }\n\n private renderOptions() {\n if (this.filteredOptions.length === 0) {\n return <div class=\"dropdown-empty\">{this.emptyText}</div>;\n }\n\n // Group options if they have group property\n const grouped = new Map<string, LeOption[]>();\n const ungrouped: LeOption[] = [];\n\n this.filteredOptions.forEach(opt => {\n if (opt.group) {\n const group = grouped.get(opt.group) || [];\n group.push(opt);\n grouped.set(opt.group, group);\n } else {\n ungrouped.push(opt);\n }\n });\n\n // Build flat list with group headers for index tracking\n let globalIndex = 0;\n const elements: any[] = [];\n\n // Render ungrouped options first\n ungrouped.forEach(opt => {\n if (opt.separator === 'before') {\n elements.push(<div class=\"dropdown-separator\" role=\"separator\" />);\n }\n elements.push(this.renderOption(opt, globalIndex++));\n if (opt.separator === 'after') {\n elements.push(<div class=\"dropdown-separator\" role=\"separator\" />);\n }\n });\n\n // Render grouped options\n grouped.forEach((options, groupLabel) => {\n elements.push(\n <div class=\"dropdown-group-header\" role=\"presentation\">\n {groupLabel}\n </div>,\n );\n options.forEach(opt => {\n elements.push(this.renderOption(opt, globalIndex++));\n });\n });\n\n return elements;\n }\n\n render() {\n const dropdownWidth = this.width || (this.triggerWidth ? `${this.triggerWidth}px` : undefined);\n\n return (\n <Host>\n <le-popover\n ref={el => (this.popoverEl = el)}\n position=\"bottom\"\n align=\"start\"\n showClose={false}\n closeOnClickOutside={this.closeOnClickOutside}\n closeOnEscape={true}\n offset={4}\n width={dropdownWidth}\n minWidth=\"150px\"\n trigger-full-width={this.fullWidth}\n onLePopoverOpen={this.handlePopoverOpen}\n onLePopoverClose={this.handlePopoverClose}\n >\n <slot name=\"trigger\" slot=\"trigger\" />\n <slot name=\"header\" />\n <div\n class=\"dropdown-list\"\n role=\"listbox\"\n aria-multiselectable={this.multiple ? 'true' : undefined}\n ref={el => (this.listEl = el)}\n style={{ maxHeight: this.maxHeight }}\n >\n {this.renderOptions()}\n </div>\n </le-popover>\n </Host>\n );\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"le-dropdown-base.js","sourceRoot":"","sources":["../../../src/components/le-dropdown-base/le-dropdown-base.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Prop,\n State,\n Event,\n EventEmitter,\n Method,\n Element,\n Watch,\n h,\n Host,\n} from '@stencil/core';\nimport { LeOption, LeOptionValue, LeOptionSelectDetail } from '../../types/options';\nimport { generateId } from '../../utils/utils';\n\n/**\n * Internal dropdown base component that provides shared functionality\n * for select, combobox, and multiselect components.\n *\n * Wraps le-popover for positioning and provides:\n * - Option list rendering with groups\n * - Keyboard navigation (↑↓, Enter, Escape, Home/End)\n * - Option filtering support\n * - Single and multi-select modes\n *\n * @cmsInternal true\n * @cmsCategory System\n *\n * @slot trigger - The element that triggers the dropdown\n */\n@Component({\n tag: 'le-dropdown-base',\n styleUrl: 'le-dropdown-base.css',\n shadow: true,\n})\nexport class LeDropdownBase {\n @Element() el: HTMLElement;\n\n /**\n * The options to display in the dropdown.\n */\n @Prop() options: LeOption[] = [];\n\n /**\n * Current value(s) - single value or array for multiselect.\n */\n @Prop() value?: LeOptionValue | LeOptionValue[];\n\n /**\n * Whether multiple selection is allowed.\n */\n @Prop() multiple: boolean = false;\n\n /**\n * Whether the dropdown is open.\n */\n @Prop({ mutable: true, reflect: true }) open: boolean = false;\n\n /**\n * Whether the dropdown is disabled.\n */\n @Prop({ reflect: true }) disabled: boolean = false;\n\n /**\n * Filter function for options.\n * Return true to include the option.\n */\n @Prop() filterFn?: (option: LeOption, query: string) => boolean;\n\n /**\n * Current filter query string.\n */\n @Prop() filterQuery: string = '';\n\n /**\n * Placeholder text when no options match filter.\n */\n @Prop() emptyText: string = 'No options';\n\n /**\n * Whether to show checkboxes for multiselect mode.\n */\n @Prop() showCheckboxes: boolean = true;\n\n /**\n * Maximum height of the dropdown list.\n */\n @Prop() maxHeight: string = '300px';\n\n /**\n * Width of the dropdown. If not set, matches trigger width.\n */\n @Prop() width?: string;\n\n /**\n * Sets the dropdown to full width of the trigger.\n */\n @Prop() fullWidth: boolean = false;\n\n /**\n * Whether to close the dropdown when clicking outside.\n * (used to support combobox with input focus)\n */\n @Prop() closeOnClickOutside: boolean = true;\n\n /**\n * Emitted when an option is selected.\n */\n @Event() leOptionSelect: EventEmitter<LeOptionSelectDetail>;\n\n /**\n * Emitted when the dropdown opens.\n */\n @Event() leDropdownOpen: EventEmitter<void>;\n\n /**\n * Emitted when the dropdown closes.\n */\n @Event() leDropdownClose: EventEmitter<void>;\n\n @State() private focusedIndex: number = -1;\n @State() private filteredOptions: LeOption[] = [];\n\n private popoverEl?: HTMLLePopoverElement;\n private listEl?: HTMLElement;\n private triggerWidth: number = 0;\n\n @Watch('options')\n @Watch('filterQuery')\n handleOptionsChange() {\n this.updateFilteredOptions();\n }\n\n componentWillLoad() {\n this.updateFilteredOptions();\n }\n\n private updateFilteredOptions() {\n // Remember previously focused option\n const focusedOption = this.filteredOptions[this.focusedIndex];\n\n if (!this.filterQuery || !this.filterFn) {\n this.filteredOptions = this.options;\n } else {\n this.filteredOptions = this.options.filter(opt => this.filterFn!(opt, this.filterQuery));\n }\n\n // try to maintain focus on same option if still present\n if (focusedOption) {\n const newIndex = this.filteredOptions.indexOf(focusedOption);\n this.focusedIndex = newIndex >= 0 ? newIndex : this.getInitialFocusIndex();\n } else {\n this.focusedIndex = -1;\n }\n }\n\n private getSelectableOptions(): LeOption[] {\n return this.filteredOptions.filter(opt => !opt.disabled);\n }\n\n private isSelected(option: LeOption): boolean {\n const optValue = option.value ?? option.label;\n if (this.multiple && Array.isArray(this.value)) {\n setTimeout(() => {\n this.popoverEl?.updatePosition();\n }, 50);\n return this.value.includes(optValue);\n }\n return this.value === optValue;\n }\n\n private handleOptionClick(option: LeOption, e: MouseEvent) {\n e.preventDefault();\n e.stopPropagation();\n\n if (option.disabled) return;\n\n this.leOptionSelect.emit({\n value: option.value ?? option.label,\n option,\n });\n\n // Close dropdown for single select\n if (!this.multiple) {\n this.hide();\n }\n }\n\n private handleKeyDown = (e: KeyboardEvent) => {\n if (!this.open) return;\n\n const optionCount = this.filteredOptions.length;\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n // check for the next non-disabled option and focus\n let nextIndex = this.focusedIndex < optionCount - 1 ? this.focusedIndex + 1 : 0;\n while (this.filteredOptions[nextIndex].disabled) {\n nextIndex = ++nextIndex < optionCount ? nextIndex : 0;\n }\n this.focusedIndex = nextIndex;\n this.scrollToFocused();\n break;\n\n case 'ArrowUp':\n e.preventDefault();\n // check for the previous non-disabled option and focus\n let prevIndex = this.focusedIndex > 0 ? this.focusedIndex - 1 : optionCount - 1;\n while (this.filteredOptions[prevIndex].disabled) {\n prevIndex = --prevIndex >= 0 ? prevIndex : optionCount - 1;\n }\n this.focusedIndex = prevIndex;\n this.scrollToFocused();\n break;\n\n case 'Home':\n e.preventDefault();\n // check for the first non-disabled option and focus\n let firstIndex = 0;\n while (this.filteredOptions[firstIndex].disabled) {\n firstIndex++;\n if (firstIndex >= optionCount) {\n firstIndex = -1;\n break;\n }\n }\n this.focusedIndex = firstIndex;\n this.scrollToFocused();\n break;\n\n case 'End':\n e.preventDefault();\n // check for the last non-disabled option and focus\n let lastIndex = optionCount - 1;\n while (this.filteredOptions[lastIndex].disabled) {\n lastIndex--;\n if (lastIndex < 0) {\n lastIndex = -1;\n break;\n }\n }\n this.focusedIndex = lastIndex;\n this.scrollToFocused();\n break;\n\n case 'Enter':\n case ' ':\n e.preventDefault();\n if (this.focusedIndex >= 0 && this.focusedIndex < optionCount) {\n const option = this.filteredOptions[this.focusedIndex];\n if (!option || option.disabled) return;\n this.leOptionSelect.emit({\n value: option.value ?? option.label,\n option,\n });\n if (!this.multiple) {\n this.hide();\n }\n }\n break;\n\n case 'Escape':\n e.preventDefault();\n this.hide();\n break;\n\n case 'Tab':\n this.hide();\n break;\n }\n };\n\n private scrollToFocused() {\n if (!this.listEl || this.focusedIndex < 0) return;\n\n const focusedEl = this.listEl.querySelector(\n `[data-index=\"${this.focusedIndex}\"]`,\n ) as HTMLElement;\n if (focusedEl) {\n focusedEl.scrollIntoView({ block: 'nearest' });\n }\n }\n\n private handlePopoverOpen = () => {\n this.open = true;\n this.focusedIndex = this.getInitialFocusIndex();\n this.leDropdownOpen.emit();\n\n // Add keyboard listener\n document.addEventListener('keydown', this.handleKeyDown);\n };\n\n private handlePopoverClose = () => {\n this.open = false;\n this.focusedIndex = -1;\n this.leDropdownClose.emit();\n\n // Remove keyboard listener\n document.removeEventListener('keydown', this.handleKeyDown);\n };\n\n private getInitialFocusIndex(): number {\n // Focus on first selected option, or first option\n const selectableOptions = this.getSelectableOptions();\n const selectedIndex = selectableOptions.findIndex(opt => this.isSelected(opt));\n return selectedIndex >= 0 ? selectedIndex : 0;\n }\n\n /**\n * Opens the dropdown.\n */\n @Method()\n async show() {\n if (this.disabled) return;\n\n // Capture trigger width for matching dropdown width\n const trigger = this.el.querySelector('[slot=\"trigger\"]') as HTMLElement;\n if (trigger) {\n this.triggerWidth = trigger.offsetWidth;\n }\n\n await this.popoverEl?.show();\n }\n\n /**\n * Closes the dropdown.\n */\n @Method()\n async hide() {\n await this.popoverEl?.hide();\n }\n\n /**\n * Toggles the dropdown.\n */\n @Method()\n async toggle() {\n if (this.open) {\n await this.hide();\n } else {\n await this.show();\n }\n }\n\n private renderIcon(icon: string | undefined, className: string) {\n if (!icon) return null;\n\n if (icon.startsWith('http') || icon.startsWith('/')) {\n return <img class={className} src={icon} alt=\"\" />;\n }\n\n return <span class={className}>{icon}</span>;\n }\n\n private renderOption(option: LeOption, index: number) {\n const isSelected = this.isSelected(option);\n const isFocused = index === this.focusedIndex;\n const optionId = option.id || generateId();\n\n return (\n <div\n class={{\n 'dropdown-option': true,\n 'is-selected': isSelected,\n 'is-focused': isFocused,\n 'is-disabled': !!option.disabled,\n }}\n role=\"option\"\n id={optionId}\n aria-selected={isSelected ? 'true' : 'false'}\n aria-disabled={option.disabled ? 'true' : undefined}\n data-index={index}\n onClick={e => this.handleOptionClick(option, e)}\n onMouseEnter={() => {\n if (!option.disabled) {\n this.focusedIndex = index;\n }\n }}\n >\n {this.renderIcon(option.iconStart, 'option-icon-start')}\n <div class=\"option-content\">\n <span class=\"option-label\">{option.label}</span>\n {option.description && <span class=\"option-description\">{option.description}</span>}\n </div>\n {this.renderIcon(option.iconEnd, 'option-icon-end')}\n {(!this.multiple || this.showCheckboxes) && isSelected && (\n <span class=\"option-check\">\n <svg viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M13.78 4.22a.75.75 0 010 1.06l-7.25 7.25a.75.75 0 01-1.06 0L2.22 9.28a.75.75 0 011.06-1.06L6 10.94l6.72-6.72a.75.75 0 011.06 0z\" />\n </svg>\n </span>\n )}\n </div>\n );\n }\n\n private renderOptions() {\n if (this.filteredOptions.length === 0) {\n return <div class=\"dropdown-empty\">{this.emptyText}</div>;\n }\n\n // Group options if they have group property\n const grouped = new Map<string, LeOption[]>();\n const ungrouped: LeOption[] = [];\n\n this.filteredOptions.forEach(opt => {\n if (opt.group) {\n const group = grouped.get(opt.group) || [];\n group.push(opt);\n grouped.set(opt.group, group);\n } else {\n ungrouped.push(opt);\n }\n });\n\n // Build flat list with group headers for index tracking\n let globalIndex = 0;\n const elements: any[] = [];\n\n // Render ungrouped options first\n ungrouped.forEach(opt => {\n if (opt.separator === 'before') {\n elements.push(<div class=\"dropdown-separator\" role=\"separator\" />);\n }\n elements.push(this.renderOption(opt, globalIndex++));\n if (opt.separator === 'after') {\n elements.push(<div class=\"dropdown-separator\" role=\"separator\" />);\n }\n });\n\n // Render grouped options\n grouped.forEach((options, groupLabel) => {\n elements.push(\n <div class=\"dropdown-group-header\" role=\"presentation\">\n {groupLabel}\n </div>,\n );\n options.forEach(opt => {\n elements.push(this.renderOption(opt, globalIndex++));\n });\n });\n\n return elements;\n }\n\n render() {\n const dropdownWidth = this.width || (this.triggerWidth ? `${this.triggerWidth}px` : undefined);\n\n return (\n <Host>\n <le-popover\n ref={el => (this.popoverEl = el)}\n position=\"bottom\"\n align=\"start\"\n showClose={false}\n closeOnClickOutside={this.closeOnClickOutside}\n closeOnEscape={true}\n offset={4}\n width={dropdownWidth}\n minWidth=\"150px\"\n trigger-full-width={this.fullWidth}\n onLePopoverOpen={this.handlePopoverOpen}\n onLePopoverClose={this.handlePopoverClose}\n >\n <slot name=\"trigger\" slot=\"trigger\" />\n <slot name=\"header\" />\n <div\n class=\"dropdown-list\"\n role=\"listbox\"\n aria-multiselectable={this.multiple ? 'true' : undefined}\n ref={el => (this.listEl = el)}\n style={{ maxHeight: this.maxHeight }}\n >\n {this.renderOptions()}\n </div>\n </le-popover>\n </Host>\n );\n }\n}\n"]}
|
|
@@ -44,49 +44,26 @@ import { classnames } from "../../utils/utils";
|
|
|
44
44
|
* @cmsCategory Layout
|
|
45
45
|
*/
|
|
46
46
|
export class LeHeader {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
*/
|
|
68
|
-
shrinkOffset;
|
|
69
|
-
/**
|
|
70
|
-
* If true, expand the header when hovered
|
|
71
|
-
*/
|
|
72
|
-
expandOnHover = false;
|
|
73
|
-
/** Emits whenever scroll-driven state changes. */
|
|
74
|
-
leHeaderState;
|
|
75
|
-
/** Emits when the header shrinks/expands (only on change). */
|
|
76
|
-
leHeaderShrinkChange;
|
|
77
|
-
/** Emits when the header hides/shows (only on change). */
|
|
78
|
-
leHeaderVisibilityChange;
|
|
79
|
-
revealed = true;
|
|
80
|
-
shrunk = false;
|
|
81
|
-
placeholderHeight = null;
|
|
82
|
-
hoverActive = false;
|
|
83
|
-
disconnectModeObserver;
|
|
84
|
-
rafId = null;
|
|
85
|
-
measureRafId = null;
|
|
86
|
-
lastY = 0;
|
|
87
|
-
lastEmittedDirection = 'down';
|
|
88
|
-
headerEl;
|
|
89
|
-
shrinkSelectorEl;
|
|
47
|
+
constructor() {
|
|
48
|
+
/** Force static positioning (default). Ignored if `sticky` or `fixed` are true. */
|
|
49
|
+
this.isStatic = false;
|
|
50
|
+
/** Sticky positioning (in-flow). Ignored if `fixed` is true. */
|
|
51
|
+
this.sticky = false;
|
|
52
|
+
/** Fixed positioning (out-of-flow). Takes precedence over `sticky`/`static`. */
|
|
53
|
+
this.fixed = false;
|
|
54
|
+
/**
|
|
55
|
+
* If true, expand the header when hovered
|
|
56
|
+
*/
|
|
57
|
+
this.expandOnHover = false;
|
|
58
|
+
this.revealed = true;
|
|
59
|
+
this.shrunk = false;
|
|
60
|
+
this.placeholderHeight = null;
|
|
61
|
+
this.hoverActive = false;
|
|
62
|
+
this.rafId = null;
|
|
63
|
+
this.measureRafId = null;
|
|
64
|
+
this.lastY = 0;
|
|
65
|
+
this.lastEmittedDirection = 'down';
|
|
66
|
+
}
|
|
90
67
|
setShrunk(next, y) {
|
|
91
68
|
if (next === this.shrunk)
|
|
92
69
|
return;
|
|
@@ -268,7 +245,7 @@ export class LeHeader {
|
|
|
268
245
|
'is-hidden': !this.revealed,
|
|
269
246
|
'is-shrunk': this.shrunk,
|
|
270
247
|
});
|
|
271
|
-
return (h(Host, { key: '
|
|
248
|
+
return (h(Host, { key: 'ade87accbc122a0eb84422598646da357570d7d0', class: hostClass, onMouseEnter: () => {
|
|
272
249
|
if (!this.expandOnHover)
|
|
273
250
|
return;
|
|
274
251
|
this.hoverActive = true;
|
|
@@ -278,7 +255,7 @@ export class LeHeader {
|
|
|
278
255
|
return;
|
|
279
256
|
this.hoverActive = false;
|
|
280
257
|
this.scheduleUpdate(true);
|
|
281
|
-
} }, h("le-component", { key: '
|
|
258
|
+
} }, h("le-component", { key: 'dfe9a341d0f8ec702775ff68f2f7afb42bc878dc', component: "le-header" }, h("header", { key: '3239f73706082a6dfc5f7637f5ee8c793debd28f', class: "header", part: "header", role: "banner", ref: el => (this.headerEl = el) }, h("div", { key: '7e4b99e4b1a8bde81c340086d947598ff7bfd9a6', class: "inner", part: "inner" }, h("div", { key: 'b8fb2a8d42a07b35482de7553cd2f3bb608169d2', class: "row", part: "row" }, h("div", { key: '89cd5b7707ccb0626c0ecdf1c07494b184fdda1b', class: "start", part: "start" }, h("le-slot", { key: 'ee442e5f097bd3dcbc5b8376eb5eed024fe474b4', name: "start", label: "Start", description: "Logo / back button / nav", "allowed-components": "le-button,le-text,le-tag,le-box,le-stack" }, h("slot", { key: 'fbf43302c87d9e15cb6e848c1f2e7a30d37ee8f0', name: "start" }))), h("div", { key: '295165dbf2b29744d0687e426cd91665a320944f', class: "title", part: "title" }, h("le-slot", { key: '96aa340f844a15042a17c98610fd4da7e771f61a', name: "title", label: "Title", description: "Header title", type: "text", tag: "span" }, h("span", { key: 'f12cee8413e02e18d3a30a203f61165c4efce673', class: "title-slot", part: "title" }, h("slot", { key: 'dddb32fcf70ec8f16017626056668f325c701b99', name: "title" })))), h("div", { key: 'bc1c9d0deb4120d335de476211e41d86ea408621', class: "end", part: "end" }, h("le-slot", { key: '804482ee7e47f93147899cab94eedbdedc1ba63f', name: "end", label: "End", description: "Actions", "allowed-components": "le-button,le-text,le-tag,le-box,le-stack" }, h("slot", { key: '11bc31fd9875f1d38393606833328c31ac651ece', name: "end" })))), h("div", { key: '8351339444b373d88d9ac0cc4487b67a8c5267cd', class: "secondary", part: "secondary" }, h("le-slot", { key: 'ee99b61af146d91bfb0a84b1fac64ab8e077b85e', name: "", label: "Secondary", description: "Secondary row content", "allowed-components": "le-tabs,le-tab-bar,le-select,le-combobox,le-text,le-stack,le-box" }, h("slot", { key: '77fabff83384d721715bd0ba6efe129dad285875' }))))))));
|
|
282
259
|
}
|
|
283
260
|
static get is() { return "le-header"; }
|
|
284
261
|
static get encapsulation() { return "shadow"; }
|