@ixfx/components 0.13.2 → 0.13.4
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/bundle/index.d.ts +1649 -128
- package/bundle/index.js +1595 -44437
- package/bundle/rolldown-runtime-CEoa-xHZ.js +1 -0
- package/dist/ac-text.d.ts +2 -3
- package/dist/ac-text.js +0 -2
- package/dist/{ac-token-TCLAZeVg.d.ts → ac-token--_vCHXWw.d.ts} +2 -3
- package/dist/ac-token.d.ts +1 -1
- package/dist/ac-token.js +1 -3
- package/dist/button-B7mgqtxR.js +0 -2
- package/dist/{button-CTL45aBl.d.ts → button-BYuf72aR.d.ts} +2 -3
- package/dist/button.d.ts +1 -1
- package/dist/checkbox.d.ts +1 -2
- package/dist/checkbox.js +0 -2
- package/dist/checked-select-CglRukbP.d.ts +1 -2
- package/dist/checked-select-lDgAQQ7v.js +0 -2
- package/dist/colour-picker-BCMU7W7R.js +0 -2
- package/dist/colour-picker.d.ts +1 -1
- package/dist/crumbs.d.ts +2 -3
- package/dist/crumbs.js +1 -3
- package/dist/data-controller-DOlmqNKb.js +0 -2
- package/dist/data-display.d.ts +1 -2
- package/dist/data-display.js +0 -2
- package/dist/{data-grid-Ck1Qx2H1.d.ts → data-grid-BtBZt8M1.d.ts} +10 -9
- package/dist/data-grid-FHr7wZ_k.js +2108 -0
- package/dist/data-grid.d.ts +1 -1
- package/dist/data-grid.js +1 -1923
- package/dist/data-provider-35TyWclX.js +0 -2
- package/dist/data-provider-BAn_-oR1.d.ts +1 -2
- package/dist/decorate-VRK8rslU.js +0 -2
- package/dist/defaults-B4ePs4LB.js +0 -2
- package/dist/detail-list-BfYHNh6B.js +1999 -0
- package/dist/{detail-list-C1xzr1z7.d.ts → detail-list-u2rWnAXQ.d.ts} +13 -5
- package/dist/detail-list.d.ts +2 -2
- package/dist/detail-list.js +1 -1680
- package/dist/drag-ghost-DtSDvjri.js +0 -2
- package/dist/editable-label-rzXkjf1H.d.ts +1 -2
- package/dist/editable-label.js +0 -2
- package/dist/fallbacks-DQ_5OsmR.js +0 -2
- package/dist/{flat-list-Ohxqsy0g.d.ts → flat-list-DNnTQ65v.d.ts} +3 -4
- package/dist/flat-list.d.ts +1 -1
- package/dist/flat-list.js +5 -3
- package/dist/form-CsXJX15p.js +0 -2
- package/dist/form.d.ts +1 -2
- package/dist/{grid-list-pefLORIr.d.ts → grid-list-BLnV9oZE.d.ts} +9 -3
- package/dist/{grid-list-DjIl910A.js → grid-list-CkU8gHCh.js} +189 -42
- package/dist/grid-list.d.ts +1 -1
- package/dist/grid-list.js +1 -1
- package/dist/{grouped-item-lister-Bhyo-dkH.d.ts → grouped-item-lister-DETte0Dh.d.ts} +2 -3
- package/dist/grouped-item-lister.d.ts +1 -1
- package/dist/grouped-item-lister.js +0 -2
- package/dist/grouping-CUKgmkMm.d.ts +1 -2
- package/dist/grouping-RYPnHkrS.js +0 -2
- package/dist/handle-DAXs7kbJ.js +0 -2
- package/dist/hex-editor-Caq8vNQk.d.ts +1 -2
- package/dist/hex-editor-DiYpgIKs.js +0 -2
- package/dist/highlight-B-eQrhhb.js +0 -2
- package/dist/icon-1gpwtPx8.js +0 -2
- package/dist/{icon-DR_3rSyZ.d.ts → icon-CDGprSdE.d.ts} +2 -3
- package/dist/icons.d.ts +2 -2
- package/dist/icons.js +0 -2
- package/dist/{incr-search-D91M4Ozq.js → incr-search-JIhwB49y.js} +26 -6
- package/dist/incr-search.d.ts +1 -1
- package/dist/incr-search.js +1 -1
- package/dist/{index-Dq30pOnn.d.ts → index-B-hzcIP0.d.ts} +3 -4
- package/dist/{index-CxZ61DO1.d.ts → index-BYIRgv49.d.ts} +9 -3
- package/dist/index-CCC0G1nO.d.ts +324 -0
- package/dist/{index-garxxqgV.d.ts → index-CYndvTWH.d.ts} +2 -3
- package/dist/{index-BUB5SICW.d.ts → index-CoqtMSd9.d.ts} +2 -3
- package/dist/index-DV3iaUBW.d.ts +1 -2
- package/dist/{index-CJ5fshD3.d.ts → index-UvnoZUAo.d.ts} +2 -3
- package/dist/index-o-CWDt11.d.ts +1 -2
- package/dist/{index-BOUaDIW-.d.ts → index-tq6f8007.d.ts} +2 -3
- package/dist/index.d.ts +21 -22
- package/dist/index.js +48 -29
- package/dist/item-appearance-BjcMyauw.js +0 -2
- package/dist/keyboard-B5xD7Fz-.js +0 -2
- package/dist/labelled-input-base-BFa4xlYV.js +0 -2
- package/dist/{labelled-input-base-Dp_9KP0G.d.ts → labelled-input-base-DiTme1JO.d.ts} +2 -3
- package/dist/labelled-radial-input.d.ts +3 -4
- package/dist/labelled-radial-input.js +0 -2
- package/dist/labelled-range-input.d.ts +1 -1
- package/dist/labelled-range-input.js +0 -2
- package/dist/labelled-slider-input-FdCRi6st.js +0 -2
- package/dist/labelled-slider-input.d.ts +1 -1
- package/dist/led.d.ts +1 -2
- package/dist/led.js +0 -2
- package/dist/list-group-header.d.ts +2 -3
- package/dist/list-group-header.js +0 -2
- package/dist/list-item-animation-BUoEKi5s.js +0 -2
- package/dist/list-native-drag-controller-B9xO0XWn.js +0 -2
- package/dist/list-native-drag-controller-ChIi3eK5.d.ts +1 -2
- package/dist/list-selection-controller-BeE70lbB.js +0 -2
- package/dist/list-selection-types-PjKdhF-a.d.ts +1 -2
- package/dist/list-viewport-types-BRZsLcvp.d.ts +1 -2
- package/dist/menu-CwcXXeLM.js +0 -2
- package/dist/menu-item-BDEekBVy.js +0 -2
- package/dist/{menu-item-B0zqw2xp.d.ts → menu-item-bF6narIz.d.ts} +2 -3
- package/dist/menu.d.ts +2 -2
- package/dist/miller.d.ts +2 -3
- package/dist/miller.js +146 -102
- package/dist/narrowed-text.js +1 -3
- package/dist/notification-pill-DyZydXoZ.d.ts +1 -2
- package/dist/notifier.js +0 -2
- package/dist/pan-text-CoYmt2qd.d.ts +1 -2
- package/dist/pan-text-CqtvjPyK.js +0 -2
- package/dist/panel.d.ts +2 -3
- package/dist/panel.js +0 -2
- package/dist/polar-pad.d.ts +1 -2
- package/dist/polar-pad.js +0 -2
- package/dist/popup-D80sj2QC.js +0 -2
- package/dist/prominence-DlFShic3.js +0 -2
- package/dist/radial-input-DU6t2hYO.d.ts +1 -2
- package/dist/radial-input-KMVltQfe.js +0 -2
- package/dist/range-input.d.ts +1 -2
- package/dist/range-input.js +0 -2
- package/dist/range.d.ts +1 -2
- package/dist/range.js +0 -2
- package/dist/registry-BEtb8_wB.js +0 -2
- package/dist/{scroll-fade-BrNUIYnm.js → scroll-fade-Xx28D7mH.js} +11 -7
- package/dist/select-horiz.d.ts +1 -2
- package/dist/select-horiz.js +1 -3
- package/dist/slider-input-BxURAAmD.d.ts +1 -2
- package/dist/slider-input-ByHdotzp.js +0 -2
- package/dist/snackbar.d.ts +1 -2
- package/dist/snackbar.js +0 -2
- package/dist/snap-container.d.ts +1 -2
- package/dist/snap-container.js +0 -2
- package/dist/{split-layout-CXotkdbx.js → split-layout-Deoxy47d.js} +5 -2
- package/dist/{split-layout-C5SYbDrq.d.ts → split-layout-JK3xWVX2.d.ts} +2 -3
- package/dist/split-layout.d.ts +1 -1
- package/dist/split-layout.js +1 -1
- package/dist/swipe.d.ts +1 -2
- package/dist/swipe.js +0 -2
- package/dist/{tab-list-v8mKX7Fu.d.ts → tab-list-CexFFg6O.d.ts} +3 -5
- package/dist/tabs.d.ts +1 -1
- package/dist/tabs.js +23 -3
- package/dist/tickled-controller-D-HZymaZ.js +0 -2
- package/dist/tickled-controller-DodxD3eQ.d.ts +1 -2
- package/dist/tickled-styles-BrAHEj1q.js +0 -2
- package/dist/timeline-BP1Ux2EV.js +0 -2
- package/dist/{titlebar-B5zSTZnF.d.ts → titlebar-Tqu-VvMU.d.ts} +2 -3
- package/dist/titlebar.d.ts +1 -1
- package/dist/titlebar.js +0 -2
- package/dist/tooltip-BlvBUQxx.d.ts +1 -2
- package/dist/tooltip-CJt3WLmN.js +0 -2
- package/dist/transitory-label.d.ts +1 -2
- package/dist/transitory-label.js +0 -2
- package/dist/{tree-DGveys4K.js → tree-DD8OaqsK.js} +1009 -231
- package/dist/tree-component-Cj8V3uar.d.ts +1 -2
- package/dist/tree.d.ts +4 -267
- package/dist/tree.js +1 -1
- package/dist/types-DQ7KOUIj.d.ts +1 -2
- package/dist/{vertical-list-CqBc-t8w.d.ts → vertical-list-m7GJtXwv.d.ts} +3 -3
- package/dist/vertical-list.d.ts +1 -1
- package/dist/vertical-list.js +114 -27
- package/dist/wheel-nudge-By5s_ioH.d.ts +1 -2
- package/dist/wheel-nudge-D5rmht3v.js +0 -2
- package/dist/xy-axis-CyMd_Bn1.js +0 -2
- package/dist/xy-axis-DQqd2yXJ.d.ts +1 -2
- package/dist/xy-pad.d.ts +1 -2
- package/dist/xy-pad.js +0 -2
- package/docs-user/data-grid.md +74 -4
- package/docs-user/detail-list.md +65 -0
- package/docs-user/grid-list.md +81 -4
- package/docs-user/index.json +2 -2
- package/docs-user/miller.md +59 -3
- package/docs-user/tree.md +63 -2
- package/docs-user/vertical-list.md +9 -1
- package/package.json +6 -1
- package/bundle/index.d.ts.map +0 -1
- package/bundle/index.js.map +0 -1
- package/bundle/rolldown-runtime-D7D4PA-g.js +0 -13
- package/dist/ac-text.d.ts.map +0 -1
- package/dist/ac-text.js.map +0 -1
- package/dist/ac-token-TCLAZeVg.d.ts.map +0 -1
- package/dist/ac-token.js.map +0 -1
- package/dist/button-B7mgqtxR.js.map +0 -1
- package/dist/button-CTL45aBl.d.ts.map +0 -1
- package/dist/checkbox.d.ts.map +0 -1
- package/dist/checkbox.js.map +0 -1
- package/dist/checked-select-CglRukbP.d.ts.map +0 -1
- package/dist/checked-select-lDgAQQ7v.js.map +0 -1
- package/dist/colour-picker-BCMU7W7R.js.map +0 -1
- package/dist/crumbs.d.ts.map +0 -1
- package/dist/crumbs.js.map +0 -1
- package/dist/data-controller-DOlmqNKb.js.map +0 -1
- package/dist/data-display.d.ts.map +0 -1
- package/dist/data-display.js.map +0 -1
- package/dist/data-grid-Ck1Qx2H1.d.ts.map +0 -1
- package/dist/data-grid.js.map +0 -1
- package/dist/data-provider-35TyWclX.js.map +0 -1
- package/dist/data-provider-BAn_-oR1.d.ts.map +0 -1
- package/dist/decorate-VRK8rslU.js.map +0 -1
- package/dist/defaults-B4ePs4LB.js.map +0 -1
- package/dist/detail-list-C1xzr1z7.d.ts.map +0 -1
- package/dist/detail-list.js.map +0 -1
- package/dist/drag-ghost-DtSDvjri.js.map +0 -1
- package/dist/editable-label-rzXkjf1H.d.ts.map +0 -1
- package/dist/editable-label.js.map +0 -1
- package/dist/fallbacks-DQ_5OsmR.js.map +0 -1
- package/dist/flat-list-Ohxqsy0g.d.ts.map +0 -1
- package/dist/flat-list.js.map +0 -1
- package/dist/form-CsXJX15p.js.map +0 -1
- package/dist/form.d.ts.map +0 -1
- package/dist/grid-list-DjIl910A.js.map +0 -1
- package/dist/grid-list-pefLORIr.d.ts.map +0 -1
- package/dist/grouped-item-lister-Bhyo-dkH.d.ts.map +0 -1
- package/dist/grouped-item-lister.js.map +0 -1
- package/dist/grouping-CUKgmkMm.d.ts.map +0 -1
- package/dist/grouping-RYPnHkrS.js.map +0 -1
- package/dist/handle-DAXs7kbJ.js.map +0 -1
- package/dist/hex-editor-Caq8vNQk.d.ts.map +0 -1
- package/dist/hex-editor-DiYpgIKs.js.map +0 -1
- package/dist/highlight-B-eQrhhb.js.map +0 -1
- package/dist/icon-1gpwtPx8.js.map +0 -1
- package/dist/icon-DR_3rSyZ.d.ts.map +0 -1
- package/dist/icons.js.map +0 -1
- package/dist/incr-search-D91M4Ozq.js.map +0 -1
- package/dist/index-BOUaDIW-.d.ts.map +0 -1
- package/dist/index-BUB5SICW.d.ts.map +0 -1
- package/dist/index-CJ5fshD3.d.ts.map +0 -1
- package/dist/index-CxZ61DO1.d.ts.map +0 -1
- package/dist/index-DV3iaUBW.d.ts.map +0 -1
- package/dist/index-Dq30pOnn.d.ts.map +0 -1
- package/dist/index-garxxqgV.d.ts.map +0 -1
- package/dist/index-o-CWDt11.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/item-appearance-BjcMyauw.js.map +0 -1
- package/dist/keyboard-B5xD7Fz-.js.map +0 -1
- package/dist/labelled-input-base-BFa4xlYV.js.map +0 -1
- package/dist/labelled-input-base-Dp_9KP0G.d.ts.map +0 -1
- package/dist/labelled-radial-input.d.ts.map +0 -1
- package/dist/labelled-radial-input.js.map +0 -1
- package/dist/labelled-range-input.js.map +0 -1
- package/dist/labelled-slider-input-FdCRi6st.js.map +0 -1
- package/dist/led.d.ts.map +0 -1
- package/dist/led.js.map +0 -1
- package/dist/list-group-header.d.ts.map +0 -1
- package/dist/list-group-header.js.map +0 -1
- package/dist/list-item-animation-BUoEKi5s.js.map +0 -1
- package/dist/list-native-drag-controller-B9xO0XWn.js.map +0 -1
- package/dist/list-native-drag-controller-ChIi3eK5.d.ts.map +0 -1
- package/dist/list-selection-controller-BeE70lbB.js.map +0 -1
- package/dist/list-selection-types-PjKdhF-a.d.ts.map +0 -1
- package/dist/list-viewport-types-BRZsLcvp.d.ts.map +0 -1
- package/dist/menu-CwcXXeLM.js.map +0 -1
- package/dist/menu-item-B0zqw2xp.d.ts.map +0 -1
- package/dist/menu-item-BDEekBVy.js.map +0 -1
- package/dist/miller.d.ts.map +0 -1
- package/dist/miller.js.map +0 -1
- package/dist/narrowed-text.js.map +0 -1
- package/dist/notification-pill-DyZydXoZ.d.ts.map +0 -1
- package/dist/notifier.js.map +0 -1
- package/dist/pan-text-CoYmt2qd.d.ts.map +0 -1
- package/dist/pan-text-CqtvjPyK.js.map +0 -1
- package/dist/panel.d.ts.map +0 -1
- package/dist/panel.js.map +0 -1
- package/dist/polar-pad.d.ts.map +0 -1
- package/dist/polar-pad.js.map +0 -1
- package/dist/popup-D80sj2QC.js.map +0 -1
- package/dist/prominence-DlFShic3.js.map +0 -1
- package/dist/radial-input-DU6t2hYO.d.ts.map +0 -1
- package/dist/radial-input-KMVltQfe.js.map +0 -1
- package/dist/range-input.d.ts.map +0 -1
- package/dist/range-input.js.map +0 -1
- package/dist/range.d.ts.map +0 -1
- package/dist/range.js.map +0 -1
- package/dist/registry-BEtb8_wB.js.map +0 -1
- package/dist/scroll-fade-BrNUIYnm.js.map +0 -1
- package/dist/select-horiz.d.ts.map +0 -1
- package/dist/select-horiz.js.map +0 -1
- package/dist/slider-input-BxURAAmD.d.ts.map +0 -1
- package/dist/slider-input-ByHdotzp.js.map +0 -1
- package/dist/snackbar.d.ts.map +0 -1
- package/dist/snackbar.js.map +0 -1
- package/dist/snap-container.d.ts.map +0 -1
- package/dist/snap-container.js.map +0 -1
- package/dist/split-layout-C5SYbDrq.d.ts.map +0 -1
- package/dist/split-layout-CXotkdbx.js.map +0 -1
- package/dist/swipe.d.ts.map +0 -1
- package/dist/swipe.js.map +0 -1
- package/dist/tab-list-v8mKX7Fu.d.ts.map +0 -1
- package/dist/tabs.js.map +0 -1
- package/dist/tickled-controller-D-HZymaZ.js.map +0 -1
- package/dist/tickled-controller-DodxD3eQ.d.ts.map +0 -1
- package/dist/tickled-styles-BrAHEj1q.js.map +0 -1
- package/dist/timeline-BP1Ux2EV.js.map +0 -1
- package/dist/titlebar-B5zSTZnF.d.ts.map +0 -1
- package/dist/titlebar.js.map +0 -1
- package/dist/tooltip-BlvBUQxx.d.ts.map +0 -1
- package/dist/tooltip-CJt3WLmN.js.map +0 -1
- package/dist/transitory-label.d.ts.map +0 -1
- package/dist/transitory-label.js.map +0 -1
- package/dist/tree-DGveys4K.js.map +0 -1
- package/dist/tree-component-Cj8V3uar.d.ts.map +0 -1
- package/dist/tree.d.ts.map +0 -1
- package/dist/types-DQ7KOUIj.d.ts.map +0 -1
- package/dist/vertical-list-CqBc-t8w.d.ts.map +0 -1
- package/dist/vertical-list.js.map +0 -1
- package/dist/wheel-nudge-By5s_ioH.d.ts.map +0 -1
- package/dist/wheel-nudge-D5rmht3v.js.map +0 -1
- package/dist/xy-axis-CyMd_Bn1.js.map +0 -1
- package/dist/xy-axis-DQqd2yXJ.d.ts.map +0 -1
- package/dist/xy-pad.d.ts.map +0 -1
- package/dist/xy-pad.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"menu-CwcXXeLM.js","names":["customElement","customElement","customElement","customElement","customElement","customElement","customElement"],"sources":["../src/menu/menu-bar.ts","../src/menu/menu-check-item.ts","../src/menu/menu-command-controller.ts","../src/menu/menu-sub-trigger.ts","../src/menu/menu-separator.ts","../src/menu/menu-header.ts","../src/menu/menu-from-tree.ts","../src/menu/menu-radio-item.ts","../src/menu/menu-radio-group.ts","../src/menu/index.ts"],"sourcesContent":["import type { MenuTrigger } from './menu-trigger.js';\nimport { css, html, LitElement } from 'lit';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport './menu-trigger.js';\n\n@customElement(`ixfx-menu-bar`)\nexport class MenuBar extends LitElement {\n private _openTrigger: MenuTrigger | null = null;\n private _inputMode: `keyboard` | `mouse` = `mouse`;\n\n connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener(`menu-trigger-open`, this._handleTriggerOpen as EventListener);\n this.addEventListener(`menu-trigger-close`, this._handleTriggerClose as EventListener);\n this.addEventListener(`focusin`, this._handleFocusIn as EventListener);\n this.addEventListener(`keydown`, this._handleKeydown);\n this.addEventListener(`pointermove`, this._handlePointerMove);\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener(`menu-trigger-open`, this._handleTriggerOpen as EventListener);\n this.removeEventListener(`menu-trigger-close`, this._handleTriggerClose as EventListener);\n this.removeEventListener(`focusin`, this._handleFocusIn as EventListener);\n this.removeEventListener(`keydown`, this._handleKeydown);\n this.removeEventListener(`pointermove`, this._handlePointerMove);\n }\n\n private _setInputMode(mode: `keyboard` | `mouse`): void {\n if (this._inputMode === mode)\n return;\n this._inputMode = mode;\n this.setAttribute(`data-input-mode`, mode);\n }\n\n private _handlePointerMove = (): void => {\n this._setInputMode(`mouse`);\n };\n\n private _getTriggers(): MenuTrigger[] {\n return [...this.children].filter(\n el => el.tagName === `IXFX-MENU-TRIGGER`,\n ) as MenuTrigger[];\n }\n\n private _handleTriggerOpen = (e: Event): void => {\n this._openTrigger = e.target as MenuTrigger;\n };\n\n private _handleTriggerClose = (e: Event): void => {\n if (e.target === this._openTrigger) {\n this._openTrigger = null;\n }\n };\n\n // When focus moves to a trigger button while another menu is open, switch menus.\n // focusin is composed, so e.target is retargeted to the ixfx-menu-trigger host.\n private _handleFocusIn = (e: FocusEvent): void => {\n const triggers = this._getTriggers();\n const trigger = triggers.find(t => t === e.target);\n if (!trigger || !this._openTrigger || trigger === this._openTrigger)\n return;\n this._openTrigger.closeMenu();\n trigger.openMenu();\n };\n\n private _handleKeydown = (e: KeyboardEvent): void => {\n if (e.key !== `ArrowLeft` && e.key !== `ArrowRight`)\n return;\n\n const triggers = this._getTriggers();\n if (triggers.length === 0)\n return;\n\n // When a menu is open, navigate from the open trigger.\n // When no menu is open, navigate from the focused trigger button\n // (e.target is retargeted to ixfx-menu-trigger when focus is on its inner button).\n const current = this._openTrigger ?? triggers.find(t => t === e.target);\n if (!current)\n return;\n\n const idx = triggers.indexOf(current);\n if (idx === -1)\n return;\n\n e.preventDefault();\n e.stopPropagation();\n this._setInputMode(`keyboard`);\n\n const dir = e.key === `ArrowRight` ? 1 : -1;\n const next = triggers[(idx + dir + triggers.length) % triggers.length];\n\n if (this._openTrigger) {\n this._openTrigger.closeMenu();\n next.openMenu();\n } else {\n next.focusTrigger();\n }\n };\n\n static styles = css`\n :host {\n display: flex;\n align-items: center;\n }\n\n /* Keyboard mode: suppress hover highlight on trigger buttons */\n :host([data-input-mode=\"keyboard\"]) {\n --_trigger-hover-bg: transparent;\n --_trigger-hover-opacity: 0.6;\n }\n `;\n\n render() {\n return html`<slot role=\"menubar\"></slot>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-menu-bar': MenuBar;\n }\n}\n","import type { CommandRegistry, KeyboardManager } from '@clinth/ui-commands';\nimport { css, html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { tickledItemStyles } from '../interaction/index.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport '../icons/icon.js';\n\nexport type MenuCheckItemCommandDetail = {\n readonly command: string;\n readonly checked: boolean;\n readonly args: string;\n};\n\nexport type MenuCheckItemCommandEvent = CustomEvent<MenuCheckItemCommandDetail>;\n\n@customElement(`ixfx-menu-check-item`)\nexport class MenuCheckItem extends LitElement {\n @property({ type: String }) command = ``;\n @property({ type: String, attribute: `command-args` }) commandArgs = ``;\n @property({ type: String }) label = ``;\n @property({ type: Boolean }) checked = false;\n @property({ type: Boolean }) disabled = false;\n @property({ type: String, attribute: `icon-name` }) iconName = ``;\n @property({ attribute: false }) registry?: CommandRegistry<unknown>;\n @property({ attribute: false }) keyboardManager?: KeyboardManager;\n\n private handleClick(): void {\n if (this.disabled)\n return;\n\n this.checked = !this.checked;\n this.dispatchEvent(new CustomEvent<MenuCheckItemCommandDetail>(`command`, {\n detail: { command: this.command, checked: this.checked, args: this.commandArgs },\n bubbles: true,\n composed: true,\n }));\n }\n\n private _resolvedLabel(): string {\n if (this.label)\n return this.label;\n if (this.registry && this.command) {\n return this.registry.get(this.command)?.label ?? ``;\n }\n return ``;\n }\n\n private _resolvedIcon(): string | null {\n if (this.iconName)\n return this.iconName;\n if (this.registry && this.command) {\n return this.registry.get(this.command)?.icon ?? null;\n }\n return null;\n }\n\n willUpdate(changedProperties: Map<string, unknown>): void {\n super.willUpdate(changedProperties);\n const resolvedIcon = this._resolvedIcon();\n if (resolvedIcon && !this.iconName) {\n this.setAttribute(`data-icon-section`, ``);\n } else if (!resolvedIcon && !this.iconName) {\n this.removeAttribute(`data-icon-section`);\n }\n }\n\n updated(changedProperties: Map<string, unknown>): void {\n super.updated(changedProperties);\n }\n\n private _getShortcut(): string | null {\n if (!this.keyboardManager || !this.command)\n return null;\n const bindings = (this.keyboardManager as any).getBindings?.() ?? [];\n const binding = bindings.find((b: any) => b.commandId === this.command);\n if (!binding)\n return null;\n const mods = Array.from(binding.modifiers ?? [], (m: string) =>\n ({ ctrl: `⌃`, shift: `⇧`, alt: `⌥`, meta: `⌘` })[m] ?? m);\n const key = binding.key?.length === 1 ? binding.key.toUpperCase() : binding.key;\n return [...mods, key].join(``);\n }\n\n static override styles = [themeFallbacks, tickledItemStyles, css`\n :host {\n display: block;\n }\n\n .item {\n display: flex;\n padding: 6px var(--space-m);\n font-size: var(--text-m);\n }\n\n :host(:focus) {\n outline: none;\n }\n\n .item.disabled {\n opacity: var(--disabled-opacity);\n cursor: default;\n }\n\n .item.disabled:hover {\n background: transparent;\n }\n\n .check {\n width: 1em;\n margin-left: var(--space-xs);\n display: inline-flex;\n align-items: center;\n color: var(--accent);\n }\n\n .icon-slot {\n width: 0;\n overflow: hidden;\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n\n :host([icon-name]) .icon-slot,\n :host([data-icon-section]) .icon-slot {\n width: 1em;\n height: 1em;\n margin-right: var(--space-s);\n }\n\n .label {\n flex: 1;\n }\n\n .shortcut {\n margin-left: var(--space-l);\n color: var(--surface-muted-text);\n font-size: var(--text-s);\n }\n `];\n\n render() {\n const shortcut = this._getShortcut();\n const resolvedIcon = this._resolvedIcon();\n return html`\n <div \n class=\"item ${this.disabled ? `disabled` : ``}\"\n @click=${this.handleClick}\n tabindex=\"${this.disabled ? -1 : 0}\"\n role=\"menuitemcheckbox\"\n aria-checked=\"${this.checked}\"\n >\n <span class=\"check\">${this.checked ? html`<ixfx-icon name=\"check\" size=\"14\"></ixfx-icon>` : ``}</span>\n <span class=\"icon-slot\">${resolvedIcon ? html`<ixfx-icon name=\"${resolvedIcon}\"></ixfx-icon>` : null}</span>\n <span class=\"label\">${this._resolvedLabel()}</span>\n ${shortcut ? html`<span class=\"shortcut\">${shortcut}</span>` : null}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-menu-check-item': MenuCheckItem;\n }\n}\n","import type { CommandRegistry } from '@clinth/ui-commands';\n\nexport class MenuCommandController {\n private registry: CommandRegistry<unknown>;\n private target: EventTarget;\n private boundHandler: (e: Event) => void;\n\n constructor(options: { registry: CommandRegistry<unknown>; target?: EventTarget }) {\n this.registry = options.registry;\n this.target = options.target ?? document;\n this.boundHandler = this.handleCommand.bind(this);\n }\n\n start(): void {\n this.target.addEventListener(`command`, this.boundHandler);\n }\n\n stop(): void {\n this.target.removeEventListener(`command`, this.boundHandler);\n }\n\n private handleCommand(e: Event): void {\n const target = e.target as any;\n const command = target?.command;\n if (!command)\n return;\n\n const args = target?.commandArgs ?? ``;\n this.registry.invoke(command, { args });\n }\n}\n","import type { CommandRegistry, KeyboardManager } from '@clinth/ui-commands';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { property, query, state } from 'lit/decorators.js';\nimport { tickledItemStyles } from '../interaction/index.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport '../icons/icon.js';\n\n@customElement(`ixfx-menu-sub-trigger`)\nexport class MenuSubTrigger extends LitElement {\n @property({ type: String }) command = ``;\n @property({ type: String, attribute: `command-args` }) commandArgs = ``;\n @property({ type: String }) label = ``;\n @property({ type: Boolean }) disabled = false;\n @property({ type: String, attribute: `icon-name` }) iconName = ``;\n @property({ attribute: false }) registry?: CommandRegistry<unknown>;\n @property({ attribute: false }) keyboardManager?: KeyboardManager;\n\n @state() private _hasSubmenu = false;\n @query(`slot[name=\"submenu\"]`) private _slot!: HTMLSlotElement;\n @query(`.submenu-popover`) private _submenuPopover!: HTMLElement;\n @query(`.item`) private _itemEl!: HTMLElement;\n\n private static _count = 0;\n private _anchorName = `--mst-${MenuSubTrigger._count++}`;\n private _hoverTimeout: number | null = null;\n private _hideTimeout: number | null = null;\n\n connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener(`keydown`, this._handleKeydown);\n }\n\n firstUpdated(): void {\n this.style.setProperty(`--anchor-name`, this._anchorName);\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener(`keydown`, this._handleKeydown);\n if (this._hoverTimeout) {\n clearTimeout(this._hoverTimeout);\n }\n if (this._hideTimeout) {\n clearTimeout(this._hideTimeout);\n }\n }\n\n private _propagateContext(): void {\n const items = this._slot?.assignedElements({ flatten: true }) ?? [];\n for (const el of items) {\n if (`registry` in el)\n (el as any).registry = this.registry;\n if (`keyboardManager` in el)\n (el as any).keyboardManager = this.keyboardManager;\n }\n }\n\n override updated(changedProperties: Map<string, unknown>): void {\n if (changedProperties.has(`registry`) || changedProperties.has(`keyboardManager`)) {\n this._propagateContext();\n }\n }\n\n willUpdate(changedProperties: Map<string, unknown>): void {\n super.willUpdate(changedProperties);\n const resolvedIcon = this._resolvedIcon();\n if (resolvedIcon && !this.iconName) {\n this.setAttribute(`data-icon-section`, ``);\n } else if (!resolvedIcon && !this.iconName) {\n this.removeAttribute(`data-icon-section`);\n }\n }\n\n private _resolvedIcon(): string | null {\n if (this.iconName)\n return this.iconName;\n if (this.registry && this.command) {\n return this.registry.get(this.command)?.icon ?? null;\n }\n return null;\n }\n\n private _handleSlotChange(): void {\n this._hasSubmenu = this._slot?.assignedElements().length > 0;\n this._propagateContext();\n }\n\n private _showSubmenu(): void {\n if (!this._submenuPopover?.popover)\n return;\n try {\n (this._submenuPopover as any).showPopover();\n } catch { /* ignore */ }\n }\n\n private _hideSubmenu(): void {\n if (!this._submenuPopover?.popover)\n return;\n try {\n (this._submenuPopover as any).hidePopover();\n } catch { /* ignore */ }\n }\n\n private _cancelHide(): void {\n if (this._hideTimeout) {\n clearTimeout(this._hideTimeout);\n this._hideTimeout = null;\n }\n }\n\n private _scheduleHide(): void {\n this._cancelHide();\n this._hideTimeout = window.setTimeout(() => {\n this._hideSubmenu();\n this._hideTimeout = null;\n }, 100);\n }\n\n private _handleMouseEnter(): void {\n if (this.disabled || !this._hasSubmenu)\n return;\n this._cancelHide();\n if (this._hoverTimeout) {\n clearTimeout(this._hoverTimeout);\n }\n this._hoverTimeout = window.setTimeout(() => {\n this._showSubmenu();\n }, 150);\n }\n\n private _handleMouseLeave(): void {\n if (this._hoverTimeout) {\n clearTimeout(this._hoverTimeout);\n this._hoverTimeout = null;\n }\n this._scheduleHide();\n }\n\n private _handleSubmenuMouseEnter(): void {\n this._cancelHide();\n }\n\n private _handleSubmenuMouseLeave(): void {\n this._scheduleHide();\n }\n\n private _handleClick(): void {\n if (this.disabled || !this.command)\n return;\n\n this.dispatchEvent(new CustomEvent(`command`, {\n detail: { command: this.command, args: this.commandArgs },\n bubbles: true,\n composed: true,\n }));\n }\n\n private _handleKeydown(e: KeyboardEvent): void {\n if (this.disabled)\n return;\n\n switch (e.key) {\n case `ArrowRight`:\n case `Enter`:\n case ` `:\n e.preventDefault();\n e.stopPropagation();\n if (this._hasSubmenu) {\n this._showSubmenu();\n requestAnimationFrame(() => {\n const container = this._slot?.assignedElements({ flatten: true })\n .find(el => el.tagName === `IXFX-MENU-CONTAINER`) as (HTMLElement & { focusFirst: () => void }) | undefined;\n container?.focusFirst();\n });\n }\n break;\n case `ArrowLeft`:\n e.preventDefault();\n e.stopPropagation();\n this._hideSubmenu();\n this._itemEl?.focus();\n break;\n case `Escape`:\n e.preventDefault();\n e.stopPropagation();\n this._hideSubmenu();\n break;\n }\n }\n\n static override styles = [themeFallbacks, tickledItemStyles, css`\n :host {\n display: block;\n }\n\n .item {\n anchor-name: var(--anchor-name);\n display: flex;\n padding: 6px var(--space-m);\n font-size: var(--text-m);\n }\n\n .submenu-popover {\n position: fixed;\n position-anchor: var(--anchor-name);\n inset: auto;\n top: anchor(top);\n left: anchor(right);\n margin: 0;\n padding: 0;\n border: none;\n background: transparent;\n /* UA stylesheet sets overflow:auto on [popover], which clips the box-shadow\n of the inner ixfx-menu-container child. Override to let the shadow render. */\n overflow: visible;\n position-try-fallbacks: flip-inline, flip-block, flip-block flip-inline;\n }\n\n :host(:focus) {\n outline: none;\n }\n\n .item.disabled {\n opacity: var(--disabled-opacity);\n cursor: default;\n }\n\n .item.disabled:hover {\n background: transparent;\n }\n\n .icon-slot {\n width: 0;\n overflow: hidden;\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n\n :host([icon-name]) .icon-slot,\n :host([data-icon-section]) .icon-slot {\n width: 1em;\n height: 1em;\n margin-right: var(--space-s);\n }\n\n .label {\n flex: 1;\n }\n\n .arrow {\n color: var(--surface-muted-text);\n margin-left: var(--space-m);\n }\n `];\n\n render() {\n const resolvedIcon = this._resolvedIcon();\n return html`\n <div\n class=\"item ${this.disabled ? `disabled` : ``}\"\n @click=${this._handleClick}\n @mouseenter=${this._handleMouseEnter}\n @mouseleave=${this._handleMouseLeave}\n tabindex=\"${this.disabled ? -1 : 0}\"\n role=\"menuitem\"\n aria-haspopup=\"true\"\n aria-expanded=\"false\"\n >\n <span class=\"icon-slot\">${resolvedIcon ? html`<ixfx-icon name=\"${resolvedIcon}\"></ixfx-icon>` : null}</span>\n <span class=\"label\"><slot></slot>${this.label}</span>\n <span class=\"arrow\">${this._hasSubmenu ? html`<ixfx-icon name=\"chevron-right\"></ixfx-icon>` : nothing}</span>\n </div>\n <div class=\"submenu-popover\" popover=\"auto\"\n @mouseenter=${this._handleSubmenuMouseEnter}\n @mouseleave=${this._handleSubmenuMouseLeave}\n >\n <slot name=\"submenu\" @slotchange=${this._handleSlotChange}></slot>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-menu-sub-trigger': MenuSubTrigger;\n }\n}\n","import { css, html, LitElement } from 'lit';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\n\n@customElement(`ixfx-menu-separator`)\nexport class MenuSeparator extends LitElement {\n static styles = [themeFallbacks, css`\n :host {\n display: block;\n margin: var(--space-xs) 0;\n }\n\n .separator {\n height: 1px;\n background: var(--surface-4);\n }\n `];\n\n render() {\n return html`<div class=\"separator\"></div>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-menu-separator': MenuSeparator;\n }\n}\n","import { css, html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\n\n@customElement(`ixfx-menu-header`)\nexport class MenuHeader extends LitElement {\n @property({ type: String }) label = ``;\n\n static styles = [themeFallbacks, css`\n :host {\n display: block;\n padding: 6px var(--space-m) var(--space-xs);\n font-size: var(--text-s);\n font-weight: var(--font-weight-bold);\n text-transform: uppercase;\n color: var(--surface-muted-text);\n letter-spacing: 0.5px;\n }\n `];\n\n render() {\n return html`<div>${this.label}</div>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-menu-header': MenuHeader;\n }\n}\n","import type { CommandRegistry, KeyboardManager } from '@clinth/ui-commands';\nimport type { TemplateResult } from 'lit';\nimport type { TreeNode } from '../tree/types.js';\nimport type { MenuTriggerCommandDetail } from './menu-trigger.js';\nimport { html, nothing } from 'lit';\nimport './menu-container.js';\nimport './menu-item.js';\nimport './menu-sub-trigger.js';\nimport './menu-separator.js';\nimport './menu-header.js';\n\nexport type MenuFromTreeOptions = {\n onCommand?: (detail: MenuTriggerCommandDetail) => void;\n registry?: CommandRegistry<unknown>;\n keyboardManager?: KeyboardManager;\n};\n\nfunction isLeaf(node: TreeNode): boolean {\n return node.children === undefined || node.children.length === 0;\n}\n\nexport function menuFromTree(\n nodes: TreeNode[],\n options: MenuFromTreeOptions = {},\n): TemplateResult {\n const { onCommand, registry, keyboardManager } = options;\n\n return html`${nodes.map((node) => {\n const label = node.item.label;\n\n if (label === `-`) {\n return html`<ixfx-menu-separator></ixfx-menu-separator>`;\n }\n\n if (label.startsWith(`# `)) {\n return html`<ixfx-menu-header label=\"${label.slice(2)}\"></ixfx-menu-header>`;\n }\n\n if (!isLeaf(node)) {\n const submenu = menuFromTree(node.children!, options);\n return html`\n <ixfx-menu-sub-trigger label=\"${label}\">\n <ixfx-menu-container\n slot=\"submenu\"\n .registry=${registry ?? nothing}\n .keyboardManager=${keyboardManager ?? nothing}\n >${submenu}</ixfx-menu-container>\n </ixfx-menu-sub-trigger>\n `;\n }\n\n return html`\n <ixfx-menu-item\n command=\"${node.item.key}\"\n label=\"${label}\"\n icon-name=\"${node.item.icon ?? nothing}\"\n @command=${onCommand ? (e: CustomEvent) => onCommand(e.detail) : nothing}\n ></ixfx-menu-item>\n `;\n })}`;\n}\n\nfunction buildMenuItemEl(\n node: TreeNode,\n options: MenuFromTreeOptions,\n): HTMLElement {\n const { onCommand, registry } = options;\n const label = node.item.label;\n\n const el = document.createElement(`ixfx-menu-item`);\n el.setAttribute(`command`, node.item.key);\n el.setAttribute(`label`, label);\n if (node.item.icon) {\n el.setAttribute(`icon-name`, node.item.icon);\n }\n if (onCommand) {\n el.addEventListener(`command`, e => onCommand((e as CustomEvent).detail));\n }\n if (registry) {\n (el as any).registry = registry;\n }\n return el;\n}\n\nfunction buildMenuSeparatorEl(): HTMLElement {\n return document.createElement(`ixfx-menu-separator`);\n}\n\nfunction buildMenuHeaderEl(label: string): HTMLElement {\n const el = document.createElement(`ixfx-menu-header`);\n el.setAttribute(`label`, label);\n return el;\n}\n\nfunction buildMenuSubTriggerEl(\n node: TreeNode,\n options: MenuFromTreeOptions,\n): HTMLElement {\n const { registry, keyboardManager } = options;\n\n const el = document.createElement(`ixfx-menu-sub-trigger`);\n el.setAttribute(`label`, node.item.label);\n if (registry)\n (el as any).registry = registry;\n if (keyboardManager)\n (el as any).keyboardManager = keyboardManager;\n\n const container = document.createElement(`ixfx-menu-container`);\n container.setAttribute(`slot`, `submenu`);\n if (registry)\n (container as any).registry = registry;\n if (keyboardManager)\n (container as any).keyboardManager = keyboardManager;\n\n const childEls = menuFromTreeToElements(node.children!, options);\n for (const child of childEls) {\n container.appendChild(child);\n }\n\n el.appendChild(container);\n return el;\n}\n\nexport function menuFromTreeToElements(\n nodes: TreeNode[],\n options: MenuFromTreeOptions = {},\n): HTMLElement[] {\n return nodes.map((node) => {\n const label = node.item.label;\n\n if (label === `-`) {\n return buildMenuSeparatorEl();\n }\n\n if (label.startsWith(`# `)) {\n return buildMenuHeaderEl(label.slice(2));\n }\n\n if (!isLeaf(node)) {\n return buildMenuSubTriggerEl(node, options);\n }\n\n return buildMenuItemEl(node, options);\n });\n}\n","import { css, html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { tickledItemStyles } from '../interaction/index.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport '../icons/icon.js';\n\nexport type MenuRadioItemSelectDetail = {\n readonly value: string;\n};\n\nexport type MenuRadioItemSelectEvent = CustomEvent<MenuRadioItemSelectDetail>;\n\n@customElement(`ixfx-menu-radio-item`)\nexport class MenuRadioItem extends LitElement {\n @property({ type: String }) value = ``;\n @property({ type: String }) label = ``;\n @property({ type: Boolean }) disabled = false;\n @property({ type: String }) groupValue = ``;\n @property({ type: String, attribute: `icon-name` }) iconName = ``;\n\n private handleClick(): void {\n if (this.disabled)\n return;\n\n this.dispatchEvent(new CustomEvent<MenuRadioItemSelectDetail>(`radio-select`, {\n detail: { value: this.value },\n bubbles: true,\n composed: true,\n }));\n }\n\n static override styles = [themeFallbacks, tickledItemStyles, css`\n :host {\n display: block;\n }\n\n .item {\n display: flex;\n padding: 6px var(--space-m);\n font-size: var(--text-m);\n }\n\n :host(:focus) {\n outline: none;\n }\n\n .item.disabled {\n opacity: var(--disabled-opacity);\n cursor: default;\n }\n\n .item.disabled:hover {\n background: transparent;\n }\n\n .radio {\n width: 1em;\n margin-left: var(--space-xs);\n font-size: var(--text-m);\n color: var(--accent);\n }\n\n .icon-slot {\n width: 0;\n overflow: hidden;\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n\n :host([icon-name]) .icon-slot,\n :host([data-icon-section]) .icon-slot {\n width: 1em;\n height: 1em;\n margin-right: var(--space-s);\n }\n\n .label {\n flex: 1;\n }\n `];\n\n render() {\n const isSelected = this.groupValue === this.value;\n\n return html`\n <div \n class=\"item ${this.disabled ? `disabled` : ``}\"\n @click=${this.handleClick}\n tabindex=\"${this.disabled ? -1 : 0}\"\n role=\"menuitemradio\"\n aria-checked=\"${isSelected}\"\n >\n <span class=\"radio\">${isSelected ? `●` : ``}</span>\n <span class=\"icon-slot\">${this.iconName ? html`<ixfx-icon name=\"${this.iconName}\"></ixfx-icon>` : null}</span>\n <span class=\"label\">${this.label}</span>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-menu-radio-item': MenuRadioItem;\n }\n}\n","import { css, html, LitElement } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport './menu-radio-item.js';\n\nexport type MenuRadioGroupChangeDetail = {\n readonly name: string;\n readonly value: string;\n};\n\nexport type MenuRadioGroupChangeEvent = CustomEvent<MenuRadioGroupChangeDetail>;\n\n@customElement(`ixfx-menu-radio-group`)\nexport class MenuRadioGroup extends LitElement {\n @property({ type: String }) name = ``;\n @property({ type: String }) value = ``;\n\n @state() private slottedElements: Element[] = [];\n\n private handleSlotChange(e: Event): void {\n const slot = e.target as HTMLSlotElement;\n this.slottedElements = slot.assignedElements();\n this.updateSlottedValues();\n }\n\n private updateSlottedValues(): void {\n for (const el of this.slottedElements) {\n (el as any).groupValue = this.value;\n }\n }\n\n private handleRadioSelect(e: CustomEvent): void {\n this.value = e.detail.value;\n this.dispatchEvent(new CustomEvent<MenuRadioGroupChangeDetail>(`radio-change`, {\n detail: {\n name: this.name,\n value: this.value,\n },\n bubbles: true,\n composed: true,\n }));\n }\n\n updated(changedProperties: Map<string, unknown>): void {\n if (changedProperties.has(`value`)) {\n this.updateSlottedValues();\n }\n }\n\n static styles = css`\n :host {\n display: block;\n }\n\n ::slotted(menu-radio-item) {\n display: block;\n }\n `;\n\n render() {\n return html`\n <slot @slotchange=${this.handleSlotChange} @radio-select=${this.handleRadioSelect}></slot>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-menu-radio-group': MenuRadioGroup;\n }\n}\n","export { MenuBar } from './menu-bar.js';\nexport { MenuCheckItem } from './menu-check-item.js';\nexport { MenuCommandController } from './menu-command-controller.js';\nexport { MenuContainer } from './menu-container.js';\nexport { menuFromTree, menuFromTreeToElements } from './menu-from-tree.js';\nexport type { MenuFromTreeOptions } from './menu-from-tree.js';\nexport { MenuHeader } from './menu-header.js';\nexport { MenuItem } from './menu-item.js';\nexport { MenuRadioGroup } from './menu-radio-group.js';\nexport { MenuRadioItem } from './menu-radio-item.js';\nexport { MenuSeparator } from './menu-separator.js';\nexport { MenuSubTrigger } from './menu-sub-trigger.js';\nexport { MenuTrigger } from './menu-trigger.js';\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"menu-item-B0zqw2xp.d.ts","names":[],"sources":["../src/menu/menu-container.ts","../src/menu/menu-trigger.ts","../src/menu/menu-item.ts"],"mappings":";;;;cASa,sBAAsB;EACgB;EACjB,WAAW;EACX,kBAAkB;UACvB;UAGnB;SAwBD,sBAAM;UA4BL;UAkDA;EAYC,QAAQ,mBAAmB;;;;EASpC,WAAW,SAAS,IAAI;EAOxB,wBAAM;UAaE;;;;;UAoCA;UAiCA;EA0BR;UAIQ;UAQA;UAUA;UAqDA;;QAqCF;YACI;IACR,uBAAuB;;;;;KCvWtB;KACA;KAEO;WACD;WACA;WACA;;cAME,oBAAoB;EACY,MAAM;EACrB;;EAEwB;EACpB,WAAW;EACX,kBAAkB;EACtB,WAAW;;EAEa;UAEnC;UACA;UACA;UACA;UAEc;UACN;iBAEV;UAEP;UACA;;UAEA;;UAEA;;UAEA;EAER;EAOA;EASA;EA0BA,QAAQ,mBAAmB;UAgBnB;UAqBA;UAWA;UAOA;UAKA;MAKJ;EAIJ;EAIA;EAIA;UAIQ;UAiBA;UAQA;UAYA;UAeA;UAYA;UAOA;;;;;;;UAqBA;UAcA;UAeA;UAkBA;UAQA;;;;;;UAYA;UAOA;SAsBD,sBAAM;EAsGb,wBAAM;;QAuCA;YACI;IACR,qBAAqB;;;;;cCzeZ,iBAAiB;EACA;EAC2B;EAC3B;EACC;EACuB;EACpB,WAAW;EACX,kBAAkB;EAClB,iBAAiB;UAEhC;UACM;UAEf;EAER;UAOQ;UAKA;UAWA;UAQA;UAUA;UAUA;UAWA;UASA;EASR,WAAW,mBAAmB;EAU9B,QAAQ,mBAAmB;UAInB;SAaQ,sBAAM;EAkEtB,wBAAM;;QAwBA;YACI;IACR,kBAAkB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"menu-item-BDEekBVy.js","names":["customElement","customElement","customElement"],"sources":["../src/menu/menu-container.ts","../src/menu/menu-trigger.ts","../src/menu/menu-item.ts"],"sourcesContent":["import type { CommandRegistry, KeyboardManager } from '@clinth/ui-commands';\nimport { css, html, LitElement } from 'lit';\nimport { property, query } from 'lit/decorators.js';\nimport { TickledController, tickledStyles } from '../interaction/index.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { popupSurfaceStyles } from '../styles/popup.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\n\n@customElement(`ixfx-menu-container`)\nexport class MenuContainer extends LitElement {\n @property({ type: String, attribute: `anchor` }) anchor?: string;\n @property({ attribute: false }) registry?: CommandRegistry<unknown>;\n @property({ attribute: false }) keyboardManager?: KeyboardManager;\n @query(`.popover`) private _popover!: HTMLElement;\n\n // TickledController manages input mode and tickled state\n private tickled = new TickledController<number>(this, {\n getItems: () => {\n const items = this._getMenuItems();\n return items.map((item, i) => ({\n id: i,\n enabled: !item.hasAttribute(`disabled`),\n }));\n },\n onTickle: (index) => {\n // When an item is tickled (hovered/keyboard focused), handle submenu opening\n const items = this._getMenuItems();\n if (index !== undefined) {\n const item = items[index];\n // Ensure the item is focusable and focus it\n item.tabIndex = 0;\n item.focus({ preventScroll: true });\n }\n },\n onStateChange: () => {\n // Sync DOM attributes for slotted content\n this._syncTickledClasses();\n },\n });\n\n static styles = [popupSurfaceStyles, themeFallbacks, tickledStyles, css`\n :host {\n display: block;\n }\n\n .popover {\n padding: var(--space-xs) 0;\n min-width: 160px;\n }\n\n :host {\n opacity: 1;\n transform: translateY(0) scale(1);\n transition: opacity 0.12s ease-out, transform 0.12s ease-out,\n display 0.12s allow-discrete, overlay 0.12s allow-discrete;\n }\n\n @starting-style :host {\n opacity: 0;\n transform: translateY(-4px) scale(0.97);\n }\n\n ::slotted(menu-separator) {\n display: block;\n margin: var(--space-xs) 0;\n }\n `];\n\n private _updateIconSections(): void {\n const slot = this.shadowRoot?.querySelector(`slot`) as HTMLSlotElement | null;\n if (!slot)\n return;\n\n const assigned = slot.assignedElements({ flatten: true });\n\n // Group direct children into sections delimited by separators and headers\n const sections: Element[][] = [];\n let section: Element[] = [];\n for (const el of assigned) {\n if (el.tagName === `IXFX-MENU-SEPARATOR` || el.tagName === `IXFX-MENU-HEADER`) {\n if (section.length > 0) {\n sections.push(section); section = [];\n }\n } else {\n section.push(el);\n }\n }\n if (section.length > 0)\n sections.push(section);\n\n this._propagateContext();\n\n for (const sec of sections) {\n const hasIcon = sec.some((el) => {\n if (el.tagName === `IXFX-MENU-RADIO-GROUP`) {\n return [...el.children].some(ri => ri.hasAttribute(`icon-name`));\n }\n return el.hasAttribute(`icon-name`);\n });\n\n for (const el of sec) {\n if (el.tagName === `IXFX-MENU-RADIO-GROUP`) {\n for (const ri of el.children) {\n if (hasIcon)\n ri.setAttribute(`data-icon-section`, ``);\n else ri.removeAttribute(`data-icon-section`);\n }\n } else {\n if (hasIcon)\n el.setAttribute(`data-icon-section`, ``);\n else el.removeAttribute(`data-icon-section`);\n }\n }\n }\n\n this.performUpdate();\n }\n\n private _propagateContext(): void {\n const slot = this.shadowRoot?.querySelector(`slot`) as HTMLSlotElement | null;\n if (!slot)\n return;\n for (const el of slot.assignedElements({ flatten: true })) {\n if (`registry` in el)\n (el as any).registry = this.registry;\n if (`keyboardManager` in el)\n (el as any).keyboardManager = this.keyboardManager;\n }\n }\n\n override updated(changedProperties: Map<string, unknown>): void {\n if (changedProperties.has(`registry`) || changedProperties.has(`keyboardManager`)) {\n this._propagateContext();\n }\n }\n\n /**\n * Sync data-input-mode to :host so CSS variables cascade to slotted items\n */\n willUpdate(changed: Map<PropertyKey, unknown>): void {\n super.willUpdate(changed);\n // Set data-input-mode on :host so tickledStyles CSS variables cascade\n // through shadow DOM to slotted menu items\n this.setAttribute(`data-input-mode`, this.tickled.inputMode);\n }\n\n render() {\n return html`\n <div\n class=\"popover popup-surface\"\n role=\"menu\"\n @keydown=${this._handleKeydown}\n @mouseover=${this._handleMouseOver}\n >\n <slot @slotchange=${this._updateIconSections}></slot>\n </div>\n `;\n }\n\n private _getMenuItems(): HTMLElement[] {\n const slot = this.shadowRoot?.querySelector(`slot`);\n if (!slot)\n return [];\n\n const skipTags = [`IXFX-MENU-SEPARATOR`, `IXFX-MENU-HEADER`];\n const result: HTMLElement[] = [];\n\n for (const el of slot.assignedElements({ flatten: true })) {\n if (skipTags.includes(el.tagName))\n continue;\n if (el.hasAttribute(`disabled`))\n continue;\n const role = el.getAttribute(`role`);\n if (role === `none` || role === `presentation`)\n continue;\n\n if (el.tagName === `IXFX-MENU-RADIO-GROUP`) {\n const groupSlot = el.shadowRoot?.querySelector(`slot`) as HTMLSlotElement | null;\n for (const radioItem of groupSlot?.assignedElements({ flatten: true }) ?? []) {\n if (!radioItem.hasAttribute(`disabled`)) {\n result.push(radioItem as HTMLElement);\n }\n }\n } else {\n result.push(el as HTMLElement);\n }\n }\n\n return result;\n }\n\n /**\n * Sync .tickled class on slotted items to match controller state\n * This is called via onStateChange whenever the tickled state changes\n */\n private _syncTickledClasses(): void {\n const items = this._getMenuItems();\n items.forEach((item, i) => {\n if (this.tickled.isTickled(i)) {\n item.classList.add(`tickled`);\n item.tabIndex = 0;\n // Set inline styles to ensure visibility across shadow DOM boundaries\n const innerItem = item.shadowRoot?.querySelector(`.item`) as HTMLElement | null;\n if (innerItem) {\n innerItem.style.background = `rgba(0, 0, 0, 0.06)`;\n innerItem.style.borderColor = `var(--accent)`;\n innerItem.style.color = `inherit`;\n }\n } else {\n item.classList.remove(`tickled`);\n item.tabIndex = -1;\n // Clear inline styles\n const innerItem = item.shadowRoot?.querySelector(`.item`) as HTMLElement | null;\n if (innerItem) {\n innerItem.style.background = ``;\n innerItem.style.borderColor = ``;\n innerItem.style.color = ``;\n }\n }\n });\n\n // Focus the tickled item if in keyboard mode\n if (this.tickled.inputMode === `keyboard` && this.tickled.tickledId !== undefined) {\n const tickledItem = items[this.tickled.tickledId];\n tickledItem?.focus();\n }\n }\n\n private _handleMouseOver = (e: MouseEvent): void => {\n const items = this._getMenuItems();\n // composedPath crosses shadow boundaries to find the hovered menu item\n const path = e.composedPath();\n const hoveredIndex = items.findIndex(item => path.includes(item));\n if (hoveredIndex !== -1) {\n const item = items[hoveredIndex];\n // If IXFX-MENU-CONTAINER appears before this item in the composed path, the\n // event originated from inside a nested submenu. Skip the focus override so the\n // inner container keeps ownership of focus. stopPropagation() alone is not\n // sufficient because it does not reliably cross shadow-root boundaries with\n // popovers in the stack — both this handler and the inner one will fire.\n const itemPathIndex = path.indexOf(item);\n const isFromInsideSubmenu = path.slice(0, itemPathIndex).some(\n node => node instanceof Element && node.tagName === `IXFX-MENU-CONTAINER`,\n );\n if (!isFromInsideSubmenu) {\n // Use TickledController to handle mouse hover\n this.tickled.handlePointerEnter(hoveredIndex);\n }\n // Stop propagation so ancestor MenuContainers don't override this focus\n // with their own mouseover handler (e.g. outer menu focusing the sub-trigger).\n e.stopPropagation();\n }\n };\n\n focusFirst(): void {\n this.tickled.handleKeyboardNavigation(`first`);\n }\n\n private _focusNext(items: HTMLElement[], direction: number): void {\n if (items.length === 0) {\n return;\n }\n\n this.tickled.handleKeyboardNavigation(direction > 0 ? `next` : `previous`);\n }\n\n private _focusItem(items: HTMLElement[], index: number): void {\n if (items.length === 0) {\n return;\n }\n\n // Clamp index to valid range\n const clampedIndex = Math.max(0, Math.min(index, items.length - 1));\n this.tickled.handleKeyboardNavigation(clampedIndex);\n }\n\n private _activateFocusedItem(items: HTMLElement[]): void {\n const tickledIndex = this.tickled.tickledId;\n if (tickledIndex === undefined) {\n return;\n }\n\n const item = items[tickledIndex];\n if (!item) {\n return;\n }\n\n const tagName = item.tagName;\n\n if (tagName === `IXFX-MENU-SUB-TRIGGER`) {\n // Native menu behavior handles submenu navigation automatically\n return;\n }\n\n if (tagName === `IXFX-MENU-CHECK-ITEM`) {\n const checkItem = item as any;\n checkItem.checked = !checkItem.checked;\n checkItem.dispatchEvent(new CustomEvent(`command`, {\n detail: { command: checkItem.command, checked: checkItem.checked },\n bubbles: true,\n composed: true,\n }));\n return;\n }\n\n if (tagName === `IXFX-MENU-RADIO-ITEM`) {\n item.dispatchEvent(new CustomEvent(`radio-select`, {\n detail: { value: (item as any).value },\n bubbles: true,\n composed: true,\n }));\n return;\n }\n\n if (tagName === `IXFX-MENU-ITEM`) {\n const command = (item as any).command;\n if (command) {\n item.dispatchEvent(new CustomEvent(`command`, {\n detail: { command },\n bubbles: true,\n composed: true,\n }));\n }\n return;\n }\n\n (item as HTMLElement).click();\n }\n\n private _handleKeydown = (e: KeyboardEvent): void => {\n const items = this._getMenuItems();\n if (items.length === 0) {\n return;\n }\n\n switch (e.key) {\n case `ArrowDown`:\n e.preventDefault();\n e.stopPropagation();\n this._focusNext(items, 1);\n break;\n case `ArrowUp`:\n e.preventDefault();\n e.stopPropagation();\n this._focusNext(items, -1);\n break;\n case `Home`:\n e.preventDefault();\n e.stopPropagation();\n this._focusItem(items, 0);\n break;\n case `End`:\n e.preventDefault();\n e.stopPropagation();\n this._focusItem(items, items.length - 1);\n break;\n case `Enter`:\n case ` `:\n e.preventDefault();\n e.stopPropagation();\n this._activateFocusedItem(items);\n break;\n }\n };\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-menu-container': MenuContainer;\n }\n}\n","import type { CommandRegistry, KeyboardManager } from '@clinth/ui-commands';\nimport { css, html, LitElement } from 'lit';\nimport { property, query, state } from 'lit/decorators.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { popupSurfaceStyles } from '../styles/popup.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport '../icons/icon.js';\nimport './menu-container.js';\n\ntype MenuMode = `trigger` | `dropdown` | `context`;\ntype Placement = `bottom-start` | `bottom-end` | `right-start`;\n\nexport type MenuTriggerCommandDetail = {\n readonly command?: string;\n readonly value?: string;\n readonly checked?: boolean;\n};\n\nexport type MenuTriggerCommandEvent = CustomEvent<MenuTriggerCommandDetail>;\n\n@customElement(`ixfx-menu-trigger`)\nexport class MenuTrigger extends LitElement {\n @property({ type: String, reflect: true }) mode: MenuMode = `trigger`;\n @property({ type: String }) label = ``;\n /** Render an `ixfx-icon` in the default button instead of the text `label`. */\n @property({ type: String, attribute: `icon-name` }) iconName = ``;\n @property({ attribute: false }) registry?: CommandRegistry<unknown>;\n @property({ attribute: false }) keyboardManager?: KeyboardManager;\n @property({ type: String }) placement: Placement = `bottom-start`;\n /** Set false when a host widget manages its own roving/virtual focus (e.g. crumb-navigation) and opens this menu programmatically, so the trigger button should not be a native Tab stop. */\n @property({ type: Boolean, attribute: `tab-stop` }) tabStop = true;\n\n @state() private _isOpen = false;\n @state() private _hasMenu = false;\n @state() private _hasTriggerSlot = false;\n @state() private _hasContextTarget = false;\n\n @query(`.trigger-btn`) private _triggerBtn!: HTMLButtonElement;\n @query(`.popup`) private _popup!: HTMLElement;\n\n private static _count = 0;\n\n private _anchorName = `--mt-${MenuTrigger._count++}`;\n private _clickListener = this._handleClickOutside.bind(this);\n /** Element focused when the menu opened; focus returns here on Escape/Tab when there is no trigger button (context-target mode). */\n private _focusBeforeOpen: HTMLElement | null = null;\n /** A mouse button is currently down on the trigger area. */\n private _mouseHeld = false;\n /** A context open was requested while the mouse button was still down. */\n private _openOnRelease = false;\n\n connectedCallback(): void {\n super.connectedCallback();\n document.addEventListener(`keydown`, this._handleKeydown);\n this.addEventListener(`command`, this._handleCommand as EventListener);\n this.addEventListener(`radio-change`, this._handleRadioChange as EventListener);\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n document.removeEventListener(`keydown`, this._handleKeydown);\n this.removeEventListener(`command`, this._handleCommand as EventListener);\n this.removeEventListener(`radio-change`, this._handleRadioChange as EventListener);\n document.removeEventListener(`click`, this._clickListener);\n this._removeReleaseListeners();\n }\n\n firstUpdated(): void {\n this.style.setProperty(`--anchor-name`, this._anchorName);\n this._popup.addEventListener(`toggle`, this._handlePopoverToggle);\n\n this.updateComplete.then(() => {\n const slot = this.shadowRoot?.querySelector(`slot[name=\"menu\"]`) as HTMLSlotElement | undefined;\n if (slot) {\n const assigned = slot.assignedElements({ flatten: true });\n if (assigned.length > 0) {\n this._hasMenu = true;\n this._propagateContext();\n }\n }\n\n // Initialise slot-derived state directly: browsers fire slotchange\n // asynchronously (after this first paint), so this avoids a flash of\n // the default trigger button for context targets present at load.\n const contextSlot = this.shadowRoot?.querySelector(`slot[name=\"context-target\"]`) as HTMLSlotElement | undefined;\n if (contextSlot) {\n this._hasContextTarget = contextSlot.assignedElements({ flatten: true }).length > 0;\n }\n\n this._updatePosition();\n });\n }\n\n updated(changedProperties: Map<string, unknown>): void {\n if (changedProperties.has(`registry`) || changedProperties.has(`keyboardManager`)) {\n this._propagateContext();\n }\n if (changedProperties.has(`mode`) || changedProperties.has(`_hasContextTarget`)) {\n // Drives the :host sizing contract (see styles). Only meaningful when\n // the context-target slot is rendered, i.e. in context mode.\n this.toggleAttribute(`has-context-target`, this.mode === `context` && this._hasContextTarget);\n }\n if (changedProperties.has(`mode`)) {\n // Context opens overwrite the anchor positioning with pointer-fixed\n // styles; restore the anchor placement when leaving context mode.\n this._updatePosition();\n }\n }\n\n private _updatePosition(): void {\n const placements: Record<Placement, { insetArea: string }> = {\n 'bottom-start': { insetArea: `block-end span-inline-start` },\n 'bottom-end': { insetArea: `block-end span-inline-end` },\n 'right-start': { insetArea: `inline-end span-block-start` },\n };\n const pos = placements[this.placement];\n (this._popup.style as any).insetArea = pos.insetArea;\n (this._popup.style as any).positionAnchor = this._anchorName;\n // fallback for browsers without inset-area\n const fallbacks: Record<Placement, { top: string; left: string; right: string }> = {\n 'bottom-start': { top: `anchor(bottom)`, left: `anchor(left)`, right: `auto` },\n 'bottom-end': { top: `anchor(bottom)`, left: `auto`, right: `anchor(left)` },\n 'right-start': { top: `anchor(top)`, left: `anchor(right)`, right: `auto` },\n };\n const fb = fallbacks[this.placement];\n this._popup.style.top = fb.top;\n this._popup.style.left = fb.left;\n (this._popup.style as any).right = fb.right;\n }\n\n private _propagateContext(): void {\n const slot = this.shadowRoot?.querySelector(`slot[name=\"menu\"]`) as HTMLSlotElement | undefined;\n const items = slot?.assignedElements({ flatten: true }) ?? [];\n for (const el of items) {\n if (`registry` in el)\n (el as any).registry = this.registry;\n if (`keyboardManager` in el)\n (el as any).keyboardManager = this.keyboardManager;\n }\n }\n\n private _handleSlotChange(e: Event): void {\n const slot = e.target as HTMLSlotElement;\n const assigned = slot.assignedElements({ flatten: true });\n this._hasMenu = assigned.length > 0;\n this._propagateContext();\n }\n\n private _handleTriggerSlotChange(e: Event): void {\n const slot = e.target as HTMLSlotElement;\n this._hasTriggerSlot = slot.assignedElements({ flatten: true }).length > 0;\n }\n\n private _handleContextTargetSlotChange(e: Event): void {\n const slot = e.target as HTMLSlotElement;\n this._hasContextTarget = slot.assignedElements({ flatten: true }).length > 0;\n }\n\n get isOpen(): boolean {\n return this._isOpen;\n }\n\n openMenu(): void {\n this._openMenu();\n }\n\n closeMenu(): void {\n this._closeMenu();\n }\n\n focusTrigger(): void {\n this._triggerBtn?.focus();\n }\n\n private _openMenu(): void {\n if (this._isOpen || !this._popup?.popover)\n return;\n this._focusBeforeOpen = deepActiveElement();\n try {\n (this._popup as any).showPopover({ source: this });\n this._isOpen = true;\n document.addEventListener(`click`, this._clickListener);\n this.dispatchEvent(new CustomEvent(`menu-trigger-open`, { bubbles: true, composed: true }));\n requestAnimationFrame(() => {\n this._getMenuContainer()?.focusFirst();\n });\n } catch (err) {\n console.warn(`showPopover failed:`, err);\n }\n }\n\n private _handlePopoverToggle = (e: Event): void => {\n if ((e as ToggleEvent).newState === `closed`) {\n this._isOpen = false;\n document.removeEventListener(`click`, this._clickListener);\n this.dispatchEvent(new CustomEvent(`menu-trigger-close`, { bubbles: true, composed: true }));\n }\n };\n\n private _closeMenu(): void {\n if (!this._isOpen)\n return;\n if (this._popup?.popover) {\n try {\n (this._popup as any).hidePopover();\n } catch { /* ignore */ }\n }\n this._isOpen = false;\n document.removeEventListener(`click`, this._clickListener);\n }\n\n private _handleTriggerClick(e: Event): void {\n // `context` mode opens only via `_handleContextMenu` (right-click). The\n // context target is the consumer's own interactive surface, so a plain\n // left click must reach the page, not toggle the menu.\n if (this.mode === `context`)\n return;\n e.stopPropagation();\n if (this._isOpen) {\n this._closeMenu();\n this._triggerBtn?.focus();\n } else {\n this._openMenu();\n }\n }\n\n private _handleClickOutside(e: Event): void {\n if (!this.contains(e.target as Node)) {\n if (this._popup?.popover && this._popup.hasAttribute(`open`)) {\n try {\n (this._popup as any).hidePopover();\n } catch {\n // ignore\n }\n }\n }\n }\n\n private _getMenuContainer(): (HTMLElement & { focusFirst: () => void }) | null {\n const slot = this.shadowRoot?.querySelector(`slot[name=\"menu\"]`) as HTMLSlotElement | null;\n const assigned = slot?.assignedElements({ flatten: true }) ?? [];\n const container = assigned.find(el => el.tagName === `IXFX-MENU-CONTAINER`);\n return (container as any) ?? null;\n }\n\n private _handleKeydown = (e: KeyboardEvent): void => {\n if (!this._isOpen)\n return;\n\n if (e.key === `Escape`) {\n e.preventDefault();\n e.stopPropagation();\n this._closeMenu();\n this._restoreFocus();\n } else if (e.key === `Tab`) {\n this._closeMenu();\n this._restoreFocus();\n }\n };\n\n /**\n * Return focus after a keyboard close. The trigger button is the natural\n * target, but it is not rendered for a context target — then fall back to\n * whatever was focused at open (don't rely on the browser's popover focus\n * restoration), and finally the host.\n */\n private _restoreFocus(): void {\n if (this._triggerBtn) {\n this._triggerBtn.focus();\n return;\n }\n const previous = this._focusBeforeOpen;\n this._focusBeforeOpen = null;\n if (previous?.isConnected && previous !== document.body) {\n previous.focus();\n } else {\n this.focus();\n }\n }\n\n private _handleCommand(e: CustomEvent): void {\n if (this._popup?.popover) {\n try {\n (this._popup as any).hidePopover();\n } catch {\n // ignore\n }\n }\n this.dispatchEvent(new CustomEvent<MenuTriggerCommandDetail>(`menu-command`, {\n detail: e.detail,\n bubbles: true,\n composed: true,\n }));\n }\n\n private _handleRadioChange(e: CustomEvent): void {\n if (this._popup?.popover) {\n try {\n (this._popup as any).hidePopover();\n } catch {\n // ignore\n }\n }\n this.dispatchEvent(new CustomEvent<MenuTriggerCommandDetail>(`menu-command`, {\n detail: {\n command: e.detail.name,\n value: e.detail.value,\n },\n bubbles: true,\n composed: true,\n }));\n }\n\n private _handlePointerDown(e: PointerEvent): void {\n if (this.mode !== `context` || e.pointerType !== `mouse`)\n return;\n this._mouseHeld = true;\n document.addEventListener(`pointerup`, this._handleRelease, { capture: true, once: true });\n document.addEventListener(`pointercancel`, this._handleRelease, { capture: true, once: true });\n }\n\n private _removeReleaseListeners(): void {\n document.removeEventListener(`pointerup`, this._handleRelease, { capture: true });\n document.removeEventListener(`pointercancel`, this._handleRelease, { capture: true });\n this._mouseHeld = false;\n this._openOnRelease = false;\n }\n\n /**\n * End of a mouse press. If a context open was deferred, open after the\n * release has been fully dispatched, so popover light-dismiss (which\n * evaluates the pointerup) does not immediately close the new popover.\n */\n private _handleRelease = (): void => {\n const shouldOpen = this._openOnRelease;\n this._removeReleaseListeners();\n if (shouldOpen)\n setTimeout(() => this._openMenu(), 0);\n };\n\n private _handleContextMenu(e: MouseEvent): void {\n if (this.mode !== `context`)\n return;\n e.preventDefault();\n this._popup.style.top = `${e.clientY}px`;\n this._popup.style.left = `${e.clientX}px`;\n this._popup.style.position = `fixed`;\n (this._popup.style as any).positionAnchor = `none`;\n // macOS fires `contextmenu` on mousedown. Opening an auto popover while\n // the button is held gets it light-dismissed by the pointerup, so defer\n // to the release. Keyboard/touch (no held mouse button) open immediately.\n if (this._mouseHeld) {\n this._openOnRelease = true;\n return;\n }\n // Route through the same state machine as trigger/dropdown opens so\n // `_isOpen`, the outside-click listener and `menu-trigger-open` all\n // behave identically. Position styles are live while open, so a repeat\n // right-click repositions; _openMenu() no-ops when already open.\n this._openMenu();\n }\n\n static styles = [\n themeFallbacks,\n popupSurfaceStyles,\n css`\n :host {\n display: inline-block;\n position: relative;\n --ixfx-button-padding: var(--ixfx-button-padding, var(--space-s) var(--space-m));\n }\n\n /* Context mode with a context-target: dissolve the host's box so the\n slotted surface is itself the item in the consumer's flex/grid layout.\n Otherwise the host sizes to the surface's full un-scrolled content and\n a height-constrained parent never clips it. Safe because context opens\n position the popup at the pointer (fixed), not via the anchor.\n Override with --menu-trigger-display (e.g. block) to keep a box. */\n :host([mode=\"context\"][has-context-target]) {\n display: var(--menu-trigger-display, contents);\n }\n\n .trigger-area {\n anchor-name: var(--anchor-name);\n /* Block flex (not inline-flex): as an inline-level box this would join\n the host's inline formatting context and pick up strut/baseline gaps\n above and below the button, offsetting the glyph from center. */\n display: flex;\n align-items: stretch;\n }\n\n /* In context mode the target is the consumer's own content surface (a\n list, canvas, whole panel) rather than a button wrapper. Dissolve the\n wrapper's box by default so slotted content participates directly in\n the layout established around the host and can be clipped/scroll within\n the space actually available. Set --menu-trigger-area-display: flex\n (plus --menu-trigger-area-flex) to keep a real box instead, e.g. for\n a mixed visible-trigger + context-target use. */\n :host([mode=\"context\"]) .trigger-area {\n display: var(--menu-trigger-area-display, contents);\n flex: var(--menu-trigger-area-flex, initial);\n }\n\n .trigger-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n line-height: 1;\n background: none;\n border: none;\n color: var(--surface-3-text);\n cursor: pointer;\n padding: var(--ixfx-button-padding);\n font-family: var(--font-family, inherit);\n font-size: var(--text-m);\n font-weight: 600;\n border-radius: var(--radius-s);\n opacity: 0.6;\n transition: opacity var(--transition), background var(--transition);\n }\n\n .trigger-btn:hover {\n background: var(--_trigger-hover-bg, var(--surface-4));\n color: var(--surface-3-text);\n opacity: var(--_trigger-hover-opacity, 1);\n }\n\n .trigger-btn:focus-visible {\n background: var(--surface-4);\n color: var(--surface-3-text);\n outline: none;\n opacity: 1;\n }\n\n .popup {\n position: fixed;\n position-anchor: var(--anchor-name);\n inset: auto;\n margin: 8px;\n padding: 0;\n border: none;\n background: transparent;\n z-index: 100;\n max-height: min(60vh, 400px);\n max-width: min(90vw, 320px);\n overflow: auto;\n overscroll-behavior: contain;\n position-try-fallbacks: flip-block, flip-inline, flip-block flip-inline;\n }\n\n .popup[popover] {\n opacity: 1;\n transform: translateY(0) scale(1);\n transition: opacity 0.12s ease-out, transform 0.12s ease-out,\n display 0.12s allow-discrete, overlay 0.12s allow-discrete;\n }\n\n @starting-style .popup {\n opacity: 0;\n transform: translateY(-4px) scale(0.97);\n }\n `,\n ];\n\n render() {\n const showButton = this.mode !== `dropdown` && this._hasMenu && !this._hasTriggerSlot\n // A context target is the consumer's own interactive surface — the\n // default button would be a duplicate, and inert, affordance.\n && !(this.mode === `context` && this._hasContextTarget);\n return html`\n <div\n class=\"trigger-area\"\n @click=${this._handleTriggerClick}\n @contextmenu=${this._handleContextMenu}\n @pointerdown=${this._handlePointerDown}\n >\n ${showButton\n ? html`<button class=\"trigger-btn\" part=\"base\" tabindex=${this.tabStop ? `0` : `-1`}>${this.iconName ? html`<ixfx-icon name=${this.iconName}></ixfx-icon>` : this.label || html`<ixfx-icon name=\"ellipsis-vertical\"></ixfx-icon>`}</button>`\n : null}\n ${this.mode === `context`\n ? html`<slot name=\"context-target\" @slotchange=${this._handleContextTargetSlotChange}></slot>`\n : null}\n <slot name=\"trigger\" @slotchange=${this._handleTriggerSlotChange}></slot>\n </div>\n <div\n class=\"popup popup-surface\"\n popover=\"auto\"\n @click=${(e: Event) => e.stopPropagation()}\n >\n <slot name=\"menu\" @slotchange=${this._handleSlotChange}></slot>\n </div>\n `;\n }\n}\n\n/** `document.activeElement`, followed down through open shadow roots. */\nfunction deepActiveElement(): HTMLElement | null {\n let el = document.activeElement;\n while (el?.shadowRoot?.activeElement)\n el = el.shadowRoot.activeElement;\n return el instanceof HTMLElement ? el : null;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-menu-trigger': MenuTrigger;\n }\n}\n","import type { CommandRegistry, KeyboardManager } from '@clinth/ui-commands';\nimport { css, html, LitElement } from 'lit';\nimport { property, query, state } from 'lit/decorators.js';\nimport { tickledItemStyles } from '../interaction/index.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport '../icons/icon.js';\n\nexport type MenuItemCommandDetail = {\n readonly command: string;\n readonly args: string;\n};\n\nexport type MenuItemCommandEvent = CustomEvent<MenuItemCommandDetail>;\n\n@customElement(`ixfx-menu-item`)\nexport class MenuItem extends LitElement {\n @property({ type: String }) command = ``;\n @property({ type: String, attribute: `command-args` }) commandArgs = ``;\n @property({ type: String }) label = ``;\n @property({ type: Boolean }) disabled = false;\n @property({ type: String, attribute: `icon-name` }) iconName = ``;\n @property({ attribute: false }) registry?: CommandRegistry<unknown>;\n @property({ attribute: false }) keyboardManager?: KeyboardManager;\n @property({ attribute: false }) submenuPopover?: HTMLElement;\n\n @state() private _hasChildren = false;\n @query(`slot`) private _slot!: HTMLSlotElement;\n\n private _hoverTimeout: number | null = null;\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n if (this._hoverTimeout) {\n clearTimeout(this._hoverTimeout);\n }\n }\n\n private _handleSlotChange(): void {\n const assigned = this._slot?.assignedElements() ?? [];\n this._hasChildren = assigned.length > 0;\n }\n\n private _handleMouseEnter(): void {\n if (this.disabled || !this._hasChildren || !this.submenuPopover)\n return;\n if (this._hoverTimeout) {\n clearTimeout(this._hoverTimeout);\n }\n this._hoverTimeout = window.setTimeout(() => {\n this._showSubmenu();\n }, 150);\n }\n\n private _handleMouseLeave(): void {\n if (this._hoverTimeout) {\n clearTimeout(this._hoverTimeout);\n this._hoverTimeout = null;\n }\n this._hideSubmenu();\n }\n\n private _showSubmenu(): void {\n if (!this.submenuPopover?.popover)\n return;\n try {\n this.submenuPopover.showPopover();\n } catch (err) {\n console.warn(`showPopover failed:`, err);\n }\n }\n\n private _hideSubmenu(): void {\n if (!this.submenuPopover?.popover)\n return;\n try {\n this.submenuPopover.hidePopover();\n } catch (err) {\n console.warn(`hidePopover failed:`, err);\n }\n }\n\n private handleClick(): void {\n if (this.disabled)\n return;\n\n this.dispatchEvent(new CustomEvent<MenuItemCommandDetail>(`command`, {\n detail: { command: this.command, args: this.commandArgs },\n bubbles: true,\n composed: true,\n }));\n }\n\n private _resolvedLabel(): string {\n if (this.label)\n return this.label;\n if (this.registry && this.command) {\n return this.registry.get(this.command)?.label ?? ``;\n }\n return ``;\n }\n\n private _resolvedIcon(): string | null {\n if (this.iconName)\n return this.iconName;\n if (this.registry && this.command) {\n return this.registry.get(this.command)?.icon ?? null;\n }\n return null;\n }\n\n willUpdate(changedProperties: Map<string, unknown>): void {\n super.willUpdate(changedProperties);\n const resolvedIcon = this._resolvedIcon();\n if (resolvedIcon && !this.iconName) {\n this.setAttribute(`data-icon-section`, ``);\n } else if (!resolvedIcon && !this.iconName) {\n this.removeAttribute(`data-icon-section`);\n }\n }\n\n updated(changedProperties: Map<string, unknown>): void {\n super.updated(changedProperties);\n }\n\n private _getShortcut(): string | null {\n if (!this.keyboardManager || !this.command)\n return null;\n const bindings = (this.keyboardManager as any).getBindings?.() ?? [];\n const binding = bindings.find((b: any) => b.commandId === this.command);\n if (!binding)\n return null;\n const mods = Array.from(binding.modifiers ?? [], (m: string) =>\n ({ ctrl: `⌃`, shift: `⇧`, alt: `⌥`, meta: `⌘` })[m] ?? m);\n const key = binding.key?.length === 1 ? binding.key.toUpperCase() : binding.key;\n return [...mods, key].join(``);\n }\n\n static override styles = [themeFallbacks, tickledItemStyles, css`\n :host {\n display: block;\n }\n\n .item {\n display: flex !important;\n align-items: center;\n padding: 6px var(--space-m);\n font-size: var(--text-m);\n background: var(--item-bg, transparent);\n border: var(--item-border, 1px solid transparent);\n color: var(--item-text, inherit);\n }\n\n :host(.tickled) .item {\n background: var(--item-bg-tickled);\n border: var(--item-border-tickled);\n color: var(--item-text-tickled);\n }\n\n :host(:focus) {\n outline: none;\n }\n\n .item.disabled {\n opacity: var(--disabled-opacity);\n cursor: default;\n }\n\n .item.disabled:hover {\n background: transparent;\n }\n\n .icon-slot {\n width: 0;\n overflow: hidden;\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n\n :host([icon-name]) .icon-slot,\n :host([data-icon-section]) .icon-slot {\n width: 1em;\n height: 1em;\n margin-right: var(--space-s);\n }\n\n .label {\n flex: 1;\n }\n\n .shortcut {\n margin-left: auto;\n color: var(--surface-muted-text);\n font-size: var(--text-s);\n }\n\n .arrow {\n color: var(--surface-muted-text);\n margin-left: var(--space-m);\n }\n `];\n\n render() {\n const shortcut = this._getShortcut();\n const resolvedIcon = this._resolvedIcon();\n return html`\n <div \n class=\"item ${this.disabled ? `disabled` : ``}\"\n @click=${this.handleClick}\n @mouseenter=${this._handleMouseEnter}\n @mouseleave=${this._handleMouseLeave}\n tabindex=\"${this.disabled ? -1 : 0}\"\n role=\"menuitem\"\n aria-haspopup=\"${this._hasChildren ? `true` : `false`}\"\n aria-expanded=\"${this.submenuPopover?.matches(`:popover-open`) ?? false}\"\n >\n <span class=\"icon-slot\">${resolvedIcon ? html`<ixfx-icon name=\"${resolvedIcon}\"></ixfx-icon>` : null}</span>\n <span class=\"label\"><slot></slot>${this._resolvedLabel()}</span>\n ${shortcut ? html`<span class=\"shortcut\">${shortcut}</span>` : null}\n ${this._hasChildren ? html`<span class=\"arrow\"><ixfx-icon name=\"chevron-right\"></ixfx-icon></span>` : null}\n </div>\n <slot @slotchange=${this._handleSlotChange}></slot>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-menu-item': MenuItem;\n }\n}\n"],"mappings":"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"}
|
package/dist/miller.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"miller.d.ts","names":[],"sources":["../src/miller/types.ts","../src/miller/miller-base.ts","../src/miller/miller-list.ts","../src/miller/miller-tree-controller.ts"],"mappings":"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"}
|
package/dist/miller.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"miller.js","names":["#buildTickledId","#getTickledDepthOrDefault","#getTickledNodeAndDepth","#setTickledNode","#anchor","#expandNode","#onItemClick","#abortPending","#resizingDepth","#resizeStartX","#resizeStartWidth","#onResizeMove","#onResizeEnd","#columnWidths","#searchRegistry","#effectiveSearchModes","#unregisterSearchCommands","#displayRoot","#syncSearchCommands","#lastSelectedNode","#applyViewRoot","#modelUnsubscribe","#pendingNode","#pendingController","#canSelect","#dispatchSelectEvent","#applyCheckedToggle","#scrollNavigatedItemIntoView","#findNodePath","#loadUnloadedChildren","#clearViewRoot","#findNodeByKey","#dispatchRebaseEvent","#findParentOf","#pathToRoot","#findNodeIn","#findParentIn","#onCheckboxClick","#getColumnHeader","#buildPath","#isAncestor","#expandTimer","#handleImplicitClick","#handleStandardClick","#allDescendantsSelected","#getTickledDepth","#columnStyle","#onKeyDown","#onHeaderClick","#onResizeStart","#renderLoadingColumn","#isFocused","customElement","#renderListItem","customElement","#root","#element","#options","#connectSignal","#childrenOf","#nodeToTree","#findTreePath","#toMillerNode","#identityToMillerNode"],"sources":["../src/miller/miller-base.ts","../src/miller/miller-list.ts","../src/miller/miller-tree-controller.ts"],"sourcesContent":["/* eslint-disable ts/no-unsafe-declaration-merging */\nimport type { CommandRegistry } from '@clinth/ui-commands';\nimport type { PropertyValues, TemplateResult } from 'lit';\nimport type {\n TreeActivateDetail,\n TreeActivateEvent,\n TreeCollapseEvent,\n TreeComponent,\n TreeComponentEventMap,\n TreeExpandEvent,\n TreeItemClickEvent,\n TreeSearchHost,\n TreeSelectDetail,\n TreeSelectEvent,\n TreeTickleDetail,\n TreeTickleEvent,\n} from '../common/tree-component.js';\nimport type { TreeDataModel } from '../common/tree-data-model.js';\nimport type {\n LoadChildrenCallback,\n TreeExclusivity,\n TreeFilterPredicate,\n TreeNode,\n TreeSelectionFilter,\n} from '../common/types.js';\nimport type { ListSearchMode } from '../incr-search/index.js';\nimport type {\n MillerCollapseDetail,\n MillerConfig,\n MillerExpandDetail,\n MillerHeaderClickDetail,\n MillerHeaderRightClickDetail,\n MillerItemClickDetail,\n MillerItemDblClickDetail,\n MillerItemRightClickDetail,\n MillerItemState,\n MillerNode,\n MillerRebaseDetail,\n MillerSelectionMode,\n} from './types.js';\nimport { createCommandRegistry } from '@clinth/ui-commands';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { collectDataResult } from '../common/data-provider.js';\nimport {\n createTreeListSearchAdapter,\n LIST_SEARCH_MODES,\n ListSearchController,\n\n listSearchStyles,\n registerListSearchCommands,\n} from '../incr-search/index.js';\nimport { TickledController } from '../interaction/tickled-controller.js';\nimport { tickledStyles } from '../interaction/tickled-styles.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\n\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\n\nconst EXPAND_DEBOUNCE_MS = 150;\n\ntype Anchor = { key: string; depth: number; index: number; selectionSnapshot?: ReadonlySet<string> };\n\n/**\n * Base class for Miller column components. Handles column lifecycle,\n * column resizing, keyboard navigation, and selection modes.\n *\n * Subclasses must override `renderColumnContent`.\n *\n * ## Interaction modes (`interactionMode`)\n *\n * Controls how clicks map to selection changes. Default: `'standard'`.\n *\n * - `implicit`: Selection follows the cursor path (navigation mode).\n * - `standard`: Single click selects; Shift+click range-selects within a column;\n * Cmd/Ctrl+click toggles individual items.\n * - `manual`: Component never modifies selection. Use `selectedKeys` / `setSelected`\n * / `clearSelection` to drive state externally.\n * - `checked`: Checkboxes on every item (rendered by subclass via `_isChecked` /\n * `_handleCheckboxClick`). Clicking the item navigates/expands; clicking the\n * checkbox toggles selection of the node and all loaded descendants.\n *\n * ## Events\n * - `expand`: FYI event fired after a column opens. Detail: `{ node, depth }`\n * - `collapse`: FYI event fired when a column closes. Detail: `{ node, depth }`\n * - `header-click`: fired when a column header is clicked (requires `headers` attr).\n * Detail: `{ depth, label, path: MillerNode[] }`\n * - `activate`: fired when Enter is pressed on an item. Detail: `{ node, depth }`\n * - `select`: fired when the selection set changes. Detail: `{ selected, previous }`\n * - `item-click`: fired on any item click. Detail: `{ node, depth }`\n * - `tickle`: fired when an item is hovered or keyboard cursor moves to it. Detail: `{ node, depth }`\n *\n * ## CSS variables\n * - `--column-bg`: var(--surface-3)\n * - `--column-header-bg`: var(--surface-2)\n * - `--column-header-text`: var(--surface-muted-text)\n * - `--column-separator`: var(--surface-5)\n * - `--column-resize-handle`: var(--surface-5)\n * - `--column-resize-handle-hover`: var(--accent)\n * - `--column-resize-width`: 4px\n * - `--item-hover-bg`: var(--item-bg-tickled)\n * - `--item-selected-bg`: var(--item-bg-selected)\n * - `--item-selected-text`: var(--item-text-selected)\n */\n@customElement(`ixfx-miller-base`)\nexport class MillerBaseElement extends LitElement implements TreeComponent, TreeSearchHost {\n @property({ type: Object })\n root: MillerNode | undefined;\n\n @property({ attribute: false })\n model: TreeDataModel | undefined;\n\n @property({ type: Boolean })\n headers = false;\n\n /**\n * When true, the last (rightmost) column grows to fill any remaining\n * horizontal space in the host. All other columns size to their content\n * (`max-content`), unless the user has manually resized them.\n *\n * When the user clicks into an item in the stretched column and a new\n * column opens, the previously-last column automatically transitions back\n * to its content-based width and the new last column stretches instead.\n * Explicit user-resized widths (via the resize handle) always win over\n * stretching.\n */\n @property({ type: Boolean, attribute: `stretch-last-column`, reflect: true })\n stretchLastColumn = false;\n\n /**\n * Alternative node to use as the display root (Finder-style column-view\n * rebase). When set, column 0 shows this node's children and all depths,\n * headers, and key paths are relative to it. When `undefined` (default),\n * the full `root` tree is shown.\n *\n * Prefer `rebaseTo()` / `rebaseUp()` over assigning this directly — they\n * validate the target and report whether the view changed. Assigning a new\n * `root` (or receiving one via `model`) silently clears the view root.\n */\n @property({ attribute: false })\n viewRoot: MillerNode | undefined;\n\n /**\n * Controls the column-level interaction pattern (how clicks map to column changes).\n * This is distinct from `selectionFilter` (which restricts which node kinds are selectable).\n * Default: `'standard'`.\n */\n @property({ type: String })\n interactionMode: MillerSelectionMode = `standard`;\n\n // --- TreeComponent shared interface properties ---\n\n @property({ reflect: true, attribute: `selection-filter` })\n selectionFilter: TreeSelectionFilter = `leaf`;\n\n @property({ reflect: true, attribute: `exclusivity` })\n exclusivity: TreeExclusivity = `none`;\n\n /**\n * Callback to load children for a lazy node.\n * Superseded by `model` when both are set.\n * If not set and `model` is not set, clicking a lazy node opens an empty column.\n */\n @property({ type: Object })\n loadChildren: LoadChildrenCallback | undefined;\n\n @property({ attribute: false })\n filterPredicate: TreeFilterPredicate | undefined;\n\n /**\n * Space-separated subset of `navigate select filter` — limits which\n * incremental-search modes are offered. Unset ⇒ all three; empty ⇒ search\n * disabled. See `docs/infra-incremental.md`.\n */\n @property({ type: String, attribute: `search-modes`, reflect: true })\n searchModes: string | undefined;\n\n @state()\n protected _columns: MillerNode[][] = [];\n\n // Depth of the currently loading column (undefined = not loading)\n @state()\n protected _loadingDepth: number | undefined;\n\n // Selected node at each depth (implicit mode)\n protected _selectedByDepth = new Map<number, MillerNode>();\n\n // Selected item keys (standard / manual / checked / interactionMode modes)\n protected _selectedKeys: Set<string> = new Set();\n\n // Full selection set — implements TreeComponent.selectedNodes\n @state()\n protected _selectedNodes = new Set<MillerNode>();\n\n // Most recently selected node\n #lastSelectedNode: MillerNode | undefined;\n\n // Anchor for shift-click / shift-arrow range selection\n #anchor: Anchor | undefined;\n\n // User-resized widths by depth (px)\n #columnWidths = new Map<number, number>();\n\n // Pending lazy expansion\n #pendingNode: MillerNode | undefined;\n #pendingController: AbortController | undefined;\n\n // Debounce timer for loadChildren callback\n #expandTimer: ReturnType<typeof setTimeout> | undefined;\n\n // Resize drag state\n #resizingDepth = -1;\n #resizeStartX = 0;\n #resizeStartWidth = 0;\n\n // Model subscription teardown\n #modelUnsubscribe: (() => void) | undefined;\n\n /** Incremental search (navigate / select / filter). See `docs/infra-incremental.md`. */\n readonly search = new ListSearchController<{ node: TreeNode; depth: number }>(this, {\n adapter: createTreeListSearchAdapter(this, {\n labelSelector: `.label`,\n highlightKey: `incr-search-highlight`,\n }),\n });\n\n #searchRegistry: CommandRegistry<unknown> | undefined;\n #unregisterSearchCommands: (() => void) | undefined;\n\n /** Command registry carrying this component's `list.search.*` commands. */\n get registry(): CommandRegistry<unknown> | undefined {\n return this.#searchRegistry;\n }\n\n #effectiveSearchModes(): ListSearchMode[] {\n const raw = this.searchModes?.trim();\n if (raw === undefined)\n return [...LIST_SEARCH_MODES];\n const requested = new Set(raw.split(/\\s+/));\n return LIST_SEARCH_MODES.filter(m => requested.has(m));\n }\n\n #syncSearchCommands(): void {\n if (!this.#searchRegistry)\n return;\n this.search.setModes(this.#effectiveSearchModes());\n this.#unregisterSearchCommands?.();\n this.#unregisterSearchCommands = registerListSearchCommands(this.#searchRegistry, this.search);\n }\n\n // Tickled controller for hover/keyboard focus\n tickled = new TickledController<string>(this, {\n getItems: () => {\n const items: Array<{ id: string; enabled?: boolean }> = [];\n for (let depth = 0; depth < this._columns.length; depth++) {\n const col = this._columns[depth];\n if (col) {\n for (const node of col) {\n items.push({ id: this.#buildTickledId(node, depth) });\n }\n }\n }\n return items;\n },\n });\n\n // Helper to build unique ID from depth and node key\n #buildTickledId(node: MillerNode, depth: number): string {\n return `${depth}:${node.item.key}`;\n }\n\n /** The node column 0 renders the children of: `viewRoot` when rebased, else `root`. */\n get #displayRoot(): MillerNode | undefined {\n return this.viewRoot ?? this.root;\n }\n\n // Helper to extract depth from tickled ID\n #getTickledDepth(): number | undefined {\n const id = this.tickled.tickledId;\n if (!id)\n return undefined;\n const colonIndex = id.indexOf(`:`);\n if (colonIndex < 0)\n return undefined;\n return Number(id.substring(0, colonIndex));\n }\n\n override updated(changedProps: PropertyValues) {\n if (changedProps.has(`searchModes`)) {\n this.#syncSearchCommands();\n }\n if (changedProps.has(`root`) && this.root) {\n this.#abortPending();\n // New data invalidates any rebased view — the view root references the old tree.\n // Cleared silently (no `rebase` event); the follow-up update renders the full tree.\n if (this.viewRoot !== undefined)\n this.viewRoot = undefined;\n this._selectedByDepth.clear();\n this._selectedKeys = new Set();\n this._selectedNodes.clear();\n this.#lastSelectedNode = undefined;\n this.#anchor = undefined;\n this.tickled.clearTickled();\n const display = this.#displayRoot;\n this._columns = display?.children ? [display.children] : [];\n }\n\n if (changedProps.has(`viewRoot`)) {\n this.#applyViewRoot();\n }\n\n if (changedProps.has(`model`)) {\n this.#modelUnsubscribe?.();\n this.#modelUnsubscribe = undefined;\n const model = this.model;\n if (model) {\n this.root = model.root;\n this.#modelUnsubscribe = model._subscribe((event) => {\n if (event.type === `root`) {\n this.root = event.root;\n this.requestUpdate();\n } else if (event.type === `invalidate`) {\n // Collapse the column that shows this node's children, if open\n // Find which column depth contains the invalidated node\n for (let depth = 0; depth < this._columns.length - 1; depth++) {\n const col = this._columns[depth];\n if (col?.some(n => n.item.key === event.key)) {\n this._columns = this._columns.slice(0, depth + 1);\n this.requestUpdate();\n break;\n }\n }\n }\n });\n }\n }\n\n // Detect when the app has resolved a pending expansion\n if (this.#pendingNode?.children !== undefined && this._loadingDepth !== undefined) {\n const loadingDepth = this._loadingDepth;\n const resolvedChildren = this.#pendingNode.children;\n this.#pendingNode = undefined;\n this.#pendingController = undefined;\n this._loadingDepth = undefined;\n\n const cols = this._columns.slice(0, loadingDepth);\n if (resolvedChildren.length > 0)\n cols.push(resolvedChildren);\n this._columns = cols;\n }\n\n // Scroll new rightmost column into view\n const prevColumns = changedProps.get(`_columns`) as MillerNode[][] | undefined;\n const columnAdded = changedProps.has(`_columns`) && (prevColumns?.length ?? 0) < this._columns.length;\n const loadingAppeared = changedProps.has(`_loadingDepth`) && this._loadingDepth !== undefined;\n if (columnAdded || loadingAppeared) {\n const container = this.shadowRoot?.querySelector(`#container`) as HTMLElement | null;\n container?.scrollTo({ left: container.scrollWidth, behavior: `smooth` });\n }\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.#searchRegistry ??= createCommandRegistry();\n this.#syncSearchCommands();\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n this.#modelUnsubscribe?.();\n this.#modelUnsubscribe = undefined;\n this.#unregisterSearchCommands?.();\n this.#unregisterSearchCommands = undefined;\n this.#searchRegistry = undefined;\n }\n\n // --- Public API ---\n\n getConfig(): MillerConfig {\n const columnWidths: Record<number, number> = {};\n for (const [depth, width] of this.#columnWidths) {\n columnWidths[depth] = width;\n }\n return { columnWidths };\n }\n\n setConfig(config: MillerConfig) {\n this.#columnWidths.clear();\n for (const [depth, width] of Object.entries(config.columnWidths)) {\n this.#columnWidths.set(Number(depth), width);\n }\n this.requestUpdate();\n }\n\n /** Read current selection as an immutable set of item keys. */\n get selectedKeys(): ReadonlySet<string> {\n return this._selectedKeys;\n }\n\n /** Replace entire selection and trigger a re-render. */\n set selectedKeys(keys: Iterable<string>) {\n this._selectedKeys = new Set(keys);\n this.requestUpdate();\n }\n\n // --- TreeComponent.selectedNode / selectedNodes ---\n\n /** The most recently selected node. */\n get selectedNode(): MillerNode | undefined {\n return this.#lastSelectedNode;\n }\n\n set selectedNode(node: MillerNode | undefined) {\n this.#lastSelectedNode = node;\n if (node) {\n if (this.interactionMode === `implicit` || this.interactionMode === `standard`) {\n this._selectedKeys = new Set([node.item.key]);\n }\n }\n this.requestUpdate();\n }\n\n /** Full selection set (implements TreeComponent interface). */\n get selectedNodes(): ReadonlySet<MillerNode> {\n return this._selectedNodes;\n }\n\n // --- TreeComponent programmatic selection ---\n\n /** Add `node` to the selection (respects selectionFilter). Dispatches `select` event. */\n select(node: MillerNode): void {\n if (!this.#canSelect(node))\n return;\n const prev = new Set(this._selectedNodes);\n this._selectedNodes.add(node);\n this._selectedKeys.add(node.item.key);\n this.#lastSelectedNode = node;\n this.#dispatchSelectEvent(prev);\n this.requestUpdate();\n }\n\n /** Remove `node` from the selection. Dispatches `select` event. */\n deselect(node: MillerNode): void {\n if (!this._selectedNodes.has(node))\n return;\n const prev = new Set(this._selectedNodes);\n this._selectedNodes.delete(node);\n this._selectedKeys.delete(node.item.key);\n if (this.#lastSelectedNode === node) {\n this.#lastSelectedNode = [...this._selectedNodes].at(-1);\n }\n this.#dispatchSelectEvent(prev);\n this.requestUpdate();\n }\n\n /**\n * Clear all selection and trigger a re-render.\n */\n clearSelection(): void {\n const prev = new Set(this._selectedNodes);\n this._selectedKeys = new Set();\n this._selectedNodes.clear();\n this.#lastSelectedNode = undefined;\n if (prev.size > 0) {\n this.#dispatchSelectEvent(prev);\n }\n this.requestUpdate();\n }\n\n /** Not implemented on miller-list. */\n selectAll(): void {\n // no-op\n }\n\n /** Not implemented on miller-list. */\n deselectAll(): void {\n // no-op\n }\n\n /**\n * Select or deselect a single node by key.\n * In `checked` interactionMode this also recursively selects/deselects all loaded descendants.\n */\n setSelected(node: MillerNode, selected: boolean): void {\n if (this.interactionMode === `checked`) {\n this.#applyCheckedToggle(node, selected);\n } else {\n if (selected) {\n this._selectedKeys.add(node.item.key);\n this._selectedNodes.add(node);\n } else {\n this._selectedKeys.delete(node.item.key);\n this._selectedNodes.delete(node);\n }\n }\n this.requestUpdate();\n }\n\n /**\n * Return all MillerNodes whose key is in `_selectedKeys`, searching only\n * the currently visible columns.\n */\n getSelected(): MillerNode[] {\n const results: MillerNode[] = [];\n for (const col of this._columns) {\n for (const node of col) {\n if (this._selectedKeys.has(node.item.key))\n results.push(node);\n }\n }\n return results;\n }\n\n /**\n * Programmatically navigate to a node by key path, relative to the current\n * view root (rebased or full tree).\n */\n navigateTo(keys: readonly string[]): boolean {\n const display = this.#displayRoot;\n if (!display?.children)\n return false;\n this.#abortPending();\n this._selectedByDepth.clear();\n this.tickled.clearTickled();\n\n const newColumns: MillerNode[][] = [display.children];\n let currentColumn = display.children;\n let success = true;\n let lastNode: MillerNode | undefined;\n let lastDepth = 0;\n\n for (let depth = 0; depth < keys.length; depth++) {\n const idx = currentColumn.findIndex(n => n.item.key === keys[depth]);\n if (idx < 0) {\n success = false; break;\n }\n\n const node = currentColumn[idx];\n this._selectedByDepth.set(depth, node);\n lastNode = node;\n lastDepth = depth;\n\n if (node.item.isLeaf || !node.children || node.children.length === 0) {\n if (depth < keys.length - 1)\n success = false;\n break;\n }\n\n newColumns.push(node.children);\n currentColumn = node.children;\n }\n\n this._columns = newColumns;\n\n if (lastNode) {\n this.tickled.setTickled(this.#buildTickledId(lastNode, lastDepth));\n }\n\n if (this.interactionMode !== `implicit` && this.interactionMode !== `manual`) {\n const leafKey = keys.at(-1);\n if (leafKey)\n this._selectedKeys = new Set([leafKey]);\n }\n\n this.requestUpdate();\n this.#scrollNavigatedItemIntoView();\n return success;\n }\n\n /**\n * Programmatically navigate to the first node (breadth-first) matching a predicate.\n */\n navigateToNode(predicate: (node: MillerNode) => boolean): boolean {\n const display = this.#displayRoot;\n if (!display?.children)\n return false;\n const keyPath = this.#findNodePath(display.children, predicate);\n if (!keyPath)\n return false;\n return this.navigateTo(keyPath);\n }\n\n /** Open the columns down to `key` and move the cursor to it, without changing the selection (search \"navigate\" mode). */\n revealKey(key: string): boolean {\n const display = this.#displayRoot;\n if (!display?.children)\n return false;\n const path = this.#findNodePath(display.children, n => n.item.key === key);\n if (!path)\n return false;\n const columns: MillerNode[][] = [display.children];\n let current = display.children;\n let lastNode: MillerNode | undefined;\n let lastDepth = 0;\n for (let depth = 0; depth < path.length; depth++) {\n const node = current.find(n => n.item.key === path[depth]);\n if (!node)\n return false;\n lastNode = node;\n lastDepth = depth;\n if (node.children && node.children.length > 0) {\n columns.push(node.children);\n current = node.children;\n } else {\n break;\n }\n }\n this._columns = columns;\n if (lastNode)\n this.tickled.setTickled(this.#buildTickledId(lastNode, lastDepth));\n this.requestUpdate();\n this.#scrollNavigatedItemIntoView();\n return true;\n }\n\n /** Replace the selection with `nodes` (search \"select\" mode). */\n selectMany(nodes: Iterable<MillerNode>): void {\n const arr = this.selectionFilter === `none` ? [] : [...nodes];\n const prev = new Set(this._selectedNodes);\n this._selectedNodes = new Set(arr);\n this._selectedKeys = new Set(arr.map(n => n.item.key));\n this.#lastSelectedNode = arr.at(-1);\n this.#dispatchSelectEvent(prev);\n this.requestUpdate();\n }\n\n getNodes(): ReadonlyArray<{ node: MillerNode; depth: number }> {\n const display = this.#displayRoot;\n if (!display?.children)\n return [];\n const result: Array<{ node: MillerNode; depth: number }> = [];\n const visit = (node: MillerNode, depth: number) => {\n result.push({ node, depth });\n if (node.children) {\n for (const child of node.children) visit(child, depth + 1);\n }\n };\n for (const child of display.children) visit(child, 0);\n return result;\n }\n\n #findNodePath(\n nodes: MillerNode[],\n predicate: (node: MillerNode) => boolean,\n prefix: string[] = [],\n ): string[] | undefined {\n for (const node of nodes) {\n const path = [...prefix, node.item.key];\n if (predicate(node))\n return path;\n if (node.children?.length) {\n const result = this.#findNodePath(node.children, predicate, path);\n if (result)\n return result;\n }\n }\n return undefined;\n }\n\n // --- View rebasing (Finder-style column-view root) ---\n\n /**\n * Re-render the columns for the current `#displayRoot`, clearing selection.\n * Runs on every `viewRoot` change.\n */\n #applyViewRoot(): void {\n this.#abortPending();\n const prev = new Set(this._selectedNodes);\n this._selectedByDepth.clear();\n this._selectedKeys = new Set();\n this._selectedNodes.clear();\n this.#lastSelectedNode = undefined;\n this.#anchor = undefined;\n this.tickled.clearTickled();\n const display = this.#displayRoot;\n if (display?.children !== undefined) {\n this._columns = display.children ? [display.children] : [];\n this._loadingDepth = undefined;\n } else if (display) {\n this._columns = [];\n this.#loadUnloadedChildren(display, -1, false);\n } else {\n this._columns = [];\n this._loadingDepth = undefined;\n }\n if (prev.size > 0)\n this.#dispatchSelectEvent(prev);\n }\n\n /**\n * Rebase the view to show `target`'s children in column 0 (Finder column-view\n * behavior on double-click), keeping the full tree in `root`.\n *\n * - Pass a `MillerNode` (used as-is) or a key (looked up in the full tree).\n * - Pass `undefined` to restore the full-tree view.\n * - Rebasing to the true root is equivalent to restoring the full view.\n * - Leaves are refused (returns `false`).\n *\n * Selection is cleared; all depths, headers, and key paths are relative to\n * the new view root. Fires a `rebase` event when the view actually changes.\n * Returns `false` when nothing changed (unknown key, leaf, or same view).\n */\n rebaseTo(target: MillerNode | string | undefined): boolean {\n if (target === undefined)\n return this.#clearViewRoot();\n const node = typeof target === `string` ? this.#findNodeByKey(target) : target;\n if (!node || node.item.isLeaf === true)\n return false;\n if (node === this.viewRoot || node.item.key === this.viewRoot?.item.key)\n return false;\n if (node === this.root || (!this.viewRoot && node.item.key === this.root?.item.key)) {\n return this.#clearViewRoot();\n }\n this.viewRoot = node;\n this.#dispatchRebaseEvent();\n return true;\n }\n\n /**\n * Rebase one level up from the current view root (no-op at the full tree).\n * Fires a `rebase` event when the view actually changes.\n */\n rebaseUp(): boolean {\n if (!this.viewRoot)\n return false;\n const parent = this.#findParentOf(this.viewRoot);\n if (!parent)\n return false;\n if (parent === this.root)\n return this.#clearViewRoot();\n this.viewRoot = parent;\n this.#dispatchRebaseEvent();\n return true;\n }\n\n #clearViewRoot(): boolean {\n if (this.viewRoot === undefined)\n return false;\n this.viewRoot = undefined;\n this.#dispatchRebaseEvent();\n return true;\n }\n\n #dispatchRebaseEvent(): void {\n const viewRoot = this.viewRoot;\n const detail: MillerRebaseDetail = {\n viewRoot,\n path: viewRoot ? this.#pathToRoot(viewRoot) : [],\n };\n this.dispatchEvent(new CustomEvent<MillerRebaseDetail>(`rebase`, {\n detail,\n bubbles: true,\n composed: true,\n }));\n }\n\n #findNodeByKey(key: string): MillerNode | undefined {\n if (!this.root)\n return undefined;\n if (this.root.item.key === key)\n return this.root;\n return this.#findNodeIn(this.root.children ?? [], key);\n }\n\n #findNodeIn(nodes: MillerNode[], key: string): MillerNode | undefined {\n for (const node of nodes) {\n if (node.item.key === key)\n return node;\n if (node.children) {\n const found = this.#findNodeIn(node.children, key);\n if (found)\n return found;\n }\n }\n return undefined;\n }\n\n /** Find the parent of `target` (by reference, falling back to key) in the full tree. */\n #findParentOf(target: MillerNode): MillerNode | undefined {\n if (!this.root || target === this.root)\n return undefined;\n return this.#findParentIn(this.root, target);\n }\n\n #findParentIn(node: MillerNode, target: MillerNode): MillerNode | undefined {\n if (!node.children)\n return undefined;\n for (const child of node.children) {\n if (child === target || child.item.key === target.item.key)\n return node;\n const found = this.#findParentIn(child, target);\n if (found)\n return found;\n }\n return undefined;\n }\n\n /** Ancestry chain from the true root down to and including `target`. */\n #pathToRoot(target: MillerNode): MillerNode[] {\n const chain: MillerNode[] = [target];\n let current = this.#findParentOf(target);\n while (current) {\n chain.unshift(current);\n if (current === this.root)\n break;\n current = this.#findParentOf(current);\n }\n return chain;\n }\n\n // --- Methods subclasses override ---\n\n protected renderColumnContent(nodes: MillerNode[], depth: number): TemplateResult | typeof nothing {\n console.warn(`ixfx-miller-base: renderColumnContent not overridden. depth=${depth}, nodes=${nodes.length}`);\n return nothing;\n }\n\n // Called by subclasses to handle item clicks\n protected _handleItemClick(node: MillerNode, depth: number, event?: MouseEvent) {\n this.#onItemClick(node, depth, event);\n }\n\n /**\n * Called by subclasses (in `checked` interactionMode) when a checkbox is clicked.\n */\n protected _handleCheckboxClick(event: MouseEvent, node: MillerNode, _depth: number) {\n event.stopPropagation();\n this.#onCheckboxClick(node);\n }\n\n /**\n * Called by subclasses when an item is double-clicked.\n */\n protected _handleItemDblClick(node: MillerNode, depth: number, _event: MouseEvent) {\n this.dispatchEvent(new CustomEvent<MillerItemDblClickDetail>(`item-dblclick`, {\n detail: { node, depth },\n bubbles: true,\n composed: true,\n }));\n }\n\n /**\n * Called by subclasses when an item is right-clicked.\n */\n protected _handleItemRightClick(node: MillerNode, depth: number, event: MouseEvent) {\n this.dispatchEvent(new CustomEvent<MillerItemRightClickDetail>(`item-rightclick`, {\n detail: { node, depth, mouseEvent: event },\n bubbles: true,\n composed: true,\n }));\n }\n\n /**\n * Called by subclasses when a column header is right-clicked.\n */\n protected _handleHeaderRightClick(event: MouseEvent, depth: number) {\n const label = this.#getColumnHeader(depth);\n const path = this.#buildPath(depth);\n this.dispatchEvent(new CustomEvent<MillerHeaderRightClickDetail>(`header-rightclick`, {\n detail: { depth, label, path, mouseEvent: event },\n bubbles: true,\n composed: true,\n }));\n }\n\n protected _isSelected(node: MillerNode, depth: number): boolean {\n if (this.interactionMode === `implicit`) {\n return this._selectedByDepth.get(depth) === node;\n }\n return this._selectedKeys.has(node.item.key);\n }\n\n #isAncestor(node: MillerNode, depth: number): boolean {\n const nextCol = this._columns[depth + 1];\n return nextCol !== undefined && node.children === nextCol;\n }\n\n protected _isOpen(node: MillerNode, depth: number): boolean {\n return this.#isAncestor(node, depth);\n }\n\n /**\n * Return the display state for an item identified by key at a given depth.\n */\n getItemState(key: string, depth: number): MillerItemState | undefined {\n const col = this._columns[depth];\n const node = col?.find(n => n.item.key === key);\n if (!node)\n return undefined;\n return {\n selected: this._isSelected(node, depth),\n open: this.#isAncestor(node, depth),\n focused: this._isFocused(node, depth),\n isLeaf: node.item.isLeaf ?? false,\n };\n }\n\n // --- Internal ---\n\n #canSelect(node: MillerNode): boolean {\n if (this.selectionFilter === `none`)\n return false;\n if (this.selectionFilter === `leaf`)\n return node.item.isLeaf !== false;\n if (this.selectionFilter === `branch`)\n return node.item.isLeaf === false || (node.children !== undefined && node.children.length > 0);\n return true;\n }\n\n #dispatchSelectEvent(previous: ReadonlySet<TreeNode>): void {\n const detail: TreeSelectDetail = {\n selected: new Set(this._selectedNodes),\n previous,\n };\n this.dispatchEvent(new CustomEvent<TreeSelectDetail>(`select`, {\n detail,\n bubbles: true,\n composed: true,\n }));\n }\n\n #abortPending() {\n if (this.#expandTimer !== undefined) {\n clearTimeout(this.#expandTimer);\n this.#expandTimer = undefined;\n }\n\n if (this.#pendingController) {\n const node = this.#pendingNode;\n const depth = this._loadingDepth;\n this.#pendingController.abort();\n this.#pendingController = undefined;\n this.#pendingNode = undefined;\n this._loadingDepth = undefined;\n\n if (node && depth !== undefined) {\n this.dispatchEvent(new CustomEvent<MillerCollapseDetail>(`collapse`, {\n detail: { node, depth },\n bubbles: true,\n composed: true,\n }));\n }\n }\n }\n\n /**\n * Build the ancestry path for a given column depth.\n */\n #buildPath(depth: number): MillerNode[] {\n const path: MillerNode[] = [];\n if (this.#displayRoot)\n path.push(this.#displayRoot);\n for (let d = 0; d < depth; d++) {\n const sel = this._selectedByDepth.get(d);\n if (sel)\n path.push(sel);\n }\n return path;\n }\n\n #onHeaderClick(depth: number) {\n const label = this.#getColumnHeader(depth);\n const path = this.#buildPath(depth);\n const detail: MillerHeaderClickDetail = { depth, label, path };\n this.dispatchEvent(new CustomEvent<MillerHeaderClickDetail>(`header-click`, {\n detail,\n bubbles: true,\n composed: true,\n }));\n }\n\n #onItemClick(node: MillerNode, depth: number, event?: MouseEvent) {\n if (this._loadingDepth !== undefined && this._loadingDepth > depth) {\n this.#abortPending();\n }\n\n this.tickled.setTickled(this.#buildTickledId(node, depth));\n\n this.dispatchEvent(new CustomEvent<MillerItemClickDetail>(`item-click`, {\n detail: { node, depth },\n bubbles: true,\n composed: true,\n }));\n\n switch (this.interactionMode) {\n case `implicit`:\n this.#handleImplicitClick(node, depth);\n break;\n case `standard`:\n this.#handleStandardClick(node, depth, event);\n break;\n case `vscode`:\n this.#handleStandardClick(node, depth, event);\n break;\n case `manual`:\n break;\n case `checked`:\n this.#expandNode(node, depth);\n break;\n }\n }\n\n #handleImplicitClick(node: MillerNode, depth: number) {\n const previous = new Set(this._selectedNodes);\n this._selectedByDepth.set(depth, node);\n this.#lastSelectedNode = node;\n this._selectedKeys = new Set([node.item.key]);\n this._selectedNodes.clear();\n this._selectedNodes.add(node);\n this.#expandNode(node, depth);\n if (!previous.has(node)) {\n this.#dispatchSelectEvent(previous);\n }\n }\n\n #handleStandardClick(node: MillerNode, depth: number, event?: MouseEvent) {\n const col = this._columns[depth];\n const index = col ? col.indexOf(node) : -1;\n\n const isMeta = event ? (event.metaKey || event.ctrlKey) : false;\n const isShift = event ? event.shiftKey : false;\n\n if (isMeta) {\n if (this._selectedKeys.has(node.item.key)) {\n this._selectedKeys.delete(node.item.key);\n this._selectedNodes.delete(node);\n } else {\n this._selectedKeys.add(node.item.key);\n this._selectedNodes.add(node);\n }\n this.#anchor = index >= 0 ? { key: node.item.key, depth, index } : this.#anchor;\n this.requestUpdate();\n return;\n }\n\n if (isShift && this.#anchor && this.#anchor.depth === depth && col) {\n const from = Math.min(this.#anchor.index, index);\n const to = Math.max(this.#anchor.index, index);\n const rangeNodes = col.slice(from, to + 1);\n this._selectedKeys = new Set(rangeNodes.map(n => n.item.key));\n this._selectedNodes = new Set(rangeNodes);\n this.requestUpdate();\n return;\n }\n\n const previous = new Set(this._selectedNodes);\n this._selectedKeys = new Set([node.item.key]);\n this._selectedNodes = new Set([node]);\n this.#anchor = index >= 0 ? { key: node.item.key, depth, index } : undefined;\n this._selectedByDepth.set(depth, node);\n this.#lastSelectedNode = node;\n this.#expandNode(node, depth);\n if (!previous.has(node) || previous.size !== 1) {\n this.#dispatchSelectEvent(previous);\n }\n }\n\n #expandNode(node: MillerNode, depth: number) {\n if (node.item.isLeaf) {\n this._columns = this._columns.slice(0, depth + 1);\n this.requestUpdate();\n return;\n }\n\n if (node.children === undefined) {\n this.#loadUnloadedChildren(node, depth, true);\n } else {\n const newColumns = this._columns.slice(0, depth + 1);\n newColumns.push(node.children);\n this._columns = newColumns;\n\n this.dispatchEvent(new CustomEvent<MillerExpandDetail>(`expand`, {\n detail: { node, depth },\n bubbles: true,\n composed: true,\n }));\n }\n }\n\n /**\n * Fetch children for a node whose `children === undefined` and show them as\n * the column after `parentDepth` (with the loading placeholder meanwhile).\n * Shared by branch expansion (`parentDepth` = the branch's column) and view\n * rebasing (`parentDepth` = -1, so the children become column 0).\n *\n * The `depth` reported to `loadChildren`/`model.getChildren` is the node's\n * own depth: its column for expansions, -1 for a view root (it sits above\n * column 0, so loaders computing child depth as `depth + 1` stay correct).\n */\n #loadUnloadedChildren(node: MillerNode, parentDepth: number, fireExpandEvent: boolean): void {\n const nodeDepth = parentDepth + 1;\n this._columns = this._columns.slice(0, nodeDepth);\n this._loadingDepth = nodeDepth;\n this.#pendingNode = node;\n const controller = new AbortController();\n this.#pendingController = controller;\n\n if (fireExpandEvent) {\n this.dispatchEvent(new CustomEvent<MillerExpandDetail>(`expand`, {\n detail: { node, depth: parentDepth },\n bubbles: true,\n composed: true,\n }));\n }\n\n const applyChildren = (children: MillerNode[]) => {\n if (controller.signal.aborted)\n return;\n node.children = children;\n this.#pendingNode = undefined;\n this.#pendingController = undefined;\n this._loadingDepth = undefined;\n const cols = this._columns.slice(0, nodeDepth);\n if (children.length > 0)\n cols.push(children);\n this._columns = cols;\n };\n\n const handleError = (err: unknown) => {\n if ((err as Error).name !== `AbortError`)\n console.error(err);\n node.children = [];\n this.#pendingNode = undefined;\n this.#pendingController = undefined;\n this._loadingDepth = undefined;\n this.requestUpdate();\n };\n\n if (this.model || this.loadChildren) {\n if (this.#expandTimer !== undefined) {\n clearTimeout(this.#expandTimer);\n }\n this.#expandTimer = setTimeout(() => {\n this.#expandTimer = undefined;\n if (this.#pendingNode !== node)\n return;\n\n const promise = this.model\n ? this.model.getChildren(node, nodeDepth - 1, controller.signal)\n : collectDataResult(this.loadChildren!({ node, depth: nodeDepth - 1 }, controller.signal), controller.signal);\n\n promise.then(children => applyChildren([...children] as MillerNode[])).catch(handleError);\n }, EXPAND_DEBOUNCE_MS);\n } else {\n this._loadingDepth = undefined;\n this.#pendingNode = undefined;\n this.#pendingController = undefined;\n const newColumns = this._columns.slice(0, nodeDepth);\n newColumns.push([]);\n this._columns = newColumns;\n }\n }\n\n #onCheckboxClick(node: MillerNode) {\n const currentlySelected = this._selectedKeys.has(node.item.key);\n const hasLoadedChildren = !!(node.children?.length);\n\n const allDescendantsSelected = hasLoadedChildren\n ? this.#allDescendantsSelected(node)\n : currentlySelected;\n\n if (allDescendantsSelected) {\n this.#applyCheckedToggle(node, false);\n } else {\n this.#applyCheckedToggle(node, true);\n }\n\n this.requestUpdate();\n }\n\n #allDescendantsSelected(node: MillerNode): boolean {\n if (!this._selectedKeys.has(node.item.key))\n return false;\n if (!node.children?.length)\n return true;\n return node.children.every(child => this.#allDescendantsSelected(child));\n }\n\n #applyCheckedToggle(node: MillerNode, selected: boolean) {\n if (selected) {\n this._selectedKeys.add(node.item.key);\n this._selectedNodes.add(node);\n } else {\n this._selectedKeys.delete(node.item.key);\n this._selectedNodes.delete(node);\n }\n if (node.children) {\n for (const child of node.children) {\n this.#applyCheckedToggle(child, selected);\n }\n }\n }\n\n #getTickledDepthOrDefault(): number {\n return this.#getTickledDepth() ?? 0;\n }\n\n #getTickledNodeAndDepth(): { node: MillerNode; depth: number; index: number } | undefined {\n const id = this.tickled.tickledId;\n if (!id)\n return undefined;\n\n const colonIndex = id.indexOf(`:`);\n if (colonIndex < 0)\n return undefined;\n\n const depth = Number(id.substring(0, colonIndex));\n const key = id.substring(colonIndex + 1);\n\n const col = this._columns[depth];\n if (!col)\n return undefined;\n\n const index = col.findIndex(n => n.item.key === key);\n if (index < 0)\n return undefined;\n\n return { node: col[index], depth, index };\n }\n\n #scrollNavigatedItemIntoView() {\n requestAnimationFrame(() => {\n const tickled = this.#getTickledNodeAndDepth();\n if (!tickled)\n return;\n\n const container = this.shadowRoot?.querySelectorAll(`.column`)[tickled.depth]?.querySelector(`.column-content`);\n if (!container)\n return;\n\n const items = container.querySelectorAll(`.item`);\n const item = items[tickled.index] as HTMLElement | undefined;\n item?.scrollIntoView({ block: `nearest`, behavior: `smooth` });\n });\n }\n\n #setTickledNode(node: MillerNode, depth: number) {\n this.tickled.setTickled(this.#buildTickledId(node, depth));\n this.dispatchEvent(new CustomEvent<TreeTickleDetail>(`tickle`, {\n detail: { node, depth },\n bubbles: true,\n composed: true,\n }));\n }\n\n #onKeyDown = (event: KeyboardEvent) => {\n if (this.search.isOpen)\n return;\n const currentDepth = this.#getTickledDepthOrDefault();\n const col = this._columns[currentDepth];\n\n if (!col || col.length === 0) {\n const depth0Col = this._columns[0];\n if (depth0Col && depth0Col.length > 0) {\n this.tickled.setTickled(this.#buildTickledId(depth0Col[0], 0));\n this.requestUpdate();\n }\n return;\n }\n\n switch (event.key) {\n case `ArrowDown`: {\n event.preventDefault();\n\n const current = this.#getTickledNodeAndDepth();\n let targetIndex = 0;\n\n if (current && current.depth === currentDepth) {\n targetIndex = Math.min(current.index + 1, col.length - 1);\n }\n\n const targetNode = col[targetIndex];\n if (!targetNode)\n break;\n\n this.#setTickledNode(targetNode, currentDepth);\n\n if (this.interactionMode === `standard` || this.interactionMode === `vscode`) {\n const prevIndex = current?.index ?? 0;\n\n if (event.shiftKey) {\n if (!this.#anchor || this.#anchor.depth !== currentDepth) {\n const anchorNode = col[prevIndex];\n if (anchorNode) {\n this.#anchor = {\n key: anchorNode.item.key,\n depth: currentDepth,\n index: prevIndex,\n selectionSnapshot: this.interactionMode === `vscode` ? new Set(this._selectedKeys) : undefined,\n };\n }\n }\n\n if (this.#anchor) {\n const from = Math.min(this.#anchor.index, targetIndex);\n const to = Math.max(this.#anchor.index, targetIndex);\n const rangeKeys = col.slice(from, to + 1).map(n => n.item.key);\n\n if (this.interactionMode === `vscode`) {\n const snap = this.#anchor.selectionSnapshot!;\n for (const k of rangeKeys) {\n if (snap.has(k))\n this._selectedKeys.delete(k);\n else this._selectedKeys.add(k);\n }\n } else {\n this._selectedKeys = new Set(rangeKeys);\n }\n }\n } else if (this.interactionMode === `standard`) {\n this.#anchor = { key: targetNode.item.key, depth: currentDepth, index: targetIndex };\n } else {\n this.#anchor = undefined;\n }\n }\n\n this.requestUpdate();\n break;\n }\n\n case `ArrowUp`: {\n event.preventDefault();\n\n const current = this.#getTickledNodeAndDepth();\n let targetIndex = 0;\n\n if (current && current.depth === currentDepth) {\n targetIndex = Math.max(current.index - 1, 0);\n }\n\n const targetNode = col[targetIndex];\n if (!targetNode)\n break;\n\n this.#setTickledNode(targetNode, currentDepth);\n\n if (this.interactionMode === `standard` || this.interactionMode === `vscode`) {\n const prevIndex = current?.index ?? 0;\n\n if (event.shiftKey) {\n if (!this.#anchor || this.#anchor.depth !== currentDepth) {\n const anchorNode = col[prevIndex];\n if (anchorNode) {\n this.#anchor = {\n key: anchorNode.item.key,\n depth: currentDepth,\n index: prevIndex,\n selectionSnapshot: this.interactionMode === `vscode` ? new Set(this._selectedKeys) : undefined,\n };\n }\n }\n\n if (this.#anchor) {\n const from = Math.min(this.#anchor.index, targetIndex);\n const to = Math.max(this.#anchor.index, targetIndex);\n const rangeKeys = col.slice(from, to + 1).map(n => n.item.key);\n\n if (this.interactionMode === `vscode`) {\n const snap = this.#anchor.selectionSnapshot!;\n for (const k of rangeKeys) {\n if (snap.has(k))\n this._selectedKeys.delete(k);\n else this._selectedKeys.add(k);\n }\n } else {\n this._selectedKeys = new Set(rangeKeys);\n }\n }\n } else if (this.interactionMode === `standard`) {\n this.#anchor = { key: targetNode.item.key, depth: currentDepth, index: targetIndex };\n } else {\n this.#anchor = undefined;\n }\n }\n\n this.requestUpdate();\n break;\n }\n\n case `ArrowRight`: {\n event.preventDefault();\n const tickled = this.#getTickledNodeAndDepth();\n if (!tickled) {\n if (col.length > 0) {\n this.#setTickledNode(col[0], currentDepth);\n this.requestUpdate();\n }\n return;\n }\n\n const { node, depth } = tickled;\n\n if (this.interactionMode === `vscode` || this.interactionMode === `standard`) {\n this._selectedByDepth.set(depth, node);\n this.#expandNode(node, depth);\n } else {\n this.#onItemClick(node, depth);\n }\n\n if (this._columns.length > depth + 1) {\n const nextCol = this._columns[depth + 1];\n if (nextCol && nextCol.length > 0) {\n this.#setTickledNode(nextCol[0], depth + 1);\n }\n }\n\n this.requestUpdate();\n break;\n }\n\n case `ArrowLeft`: {\n event.preventDefault();\n if (currentDepth > 0) {\n this.#abortPending();\n this._columns = this._columns.slice(0, currentDepth);\n\n const prevCol = this._columns[currentDepth - 1];\n if (prevCol && prevCol.length > 0) {\n const selectedNode = this._selectedByDepth.get(currentDepth - 1);\n const targetNode = selectedNode && prevCol.includes(selectedNode) ? selectedNode : prevCol[0];\n this.#setTickledNode(targetNode, currentDepth - 1);\n }\n\n this.requestUpdate();\n }\n break;\n }\n\n case `Enter`: {\n event.preventDefault();\n const tickled = this.#getTickledNodeAndDepth();\n if (!tickled)\n return;\n\n const { node, depth, index } = tickled;\n\n if (this.interactionMode === `standard` || this.interactionMode === `vscode`) {\n if (event.shiftKey && this.#anchor?.depth === depth) {\n const from = Math.min(this.#anchor.index, index);\n const to = Math.max(this.#anchor.index, index);\n this._selectedKeys = new Set(col.slice(from, to + 1).map(n => n.item.key));\n } else {\n this._selectedKeys.add(node.item.key);\n this.#anchor = { key: node.item.key, depth, index };\n }\n } else {\n this._selectedByDepth.set(depth, node);\n }\n\n this.dispatchEvent(new CustomEvent<TreeActivateDetail>(`activate`, {\n detail: { node, depth },\n bubbles: true,\n composed: true,\n }));\n\n this.requestUpdate();\n break;\n }\n\n case `Escape`: {\n event.preventDefault();\n this.#abortPending();\n if (this._columns.length > 1) {\n this._columns = this._columns.slice(0, -1);\n const newDepth = Math.max(0, currentDepth - 1);\n\n const prevCol = this._columns[newDepth];\n if (prevCol && prevCol.length > 0) {\n const selectedNode = this._selectedByDepth.get(newDepth);\n const targetNode = selectedNode && prevCol.includes(selectedNode) ? selectedNode : prevCol[0];\n this.#setTickledNode(targetNode, newDepth);\n }\n\n this.requestUpdate();\n }\n break;\n }\n }\n };\n\n // --- Column resize ---\n\n #onResizeStart = (event: PointerEvent, depth: number) => {\n event.preventDefault();\n event.stopPropagation();\n this.#resizingDepth = depth;\n this.#resizeStartX = event.clientX;\n const el = this.shadowRoot?.querySelectorAll(`.column`)[depth] as HTMLElement | undefined;\n this.#resizeStartWidth = el ? el.getBoundingClientRect().width : 200;\n window.addEventListener(`pointermove`, this.#onResizeMove);\n window.addEventListener(`pointerup`, this.#onResizeEnd);\n };\n\n #onResizeMove = (event: PointerEvent) => {\n if (this.#resizingDepth < 0)\n return;\n const delta = event.clientX - this.#resizeStartX;\n const newWidth = Math.max(32, this.#resizeStartWidth + delta);\n this.#columnWidths.set(this.#resizingDepth, newWidth);\n this.requestUpdate();\n };\n\n #onResizeEnd = () => {\n this.#resizingDepth = -1;\n window.removeEventListener(`pointermove`, this.#onResizeMove);\n window.removeEventListener(`pointerup`, this.#onResizeEnd);\n };\n\n // --- Render ---\n\n #getColumnHeader(depth: number): string {\n if (depth === 0)\n return this.#displayRoot?.item.label ?? ``;\n const explicit = this._selectedByDepth.get(depth - 1);\n if (explicit)\n return explicit.item.label;\n const prevCol = this._columns[depth - 1];\n const thisCol = this._columns[depth];\n if (prevCol && thisCol) {\n const parent = prevCol.find(n => n.children === thisCol);\n if (parent)\n return parent.item.label;\n }\n return ``;\n }\n\n #columnStyle(depth: number, isLast: boolean): string {\n const w = this.#columnWidths.get(depth);\n // Explicit user resize always wins (including over the 80% auto-size cap)\n if (w !== undefined)\n return `width:${w}px;flex-grow:0;flex-shrink:0;flex-basis:auto;max-width:none`;\n // Last column stretches to fill remaining space; base size is still\n // content-based so it never collapses below its content. When it stops\n // being last (a new column opens) it falls back to the content-based\n // branch below — the .column transition animates the change.\n if (this.stretchLastColumn && isLast)\n return `width:max-content;flex-grow:1;flex-shrink:0;flex-basis:auto;min-width:0`;\n return `width:max-content;flex-grow:0;flex-shrink:0;flex-basis:auto`;\n }\n\n #isFocused(node: MillerNode, depth: number): boolean {\n return this.tickled.isTickled(this.#buildTickledId(node, depth));\n }\n\n /**\n * Override to provide a custom loading indicator.\n */\n protected renderLoadingIndicator(): TemplateResult | typeof nothing {\n return html`<div class=\"loading-spinner\"></div>`;\n }\n\n #renderLoadingColumn() {\n const depth = this._loadingDepth!;\n const stretched = this.stretchLastColumn && this.#columnWidths.get(depth) === undefined;\n return html`\n <div class=\"column loading-column ${stretched ? `stretch-last` : ``}\" style=${this.#columnStyle(depth, true)}>\n ${this.headers\n ? html`\n <div class=\"column-header\">${this.#getColumnHeader(depth)}</div>\n `\n : nothing}\n <div class=\"column-content loading-content\">\n ${this.renderLoadingIndicator()}\n </div>\n </div>\n `;\n }\n\n protected override render() {\n return html`\n <div id=\"container\" @keydown=${this.#onKeyDown} tabindex=\"0\">\n ${this._columns.map((nodes, depth) => {\n const visibleNodes = this.filterPredicate\n ? nodes.filter(n => this.filterPredicate!(n, depth))\n : nodes;\n const isLast = depth === this._columns.length - 1 && this._loadingDepth === undefined;\n const stretched = this.stretchLastColumn && isLast && this.#columnWidths.get(depth) === undefined;\n return html`\n <div class=\"column ${stretched ? `stretch-last` : ``}\" style=${this.#columnStyle(depth, isLast)}>\n ${this.headers\n ? html`\n <div class=\"column-header\"\n @click=${() => this.#onHeaderClick(depth)}\n @contextmenu=${(e: MouseEvent) => this._handleHeaderRightClick(e, depth)}>\n ${this.#getColumnHeader(depth)}\n </div>\n `\n : nothing}\n <div class=\"column-content\">\n ${this.renderColumnContent(visibleNodes, depth)}\n </div>\n <div class=\"resize-handle\"\n @pointerdown=${(e: PointerEvent) => this.#onResizeStart(e, depth)}>\n </div>\n </div>\n `;\n })}\n ${this._loadingDepth !== undefined ? this.#renderLoadingColumn() : nothing}\n </div>\n ${this.search.renderField()}\n `;\n }\n\n protected _getFocusedIndex(depth: number): number {\n const tickled = this.#getTickledNodeAndDepth();\n if (tickled && tickled.depth === depth) {\n return tickled.index;\n }\n return 0;\n }\n\n protected _isFocused(node: MillerNode, depth: number): boolean {\n return this.#isFocused(node, depth);\n }\n\n /**\n * Called by subclasses when pointer enters an item.\n * Fires tickle event and switches to mouse mode.\n */\n protected _handleItemPointerEnter(node: MillerNode, depth: number) {\n this.tickled.handlePointerEnter(this.#buildTickledId(node, depth));\n this.dispatchEvent(new CustomEvent<TreeTickleDetail>(`tickle`, {\n detail: { node, depth },\n bubbles: true,\n composed: true,\n }));\n }\n\n /**\n * Called by subclasses when pointer leaves the column container.\n */\n protected _handleColumnPointerLeave() {\n this.tickled.handlePointerLeave(new PointerEvent(`pointerleave`));\n }\n\n static override styles = [themeFallbacks, tickledStyles, listSearchStyles, css`\n :host {\n --column-bg: var(--surface-3);\n --column-header-bg: var(--surface-2);\n --column-header-text: var(--surface-muted-text);\n --column-separator: var(--surface-5);\n --column-resize-handle: var(--surface-5);\n --column-resize-handle-hover: var(--accent);\n --column-resize-width: 4px;\n --item-hover-bg: var(--item-bg-tickled);\n --item-open-bg: color-mix(in oklch, var(--accent, oklch(60% 0.15 140)) 15%, transparent);\n --item-selected-bg: var(--item-bg-selected);\n --item-selected-text: var(--item-text-selected);\n\n display: block;\n overflow: hidden;\n position: relative;\n box-sizing: border-box;\n }\n\n #container {\n display: flex;\n height: 100%;\n overflow-x: auto;\n outline: none;\n }\n\n .column {\n display: flex;\n flex-direction: column;\n position: relative;\n background: var(--column-bg);\n border-right: 1px solid var(--column-separator);\n flex-shrink: 0;\n /* Content-sized columns never grow wider than 80% of the available\n width — pathological labels truncate with ellipsis instead of\n pushing every other column out of view */\n max-width: 80%;\n /* Smoothly animate the last column stretching to fill remaining\n space and shrinking back to content width when it stops being last */\n transition: flex-grow var(--transition, 0.2s ease-out);\n }\n\n .column.stretch-last {\n min-width: 0;\n /* Stretching fills remaining space by definition, so it is exempt\n from the 80% auto-size cap */\n max-width: none;\n }\n\n .column-header {\n background: var(--column-header-bg);\n color: var(--column-header-text);\n font-size: var(--text-s, 11px);\n font-family: var(--font-family, system-ui, sans-serif);\n font-weight: var(--font-weight-bold, 600);\n padding: var(--space-xs, 3px) var(--space-m, 8px);\n border-bottom: 1px solid var(--column-separator);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n flex-shrink: 0;\n cursor: pointer;\n user-select: none;\n transition: background var(--transition, 0.15s ease-out),\n color var(--transition, 0.15s ease-out);\n }\n\n .column-header:hover {\n background: var(--item-hover-bg);\n color: var(--surface-2-text, #fff);\n }\n\n .column-content {\n flex: 1;\n overflow-y: auto;\n overflow-x: visible;\n }\n\n .resize-handle {\n position: absolute;\n top: 0;\n right: 0;\n width: var(--column-resize-width);\n height: 100%;\n background: var(--column-resize-handle);\n cursor: ew-resize;\n z-index: 1;\n transition: background var(--transition, 0.15s ease-out);\n }\n\n .resize-handle:hover {\n background: var(--column-resize-handle-hover);\n }\n\n .loading-column {\n min-width: 60px;\n }\n\n .loading-content {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .loading-spinner {\n width: 22px;\n height: 22px;\n border: 2px solid var(--column-separator);\n border-top-color: var(--accent, oklch(60% 0.15 140));\n border-radius: 50%;\n animation: miller-spin 0.7s linear infinite;\n }\n\n @keyframes miller-spin {\n to { transform: rotate(360deg); }\n }\n\n ::highlight(incr-search-highlight) {\n background: var(--search-highlight-bg, var(--accent));\n color: var(--search-highlight-color, var(--accent-text, #fff));\n border-radius: 2px;\n padding: 0 1px;\n }\n `];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-miller-base': MillerBaseElement;\n }\n}\n\nexport interface MillerBaseElementEventMap extends TreeComponentEventMap {\n 'item-click': TreeItemClickEvent;\n 'expand': TreeExpandEvent;\n 'collapse': TreeCollapseEvent;\n 'select': TreeSelectEvent;\n 'tickle': TreeTickleEvent;\n 'activate': TreeActivateEvent;\n 'item-dblclick': CustomEvent<MillerItemDblClickDetail>;\n 'item-rightclick': CustomEvent<MillerItemRightClickDetail>;\n 'header-click': CustomEvent<MillerHeaderClickDetail>;\n 'header-rightclick': CustomEvent<MillerHeaderRightClickDetail>;\n 'rebase': CustomEvent<MillerRebaseDetail>;\n}\n\nexport interface MillerBaseElement {\n addEventListener: (<K extends keyof MillerBaseElementEventMap>(\n type: K,\n listener: (this: MillerBaseElement, event: MillerBaseElementEventMap[K]) => void,\n options?: boolean | AddEventListenerOptions,\n ) => void) & ((\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ) => void);\n removeEventListener: (<K extends keyof MillerBaseElementEventMap>(\n type: K,\n listener: (this: MillerBaseElement, event: MillerBaseElementEventMap[K]) => void,\n options?: boolean | EventListenerOptions,\n ) => void) & ((\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | EventListenerOptions,\n ) => void);\n}\n","import type { TemplateResult } from 'lit';\nimport type { MillerNode } from './types.js';\nimport { css, html, nothing } from 'lit';\nimport { appearanceAbsent, appearanceColor } from '../common/item-appearance.js';\nimport { tickledItemStyles } from '../interaction/index.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport { MillerBaseElement } from './miller-base.js';\n\ntype CheckboxState = `checked` | `unchecked` | `indeterminate`;\n\n/**\n * Recursively compute the checkbox state for a node based on `selectedKeys`.\n *\n * - Unloaded branch (`children === undefined`): treated as a leaf — we can only\n * report on what is known.\n * - Leaf or confirmed-empty branch: checked iff its key is in `selectedKeys`.\n * - Loaded branch: checked if ALL descendants are checked; unchecked if NONE are;\n * indeterminate otherwise.\n */\nfunction computeCheckboxState(node: MillerNode, selectedKeys: ReadonlySet<string>): CheckboxState {\n // Unloaded or leaf\n if (node.item.isLeaf || !node.children?.length) {\n return selectedKeys.has(node.item.key) ? `checked` : `unchecked`;\n }\n\n const childStates = node.children.map(c => computeCheckboxState(c, selectedKeys));\n const allChecked = childStates.every(s => s === `checked`);\n const allUnchecked = childStates.every(s => s === `unchecked`);\n\n if (allChecked)\n return `checked`;\n if (allUnchecked)\n return `unchecked`;\n return `indeterminate`;\n}\n\n/**\n * Miller columns with a vertical list layout — items stack in rows like macOS Finder.\n *\n * Usage:\n * ```html\n * <ixfx-miller-list id=\"miller\"></ixfx-miller-list>\n * <script>\n * const el = document.getElementById('miller');\n * el.root = { item: { key: 'root', label: 'Root' }, children: [...] };\n * el.addEventListener('expand', ({ detail }) => {\n * detail.node.children = fetchChildren(detail.node.item.key);\n * el.requestUpdate();\n * });\n * </script>\n * ```\n */\n@customElement(`ixfx-miller-list`)\nexport class MillerListElement extends MillerBaseElement {\n protected override renderColumnContent(nodes: MillerNode[], depth: number): TemplateResult {\n const hasIcons = nodes.some(node => !!node.item.icon);\n const isCheckedMode = this.interactionMode === `checked`;\n return html`\n <ul\n class=\"item-list ${hasIcons ? `has-icons` : ``} ${isCheckedMode ? `checked-mode` : ``}\"\n role=\"listbox\"\n aria-label=\"Column ${depth}\"\n @pointerleave=${() => this._handleColumnPointerLeave()}\n >\n ${nodes.map(node => this.#renderListItem(node, depth))}\n </ul>\n `;\n }\n\n #renderListItem(node: MillerNode, depth: number): TemplateResult {\n const selected = this._isSelected(node, depth);\n const tickled = this._isFocused(node, depth); // Note: _isFocused now checks tickled state\n const open = this._isOpen(node, depth);\n const isBranch = node.item.isLeaf !== true;\n const icon = node.item.icon;\n const iconColor = appearanceColor(node.item.iconColor);\n const textColor = appearanceColor(node.item.textColor);\n const badge = appearanceAbsent(node.item.badge) ? undefined : node.item.badge;\n const tooltip = node.item.tooltip;\n const isCheckedMode = this.interactionMode === `checked`;\n\n let checkboxTpl: TemplateResult | typeof nothing = nothing;\n if (isCheckedMode) {\n const state = computeCheckboxState(node, this._selectedKeys);\n checkboxTpl = html`\n <input\n type=\"checkbox\"\n class=\"item-checkbox\"\n .checked=${state === `checked`}\n .indeterminate=${state === `indeterminate`}\n aria-label=\"Select ${node.item.label}\"\n @click=${(e: MouseEvent) => this._handleCheckboxClick(e, node, depth)}\n />\n `;\n }\n\n return html`\n <li\n class=\"item ${selected ? `selected` : ``} ${open ? `open` : ``} ${tickled ? `tickled` : ``} ${isBranch ? `branch` : `leaf`}\"\n role=\"option\"\n aria-selected=${selected}\n @click=${(e: MouseEvent) => this._handleItemClick(node, depth, e)}\n @dblclick=${(e: MouseEvent) => this._handleItemDblClick(node, depth, e)}\n @contextmenu=${(e: MouseEvent) => this._handleItemRightClick(node, depth, e)}\n @pointerenter=${() => this._handleItemPointerEnter(node, depth)}\n >\n ${checkboxTpl}\n ${icon ? html`<ixfx-icon class=\"item-icon\" name=\"${icon}\" style=${iconColor ? `color:${iconColor}` : nothing}></ixfx-icon>` : nothing}\n <span class=\"label\" style=${textColor ? `color:${textColor}` : nothing}>${node.item.label}</span>\n ${badge === undefined ? nothing : html`<span class=\"item-badge\" part=\"badge\">${badge}</span>`}\n ${tooltip ? html`<ixfx-tooltip class=\"item-tooltip\" anchor=\"--tooltip-miller-${depth}-${node.item.key}\" .value=${tooltip}></ixfx-tooltip>` : nothing}\n ${isBranch ? html`<span class=\"caret\" aria-hidden=\"true\">›</span>` : nothing}\n </li>\n `;\n }\n\n static override styles = [\n themeFallbacks,\n ...MillerBaseElement.styles,\n tickledItemStyles,\n css`\n .item-list {\n list-style: none;\n margin: 0;\n padding: var(--space-xs, 3px) 0;\n }\n\n .item {\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n\n .item.selected {\n background: var(--item-selected-bg);\n color: var(--item-selected-text, #fff);\n outline: 2px dashed var(--surface-3, #333);\n outline-offset: -2px;\n }\n\n /* Item is on the currently open path (ancestor of deepest column) */\n .item.open:not(.selected) {\n background: var(--item-open-bg);\n }\n\n .item-icon {\n flex-shrink: 0;\n width: var(--icon-size, 1em);\n height: var(--icon-size, 1em);\n margin-right: var(--icon-spacing, 0.3em);\n }\n\n /* Align text on icon-less rows with icon rows in a mixed list */\n .item-list.has-icons .item:not(:has(.item-icon)) .label {\n margin-left: calc(var(--icon-size, 1em) + var(--icon-spacing, 0.3em));\n }\n\n .label {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n /* Finder-style badge: sits between the label and the caret, flush to\n the right edge of the row. The label is flex:1, so the gap opens up\n ahead of the badge automatically. */\n .item-badge {\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n margin-inline-start: auto;\n padding-inline-start: var(--miller-list-badge-gap, 0.5em);\n }\n\n .item-tooltip {\n position: absolute;\n }\n\n .caret {\n flex-shrink: 0;\n margin-left: var(--space-s, 4px);\n color: var(--surface-muted-text);\n font-size: var(--text-l, 13px);\n }\n\n .item.selected .caret {\n color: var(--item-selected-text, #fff);\n }\n\n /* ---- checked mode ---- */\n\n .item-checkbox {\n flex-shrink: 0;\n margin-right: var(--space-xs, 3px);\n cursor: pointer;\n accent-color: var(--accent);\n /* Prevent the checkbox click from also triggering item styles */\n pointer-events: auto;\n }\n\n /* In checked mode the item row itself is not highlighted on selection —\n the checkbox communicates state instead. */\n .item-list.checked-mode .item.selected {\n background: transparent;\n color: var(--surface-3-text, #fff);\n }\n\n \n `,\n ];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-miller-list': MillerListElement;\n }\n}\n","import type { TraversableTree } from '@ixfx/collections';\nimport type { MillerBaseElement } from './miller-base.js';\nimport type { MillerItem, MillerNode } from './types.js';\n\nexport type MillerTreeControllerOptions<T> = {\n /**\n * Convert a tree node's value to a `MillerItem`.\n * You must supply at minimum `key` and `label`.\n * If `isLeaf` is omitted the controller infers it from whether the\n * `TraversableTree` node has any children.\n */\n valueToItem: (value: T, node: TraversableTree<T>) => MillerItem;\n};\n\n/**\n * Bridges an `ixfx` `TraversableTree<T>` with an `ixfx-miller-*` component.\n *\n * Usage:\n * ```ts\n * import { Trees } from '@ixfx/collections';\n * import { MillerTreeController } from 'ixfx-components/miller';\n *\n * const root = Trees.Mutable.createNode({ key: 'root', label: 'Root' });\n * Trees.Mutable.addValue({ key: 'a', label: 'Alpha' }, root);\n *\n * const ctrl = new MillerTreeController(\n * Trees.Mutable.asDynamicTraversable(root),\n * document.querySelector('ixfx-miller-list'),\n * { valueToItem: v => ({ key: v.key, label: v.label }) }\n * );\n * ctrl.connect();\n * ```\n *\n * Children are populated lazily: the controller provides a `loadChildren`\n * callback that synchronously reads from the underlying tree.\n *\n * Call `disconnect()` to remove all event listeners and release resources.\n */\nexport class MillerTreeController<T> {\n #root: TraversableTree<T>;\n #element: MillerBaseElement;\n #options: MillerTreeControllerOptions<T>;\n\n // Forward map: MillerNode → TraversableTree node (for expand handler)\n #nodeToTree = new WeakMap<MillerNode, TraversableTree<T>>();\n // Reverse map: tree identity → MillerNode (for path pre-loading in navigateToValue)\n #identityToMillerNode = new Map<unknown, MillerNode>();\n\n #connectSignal: AbortController | undefined;\n\n constructor(\n root: TraversableTree<T>,\n element: MillerBaseElement,\n options: MillerTreeControllerOptions<T>,\n ) {\n this.#root = root;\n this.#element = element;\n this.#options = options;\n }\n\n // --- Public ---\n\n /**\n * Wire up the controller: sets `element.root` and provides `loadChildren` callback.\n * Safe to call again after `disconnect()`.\n */\n connect() {\n this.disconnect();\n this.#connectSignal = new AbortController();\n\n const rootValue = this.#root.getValue();\n const rootItem = this.#options.valueToItem(rootValue, this.#root);\n const rootChildren = this.#childrenOf(this.#root);\n\n this.#element.root = { item: rootItem, children: rootChildren };\n\n // Use loadChildren callback instead of expand event\n this.#element.loadChildren = ({ node }) => {\n const treeNode = this.#nodeToTree.get(node);\n if (!treeNode)\n return [];\n return this.#childrenOf(treeNode);\n };\n }\n\n /** Remove all event listeners and release internal state. */\n disconnect() {\n this.#connectSignal?.abort();\n this.#connectSignal = undefined;\n this.#element.loadChildren = undefined; // Clear callback\n }\n\n /**\n * Navigate the component to the first node (depth-first) in the ixfx tree\n * whose value satisfies `predicate`.\n *\n * Any ancestor `MillerNode`s with unloaded children are populated\n * synchronously before calling `element.navigateTo()`.\n *\n * Key paths are relative to the element's current view root: when the view\n * is rebased, only matches at or below the view root can be reached.\n *\n * Returns `false` if no matching node is found.\n */\n navigateToValue(predicate: (value: T) => boolean): boolean {\n const treePath = this.#findTreePath(this.#root, predicate);\n if (!treePath)\n return false;\n\n // Resolve the element's view base: a rebased view navigates relative to it.\n const base = this.#element.viewRoot ?? this.#element.root;\n if (!base)\n return false;\n let startIndex = 1;\n if (this.#element.viewRoot) {\n const mappedBase = this.#nodeToTree.get(base);\n if (!mappedBase)\n return false;\n const baseIndex = treePath.indexOf(mappedBase);\n if (baseIndex < 0)\n return false;\n startIndex = baseIndex + 1;\n if (base.children === undefined)\n base.children = this.#childrenOf(mappedBase);\n }\n\n // treePath[startIndex..] are the nodes in each column.\n // Ensure ancestor MillerNodes have their children loaded.\n let currentColumn = base.children ?? [];\n const keys: string[] = [];\n\n for (let i = startIndex; i < treePath.length; i++) {\n const treeNode = treePath[i];\n const key = this.#options.valueToItem(treeNode.getValue(), treeNode).key;\n keys.push(key);\n\n if (i < treePath.length - 1) {\n // Not the final node — ensure its MillerNode has children loaded\n const millerNode = currentColumn.find(n => n.item.key === key);\n if (!millerNode)\n return false;\n\n if (millerNode.children === undefined) {\n const mapped = this.#nodeToTree.get(millerNode);\n if (mapped)\n millerNode.children = this.#childrenOf(mapped);\n }\n currentColumn = millerNode.children ?? [];\n }\n }\n\n return this.#element.navigateTo(keys);\n }\n\n // --- Private helpers ---\n\n /** Convert a TraversableTree node's children to MillerNode[]. */\n #childrenOf(treeNode: TraversableTree<T>): MillerNode[] {\n return Array.from(treeNode.children(), child => this.#toMillerNode(child));\n }\n\n #toMillerNode(treeNode: TraversableTree<T>): MillerNode {\n const value = treeNode.getValue();\n const childList = [...treeNode.children()];\n const userItem = this.#options.valueToItem(value, treeNode);\n\n // Infer isLeaf from tree structure if not supplied by user\n const isLeaf = userItem.isLeaf ?? childList.length === 0;\n\n const millerNode: MillerNode = {\n item: { ...userItem, isLeaf },\n // undefined = has children but not loaded yet; [] = confirmed empty/leaf\n children: isLeaf ? [] : undefined,\n };\n\n this.#nodeToTree.set(millerNode, treeNode);\n this.#identityToMillerNode.set(treeNode.getIdentity(), millerNode);\n return millerNode;\n }\n\n /** DFS through the ixfx tree returning the path of nodes to the first match. */\n #findTreePath(\n node: TraversableTree<T>,\n predicate: (value: T) => boolean,\n ancestors: Array<TraversableTree<T>> = [],\n ): Array<TraversableTree<T>> | undefined {\n const path = [...ancestors, node];\n if (predicate(node.getValue()))\n return path;\n for (const child of node.children()) {\n const result = this.#findTreePath(child, predicate, path);\n if (result)\n return result;\n }\n return undefined;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"narrowed-text.js","names":["#onNarrowedTextInit","#onItemClick","#handleSlotChange","#onContainerClick","#onInput","#onKeyDown","#onFocus","#onBlur","#onFocusTriggerClick","#renderItem","customElement"],"sources":["../src/narrowed-text/narrowed-text.ts"],"sourcesContent":["import type { CommandRegistry } from '@clinth/ui-commands';\nimport type { PropertyValues } from 'lit';\nimport type { IncrSearch, IncrSearchState } from '../incr-search/index.js';\nimport type {\n NarrowedTextChangeDetail,\n NarrowedTextItem,\n Orientation,\n SelectionMode,\n} from './types.js';\nimport { createCommandRegistry } from '@clinth/ui-commands';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { property, query, state } from 'lit/decorators.js';\nimport {\n applyHighlights,\n buildHighlightTargets,\n clearHighlights,\n createIncrSearch,\n} from '../incr-search/index.js';\nimport { TickledController, tickledItemStyles, tickledStyles } from '../interaction/index.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\n\nconst HIGHLIGHT_KEY = `narrowed-text-highlight`;\n\n@customElement(`ixfx-narrowed-text`)\nexport class NarrowedTextElement extends LitElement {\n @property({ type: String, attribute: `selection-mode` }) selectionMode: SelectionMode = `single`;\n @property({ type: Boolean, attribute: `required-selection` }) requiredSelection = false;\n @property({ type: String, attribute: `orientation` }) orientation: Orientation = `horizontal`;\n @property({ type: Boolean, attribute: `nowrap` }) nowrap = false;\n @property({ type: String, attribute: `separator` }) separator = ` `;\n @property({ type: String, attribute: `width` }) width: string | undefined;\n @property({ type: String, attribute: `height` }) height: string | undefined;\n @property({ type: Boolean, attribute: `preserve-filter` }) preserveFilter = false;\n @property({ type: String }) value = ``;\n\n @property({ attribute: false })\n registry: CommandRegistry<unknown> | undefined = undefined;\n\n @state() private _query = ``;\n @state() private _computedItems: NarrowedTextItem[] = [];\n @state() private _filteredItems: NarrowedTextItem[] = [];\n @state() private _isFocused = false;\n @query(`slot`) private _slot!: HTMLSlotElement;\n\n private _selectedValues: Set<string> = new Set();\n private _ownedRegistry: CommandRegistry<unknown> | undefined;\n private _search: IncrSearch<NarrowedTextItem> = createIncrSearch<NarrowedTextItem>({\n selector: item => item.label ?? item.value,\n });\n\n private _searchState: IncrSearchState<NarrowedTextItem> | undefined;\n private _unsubSearch: (() => void) | undefined;\n\n // TickledController manages hover and keyboard focus\n private tickled = new TickledController<number>(this, {\n getItems: () => {\n return this._filteredItems.map((_, i) => ({\n id: i,\n enabled: true,\n }));\n },\n onTickle: (id) => {\n if (id === undefined || !this.shadowRoot)\n return;\n const itemsContainer = this.shadowRoot.querySelector(`.items`);\n if (!itemsContainer)\n return;\n const itemEls = itemsContainer.querySelectorAll(`.item`);\n const itemEl = itemEls[id];\n if (itemEl) {\n itemEl.scrollIntoView({ block: `nearest`, inline: `nearest` });\n }\n },\n });\n\n get selected(): string | string[] {\n if (this.selectionMode === `single`) {\n return this._selectedValues.values().next().value ?? ``;\n } else {\n return [...this._selectedValues];\n }\n }\n\n set selected(value: string | string[]) {\n if (this.selectionMode === `single`) {\n this._selectedValues.clear();\n if (value) {\n this._selectedValues.add(value as string);\n }\n } else {\n this._selectedValues.clear();\n if (Array.isArray(value)) {\n value.forEach(v => this._selectedValues.add(v));\n }\n }\n\n this._updateFilteredItems();\n }\n\n selectAll(): void {\n const items = this._filteredItems;\n if (items.length === 0)\n return;\n if (this.selectionMode === `single`) {\n this._selectedValues.clear();\n this._selectedValues.add(items[0].value);\n } else {\n this._selectedValues.clear();\n for (const item of items) {\n this._selectedValues.add(item.value);\n }\n }\n this._updateValueFromSelected();\n this._updateFilteredItems();\n this.dispatchEvent(new CustomEvent<NarrowedTextChangeDetail>(`change`, {\n detail: {\n item: undefined,\n query: this._query,\n selected: this._computedItems.filter(i => this._selectedValues.has(i.value)),\n },\n bubbles: true,\n composed: true,\n }));\n }\n\n deselectAll(): void {\n if (this.requiredSelection && this._selectedValues.size <= 1)\n return;\n if (this._selectedValues.size === 0)\n return;\n this._selectedValues.clear();\n this._updateValueFromSelected();\n this._updateFilteredItems();\n this.dispatchEvent(new CustomEvent<NarrowedTextChangeDetail>(`change`, {\n detail: {\n item: undefined,\n query: this._query,\n selected: [],\n },\n bubbles: true,\n composed: true,\n }));\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this._unsubSearch = this._search.onChange((state) => {\n const results = state.results.map(r => r.item);\n for (const item of this._computedItems) {\n if (this._selectedValues.has(item.value) && !results.includes(item)) {\n results.push(item);\n }\n }\n this._filteredItems = results;\n this._searchState = state;\n this.requestUpdate();\n });\n this.addEventListener(`narrowed-text-init`, () => this.#onNarrowedTextInit());\n\n const registry = this._ownedRegistry = createCommandRegistry();\n registry.register({\n id: `select-all`,\n label: `Select All`,\n description: `Select every currently-filtered item (or first in single mode)`,\n execute: () => this.selectAll(),\n });\n registry.register({\n id: `deselect-all`,\n label: `Deselect All`,\n description: `Clear all selection`,\n execute: () => this.deselectAll(),\n });\n this.registry = registry;\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this._unsubSearch?.();\n this._search.dispose();\n clearHighlights({ key: HIGHLIGHT_KEY });\n this.removeEventListener(`narrowed-text-init`, () => this.#onNarrowedTextInit());\n if (this._ownedRegistry) {\n this._ownedRegistry.unregister(`select-all`);\n this._ownedRegistry.unregister(`deselect-all`);\n this._ownedRegistry = undefined;\n this.registry = undefined;\n }\n }\n\n protected override firstUpdated(): void {\n this._updateComputedItems();\n }\n\n protected override updated(changedProperties: PropertyValues): void {\n if (changedProperties.has(`value`)) {\n this._updateSelectedFromValue();\n }\n this._applyHighlights();\n }\n\n #handleSlotChange = (): void => {\n this._updateComputedItems();\n };\n\n private _updateComputedItems(): void {\n const slottedElements = this.querySelectorAll(`[data-value]`);\n const items: NarrowedTextItem[] = [];\n\n slottedElements.forEach((el) => {\n const value = el.getAttribute(`data-value`) ?? ``;\n const label = el.getAttribute(`data-label`) ?? el.textContent?.trim() ?? value;\n const description = el.getAttribute(`data-description`) ?? undefined;\n const iconName = el.getAttribute(`data-icon-name`) ?? undefined;\n\n items.push({ value, label, description, iconName });\n });\n\n this._computedItems = items;\n void this._search.setItems(items);\n }\n\n private _updateSelectedFromValue(): void {\n if (this.selectionMode === `single`) {\n this._selectedValues.clear();\n if (this.value) {\n this._selectedValues.add(this.value);\n }\n } else {\n const values = this.value.split(`,`).filter(v => v.trim());\n this._selectedValues.clear();\n values.forEach(v => this._selectedValues.add(v.trim()));\n }\n\n this._updateFilteredItems();\n }\n\n private _updateFilteredItems(): void {\n void this._search.setQuery(this._query);\n }\n\n private _applyHighlights(): void {\n if (!this._query.trim() || !this._searchState || !this.shadowRoot) {\n clearHighlights({ key: HIGHLIGHT_KEY });\n return;\n }\n\n const targets = buildHighlightTargets(\n this.shadowRoot,\n `.item-label`,\n this._searchState.positionsByItem,\n (el) => {\n const v = el.getAttribute(`data-item-value`);\n return this._computedItems.find(i => i.value === v);\n },\n (el) => {\n const v = el.getAttribute(`data-item-value`);\n const i = this._computedItems.find(x => x.value === v);\n return i?.label ?? i?.value ?? ``;\n },\n );\n applyHighlights(targets, { key: HIGHLIGHT_KEY });\n }\n\n #onInput = (e: Event): void => {\n const input = e.target as HTMLInputElement;\n this._query = input.value;\n // Reset tickled to first item when query changes\n if (this._query.trim() && this._filteredItems.length > 0) {\n this.tickled.setTickled(0);\n } else {\n this.tickled.clearTickled();\n }\n this._updateFilteredItems();\n };\n\n #onKeyDown = (e: KeyboardEvent): void => {\n if (this._filteredItems.length === 0) {\n return;\n }\n\n switch (e.key) {\n case `Tab`: {\n if (e.shiftKey) {\n e.preventDefault();\n this.dispatchEvent(new CustomEvent(`narrowed-text-shift-tab`, {\n bubbles: true,\n composed: true,\n }));\n }\n return;\n }\n case `ArrowRight`: {\n if (this.orientation !== `horizontal`) {\n return;\n }\n const currentTickled = this.tickled.tickledId;\n const lastIndex = this._filteredItems.length - 1;\n if (currentTickled !== undefined && currentTickled >= lastIndex) {\n return;\n }\n e.preventDefault();\n this.tickled.handleKeyboardNavigation(`next`);\n break;\n }\n case `ArrowLeft`: {\n if (this.orientation !== `horizontal`) {\n return;\n }\n const currentTickled = this.tickled.tickledId;\n if (currentTickled !== undefined && currentTickled <= 0) {\n return;\n }\n e.preventDefault();\n this.tickled.handleKeyboardNavigation(`previous`);\n break;\n }\n case `ArrowDown`: {\n if (this.orientation !== `vertical`) {\n return;\n }\n const currentTickled = this.tickled.tickledId;\n const lastIndex = this._filteredItems.length - 1;\n if (currentTickled !== undefined && currentTickled >= lastIndex) {\n return;\n }\n e.preventDefault();\n this.tickled.handleKeyboardNavigation(`next`);\n break;\n }\n case `ArrowUp`: {\n if (this.orientation !== `vertical`) {\n return;\n }\n const currentTickled = this.tickled.tickledId;\n if (currentTickled !== undefined && currentTickled <= 0) {\n return;\n }\n e.preventDefault();\n this.tickled.handleKeyboardNavigation(`previous`);\n break;\n }\n case `Enter`: {\n e.preventDefault();\n const tickledItem = this._filteredItems[this.tickled.tickledId ?? -1];\n if (tickledItem) {\n this._selectItem(tickledItem, false);\n // Enter always clears filter regardless of preserveFilter\n this._query = ``;\n this._updateFilteredItems();\n }\n break;\n }\n case ` `: {\n e.preventDefault();\n if (this.tickled.tickledId !== undefined && this._filteredItems[this.tickled.tickledId]) {\n this._selectItem(this._filteredItems[this.tickled.tickledId], false);\n }\n break;\n }\n case `Escape`: {\n e.preventDefault();\n this._query = ``;\n this.tickled.clearTickled();\n this._updateFilteredItems();\n break;\n }\n }\n };\n\n #onFocus = (): void => {\n this._isFocused = true;\n if (this._query.trim() && this._filteredItems.length > 0) {\n this.tickled.setTickled(0);\n }\n };\n\n #onNarrowedTextInit = (): void => {\n const input = this.shadowRoot?.querySelector(`.search-input`) as HTMLInputElement | null;\n if (input) {\n requestAnimationFrame(() => {\n input.focus();\n });\n }\n };\n\n focus(): void {\n // Override focus to focus internal input\n const input = this.shadowRoot?.querySelector(`.search-input`) as HTMLInputElement | null;\n if (input) {\n input.focus();\n } else {\n super.focus();\n }\n }\n\n blur(): void {\n const input = this.shadowRoot?.querySelector(`.search-input`) as HTMLInputElement | null;\n if (input) {\n input.blur();\n } else {\n super.blur();\n }\n };\n\n setContents(contents: NarrowedTextItem[]): void {\n while (this.firstChild) {\n this.firstChild.remove();\n }\n\n for (const item of contents) {\n const span = document.createElement(`span`);\n span.setAttribute(`data-value`, item.value);\n if (item.label !== undefined)\n span.setAttribute(`data-label`, item.label);\n if (item.description !== undefined)\n span.setAttribute(`data-description`, item.description);\n if (item.iconName !== undefined)\n span.setAttribute(`data-icon-name`, item.iconName);\n this.appendChild(span);\n }\n\n this._selectedValues.clear();\n const selectedValues = contents.filter(i => i.selected).map(i => i.value);\n for (const v of selectedValues) {\n this._selectedValues.add(v);\n }\n\n if (selectedValues.length > 0) {\n this.requestUpdate();\n }\n }\n\n deleteItem(value: string): boolean {\n const el = this.querySelector(`[data-value=\"${CSS.escape(value)}\"]`);\n if (!el)\n return false;\n el.remove();\n this._selectedValues.delete(value);\n return true;\n }\n\n #onBlur = (): void => {\n this._isFocused = false;\n this.tickled.clearTickled();\n this.dispatchEvent(new CustomEvent(`narrowed-text-blur`, { bubbles: true, composed: true }));\n };\n\n #onFocusTriggerClick = (): void => {\n const input = this.shadowRoot?.querySelector(`.search-input`) as HTMLInputElement | null;\n input?.focus();\n };\n\n #onContainerClick = (e: MouseEvent): void => {\n const target = e.target as HTMLElement;\n if (target.classList.contains(`item`) || target.closest(`.item`)) {\n return;\n }\n const input = this.shadowRoot?.querySelector(`.search-input`) as HTMLInputElement | null;\n input?.focus();\n };\n\n #onItemClick(item: NarrowedTextItem): void {\n this._selectItem(item);\n const clickedIndex = this._filteredItems.findIndex(i => i.value === item.value);\n if (clickedIndex >= 0) {\n this.tickled.handlePointerEnter(clickedIndex);\n }\n const input = this.shadowRoot?.querySelector(`.search-input`) as HTMLInputElement | null;\n input?.focus();\n }\n\n private _selectItem(item: NarrowedTextItem, clearFilter = true): void {\n if (this.selectionMode === `single`) {\n if (this._selectedValues.has(item.value) && !this.requiredSelection) {\n this._selectedValues.clear();\n } else {\n this._selectedValues.clear();\n this._selectedValues.add(item.value);\n }\n } else {\n if (this._selectedValues.has(item.value)) {\n if (!this.requiredSelection || this._selectedValues.size > 1) {\n this._selectedValues.delete(item.value);\n }\n } else {\n this._selectedValues.add(item.value);\n }\n }\n\n this._updateValueFromSelected();\n this._updateFilteredItems();\n\n const selectedItems = this._computedItems.filter(i => this._selectedValues.has(i.value));\n\n this.dispatchEvent(new CustomEvent<NarrowedTextChangeDetail>(`change`, {\n detail: { item, query: this._query, selected: selectedItems },\n bubbles: true,\n composed: true,\n }));\n\n if (clearFilter && !this.preserveFilter && this._query) {\n this._query = ``;\n this._updateFilteredItems();\n }\n }\n\n private _updateValueFromSelected(): void {\n if (this.selectionMode === `single`) {\n this.value = [...this._selectedValues][0] ?? ``;\n } else {\n this.value = [...this._selectedValues].join(`,`);\n }\n }\n\n #renderItem(item: NarrowedTextItem, index: number) {\n const isTickled = this.tickled.isTickled(index);\n const isSelected = this._selectedValues.has(item.value);\n const label = item.label ?? item.value;\n\n return html`\n <div\n class=\"item ${isTickled ? `tickled` : ``} ${isSelected ? `selected` : ``}\"\n part=\"item\"\n role=\"option\"\n aria-selected=${isSelected}\n @click=${() => this.#onItemClick(item)}\n @pointerenter=${() => this.tickled.handlePointerEnter(index)}\n >\n ${item.iconName ? html`<ixfx-icon class=\"item-icon\" name=${item.iconName}></ixfx-icon>` : nothing}\n <span class=\"item-label\" part=\"label\" data-item-value=${item.value}>${label}</span>\n </div>\n `;\n }\n\n protected override render() {\n const isScrollable = this.width !== undefined || this.height !== undefined;\n\n return html`\n <slot @slotchange=${this.#handleSlotChange} style=\"display: none;\"></slot>\n <div\n class=\"container ${this.orientation} ${isScrollable ? `scrollable` : ``} ${this._isFocused ? `focused` : ``}\"\n part=\"container\"\n style=${this._getContainerStyle()}\n data-input-mode=${this.tickled.inputMode}\n @click=${this.#onContainerClick}\n >\n <input\n type=\"text\"\n class=\"search-input\"\n .value=${this._query}\n autocomplete=\"off\"\n spellcheck=\"false\"\n aria-label=\"Search items\"\n @input=${this.#onInput}\n @keydown=${this.#onKeyDown}\n @focus=${this.#onFocus}\n @blur=${this.#onBlur}\n >\n <div class=\"focus-trigger\" @click=${this.#onFocusTriggerClick}></div>\n <div \n class=\"items\" \n part=\"items\" \n role=\"listbox\"\n @pointerleave=${(e: PointerEvent) => this.tickled.handlePointerLeave(e)}\n >\n ${this._filteredItems.map((item, i) => this.#renderItem(item, i))}\n </div>\n </div>\n `;\n }\n\n private _getContainerStyle(): string {\n const styles: string[] = [];\n if (this.width) {\n styles.push(`width: ${this.width}`);\n }\n if (this.height) {\n styles.push(`height: ${this.height}`);\n }\n return styles.join(`; `);\n }\n\n static override styles = [themeFallbacks, tickledStyles, tickledItemStyles, css`\n :host {\n display: inline-block;\n position: relative;\n font-family: var(--font-family, system-ui, sans-serif);\n font-size: var(--text-m, 12px);\n color: var(--surface-2-text);\n --item-padding: var(--space-xs, 3px) var(--space-m, 8px);\n --item-border-radius: var(--radius-s, 3px);\n --item-icon-spacing: var(--space-xs, 3px);\n }\n\n .container {\n display: flex;\n position: relative;\n min-width: min-content;\n min-height: min-content;\n }\n\n .container.horizontal {\n flex-direction: row;\n align-items: stretch;\n }\n\n .container.vertical {\n flex-direction: column;\n }\n\n .container.scrollable {\n scrollbar-width: none;\n overflow-x: auto;\n overflow-y: hidden;\n .vertical {\n overflow-x: hidden;\n overflow-y: auto;\n }\n }\n\n .container.focused {\n outline: 2px solid var(--accent);\n outline-offset: 2px;\n }\n\n .search-input {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n opacity: 0;\n cursor: text;\n z-index: 1;\n pointer-events: none;\n }\n\n .search-input:focus {\n outline: none;\n }\n\n .focus-trigger {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 0;\n cursor: text;\n }\n\n .items {\n display: flex;\n flex-wrap: wrap;\n gap: var(--item-spacing, var(--space-xs, 3px));\n align-items: center;\n width: 100%;\n height: 100%;\n min-height: var(--item-height, 28px);\n position: relative;\n z-index: 2;\n pointer-events: auto;\n }\n\n .container.horizontal .items {\n flex-direction: row;\n }\n\n .container.vertical .items {\n flex-direction: column;\n align-items: stretch;\n }\n\n :host([nowrap]) .items {\n flex-wrap: nowrap;\n }\n\n .item-icon {\n flex-shrink: 0;\n width: 1em;\n height: 1em;\n }\n\n .item-label {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n color: var(--item-label-color, var(--item-text, inherit));\n font-style: var(--item-label-font-style, var(--item-label-font-style-default, normal));\n text-decoration: var(--item-label-text-decoration, var(--item-label-text-decoration-default, none));\n text-underline-offset: var(--item-label-text-underline-offset, auto);\n }\n\n .item.selected .item-label {\n --item-label-color: var(--item-text-selected);\n --item-label-font-style: var(--item-label-font-style-selected, italic);\n }\n\n .item.tickled .item-label {\n --item-label-text-decoration: var(--item-label-text-decoration-tickled, underline dotted);\n --item-label-text-underline-offset: var(--item-label-text-underline-offset-tickled, 3px);\n }\n\n .item.active .item-label {\n --item-label-color: var(--item-text-selected);\n }\n\n .item.selected.tickled .item-label {\n --item-label-color: var(--item-text-selected);\n --item-label-font-style: var(--item-label-font-style-selected, italic);\n --item-label-text-decoration: var(--item-label-text-decoration-tickled, underline dotted);\n --item-label-text-underline-offset: var(--item-label-text-underline-offset-tickled, 3px);\n }\n\n ::highlight(narrowed-text-highlight) {\n background: var(--highlight-background, var(--accent));\n color: var(--highlight-color, var(--accent-text, #fff));\n border-radius: 2px;\n padding: 0 1px;\n }\n `];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-narrowed-text': NarrowedTextElement;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"notification-pill-DyZydXoZ.d.ts","names":[],"sources":["../src/notifier/types.ts","../src/notifier/notification-pill.ts"],"mappings":";;KAAY;KAEA;WACD,MAAM;WACN;WACA;WACA,SAAS;;KAGR,eAAe;WAChB;WACA;WACA;;UAGM;EACf,QAAQ;;UAGO;;EAEf,SAAS,OAAO;;EAEhB;;;;;;EAMA,mBAAmB,eAAe,gBAAgB;;KAGxC;EACV,WAAW;EACX;EACA;EACA;EACA;EACA;EACA,qBAAqB,cAAc;;;;KC9BzB;WAA2B;;KAC3B,eAAe,YAAY;UAEtB;EACf,YAAY;;cAID,gCAAgC;;EAE3C,kBAAkB;EAGlB;EAGA;EAGA;EAGA;YAqCU,wBAAM;SAgBT,sBAAM;;QA6EP;YACI;IACR,0BAA0B;;;UAIb;EACf,oBAAoB,gBAAgB,iCAClC,MAAM,GACN,WAAW,MAAM,yBAAyB,OAAO,gCAAgC,aACjF,oBAAoB,sCAEpB,cACA,UAAU,oCACV,oBAAoB"}
|