le-kit 0.3.5 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LLM_CONTEXT.md +1377 -0
- package/dist/cjs/{index-BPF04Jvb.js → index-BzadfLTc.js} +6 -3
- package/dist/cjs/index-BzadfLTc.js.map +1 -0
- package/dist/cjs/index.cjs.js +2 -2
- package/dist/cjs/le-bar_16.cjs.entry.js +21 -21
- package/dist/cjs/le-box.cjs.entry.js +5 -5
- package/dist/cjs/le-card.cjs.entry.js +5 -5
- package/dist/cjs/le-code-input.cjs.entry.js +181 -0
- package/dist/cjs/le-combobox.cjs.entry.js +2 -2
- package/dist/cjs/le-header-placeholder.cjs.entry.js +2 -2
- package/dist/cjs/le-kit.cjs.js +2 -2
- package/dist/cjs/le-multiselect.cjs.entry.js +4 -4
- package/dist/cjs/le-number-input.cjs.entry.js +3 -3
- package/dist/cjs/le-round-progress.cjs.entry.js +2 -2
- package/dist/cjs/le-segmented-control.cjs.entry.js +2 -2
- package/dist/cjs/le-side-panel-toggle.cjs.entry.js +229 -0
- package/dist/cjs/le-side-panel.cjs.entry.js +546 -0
- package/dist/cjs/le-stack.cjs.entry.js +3 -3
- package/dist/cjs/le-tab-bar.cjs.entry.js +2 -2
- package/dist/cjs/le-tab-panel.cjs.entry.js +3 -3
- package/dist/cjs/le-tab.cjs.entry.js +3 -3
- package/dist/cjs/le-tabs.cjs.entry.js +4 -4
- package/dist/cjs/le-tag.cjs.entry.js +2 -2
- package/dist/cjs/le-text.cjs.entry.js +8 -8
- package/dist/cjs/le-turntable.cjs.entry.js +2 -2
- package/dist/cjs/loader.cjs.js +2 -2
- package/dist/cjs/{utils-BYsLPHN1.js → utils-Dxx9WhWK.js} +3 -3
- package/dist/cjs/{utils-BYsLPHN1.js.map → utils-Dxx9WhWK.js.map} +1 -1
- package/dist/collection/collection-manifest.json +3 -0
- package/dist/collection/components/le-box/le-box.js +3 -3
- package/dist/collection/components/le-box/le-box.js.map +1 -1
- package/dist/collection/components/le-button/le-button.css +2 -2
- package/dist/collection/components/le-button/le-button.js +1 -1
- package/dist/collection/components/le-card/le-card.js +3 -3
- package/dist/collection/components/le-card/le-card.js.map +1 -1
- package/dist/collection/components/le-checkbox/le-checkbox.js +1 -1
- package/dist/collection/components/le-code-input/le-code-input.css +106 -0
- package/dist/collection/components/le-code-input/le-code-input.js +466 -0
- package/dist/collection/components/le-code-input/le-code-input.js.map +1 -0
- package/dist/collection/components/le-collapse/le-collapse.js +1 -1
- package/dist/collection/components/le-combobox/le-combobox.js +1 -1
- package/dist/collection/components/le-current-heading/le-current-heading.js +1 -1
- package/dist/collection/components/le-dropdown-base/le-dropdown-base.js +1 -1
- package/dist/collection/components/le-header/le-header.js +2 -2
- package/dist/collection/components/le-header-placeholder/le-header-placeholder.js +1 -1
- package/dist/collection/components/le-icon/le-icon.js +1 -1
- package/dist/collection/components/le-multiselect/le-multiselect.js +3 -3
- package/dist/collection/components/le-navigation/le-navigation.css +10 -4
- package/dist/collection/components/le-number-input/le-number-input.js +1 -1
- package/dist/collection/components/le-popover/le-popover.js +3 -3
- package/dist/collection/components/le-round-progress/le-round-progress.js +1 -1
- package/dist/collection/components/le-scroll-progress/le-scroll-progress.js +1 -1
- package/dist/collection/components/le-segmented-control/le-segmented-control.js +1 -1
- package/dist/collection/components/le-select/le-select.js +2 -2
- package/dist/collection/components/le-side-panel/le-side-panel.css +193 -0
- package/dist/collection/components/le-side-panel/le-side-panel.js +953 -0
- package/dist/collection/components/le-side-panel/le-side-panel.js.map +1 -0
- package/dist/collection/components/le-side-panel-toggle/le-side-panel-toggle.js +610 -0
- package/dist/collection/components/le-side-panel-toggle/le-side-panel-toggle.js.map +1 -0
- package/dist/collection/components/le-slot/le-slot.js +1 -1
- package/dist/collection/components/le-stack/le-stack.js +1 -1
- package/dist/collection/components/le-string-input/le-string-input.js +2 -2
- package/dist/collection/components/le-tab/le-tab.js +1 -1
- package/dist/collection/components/le-tab-bar/le-tab-bar.js +1 -1
- package/dist/collection/components/le-tab-panel/le-tab-panel.js +2 -2
- package/dist/collection/components/le-tabs/le-tabs.js +2 -2
- package/dist/collection/components/le-tag/le-tag.js +1 -1
- package/dist/collection/components/le-text/le-text.js +7 -7
- package/dist/collection/components/le-text/le-text.js.map +1 -1
- package/dist/collection/components/le-turntable/le-turntable.js +1 -1
- package/dist/collection/dist/components/assets/custom-elements.json +5288 -3895
- package/dist/collection/dist/components/assets/icons/side-panel.json +61 -0
- package/dist/collection/dist/themes/dark.css +1 -0
- package/dist/collection/dist/themes/default.css +1 -0
- package/dist/collection/dist/themes/gradient.css +1 -0
- package/dist/collection/dist/themes/minimal.css +1 -0
- package/dist/collection/dist/themes/warm.css +1 -0
- package/dist/components/assets/custom-elements.json +5288 -3895
- package/dist/components/assets/icons/side-panel.json +61 -0
- package/dist/components/index.js.map +1 -1
- package/dist/components/le-box.js +3 -3
- package/dist/components/le-box.js.map +1 -1
- package/dist/components/le-button2.js +8 -8
- package/dist/components/le-button2.js.map +1 -1
- package/dist/components/le-card.js +3 -3
- package/dist/components/le-card.js.map +1 -1
- package/dist/components/le-code-input.d.ts +11 -0
- package/dist/components/le-code-input.js +265 -0
- package/dist/components/le-code-input.js.map +1 -0
- package/dist/components/le-collapse2.js +1 -1
- package/dist/components/le-combobox.js +1 -1
- package/dist/components/le-current-heading.js +1 -1
- package/dist/components/le-dropdown-base2.js +1 -1
- package/dist/components/le-header-placeholder.js +1 -1
- package/dist/components/le-header.js +2 -2
- package/dist/components/le-icon2.js +1 -1
- package/dist/components/le-multiselect.js +3 -3
- package/dist/components/le-navigation.js +1 -1
- package/dist/components/le-navigation.js.map +1 -1
- package/dist/components/le-number-input.js +1 -1
- package/dist/components/le-popover2.js +3 -3
- package/dist/components/le-round-progress.js +1 -1
- package/dist/components/le-scroll-progress.js +1 -1
- package/dist/components/le-segmented-control.js +1 -1
- package/dist/components/le-side-panel-toggle.d.ts +11 -0
- package/dist/components/le-side-panel-toggle.js +9 -0
- package/dist/components/le-side-panel-toggle.js.map +1 -0
- package/dist/components/le-side-panel-toggle2.js +311 -0
- package/dist/components/le-side-panel-toggle2.js.map +1 -0
- package/dist/components/le-side-panel.d.ts +11 -0
- package/dist/components/le-side-panel.js +660 -0
- package/dist/components/le-side-panel.js.map +1 -0
- package/dist/components/le-stack.js +1 -1
- package/dist/components/le-tab-bar.js +1 -1
- package/dist/components/le-tab-panel.js +2 -2
- package/dist/components/le-tab2.js +1 -1
- package/dist/components/le-tabs.js +2 -2
- package/dist/components/le-tag2.js +1 -1
- package/dist/components/le-text.js +6 -6
- package/dist/components/le-text.js.map +1 -1
- package/dist/components/le-turntable.js +1 -1
- package/dist/docs.json +4829 -3121
- package/dist/esm/{index-C-Chwj1b.js → index-DFTm5BqT.js} +7 -4
- package/dist/esm/index-DFTm5BqT.js.map +1 -0
- package/dist/esm/index.js +2 -2
- package/dist/esm/le-bar_16.entry.js +21 -21
- package/dist/esm/le-box.entry.js +5 -5
- package/dist/esm/le-box.entry.js.map +1 -1
- package/dist/esm/le-card.entry.js +5 -5
- package/dist/esm/le-card.entry.js.map +1 -1
- package/dist/esm/le-code-input.entry.js +179 -0
- package/dist/esm/le-code-input.entry.js.map +1 -0
- package/dist/esm/le-combobox.entry.js +2 -2
- package/dist/esm/le-header-placeholder.entry.js +2 -2
- package/dist/esm/le-kit.js +3 -3
- package/dist/esm/le-multiselect.entry.js +4 -4
- package/dist/esm/le-number-input.entry.js +3 -3
- package/dist/esm/le-round-progress.entry.js +2 -2
- package/dist/esm/le-segmented-control.entry.js +2 -2
- package/dist/esm/le-side-panel-toggle.entry.js +227 -0
- package/dist/esm/le-side-panel-toggle.entry.js.map +1 -0
- package/dist/esm/le-side-panel.entry.js +544 -0
- package/dist/esm/le-side-panel.entry.js.map +1 -0
- package/dist/esm/le-stack.entry.js +3 -3
- package/dist/esm/le-tab-bar.entry.js +2 -2
- package/dist/esm/le-tab-panel.entry.js +3 -3
- package/dist/esm/le-tab.entry.js +3 -3
- package/dist/esm/le-tabs.entry.js +4 -4
- package/dist/esm/le-tag.entry.js +2 -2
- package/dist/esm/le-text.entry.js +8 -8
- package/dist/esm/le-text.entry.js.map +1 -1
- package/dist/esm/le-turntable.entry.js +2 -2
- package/dist/esm/loader.js +3 -3
- package/dist/esm/{utils-B3alHV04.js → utils-DZYCZLrF.js} +3 -3
- package/dist/esm/{utils-B3alHV04.js.map → utils-DZYCZLrF.js.map} +1 -1
- package/dist/le-kit/dist/components/assets/custom-elements.json +5288 -3895
- package/dist/le-kit/dist/components/assets/icons/side-panel.json +61 -0
- package/dist/le-kit/dist/themes/dark.css +1 -0
- package/dist/le-kit/dist/themes/default.css +1 -0
- package/dist/le-kit/dist/themes/gradient.css +1 -0
- package/dist/le-kit/dist/themes/minimal.css +1 -0
- package/dist/le-kit/dist/themes/warm.css +1 -0
- package/dist/le-kit/index.esm.js +1 -1
- package/dist/le-kit/le-kit.css +1 -1
- package/dist/le-kit/le-kit.esm.js +1 -1
- package/dist/le-kit/p-221d379a.entry.js +2 -0
- package/dist/le-kit/p-221d379a.entry.js.map +1 -0
- package/dist/le-kit/p-24112ca3.entry.js +2 -0
- package/dist/le-kit/{p-e1846fc2.entry.js.map → p-24112ca3.entry.js.map} +1 -1
- package/dist/le-kit/p-2c6d080d.entry.js +2 -0
- package/dist/le-kit/{p-3ceede4e.entry.js.map → p-2c6d080d.entry.js.map} +1 -1
- package/dist/le-kit/{p-ea71f22c.entry.js → p-46276e77.entry.js} +2 -2
- package/dist/le-kit/p-46276e77.entry.js.map +1 -0
- package/dist/le-kit/p-516c8531.entry.js +2 -0
- package/dist/le-kit/p-6b69f9a2.entry.js +2 -0
- package/dist/le-kit/{p-f8034500.entry.js.map → p-6b69f9a2.entry.js.map} +1 -1
- package/dist/le-kit/p-6d14306f.entry.js +2 -0
- package/dist/le-kit/{p-06d2d79c.entry.js.map → p-6d14306f.entry.js.map} +1 -1
- package/dist/le-kit/{p-2230ecd7.entry.js → p-7bcdf2d4.entry.js} +2 -2
- package/dist/le-kit/{p-3d22aeb2.entry.js → p-7cf1e23c.entry.js} +2 -2
- package/dist/le-kit/{p-e6b2cf9a.entry.js → p-85f2fd4d.entry.js} +2 -2
- package/dist/le-kit/p-98242429.entry.js +2 -0
- package/dist/le-kit/p-98242429.entry.js.map +1 -0
- package/dist/le-kit/{p-DFr88Szp.js → p-D8RYDS9p.js} +2 -2
- package/dist/le-kit/{p-DFr88Szp.js.map → p-D8RYDS9p.js.map} +1 -1
- package/dist/le-kit/{p-C-Chwj1b.js → p-DFTm5BqT.js} +3 -3
- package/dist/le-kit/p-DFTm5BqT.js.map +1 -0
- package/dist/le-kit/{p-68d836a3.entry.js → p-ab6c1def.entry.js} +2 -2
- package/dist/le-kit/{p-3d873cdb.entry.js → p-ae4ead64.entry.js} +2 -2
- package/dist/le-kit/{p-d161946c.entry.js → p-b05d4511.entry.js} +2 -2
- package/dist/le-kit/{p-923828fe.entry.js → p-b6ac02ff.entry.js} +2 -2
- package/dist/le-kit/p-c24769e2.entry.js +2 -0
- package/dist/le-kit/{p-33c2168a.entry.js.map → p-c24769e2.entry.js.map} +1 -1
- package/dist/le-kit/{p-be2a7276.entry.js → p-dc0445ad.entry.js} +2 -2
- package/dist/le-kit/p-eb5286f2.entry.js +2 -0
- package/dist/le-kit/p-eb5286f2.entry.js.map +1 -0
- package/dist/le-kit/p-eb710c8e.entry.js +2 -0
- package/dist/le-kit/p-eb710c8e.entry.js.map +1 -0
- package/dist/le-kit/{p-5d72c894.entry.js → p-f78b1ee6.entry.js} +2 -2
- package/dist/le-kit/p-f78b1ee6.entry.js.map +1 -0
- package/dist/themes/dark.css +1 -0
- package/dist/themes/default.css +1 -0
- package/dist/themes/gradient.css +1 -0
- package/dist/themes/minimal.css +1 -0
- package/dist/themes/warm.css +1 -0
- package/dist/types/components/le-code-input/le-code-input.d.ts +102 -0
- package/dist/types/components/le-side-panel/le-side-panel.d.ts +100 -0
- package/dist/types/components/le-side-panel-toggle/le-side-panel-toggle.d.ts +48 -0
- package/dist/types/components.d.ts +519 -2
- package/package.json +7 -5
- package/dist/cjs/index-BPF04Jvb.js.map +0 -1
- package/dist/esm/index-C-Chwj1b.js.map +0 -1
- package/dist/le-kit/p-05ccab91.entry.js +0 -2
- package/dist/le-kit/p-05ccab91.entry.js.map +0 -1
- package/dist/le-kit/p-06d2d79c.entry.js +0 -2
- package/dist/le-kit/p-33c2168a.entry.js +0 -2
- package/dist/le-kit/p-3ceede4e.entry.js +0 -2
- package/dist/le-kit/p-4a45ff67.entry.js +0 -2
- package/dist/le-kit/p-5d72c894.entry.js.map +0 -1
- package/dist/le-kit/p-C-Chwj1b.js.map +0 -1
- package/dist/le-kit/p-e1846fc2.entry.js +0 -2
- package/dist/le-kit/p-ea71f22c.entry.js.map +0 -1
- package/dist/le-kit/p-f8034500.entry.js +0 -2
- /package/dist/collection/components/le-box/{le-box.default.css → le-box.css} +0 -0
- /package/dist/collection/components/le-card/{le-card.default.css → le-card.css} +0 -0
- /package/dist/collection/components/le-text/{le-text.default.css → le-text.css} +0 -0
- /package/dist/le-kit/{p-4a45ff67.entry.js.map → p-516c8531.entry.js.map} +0 -0
- /package/dist/le-kit/{p-2230ecd7.entry.js.map → p-7bcdf2d4.entry.js.map} +0 -0
- /package/dist/le-kit/{p-3d22aeb2.entry.js.map → p-7cf1e23c.entry.js.map} +0 -0
- /package/dist/le-kit/{p-e6b2cf9a.entry.js.map → p-85f2fd4d.entry.js.map} +0 -0
- /package/dist/le-kit/{p-68d836a3.entry.js.map → p-ab6c1def.entry.js.map} +0 -0
- /package/dist/le-kit/{p-3d873cdb.entry.js.map → p-ae4ead64.entry.js.map} +0 -0
- /package/dist/le-kit/{p-d161946c.entry.js.map → p-b05d4511.entry.js.map} +0 -0
- /package/dist/le-kit/{p-923828fe.entry.js.map → p-b6ac02ff.entry.js.map} +0 -0
- /package/dist/le-kit/{p-be2a7276.entry.js.map → p-dc0445ad.entry.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"file":"le-side-panel.js","mappings":"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","names":["LeSidePanel","__stencil_proxyCustomElement"],"sources":["src/components/le-side-panel/le-side-panel.css?tag=le-side-panel&encapsulation=shadow","src/components/le-side-panel/le-side-panel.tsx"],"sourcesContent":[":host {\n display: block;\n height: 100%;\n\n /* Default values */\n --le-side-panel-width: 280px;\n --le-side-panel-margin: 0px;\n --le-side-panel-backdrop: var(--le-color-backdrop);\n --le-side-panel-border-radius: var(--le-radius-lg);\n}\n\n.host {\n position: relative;\n height: 100%;\n min-height: 0;\n}\n\n.layout {\n display: flex;\n align-items: stretch;\n min-width: 0;\n height: 100%;\n min-height: 0;\n}\n\n.layout.start {\n flex-direction: row;\n}\n\n.layout.end {\n flex-direction: row-reverse;\n}\n\n.inlinePanel {\n flex: 0 0 auto;\n width: var(--le-side-panel-width);\n min-width: 0;\n height: 100%;\n overflow: hidden;\n transition: width var(--le-side-panel-transition, var(--le-transition-normal));\n}\n\n.inlinePanel.hidden {\n width: 0;\n}\n\n.inlinePanel .panel {\n transform: translateX(0);\n opacity: 1;\n transition:\n transform var(--le-side-panel-transition, var(--le-transition-normal)),\n opacity var(--le-side-panel-transition, var(--le-transition-normal));\n}\n\n.layout.start .inlinePanel.hidden .panel {\n transform: translateX(-100%);\n opacity: 0;\n pointer-events: none;\n}\n\n.layout.end .inlinePanel.hidden .panel {\n transform: translateX(100%);\n opacity: 0;\n pointer-events: none;\n}\n\n.content {\n flex: 1 1 auto;\n min-width: 0;\n height: 100%;\n min-height: 0;\n}\n\n.panel {\n position: relative;\n height: 100%;\n max-height: min(calc(100% - (var(--le-side-panel-margin) * 2)), calc(100vh - (var(--le-side-panel-margin) * 2)));\n margin: var(--le-side-panel-margin);\n border-radius: var(--le-side-panel-border-radius);\n\n background: var(--le-color-surface, #fff);\n color: var(--le-color-text, #000);\n\n border-right: 1px solid var(--le-color-border, rgba(0, 0, 0, 0.12));\n box-sizing: border-box;\n}\n\n.panel.end {\n border-right: 0;\n border-left: 1px solid var(--le-color-border, rgba(0, 0, 0, 0.12));\n}\n\n.panel-scroller {\n height: 100%;\n overflow: auto;\n}\n\n.close {\n position: absolute;\n top: 4px;\n right: 4px;\n z-index: 1;\n\n border: 0;\n border-radius: 6px;\n\n background: transparent;\n color: inherit;\n cursor: pointer;\n}\n\n.handle {\n position: absolute;\n top: 0;\n bottom: 0;\n width: 10px;\n cursor: col-resize;\n}\n\n.handle.start {\n right: -5px;\n}\n\n.handle.end {\n left: -5px;\n}\n\n/* Overlay (contained within component) */\n.overlayRoot {\n position: absolute;\n inset: 0;\n background: var(--le-side-panel-backdrop);\n z-index: var(--le-z-modal-backdrop, 1040);\n\n opacity: 0;\n pointer-events: none;\n transition: opacity var(--le-side-panel-transition, var(--le-transition-normal));\n\n height: 100%;\n}\n\n.overlayRoot.visible {\n opacity: 1;\n pointer-events: auto;\n}\n\n.overlayPanelWrap {\n position: absolute;\n top: 0;\n bottom: 0;\n width: min(100%, var(--le-side-panel-width));\n\n height: 100%;\n\n z-index: var(--le-z-modal, 1050);\n\n display: flex;\n align-items: stretch;\n}\n\n.overlayPanelWrap.start {\n left: 0;\n transform: translateX(-100%);\n}\n\n.overlayPanelWrap.end {\n right: 0;\n transform: translateX(100%);\n}\n\n.overlayPanelWrap.visible.start,\n.overlayPanelWrap.visible.end {\n transform: translateX(0);\n}\n\n.overlayPanelWrap {\n transition: transform var(--le-side-panel-transition, var(--le-transition-normal));\n}\n\n/* Disable transitions while dragging */\n.host[data-resizing='true'] .panel,\n.host[data-resizing='true'] .overlayPanelWrap,\n.host[data-resizing='true'] .inlinePanel {\n transition: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .overlayPanelWrap,\n .overlayRoot,\n .inlinePanel {\n transition: none;\n }\n}\n","import {\n Build,\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Listen,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\n\nexport type LeSidePanelSide = 'start' | 'end';\nexport type LeSidePanelNarrowBehavior = 'overlay' | 'push';\nexport type LeSidePanelToggleAction = 'toggle' | 'open' | 'close';\n\nexport type LeSidePanelRequestToggleDetail = {\n panelId?: string;\n action: LeSidePanelToggleAction;\n};\n\ntype PersistedSidePanelState = {\n width?: number;\n collapsed?: boolean;\n};\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\nfunction readCssVariablePixels(varName: string): number | undefined {\n if (!Build.isBrowser) {\n return undefined;\n }\n const v = getComputedStyle(document.documentElement).getPropertyValue(varName).trim();\n if (!v) {\n return undefined;\n }\n const parsed = Number.parseFloat(v);\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nfunction parseCollapseAtPx(value?: string): number | undefined {\n if (!value) {\n return undefined;\n }\n const trimmed = value.trim();\n if (!trimmed) {\n return undefined;\n }\n\n if (trimmed.startsWith('--')) {\n const fromVar = readCssVariablePixels(trimmed);\n return fromVar;\n }\n\n const numeric = Number.parseFloat(trimmed);\n return Number.isFinite(numeric) ? numeric : undefined;\n}\n\n@Component({\n tag: 'le-side-panel',\n styleUrl: 'le-side-panel.css',\n shadow: true,\n})\nexport class LeSidePanel {\n @Element() el: HTMLElement;\n\n /**\n * Optional id used to match toggle requests.\n * If set, the panel only responds to toggle events with the same `panelId`.\n */\n @Prop() panelId?: string;\n\n /** Which side the panel is attached to. */\n @Prop() side: LeSidePanelSide = 'start';\n\n /** Width breakpoint (in px or a CSS var like `--le-breakpoint-md`) below which the panel enters \"narrow\" mode. */\n @Prop() collapseAt?: string;\n\n /** Behavior when in narrow mode. */\n @Prop() narrowBehavior: LeSidePanelNarrowBehavior = 'overlay';\n\n /**\n * Panel open state for narrow mode.\n * - overlay: controls modal drawer visibility\n * - push: controls whether panel is shown (non-modal)\n */\n @Prop({ mutable: true, reflect: true }) open: boolean = false;\n\n /** Panel collapsed state for wide mode (fully hidden). */\n @Prop({ mutable: true, reflect: true }) collapsed: boolean = false;\n\n /** Default panel width in pixels. */\n @Prop() panelWidth: number = 280;\n\n /** Minimum allowed width when resizable. */\n @Prop() minPanelWidth: number = 220;\n\n /** Maximum allowed width when resizable. */\n @Prop() maxPanelWidth: number = 420;\n\n /** Allows users to resize the panel by dragging its edge. */\n @Prop() resizable: boolean = false;\n\n /** When set, panel width + collapsed state are persisted in localStorage. */\n @Prop() persistKey?: string;\n\n /** Show a close button inside the panel (primarily used in narrow overlay mode). */\n @Prop() showCloseButton: boolean = true;\n\n /** When crossing to wide mode, automatically show the panel (collapsed=false). */\n @Prop() autoShowOnWide: boolean = true;\n\n /** When crossing to narrow mode, automatically hide the panel (open=false). */\n @Prop() autoHideOnNarrow: boolean = true;\n\n /** Accessible label for the panel navigation region. */\n @Prop() panelLabel: string = 'Navigation';\n\n @Event({ eventName: 'leSidePanelOpenChange', bubbles: true, composed: true })\n leSidePanelOpenChange: EventEmitter<{ open: boolean; panelId?: string }>;\n\n @Event({ eventName: 'leSidePanelCollapsedChange', bubbles: true, composed: true })\n leSidePanelCollapsedChange: EventEmitter<{ collapsed: boolean; panelId?: string }>;\n\n @Event({ eventName: 'leSidePanelWidthChange', bubbles: true, composed: true })\n leSidePanelWidthChange: EventEmitter<{ width: number; panelId?: string }>;\n\n @State() private isNarrow: boolean = false;\n @State() private responsiveReady: boolean = false;\n @State() private overlayMounted: boolean = false;\n @State() private overlayVisible: boolean = false;\n @State() private currentWidthPx: number = this.panelWidth;\n @State() private resizing: boolean = false;\n\n private resizeObserver?: ResizeObserver;\n private panelEl?: HTMLElement;\n private overlayWrapEl?: HTMLElement;\n private focusedBeforeOpen?: HTMLElement | null;\n\n private dragPointerId?: number;\n private dragStartX?: number;\n private dragStartWidth?: number;\n\n connectedCallback() {\n this.restorePersistedState();\n this.currentWidthPx = clamp(\n this.currentWidthPx || this.panelWidth,\n this.minPanelWidth,\n this.maxPanelWidth,\n );\n\n if (Build.isBrowser && 'ResizeObserver' in window) {\n this.resizeObserver = new ResizeObserver(() => {\n this.recomputeNarrow();\n });\n this.resizeObserver.observe(this.el);\n }\n\n // Ensure we get at least one post-layout measurement.\n if (Build.isBrowser) {\n requestAnimationFrame(() => this.recomputeNarrow());\n }\n }\n\n componentWillLoad() {\n this.recomputeNarrow();\n }\n\n disconnectedCallback() {\n this.resizeObserver?.disconnect();\n this.teardownDragListeners();\n }\n\n private isModalOverlayActive(): boolean {\n return this.isNarrow && this.narrowBehavior === 'overlay' && this.open;\n }\n\n private syncOverlayToState() {\n const shouldUseOverlay = this.isNarrow && this.narrowBehavior === 'overlay';\n if (!shouldUseOverlay) {\n this.overlayVisible = false;\n this.overlayMounted = false;\n return;\n }\n\n if (this.open) {\n if (!this.overlayMounted) {\n this.overlayMounted = true;\n this.overlayVisible = false;\n requestAnimationFrame(() => {\n if (this.isNarrow && this.narrowBehavior === 'overlay' && this.open) {\n this.overlayVisible = true;\n this.focusFirstInsidePanel();\n }\n });\n }\n return;\n }\n\n // Closed: allow unmount to be handled by transition end / fallback timeout.\n this.overlayVisible = false;\n }\n\n @Watch('panelWidth')\n protected onPanelWidthChanged() {\n if (!Number.isFinite(this.panelWidth)) {\n return;\n }\n if (!this.resizing) {\n this.currentWidthPx = clamp(this.panelWidth, this.minPanelWidth, this.maxPanelWidth);\n this.persistState();\n }\n }\n\n @Watch('collapsed')\n protected onCollapsedChanged() {\n this.persistState();\n this.leSidePanelCollapsedChange.emit({ collapsed: this.collapsed, panelId: this.panelId });\n }\n\n @Watch('open')\n protected onOpenChanged(newValue: boolean) {\n const shouldUseOverlay = this.isNarrow && this.narrowBehavior === 'overlay';\n\n if (!shouldUseOverlay) {\n this.persistState();\n this.leSidePanelOpenChange.emit({ open: this.open, panelId: this.panelId });\n return;\n }\n\n if (newValue) {\n this.focusedBeforeOpen = (document.activeElement as HTMLElement) || null;\n this.overlayMounted = true;\n this.overlayVisible = false;\n requestAnimationFrame(() => {\n this.overlayVisible = true;\n this.focusFirstInsidePanel();\n });\n } else {\n this.overlayVisible = false;\n this.persistState();\n this.restoreFocusAfterClose();\n\n // Fallback: if transitionend doesn't fire, ensure overlay unmounts.\n // (e.g. interrupted transitions or unusual browser behavior)\n window.setTimeout(() => {\n const shouldUseOverlay = this.isNarrow && this.narrowBehavior === 'overlay';\n if (shouldUseOverlay && !this.open && !this.overlayVisible) {\n this.overlayMounted = false;\n }\n }, 350);\n }\n\n this.leSidePanelOpenChange.emit({ open: this.open, panelId: this.panelId });\n }\n\n @Watch('collapseAt')\n @Watch('narrowBehavior')\n protected onResponsivePropChanged() {\n this.recomputeNarrow();\n }\n\n @Listen('keydown', { target: 'document', capture: true })\n protected onDocumentKeyDown(ev: KeyboardEvent) {\n if (!Build.isBrowser) {\n return;\n }\n if (!this.isModalOverlayActive()) {\n return;\n }\n\n if (ev.key === 'Escape') {\n ev.preventDefault();\n ev.stopPropagation();\n this.open = false;\n return;\n }\n\n if (ev.key !== 'Tab') {\n return;\n }\n\n const panel = this.panelEl;\n if (!panel) {\n return;\n }\n\n const focusables = this.getFocusableElements(panel);\n if (focusables.length === 0) {\n ev.preventDefault();\n try {\n panel.focus();\n } catch {\n // ignore\n }\n return;\n }\n\n const first = focusables[0];\n const last = focusables[focusables.length - 1];\n const active = document.activeElement as HTMLElement | null;\n\n if (ev.shiftKey) {\n if (!active || active === first || !panel.contains(active)) {\n ev.preventDefault();\n try {\n last.focus();\n } catch {\n // ignore\n }\n }\n } else {\n if (active === last) {\n ev.preventDefault();\n try {\n first.focus();\n } catch {\n // ignore\n }\n }\n }\n }\n\n @Listen('leSidePanelRequestToggle', { target: 'document' })\n protected onToggleRequest(ev: CustomEvent<LeSidePanelRequestToggleDetail>) {\n const detail = ev.detail;\n if (!detail || !detail.action) {\n return;\n }\n\n // panelId matching rules:\n // - If this panel has panelId: respond only when detail.panelId matches.\n // - If this panel has no panelId: respond only when detail.panelId is empty.\n const requestedId = detail.panelId || '';\n const myId = this.panelId || '';\n if (myId !== requestedId) {\n return;\n }\n\n if (this.isNarrow) {\n this.applyActionToOpen(detail.action);\n } else {\n this.applyActionToCollapsed(detail.action);\n }\n }\n\n private applyActionToOpen(action: LeSidePanelToggleAction) {\n if (action === 'open') {\n this.open = true;\n return;\n }\n if (action === 'close') {\n this.open = false;\n return;\n }\n this.open = !this.open;\n }\n\n private applyActionToCollapsed(action: LeSidePanelToggleAction) {\n if (action === 'open') {\n this.collapsed = false;\n return;\n }\n if (action === 'close') {\n this.collapsed = true;\n return;\n }\n this.collapsed = !this.collapsed;\n }\n\n private recomputeNarrow() {\n const collapseAtPx = parseCollapseAtPx(this.collapseAt);\n if (!collapseAtPx) {\n this.isNarrow = false;\n this.responsiveReady = true;\n this.syncOverlayToState();\n return;\n }\n\n const width = this.el.clientWidth;\n\n // If we can't measure yet (common on first paint), don't guess a mode.\n // This prevents a brief \"wide\" flash before ResizeObserver kicks in.\n if (!(width > 0)) {\n this.responsiveReady = false;\n return;\n }\n\n this.responsiveReady = true;\n const nextIsNarrow = width < collapseAtPx;\n\n const prevIsNarrow = this.isNarrow;\n this.isNarrow = nextIsNarrow;\n\n if (prevIsNarrow !== nextIsNarrow) {\n if (nextIsNarrow) {\n if (this.autoHideOnNarrow) {\n this.open = false;\n }\n } else {\n // entering wide mode\n this.open = false;\n this.overlayVisible = false;\n this.overlayMounted = false;\n\n if (this.autoShowOnWide) {\n this.collapsed = false;\n }\n }\n }\n\n this.syncOverlayToState();\n }\n\n private restorePersistedState() {\n if (!Build.isBrowser || !this.persistKey) {\n return;\n }\n try {\n const raw = window.localStorage.getItem(this.persistKey);\n if (!raw) {\n return;\n }\n const parsed = JSON.parse(raw) as PersistedSidePanelState;\n if (typeof parsed.width === 'number' && Number.isFinite(parsed.width)) {\n this.currentWidthPx = parsed.width;\n }\n if (typeof parsed.collapsed === 'boolean') {\n this.collapsed = parsed.collapsed;\n }\n } catch {\n // ignore\n }\n }\n\n private persistState() {\n if (!Build.isBrowser || !this.persistKey) {\n return;\n }\n const payload: PersistedSidePanelState = {\n width: this.currentWidthPx,\n collapsed: this.collapsed,\n };\n try {\n window.localStorage.setItem(this.persistKey, JSON.stringify(payload));\n } catch {\n // ignore\n }\n }\n\n private focusFirstInsidePanel() {\n if (!Build.isBrowser) {\n return;\n }\n\n const root = this.panelEl;\n if (!root) {\n return;\n }\n\n const candidates = this.getFocusableElements(root);\n for (const el of candidates) {\n if (el.hasAttribute('disabled')) {\n continue;\n }\n const tabindex = el.getAttribute('tabindex');\n if (tabindex === '-1') {\n continue;\n }\n try {\n el.focus();\n return;\n } catch {\n // ignore\n }\n }\n }\n\n private getFocusableElements(root: HTMLElement): HTMLElement[] {\n const selector = 'button,[href],input,select,textarea,[tabindex]:not([tabindex=\"-1\"])';\n const all = Array.from(root.querySelectorAll<HTMLElement>(selector));\n return all.filter(el => {\n if (el.hasAttribute('disabled')) {\n return false;\n }\n const tabindex = el.getAttribute('tabindex');\n if (tabindex === '-1') {\n return false;\n }\n return true;\n });\n }\n\n private restoreFocusAfterClose() {\n if (!Build.isBrowser) {\n return;\n }\n const prev = this.focusedBeforeOpen;\n this.focusedBeforeOpen = null;\n if (prev && document.contains(prev)) {\n try {\n prev.focus();\n } catch {\n // ignore\n }\n }\n }\n\n private onOverlayTransitionEnd = (ev: TransitionEvent) => {\n if (ev.target !== this.overlayWrapEl) {\n return;\n }\n if (ev.propertyName !== 'transform') {\n return;\n }\n\n const shouldUseOverlay = this.isNarrow && this.narrowBehavior === 'overlay';\n if (!shouldUseOverlay) {\n return;\n }\n\n if (!this.open && !this.overlayVisible) {\n this.overlayMounted = false;\n }\n };\n\n private onOverlayPointerDown = (ev: PointerEvent) => {\n // Close on any click outside the panel.\n const panel = this.panelEl;\n if (!panel) {\n return;\n }\n const path = ev.composedPath();\n if (!path.includes(panel)) {\n this.open = false;\n }\n };\n\n private startResizeDrag = (ev: PointerEvent) => {\n if (!this.resizable) {\n return;\n }\n // No resizing if fully hidden.\n if (!this.isNarrow && this.collapsed) {\n return;\n }\n if (this.isNarrow && this.narrowBehavior === 'overlay' && !this.open) {\n return;\n }\n if (this.isNarrow && this.narrowBehavior === 'push' && !this.open) {\n return;\n }\n\n this.resizing = true;\n this.dragPointerId = ev.pointerId;\n this.dragStartX = ev.clientX;\n this.dragStartWidth = this.currentWidthPx;\n\n (ev.currentTarget as HTMLElement)?.setPointerCapture?.(ev.pointerId);\n\n window.addEventListener('pointermove', this.onResizeDragMove, { passive: false });\n window.addEventListener('pointerup', this.onResizeDragEnd, { passive: true });\n window.addEventListener('pointercancel', this.onResizeDragEnd, { passive: true });\n };\n\n private onResizeDragMove = (ev: PointerEvent) => {\n if (!this.resizing || this.dragPointerId !== ev.pointerId) {\n return;\n }\n ev.preventDefault();\n\n const startX = this.dragStartX ?? ev.clientX;\n const startWidth = this.dragStartWidth ?? this.currentWidthPx;\n\n const delta = ev.clientX - startX;\n const dir = this.side === 'start' ? 1 : -1;\n const nextWidth = clamp(startWidth + delta * dir, this.minPanelWidth, this.maxPanelWidth);\n this.currentWidthPx = nextWidth;\n this.leSidePanelWidthChange.emit({ width: this.currentWidthPx, panelId: this.panelId });\n };\n\n private onResizeDragEnd = (ev: PointerEvent) => {\n if (!this.resizing || this.dragPointerId !== ev.pointerId) {\n return;\n }\n\n this.resizing = false;\n this.dragPointerId = undefined;\n this.dragStartX = undefined;\n this.dragStartWidth = undefined;\n\n this.teardownDragListeners();\n this.persistState();\n this.leSidePanelWidthChange.emit({ width: this.currentWidthPx, panelId: this.panelId });\n };\n\n private teardownDragListeners() {\n window.removeEventListener('pointermove', this.onResizeDragMove as any);\n window.removeEventListener('pointerup', this.onResizeDragEnd as any);\n window.removeEventListener('pointercancel', this.onResizeDragEnd as any);\n }\n\n private renderPanelInner(opts?: { renderPanelSlot?: boolean }) {\n const renderPanelSlot = opts?.renderPanelSlot ?? true;\n const showClose = this.showCloseButton && this.isNarrow && this.narrowBehavior === 'overlay';\n const tabIndex = this.isNarrow && this.narrowBehavior === 'overlay' ? -1 : null;\n\n return (\n <div\n class={{\n panel: true,\n start: this.side === 'start',\n end: this.side === 'end',\n resizing: this.resizing,\n }}\n part=\"panel\"\n ref={el => (this.panelEl = el as HTMLElement)}\n role=\"navigation\"\n aria-label={this.panelLabel}\n tabindex={tabIndex as any}\n >\n {showClose ? (\n <le-side-panel-toggle\n panel-id=\"demo-side\"\n action=\"toggle\"\n shortcut=\"Mod+B\"\n variant=\"clear\"\n class=\"close\"\n part=\"close-button\"\n aria-label=\"Close panel\"\n icon-only=\"true\"\n style={{\n '--le-button-icon-only-padding': 'var(--le-space-sm)',\n }}\n onClick={() => (this.open = false)}\n >\n <slot name=\"close-icon\" slot=\"icon-only\">\n <le-icon name=\"side-panel\" />\n </slot>\n </le-side-panel-toggle>\n ) : null}\n\n <div class=\"panel-scroller\" part=\"panel-scroller\">\n {renderPanelSlot ? <slot name=\"panel\" /> : null}\n </div>\n\n {this.resizable ? (\n <div\n class={{\n handle: true,\n start: this.side === 'start',\n end: this.side === 'end',\n }}\n part=\"resize-handle\"\n role=\"separator\"\n aria-orientation=\"vertical\"\n tabindex={-1}\n onPointerDown={this.startResizeDrag}\n />\n ) : null}\n </div>\n );\n }\n\n render() {\n const widthStyle = {\n '--le-side-panel-width': `${this.currentWidthPx}px`,\n };\n\n const isOverlay = this.isNarrow && this.narrowBehavior === 'overlay';\n const isModalOverlayOpen = isOverlay && this.open;\n\n const allowPanel = this.responsiveReady;\n\n const showWidePanel = allowPanel && !this.isNarrow && !this.collapsed;\n const showNarrowPushPanel =\n allowPanel && this.isNarrow && this.narrowBehavior === 'push' && this.open;\n\n const layoutHasInlinePanel = showWidePanel || showNarrowPushPanel;\n\n return (\n <div\n class={{\n host: true,\n narrow: this.isNarrow,\n wide: !this.isNarrow,\n overlay: isOverlay,\n push: !isOverlay,\n collapsed: !this.isNarrow && this.collapsed,\n }}\n style={widthStyle as any}\n data-resizing={this.resizing ? 'true' : null}\n >\n {/* Wide + narrow push layout */}\n <div\n class={{\n 'layout': true,\n 'has-panel': layoutHasInlinePanel,\n 'start': this.side === 'start',\n 'end': this.side === 'end',\n }}\n >\n <div\n class={{\n inlinePanel: true,\n hidden: !layoutHasInlinePanel,\n }}\n aria-hidden={!layoutHasInlinePanel ? 'true' : null}\n >\n {/* In narrow overlay mode, only the overlay should own the named slot. */}\n {this.renderPanelInner({ renderPanelSlot: !isOverlay })}\n </div>\n\n <div class=\"content\" part=\"content\" aria-hidden={isModalOverlayOpen ? 'true' : null}>\n <slot />\n </div>\n </div>\n\n {/* Narrow overlay modal (contained within this component) */}\n {allowPanel && isOverlay && this.overlayMounted ? (\n <div\n class={{ overlayRoot: true, visible: this.overlayVisible }}\n part=\"scrim\"\n role=\"presentation\"\n onPointerDown={this.onOverlayPointerDown}\n aria-hidden={isModalOverlayOpen ? null : 'true'}\n >\n <div\n class={{\n overlayPanelWrap: true,\n visible: this.overlayVisible,\n start: this.side === 'start',\n end: this.side === 'end',\n }}\n part=\"overlay\"\n ref={el => (this.overlayWrapEl = el as HTMLElement)}\n onTransitionEnd={this.onOverlayTransitionEnd}\n role=\"dialog\"\n aria-modal=\"true\"\n >\n {this.renderPanelInner({ renderPanelSlot: true })}\n </div>\n </div>\n ) : null}\n </div>\n );\n }\n}\n"],"version":3}
|
|
@@ -131,7 +131,7 @@ const LeStack$1 = /*@__PURE__*/ proxyCustomElement(class LeStack extends HTMLEle
|
|
|
131
131
|
});
|
|
132
132
|
// Slot style for admin mode - make items display in the same direction
|
|
133
133
|
const slotStyle = `display: flex; flex-direction: ${this.getFlexDirection()}; gap: ${this.gap || 'var(--le-space-md)'}; flex-wrap: ${this.wrap ? 'wrap' : 'nowrap'}; justify-content: ${this.getJustifyContent()}; align-items: ${this.getAlignItems()};`;
|
|
134
|
-
return (h("le-component", { key: '
|
|
134
|
+
return (h("le-component", { key: '465b00b5165b3c19f0043f5ffaab5081464692dc', component: "le-stack", hostClass: hostClass }, h("div", { key: '1787122eea7ee7f2986581ef8ab3c65068ef799f', class: "stack", part: "stack", style: style }, h("le-slot", { key: '5be191bf1ea7d4edc2f27a6f97e57a038dc8cc94', name: "", description: `Items arranged ${this.direction}ly${this.maxItems ? ` (max ${this.maxItems})` : ''}`, type: "slot", "allowed-components": "le-text,le-box,le-card,le-button,le-stack", slotStyle: slotStyle }, h("slot", { key: '9b11206293f60733a0c59de456513088373ce245' })))));
|
|
135
135
|
}
|
|
136
136
|
static get style() { return leStackDefaultCss(); }
|
|
137
137
|
}, [769, "le-stack", {
|
|
@@ -231,7 +231,7 @@ const LeTabBar$1 = /*@__PURE__*/ proxyCustomElement(class LeTabBar extends HTMLE
|
|
|
231
231
|
'position-top': this.position === 'top',
|
|
232
232
|
'position-bottom': this.position === 'bottom',
|
|
233
233
|
};
|
|
234
|
-
return (h(Host, { key: '
|
|
234
|
+
return (h(Host, { key: '71b1a2d80884dc9a494edf55b28bfa178b44f284', class: classes }, h("le-component", { key: 'a09f1adff893b3b1f7c2f2ea0115133df906153f', component: "le-tab-bar" }, h("div", { key: 'f9b3046469fcaf0a3164fc5bb2038d54916dcb83', class: "tablist", role: "tablist", "aria-orientation": "horizontal", part: "tablist", onKeyDown: this.handleKeyDown }, h("le-slot", { key: '2a4ef6c858a7a0c8d9d2942d68183887153101c3', name: "", type: "slot", allowedComponents: "le-tab" }, tabConfigs.map(tab => {
|
|
235
235
|
const value = this.getTabValue(tab);
|
|
236
236
|
const isSelected = value === selected;
|
|
237
237
|
return (h("le-tab", { key: value, class: "tab", role: "tab", variant: "icon-only", label: tab.label, value: tab.value, icon: tab.icon, href: tab.href, selected: isSelected, disabled: tab.disabled, showLabel: this.showLabels, size: size, part: isSelected ? 'tab tab-active' : 'tab', "aria-selected": isSelected ? 'true' : 'false', "aria-disabled": tab.disabled ? 'true' : undefined, tabIndex: -1, onClick: () => this.handleTabClick(tab) }, h("span", { class: "tab-label" }, tab.label)));
|
|
@@ -89,11 +89,11 @@ const LeTabPanel$1 = /*@__PURE__*/ proxyCustomElement(class LeTabPanel extends H
|
|
|
89
89
|
}
|
|
90
90
|
render() {
|
|
91
91
|
const shouldRender = this.shouldRenderContent();
|
|
92
|
-
return (h("le-component", { key: '
|
|
92
|
+
return (h("le-component", { key: '1315534f32fe8cc7f2ff1c0ec0457d30514064d4', component: "le-tab-panel" }, h("div", { key: '7544225e28b3be3e09269a669676515dc4ad097c', class: {
|
|
93
93
|
'tab-panel': true,
|
|
94
94
|
'active': this.active,
|
|
95
95
|
'lazy-hidden': this.lazy && !this.active,
|
|
96
|
-
}, role: "tabpanel", "aria-hidden": !this.active ? 'true' : undefined, tabIndex: this.active ? 0 : -1 }, h("le-slot", { key: '
|
|
96
|
+
}, role: "tabpanel", "aria-hidden": !this.active ? 'true' : undefined, tabIndex: this.active ? 0 : -1 }, h("le-slot", { key: 'a686c87a4e5a62a6befb425141bd96b59273ec6b', name: "", description: "Tab panel content", type: "slot" }, shouldRender && h("slot", { key: '76bd67392762a5ddbf8124c5596c6cb37ecf44fa' })))));
|
|
97
97
|
}
|
|
98
98
|
static get watchers() { return {
|
|
99
99
|
"active": ["activeChanged"]
|
|
@@ -132,7 +132,7 @@ const LeTab = /*@__PURE__*/ proxyCustomElement(class LeTab extends HTMLElement {
|
|
|
132
132
|
const attrs = this.href
|
|
133
133
|
? { href: this.href, target: this.target, role: 'button' }
|
|
134
134
|
: { disabled: this.disabled };
|
|
135
|
-
return (h(Host, { key: '
|
|
135
|
+
return (h(Host, { key: 'a539044017f98ddaa7636df1457b669f56c19d94' }, h("le-component", { key: 'b6df3e0738be09d00f3cd802b3cd06af4402e746', component: "le-tab" }, h(TagType, { key: 'a37f2d404da74b5b0d99bbb0b9ff57121903ee2d', class: classnames('le-tab-container', `le-tab-align-${this.align}`, classes), part: "button", ...attrs, onClick: this.handleClick, tabIndex: this.focusable ? 0 : -1 }, this.icon !== undefined ? (h("div", { class: "icon-only" }, h("div", { class: "icon" }, this.icon), this.showLabel && h("span", { class: "icon-label" }, this.label))) : (h(Fragment, null, h("span", { class: "le-tab-label" }, this.iconStart && (h("span", { class: "icon-start", part: "icon-start" }, this.iconStart)), h("le-slot", { name: "", description: "Tab text", type: "text", class: "content", part: "content" }, h("slot", null, this.label))), this.iconEnd && (h("span", { class: "icon-end", part: "icon-end" }, this.iconEnd))))))));
|
|
136
136
|
}
|
|
137
137
|
static get style() { return leTabCss(); }
|
|
138
138
|
}, [769, "le-tab", {
|
|
@@ -279,7 +279,7 @@ const LeTabs$1 = /*@__PURE__*/ proxyCustomElement(class LeTabs extends HTMLEleme
|
|
|
279
279
|
: this.position === 'start'
|
|
280
280
|
? 'top'
|
|
281
281
|
: 'bottom';
|
|
282
|
-
return (h("le-component", { key: '
|
|
282
|
+
return (h("le-component", { key: '9a92363db43231088e476bca66dbbf47f26ebf34', component: "le-tabs", hostClass: classnames(classes) }, h("div", { key: '3c14f3367e2b281090721e5521bfa8a3b53f5b97', class: classes }, h("div", { key: 'cd4aad46f9a8e1ec5760f9388a0c4149556bfb06', class: {
|
|
283
283
|
'tablist': true,
|
|
284
284
|
'wrap-tabs': this.wrap,
|
|
285
285
|
[`overflow-${this.overflow}`]: true,
|
|
@@ -288,7 +288,7 @@ const LeTabs$1 = /*@__PURE__*/ proxyCustomElement(class LeTabs extends HTMLEleme
|
|
|
288
288
|
const tabId = `tab-${config.value}`;
|
|
289
289
|
const panelId = `panel-${config.value}`;
|
|
290
290
|
return (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 }, h("span", { class: "tab-label" }, config.label)));
|
|
291
|
-
})), h("div", { key: '
|
|
291
|
+
})), h("div", { key: '0b34e9ab8ce8f0e31ad9392bc3a6a60c92a0aa00', class: "panels", part: "panels" }, isDeclarativeMode ? (
|
|
292
292
|
// Declarative mode - render slot for le-tab-panel children
|
|
293
293
|
h("le-slot", { name: "", description: "Tab panels", type: "slot", allowedComponents: "le-tab-panel" }, h("slot", null))) : (
|
|
294
294
|
// Programmatic mode - render named slots
|
|
@@ -64,7 +64,7 @@ const LeTag = /*@__PURE__*/ proxyCustomElement(class LeTag extends HTMLElement {
|
|
|
64
64
|
return h("span", { class: "tag-icon" }, this.icon);
|
|
65
65
|
}
|
|
66
66
|
render() {
|
|
67
|
-
return (h("le-component", { key: '
|
|
67
|
+
return (h("le-component", { key: '8c76ae38877bbb3ba35588adadee0cf61b76ffed', component: "le-tag" }, h("span", { key: 'a2dd1709505e58baada6fb9b40312e207435e8a6', class: "tag" }, this.renderIcon(), h("span", { key: '99bac5f6df170af17de5550b9f0489538e9760bc', class: "tag-label" }, h("le-slot", { key: '41740e400b168986980e8ff93187af9828cca5f9', name: "", tag: "span", type: "text" }, h("slot", { key: 'd823f3dc74c1e49b89fe5fff2df9d7e244d7d591' }, this.label))), this.dismissible && (h("button", { key: '96a058e3cab2d7fb091e1e6ec77404f8cf80358c', type: "button", class: "tag-dismiss", onClick: this.handleDismiss, disabled: this.disabled, "aria-label": "Remove" }, h("svg", { key: 'bfbb3f7c73aef6f06f5c45e98d4047d2aa629f2c', viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", "stroke-width": "2" }, h("path", { key: '16a68b9458ccd806415d5ef8bda7fa1513cdf46d', d: "M4 4l8 8M12 4l-8 8" })))))));
|
|
68
68
|
}
|
|
69
69
|
static get style() { return leTagCss(); }
|
|
70
70
|
}, [769, "le-tag", {
|
|
@@ -4,7 +4,7 @@ import { d as defineCustomElement$2, a as defineCustomElement$3, b as defineCust
|
|
|
4
4
|
import { d as defineCustomElement$7 } from './le-dropdown-base2.js';
|
|
5
5
|
import { d as defineCustomElement$6 } from './le-popover2.js';
|
|
6
6
|
|
|
7
|
-
const
|
|
7
|
+
const leTextCss = () => `:host{display:block}:host([hidden]){display:none}.le-text{margin:0;color:var(--le-text-color, var(--le-color-text));font-family:var(--le-font-family);line-height:var(--le-text-line-height, 1.5)}.variant-p{font-size:var(--le-font-size-base, 1rem);font-weight:var(--le-font-weight-normal, 400);color:var(--le-color-text)}.variant-h1{font-size:var(--le-font-size-4xl, 2.5rem);font-weight:var(--le-font-weight-bold, 700);line-height:1.2;color:var(--le-color-text);letter-spacing:-0.02em}.variant-h2{font-size:var(--le-font-size-3xl, 2rem);font-weight:var(--le-font-weight-bold, 700);line-height:1.25;color:var(--le-color-text);letter-spacing:-0.01em}.variant-h3{font-size:var(--le-font-size-2xl, 1.5rem);font-weight:var(--le-font-weight-semibold, 600);line-height:1.3;color:var(--le-color-text)}.variant-h4{font-size:var(--le-font-size-xl, 1.25rem);font-weight:var(--le-font-weight-semibold, 600);line-height:1.35;color:var(--le-color-text)}.variant-h5{font-size:var(--le-font-size-lg, 1.125rem);font-weight:var(--le-font-weight-medium, 500);line-height:1.4;color:var(--le-color-text)}.variant-h6{font-size:var(--le-font-size-base, 1rem);font-weight:var(--le-font-weight-medium, 500);line-height:1.45;color:var(--le-color-text);text-transform:uppercase;letter-spacing:0.05em}.variant-code{font-family:var(--le-font-family-mono, 'SF Mono', 'Fira Code', 'Consolas', monospace);font-size:var(--le-font-size-sm, 0.875rem);background:var(--le-color-surface-alt, #f5f5f5);padding:var(--le-space-md);border-radius:var(--le-radius-md);overflow-x:auto;white-space:pre-wrap;color:var(--le-color-text)}.variant-quote{font-size:var(--le-font-size-lg, 1.125rem);font-style:italic;color:var(--le-color-text-secondary);border-left:4px solid var(--le-color-primary);padding-left:var(--le-space-lg);margin-left:0;margin-right:0}.variant-label{font-size:var(--le-font-size-sm, 0.875rem);font-weight:var(--le-font-weight-medium, 500);color:var(--le-color-text-secondary);text-transform:uppercase;letter-spacing:0.05em}.variant-small{font-size:var(--le-font-size-sm, 0.875rem);color:var(--le-color-text-secondary)}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.truncate.max-lines-2,.truncate.max-lines-3,.truncate.max-lines-4,.truncate.max-lines-5{white-space:normal;display:-webkit-box;-webkit-box-orient:vertical}.truncate.max-lines-2{-webkit-line-clamp:2;line-clamp:2}.truncate.max-lines-3{-webkit-line-clamp:3;line-clamp:3}.truncate.max-lines-4{-webkit-line-clamp:4;line-clamp:4}.truncate.max-lines-5{-webkit-line-clamp:5;line-clamp:5}:host([align="center"]) .le-text{text-align:center}:host([align="right"]) .le-text{text-align:right}:host([align="justify"]) .le-text{text-align:justify}.le-text a{color:var(--le-color-primary);text-decoration:underline}.le-text a:hover{color:var(--le-color-primary-dark)}.le-text strong,.le-text b{font-weight:var(--le-font-weight-bold, 700)}.le-text em,.le-text i{font-style:italic}.le-text u{text-decoration:underline}.le-text s,.le-text strike{text-decoration:line-through}`;
|
|
8
8
|
|
|
9
9
|
const LeText$1 = /*@__PURE__*/ proxyCustomElement(class LeText extends HTMLElement {
|
|
10
10
|
constructor(registerHost) {
|
|
@@ -70,7 +70,7 @@ const LeText$1 = /*@__PURE__*/ proxyCustomElement(class LeText extends HTMLEleme
|
|
|
70
70
|
slotRef;
|
|
71
71
|
disconnectModeObserver;
|
|
72
72
|
connectedCallback() {
|
|
73
|
-
this.disconnectModeObserver = observeModeChanges(this.el,
|
|
73
|
+
this.disconnectModeObserver = observeModeChanges(this.el, mode => {
|
|
74
74
|
const wasAdmin = this.adminMode;
|
|
75
75
|
this.adminMode = mode === 'admin';
|
|
76
76
|
if (this.adminMode && !wasAdmin) {
|
|
@@ -289,7 +289,7 @@ const LeText$1 = /*@__PURE__*/ proxyCustomElement(class LeText extends HTMLEleme
|
|
|
289
289
|
* Render the formatting toolbar
|
|
290
290
|
*/
|
|
291
291
|
renderToolbar() {
|
|
292
|
-
return (h("div", { class: "le-text-toolbar" }, h("select", { class: "le-text-toolbar-select", onChange: this.changeVariant, onMouseDown:
|
|
292
|
+
return (h("div", { class: "le-text-toolbar" }, h("select", { class: "le-text-toolbar-select", onChange: this.changeVariant, onMouseDown: e => e.preventDefault() }, h("option", { value: "p", selected: this.variant === 'p' }, "Paragraph"), h("option", { value: "h1", selected: this.variant === 'h1' }, "Heading 1"), h("option", { value: "h2", selected: this.variant === 'h2' }, "Heading 2"), h("option", { value: "h3", selected: this.variant === 'h3' }, "Heading 3"), h("option", { value: "h4", selected: this.variant === 'h4' }, "Heading 4"), h("option", { value: "h5", selected: this.variant === 'h5' }, "Heading 5"), h("option", { value: "h6", selected: this.variant === 'h6' }, "Heading 6"), h("option", { value: "quote", selected: this.variant === 'quote' }, "Quote"), h("option", { value: "code", selected: this.variant === 'code' }, "Code"), h("option", { value: "label", selected: this.variant === 'label' }, "Label"), h("option", { value: "small", selected: this.variant === 'small' }, "Small")), h("div", { class: "le-text-toolbar-divider" }), h("button", { type: "button", class: { 'le-text-toolbar-btn': true, 'active': this.selectionState.isBold }, onMouseDown: this.toggleBold, title: "Bold (Ctrl+B)" }, h("strong", null, "B")), h("button", { type: "button", class: { 'le-text-toolbar-btn': true, 'active': this.selectionState.isItalic }, onMouseDown: this.toggleItalic, title: "Italic (Ctrl+I)" }, h("em", null, "I")), h("button", { type: "button", class: { 'le-text-toolbar-btn': true, 'active': this.selectionState.isUnderline }, onMouseDown: this.toggleUnderline, title: "Underline (Ctrl+U)" }, h("span", { style: { textDecoration: 'underline' } }, "U")), h("button", { type: "button", class: { 'le-text-toolbar-btn': true, 'active': this.selectionState.isStrikethrough }, onMouseDown: this.toggleStrikethrough, title: "Strikethrough" }, h("span", { style: { textDecoration: 'line-through' } }, "S")), h("div", { class: "le-text-toolbar-divider" }), h("button", { type: "button", class: { 'le-text-toolbar-btn': true, 'active': this.selectionState.isLink }, onMouseDown: this.toggleLink, title: this.selectionState.isLink ? 'Remove link' : 'Add link' }, "\uD83D\uDD17")));
|
|
293
293
|
}
|
|
294
294
|
/**
|
|
295
295
|
* Get the semantic tag for the current variant
|
|
@@ -325,15 +325,15 @@ const LeText$1 = /*@__PURE__*/ proxyCustomElement(class LeText extends HTMLEleme
|
|
|
325
325
|
};
|
|
326
326
|
// Admin mode - show rich text editor
|
|
327
327
|
if (this.adminMode) {
|
|
328
|
-
return (h(Host, { class: "admin-mode" }, h("le-component", { component: "le-text" }, h("div", { class: "le-text-editor-wrapper" }, this.isFocused && this.renderToolbar(), h(Tag, { class: textClass, part: "text", style: textStyle }, h("div", { ref:
|
|
328
|
+
return (h(Host, { class: "admin-mode" }, h("le-component", { component: "le-text" }, h("div", { class: "le-text-editor-wrapper" }, this.isFocused && this.renderToolbar(), h(Tag, { class: textClass, part: "text", style: textStyle }, h("div", { ref: el => (this.editorRef = el), class: "le-text-editor", contentEditable: true, onInput: this.handleInput, onFocus: this.handleFocus, onBlur: this.handleBlur, onKeyUp: this.handleSelectionChange, onMouseUp: this.handleSelectionChange, innerHTML: this.content })), h("div", { class: "hidden-slot" }, h("slot", { ref: el => (this.slotRef = el), onSlotchange: () => this.readSlottedContent() }))))));
|
|
329
329
|
}
|
|
330
330
|
// Default mode - render semantic element with slotted content
|
|
331
|
-
return (h(Host, null, h(Tag, { class: textClass, part: "text", style: textStyle }, h("slot", { ref:
|
|
331
|
+
return (h(Host, null, h(Tag, { class: textClass, part: "text", style: textStyle }, h("slot", { ref: el => (this.slotRef = el) }))));
|
|
332
332
|
}
|
|
333
333
|
static get watchers() { return {
|
|
334
334
|
"variant": ["onVariantChange"]
|
|
335
335
|
}; }
|
|
336
|
-
static get style() { return
|
|
336
|
+
static get style() { return leTextCss(); }
|
|
337
337
|
}, [769, "le-text", {
|
|
338
338
|
"variant": [1537],
|
|
339
339
|
"align": [513],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"file":"le-text.js","mappings":"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","names":["LeText","__stencil_proxyCustomElement"],"sources":["src/components/le-text/le-text.default.css?tag=le-text&encapsulation=shadow","src/components/le-text/le-text.tsx"],"sourcesContent":["/**\n * le-text default styles\n *\n * Semantic text element with variant-based styling\n */\n\n:host {\n display: block;\n}\n\n:host([hidden]) {\n display: none;\n}\n\n/* Base text styles */\n.le-text {\n margin: 0;\n color: var(--le-text-color, var(--le-color-text));\n font-family: var(--le-font-family);\n line-height: var(--le-text-line-height, 1.5);\n}\n\n/* Paragraph */\n.variant-p {\n font-size: var(--le-font-size-base, 1rem);\n font-weight: var(--le-font-weight-normal, 400);\n color: var(--le-color-text);\n}\n\n/* Headings */\n.variant-h1 {\n font-size: var(--le-font-size-4xl, 2.5rem);\n font-weight: var(--le-font-weight-bold, 700);\n line-height: 1.2;\n color: var(--le-color-text);\n letter-spacing: -0.02em;\n}\n\n.variant-h2 {\n font-size: var(--le-font-size-3xl, 2rem);\n font-weight: var(--le-font-weight-bold, 700);\n line-height: 1.25;\n color: var(--le-color-text);\n letter-spacing: -0.01em;\n}\n\n.variant-h3 {\n font-size: var(--le-font-size-2xl, 1.5rem);\n font-weight: var(--le-font-weight-semibold, 600);\n line-height: 1.3;\n color: var(--le-color-text);\n}\n\n.variant-h4 {\n font-size: var(--le-font-size-xl, 1.25rem);\n font-weight: var(--le-font-weight-semibold, 600);\n line-height: 1.35;\n color: var(--le-color-text);\n}\n\n.variant-h5 {\n font-size: var(--le-font-size-lg, 1.125rem);\n font-weight: var(--le-font-weight-medium, 500);\n line-height: 1.4;\n color: var(--le-color-text);\n}\n\n.variant-h6 {\n font-size: var(--le-font-size-base, 1rem);\n font-weight: var(--le-font-weight-medium, 500);\n line-height: 1.45;\n color: var(--le-color-text);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n}\n\n/* Code */\n.variant-code {\n font-family: var(--le-font-family-mono, 'SF Mono', 'Fira Code', 'Consolas', monospace);\n font-size: var(--le-font-size-sm, 0.875rem);\n background: var(--le-color-surface-alt, #f5f5f5);\n padding: var(--le-space-md);\n border-radius: var(--le-radius-md);\n overflow-x: auto;\n white-space: pre-wrap;\n color: var(--le-color-text);\n}\n\n/* Quote */\n.variant-quote {\n font-size: var(--le-font-size-lg, 1.125rem);\n font-style: italic;\n color: var(--le-color-text-secondary);\n border-left: 4px solid var(--le-color-primary);\n padding-left: var(--le-space-lg);\n margin-left: 0;\n margin-right: 0;\n}\n\n/* Label */\n.variant-label {\n font-size: var(--le-font-size-sm, 0.875rem);\n font-weight: var(--le-font-weight-medium, 500);\n color: var(--le-color-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n}\n\n/* Small */\n.variant-small {\n font-size: var(--le-font-size-sm, 0.875rem);\n color: var(--le-color-text-secondary);\n}\n\n/* Truncation */\n.truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.truncate.max-lines-2,\n.truncate.max-lines-3,\n.truncate.max-lines-4,\n.truncate.max-lines-5 {\n white-space: normal;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n}\n\n.truncate.max-lines-2 { -webkit-line-clamp: 2; line-clamp: 2; }\n.truncate.max-lines-3 { -webkit-line-clamp: 3; line-clamp: 3; }\n.truncate.max-lines-4 { -webkit-line-clamp: 4; line-clamp: 4; }\n.truncate.max-lines-5 { -webkit-line-clamp: 5; line-clamp: 5; }\n\n/* Alignment */\n:host([align=\"center\"]) .le-text { text-align: center; }\n:host([align=\"right\"]) .le-text { text-align: right; }\n:host([align=\"justify\"]) .le-text { text-align: justify; }\n\n/* Links inside text */\n.le-text a {\n color: var(--le-color-primary);\n text-decoration: underline;\n}\n\n.le-text a:hover {\n color: var(--le-color-primary-dark);\n}\n\n/* Bold, italic, etc. */\n.le-text strong,\n.le-text b {\n font-weight: var(--le-font-weight-bold, 700);\n}\n\n.le-text em,\n.le-text i {\n font-style: italic;\n}\n\n.le-text u {\n text-decoration: underline;\n}\n\n.le-text s,\n.le-text strike {\n text-decoration: line-through;\n}\n","import { Component, Prop, State, h, Host, Element, Watch } from '@stencil/core';\nimport { observeModeChanges } from '../../utils/utils';\n\n/**\n * A text component with rich text editing capabilities in admin mode.\n *\n * `le-text` renders semantic text elements (headings, paragraphs, code, quotes)\n * and provides a Notion-like rich text editor in admin mode with formatting\n * toolbar for bold, italic, links, and paragraph type selection.\n *\n * @slot - Default slot for text content\n *\n * @cssprop --le-text-color - Text color\n * @cssprop --le-text-font-size - Font size\n * @cssprop --le-text-line-height - Line height\n * @cssprop --le-text-font-weight - Font weight\n *\n * @csspart text - The text container element\n *\n * @cmsEditable true\n * @cmsCategory Content\n */\n@Component({\n tag: 'le-text',\n styleUrl: 'le-text.default.css',\n shadow: true,\n})\nexport class LeText {\n @Element() el: HTMLElement;\n\n /**\n * The semantic variant/type of text element\n * @allowedValues p | h1 | h2 | h3 | h4 | h5 | h6 | code | quote | label | small\n */\n @Prop({ mutable: true, reflect: true }) variant: 'p' | 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'code' | 'quote' | 'label' | 'small' = 'p';\n\n /**\n * Text alignment\n * @allowedValues left | center | right | justify\n */\n @Prop({ reflect: true }) align: 'left' | 'center' | 'right' | 'justify' = 'left';\n\n /**\n * Text color (CSS value or theme token)\n */\n @Prop() color?: string;\n\n /**\n * Whether the text should truncate with ellipsis\n */\n @Prop() truncate: boolean = false;\n\n /**\n * Maximum number of lines before truncating (requires truncate=true)\n */\n @Prop() maxLines?: number;\n\n /**\n * Internal state to track admin mode\n */\n @State() private adminMode: boolean = false;\n\n /**\n * The HTML content being edited\n */\n @State() private content: string = '';\n\n /**\n * Whether the editor is focused (shows toolbar)\n */\n @State() private isFocused: boolean = false;\n\n /**\n * Current selection state for toolbar button highlighting\n */\n @State() private selectionState: SelectionState = {\n isBold: false,\n isItalic: false,\n isUnderline: false,\n isStrikethrough: false,\n isLink: false,\n blockType: 'p',\n };\n\n /**\n * Reference to the contenteditable element\n */\n private editorRef?: HTMLDivElement;\n\n /**\n * Reference to the slot element\n */\n private slotRef?: HTMLSlotElement;\n\n private disconnectModeObserver?: () => void;\n\n connectedCallback() {\n this.disconnectModeObserver = observeModeChanges(this.el, (mode) => {\n const wasAdmin = this.adminMode;\n this.adminMode = mode === 'admin';\n \n if (this.adminMode && !wasAdmin) {\n // Entering admin mode - read content from slot\n requestAnimationFrame(() => this.readSlottedContent());\n } else if (!this.adminMode && wasAdmin) {\n // Leaving admin mode - sync content back to slot\n this.syncContentToSlot();\n }\n });\n }\n\n disconnectedCallback() {\n this.disconnectModeObserver?.();\n }\n\n @Watch('variant')\n onVariantChange() {\n // When variant changes in admin mode, update the content wrapper\n if (this.adminMode && this.editorRef) {\n this.syncContentToSlot();\n }\n }\n\n /**\n * Read content from slotted elements\n */\n private readSlottedContent() {\n if (!this.slotRef) return;\n \n const assignedNodes = this.slotRef.assignedNodes({ flatten: true });\n \n // Collect all content from assigned nodes\n let html = '';\n assignedNodes.forEach(node => {\n if (node.nodeType === Node.TEXT_NODE) {\n html += node.textContent;\n } else if (node.nodeType === Node.ELEMENT_NODE) {\n html += (node as Element).innerHTML || node.textContent;\n }\n });\n \n this.content = html.trim();\n }\n\n /**\n * Sync edited content back to the slot\n */\n private syncContentToSlot() {\n if (!this.editorRef) return;\n \n const newContent = this.editorRef.innerHTML;\n \n // Update the light DOM content\n // We need to update the actual slotted content\n const slot = this.slotRef;\n if (slot) {\n const assignedNodes = slot.assignedNodes({ flatten: true });\n if (assignedNodes.length > 0) {\n const firstNode = assignedNodes[0];\n if (firstNode.nodeType === Node.ELEMENT_NODE) {\n (firstNode as Element).innerHTML = newContent;\n } else if (firstNode.nodeType === Node.TEXT_NODE) {\n // Replace text node with the new content\n const parent = firstNode.parentNode;\n if (parent) {\n // Create a temporary element to parse HTML\n const temp = document.createElement('span');\n temp.innerHTML = newContent;\n // Replace the text node\n parent.replaceChild(temp, firstNode);\n // Unwrap the span if it only contains text\n if (temp.childNodes.length === 1 && temp.firstChild?.nodeType === Node.TEXT_NODE) {\n parent.replaceChild(temp.firstChild, temp);\n }\n }\n }\n } else {\n // No assigned nodes, set innerHTML on the host's light DOM\n this.el.innerHTML = newContent;\n }\n }\n }\n\n /**\n * Handle input in the contenteditable\n */\n private handleInput = () => {\n if (this.editorRef) {\n this.content = this.editorRef.innerHTML;\n this.updateSelectionState();\n }\n };\n\n /**\n * Handle focus on the editor\n */\n private handleFocus = () => {\n this.isFocused = true;\n this.updateSelectionState();\n };\n\n /**\n * Handle blur on the editor\n */\n private handleBlur = (e: FocusEvent) => {\n // Check if focus moved to toolbar\n const relatedTarget = e.relatedTarget as HTMLElement;\n const toolbar = this.el.shadowRoot?.querySelector('.le-text-toolbar');\n \n if (toolbar?.contains(relatedTarget)) {\n // Focus moved to toolbar, keep it open\n return;\n }\n \n // Small delay to allow toolbar clicks to register\n setTimeout(() => {\n if (!this.el.shadowRoot?.activeElement) {\n this.isFocused = false;\n this.syncContentToSlot();\n }\n }, 150);\n };\n\n /**\n * Handle selection change to update toolbar state\n */\n private handleSelectionChange = () => {\n this.updateSelectionState();\n };\n\n /**\n * Update the selection state for toolbar highlighting\n */\n private updateSelectionState() {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return;\n\n this.selectionState = {\n isBold: document.queryCommandState('bold'),\n isItalic: document.queryCommandState('italic'),\n isUnderline: document.queryCommandState('underline'),\n isStrikethrough: document.queryCommandState('strikeThrough'),\n isLink: this.isSelectionInLink(selection),\n blockType: this.variant,\n };\n }\n\n /**\n * Check if current selection is within a link\n */\n private isSelectionInLink(selection: Selection): boolean {\n if (!selection.anchorNode) return false;\n \n let node: Node | null = selection.anchorNode;\n while (node && node !== this.editorRef) {\n if (node.nodeName === 'A') return true;\n node = node.parentNode;\n }\n return false;\n }\n\n /**\n * Execute a formatting command\n */\n private execCommand(command: string, value?: string) {\n // Focus the editor first\n this.editorRef?.focus();\n \n // Execute the command\n document.execCommand(command, false, value);\n \n // Update state\n this.handleInput();\n this.updateSelectionState();\n }\n\n /**\n * Toggle bold formatting\n */\n private toggleBold = (e: Event) => {\n e.preventDefault();\n this.execCommand('bold');\n };\n\n /**\n * Toggle italic formatting\n */\n private toggleItalic = (e: Event) => {\n e.preventDefault();\n this.execCommand('italic');\n };\n\n /**\n * Toggle underline formatting\n */\n private toggleUnderline = (e: Event) => {\n e.preventDefault();\n this.execCommand('underline');\n };\n\n /**\n * Toggle strikethrough formatting\n */\n private toggleStrikethrough = (e: Event) => {\n e.preventDefault();\n this.execCommand('strikeThrough');\n };\n\n /**\n * Add or edit a link\n */\n private toggleLink = (e: Event) => {\n e.preventDefault();\n \n if (this.selectionState.isLink) {\n // Remove link\n this.execCommand('unlink');\n } else {\n // Add link\n const url = prompt('Enter URL:', 'https://');\n if (url) {\n this.execCommand('createLink', url);\n }\n }\n };\n\n /**\n * Change the block type/variant\n */\n private changeVariant = (e: Event) => {\n const select = e.target as HTMLSelectElement;\n this.variant = select.value as typeof this.variant;\n };\n\n /**\n * Render the formatting toolbar\n */\n private renderToolbar() {\n return (\n <div class=\"le-text-toolbar\">\n <select \n class=\"le-text-toolbar-select\"\n onChange={this.changeVariant}\n onMouseDown={(e) => e.preventDefault()}\n >\n <option value=\"p\" selected={this.variant === 'p'}>Paragraph</option>\n <option value=\"h1\" selected={this.variant === 'h1'}>Heading 1</option>\n <option value=\"h2\" selected={this.variant === 'h2'}>Heading 2</option>\n <option value=\"h3\" selected={this.variant === 'h3'}>Heading 3</option>\n <option value=\"h4\" selected={this.variant === 'h4'}>Heading 4</option>\n <option value=\"h5\" selected={this.variant === 'h5'}>Heading 5</option>\n <option value=\"h6\" selected={this.variant === 'h6'}>Heading 6</option>\n <option value=\"quote\" selected={this.variant === 'quote'}>Quote</option>\n <option value=\"code\" selected={this.variant === 'code'}>Code</option>\n <option value=\"label\" selected={this.variant === 'label'}>Label</option>\n <option value=\"small\" selected={this.variant === 'small'}>Small</option>\n </select>\n \n <div class=\"le-text-toolbar-divider\"></div>\n \n <button\n type=\"button\"\n class={{ 'le-text-toolbar-btn': true, 'active': this.selectionState.isBold }}\n onMouseDown={this.toggleBold}\n title=\"Bold (Ctrl+B)\"\n >\n <strong>B</strong>\n </button>\n \n <button\n type=\"button\"\n class={{ 'le-text-toolbar-btn': true, 'active': this.selectionState.isItalic }}\n onMouseDown={this.toggleItalic}\n title=\"Italic (Ctrl+I)\"\n >\n <em>I</em>\n </button>\n \n <button\n type=\"button\"\n class={{ 'le-text-toolbar-btn': true, 'active': this.selectionState.isUnderline }}\n onMouseDown={this.toggleUnderline}\n title=\"Underline (Ctrl+U)\"\n >\n <span style={{ textDecoration: 'underline' }}>U</span>\n </button>\n \n <button\n type=\"button\"\n class={{ 'le-text-toolbar-btn': true, 'active': this.selectionState.isStrikethrough }}\n onMouseDown={this.toggleStrikethrough}\n title=\"Strikethrough\"\n >\n <span style={{ textDecoration: 'line-through' }}>S</span>\n </button>\n \n <div class=\"le-text-toolbar-divider\"></div>\n \n <button\n type=\"button\"\n class={{ 'le-text-toolbar-btn': true, 'active': this.selectionState.isLink }}\n onMouseDown={this.toggleLink}\n title={this.selectionState.isLink ? 'Remove link' : 'Add link'}\n >\n 🔗\n </button>\n </div>\n );\n }\n\n /**\n * Get the semantic tag for the current variant\n */\n private getTag(): string {\n switch (this.variant) {\n case 'quote':\n return 'blockquote';\n case 'code':\n return 'pre';\n case 'label':\n return 'label';\n case 'small':\n return 'small';\n default:\n return this.variant; // h1-h6, p\n }\n }\n\n render() {\n const Tag = this.getTag();\n \n const textStyle: { [key: string]: string } = {};\n if (this.color) {\n textStyle.color = this.color;\n }\n if (this.align) {\n textStyle.textAlign = this.align;\n }\n\n const textClass = {\n 'le-text': true,\n [`variant-${this.variant}`]: true,\n 'truncate': this.truncate,\n [`max-lines-${this.maxLines}`]: this.truncate && this.maxLines,\n };\n\n // Admin mode - show rich text editor\n if (this.adminMode) {\n return (\n <Host class=\"admin-mode\">\n <le-component component=\"le-text\">\n <div class=\"le-text-editor-wrapper\">\n {this.isFocused && this.renderToolbar()}\n <Tag \n class={textClass}\n part=\"text\"\n style={textStyle}\n >\n <div\n ref={(el) => this.editorRef = el}\n class=\"le-text-editor\"\n contentEditable={true}\n onInput={this.handleInput}\n onFocus={this.handleFocus}\n onBlur={this.handleBlur}\n onKeyUp={this.handleSelectionChange}\n onMouseUp={this.handleSelectionChange}\n innerHTML={this.content}\n ></div>\n </Tag>\n {/* Hidden slot to receive light DOM content */}\n <div class=\"hidden-slot\">\n <slot \n ref={(el) => this.slotRef = el as HTMLSlotElement}\n onSlotchange={() => this.readSlottedContent()}\n ></slot>\n </div>\n </div>\n </le-component>\n </Host>\n );\n }\n\n // Default mode - render semantic element with slotted content\n return (\n <Host>\n <Tag \n class={textClass}\n part=\"text\"\n style={textStyle}\n >\n <slot ref={(el) => this.slotRef = el as HTMLSlotElement}></slot>\n </Tag>\n </Host>\n );\n }\n}\n\n/**\n * Selection state for toolbar\n */\ninterface SelectionState {\n isBold: boolean;\n isItalic: boolean;\n isUnderline: boolean;\n isStrikethrough: boolean;\n isLink: boolean;\n blockType: string;\n}\n"],"version":3}
|
|
1
|
+
{"file":"le-text.js","mappings":"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","names":["LeText","__stencil_proxyCustomElement"],"sources":["src/components/le-text/le-text.css?tag=le-text&encapsulation=shadow","src/components/le-text/le-text.tsx"],"sourcesContent":["/**\n * le-text default styles\n *\n * Semantic text element with variant-based styling\n */\n\n:host {\n display: block;\n}\n\n:host([hidden]) {\n display: none;\n}\n\n/* Base text styles */\n.le-text {\n margin: 0;\n color: var(--le-text-color, var(--le-color-text));\n font-family: var(--le-font-family);\n line-height: var(--le-text-line-height, 1.5);\n}\n\n/* Paragraph */\n.variant-p {\n font-size: var(--le-font-size-base, 1rem);\n font-weight: var(--le-font-weight-normal, 400);\n color: var(--le-color-text);\n}\n\n/* Headings */\n.variant-h1 {\n font-size: var(--le-font-size-4xl, 2.5rem);\n font-weight: var(--le-font-weight-bold, 700);\n line-height: 1.2;\n color: var(--le-color-text);\n letter-spacing: -0.02em;\n}\n\n.variant-h2 {\n font-size: var(--le-font-size-3xl, 2rem);\n font-weight: var(--le-font-weight-bold, 700);\n line-height: 1.25;\n color: var(--le-color-text);\n letter-spacing: -0.01em;\n}\n\n.variant-h3 {\n font-size: var(--le-font-size-2xl, 1.5rem);\n font-weight: var(--le-font-weight-semibold, 600);\n line-height: 1.3;\n color: var(--le-color-text);\n}\n\n.variant-h4 {\n font-size: var(--le-font-size-xl, 1.25rem);\n font-weight: var(--le-font-weight-semibold, 600);\n line-height: 1.35;\n color: var(--le-color-text);\n}\n\n.variant-h5 {\n font-size: var(--le-font-size-lg, 1.125rem);\n font-weight: var(--le-font-weight-medium, 500);\n line-height: 1.4;\n color: var(--le-color-text);\n}\n\n.variant-h6 {\n font-size: var(--le-font-size-base, 1rem);\n font-weight: var(--le-font-weight-medium, 500);\n line-height: 1.45;\n color: var(--le-color-text);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n}\n\n/* Code */\n.variant-code {\n font-family: var(--le-font-family-mono, 'SF Mono', 'Fira Code', 'Consolas', monospace);\n font-size: var(--le-font-size-sm, 0.875rem);\n background: var(--le-color-surface-alt, #f5f5f5);\n padding: var(--le-space-md);\n border-radius: var(--le-radius-md);\n overflow-x: auto;\n white-space: pre-wrap;\n color: var(--le-color-text);\n}\n\n/* Quote */\n.variant-quote {\n font-size: var(--le-font-size-lg, 1.125rem);\n font-style: italic;\n color: var(--le-color-text-secondary);\n border-left: 4px solid var(--le-color-primary);\n padding-left: var(--le-space-lg);\n margin-left: 0;\n margin-right: 0;\n}\n\n/* Label */\n.variant-label {\n font-size: var(--le-font-size-sm, 0.875rem);\n font-weight: var(--le-font-weight-medium, 500);\n color: var(--le-color-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n}\n\n/* Small */\n.variant-small {\n font-size: var(--le-font-size-sm, 0.875rem);\n color: var(--le-color-text-secondary);\n}\n\n/* Truncation */\n.truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.truncate.max-lines-2,\n.truncate.max-lines-3,\n.truncate.max-lines-4,\n.truncate.max-lines-5 {\n white-space: normal;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n}\n\n.truncate.max-lines-2 { -webkit-line-clamp: 2; line-clamp: 2; }\n.truncate.max-lines-3 { -webkit-line-clamp: 3; line-clamp: 3; }\n.truncate.max-lines-4 { -webkit-line-clamp: 4; line-clamp: 4; }\n.truncate.max-lines-5 { -webkit-line-clamp: 5; line-clamp: 5; }\n\n/* Alignment */\n:host([align=\"center\"]) .le-text { text-align: center; }\n:host([align=\"right\"]) .le-text { text-align: right; }\n:host([align=\"justify\"]) .le-text { text-align: justify; }\n\n/* Links inside text */\n.le-text a {\n color: var(--le-color-primary);\n text-decoration: underline;\n}\n\n.le-text a:hover {\n color: var(--le-color-primary-dark);\n}\n\n/* Bold, italic, etc. */\n.le-text strong,\n.le-text b {\n font-weight: var(--le-font-weight-bold, 700);\n}\n\n.le-text em,\n.le-text i {\n font-style: italic;\n}\n\n.le-text u {\n text-decoration: underline;\n}\n\n.le-text s,\n.le-text strike {\n text-decoration: line-through;\n}\n","import { Component, Prop, State, h, Host, Element, Watch } from '@stencil/core';\nimport { observeModeChanges } from '../../utils/utils';\n\n/**\n * A text component with rich text editing capabilities in admin mode.\n *\n * `le-text` renders semantic text elements (headings, paragraphs, code, quotes)\n * and provides a Notion-like rich text editor in admin mode with formatting\n * toolbar for bold, italic, links, and paragraph type selection.\n *\n * @slot - Default slot for text content\n *\n * @cssprop --le-text-color - Text color\n * @cssprop --le-text-font-size - Font size\n * @cssprop --le-text-line-height - Line height\n * @cssprop --le-text-font-weight - Font weight\n *\n * @csspart text - The text container element\n *\n * @cmsEditable true\n * @cmsCategory Content\n */\n@Component({\n tag: 'le-text',\n styleUrl: 'le-text.css',\n shadow: true,\n})\nexport class LeText {\n @Element() el: HTMLElement;\n\n /**\n * The semantic variant/type of text element\n * @allowedValues p | h1 | h2 | h3 | h4 | h5 | h6 | code | quote | label | small\n */\n @Prop({ mutable: true, reflect: true }) variant:\n | 'p'\n | 'h1'\n | 'h2'\n | 'h3'\n | 'h4'\n | 'h5'\n | 'h6'\n | 'code'\n | 'quote'\n | 'label'\n | 'small' = 'p';\n\n /**\n * Text alignment\n * @allowedValues left | center | right | justify\n */\n @Prop({ reflect: true }) align: 'left' | 'center' | 'right' | 'justify' = 'left';\n\n /**\n * Text color (CSS value or theme token)\n */\n @Prop() color?: string;\n\n /**\n * Whether the text should truncate with ellipsis\n */\n @Prop() truncate: boolean = false;\n\n /**\n * Maximum number of lines before truncating (requires truncate=true)\n */\n @Prop() maxLines?: number;\n\n /**\n * Internal state to track admin mode\n */\n @State() private adminMode: boolean = false;\n\n /**\n * The HTML content being edited\n */\n @State() private content: string = '';\n\n /**\n * Whether the editor is focused (shows toolbar)\n */\n @State() private isFocused: boolean = false;\n\n /**\n * Current selection state for toolbar button highlighting\n */\n @State() private selectionState: SelectionState = {\n isBold: false,\n isItalic: false,\n isUnderline: false,\n isStrikethrough: false,\n isLink: false,\n blockType: 'p',\n };\n\n /**\n * Reference to the contenteditable element\n */\n private editorRef?: HTMLDivElement;\n\n /**\n * Reference to the slot element\n */\n private slotRef?: HTMLSlotElement;\n\n private disconnectModeObserver?: () => void;\n\n connectedCallback() {\n this.disconnectModeObserver = observeModeChanges(this.el, mode => {\n const wasAdmin = this.adminMode;\n this.adminMode = mode === 'admin';\n\n if (this.adminMode && !wasAdmin) {\n // Entering admin mode - read content from slot\n requestAnimationFrame(() => this.readSlottedContent());\n } else if (!this.adminMode && wasAdmin) {\n // Leaving admin mode - sync content back to slot\n this.syncContentToSlot();\n }\n });\n }\n\n disconnectedCallback() {\n this.disconnectModeObserver?.();\n }\n\n @Watch('variant')\n onVariantChange() {\n // When variant changes in admin mode, update the content wrapper\n if (this.adminMode && this.editorRef) {\n this.syncContentToSlot();\n }\n }\n\n /**\n * Read content from slotted elements\n */\n private readSlottedContent() {\n if (!this.slotRef) return;\n\n const assignedNodes = this.slotRef.assignedNodes({ flatten: true });\n\n // Collect all content from assigned nodes\n let html = '';\n assignedNodes.forEach(node => {\n if (node.nodeType === Node.TEXT_NODE) {\n html += node.textContent;\n } else if (node.nodeType === Node.ELEMENT_NODE) {\n html += (node as Element).innerHTML || node.textContent;\n }\n });\n\n this.content = html.trim();\n }\n\n /**\n * Sync edited content back to the slot\n */\n private syncContentToSlot() {\n if (!this.editorRef) return;\n\n const newContent = this.editorRef.innerHTML;\n\n // Update the light DOM content\n // We need to update the actual slotted content\n const slot = this.slotRef;\n if (slot) {\n const assignedNodes = slot.assignedNodes({ flatten: true });\n if (assignedNodes.length > 0) {\n const firstNode = assignedNodes[0];\n if (firstNode.nodeType === Node.ELEMENT_NODE) {\n (firstNode as Element).innerHTML = newContent;\n } else if (firstNode.nodeType === Node.TEXT_NODE) {\n // Replace text node with the new content\n const parent = firstNode.parentNode;\n if (parent) {\n // Create a temporary element to parse HTML\n const temp = document.createElement('span');\n temp.innerHTML = newContent;\n // Replace the text node\n parent.replaceChild(temp, firstNode);\n // Unwrap the span if it only contains text\n if (temp.childNodes.length === 1 && temp.firstChild?.nodeType === Node.TEXT_NODE) {\n parent.replaceChild(temp.firstChild, temp);\n }\n }\n }\n } else {\n // No assigned nodes, set innerHTML on the host's light DOM\n this.el.innerHTML = newContent;\n }\n }\n }\n\n /**\n * Handle input in the contenteditable\n */\n private handleInput = () => {\n if (this.editorRef) {\n this.content = this.editorRef.innerHTML;\n this.updateSelectionState();\n }\n };\n\n /**\n * Handle focus on the editor\n */\n private handleFocus = () => {\n this.isFocused = true;\n this.updateSelectionState();\n };\n\n /**\n * Handle blur on the editor\n */\n private handleBlur = (e: FocusEvent) => {\n // Check if focus moved to toolbar\n const relatedTarget = e.relatedTarget as HTMLElement;\n const toolbar = this.el.shadowRoot?.querySelector('.le-text-toolbar');\n\n if (toolbar?.contains(relatedTarget)) {\n // Focus moved to toolbar, keep it open\n return;\n }\n\n // Small delay to allow toolbar clicks to register\n setTimeout(() => {\n if (!this.el.shadowRoot?.activeElement) {\n this.isFocused = false;\n this.syncContentToSlot();\n }\n }, 150);\n };\n\n /**\n * Handle selection change to update toolbar state\n */\n private handleSelectionChange = () => {\n this.updateSelectionState();\n };\n\n /**\n * Update the selection state for toolbar highlighting\n */\n private updateSelectionState() {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return;\n\n this.selectionState = {\n isBold: document.queryCommandState('bold'),\n isItalic: document.queryCommandState('italic'),\n isUnderline: document.queryCommandState('underline'),\n isStrikethrough: document.queryCommandState('strikeThrough'),\n isLink: this.isSelectionInLink(selection),\n blockType: this.variant,\n };\n }\n\n /**\n * Check if current selection is within a link\n */\n private isSelectionInLink(selection: Selection): boolean {\n if (!selection.anchorNode) return false;\n\n let node: Node | null = selection.anchorNode;\n while (node && node !== this.editorRef) {\n if (node.nodeName === 'A') return true;\n node = node.parentNode;\n }\n return false;\n }\n\n /**\n * Execute a formatting command\n */\n private execCommand(command: string, value?: string) {\n // Focus the editor first\n this.editorRef?.focus();\n\n // Execute the command\n document.execCommand(command, false, value);\n\n // Update state\n this.handleInput();\n this.updateSelectionState();\n }\n\n /**\n * Toggle bold formatting\n */\n private toggleBold = (e: Event) => {\n e.preventDefault();\n this.execCommand('bold');\n };\n\n /**\n * Toggle italic formatting\n */\n private toggleItalic = (e: Event) => {\n e.preventDefault();\n this.execCommand('italic');\n };\n\n /**\n * Toggle underline formatting\n */\n private toggleUnderline = (e: Event) => {\n e.preventDefault();\n this.execCommand('underline');\n };\n\n /**\n * Toggle strikethrough formatting\n */\n private toggleStrikethrough = (e: Event) => {\n e.preventDefault();\n this.execCommand('strikeThrough');\n };\n\n /**\n * Add or edit a link\n */\n private toggleLink = (e: Event) => {\n e.preventDefault();\n\n if (this.selectionState.isLink) {\n // Remove link\n this.execCommand('unlink');\n } else {\n // Add link\n const url = prompt('Enter URL:', 'https://');\n if (url) {\n this.execCommand('createLink', url);\n }\n }\n };\n\n /**\n * Change the block type/variant\n */\n private changeVariant = (e: Event) => {\n const select = e.target as HTMLSelectElement;\n this.variant = select.value as typeof this.variant;\n };\n\n /**\n * Render the formatting toolbar\n */\n private renderToolbar() {\n return (\n <div class=\"le-text-toolbar\">\n <select\n class=\"le-text-toolbar-select\"\n onChange={this.changeVariant}\n onMouseDown={e => e.preventDefault()}\n >\n <option value=\"p\" selected={this.variant === 'p'}>\n Paragraph\n </option>\n <option value=\"h1\" selected={this.variant === 'h1'}>\n Heading 1\n </option>\n <option value=\"h2\" selected={this.variant === 'h2'}>\n Heading 2\n </option>\n <option value=\"h3\" selected={this.variant === 'h3'}>\n Heading 3\n </option>\n <option value=\"h4\" selected={this.variant === 'h4'}>\n Heading 4\n </option>\n <option value=\"h5\" selected={this.variant === 'h5'}>\n Heading 5\n </option>\n <option value=\"h6\" selected={this.variant === 'h6'}>\n Heading 6\n </option>\n <option value=\"quote\" selected={this.variant === 'quote'}>\n Quote\n </option>\n <option value=\"code\" selected={this.variant === 'code'}>\n Code\n </option>\n <option value=\"label\" selected={this.variant === 'label'}>\n Label\n </option>\n <option value=\"small\" selected={this.variant === 'small'}>\n Small\n </option>\n </select>\n\n <div class=\"le-text-toolbar-divider\"></div>\n\n <button\n type=\"button\"\n class={{ 'le-text-toolbar-btn': true, 'active': this.selectionState.isBold }}\n onMouseDown={this.toggleBold}\n title=\"Bold (Ctrl+B)\"\n >\n <strong>B</strong>\n </button>\n\n <button\n type=\"button\"\n class={{ 'le-text-toolbar-btn': true, 'active': this.selectionState.isItalic }}\n onMouseDown={this.toggleItalic}\n title=\"Italic (Ctrl+I)\"\n >\n <em>I</em>\n </button>\n\n <button\n type=\"button\"\n class={{ 'le-text-toolbar-btn': true, 'active': this.selectionState.isUnderline }}\n onMouseDown={this.toggleUnderline}\n title=\"Underline (Ctrl+U)\"\n >\n <span style={{ textDecoration: 'underline' }}>U</span>\n </button>\n\n <button\n type=\"button\"\n class={{ 'le-text-toolbar-btn': true, 'active': this.selectionState.isStrikethrough }}\n onMouseDown={this.toggleStrikethrough}\n title=\"Strikethrough\"\n >\n <span style={{ textDecoration: 'line-through' }}>S</span>\n </button>\n\n <div class=\"le-text-toolbar-divider\"></div>\n\n <button\n type=\"button\"\n class={{ 'le-text-toolbar-btn': true, 'active': this.selectionState.isLink }}\n onMouseDown={this.toggleLink}\n title={this.selectionState.isLink ? 'Remove link' : 'Add link'}\n >\n 🔗\n </button>\n </div>\n );\n }\n\n /**\n * Get the semantic tag for the current variant\n */\n private getTag(): string {\n switch (this.variant) {\n case 'quote':\n return 'blockquote';\n case 'code':\n return 'pre';\n case 'label':\n return 'label';\n case 'small':\n return 'small';\n default:\n return this.variant; // h1-h6, p\n }\n }\n\n render() {\n const Tag = this.getTag();\n\n const textStyle: { [key: string]: string } = {};\n if (this.color) {\n textStyle.color = this.color;\n }\n if (this.align) {\n textStyle.textAlign = this.align;\n }\n\n const textClass = {\n 'le-text': true,\n [`variant-${this.variant}`]: true,\n 'truncate': this.truncate,\n [`max-lines-${this.maxLines}`]: this.truncate && this.maxLines,\n };\n\n // Admin mode - show rich text editor\n if (this.adminMode) {\n return (\n <Host class=\"admin-mode\">\n <le-component component=\"le-text\">\n <div class=\"le-text-editor-wrapper\">\n {this.isFocused && this.renderToolbar()}\n <Tag class={textClass} part=\"text\" style={textStyle}>\n <div\n ref={el => (this.editorRef = el)}\n class=\"le-text-editor\"\n contentEditable={true}\n onInput={this.handleInput}\n onFocus={this.handleFocus}\n onBlur={this.handleBlur}\n onKeyUp={this.handleSelectionChange}\n onMouseUp={this.handleSelectionChange}\n innerHTML={this.content}\n ></div>\n </Tag>\n {/* Hidden slot to receive light DOM content */}\n <div class=\"hidden-slot\">\n <slot\n ref={el => (this.slotRef = el as HTMLSlotElement)}\n onSlotchange={() => this.readSlottedContent()}\n ></slot>\n </div>\n </div>\n </le-component>\n </Host>\n );\n }\n\n // Default mode - render semantic element with slotted content\n return (\n <Host>\n <Tag class={textClass} part=\"text\" style={textStyle}>\n <slot ref={el => (this.slotRef = el as HTMLSlotElement)}></slot>\n </Tag>\n </Host>\n );\n }\n}\n\n/**\n * Selection state for toolbar\n */\ninterface SelectionState {\n isBold: boolean;\n isItalic: boolean;\n isUnderline: boolean;\n isStrikethrough: boolean;\n isLink: boolean;\n blockType: string;\n}\n"],"version":3}
|
|
@@ -129,7 +129,7 @@ const LeTurntable$1 = /*@__PURE__*/ proxyCustomElement(class LeTurntable extends
|
|
|
129
129
|
this.el.style.transform = `rotate(${angle}deg)`;
|
|
130
130
|
}
|
|
131
131
|
render() {
|
|
132
|
-
return (h("div", { key: '
|
|
132
|
+
return (h("div", { key: '50d1e3a01db9e77a3c391e04af74b70f39c23f8f', class: "turntable", onMouseDown: this.handleMouseDown.bind(this) }, h("slot", { key: 'a4c5d3cc2a99edf860ff7aa5318fa76443cdd2fd' })));
|
|
133
133
|
}
|
|
134
134
|
static get watchers() { return {
|
|
135
135
|
"value": ["updateValue"]
|