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
|
@@ -9,68 +9,116 @@ const LeTabs = class {
|
|
|
9
9
|
constructor(hostRef) {
|
|
10
10
|
index.registerInstance(this, hostRef);
|
|
11
11
|
this.leTabChange = index.createEvent(this, "leTabChange");
|
|
12
|
+
/**
|
|
13
|
+
* Array of tab options (programmatic mode).
|
|
14
|
+
* If le-tab-panel children exist, they take precedence.
|
|
15
|
+
*/
|
|
16
|
+
this.tabs = [];
|
|
17
|
+
/**
|
|
18
|
+
* Orientation of the tabs.
|
|
19
|
+
* @allowedValues horizontal | vertical
|
|
20
|
+
*/
|
|
21
|
+
this.orientation = 'horizontal';
|
|
22
|
+
/**
|
|
23
|
+
* Position of the tabs relative to the panels.
|
|
24
|
+
* @allowedValues start | end
|
|
25
|
+
*/
|
|
26
|
+
this.position = 'start';
|
|
27
|
+
/**
|
|
28
|
+
* Tab variant style.
|
|
29
|
+
* @allowedValues underlined | solid | pills | enclosed | icon-only
|
|
30
|
+
*/
|
|
31
|
+
this.variant = 'underlined';
|
|
32
|
+
/**
|
|
33
|
+
* Whether tabs should stretch to fill available width.
|
|
34
|
+
*/
|
|
35
|
+
this.fullWidth = false;
|
|
36
|
+
/**
|
|
37
|
+
* Size of the tabs.
|
|
38
|
+
* @allowedValues sm | md | lg
|
|
39
|
+
*/
|
|
40
|
+
this.size = 'medium';
|
|
41
|
+
/**
|
|
42
|
+
* Wrap the tabs if they exceed container width.
|
|
43
|
+
*/
|
|
44
|
+
this.wrap = false;
|
|
45
|
+
/**
|
|
46
|
+
* Scroll behavior for overflowing tabs.
|
|
47
|
+
* @allowedValues auto | hidden | visible | scroll
|
|
48
|
+
*/
|
|
49
|
+
this.overflow = 'auto';
|
|
50
|
+
/**
|
|
51
|
+
* Internal tab configurations (built from children or tabs prop)
|
|
52
|
+
*/
|
|
53
|
+
this.tabConfigs = [];
|
|
54
|
+
/**
|
|
55
|
+
* Internal state for focused tab index (for keyboard navigation)
|
|
56
|
+
*/
|
|
57
|
+
this.focusedIndex = 0;
|
|
58
|
+
/**
|
|
59
|
+
* Whether we're using declarative mode (le-tab-panel children)
|
|
60
|
+
*/
|
|
61
|
+
this.isDeclarativeMode = false;
|
|
62
|
+
this.handleTabClick = (config) => {
|
|
63
|
+
this.selectTab(config);
|
|
64
|
+
};
|
|
65
|
+
this.handleKeyDown = (event) => {
|
|
66
|
+
const { tabConfigs, orientation } = this;
|
|
67
|
+
const isHorizontal = orientation === 'horizontal';
|
|
68
|
+
let newIndex = this.focusedIndex;
|
|
69
|
+
switch (event.key) {
|
|
70
|
+
case 'ArrowLeft':
|
|
71
|
+
if (isHorizontal) {
|
|
72
|
+
event.preventDefault();
|
|
73
|
+
newIndex = this.findNextEnabledTab(-1);
|
|
74
|
+
}
|
|
75
|
+
break;
|
|
76
|
+
case 'ArrowRight':
|
|
77
|
+
if (isHorizontal) {
|
|
78
|
+
event.preventDefault();
|
|
79
|
+
newIndex = this.findNextEnabledTab(1);
|
|
80
|
+
}
|
|
81
|
+
break;
|
|
82
|
+
case 'ArrowUp':
|
|
83
|
+
if (!isHorizontal) {
|
|
84
|
+
event.preventDefault();
|
|
85
|
+
newIndex = this.findNextEnabledTab(-1);
|
|
86
|
+
}
|
|
87
|
+
break;
|
|
88
|
+
case 'ArrowDown':
|
|
89
|
+
if (!isHorizontal) {
|
|
90
|
+
event.preventDefault();
|
|
91
|
+
newIndex = this.findNextEnabledTab(1);
|
|
92
|
+
}
|
|
93
|
+
break;
|
|
94
|
+
case 'Home':
|
|
95
|
+
event.preventDefault();
|
|
96
|
+
newIndex = this.findFirstEnabledTab();
|
|
97
|
+
break;
|
|
98
|
+
case 'End':
|
|
99
|
+
event.preventDefault();
|
|
100
|
+
newIndex = this.findLastEnabledTab();
|
|
101
|
+
break;
|
|
102
|
+
case 'Enter':
|
|
103
|
+
case ' ':
|
|
104
|
+
event.preventDefault();
|
|
105
|
+
if (tabConfigs[this.focusedIndex]) {
|
|
106
|
+
this.selectTab(tabConfigs[this.focusedIndex]);
|
|
107
|
+
}
|
|
108
|
+
return;
|
|
109
|
+
default:
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
if (newIndex !== this.focusedIndex) {
|
|
113
|
+
this.focusedIndex = newIndex;
|
|
114
|
+
this.focusTab(newIndex);
|
|
115
|
+
// Auto-select on focus (recommended for tabs)
|
|
116
|
+
if (tabConfigs[newIndex]) {
|
|
117
|
+
this.selectTab(tabConfigs[newIndex]);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
};
|
|
12
121
|
}
|
|
13
|
-
get el() { return index.getElement(this); }
|
|
14
|
-
/**
|
|
15
|
-
* Array of tab options (programmatic mode).
|
|
16
|
-
* If le-tab-panel children exist, they take precedence.
|
|
17
|
-
*/
|
|
18
|
-
tabs = [];
|
|
19
|
-
/**
|
|
20
|
-
* The value of the currently selected tab.
|
|
21
|
-
* If not provided, defaults to the first tab.
|
|
22
|
-
*/
|
|
23
|
-
selected;
|
|
24
|
-
/**
|
|
25
|
-
* Orientation of the tabs.
|
|
26
|
-
* @allowedValues horizontal | vertical
|
|
27
|
-
*/
|
|
28
|
-
orientation = 'horizontal';
|
|
29
|
-
/**
|
|
30
|
-
* Position of the tabs relative to the panels.
|
|
31
|
-
* @allowedValues start | end
|
|
32
|
-
*/
|
|
33
|
-
position = 'start';
|
|
34
|
-
/**
|
|
35
|
-
* Tab variant style.
|
|
36
|
-
* @allowedValues underlined | solid | pills | enclosed | icon-only
|
|
37
|
-
*/
|
|
38
|
-
variant = 'underlined';
|
|
39
|
-
/**
|
|
40
|
-
* Whether tabs should stretch to fill available width.
|
|
41
|
-
*/
|
|
42
|
-
fullWidth = false;
|
|
43
|
-
/**
|
|
44
|
-
* Size of the tabs.
|
|
45
|
-
* @allowedValues sm | md | lg
|
|
46
|
-
*/
|
|
47
|
-
size = 'medium';
|
|
48
|
-
/**
|
|
49
|
-
* Wrap the tabs if they exceed container width.
|
|
50
|
-
*/
|
|
51
|
-
wrap = false;
|
|
52
|
-
/**
|
|
53
|
-
* Scroll behavior for overflowing tabs.
|
|
54
|
-
* @allowedValues auto | hidden | visible | scroll
|
|
55
|
-
*/
|
|
56
|
-
overflow = 'auto';
|
|
57
|
-
/**
|
|
58
|
-
* Internal tab configurations (built from children or tabs prop)
|
|
59
|
-
*/
|
|
60
|
-
tabConfigs = [];
|
|
61
|
-
/**
|
|
62
|
-
* Internal state for focused tab index (for keyboard navigation)
|
|
63
|
-
*/
|
|
64
|
-
focusedIndex = 0;
|
|
65
|
-
/**
|
|
66
|
-
* Whether we're using declarative mode (le-tab-panel children)
|
|
67
|
-
*/
|
|
68
|
-
isDeclarativeMode = false;
|
|
69
|
-
/**
|
|
70
|
-
* Emitted when the selected tab changes.
|
|
71
|
-
*/
|
|
72
|
-
leTabChange;
|
|
73
|
-
mutationObserver;
|
|
74
122
|
selectedChanged(newValue) {
|
|
75
123
|
const index = this.tabConfigs.findIndex(t => t.value === newValue);
|
|
76
124
|
if (index >= 0) {
|
|
@@ -172,65 +220,6 @@ const LeTabs = class {
|
|
|
172
220
|
},
|
|
173
221
|
});
|
|
174
222
|
}
|
|
175
|
-
handleTabClick = (config) => {
|
|
176
|
-
this.selectTab(config);
|
|
177
|
-
};
|
|
178
|
-
handleKeyDown = (event) => {
|
|
179
|
-
const { tabConfigs, orientation } = this;
|
|
180
|
-
const isHorizontal = orientation === 'horizontal';
|
|
181
|
-
let newIndex = this.focusedIndex;
|
|
182
|
-
switch (event.key) {
|
|
183
|
-
case 'ArrowLeft':
|
|
184
|
-
if (isHorizontal) {
|
|
185
|
-
event.preventDefault();
|
|
186
|
-
newIndex = this.findNextEnabledTab(-1);
|
|
187
|
-
}
|
|
188
|
-
break;
|
|
189
|
-
case 'ArrowRight':
|
|
190
|
-
if (isHorizontal) {
|
|
191
|
-
event.preventDefault();
|
|
192
|
-
newIndex = this.findNextEnabledTab(1);
|
|
193
|
-
}
|
|
194
|
-
break;
|
|
195
|
-
case 'ArrowUp':
|
|
196
|
-
if (!isHorizontal) {
|
|
197
|
-
event.preventDefault();
|
|
198
|
-
newIndex = this.findNextEnabledTab(-1);
|
|
199
|
-
}
|
|
200
|
-
break;
|
|
201
|
-
case 'ArrowDown':
|
|
202
|
-
if (!isHorizontal) {
|
|
203
|
-
event.preventDefault();
|
|
204
|
-
newIndex = this.findNextEnabledTab(1);
|
|
205
|
-
}
|
|
206
|
-
break;
|
|
207
|
-
case 'Home':
|
|
208
|
-
event.preventDefault();
|
|
209
|
-
newIndex = this.findFirstEnabledTab();
|
|
210
|
-
break;
|
|
211
|
-
case 'End':
|
|
212
|
-
event.preventDefault();
|
|
213
|
-
newIndex = this.findLastEnabledTab();
|
|
214
|
-
break;
|
|
215
|
-
case 'Enter':
|
|
216
|
-
case ' ':
|
|
217
|
-
event.preventDefault();
|
|
218
|
-
if (tabConfigs[this.focusedIndex]) {
|
|
219
|
-
this.selectTab(tabConfigs[this.focusedIndex]);
|
|
220
|
-
}
|
|
221
|
-
return;
|
|
222
|
-
default:
|
|
223
|
-
return;
|
|
224
|
-
}
|
|
225
|
-
if (newIndex !== this.focusedIndex) {
|
|
226
|
-
this.focusedIndex = newIndex;
|
|
227
|
-
this.focusTab(newIndex);
|
|
228
|
-
// Auto-select on focus (recommended for tabs)
|
|
229
|
-
if (tabConfigs[newIndex]) {
|
|
230
|
-
this.selectTab(tabConfigs[newIndex]);
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
};
|
|
234
223
|
findNextEnabledTab(direction) {
|
|
235
224
|
const { tabConfigs } = this;
|
|
236
225
|
let index = this.focusedIndex;
|
|
@@ -273,7 +262,7 @@ const LeTabs = class {
|
|
|
273
262
|
: this.position === 'start'
|
|
274
263
|
? 'top'
|
|
275
264
|
: 'bottom';
|
|
276
|
-
return (index.h("le-component", { key: '
|
|
265
|
+
return (index.h("le-component", { key: '0240e0ae8c8b2513e80e8a032101df47a2041e3d', component: "le-tabs", hostClass: utils.classnames(classes) }, index.h("div", { key: 'b063db57a29d4c212ed81a738c41d7e395f5618c', class: classes }, index.h("div", { key: '01ba40aac8cb13357c668d82daf7c34f7fb104e6', class: {
|
|
277
266
|
'tablist': true,
|
|
278
267
|
'wrap-tabs': this.wrap,
|
|
279
268
|
[`overflow-${this.overflow}`]: true,
|
|
@@ -282,7 +271,7 @@ const LeTabs = class {
|
|
|
282
271
|
const tabId = `tab-${config.value}`;
|
|
283
272
|
const panelId = `panel-${config.value}`;
|
|
284
273
|
return (index.h("le-tab", { key: config.value, id: tabId, class: "tab", mode: "default", variant: this.variant, selected: isSelected, disabled: config.disabled, size: this.size, position: tabPosition, align: this.orientation === 'vertical' ? 'start' : 'center', role: "tab", part: isSelected ? 'tab tab-active' : 'tab', "aria-selected": isSelected ? 'true' : 'false', "aria-controls": panelId, "aria-disabled": config.disabled ? 'true' : undefined, focusable: false, onClick: () => this.handleTabClick(config), iconStart: config.iconStart, iconEnd: config.iconEnd }, index.h("span", { class: "tab-label" }, config.label)));
|
|
285
|
-
})), index.h("div", { key: '
|
|
274
|
+
})), index.h("div", { key: 'b1e16928f27f5083e94674e80b0ad397eb3e8fec', class: "panels", part: "panels" }, isDeclarativeMode ? (
|
|
286
275
|
// Declarative mode - render slot for le-tab-panel children
|
|
287
276
|
index.h("le-slot", { name: "", description: "Tab panels", type: "slot", allowedComponents: "le-tab-panel" }, index.h("slot", null))) : (
|
|
288
277
|
// Programmatic mode - render named slots
|
|
@@ -296,6 +285,7 @@ const LeTabs = class {
|
|
|
296
285
|
}, role: "tabpanel", part: "panel", "aria-labelledby": tabId, tabIndex: 0, hidden: !isSelected }, index.h("slot", { name: `panel-${config.value}` })));
|
|
297
286
|
}))))));
|
|
298
287
|
}
|
|
288
|
+
get el() { return index.getElement(this); }
|
|
299
289
|
static get watchers() { return {
|
|
300
290
|
"selected": ["selectedChanged"],
|
|
301
291
|
"tabs": ["tabsChanged"]
|
|
@@ -8,46 +8,29 @@ const LeTag = class {
|
|
|
8
8
|
constructor(hostRef) {
|
|
9
9
|
index.registerInstance(this, hostRef);
|
|
10
10
|
this.leDismiss = index.createEvent(this, "leDismiss");
|
|
11
|
+
/**
|
|
12
|
+
* Whether the tag can be dismissed (shows close button).
|
|
13
|
+
*/
|
|
14
|
+
this.dismissible = false;
|
|
15
|
+
/**
|
|
16
|
+
* Whether the tag is disabled.
|
|
17
|
+
*/
|
|
18
|
+
this.disabled = false;
|
|
19
|
+
/**
|
|
20
|
+
* The size of the tag.
|
|
21
|
+
*/
|
|
22
|
+
this.size = 'medium';
|
|
23
|
+
/**
|
|
24
|
+
* The visual variant of the tag.
|
|
25
|
+
*/
|
|
26
|
+
this.variant = 'default';
|
|
27
|
+
this.handleDismiss = (e) => {
|
|
28
|
+
e.stopPropagation();
|
|
29
|
+
if (!this.disabled) {
|
|
30
|
+
this.leDismiss.emit();
|
|
31
|
+
}
|
|
32
|
+
};
|
|
11
33
|
}
|
|
12
|
-
/**
|
|
13
|
-
* The text label to display in the tag.
|
|
14
|
-
*/
|
|
15
|
-
label;
|
|
16
|
-
/**
|
|
17
|
-
* Mode of the popover should be 'default' for internal use
|
|
18
|
-
*/
|
|
19
|
-
mode;
|
|
20
|
-
/**
|
|
21
|
-
* Icon to display before the label.
|
|
22
|
-
* Can be an emoji, URL, or icon name.
|
|
23
|
-
*/
|
|
24
|
-
icon;
|
|
25
|
-
/**
|
|
26
|
-
* Whether the tag can be dismissed (shows close button).
|
|
27
|
-
*/
|
|
28
|
-
dismissible = false;
|
|
29
|
-
/**
|
|
30
|
-
* Whether the tag is disabled.
|
|
31
|
-
*/
|
|
32
|
-
disabled = false;
|
|
33
|
-
/**
|
|
34
|
-
* The size of the tag.
|
|
35
|
-
*/
|
|
36
|
-
size = 'medium';
|
|
37
|
-
/**
|
|
38
|
-
* The visual variant of the tag.
|
|
39
|
-
*/
|
|
40
|
-
variant = 'default';
|
|
41
|
-
/**
|
|
42
|
-
* Emitted when the dismiss button is clicked.
|
|
43
|
-
*/
|
|
44
|
-
leDismiss;
|
|
45
|
-
handleDismiss = (e) => {
|
|
46
|
-
e.stopPropagation();
|
|
47
|
-
if (!this.disabled) {
|
|
48
|
-
this.leDismiss.emit();
|
|
49
|
-
}
|
|
50
|
-
};
|
|
51
34
|
renderIcon() {
|
|
52
35
|
if (!this.icon)
|
|
53
36
|
return null;
|
|
@@ -59,7 +42,7 @@ const LeTag = class {
|
|
|
59
42
|
return index.h("span", { class: "tag-icon" }, this.icon);
|
|
60
43
|
}
|
|
61
44
|
render() {
|
|
62
|
-
return (index.h("le-component", { key: '
|
|
45
|
+
return (index.h("le-component", { key: '6903620dec3042a396c4e39ed378f59e4889fb5f', component: "le-tag" }, index.h("span", { key: '23a31349e50aeb8a38bfdf22e6151562eaa16a6e', class: "tag" }, this.renderIcon(), index.h("span", { key: '8505dd5c9ed47baf702d947bf687875dd7c8283e', class: "tag-label" }, index.h("le-slot", { key: '1f7b44714f1f1b4f1a1a5af6925b15d6026cc7e4', name: "", tag: "span", type: "text" }, index.h("slot", { key: '7722a7f387284cbc3c8ef38deeff69c7a02282a8' }, this.label))), this.dismissible && (index.h("button", { key: 'ae937d67c269ef0ff504926623ed95061c750232', type: "button", class: "tag-dismiss", onClick: this.handleDismiss, disabled: this.disabled, "aria-label": "Remove" }, index.h("svg", { key: '9cf11ec361d62de7b6ef524c40edad13c1da9c06', viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", "stroke-width": "2" }, index.h("path", { key: 'e919bccb3fa4679f7e808960195d670685f1e0df', d: "M4 4l8 8M12 4l-8 8" })))))));
|
|
63
46
|
}
|
|
64
47
|
};
|
|
65
48
|
LeTag.style = leTagCss();
|
|
@@ -8,62 +8,137 @@ const leTextCss = () => `:host{display:block}:host([hidden]){display:none}.le-te
|
|
|
8
8
|
const LeText = class {
|
|
9
9
|
constructor(hostRef) {
|
|
10
10
|
index.registerInstance(this, hostRef);
|
|
11
|
+
/**
|
|
12
|
+
* The semantic variant/type of text element
|
|
13
|
+
* @allowedValues p | h1 | h2 | h3 | h4 | h5 | h6 | code | quote | label | small
|
|
14
|
+
*/
|
|
15
|
+
this.variant = 'p';
|
|
16
|
+
/**
|
|
17
|
+
* Text alignment
|
|
18
|
+
* @allowedValues left | center | right | justify
|
|
19
|
+
*/
|
|
20
|
+
this.align = 'left';
|
|
21
|
+
/**
|
|
22
|
+
* Whether the text should truncate with ellipsis
|
|
23
|
+
*/
|
|
24
|
+
this.truncate = false;
|
|
25
|
+
/**
|
|
26
|
+
* Internal state to track admin mode
|
|
27
|
+
*/
|
|
28
|
+
this.adminMode = false;
|
|
29
|
+
/**
|
|
30
|
+
* The HTML content being edited
|
|
31
|
+
*/
|
|
32
|
+
this.content = '';
|
|
33
|
+
/**
|
|
34
|
+
* Whether the editor is focused (shows toolbar)
|
|
35
|
+
*/
|
|
36
|
+
this.isFocused = false;
|
|
37
|
+
/**
|
|
38
|
+
* Current selection state for toolbar button highlighting
|
|
39
|
+
*/
|
|
40
|
+
this.selectionState = {
|
|
41
|
+
isBold: false,
|
|
42
|
+
isItalic: false,
|
|
43
|
+
isUnderline: false,
|
|
44
|
+
isStrikethrough: false,
|
|
45
|
+
isLink: false,
|
|
46
|
+
blockType: 'p',
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Handle input in the contenteditable
|
|
50
|
+
*/
|
|
51
|
+
this.handleInput = () => {
|
|
52
|
+
if (this.editorRef) {
|
|
53
|
+
this.content = this.editorRef.innerHTML;
|
|
54
|
+
this.updateSelectionState();
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Handle focus on the editor
|
|
59
|
+
*/
|
|
60
|
+
this.handleFocus = () => {
|
|
61
|
+
this.isFocused = true;
|
|
62
|
+
this.updateSelectionState();
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Handle blur on the editor
|
|
66
|
+
*/
|
|
67
|
+
this.handleBlur = (e) => {
|
|
68
|
+
// Check if focus moved to toolbar
|
|
69
|
+
const relatedTarget = e.relatedTarget;
|
|
70
|
+
const toolbar = this.el.shadowRoot?.querySelector('.le-text-toolbar');
|
|
71
|
+
if (toolbar?.contains(relatedTarget)) {
|
|
72
|
+
// Focus moved to toolbar, keep it open
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
// Small delay to allow toolbar clicks to register
|
|
76
|
+
setTimeout(() => {
|
|
77
|
+
if (!this.el.shadowRoot?.activeElement) {
|
|
78
|
+
this.isFocused = false;
|
|
79
|
+
this.syncContentToSlot();
|
|
80
|
+
}
|
|
81
|
+
}, 150);
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* Handle selection change to update toolbar state
|
|
85
|
+
*/
|
|
86
|
+
this.handleSelectionChange = () => {
|
|
87
|
+
this.updateSelectionState();
|
|
88
|
+
};
|
|
89
|
+
/**
|
|
90
|
+
* Toggle bold formatting
|
|
91
|
+
*/
|
|
92
|
+
this.toggleBold = (e) => {
|
|
93
|
+
e.preventDefault();
|
|
94
|
+
this.execCommand('bold');
|
|
95
|
+
};
|
|
96
|
+
/**
|
|
97
|
+
* Toggle italic formatting
|
|
98
|
+
*/
|
|
99
|
+
this.toggleItalic = (e) => {
|
|
100
|
+
e.preventDefault();
|
|
101
|
+
this.execCommand('italic');
|
|
102
|
+
};
|
|
103
|
+
/**
|
|
104
|
+
* Toggle underline formatting
|
|
105
|
+
*/
|
|
106
|
+
this.toggleUnderline = (e) => {
|
|
107
|
+
e.preventDefault();
|
|
108
|
+
this.execCommand('underline');
|
|
109
|
+
};
|
|
110
|
+
/**
|
|
111
|
+
* Toggle strikethrough formatting
|
|
112
|
+
*/
|
|
113
|
+
this.toggleStrikethrough = (e) => {
|
|
114
|
+
e.preventDefault();
|
|
115
|
+
this.execCommand('strikeThrough');
|
|
116
|
+
};
|
|
117
|
+
/**
|
|
118
|
+
* Add or edit a link
|
|
119
|
+
*/
|
|
120
|
+
this.toggleLink = (e) => {
|
|
121
|
+
e.preventDefault();
|
|
122
|
+
if (this.selectionState.isLink) {
|
|
123
|
+
// Remove link
|
|
124
|
+
this.execCommand('unlink');
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
// Add link
|
|
128
|
+
const url = prompt('Enter URL:', 'https://');
|
|
129
|
+
if (url) {
|
|
130
|
+
this.execCommand('createLink', url);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
/**
|
|
135
|
+
* Change the block type/variant
|
|
136
|
+
*/
|
|
137
|
+
this.changeVariant = (e) => {
|
|
138
|
+
const select = e.target;
|
|
139
|
+
this.variant = select.value;
|
|
140
|
+
};
|
|
11
141
|
}
|
|
12
|
-
get el() { return index.getElement(this); }
|
|
13
|
-
/**
|
|
14
|
-
* The semantic variant/type of text element
|
|
15
|
-
* @allowedValues p | h1 | h2 | h3 | h4 | h5 | h6 | code | quote | label | small
|
|
16
|
-
*/
|
|
17
|
-
variant = 'p';
|
|
18
|
-
/**
|
|
19
|
-
* Text alignment
|
|
20
|
-
* @allowedValues left | center | right | justify
|
|
21
|
-
*/
|
|
22
|
-
align = 'left';
|
|
23
|
-
/**
|
|
24
|
-
* Text color (CSS value or theme token)
|
|
25
|
-
*/
|
|
26
|
-
color;
|
|
27
|
-
/**
|
|
28
|
-
* Whether the text should truncate with ellipsis
|
|
29
|
-
*/
|
|
30
|
-
truncate = false;
|
|
31
|
-
/**
|
|
32
|
-
* Maximum number of lines before truncating (requires truncate=true)
|
|
33
|
-
*/
|
|
34
|
-
maxLines;
|
|
35
|
-
/**
|
|
36
|
-
* Internal state to track admin mode
|
|
37
|
-
*/
|
|
38
|
-
adminMode = false;
|
|
39
|
-
/**
|
|
40
|
-
* The HTML content being edited
|
|
41
|
-
*/
|
|
42
|
-
content = '';
|
|
43
|
-
/**
|
|
44
|
-
* Whether the editor is focused (shows toolbar)
|
|
45
|
-
*/
|
|
46
|
-
isFocused = false;
|
|
47
|
-
/**
|
|
48
|
-
* Current selection state for toolbar button highlighting
|
|
49
|
-
*/
|
|
50
|
-
selectionState = {
|
|
51
|
-
isBold: false,
|
|
52
|
-
isItalic: false,
|
|
53
|
-
isUnderline: false,
|
|
54
|
-
isStrikethrough: false,
|
|
55
|
-
isLink: false,
|
|
56
|
-
blockType: 'p',
|
|
57
|
-
};
|
|
58
|
-
/**
|
|
59
|
-
* Reference to the contenteditable element
|
|
60
|
-
*/
|
|
61
|
-
editorRef;
|
|
62
|
-
/**
|
|
63
|
-
* Reference to the slot element
|
|
64
|
-
*/
|
|
65
|
-
slotRef;
|
|
66
|
-
disconnectModeObserver;
|
|
67
142
|
connectedCallback() {
|
|
68
143
|
this.disconnectModeObserver = utils.observeModeChanges(this.el, mode => {
|
|
69
144
|
const wasAdmin = this.adminMode;
|
|
@@ -145,47 +220,6 @@ const LeText = class {
|
|
|
145
220
|
}
|
|
146
221
|
}
|
|
147
222
|
}
|
|
148
|
-
/**
|
|
149
|
-
* Handle input in the contenteditable
|
|
150
|
-
*/
|
|
151
|
-
handleInput = () => {
|
|
152
|
-
if (this.editorRef) {
|
|
153
|
-
this.content = this.editorRef.innerHTML;
|
|
154
|
-
this.updateSelectionState();
|
|
155
|
-
}
|
|
156
|
-
};
|
|
157
|
-
/**
|
|
158
|
-
* Handle focus on the editor
|
|
159
|
-
*/
|
|
160
|
-
handleFocus = () => {
|
|
161
|
-
this.isFocused = true;
|
|
162
|
-
this.updateSelectionState();
|
|
163
|
-
};
|
|
164
|
-
/**
|
|
165
|
-
* Handle blur on the editor
|
|
166
|
-
*/
|
|
167
|
-
handleBlur = (e) => {
|
|
168
|
-
// Check if focus moved to toolbar
|
|
169
|
-
const relatedTarget = e.relatedTarget;
|
|
170
|
-
const toolbar = this.el.shadowRoot?.querySelector('.le-text-toolbar');
|
|
171
|
-
if (toolbar?.contains(relatedTarget)) {
|
|
172
|
-
// Focus moved to toolbar, keep it open
|
|
173
|
-
return;
|
|
174
|
-
}
|
|
175
|
-
// Small delay to allow toolbar clicks to register
|
|
176
|
-
setTimeout(() => {
|
|
177
|
-
if (!this.el.shadowRoot?.activeElement) {
|
|
178
|
-
this.isFocused = false;
|
|
179
|
-
this.syncContentToSlot();
|
|
180
|
-
}
|
|
181
|
-
}, 150);
|
|
182
|
-
};
|
|
183
|
-
/**
|
|
184
|
-
* Handle selection change to update toolbar state
|
|
185
|
-
*/
|
|
186
|
-
handleSelectionChange = () => {
|
|
187
|
-
this.updateSelectionState();
|
|
188
|
-
};
|
|
189
223
|
/**
|
|
190
224
|
* Update the selection state for toolbar highlighting
|
|
191
225
|
*/
|
|
@@ -228,58 +262,6 @@ const LeText = class {
|
|
|
228
262
|
this.handleInput();
|
|
229
263
|
this.updateSelectionState();
|
|
230
264
|
}
|
|
231
|
-
/**
|
|
232
|
-
* Toggle bold formatting
|
|
233
|
-
*/
|
|
234
|
-
toggleBold = (e) => {
|
|
235
|
-
e.preventDefault();
|
|
236
|
-
this.execCommand('bold');
|
|
237
|
-
};
|
|
238
|
-
/**
|
|
239
|
-
* Toggle italic formatting
|
|
240
|
-
*/
|
|
241
|
-
toggleItalic = (e) => {
|
|
242
|
-
e.preventDefault();
|
|
243
|
-
this.execCommand('italic');
|
|
244
|
-
};
|
|
245
|
-
/**
|
|
246
|
-
* Toggle underline formatting
|
|
247
|
-
*/
|
|
248
|
-
toggleUnderline = (e) => {
|
|
249
|
-
e.preventDefault();
|
|
250
|
-
this.execCommand('underline');
|
|
251
|
-
};
|
|
252
|
-
/**
|
|
253
|
-
* Toggle strikethrough formatting
|
|
254
|
-
*/
|
|
255
|
-
toggleStrikethrough = (e) => {
|
|
256
|
-
e.preventDefault();
|
|
257
|
-
this.execCommand('strikeThrough');
|
|
258
|
-
};
|
|
259
|
-
/**
|
|
260
|
-
* Add or edit a link
|
|
261
|
-
*/
|
|
262
|
-
toggleLink = (e) => {
|
|
263
|
-
e.preventDefault();
|
|
264
|
-
if (this.selectionState.isLink) {
|
|
265
|
-
// Remove link
|
|
266
|
-
this.execCommand('unlink');
|
|
267
|
-
}
|
|
268
|
-
else {
|
|
269
|
-
// Add link
|
|
270
|
-
const url = prompt('Enter URL:', 'https://');
|
|
271
|
-
if (url) {
|
|
272
|
-
this.execCommand('createLink', url);
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
};
|
|
276
|
-
/**
|
|
277
|
-
* Change the block type/variant
|
|
278
|
-
*/
|
|
279
|
-
changeVariant = (e) => {
|
|
280
|
-
const select = e.target;
|
|
281
|
-
this.variant = select.value;
|
|
282
|
-
};
|
|
283
265
|
/**
|
|
284
266
|
* Render the formatting toolbar
|
|
285
267
|
*/
|
|
@@ -325,6 +307,7 @@ const LeText = class {
|
|
|
325
307
|
// Default mode - render semantic element with slotted content
|
|
326
308
|
return (index.h(index.Host, null, index.h(Tag, { class: textClass, part: "text", style: textStyle }, index.h("slot", { ref: el => (this.slotRef = el) }))));
|
|
327
309
|
}
|
|
310
|
+
get el() { return index.getElement(this); }
|
|
328
311
|
static get watchers() { return {
|
|
329
312
|
"variant": ["onVariantChange"]
|
|
330
313
|
}; }
|