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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"file":"le-header.js","mappings":"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","names":["LeHeader","__stencil_proxyCustomElement"],"sources":["src/components/le-header/le-header.css?tag=le-header&encapsulation=shadow","src/components/le-header/le-header.tsx"],"sourcesContent":[":host {\n display: block;\n width: 100%;\n\n /* Container styles */\n /* Offset from the top of the page (e.g. if page has top padding or another fixed bar). */\n --le-header-top-offset: 0;\n\n --le-header-bg: var(--le-color-surface);\n --le-header-max-width: var(--le-header-max-width, auto);\n --le-header-margin: 0 auto;\n --le-header-border: 1px solid var(--le-color-border);\n --le-header-border-radius: 0px;\n --le-header-shadow: var(--le-header-shadow, none);\n\n /* Content styles */\n --le-header-color: var(--le-color-text);\n --le-header-content-max-width: 800px;\n --le-header-padding-x: var(--le-space-md);\n --le-header-padding-y: var(--le-space-sm);\n --le-header-gap: var(--le-space-sm);\n\n --le-header-transition: var(--le-transition-normal);\n --le-header-z: 1000;\n}\n\n.header {\n width: 100%;\n max-width: var(--le-header-max-width);\n margin: var(--le-header-margin);\n background: var(--le-header-bg);\n color: var(--le-header-color);\n border-bottom: var(--le-header-border);\n border-radius: var(--le-header-border-radius);\n box-shadow: var(--le-header-shadow);\n}\n\n:host(.is-fixed) {\n position: fixed;\n top: var(--le-header-top-offset);\n left: 0;\n right: 0;\n z-index: var(--le-header-z);\n}\n\n:host(.is-sticky) {\n position: sticky;\n top: var(--le-header-top-offset);\n z-index: var(--le-header-z);\n}\n\n:host(.is-static) {\n position: relative;\n}\n\n.inner {\n max-width: var(--le-header-content-max-width);\n margin: 0 auto;\n padding: var(--le-header-padding-y) var(--le-header-padding-x);\n}\n\n.row {\n display: grid;\n grid-template-columns: minmax(0, 1fr) minmax(0, 2fr) minmax(0, 1fr);\n align-items: center;\n gap: var(--le-header-gap);\n transition:\n height var(--le-header-transition),\n padding var(--le-header-transition),\n transform var(--le-header-transition);\n}\n\n:host(.is-shrunk) .row {\n height: var(--le-header-height-condensed);\n}\n\n/* reveal behavior (sticky only) */\n:host(.is-sticky.is-hidden) {\n transform: translateY(-150%);\n transition: transform var(--le-header-transition);\n}\n\n:host(.is-sticky.is-revealed) {\n transform: translateY(0);\n transition: transform var(--le-header-transition);\n}\n\n.start,\n.title,\n.end {\n min-width: 0;\n display: flex;\n align-items: center;\n}\n\n.start {\n justify-content: flex-start;\n}\n\n.end {\n justify-content: flex-end;\n}\n\n.title {\n justify-content: center;\n text-align: center;\n}\n\n.title-slot ::slotted(*) {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.compact-title {\n font: inherit;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n","import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Listen,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport { classnames } from '../../utils/utils';\n\nexport type LeHeaderPosition = 'static' | 'sticky' | 'fixed';\n\n/**\n * A functional page header with scroll-aware behaviors.\n *\n * Features:\n * - Static (default), sticky, or fixed positioning\n * - Optional shrink-on-scroll behavior via `shrink-offset`\n * - Optional reveal-on-scroll-up via `reveal-on-scroll` (sticky only)\n *\n * Slots:\n * - `start`: left side (logo/back button)\n * - `title`: centered/primary title content\n * - `end`: right side actions\n * - default: extra content row (e.g., tabs/search) rendered below main row\n *\n * @slot start - Start area content\n * @slot title - Title content\n * @slot end - End area content\n * @slot - Optional secondary row content\n *\n * @cssprop --le-header-bg - Background (color/gradient)\n * @cssprop --le-header-color - Text color\n * @cssprop --le-header-border - Border (e.g. 1px solid ...)\n * @cssprop --le-header-shadow - Shadow/elevation\n * @cssprop --le-header-max-width - Inner content max width\n * @cssprop --le-header-padding-x - Horizontal padding\n * @cssprop --le-header-padding-y - Vertical padding\n * @cssprop --le-header-gap - Gap between zones\n * @cssprop --le-header-height - Base height (main row)\n * @cssprop --le-header-height-condensed - Condensed height when shrunk\n * @cssprop --le-header-transition - Transition timing\n * @cssprop --le-header-z - Z-index (fixed mode)\n *\n * @csspart header - The header container\n * @csspart inner - Inner max-width container\n * @csspart row - Main row\n * @csspart start - Start zone\n * @csspart title - Title zone\n * @csspart end - End zone\n * @csspart secondary - Secondary row\n *\n * @cmsEditable true\n * @cmsCategory Layout\n */\n@Component({\n tag: 'le-header',\n styleUrl: 'le-header.css',\n shadow: true,\n})\nexport class LeHeader {\n @Element() el: HTMLElement;\n\n /** Force static positioning (default). Ignored if `sticky` or `fixed` are true. */\n @Prop({ attribute: 'static', reflect: true }) isStatic: boolean = false;\n\n /** Sticky positioning (in-flow). Ignored if `fixed` is true. */\n @Prop({ reflect: true }) sticky: boolean = false;\n\n /** Fixed positioning (out-of-flow). Takes precedence over `sticky`/`static`. */\n @Prop({ reflect: true }) fixed: boolean = false;\n\n /**\n * Sticky-only reveal behavior (hide on scroll down, show on scroll up).\n * - missing/false: disabled\n * - true/empty attribute: enabled with default threshold (16)\n * - number (as string): enabled and used as threshold\n */\n @Prop({ attribute: 'reveal-on-scroll', reflect: true }) revealOnScroll?: string;\n\n /**\n * Shrink trigger.\n * - missing/0: disabled\n * - number (px): shrink when scrollY >= that value (but never before header height)\n * - css var name (e.g. --foo): shrink when scrollY >= resolved var value\n * - selector (e.g. .page-title): shrink when that element scrolls out of view above the viewport\n */\n @Prop({ attribute: 'shrink-offset', reflect: true }) shrinkOffset?: string;\n\n /**\n * If true, expand the header when hovered\n */\n @Prop({ attribute: 'expand-on-hover', reflect: true }) expandOnHover: boolean = false;\n\n /** Emits whenever scroll-driven state changes. */\n @Event() leHeaderState: EventEmitter<{\n y: number;\n direction: 'up' | 'down';\n revealed: boolean;\n shrunk: boolean;\n }>;\n\n /** Emits when the header shrinks/expands (only on change). */\n @Event({ bubbles: true, composed: true })\n leHeaderShrinkChange: EventEmitter<{ shrunk: boolean; y: number }>;\n\n /** Emits when the header hides/shows (only on change). */\n @Event({ bubbles: true, composed: true })\n leHeaderVisibilityChange: EventEmitter<{ visible: boolean; y: number }>;\n\n @State() private revealed: boolean = true;\n @State() private shrunk: boolean = false;\n @State() private placeholderHeight: number | null = null;\n @State() private hoverActive: boolean = false;\n\n private disconnectModeObserver?: () => void;\n private rafId: number | null = null;\n private measureRafId: number | null = null;\n private lastY: number = 0;\n private lastEmittedDirection: 'up' | 'down' = 'down';\n private headerEl?: HTMLElement;\n private shrinkSelectorEl?: Element | null;\n\n private setShrunk(next: boolean, y: number) {\n if (next === this.shrunk) return;\n this.shrunk = next;\n this.leHeaderShrinkChange.emit({ shrunk: this.shrunk, y });\n }\n\n componentDidLoad() {\n if (typeof window === 'undefined') return;\n this.lastY = window.scrollY || 0;\n this.scheduleMeasure(true);\n this.scheduleUpdate(true);\n }\n\n disconnectedCallback() {\n this.disconnectModeObserver?.();\n if (this.rafId != null) {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n\n if (this.measureRafId != null) {\n cancelAnimationFrame(this.measureRafId);\n this.measureRafId = null;\n }\n }\n\n @Watch('revealOnScroll')\n @Watch('shrinkOffset')\n @Watch('fixed')\n @Watch('sticky')\n @Watch('isStatic')\n protected onBehaviorPropsChange() {\n this.scheduleUpdate(true);\n this.scheduleMeasure(true);\n }\n\n @Listen('scroll', { target: 'window', passive: true })\n protected onWindowScroll() {\n this.scheduleUpdate();\n }\n\n @Listen('resize', { target: 'window', passive: true })\n protected onWindowResize() {\n this.scheduleMeasure(true);\n this.scheduleUpdate(true);\n }\n\n private getPosition(): LeHeaderPosition {\n if (this.fixed) return 'fixed';\n if (this.sticky) return 'sticky';\n return 'static';\n }\n\n private parseRevealThreshold(): number | null {\n // Only applies in sticky mode.\n if (!this.sticky || this.fixed) return null;\n if (this.revealOnScroll == null) return null;\n const raw = String(this.revealOnScroll).trim();\n if (raw === '' || raw === 'true') return 16;\n if (raw === 'false') return null;\n const n = Number(raw);\n return Number.isFinite(n) ? Math.max(0, n) : 16;\n }\n\n private resolveShrinkStartPx(): number | null {\n const raw = (this.shrinkOffset ?? '').trim();\n if (!raw || raw === '0') return null;\n\n // Numeric\n const numeric = Number(raw);\n if (Number.isFinite(numeric)) return Math.max(0, numeric);\n\n // CSS variable name\n if (raw.startsWith('--')) {\n const value = getComputedStyle(document.documentElement).getPropertyValue(raw).trim();\n const v = Number(value.replace('px', '').trim());\n return Number.isFinite(v) ? Math.max(0, v) : null;\n }\n\n // Selector\n try {\n const el = document.querySelector(raw);\n this.shrinkSelectorEl = el;\n return null;\n } catch {\n this.shrinkSelectorEl = null;\n return null;\n }\n }\n\n private scheduleUpdate(force: boolean = false) {\n if (this.rafId != null) {\n if (!force) return;\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n this.rafId = requestAnimationFrame(() => {\n this.rafId = null;\n this.updateFromScroll();\n });\n }\n\n private scheduleMeasure(force: boolean = false) {\n if (this.measureRafId != null && !force) return;\n this.measureRafId = requestAnimationFrame(() => {\n this.measureRafId = null;\n this.measurePlaceholderHeight();\n });\n }\n\n private measurePlaceholderHeight() {\n // Measure the rendered header height once (and on resize/mode change).\n // This intentionally ignores scroll/shrink behavior; it should reserve the full header height.\n if (!this.headerEl) return;\n\n const next = Math.ceil(this.headerEl.getBoundingClientRect().height);\n if (!Number.isFinite(next) || next <= 0) return;\n\n if (next !== this.placeholderHeight) {\n this.placeholderHeight = next;\n // Publish to global root so placeholders anywhere can read it.\n if (typeof document !== 'undefined') {\n document.documentElement.style.setProperty('--le-header-height', `${next}px`);\n }\n }\n }\n\n private updateFromScroll() {\n const y = typeof window !== 'undefined' ? window.scrollY || 0 : 0;\n const delta = y - this.lastY;\n\n const direction: 'up' | 'down' = delta < 0 ? 'up' : 'down';\n\n // Shrink behavior\n let computedShrunk = false;\n const headerHeight = Math.max(0, this.placeholderHeight ?? 0);\n const shrinkStartPx = typeof window !== 'undefined' ? this.resolveShrinkStartPx() : null;\n\n if (this.shrinkSelectorEl) {\n const rect = (this.shrinkSelectorEl as HTMLElement).getBoundingClientRect();\n computedShrunk = rect.bottom <= 0;\n } else if (shrinkStartPx != null) {\n const effectiveStart = Math.max(shrinkStartPx, headerHeight);\n computedShrunk = y >= effectiveStart;\n }\n\n // Hover override: when enabled and hovered, force expanded.\n const nextShrunk = this.expandOnHover && this.hoverActive ? false : computedShrunk;\n this.setShrunk(nextShrunk, y);\n\n // Reveal-on-scroll (sticky-only)\n const revealThreshold = this.parseRevealThreshold();\n if (revealThreshold != null) {\n // Always show the header near the top of the page.\n const topLock = Math.max(0, this.placeholderHeight ?? 0);\n if (y <= topLock) {\n if (!this.revealed) {\n this.revealed = true;\n this.leHeaderVisibilityChange.emit({ visible: true, y });\n }\n } else if (Math.abs(delta) >= revealThreshold) {\n const nextRevealed = direction === 'up' || y <= 0;\n if (nextRevealed !== this.revealed) {\n this.revealed = nextRevealed;\n this.leHeaderVisibilityChange.emit({ visible: this.revealed, y });\n }\n this.lastEmittedDirection = direction;\n }\n } else {\n if (!this.revealed) {\n this.revealed = true;\n this.leHeaderVisibilityChange.emit({ visible: true, y });\n }\n }\n\n this.lastY = y;\n\n this.leHeaderState.emit({\n y,\n direction: this.lastEmittedDirection,\n revealed: this.revealed,\n shrunk: this.shrunk,\n });\n }\n\n render() {\n const position = this.getPosition();\n\n const hostClass = classnames('le-header', {\n 'header-is-shrunk': this.shrunk,\n 'is-fixed': position === 'fixed',\n 'is-sticky': position === 'sticky',\n 'is-static': position === 'static',\n 'is-revealed': this.revealed,\n 'is-hidden': !this.revealed,\n 'is-shrunk': this.shrunk,\n });\n\n return (\n <Host\n class={hostClass}\n onMouseEnter={() => {\n if (!this.expandOnHover) return;\n this.hoverActive = true;\n this.scheduleUpdate(true);\n }}\n onMouseLeave={() => {\n if (!this.expandOnHover) return;\n this.hoverActive = false;\n this.scheduleUpdate(true);\n }}\n >\n <le-component component=\"le-header\">\n <header\n class=\"header\"\n part=\"header\"\n role=\"banner\"\n ref={el => (this.headerEl = el as HTMLElement)}\n >\n <div class=\"inner\" part=\"inner\">\n <div class=\"row\" part=\"row\">\n <div class=\"start\" part=\"start\">\n <le-slot\n name=\"start\"\n label=\"Start\"\n description=\"Logo / back button / nav\"\n allowed-components=\"le-button,le-text,le-tag,le-box,le-stack\"\n >\n <slot name=\"start\"></slot>\n </le-slot>\n </div>\n\n <div class=\"title\" part=\"title\">\n <le-slot\n name=\"title\"\n label=\"Title\"\n description=\"Header title\"\n type=\"text\"\n tag=\"span\"\n >\n <span class=\"title-slot\" part=\"title\">\n <slot name=\"title\"></slot>\n </span>\n </le-slot>\n </div>\n\n <div class=\"end\" part=\"end\">\n <le-slot\n name=\"end\"\n label=\"End\"\n description=\"Actions\"\n allowed-components=\"le-button,le-text,le-tag,le-box,le-stack\"\n >\n <slot name=\"end\"></slot>\n </le-slot>\n </div>\n </div>\n\n <div class=\"secondary\" part=\"secondary\">\n <le-slot\n name=\"\"\n label=\"Secondary\"\n description=\"Secondary row content\"\n allowed-components=\"le-tabs,le-tab-bar,le-select,le-combobox,le-text,le-stack,le-box\"\n >\n <slot></slot>\n </le-slot>\n </div>\n </div>\n </header>\n </le-component>\n </Host>\n );\n }\n}\n"],"version":3}
|
|
1
|
+
{"file":"le-header.js","mappings":"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","names":["LeHeader","__stencil_proxyCustomElement"],"sources":["src/components/le-header/le-header.css?tag=le-header&encapsulation=shadow","src/components/le-header/le-header.tsx"],"sourcesContent":[":host {\n display: block;\n width: 100%;\n\n /* Container styles */\n /* Offset from the top of the page (e.g. if page has top padding or another fixed bar). */\n --le-header-top-offset: 0;\n\n --le-header-bg: var(--le-color-surface);\n --le-header-max-width: var(--le-header-max-width, auto);\n --le-header-margin: 0 auto;\n --le-header-border: 1px solid var(--le-color-border);\n --le-header-border-radius: 0px;\n --le-header-shadow: var(--le-header-shadow, none);\n\n /* Content styles */\n --le-header-color: var(--le-color-text);\n --le-header-content-max-width: 800px;\n --le-header-padding-x: var(--le-space-md);\n --le-header-padding-y: var(--le-space-sm);\n --le-header-gap: var(--le-space-sm);\n\n --le-header-transition: var(--le-transition-normal);\n --le-header-z: 1000;\n}\n\n.header {\n width: 100%;\n max-width: var(--le-header-max-width);\n margin: var(--le-header-margin);\n background: var(--le-header-bg);\n color: var(--le-header-color);\n border-bottom: var(--le-header-border);\n border-radius: var(--le-header-border-radius);\n box-shadow: var(--le-header-shadow);\n}\n\n:host(.is-fixed) {\n position: fixed;\n top: var(--le-header-top-offset);\n left: 0;\n right: 0;\n z-index: var(--le-header-z);\n}\n\n:host(.is-sticky) {\n position: sticky;\n top: var(--le-header-top-offset);\n z-index: var(--le-header-z);\n}\n\n:host(.is-static) {\n position: relative;\n}\n\n.inner {\n max-width: var(--le-header-content-max-width);\n margin: 0 auto;\n padding: var(--le-header-padding-y) var(--le-header-padding-x);\n}\n\n.row {\n display: grid;\n grid-template-columns: minmax(0, 1fr) minmax(0, 2fr) minmax(0, 1fr);\n align-items: center;\n gap: var(--le-header-gap);\n transition:\n height var(--le-header-transition),\n padding var(--le-header-transition),\n transform var(--le-header-transition);\n}\n\n:host(.is-shrunk) .row {\n height: var(--le-header-height-condensed);\n}\n\n/* reveal behavior (sticky only) */\n:host(.is-sticky.is-hidden) {\n transform: translateY(-150%);\n transition: transform var(--le-header-transition);\n}\n\n:host(.is-sticky.is-revealed) {\n transform: translateY(0);\n transition: transform var(--le-header-transition);\n}\n\n.start,\n.title,\n.end {\n min-width: 0;\n display: flex;\n align-items: center;\n}\n\n.start {\n justify-content: flex-start;\n}\n\n.end {\n justify-content: flex-end;\n}\n\n.title {\n justify-content: center;\n text-align: center;\n}\n\n.title-slot ::slotted(*) {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.compact-title {\n font: inherit;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n","import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Listen,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport { classnames } from '../../utils/utils';\n\nexport type LeHeaderPosition = 'static' | 'sticky' | 'fixed';\n\n/**\n * A functional page header with scroll-aware behaviors.\n *\n * Features:\n * - Static (default), sticky, or fixed positioning\n * - Optional shrink-on-scroll behavior via `shrink-offset`\n * - Optional reveal-on-scroll-up via `reveal-on-scroll` (sticky only)\n *\n * Slots:\n * - `start`: left side (logo/back button)\n * - `title`: centered/primary title content\n * - `end`: right side actions\n * - default: extra content row (e.g., tabs/search) rendered below main row\n *\n * @slot start - Start area content\n * @slot title - Title content\n * @slot end - End area content\n * @slot - Optional secondary row content\n *\n * @cssprop --le-header-bg - Background (color/gradient)\n * @cssprop --le-header-color - Text color\n * @cssprop --le-header-border - Border (e.g. 1px solid ...)\n * @cssprop --le-header-shadow - Shadow/elevation\n * @cssprop --le-header-max-width - Inner content max width\n * @cssprop --le-header-padding-x - Horizontal padding\n * @cssprop --le-header-padding-y - Vertical padding\n * @cssprop --le-header-gap - Gap between zones\n * @cssprop --le-header-height - Base height (main row)\n * @cssprop --le-header-height-condensed - Condensed height when shrunk\n * @cssprop --le-header-transition - Transition timing\n * @cssprop --le-header-z - Z-index (fixed mode)\n *\n * @csspart header - The header container\n * @csspart inner - Inner max-width container\n * @csspart row - Main row\n * @csspart start - Start zone\n * @csspart title - Title zone\n * @csspart end - End zone\n * @csspart secondary - Secondary row\n *\n * @cmsEditable true\n * @cmsCategory Layout\n */\n@Component({\n tag: 'le-header',\n styleUrl: 'le-header.css',\n shadow: true,\n})\nexport class LeHeader {\n @Element() el: HTMLElement;\n\n /** Force static positioning (default). Ignored if `sticky` or `fixed` are true. */\n @Prop({ attribute: 'static', reflect: true }) isStatic: boolean = false;\n\n /** Sticky positioning (in-flow). Ignored if `fixed` is true. */\n @Prop({ reflect: true }) sticky: boolean = false;\n\n /** Fixed positioning (out-of-flow). Takes precedence over `sticky`/`static`. */\n @Prop({ reflect: true }) fixed: boolean = false;\n\n /**\n * Sticky-only reveal behavior (hide on scroll down, show on scroll up).\n * - missing/false: disabled\n * - true/empty attribute: enabled with default threshold (16)\n * - number (as string): enabled and used as threshold\n */\n @Prop({ attribute: 'reveal-on-scroll', reflect: true }) revealOnScroll?: string;\n\n /**\n * Shrink trigger.\n * - missing/0: disabled\n * - number (px): shrink when scrollY >= that value (but never before header height)\n * - css var name (e.g. --foo): shrink when scrollY >= resolved var value\n * - selector (e.g. .page-title): shrink when that element scrolls out of view above the viewport\n */\n @Prop({ attribute: 'shrink-offset', reflect: true }) shrinkOffset?: string;\n\n /**\n * If true, expand the header when hovered\n */\n @Prop({ attribute: 'expand-on-hover', reflect: true }) expandOnHover: boolean = false;\n\n /** Emits whenever scroll-driven state changes. */\n @Event() leHeaderState: EventEmitter<{\n y: number;\n direction: 'up' | 'down';\n revealed: boolean;\n shrunk: boolean;\n }>;\n\n /** Emits when the header shrinks/expands (only on change). */\n @Event({ bubbles: true, composed: true })\n leHeaderShrinkChange: EventEmitter<{ shrunk: boolean; y: number }>;\n\n /** Emits when the header hides/shows (only on change). */\n @Event({ bubbles: true, composed: true })\n leHeaderVisibilityChange: EventEmitter<{ visible: boolean; y: number }>;\n\n @State() private revealed: boolean = true;\n @State() private shrunk: boolean = false;\n @State() private placeholderHeight: number | null = null;\n @State() private hoverActive: boolean = false;\n\n private disconnectModeObserver?: () => void;\n private rafId: number | null = null;\n private measureRafId: number | null = null;\n private lastY: number = 0;\n private lastEmittedDirection: 'up' | 'down' = 'down';\n private headerEl?: HTMLElement;\n private shrinkSelectorEl?: Element | null;\n\n private setShrunk(next: boolean, y: number) {\n if (next === this.shrunk) return;\n this.shrunk = next;\n this.leHeaderShrinkChange.emit({ shrunk: this.shrunk, y });\n }\n\n componentDidLoad() {\n if (typeof window === 'undefined') return;\n this.lastY = window.scrollY || 0;\n this.scheduleMeasure(true);\n this.scheduleUpdate(true);\n }\n\n disconnectedCallback() {\n this.disconnectModeObserver?.();\n if (this.rafId != null) {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n\n if (this.measureRafId != null) {\n cancelAnimationFrame(this.measureRafId);\n this.measureRafId = null;\n }\n }\n\n @Watch('revealOnScroll')\n @Watch('shrinkOffset')\n @Watch('fixed')\n @Watch('sticky')\n @Watch('isStatic')\n protected onBehaviorPropsChange() {\n this.scheduleUpdate(true);\n this.scheduleMeasure(true);\n }\n\n @Listen('scroll', { target: 'window', passive: true })\n protected onWindowScroll() {\n this.scheduleUpdate();\n }\n\n @Listen('resize', { target: 'window', passive: true })\n protected onWindowResize() {\n this.scheduleMeasure(true);\n this.scheduleUpdate(true);\n }\n\n private getPosition(): LeHeaderPosition {\n if (this.fixed) return 'fixed';\n if (this.sticky) return 'sticky';\n return 'static';\n }\n\n private parseRevealThreshold(): number | null {\n // Only applies in sticky mode.\n if (!this.sticky || this.fixed) return null;\n if (this.revealOnScroll == null) return null;\n const raw = String(this.revealOnScroll).trim();\n if (raw === '' || raw === 'true') return 16;\n if (raw === 'false') return null;\n const n = Number(raw);\n return Number.isFinite(n) ? Math.max(0, n) : 16;\n }\n\n private resolveShrinkStartPx(): number | null {\n const raw = (this.shrinkOffset ?? '').trim();\n if (!raw || raw === '0') return null;\n\n // Numeric\n const numeric = Number(raw);\n if (Number.isFinite(numeric)) return Math.max(0, numeric);\n\n // CSS variable name\n if (raw.startsWith('--')) {\n const value = getComputedStyle(document.documentElement).getPropertyValue(raw).trim();\n const v = Number(value.replace('px', '').trim());\n return Number.isFinite(v) ? Math.max(0, v) : null;\n }\n\n // Selector\n try {\n const el = document.querySelector(raw);\n this.shrinkSelectorEl = el;\n return null;\n } catch {\n this.shrinkSelectorEl = null;\n return null;\n }\n }\n\n private scheduleUpdate(force: boolean = false) {\n if (this.rafId != null) {\n if (!force) return;\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n this.rafId = requestAnimationFrame(() => {\n this.rafId = null;\n this.updateFromScroll();\n });\n }\n\n private scheduleMeasure(force: boolean = false) {\n if (this.measureRafId != null && !force) return;\n this.measureRafId = requestAnimationFrame(() => {\n this.measureRafId = null;\n this.measurePlaceholderHeight();\n });\n }\n\n private measurePlaceholderHeight() {\n // Measure the rendered header height once (and on resize/mode change).\n // This intentionally ignores scroll/shrink behavior; it should reserve the full header height.\n if (!this.headerEl) return;\n\n const next = Math.ceil(this.headerEl.getBoundingClientRect().height);\n if (!Number.isFinite(next) || next <= 0) return;\n\n if (next !== this.placeholderHeight) {\n this.placeholderHeight = next;\n // Publish to global root so placeholders anywhere can read it.\n if (typeof document !== 'undefined') {\n document.documentElement.style.setProperty('--le-header-height', `${next}px`);\n }\n }\n }\n\n private updateFromScroll() {\n const y = typeof window !== 'undefined' ? window.scrollY || 0 : 0;\n const delta = y - this.lastY;\n\n const direction: 'up' | 'down' = delta < 0 ? 'up' : 'down';\n\n // Shrink behavior\n let computedShrunk = false;\n const headerHeight = Math.max(0, this.placeholderHeight ?? 0);\n const shrinkStartPx = typeof window !== 'undefined' ? this.resolveShrinkStartPx() : null;\n\n if (this.shrinkSelectorEl) {\n const rect = (this.shrinkSelectorEl as HTMLElement).getBoundingClientRect();\n computedShrunk = rect.bottom <= 0;\n } else if (shrinkStartPx != null) {\n const effectiveStart = Math.max(shrinkStartPx, headerHeight);\n computedShrunk = y >= effectiveStart;\n }\n\n // Hover override: when enabled and hovered, force expanded.\n const nextShrunk = this.expandOnHover && this.hoverActive ? false : computedShrunk;\n this.setShrunk(nextShrunk, y);\n\n // Reveal-on-scroll (sticky-only)\n const revealThreshold = this.parseRevealThreshold();\n if (revealThreshold != null) {\n // Always show the header near the top of the page.\n const topLock = Math.max(0, this.placeholderHeight ?? 0);\n if (y <= topLock) {\n if (!this.revealed) {\n this.revealed = true;\n this.leHeaderVisibilityChange.emit({ visible: true, y });\n }\n } else if (Math.abs(delta) >= revealThreshold) {\n const nextRevealed = direction === 'up' || y <= 0;\n if (nextRevealed !== this.revealed) {\n this.revealed = nextRevealed;\n this.leHeaderVisibilityChange.emit({ visible: this.revealed, y });\n }\n this.lastEmittedDirection = direction;\n }\n } else {\n if (!this.revealed) {\n this.revealed = true;\n this.leHeaderVisibilityChange.emit({ visible: true, y });\n }\n }\n\n this.lastY = y;\n\n this.leHeaderState.emit({\n y,\n direction: this.lastEmittedDirection,\n revealed: this.revealed,\n shrunk: this.shrunk,\n });\n }\n\n render() {\n const position = this.getPosition();\n\n const hostClass = classnames('le-header', {\n 'header-is-shrunk': this.shrunk,\n 'is-fixed': position === 'fixed',\n 'is-sticky': position === 'sticky',\n 'is-static': position === 'static',\n 'is-revealed': this.revealed,\n 'is-hidden': !this.revealed,\n 'is-shrunk': this.shrunk,\n });\n\n return (\n <Host\n class={hostClass}\n onMouseEnter={() => {\n if (!this.expandOnHover) return;\n this.hoverActive = true;\n this.scheduleUpdate(true);\n }}\n onMouseLeave={() => {\n if (!this.expandOnHover) return;\n this.hoverActive = false;\n this.scheduleUpdate(true);\n }}\n >\n <le-component component=\"le-header\">\n <header\n class=\"header\"\n part=\"header\"\n role=\"banner\"\n ref={el => (this.headerEl = el as HTMLElement)}\n >\n <div class=\"inner\" part=\"inner\">\n <div class=\"row\" part=\"row\">\n <div class=\"start\" part=\"start\">\n <le-slot\n name=\"start\"\n label=\"Start\"\n description=\"Logo / back button / nav\"\n allowed-components=\"le-button,le-text,le-tag,le-box,le-stack\"\n >\n <slot name=\"start\"></slot>\n </le-slot>\n </div>\n\n <div class=\"title\" part=\"title\">\n <le-slot\n name=\"title\"\n label=\"Title\"\n description=\"Header title\"\n type=\"text\"\n tag=\"span\"\n >\n <span class=\"title-slot\" part=\"title\">\n <slot name=\"title\"></slot>\n </span>\n </le-slot>\n </div>\n\n <div class=\"end\" part=\"end\">\n <le-slot\n name=\"end\"\n label=\"End\"\n description=\"Actions\"\n allowed-components=\"le-button,le-text,le-tag,le-box,le-stack\"\n >\n <slot name=\"end\"></slot>\n </le-slot>\n </div>\n </div>\n\n <div class=\"secondary\" part=\"secondary\">\n <le-slot\n name=\"\"\n label=\"Secondary\"\n description=\"Secondary row content\"\n allowed-components=\"le-tabs,le-tab-bar,le-select,le-combobox,le-text,le-stack,le-box\"\n >\n <slot></slot>\n </le-slot>\n </div>\n </div>\n </header>\n </le-component>\n </Host>\n );\n }\n}\n"],"version":3}
|
|
@@ -43,19 +43,18 @@ const LeIcon = /*@__PURE__*/ proxyCustomElement(class LeIcon extends HTMLElement
|
|
|
43
43
|
this.__registerHost();
|
|
44
44
|
}
|
|
45
45
|
this.__attachShadow();
|
|
46
|
+
/**
|
|
47
|
+
* Name of the icon to display. Corresponds to a JSON file in the assets folder.
|
|
48
|
+
* For example, "search" will load the "search.json" file.
|
|
49
|
+
*/
|
|
50
|
+
this.name = null;
|
|
51
|
+
/**
|
|
52
|
+
* Size of the icon in pixels. Default is 16.
|
|
53
|
+
*/
|
|
54
|
+
this.size = 16;
|
|
55
|
+
this.iconData = null;
|
|
56
|
+
this.visible = false;
|
|
46
57
|
}
|
|
47
|
-
get el() { return this; }
|
|
48
|
-
/**
|
|
49
|
-
* Name of the icon to display. Corresponds to a JSON file in the assets folder.
|
|
50
|
-
* For example, "search" will load the "search.json" file.
|
|
51
|
-
*/
|
|
52
|
-
name = null;
|
|
53
|
-
/**
|
|
54
|
-
* Size of the icon in pixels. Default is 16.
|
|
55
|
-
*/
|
|
56
|
-
size = 16;
|
|
57
|
-
iconData = null;
|
|
58
|
-
visible = false;
|
|
59
58
|
async loadIconData() {
|
|
60
59
|
const { name, visible } = this;
|
|
61
60
|
if (!Build.isBrowser || !name || !visible) {
|
|
@@ -63,7 +62,6 @@ const LeIcon = /*@__PURE__*/ proxyCustomElement(class LeIcon extends HTMLElement
|
|
|
63
62
|
}
|
|
64
63
|
this.iconData = await fetchIcon({ name });
|
|
65
64
|
}
|
|
66
|
-
intersectionObserver;
|
|
67
65
|
connectedCallback() {
|
|
68
66
|
this.waitUntilVisible(() => {
|
|
69
67
|
this.visible = true;
|
|
@@ -115,14 +113,15 @@ const LeIcon = /*@__PURE__*/ proxyCustomElement(class LeIcon extends HTMLElement
|
|
|
115
113
|
return svgElements;
|
|
116
114
|
}
|
|
117
115
|
render() {
|
|
118
|
-
return (h("svg", { key: '
|
|
116
|
+
return (h("svg", { key: '15ae743268ab99a174f669436778c2305f4d65df', xmlns: "http://www.w3.org/2000/svg", fill: "currentColor", height: this.size || 16, width: this.size || 16, viewBox: this.iconData?.viewBox || `0 0 ${this.size || 16} ${this.size || 16}` }, this.renderSVGContent(this.iconData?.children)));
|
|
119
117
|
}
|
|
120
118
|
static get assetsDirs() { return ["assets/icons"]; }
|
|
119
|
+
get el() { return this; }
|
|
121
120
|
static get watchers() { return {
|
|
122
121
|
"name": ["loadIconData"]
|
|
123
122
|
}; }
|
|
124
123
|
static get style() { return leIconCss(); }
|
|
125
|
-
}, [
|
|
124
|
+
}, [257, "le-icon", {
|
|
126
125
|
"name": [1],
|
|
127
126
|
"size": [2],
|
|
128
127
|
"iconData": [32],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"file":"le-icon2.js","mappings":";;;AAAA,MAAM,SAAS,GAAG,MAAM,CAAC,uNAAuN,CAAC;;ACOjP,MAAM,SAAS,GAAwB,EAAE;AACzC,MAAM,YAAY,GAAiC,EAAE;AAErD;;;AAGG;AACH,SAAS,UAAU,CAAC,IAAY,EAAA;AAC9B,IAAA,MAAM,QAAQ,GAAG,gBAAgB,EAAE;IACnC,IAAI,QAAQ,EAAE;;QAEZ,MAAM,cAAc,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,QAAQ;AAChF,QAAA,OAAO,CAAG,EAAA,cAAc,CAAU,OAAA,EAAA,IAAI,OAAO;;;AAG/C,IAAA,OAAO,YAAY,CAAC,CAAA,eAAA,EAAkB,IAAI,CAAA,KAAA,CAAO,CAAC;AACpD;AAEA,eAAe,SAAS,CAAC,EAAE,IAAI,EAAE,EAAA;AAC/B,IAAA,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE;AACnB,QAAA,OAAO,SAAS,CAAC,IAAI,CAAC;;AAExB,IAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE;AACvB,QAAA,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC;AAChC,QAAA,YAAY,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO;aAC/B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE;aACxB,KAAK,CAAC,MAAK;YACV,OAAO,CAAC,KAAK,CAAC,CAAA,MAAA,EAAS,IAAI,CAA+B,4BAAA,EAAA,OAAO,CAAE,CAAA,CAAC;AACpE,YAAA,OAAO,EAAE;AACX,SAAC,CAAC;;AAGN,IAAA,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC;AACrC,IAAA,SAAS,CAAC,IAAI,CAAC,GAAG,IAAI;AAEtB,IAAA,OAAO,IAAI;AACb;MAQa,MAAM,iBAAAA,kBAAA,CAAA,MAAA,MAAA,SAAA,WAAA,CAAA
|
|
1
|
+
{"file":"le-icon2.js","mappings":";;;AAAA,MAAM,SAAS,GAAG,MAAM,CAAC,uNAAuN,CAAC;;ACOjP,MAAM,SAAS,GAAwB,EAAE;AACzC,MAAM,YAAY,GAAiC,EAAE;AAErD;;;AAGG;AACH,SAAS,UAAU,CAAC,IAAY,EAAA;AAC9B,IAAA,MAAM,QAAQ,GAAG,gBAAgB,EAAE;IACnC,IAAI,QAAQ,EAAE;;QAEZ,MAAM,cAAc,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,QAAQ;AAChF,QAAA,OAAO,CAAG,EAAA,cAAc,CAAU,OAAA,EAAA,IAAI,OAAO;;;AAG/C,IAAA,OAAO,YAAY,CAAC,CAAA,eAAA,EAAkB,IAAI,CAAA,KAAA,CAAO,CAAC;AACpD;AAEA,eAAe,SAAS,CAAC,EAAE,IAAI,EAAE,EAAA;AAC/B,IAAA,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE;AACnB,QAAA,OAAO,SAAS,CAAC,IAAI,CAAC;;AAExB,IAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE;AACvB,QAAA,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC;AAChC,QAAA,YAAY,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO;aAC/B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE;aACxB,KAAK,CAAC,MAAK;YACV,OAAO,CAAC,KAAK,CAAC,CAAA,MAAA,EAAS,IAAI,CAA+B,4BAAA,EAAA,OAAO,CAAE,CAAA,CAAC;AACpE,YAAA,OAAO,EAAE;AACX,SAAC,CAAC;;AAGN,IAAA,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC;AACrC,IAAA,SAAS,CAAC,IAAI,CAAC,GAAG,IAAI;AAEtB,IAAA,OAAO,IAAI;AACb;MAQa,MAAM,iBAAAA,kBAAA,CAAA,MAAA,MAAA,SAAA,WAAA,CAAA;AANnB,IAAA,WAAA,CAAA,YAAA,EAAA;;;;;;AASE;;;AAGG;AACK,QAAA,IAAI,CAAA,IAAA,GAAW,IAAI;AAE3B;;AAEG;AACK,QAAA,IAAI,CAAA,IAAA,GAAW,EAAE;AAER,QAAA,IAAQ,CAAA,QAAA,GAAQ,IAAI;AAEpB,QAAA,IAAO,CAAA,OAAA,GAAG,KAAK;AA2FjC;AAzFwB,IAAA,MAAM,YAAY,GAAA;AACvC,QAAA,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;QAE9B,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE;YACzC;;QAGF,IAAI,CAAC,QAAQ,GAAG,MAAM,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC;;IAK3C,iBAAiB,GAAA;AACf,QAAA,IAAI,CAAC,gBAAgB,CAAC,MAAK;AACzB,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI;YACnB,IAAI,CAAC,YAAY,EAAE;AACrB,SAAC,CAAC;;IAGJ,oBAAoB,GAAA;AAClB,QAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE;AAC7B,YAAA,IAAI,CAAC,oBAAoB,CAAC,UAAU,EAAE;AACtC,YAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI;;;AAIpC,IAAA,MAAM,iBAAiB,GAAA;QACrB,IAAI,CAAC,YAAY,EAAE;;AAGb,IAAA,gBAAgB,CAAC,QAAoB,EAAA;QAC3C,IACE,CAAC,KAAK,CAAC,SAAS;YAChB,OAAO,MAAM,KAAK,WAAW;AAC7B,YAAA,CAAE,MAAc,CAAC,oBAAoB,EACrC;AACA,YAAA,QAAQ,EAAE;YACV;;QAGF,IAAI,CAAC,oBAAoB,GAAG,IAAI,oBAAoB,CAClD,OAAO,IAAG;AACR,YAAA,OAAO,CAAC,OAAO,CAAC,KAAK,IAAG;AACtB,gBAAA,IAAI,KAAK,CAAC,cAAc,EAAE;AACxB,oBAAA,IAAI,CAAC,oBAAoB,CAAC,UAAU,EAAE;AACtC,oBAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI;AAChC,oBAAA,QAAQ,EAAE;;AAEd,aAAC,CAAC;AACJ,SAAC,EACD,EAAE,UAAU,EAAE,MAAM,EAAE,CACvB;QAED,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;;AAG5C;;;;;AAKG;AACK,IAAA,gBAAgB,CAAC,QAAgB,EAAA;QACvC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;AACtC,YAAA,OAAO,IAAI;;AAGb,QAAA,MAAM,aAAa,GAAG,IAAI,IAAG;YAC3B,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,GAAG,IAAI;YACxC,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC;AACrE,SAAC;QAED,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC;AAC/C,QAAA,OAAO,WAAW;;IAGpB,MAAM,GAAA;AACJ,QAAA,QACE,CAAA,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EACE,KAAK,EAAC,4BAA4B,EAClC,IAAI,EAAC,cAAc,EACnB,MAAM,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE,EACvB,KAAK,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE,EACtB,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,IAAI,CAAA,IAAA,EAAO,IAAI,CAAC,IAAI,IAAI,EAAE,CAAA,CAAA,EAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAE,CAAA,EAAA,EAE7E,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAC3C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","names":["__stencil_proxyCustomElement"],"sources":["src/components/le-icon/le-icon.css?tag=le-icon&encapsulation=shadow","src/components/le-icon/le-icon.tsx"],"sourcesContent":[":host {\n display: inline-block;\n\n width: var(--le-icon-size, var(--le-size-4));\n height: var(--le-icon-size, var(--le-size-4));\n\n color: var(--le-icon-color, var(--le-color-text-primary));\n}\n\n:host svg {\n display: block;\n fill: currentColor;\n}\n","/**\n * Based on the script from Paul Andreson's article:\n * https://paulcpederson.com/articles/stencil-icons/\n */\nimport { Build, Component, Element, getAssetPath, h, Prop, State, Watch } from '@stencil/core';\nimport { getAssetBasePath } from '../../global/app';\n\nconst iconCache: Record<string, any> = {};\nconst requestCache: Record<string, Promise<any>> = {};\n\n/**\n * Get the URL for loading an icon.\n * Uses configurable assetBasePath if set, otherwise falls back to Stencil's getAssetPath.\n */\nfunction getIconUrl(name: string): string {\n const basePath = getAssetBasePath();\n if (basePath) {\n // Use configured base path - normalize by removing trailing slash\n const normalizedBase = basePath.endsWith('/') ? basePath.slice(0, -1) : basePath;\n return `${normalizedBase}/icons/${name}.json`;\n }\n // Fall back to Stencil's getAssetPath for local development\n return getAssetPath(`./assets/icons/${name}.json`);\n}\n\nasync function fetchIcon({ name }): Promise<string> {\n if (iconCache[name]) {\n return iconCache[name];\n }\n if (!requestCache[name]) {\n const iconUrl = getIconUrl(name);\n requestCache[name] = fetch(iconUrl)\n .then(resp => resp.json())\n .catch(() => {\n console.error(`Icon \"${name}\" could not be loaded from: ${iconUrl}`);\n return '';\n });\n }\n\n const path = await requestCache[name];\n iconCache[name] = path;\n\n return path;\n}\n\n@Component({\n tag: 'le-icon',\n styleUrl: 'le-icon.css',\n shadow: true,\n assetsDirs: ['assets/icons'],\n})\nexport class LeIcon {\n @Element() el: HTMLElement;\n\n /**\n * Name of the icon to display. Corresponds to a JSON file in the assets folder.\n * For example, \"search\" will load the \"search.json\" file.\n */\n @Prop() name: string = null;\n\n /**\n * Size of the icon in pixels. Default is 16.\n */\n @Prop() size: number = 16;\n\n @State() private iconData: any = null;\n\n @State() private visible = false;\n\n @Watch('name') private async loadIconData(): Promise<void> {\n const { name, visible } = this;\n\n if (!Build.isBrowser || !name || !visible) {\n return;\n }\n\n this.iconData = await fetchIcon({ name });\n }\n\n private intersectionObserver: IntersectionObserver;\n\n connectedCallback(): void {\n this.waitUntilVisible(() => {\n this.visible = true;\n this.loadIconData();\n });\n }\n\n disconnectedCallback(): void {\n if (this.intersectionObserver) {\n this.intersectionObserver.disconnect();\n this.intersectionObserver = null;\n }\n }\n\n async componentWillLoad(): Promise<void> {\n this.loadIconData();\n }\n\n private waitUntilVisible(callback: () => void): void {\n if (\n !Build.isBrowser ||\n typeof window === 'undefined' ||\n !(window as any).IntersectionObserver\n ) {\n callback();\n return;\n }\n\n this.intersectionObserver = new IntersectionObserver(\n entries => {\n entries.forEach(entry => {\n if (entry.isIntersecting) {\n this.intersectionObserver.disconnect();\n this.intersectionObserver = null;\n callback();\n }\n });\n },\n { rootMargin: '50px' },\n );\n\n this.intersectionObserver.observe(this.el);\n }\n\n /**\n * Renders the SVG content out of a JSON data in a format:\n * { \"viewBox\": \"...\", children: [{ \"tag\": \"g\", \"\"children\": [ ... ], ...attrs }, ...] }\n *\n * @returns JSX.Element | null\n */\n private renderSVGContent(children?: any[]) {\n if (!children || children.length === 0) {\n return null;\n }\n\n const createElement = node => {\n const { tag, children, ...attrs } = node;\n return h(tag, attrs, children ? children.map(createElement) : null);\n };\n\n const svgElements = children.map(createElement);\n return svgElements;\n }\n\n render() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n height={this.size || 16}\n width={this.size || 16}\n viewBox={this.iconData?.viewBox || `0 0 ${this.size || 16} ${this.size || 16}`}\n >\n {this.renderSVGContent(this.iconData?.children)}\n </svg>\n );\n }\n}\n"],"version":3}
|
|
@@ -16,82 +16,152 @@ const LeMultiselect$1 = /*@__PURE__*/ proxyCustomElement(class LeMultiselect ext
|
|
|
16
16
|
this.leChange = createEvent(this, "leChange", 7);
|
|
17
17
|
this.leOpen = createEvent(this, "leOpen", 7);
|
|
18
18
|
this.leClose = createEvent(this, "leClose", 7);
|
|
19
|
+
/**
|
|
20
|
+
* The options to display in the dropdown.
|
|
21
|
+
*/
|
|
22
|
+
this.options = [];
|
|
23
|
+
/**
|
|
24
|
+
* The currently selected values.
|
|
25
|
+
*/
|
|
26
|
+
this.value = [];
|
|
27
|
+
/**
|
|
28
|
+
* Placeholder text when no options are selected.
|
|
29
|
+
*/
|
|
30
|
+
this.placeholder = 'Select options...';
|
|
31
|
+
/**
|
|
32
|
+
* Whether the multiselect is disabled.
|
|
33
|
+
*/
|
|
34
|
+
this.disabled = false;
|
|
35
|
+
/**
|
|
36
|
+
* Whether selection is required.
|
|
37
|
+
*/
|
|
38
|
+
this.required = false;
|
|
39
|
+
/**
|
|
40
|
+
* Whether the multiselect should take full width of its container.
|
|
41
|
+
*/
|
|
42
|
+
this.fullWidth = false;
|
|
43
|
+
/**
|
|
44
|
+
* Size variant of the multiselect.
|
|
45
|
+
*/
|
|
46
|
+
this.size = 'medium';
|
|
47
|
+
/**
|
|
48
|
+
* Labels for the "Select All" option.
|
|
49
|
+
*/
|
|
50
|
+
this.selectAllLabel = 'Select All';
|
|
51
|
+
this.deselectAllLabel = 'Deselect All';
|
|
52
|
+
/**
|
|
53
|
+
* Whether to show a "Select All" option.
|
|
54
|
+
* Also accepts a string or array of strings to customize the label(s).
|
|
55
|
+
*/
|
|
56
|
+
this.showSelectAll = false;
|
|
57
|
+
/**
|
|
58
|
+
* Whether the input is searchable.
|
|
59
|
+
*/
|
|
60
|
+
this.searchable = false;
|
|
61
|
+
/**
|
|
62
|
+
* Text to show when no options match the search.
|
|
63
|
+
*/
|
|
64
|
+
this.emptyText = 'No results found';
|
|
65
|
+
/**
|
|
66
|
+
* Whether the dropdown is currently open.
|
|
67
|
+
*/
|
|
68
|
+
this.open = false;
|
|
69
|
+
this.selectedOptions = [];
|
|
70
|
+
this.searchQuery = '';
|
|
71
|
+
this.filterOption = (option, query) => {
|
|
72
|
+
if (!query)
|
|
73
|
+
return true;
|
|
74
|
+
// Always show "Select All" option
|
|
75
|
+
if (option.value === '__select_all__')
|
|
76
|
+
return true;
|
|
77
|
+
const searchLower = query.toLowerCase();
|
|
78
|
+
return (option.label.toLowerCase().includes(searchLower) ||
|
|
79
|
+
(option.description?.toLowerCase().includes(searchLower) ?? false));
|
|
80
|
+
};
|
|
81
|
+
this.handleOptionSelect = (e) => {
|
|
82
|
+
const { value } = e.detail;
|
|
83
|
+
const enabledOptions = this.parsedOptions.filter(opt => !opt.disabled);
|
|
84
|
+
if (enabledOptions.length === 0)
|
|
85
|
+
return;
|
|
86
|
+
// Handle "Select All" option
|
|
87
|
+
if (value === '__select_all__') {
|
|
88
|
+
if (this.selectedOptions.length === enabledOptions.length) {
|
|
89
|
+
// Deselect all
|
|
90
|
+
this.value = [];
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
// Select all (respect maxSelections)
|
|
94
|
+
const selectableOptions = this.maxSelections
|
|
95
|
+
? enabledOptions.slice(0, this.maxSelections)
|
|
96
|
+
: enabledOptions;
|
|
97
|
+
this.value = selectableOptions.map(opt => opt.value ?? opt.label);
|
|
98
|
+
}
|
|
99
|
+
this.emitChange();
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const isSelected = this.value.includes(value);
|
|
103
|
+
if (isSelected) {
|
|
104
|
+
// Remove from selection
|
|
105
|
+
this.value = this.value.filter(v => v !== value);
|
|
106
|
+
this.selectedOptions = this.selectedOptions.filter(opt => (opt.value ?? opt.label) !== value);
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
// Add to selection (if not at max)
|
|
110
|
+
if (this.maxSelections && this.value.length >= this.maxSelections) {
|
|
111
|
+
return; // Don't add more
|
|
112
|
+
}
|
|
113
|
+
this.value = [...this.value, value];
|
|
114
|
+
}
|
|
115
|
+
this.emitChange();
|
|
116
|
+
// Clear search after szelection
|
|
117
|
+
this.searchQuery = '';
|
|
118
|
+
};
|
|
119
|
+
this.handleDropdownOpen = () => {
|
|
120
|
+
this.open = true;
|
|
121
|
+
this.leOpen.emit();
|
|
122
|
+
// Focus search input if searchable
|
|
123
|
+
if (this.searchable) {
|
|
124
|
+
setTimeout(() => {
|
|
125
|
+
this.inputEl?.focus();
|
|
126
|
+
}, 50);
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
this.handleDropdownClose = () => {
|
|
130
|
+
this.open = false;
|
|
131
|
+
this.searchQuery = '';
|
|
132
|
+
this.leClose.emit();
|
|
133
|
+
};
|
|
134
|
+
this.handleTriggerClick = () => {
|
|
135
|
+
if (!this.disabled) {
|
|
136
|
+
this.dropdownEl?.toggle();
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
this.handleTriggerKeyDown = (e) => {
|
|
140
|
+
if (this.disabled)
|
|
141
|
+
return;
|
|
142
|
+
if (e.key === 'Enter' || e.key === ' ' || e.key === 'ArrowDown') {
|
|
143
|
+
e.preventDefault();
|
|
144
|
+
this.dropdownEl?.show();
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
this.handleTagDismiss = (option, e) => {
|
|
148
|
+
e.stopPropagation();
|
|
149
|
+
const value = option.value ?? option.label;
|
|
150
|
+
this.value = this.value.filter(v => v !== value);
|
|
151
|
+
this.selectedOptions = this.selectedOptions.filter(opt => opt !== option);
|
|
152
|
+
this.emitChange();
|
|
153
|
+
};
|
|
154
|
+
this.handleSearchInput = (e) => {
|
|
155
|
+
const target = e.target;
|
|
156
|
+
this.searchQuery = target.value;
|
|
157
|
+
};
|
|
158
|
+
this.handleClearAll = (e) => {
|
|
159
|
+
e.stopPropagation();
|
|
160
|
+
this.value = [];
|
|
161
|
+
this.selectedOptions = [];
|
|
162
|
+
this.emitChange();
|
|
163
|
+
};
|
|
19
164
|
}
|
|
20
|
-
get el() { return this; }
|
|
21
|
-
/**
|
|
22
|
-
* The options to display in the dropdown.
|
|
23
|
-
*/
|
|
24
|
-
options = [];
|
|
25
|
-
/**
|
|
26
|
-
* The currently selected values.
|
|
27
|
-
*/
|
|
28
|
-
value = [];
|
|
29
|
-
/**
|
|
30
|
-
* Placeholder text when no options are selected.
|
|
31
|
-
*/
|
|
32
|
-
placeholder = 'Select options...';
|
|
33
|
-
/**
|
|
34
|
-
* Whether the multiselect is disabled.
|
|
35
|
-
*/
|
|
36
|
-
disabled = false;
|
|
37
|
-
/**
|
|
38
|
-
* Whether selection is required.
|
|
39
|
-
*/
|
|
40
|
-
required = false;
|
|
41
|
-
/**
|
|
42
|
-
* Name attribute for form submission.
|
|
43
|
-
*/
|
|
44
|
-
name;
|
|
45
|
-
/**
|
|
46
|
-
* Whether the multiselect should take full width of its container.
|
|
47
|
-
*/
|
|
48
|
-
fullWidth = false;
|
|
49
|
-
/**
|
|
50
|
-
* Size variant of the multiselect.
|
|
51
|
-
*/
|
|
52
|
-
size = 'medium';
|
|
53
|
-
/**
|
|
54
|
-
* Maximum number of selections allowed.
|
|
55
|
-
*/
|
|
56
|
-
maxSelections;
|
|
57
|
-
/**
|
|
58
|
-
* Labels for the "Select All" option.
|
|
59
|
-
*/
|
|
60
|
-
selectAllLabel = 'Select All';
|
|
61
|
-
deselectAllLabel = 'Deselect All';
|
|
62
|
-
/**
|
|
63
|
-
* Whether to show a "Select All" option.
|
|
64
|
-
* Also accepts a string or array of strings to customize the label(s).
|
|
65
|
-
*/
|
|
66
|
-
showSelectAll = false;
|
|
67
|
-
/**
|
|
68
|
-
* Whether the input is searchable.
|
|
69
|
-
*/
|
|
70
|
-
searchable = false;
|
|
71
|
-
/**
|
|
72
|
-
* Text to show when no options match the search.
|
|
73
|
-
*/
|
|
74
|
-
emptyText = 'No results found';
|
|
75
|
-
/**
|
|
76
|
-
* Whether the dropdown is currently open.
|
|
77
|
-
*/
|
|
78
|
-
open = false;
|
|
79
|
-
/**
|
|
80
|
-
* Emitted when the selected values change.
|
|
81
|
-
*/
|
|
82
|
-
leChange;
|
|
83
|
-
/**
|
|
84
|
-
* Emitted when the dropdown opens.
|
|
85
|
-
*/
|
|
86
|
-
leOpen;
|
|
87
|
-
/**
|
|
88
|
-
* Emitted when the dropdown closes.
|
|
89
|
-
*/
|
|
90
|
-
leClose;
|
|
91
|
-
selectedOptions = [];
|
|
92
|
-
searchQuery = '';
|
|
93
|
-
dropdownEl;
|
|
94
|
-
inputEl;
|
|
95
165
|
handleValueChange() {
|
|
96
166
|
this.updateSelectedOptions();
|
|
97
167
|
}
|
|
@@ -164,105 +234,12 @@ const LeMultiselect$1 = /*@__PURE__*/ proxyCustomElement(class LeMultiselect ext
|
|
|
164
234
|
const valueArray = Array.isArray(this.value) ? this.value : [];
|
|
165
235
|
this.selectedOptions = this.parsedOptions.filter(opt => valueArray.includes(opt.value ?? opt.label));
|
|
166
236
|
}
|
|
167
|
-
filterOption = (option, query) => {
|
|
168
|
-
if (!query)
|
|
169
|
-
return true;
|
|
170
|
-
// Always show "Select All" option
|
|
171
|
-
if (option.value === '__select_all__')
|
|
172
|
-
return true;
|
|
173
|
-
const searchLower = query.toLowerCase();
|
|
174
|
-
return (option.label.toLowerCase().includes(searchLower) ||
|
|
175
|
-
(option.description?.toLowerCase().includes(searchLower) ?? false));
|
|
176
|
-
};
|
|
177
|
-
handleOptionSelect = (e) => {
|
|
178
|
-
const { value } = e.detail;
|
|
179
|
-
const enabledOptions = this.parsedOptions.filter(opt => !opt.disabled);
|
|
180
|
-
if (enabledOptions.length === 0)
|
|
181
|
-
return;
|
|
182
|
-
// Handle "Select All" option
|
|
183
|
-
if (value === '__select_all__') {
|
|
184
|
-
if (this.selectedOptions.length === enabledOptions.length) {
|
|
185
|
-
// Deselect all
|
|
186
|
-
this.value = [];
|
|
187
|
-
}
|
|
188
|
-
else {
|
|
189
|
-
// Select all (respect maxSelections)
|
|
190
|
-
const selectableOptions = this.maxSelections
|
|
191
|
-
? enabledOptions.slice(0, this.maxSelections)
|
|
192
|
-
: enabledOptions;
|
|
193
|
-
this.value = selectableOptions.map(opt => opt.value ?? opt.label);
|
|
194
|
-
}
|
|
195
|
-
this.emitChange();
|
|
196
|
-
return;
|
|
197
|
-
}
|
|
198
|
-
const isSelected = this.value.includes(value);
|
|
199
|
-
if (isSelected) {
|
|
200
|
-
// Remove from selection
|
|
201
|
-
this.value = this.value.filter(v => v !== value);
|
|
202
|
-
this.selectedOptions = this.selectedOptions.filter(opt => (opt.value ?? opt.label) !== value);
|
|
203
|
-
}
|
|
204
|
-
else {
|
|
205
|
-
// Add to selection (if not at max)
|
|
206
|
-
if (this.maxSelections && this.value.length >= this.maxSelections) {
|
|
207
|
-
return; // Don't add more
|
|
208
|
-
}
|
|
209
|
-
this.value = [...this.value, value];
|
|
210
|
-
}
|
|
211
|
-
this.emitChange();
|
|
212
|
-
// Clear search after szelection
|
|
213
|
-
this.searchQuery = '';
|
|
214
|
-
};
|
|
215
237
|
emitChange() {
|
|
216
238
|
this.leChange.emit({
|
|
217
239
|
values: this.value,
|
|
218
240
|
options: this.selectedOptions,
|
|
219
241
|
});
|
|
220
242
|
}
|
|
221
|
-
handleDropdownOpen = () => {
|
|
222
|
-
this.open = true;
|
|
223
|
-
this.leOpen.emit();
|
|
224
|
-
// Focus search input if searchable
|
|
225
|
-
if (this.searchable) {
|
|
226
|
-
setTimeout(() => {
|
|
227
|
-
this.inputEl?.focus();
|
|
228
|
-
}, 50);
|
|
229
|
-
}
|
|
230
|
-
};
|
|
231
|
-
handleDropdownClose = () => {
|
|
232
|
-
this.open = false;
|
|
233
|
-
this.searchQuery = '';
|
|
234
|
-
this.leClose.emit();
|
|
235
|
-
};
|
|
236
|
-
handleTriggerClick = () => {
|
|
237
|
-
if (!this.disabled) {
|
|
238
|
-
this.dropdownEl?.toggle();
|
|
239
|
-
}
|
|
240
|
-
};
|
|
241
|
-
handleTriggerKeyDown = (e) => {
|
|
242
|
-
if (this.disabled)
|
|
243
|
-
return;
|
|
244
|
-
if (e.key === 'Enter' || e.key === ' ' || e.key === 'ArrowDown') {
|
|
245
|
-
e.preventDefault();
|
|
246
|
-
this.dropdownEl?.show();
|
|
247
|
-
}
|
|
248
|
-
};
|
|
249
|
-
handleTagDismiss = (option, e) => {
|
|
250
|
-
e.stopPropagation();
|
|
251
|
-
const value = option.value ?? option.label;
|
|
252
|
-
this.value = this.value.filter(v => v !== value);
|
|
253
|
-
this.selectedOptions = this.selectedOptions.filter(opt => opt !== option);
|
|
254
|
-
this.emitChange();
|
|
255
|
-
};
|
|
256
|
-
handleSearchInput = (e) => {
|
|
257
|
-
const target = e.target;
|
|
258
|
-
this.searchQuery = target.value;
|
|
259
|
-
};
|
|
260
|
-
handleClearAll = (e) => {
|
|
261
|
-
e.stopPropagation();
|
|
262
|
-
this.value = [];
|
|
263
|
-
this.selectedOptions = [];
|
|
264
|
-
this.emitChange();
|
|
265
|
-
};
|
|
266
243
|
/**
|
|
267
244
|
* Opens the dropdown.
|
|
268
245
|
*/
|
|
@@ -292,21 +269,22 @@ const LeMultiselect$1 = /*@__PURE__*/ proxyCustomElement(class LeMultiselect ext
|
|
|
292
269
|
render() {
|
|
293
270
|
const hasSelections = this.selectedOptions.length > 0;
|
|
294
271
|
const atMaxSelections = this.maxSelections && this.value.length >= this.maxSelections;
|
|
295
|
-
return (h("le-component", { key: '
|
|
272
|
+
return (h("le-component", { key: 'b22fd0273666745ad4dcfaf5692102d4cbc1946c', component: "le-multiselect" }, h("le-dropdown-base", { key: 'e81736ecb7e4b50fe9d8ea19460271a705baeb80', ref: el => (this.dropdownEl = el), options: this.effectiveOptions, value: this.value, multiple: true, disabled: this.disabled, filterFn: this.searchable ? this.filterOption : undefined, filterQuery: this.searchQuery, emptyText: this.emptyText, showCheckboxes: true, fullWidth: this.fullWidth, onLeOptionSelect: this.handleOptionSelect, onLeDropdownOpen: this.handleDropdownOpen, onLeDropdownClose: this.handleDropdownClose }, h("div", { key: 'cd3e45b676ee7b90c82ae0b2c18684d89bb3f3f8', slot: "trigger", class: {
|
|
296
273
|
'multiselect-trigger': true,
|
|
297
274
|
'has-selections': hasSelections,
|
|
298
275
|
'is-open': this.open,
|
|
299
276
|
'is-disabled': this.disabled,
|
|
300
|
-
}, tabIndex: this.disabled ? -1 : 0, role: "combobox", "aria-haspopup": "listbox", "aria-expanded": this.open ? 'true' : 'false', "aria-disabled": this.disabled ? 'true' : undefined, onClick: this.handleTriggerClick, onKeyDown: this.handleTriggerKeyDown }, this.renderTags(), h("div", { key: '
|
|
301
|
-
this.value.map(val => (h("input", { type: "hidden", name: this.name, value: val.toString(), key: val.toString() }))), atMaxSelections && (h("span", { key: '
|
|
277
|
+
}, tabIndex: this.disabled ? -1 : 0, role: "combobox", "aria-haspopup": "listbox", "aria-expanded": this.open ? 'true' : 'false', "aria-disabled": this.disabled ? 'true' : undefined, onClick: this.handleTriggerClick, onKeyDown: this.handleTriggerKeyDown }, this.renderTags(), h("div", { key: 'dfcb6b8397aec56be4588421b7545ae6caae31b2', class: "multiselect-actions" }, hasSelections && !this.disabled && (h("button", { key: '3ddd374aa458784d7d19f52966ee4f4fa5ca93f1', type: "button", class: "multiselect-clear", onClick: this.handleClearAll, "aria-label": "Clear all", tabIndex: -1 }, h("svg", { key: '1687f1af7277b8489c6de841891439d5f4c77483', viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", "stroke-width": "2" }, h("path", { key: '864debd4e5ce7f93338bea67f24c1c43e63a4dc3', d: "M4 4l8 8M12 4l-8 8" })))), h("span", { key: '6d2fa2b5aaa3970068d40e4ec4db7c7809dc85cd', class: "multiselect-arrow" }, h("svg", { key: '2fb670f75e9d9ba726c320cfeb6b8d31dd3a6ac4', viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", "stroke-width": "2" }, h("path", { key: '70429d2d874f30a2a55ac57bf4d758663c048893', d: "M4 6l4 4 4-4" }))))), this.searchable && this.open && (h("div", { key: '1224afb258731403d9c95888b8b3b8fc0f0c1b03', class: "multiselect-search", slot: "header" }, h("le-string-input", { key: 'b8d592186887238ea1acbf5db8d8f9c9cca0656f', mode: "default", inputRef: el => (this.inputEl = el), class: "search-input", placeholder: "Search...", value: this.searchQuery, onInput: this.handleSearchInput })))), this.name &&
|
|
278
|
+
this.value.map(val => (h("input", { type: "hidden", name: this.name, value: val.toString(), key: val.toString() }))), atMaxSelections && (h("span", { key: 'c47d74d5f40c30881e6b8bb35dafe80be85ee41a', class: "multiselect-status" }, "Maximum ", this.maxSelections, " selections"))));
|
|
302
279
|
}
|
|
280
|
+
get el() { return this; }
|
|
303
281
|
static get watchers() { return {
|
|
304
282
|
"value": ["handleValueChange"],
|
|
305
283
|
"options": ["handleOptionsChange"],
|
|
306
284
|
"showSelectAll": ["handleShowSelectAllChange"]
|
|
307
285
|
}; }
|
|
308
286
|
static get style() { return leMultiselectCss(); }
|
|
309
|
-
}, [
|
|
287
|
+
}, [257, "le-multiselect", {
|
|
310
288
|
"options": [1],
|
|
311
289
|
"value": [1040],
|
|
312
290
|
"placeholder": [1],
|