@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":"data-provider-35TyWclX.js","names":[],"sources":["../src/common/data-provider.ts"],"sourcesContent":["/**\n * Shared data-provider contract used by components that render a list of items.\n *\n * A provider is a simple callable — the consuming component (via DataController)\n * manages the request lifecycle, cancellation, and reactive state.\n */\n\n/**\n * One batch of items within a streaming provider response.\n *\n * For sync and async one-shot providers, the DataController synthesises a single\n * DataBatch internally — you only need this type when writing a streaming provider.\n */\nexport type DataBatch<T> = {\n /** Items delivered in this batch. */\n readonly items: readonly T[];\n /**\n * When true, replace all previously accumulated items with this batch instead\n * of appending. Useful for re-ranked or filtered results mid-stream.\n * Default: false (append).\n */\n replace?: boolean;\n /**\n * Provider's current estimate of the total number of items that will be\n * delivered across all batches. Enables progress percentage in the consumer.\n * May be refined in subsequent batches as the estimate improves.\n * Omit when the total is unknown.\n */\n total?: number;\n};\n\n/**\n * The three return modes a provider may use.\n * DataController normalises all three — callers can mix modes freely.\n *\n * - `readonly T[]` — sync, items available immediately\n * - `Promise<readonly T[]>` — async one-shot, resolves to the full result\n * - `AsyncIterable<DataBatch<T>>` — streaming, batches arrive over time\n */\nexport type DataProviderResult<T>\n = | readonly T[]\n | Promise<readonly T[]>\n | AsyncIterable<DataBatch<T>>;\n\n/**\n * A data provider callable.\n *\n * @typeParam TQuery - The input that scopes the request (e.g. `string` for\n * autocomplete, `{ node, depth }` for a tree branch, `void` for a plain list).\n * @typeParam TItem - The item type produced.\n *\n * The AbortSignal is cancelled when the consumer supersedes the request (e.g.\n * a new query arrives before the previous one completes). Streaming providers\n * should check `signal.aborted` between yields or pass the signal to their\n * underlying fetch calls.\n */\nexport type IDataProvider<TQuery, TItem> = (\n query: TQuery,\n signal: AbortSignal,\n) => DataProviderResult<TItem>;\n\n/**\n * Collects all items from any DataProviderResult into a flat array.\n * Useful for components that need a complete list before rendering (e.g. tree branches).\n * Respects the AbortSignal — stops accumulating if cancelled mid-stream.\n */\nexport async function collectDataResult<T>(\n result: DataProviderResult<T>,\n signal: AbortSignal,\n): Promise<readonly T[]> {\n if (Array.isArray(result))\n return result as T[];\n if (Symbol.asyncIterator in new Object(result)) {\n const items: T[] = [];\n for await (const batch of result as AsyncIterable<DataBatch<T>>) {\n if (signal.aborted)\n return items;\n if (batch.replace)\n items.length = 0;\n items.push(...(batch.items as T[]));\n }\n return items;\n }\n return result as Promise<readonly T[]>;\n}\n"],"mappings":";;;;;;AAkEA,eAAsB,kBACpB,QACA,QACuB;CACvB,IAAI,MAAM,QAAQ,MAAM,GACtB,OAAO;CACT,IAAI,OAAO,iBAAiB,IAAI,OAAO,MAAM,GAAG;EAC9C,MAAM,QAAa,CAAC;EACpB,WAAW,MAAM,SAAS,QAAuC;GAC/D,IAAI,OAAO,SACT,OAAO;GACT,IAAI,MAAM,SACR,MAAM,SAAS;GACjB,MAAM,KAAK,GAAI,MAAM,KAAa;EACpC;EACA,OAAO;CACT;CACA,OAAO;AACT"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"data-provider-BAn_-oR1.d.ts","names":[],"sources":["../src/common/data-provider.ts"],"mappings":";;;;;;;;;;;;;KAaY,UAAU;;WAEX,gBAAgB;;;;;;EAMzB;;;;;;;EAOA;;;;;;;;;;KAWU,mBAAmB,cAChB,MACT,iBAAiB,OACjB,cAAc,UAAU;;;;;;;;;;;;;KAclB,cAAc,QAAQ,UAChC,OAAO,QACP,QAAQ,gBACL,mBAAmB;;;;;;iBAOF,kBAAkB,GACtC,QAAQ,mBAAmB,IAC3B,QAAQ,cACP,iBAAiB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"decorate-VRK8rslU.js","names":[],"sources":["../src/util/custom-elements.ts"],"sourcesContent":["type CustomElementCtor = CustomElementConstructor;\n\nfunction getRegistry(): CustomElementRegistry | undefined {\n if (typeof customElements === `undefined`)\n return undefined;\n return customElements;\n}\n\nexport function safeDefine(name: string, ctor: CustomElementCtor): void {\n const registry = getRegistry();\n if (!registry)\n return;\n const existing = registry.get(name);\n if (existing === undefined) {\n registry.define(name, ctor);\n }\n}\n\nexport function safeCustomElement(name: string) {\n return (ctor: CustomElementCtor): void => {\n safeDefine(name, ctor);\n };\n}\n"],"mappings":";AAEA,SAAS,cAAiD;CACxD,IAAI,OAAO,mBAAmB,aAC5B,OAAO,KAAA;CACT,OAAO;AACT;AAEA,SAAgB,WAAW,MAAc,MAA+B;CACtE,MAAM,WAAW,YAAY;CAC7B,IAAI,CAAC,UACH;CAEF,IADiB,SAAS,IAAI,IACnB,MAAM,KAAA,GACf,SAAS,OAAO,MAAM,IAAI;AAE9B;AAEA,SAAgB,kBAAkB,MAAc;CAC9C,QAAQ,SAAkC;EACxC,WAAW,MAAM,IAAI;CACvB;AACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"defaults-B4ePs4LB.js","names":[],"sources":["../src/icons/defaults.ts"],"sourcesContent":["import { registerIcon } from './registry.js';\n\n// All shapes below are Lucide icons (https://lucide.dev/icons/) — stroke-based,\n// viewBox 0 0 24 24, stroke-width 2, round linecap/linejoin, fill=\"none\" so\n// color comes entirely from `currentColor`.\n\n/** Chevron pointing down (Lucide `chevron-down`). Used for split-button dropdown toggle. */\nexport const ICON_CHEVRON_DOWN = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"m6 9 6 6 6-6\"/></svg>`;\n\n/**\n * Chevron pointing right (Lucide `chevron-right`). Used for tree-basic expand\n * indicator as a CSS mask — shape only, color comes from background-color.\n */\nexport const ICON_CARET_RIGHT = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"black\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"m9 18 6-6-6-6\"/></svg>`;\n\n/** Checkmark (Lucide `check`). Useful for menu-check-item or confirmation states. */\nexport const ICON_CHECK = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M20 6 9 17l-5-5\"/></svg>`;\n\n/** Close / X icon (Lucide `x`). Useful for dialogs, notifications, dismissible elements. */\nexport const ICON_CLOSE = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M18 6 6 18\"/><path d=\"m6 6 12 12\"/></svg>`;\n\n/** Plus / add icon (Lucide `plus`). Pairs with `close` for add/remove actions. */\nexport const ICON_ADD = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M5 12h14\"/><path d=\"M12 5v14\"/></svg>`;\n\n/** Error icon (Lucide `circle-alert`). Useful for error notifications. */\nexport const ICON_ERROR = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"12\" x2=\"12\" y1=\"8\" y2=\"12\"/><line x1=\"12\" x2=\"12.01\" y1=\"16\" y2=\"16\"/></svg>`;\n\n/** Info icon (Lucide `info`). Useful for info notifications. */\nexport const ICON_INFO = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"M12 16v-4\"/><path d=\"M12 8h.01\"/></svg>`;\n\n/** Warning icon (Lucide `triangle-alert`). Useful for warning notifications. */\nexport const ICON_WARNING = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"m21.73 18-8-14a2 2 0 0 0-3.46 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z\"/><path d=\"M12 9v4\"/><path d=\"M12 17h.01\"/></svg>`;\n\n/** Chevron pointing right (Lucide `chevron-right`). Used for split-button switcher toggle. */\nexport const ICON_CHEVRON_RIGHT = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"m9 18 6-6-6-6\"/></svg>`;\n\n/** Folder with up arrow (Lucide `folder-up`). Angled line style for navigating up one level. */\nexport const ICON_FOLDER_UP = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M2 9V5c0-1.1.9-2 2-2h3.93a2 2 0 0 1 1.66.9l.82 1.2a2 2 0 0 0 1.66.9H20a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2v-1\"/><path d=\"M12 10v6\"/><path d=\"m9 13 3-3 3 3\"/></svg>`;\n\n/** Folder (Lucide `folder`). Useful for file explorers and sidebars. */\nexport const ICON_FOLDER = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z\"/></svg>`;\n\n/** Document / file page (Lucide `file`). Useful for file lists and document tabs. */\nexport const ICON_FILE = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\"/><path d=\"M14 2v4a2 2 0 0 0 2 2h4\"/></svg>`;\n\n/** Magnifying glass (Lucide `search`). Useful for search panels and inputs. */\nexport const ICON_SEARCH = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"11\" cy=\"11\" r=\"8\"/><path d=\"m21 21-4.3-4.3\"/></svg>`;\n\n/** Chevron pointing up (Lucide `chevron-up`). Sort/collapse direction indicators. */\nexport const ICON_CHEVRON_UP = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"m18 15-6-6-6 6\"/></svg>`;\n\n/** Chevron pointing left (Lucide `chevron-left`). Previous/back affordances. */\nexport const ICON_CHEVRON_LEFT = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"m15 18-6-6 6-6\"/></svg>`;\n\n/** Vertical ellipsis (Lucide `ellipsis-vertical`). Default glyph for an unlabelled menu trigger. */\nexport const ICON_ELLIPSIS_VERTICAL = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"1\"/><circle cx=\"12\" cy=\"5\" r=\"1\"/><circle cx=\"12\" cy=\"19\" r=\"1\"/></svg>`;\n\n/** Horizontal ellipsis (Lucide `ellipsis`). Three dots in a horizontal row. */\nexport const ICON_ELLIPSIS = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"1\"/><circle cx=\"5\" cy=\"12\" r=\"1\"/><circle cx=\"19\" cy=\"12\" r=\"1\"/></svg>`;\n\nexport function registerDefaults(): void {\n registerIcon(`chevron-down`, ICON_CHEVRON_DOWN);\n registerIcon(`chevron-right`, ICON_CHEVRON_RIGHT);\n registerIcon(`caret-right`, ICON_CARET_RIGHT);\n registerIcon(`check`, ICON_CHECK);\n registerIcon(`close`, ICON_CLOSE);\n registerIcon(`file`, ICON_FILE);\n registerIcon(`folder`, ICON_FOLDER);\n registerIcon(`search`, ICON_SEARCH);\n registerIcon(`add`, ICON_ADD);\n registerIcon(`error`, ICON_ERROR);\n registerIcon(`folder-up`, ICON_FOLDER_UP);\n registerIcon(`info`, ICON_INFO);\n registerIcon(`warning`, ICON_WARNING);\n registerIcon(`chevron-up`, ICON_CHEVRON_UP);\n registerIcon(`chevron-left`, ICON_CHEVRON_LEFT);\n registerIcon(`ellipsis-vertical`, ICON_ELLIPSIS_VERTICAL);\n registerIcon(`ellipsis`, ICON_ELLIPSIS);\n}\n"],"mappings":";;;AAOA,MAAa,oBAAoB;;;;;AAMjC,MAAa,mBAAmB;;AAGhC,MAAa,aAAa;;AAG1B,MAAa,aAAa;;AAG1B,MAAa,WAAW;;AAGxB,MAAa,aAAa;;AAG1B,MAAa,YAAY;;AAGzB,MAAa,eAAe;;AAG5B,MAAa,qBAAqB;;AAGlC,MAAa,iBAAiB;;AAG9B,MAAa,cAAc;;AAG3B,MAAa,YAAY;;AAGzB,MAAa,cAAc;;AAG3B,MAAa,kBAAkB;;AAG/B,MAAa,oBAAoB;;AAGjC,MAAa,yBAAyB;;AAGtC,MAAa,gBAAgB;AAE7B,SAAgB,mBAAyB;CACvC,aAAa,gBAAgB,iBAAiB;CAC9C,aAAa,iBAAiB,kBAAkB;CAChD,aAAa,eAAe,gBAAgB;CAC5C,aAAa,SAAS,UAAU;CAChC,aAAa,SAAS,UAAU;CAChC,aAAa,QAAQ,SAAS;CAC9B,aAAa,UAAU,WAAW;CAClC,aAAa,UAAU,WAAW;CAClC,aAAa,OAAO,QAAQ;CAC5B,aAAa,SAAS,UAAU;CAChC,aAAa,aAAa,cAAc;CACxC,aAAa,QAAQ,SAAS;CAC9B,aAAa,WAAW,YAAY;CACpC,aAAa,cAAc,eAAe;CAC1C,aAAa,gBAAgB,iBAAiB;CAC9C,aAAa,qBAAqB,sBAAsB;CACxD,aAAa,YAAY,aAAa;AACxC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"detail-list-C1xzr1z7.d.ts","names":[],"sources":["../src/detail-list/types.ts","../src/detail-list/detail-list.ts"],"mappings":";;;;;;;;;;;;;KACY;;KAGA;WACD,SAAS;WACT;WACA;;;KAIC,wBAAwB,GAAG,gBAAgB,GAAG;;KAG9C,mBAAmB,eAAe,2BAA2B;;;;;;KAc7D,2BAA2B,eAAe,IAAI;;;;;;;;;;;;;;;;;;;;cCkI7C,0BAA0B;;EAErC,eAAe;EAGf,iBAAiB;EAGjB,MAAM;EAGN;EAGA,gBAAgB;EAGhB;EAGA,UAAU;EAGV;EAGA,WAAW;EAGX;;;;;EAOA;;;;;EAOA;;;;;;EAQA;EAGA;EAGA,mBAAmB,IAAI;;;;;;EAQvB;;EAIA,oBAAoB,gCAAgC;;;;;;EAQpD;;;;;;EAQA;;;;;EAOA,qBAAqB,wBAAwB;EAG7C,mBAAmB,8BAA8B;;;;;;;EASjD,SAAS;;EAIT,YAAY;;;;;EAOZ;UAEiB;UAGT;mBAiCS;UAqBT;UAyFA;;WAoGC,QAAM,qBAAA;;MAYX,YAAY;EAoBP;EAkEA;EA+BA;YASU,WAAW,SAAS;EAS9B,QAAQ,SAAS;;MA+DtB,gBAAgB;;MAKhB,iBAAiB,YAAY;;;;;;EASjC;EAIA,QAAQ,MAAM,kBAAkB,UAAU;;;;;EAwB1C,WAAW,MAAM,UAAU;;EAY3B,YAAY,OAAO,SAAS,WAAW;EAIvC;;;;;EAcA,SAAS,gBAAgB;;;;;EAiBzB,YAAY,MAAM;;;;;;;;;;EAalB;;;;;;EAsBA,SAAS,WAAW,WAAW,OAAO;EAItC,OAAO,MAAM;EAIb,WAAW,OAAO,SAAS;EAI3B,SAAS,MAAM;EAIf;EAIA;;MAQI,gBAAgB;;MAKhB;;EAMJ,WAAW,MAAM;;EAKjB,gBAAgB,MAAM;;EAKtB,mBAAmB,MAAM;;EAKzB,SAAS;EAgBP,eAAe,0CAA0C,UAAU;;MA8VjE,mBAAmB;;EAKvB,kBAAkB,kBAAkB;EAYpC,YAAY;EAIZ;EAKA;UAwRQ;;;;;;;;;EAoBF,kBAAkB;UAwBhB;;UAOA;UA2DA;UAiBA;;;;;;;UA2DA;;UAoBA;UAcA;UAYA;UAQA;UA6DA;UAMA;;UAKA;UAIA;UA+EA;UAiBA;UAMA;UAUA;SAUQ,sBAAM;EAyKb,wBAAM;;QAsBT;YACI;IACR,oBAAoB;;YAGZ,4BAA4B;;UAGvB,kCAAkC,qBAAqB;EACtE,+BAA+B;EAC/B,0BAA0B,yBAAyB"}
|
package/dist/detail-list.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"detail-list.js","names":["#groupIndex","#dragSelect","#nativeDrag","#blankItemPressPending","#prepareNativeDrag","#nativeDragging","#startPostDragSuppressTimer","#marqueeHitTest","#marqueeRect","#findGroupHeader","#isBlankItemPress","#viewportScrollRaf","#emitViewportChangeIfChanged","#navigateDown","#navigateUp","#navigateRight","#navigateLeft","#navigateTo","#findFirstCheckable","#findLastCheckable","#postDragSuppressTimer","#data","#itemData","#searchRegistry","#effectiveSearchModes","#unregisterSearchCommands","#clearBlankItemPress","#resizeObserver","#scheduleGeometry","#mutationObserver","#processChildren","#animateChildMutations","#scheduleGroups","#animatedItems","#syncSearchCommands","#sortRaf","#groupObserver","#applyFilterPredicate","#recomputeGeometry","#groupByChanged","#builtFromProvider","#providerBuilt","#rebuildFromObjects","#syncFromProvider","#applySort","#ensureIcon","#headerEls","#itemForKey","#createItemEl","#propertyValue","#colorValue","#ensureBadge","#groupingActive","#sortRows","#groupsScheduled","#wasGrouped","#syncGroups","#groupValue","#seq","#seqNext","#groupKeyOf","#isItemVisible","#headerFor","#groupList","#syncGroupObserver","#geometryScheduled","#grid","#positions","#tops","#scheduleViewportChangeEmit","#gridSize","#itemAt","#positionOf","#findNextCheckable","#horizontalTarget","#renderedKeys","#lastViewportRenderedKeys","#lastViewportVisibleKeys","#onListScroll","#marqueeStyle","customElement"],"sources":["../src/detail-list/detail-list.ts"],"sourcesContent":["import type { CommandId, CommandRegistry } from '@clinth/ui-commands';\nimport type { PropertyValues } from 'lit';\nimport type { IDataProvider } from '../common/data-provider.js';\nimport type { ListSearchMode } from '../incr-search/index.js';\nimport type { ListGroupChangeDetail, ListGroupEventMap, ListGroupInfo, ListGroupLabel, ListGroupToggleDetail } from '../interaction/grouping.js';\nimport type { DragSelectRect } from '../interaction/list-drag-select-controller.js';\nimport type {\n ListDragEntry,\n ListDragPreviewRenderer,\n ListDragPreviewSourceResolver,\n ListNativeDragStartEvent,\n} from '../interaction/list-drag-types.js';\nimport type {\n ListActivateDetail,\n ListElementEventMap,\n ListInteractionMode,\n ListItemClickDetail,\n ListSelectDetail,\n ListSelectionMode,\n ListTickleDetail,\n} from '../interaction/list-selection-types.js';\nimport type { ListViewportChangeDetail, ListViewportChangeEvent } from '../interaction/list-viewport-types.js';\nimport type {\n AddItemOptions,\n CustomCheckboxOptions,\n DetailFormatter,\n DetailGroupBy,\n DetailSortComparator,\n DetailSortItem,\n DetailSortMode,\n} from './types.js';\nimport { createCommandRegistry } from '@clinth/ui-commands';\nimport { css, html, LitElement, nothing, render } from 'lit';\nimport { property, query, state } from 'lit/decorators.js';\nimport { DataController } from '../common/data-controller.js';\nimport { appearanceAbsent, appearanceColor } from '../common/item-appearance.js';\nimport {\n createElementListSearchAdapter,\n LIST_SEARCH_MODES,\n ListSearchController,\n listSearchStyles,\n registerListSearchCommands,\n} from '../incr-search/index.js';\nimport { partitionByGroup, toGroupKey } from '../interaction/grouping.js';\nimport { keyForElement } from '../interaction/keyed-list.js';\nimport { ListDragSelectController } from '../interaction/list-drag-select-controller.js';\nimport { animateListItemIn, animateListItemOut, LIST_ITEM_MOTION_MS } from '../interaction/list-item-animation.js';\nimport { ListNativeDragController } from '../interaction/list-native-drag-controller.js';\nimport { ListSelectionController } from '../interaction/list-selection-controller.js';\nimport { TickledController } from '../interaction/tickled-controller.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { scrollFadeStyles } from '../styles/scroll-fade.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport '../icons/icon.js';\nimport '../list-group-header/list-group-header.js';\n\nexport type {\n ListGroupBy,\n ListGroupChangeDetail,\n ListGroupChangeEvent,\n ListGroupInfo,\n ListGroupLabel,\n ListGroupToggleDetail,\n ListGroupToggleEvent,\n} from '../interaction/grouping.js';\nexport type {\n ListDragEntry,\n ListDragPreview,\n ListDragPreviewContext,\n ListDragPreviewRenderer,\n ListDragSource,\n ListNativeDragStartDetail,\n ListNativeDragStartEvent,\n} from '../interaction/list-drag-types.js';\nexport type { ListViewportChangeDetail, ListViewportChangeEvent } from '../interaction/list-viewport-types.js';\nexport type {\n AddItemOptions,\n CustomCheckboxOptions,\n DetailFormatter,\n DetailGroupBy,\n DetailSortComparator,\n DetailSortItem,\n DetailSortMode,\n} from './types.js';\n\nconst ITEM_SELECTOR = `:scope > li`;\nconst GROUP_HEADER_ATTR = `data-ixfx-group-header`;\nconst GROUP_COLLAPSED_ATTR = `data-group-collapsed`;\nconst SEARCH_HIGHLIGHT_KEY = `detail-list-search`;\nconst NAV_KEYS = new Set([`ArrowDown`, `ArrowUp`, `ArrowLeft`, `ArrowRight`, `Home`, `End`]);\nconst LABEL_SPAN_CSS = `overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0`;\n\n/**\n * Layout for the per-item badge wrapper `#ensureBadge` adds. Applied as inline\n * `cssText` rather than shadow CSS because `::slotted()` only matches the\n * host's *direct* children — the badge lives inside a slotted `<li>`, so a\n * `::slotted()` rule could never reach it. The values still read the CSS\n * custom property, so it stays themeable from the outside.\n */\nconst BADGE_EL_CSS = `flex-shrink:0;display:inline-flex;align-items:center;margin-inline-start:auto;padding-inline-start:var(--detail-list-badge-gap,8px)`;\n\nfunction pointInRect(x: number, y: number, rect: DOMRect | DOMRectReadOnly): boolean {\n return rect.width > 0 && rect.height > 0\n && x >= rect.left && x < rect.right && y >= rect.top && y < rect.bottom;\n}\n\n/** Hit-test the painted content, not a layout wrapper that may fill the row. */\nfunction contentAtPoint(node: Node, x: number, y: number): boolean {\n if (node instanceof Text) {\n if (!node.textContent?.trim())\n return false;\n const range = document.createRange();\n range.selectNodeContents(node);\n return Array.from(range.getClientRects()).some(rect => pointInRect(x, y, rect));\n }\n if (!(node instanceof Element))\n return false;\n if (node.hasAttribute(`data-drag-select-blank`))\n return false;\n if (node.hasAttribute(`data-drag-select-content`))\n return pointInRect(x, y, node.getBoundingClientRect());\n if (Array.from(node.childNodes).some(child => contentAtPoint(child, x, y)))\n return true;\n // A leaf can be an image, icon, canvas, or consumer-defined custom element.\n return node.childNodes.length === 0 && pointInRect(x, y, node.getBoundingClientRect());\n}\n\n/** Shallow key-array equality, treating `undefined` (never dispatched) as different. */\nfunction sameKeys(a: readonly string[] | undefined, b: readonly string[]): boolean {\n if (a === undefined || a.length !== b.length)\n return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i])\n return false;\n }\n return true;\n}\n\ntype GridPosition = { readonly col: number; readonly row: number };\n\n/**\n * A list that scales horizontally, not vertically.\n *\n * Items are laid out in equal-width columns; they flow top→bottom down a\n * column, then wrap to the top of the next column to the right. The\n * component has a fixed vertical extent and scrolls horizontally.\n *\n * Selection semantics match `ixfx-vertical-list` — same modes, same\n * `list-*` events, same keyboard gestures — but navigation is a 2-D grid\n * (Up/Down move within a column, Left/Right jump columns).\n *\n * Items come from any of three sources (later writes win):\n * 1. declarative `<li>` children in light DOM,\n * 2. `addItem()` / `setItems()`,\n * 3. an `items` array of objects rendered via `displayProperty` /\n * `formatter`, optionally streamed in via a `provider`.\n */\n@customElement(`ixfx-detail-list`)\nexport class DetailListElement extends LitElement {\n @property({ type: String, attribute: `selection-mode` })\n selectionMode: ListSelectionMode = `single`;\n\n @property({ type: String, attribute: `interaction-mode` })\n interactionMode: ListInteractionMode = `standard`;\n\n @property({ type: String })\n sort: DetailSortMode = `none`;\n\n @property({ type: String, attribute: `sort-by` })\n sortBy = ``;\n\n @property({ attribute: false })\n sortComparator: DetailSortComparator | undefined;\n\n @property({ attribute: false })\n items: readonly unknown[] = [];\n\n @property({ attribute: false })\n provider: IDataProvider<void, unknown> | undefined;\n\n @property({ type: String, attribute: `display-property` })\n displayProperty = ``;\n\n @property({ attribute: false })\n formatter: DetailFormatter | undefined;\n\n @property({ type: String, attribute: `icon-property` })\n iconProperty = ``;\n\n /**\n * Property on each `items` entry holding a CSS colour for the item's\n * `<ixfx-icon>`. Only read when `iconProperty` also resolves an icon.\n */\n @property({ type: String, attribute: `icon-color-property` })\n iconColorProperty = ``;\n\n /**\n * Property on each `items` entry holding a CSS colour for the item's caption\n * text. Inline, so it wins over the selected/tickled text colours.\n */\n @property({ type: String, attribute: `text-color-property` })\n textColorProperty = ``;\n\n /**\n * Property on each `items` entry holding a Finder-style badge — a\n * `TemplateResult`, a DOM `Node`, or anything Lit can render. Rendered\n * right-justified on the row, after the caption.\n */\n @property({ type: String, attribute: `badge-property` })\n badgeProperty = ``;\n\n @property({ type: String, attribute: `key-property` })\n keyProperty = ``;\n\n @property({ attribute: false })\n filterPredicate: ((el: Element) => boolean) | undefined;\n\n /**\n * Whether keyboard navigation wraps from last to first and vice versa.\n * - 'stop' (default): navigation stops at the boundary\n * - 'wrap': navigation wraps around\n */\n @property({ type: String, attribute: `item-wrap` })\n itemWrap: `stop` | `wrap` = `stop`;\n\n /** Optional renderer for the checkbox shown in `checked` interactionMode. */\n @property({ attribute: false })\n checkboxRenderer: ((checked: boolean) => unknown) | CustomCheckboxOptions | 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 /**\n * Enable native browser drag-and-drop for selectable items. When true,\n * selectable rows become draggable and the list emits\n * `list-native-drag-start` when a drag begins.\n */\n @property({ type: Boolean, attribute: `items-draggable`, reflect: true })\n itemsDraggable = false;\n\n /**\n * Custom drag preview renderer (synchronous). Defaults to the shared\n * built-in HTML+canvas preview.\n */\n @property({ attribute: false })\n dragPreviewRenderer: ListDragPreviewRenderer<Element> | undefined;\n\n @property({ attribute: false })\n dragPreviewSource: ListDragPreviewSourceResolver<Element> | undefined;\n\n /**\n * Group rows under collapsible headers that flow inline in the columns. A\n * string names an item property (object items) or a `data-<name>` attribute;\n * a function derives the key from `(data, element)`. `null` = ungrouped.\n * Groups appear in first-encounter order (after sorting and filtering).\n */\n @property({ attribute: `group-by` })\n groupBy: DetailGroupBy | null = null;\n\n /** Header label for a group. Defaults to the key (`(none)` for the empty key). */\n @property({ attribute: false })\n groupLabel: ListGroupLabel | undefined;\n\n /**\n * Let selection span groups. When `false` (default) selecting in one group\n * clears the others and Shift-range / select-all stay inside one group.\n */\n @property({ type: Boolean, attribute: `cross-group-selection`, reflect: true })\n crossGroupSelection = false;\n\n @state() private _collapsedGroups: ReadonlySet<string> = new Set();\n\n @query(`ul`)\n private _listEl!: HTMLUListElement;\n\n #itemData = new WeakMap<HTMLLIElement, unknown>();\n #grid: Element[][] = [];\n #positions = new Map<Element, GridPosition>();\n /** Viewport-relative `top` per item at the last geometry pass — lines rows up across columns. */\n #tops = new Map<Element, number>();\n #geometryScheduled = false;\n #sortRaf = 0;\n #viewportScrollRaf = 0;\n /** Key sets as of the last viewport-change dispatch, for dedupe. */\n #lastViewportRenderedKeys: readonly string[] | undefined;\n #lastViewportVisibleKeys: readonly string[] | undefined;\n #resizeObserver: ResizeObserver | undefined;\n #mutationObserver: MutationObserver | undefined;\n /** Items that have already played (or been skipped for) their enter animation. */\n #animatedItems = new WeakSet<Element>();\n #builtFromProvider: readonly unknown[] = [];\n /** Element → group key, for the selection controller. Empty while ungrouped. */\n #groupIndex = new Map<Element, string>();\n #groupList: readonly ListGroupInfo[] = [];\n #headerEls = new Map<string, HTMLElement>();\n /** Insertion sequence per item, so regrouping starts from the original order. */\n #seq = new WeakMap<Element, number>();\n #seqNext = 0;\n #wasGrouped = false;\n #groupsScheduled = false;\n #groupByChanged = false;\n #groupObserver: MutationObserver | undefined;\n #providerBuilt = 0;\n\n readonly #data = new DataController<void, unknown>(this);\n\n private readonly selection: ListSelectionController<Element> = new ListSelectionController<Element>({\n getOrderedItems: () => this._getVisibleItems(),\n isSelectable: el => this._isCheckable(el),\n getModes: () => ({ selectionMode: this.selectionMode, interactionMode: this.interactionMode }),\n getKey: keyForElement,\n getGroupKey: el => this.#groupIndex.get(el) ?? null,\n crossGroupSelection: () => this.crossGroupSelection,\n getFallbackGroupKey: (): string | null => {\n const t = this.tickled.tickledId;\n return t ? this.#groupIndex.get(t) ?? null : null;\n },\n onChange: (selected, previous) => {\n this._syncItemStates();\n this._dispatch<ListSelectDetail>(`list-select`, {\n selected,\n previous,\n selectedKeys: this.selection.selectedKeys,\n });\n },\n });\n\n private tickled: TickledController<Element> = new TickledController<Element>(this, {\n getItems: () => this._getVisibleItems().map(el => ({\n id: el,\n enabled: !el.hasAttribute(`not-checked`),\n })),\n onTickle: (id) => {\n if (id !== undefined) {\n this._dispatch<ListTickleDetail>(`list-tickle`, { item: id });\n }\n },\n onStateChange: () => this._syncItemStates(),\n itemWrap: this.itemWrap,\n hoverDisabled: () => this.#dragSelect.isDragging || this.#nativeDrag.isDragging,\n });\n\n #nativeDragging = false;\n #postDragSuppressTimer = 0;\n #blankItemPressPending = false;\n\n #clearBlankItemPress = (): void => {\n this.#blankItemPressPending = false;\n };\n\n readonly #nativeDrag = new ListNativeDragController<Element>(this, {\n source: `detail-list`,\n isEnabled: () => this.itemsDraggable && this.selectionMode !== `none` && this._getVisibleItems().length > 0,\n resolveEventToKey: (target) => {\n if (!(target instanceof Element))\n return undefined;\n const li = target.closest?.(`li`) as HTMLElement | null;\n if (!li || !this.contains(li))\n return undefined;\n return keyForElement(li);\n },\n prepareSelection: originKey => this.#prepareNativeDrag(originKey),\n getMetrics: () => ({}),\n getRenderer: () => this.dragPreviewRenderer,\n getDragPreviewSourceResolver: () => this.dragPreviewSource,\n dispatch: detail => this._dispatchCancelable(`list-native-drag-start`, detail),\n onActiveChange: (active, originKey) => {\n this.#nativeDragging = active;\n this.toggleAttribute(`data-native-dragging`, active);\n for (const el of this.querySelectorAll(`li`))\n el.toggleAttribute(`data-drag-origin`, active && originKey !== undefined && keyForElement(el) === originKey);\n if (active) {\n const count = this.selection.selected.size;\n this.setAttribute(`aria-label`, count <= 1 ? `Dragging 1 item` : `Dragging ${count} items`);\n } else {\n this.removeAttribute(`aria-label`);\n }\n this.requestUpdate();\n },\n onEnd: () => {\n this.#nativeDragging = false;\n this.toggleAttribute(`data-native-dragging`, false);\n this.removeAttribute(`aria-label`);\n for (const el of this.querySelectorAll(`li`))\n el.removeAttribute(`data-drag-origin`);\n this.#startPostDragSuppressTimer();\n },\n syncLightDomDraggable: () => this._syncNativeDraggable(),\n shouldStart: () => !this.#blankItemPressPending,\n });\n\n #prepareNativeDrag(originKey: string): { origin: ListDragEntry<Element>; selected: Array<ListDragEntry<Element>> } | undefined {\n const visible = this._getVisibleItems();\n const originEl = visible.find(el => keyForElement(el) === originKey);\n if (!originEl || !this._isCheckable(originEl))\n return undefined;\n if (!this.selection.selected.has(originEl))\n this.selection.replace(originEl);\n const selected: Array<ListDragEntry<Element>> = [];\n visible.forEach((el, index) => {\n if (!this.selection.selected.has(el))\n return;\n const key = keyForElement(el) ?? originKey;\n selected.push({\n key,\n index,\n item: (this.#itemData.get(el as HTMLLIElement) ?? el) as Element,\n element: el,\n });\n });\n const origin = selected.find(entry => entry.key === originKey);\n if (!origin)\n return undefined;\n return { origin, selected };\n }\n\n private _syncNativeDraggable(): void {\n if (!this.isConnected)\n return;\n for (const el of this.querySelectorAll(`li`)) {\n if (el instanceof HTMLElement)\n el.draggable = this.itemsDraggable && this._isCheckable(el);\n }\n }\n\n #startPostDragSuppressTimer(): void {\n if (this.#postDragSuppressTimer)\n clearTimeout(this.#postDragSuppressTimer);\n this.#postDragSuppressTimer = window.setTimeout(() => {\n this.#postDragSuppressTimer = 0;\n }, 0);\n }\n\n /** Live drag-select preview rect (surface-relative); the covered items carry `data-marquee`. */\n #marqueeRect: DragSelectRect | undefined;\n\n readonly #dragSelect = new ListDragSelectController<Element>(this, {\n getSurface: () => this.renderRoot.querySelector(`.container`) as HTMLElement | undefined,\n isEnabled: () =>\n this.selection.canDragSelect()\n && this._getVisibleItems().length > 0\n && !this.hasAttribute(`disable-drag-select`),\n hitTest: rect => this.#marqueeHitTest(rect),\n getBaseSelection: () => this.selection.selected,\n onPreview: (preview, rect) => {\n this.#marqueeRect = rect;\n for (const el of this._getVisibleItems())\n el.toggleAttribute(`data-marquee`, preview.has(el));\n this.requestUpdate();\n },\n onCommit: (finalSet) => {\n this.selection.applyDragSelection(finalSet);\n for (const el of this._getVisibleItems())\n el.removeAttribute(`data-marquee`);\n this.#marqueeRect = undefined;\n this.requestUpdate();\n },\n autoScroll: (dx, _dy) => {\n if (this._listEl)\n this._listEl.scrollLeft += dx;\n },\n shouldStart: (event) => {\n if (this.#findGroupHeader(event.composedPath()))\n return false;\n this.#blankItemPressPending = this.itemsDraggable && this.#isBlankItemPress(event);\n return !this.itemsDraggable || this.#blankItemPressPending;\n },\n });\n\n /** A row's padding/empty area may start marquee; its actual content may drag out. */\n #isBlankItemPress(event: PointerEvent): boolean {\n const path = event.composedPath();\n const item = this._findListItem(path);\n if (!item)\n return false;\n for (const node of path) {\n if (node === item)\n break;\n if (node instanceof Element) {\n if (node.matches(`input, button, a, select, textarea, [contenteditable], .ixfx-list-checkbox, [role=\"checkbox\"]`))\n return false;\n if (node.hasAttribute(`data-drag-select-blank`))\n return true;\n if (node.hasAttribute(`data-drag-select-content`))\n return false;\n }\n }\n return !Array.from(item.childNodes).some(node => contentAtPoint(node, event.clientX, event.clientY));\n }\n\n /** Collect visible items whose surface-relative box intersects `rect`. */\n #marqueeHitTest(rect: DragSelectRect): Element[] {\n const surface = this.renderRoot.querySelector(`.container`);\n if (!surface)\n return [];\n const box = surface.getBoundingClientRect();\n const rx0 = rect.x;\n const ry0 = rect.y;\n const rx1 = rect.x + rect.width;\n const ry1 = rect.y + rect.height;\n const out: Element[] = [];\n for (const el of this._getVisibleItems()) {\n const r = el.getBoundingClientRect();\n const left = r.left - box.left;\n const top = r.top - box.top;\n if (left <= rx1 && left + r.width >= rx0 && top <= ry1 && top + r.height >= ry0)\n out.push(el);\n }\n return out;\n }\n\n #marqueeStyle(rect: DragSelectRect): string {\n return `left:${rect.x}px;top:${rect.y}px;width:${Math.max(0, rect.width)}px;height:${Math.max(0, rect.height)}px`;\n }\n\n /** Incremental search (navigate / select / filter). See `docs/infra-incremental.md`. */\n readonly search = new ListSearchController<Element>(this, {\n adapter: createElementListSearchAdapter(this, {\n itemSelector: ITEM_SELECTOR,\n getLabel: el => el.getAttribute(`data-search-label`) ?? el.textContent?.trim() ?? ``,\n highlightKey: SEARCH_HIGHLIGHT_KEY,\n }),\n });\n\n #searchRegistry: CommandRegistry<unknown> | undefined;\n #unregisterSearchCommands: (() => void) | undefined;\n\n /** Command registry carrying this list'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 override connectedCallback(): void {\n super.connectedCallback();\n if (!this.hasAttribute(`tabindex`))\n this.tabIndex = 0;\n this.addEventListener(`pointerover`, this._onPointerOver);\n this.addEventListener(`pointerleave`, this._onPointerLeave);\n this.addEventListener(`keydown`, this._onKeyDown);\n this.addEventListener(`pointermove`, this._endKeyboardNav);\n this.addEventListener(`pointerdown`, this._endKeyboardNav);\n this.addEventListener(`click`, this._onClick);\n this.addEventListener(`dblclick`, this._onDblClick);\n this.addEventListener(`wheel`, this._onWheel);\n window.addEventListener(`pointerup`, this.#clearBlankItemPress);\n window.addEventListener(`pointercancel`, this.#clearBlankItemPress);\n\n this.#resizeObserver = new ResizeObserver(() => this.#scheduleGeometry());\n this.#resizeObserver.observe(this);\n this.#mutationObserver = new MutationObserver((records) => {\n this.#processChildren();\n this.#animateChildMutations(records);\n this.#scheduleGeometry();\n this.#scheduleGroups();\n });\n this.#mutationObserver.observe(this, {\n childList: true,\n subtree: false,\n attributeFilter: [`hidden`],\n });\n for (const el of this.querySelectorAll(ITEM_SELECTOR))\n this.#animatedItems.add(el);\n this.#searchRegistry ??= createCommandRegistry();\n this.#syncSearchCommands();\n this.#scheduleGroups();\n }\n\n /**\n * Collapse-in items appended to the light DOM (however they got there). A bulk\n * populate is left alone. Geometry is re-read once the animations settle so\n * keyboard navigation lines back up with the final layout.\n */\n #animateChildMutations(records: MutationRecord[]): void {\n if (!this.isConnected)\n return;\n const fresh: HTMLElement[] = [];\n for (const record of records) {\n for (const node of record.addedNodes) {\n // ITEM_SELECTOR is `:scope > li`, which can't be used with `.matches()`\n // — every item here is a direct `<li>` child, so check that directly.\n if (!(node instanceof HTMLElement) || node.parentElement !== this || node.localName !== `li`)\n continue;\n if (this.#animatedItems.has(node))\n continue;\n this.#animatedItems.add(node);\n fresh.push(node);\n }\n }\n if (fresh.length === 0)\n return;\n const total = this.querySelectorAll(ITEM_SELECTOR).length;\n if (fresh.length >= total)\n return; // first populate / wholesale replace\n for (const el of fresh)\n animateListItemIn(el);\n window.setTimeout(() => this.#scheduleGeometry(), LIST_ITEM_MOTION_MS + 30);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener(`pointerover`, this._onPointerOver);\n this.removeEventListener(`pointerleave`, this._onPointerLeave);\n this.removeEventListener(`keydown`, this._onKeyDown);\n this.removeEventListener(`pointermove`, this._endKeyboardNav);\n this.removeEventListener(`pointerdown`, this._endKeyboardNav);\n this.removeEventListener(`click`, this._onClick);\n this.removeEventListener(`dblclick`, this._onDblClick);\n this.removeEventListener(`wheel`, this._onWheel);\n window.removeEventListener(`pointerup`, this.#clearBlankItemPress);\n window.removeEventListener(`pointercancel`, this.#clearBlankItemPress);\n this.#blankItemPressPending = false;\n cancelAnimationFrame(this.#sortRaf);\n cancelAnimationFrame(this.#viewportScrollRaf);\n this.#viewportScrollRaf = 0;\n this.#resizeObserver?.disconnect();\n this.#resizeObserver = undefined;\n this.#mutationObserver?.disconnect();\n this.#mutationObserver = undefined;\n this.#groupObserver?.disconnect();\n this.#groupObserver = undefined;\n this.#unregisterSearchCommands?.();\n this.#unregisterSearchCommands = undefined;\n this.#searchRegistry = undefined;\n if (this.#postDragSuppressTimer) {\n clearTimeout(this.#postDragSuppressTimer);\n this.#postDragSuppressTimer = 0;\n }\n }\n\n override firstUpdated(): void {\n this.#processChildren();\n if (this.filterPredicate) {\n this.#applyFilterPredicate();\n }\n this.#recomputeGeometry();\n this._syncNativeDraggable();\n }\n\n protected override willUpdate(changed: PropertyValues): void {\n super.willUpdate(changed);\n if (changed.has(`groupBy`) && this.hasUpdated) {\n if (this._collapsedGroups.size > 0)\n this._collapsedGroups = new Set();\n this.#groupByChanged = true;\n }\n }\n\n override updated(changed: PropertyValues): void {\n super.updated(changed);\n if (changed.has(`groupBy`) || changed.has(`groupLabel`) || (changed as Map<PropertyKey, unknown>).has(`_collapsedGroups`)) {\n this.#scheduleGroups();\n if (this.#groupByChanged) {\n this.#groupByChanged = false;\n this._dispatch<ListGroupChangeDetail>(`list-group-change`, { groupBy: this.groupBy as ListGroupChangeDetail[`groupBy`] });\n }\n }\n if (changed.has(`searchModes`)) {\n this.#syncSearchCommands();\n }\n if (changed.has(`provider`)) {\n this.#builtFromProvider = [];\n this.#providerBuilt = 0;\n this.#data.provider = this.provider;\n queueMicrotask(() => {\n if (this.provider)\n this.#data.request(undefined);\n });\n return;\n }\n // Every property that shapes how an object item is built has to rebuild\n // the rows — they are baked into the `<li>` at creation time.\n if (\n (changed.has(`items`)\n || changed.has(`displayProperty`)\n || changed.has(`formatter`)\n || changed.has(`iconProperty`)\n || changed.has(`iconColorProperty`)\n || changed.has(`textColorProperty`)\n || changed.has(`badgeProperty`)\n || changed.has(`keyProperty`))\n && this.provider === undefined\n && this.items.length > 0\n ) {\n this.#rebuildFromObjects(this.items);\n }\n this.#syncFromProvider();\n if (changed.has(`sort`) || changed.has(`sortBy`) || changed.has(`sortComparator`)) {\n this.#applySort();\n }\n if (changed.has(`filterPredicate`)) {\n this.#applyFilterPredicate();\n this.#scheduleGeometry();\n this.#scheduleGroups();\n }\n if (changed.has(`interactionMode`)) {\n this.selection.clearAnchor();\n this._syncItemStates();\n this._syncNativeDraggable();\n } else if (changed.has(`checkboxRenderer`) && this.interactionMode === `checked`) {\n this._syncCheckboxes();\n }\n if (changed.has(`itemsDraggable`)) {\n this._syncNativeDraggable();\n this.#nativeDrag.refreshDraggable();\n }\n }\n\n // --- Public API ---\n\n /** The most recently selected item, or `undefined` if nothing is selected. */\n get selectedItem(): Element | undefined {\n return [...this.selection.selected].at(-1);\n }\n\n /** The full current selection set (read-only). */\n get selectedItems(): ReadonlySet<Element> {\n return this.selection.selected;\n }\n\n /**\n * Force an immediate geometry recompute. Called automatically on resize,\n * DOM changes, sort/filter/search changes — only needed when layout is\n * changed by outside forces (e.g. an external font load).\n */\n refreshLayout(): void {\n this.#recomputeGeometry();\n }\n\n addItem(item: Element | string, options?: AddItemOptions): void {\n let el: Element;\n if (typeof item === `string`) {\n const li = document.createElement(`li`);\n this._setLabel(li, item);\n el = li;\n } else {\n el = item;\n }\n if (options?.notChecked)\n el.setAttribute(`not-checked`, ``);\n this.appendChild(el);\n this.#ensureIcon(el as HTMLLIElement);\n if (this.sort !== `none`)\n this.#applySort();\n if (this.interactionMode === `checked`)\n this._syncCheckboxes();\n this.#scheduleGroups();\n }\n\n /**\n * Collapse + fade `item` out, then detach it; the rows after it slide up to\n * close the gap. Resolves once removed. Immediate under reduced motion.\n */\n removeItem(item: Element): Promise<void> {\n this.selection.deselect(item);\n return animateListItemOut(item as HTMLElement).then(() => {\n item.remove();\n this.#scheduleGroups();\n if (this.interactionMode === `checked`)\n this._syncCheckboxes();\n this.#recomputeGeometry();\n });\n }\n\n /** {@link removeItem} for several items at once. */\n removeItems(items: Iterable<Element>): Promise<void> {\n return Promise.all([...items].map(item => this.removeItem(item))).then(() => undefined);\n }\n\n clearItems(): void {\n this.replaceChildren();\n this.#headerEls.clear();\n this.#scheduleGroups();\n this.selection.reset();\n this.#builtFromProvider = [];\n this.#providerBuilt = 0;\n this._syncItemStates();\n }\n\n /**\n * Replace the entire item list in one call.\n * Equivalent to `clearItems()` followed by `addItem()` for each element.\n */\n setItems(items: readonly Element[]): void {\n this.clearItems();\n for (const item of items) {\n this.appendChild(item);\n this.#ensureIcon(item as HTMLLIElement);\n }\n if (this.sort !== `none`)\n this.#applySort();\n if (this.interactionMode === `checked`)\n this._syncCheckboxes();\n this.#scheduleGroups();\n }\n\n /**\n * Get the source object behind an `<li>` built from an `items` array or\n * provider. Returns `undefined` for declarative / programmatic elements.\n */\n getItemData(item: HTMLLIElement): unknown {\n return this.#itemData.get(item);\n }\n\n /**\n * Keys of items currently intersecting the viewport — for prioritising\n * viewport-first work (e.g. metadata/thumbnail fetches). Items are laid\n * out as a fixed-height, horizontally-scrolling column grid, so this is a\n * horizontal intersection test against the scroll container; every row of\n * an intersecting column counts as visible. Hidden (filtered-out) and\n * keyless items are omitted. Mirrors `ixfx-grid-list.visibleKeys()` /\n * `ixfx-data-grid.getVisibleRange()`.\n */\n visibleKeys(): string[] {\n const container = this._listEl;\n if (!container)\n return [];\n const box = container.getBoundingClientRect();\n const out: string[] = [];\n for (const el of this._getVisibleItems()) {\n const key = keyForElement(el);\n if (key === undefined)\n continue;\n const r = el.getBoundingClientRect();\n if (r.right > box.left && r.left < box.right)\n out.push(key);\n }\n return out;\n }\n\n /**\n * Dispatch a command to this list — used by `ixfx-grouped-item-lister` to\n * forward commands. Routes through the command registry (so `list.search.*`\n * and any other registered commands work).\n */\n dispatch(commandId: CommandId, args?: Record<string, unknown>): void {\n this.#searchRegistry?.invoke(commandId, args);\n }\n\n select(item: Element): void {\n this.selection.replace(item);\n }\n\n selectMany(items: Iterable<Element>): void {\n this.selection.selectMany(items);\n }\n\n deselect(item: Element): void {\n this.selection.deselect(item);\n }\n\n clearSelection(): void {\n this.selection.clear();\n }\n\n selectAll(): void {\n if (this.selection.canSelectAll())\n this.selection.selectAll();\n }\n\n // --- Key-based selection & cursor ---\n\n /** The selection as stable `data-key` / `data-value` strings. */\n get selectedKeys(): ReadonlySet<string> {\n return this.selection.selectedKeys;\n }\n\n /** The key of the item under the cursor, or `undefined`. */\n get tickledKey(): string | undefined {\n const id = this.tickled.tickledId;\n return id ? keyForElement(id) : undefined;\n }\n\n /** Replace the selection with the items carrying these keys (unknown keys ignored). */\n selectKeys(keys: Iterable<string>): void {\n this.selection.selectKeys(keys, key => this.#itemForKey(key));\n }\n\n /** Add items by key to the selection (multi-select modes only). */\n addSelectedKeys(keys: Iterable<string>): void {\n this.selection.addKeys(keys, key => this.#itemForKey(key));\n }\n\n /** Remove items by key from the selection. */\n removeSelectedKeys(keys: Iterable<string>): void {\n this.selection.removeKeys(keys, key => this.#itemForKey(key));\n }\n\n /** Move the cursor to the item with this key and scroll it into view. */\n focusKey(key: string): void {\n const el = this.#itemForKey(key);\n if (!el)\n return;\n this.tickled.focus(el);\n el.scrollIntoView({ block: `nearest`, inline: `nearest` });\n }\n\n #itemForKey(key: string): Element | undefined {\n for (const el of this.querySelectorAll(ITEM_SELECTOR)) {\n if (keyForElement(el) === key)\n return el;\n }\n return undefined;\n }\n\n * selectedFilter(kind: `selected` | `checked` | `either`): Generator<Element> {\n const wanted = (el: Element) => {\n switch (kind) {\n case `selected`: return el.hasAttribute(`data-selected`);\n case `checked`: return el.hasAttribute(`data-checked`);\n case `either`: return el.hasAttribute(`data-selected`) || el.hasAttribute(`data-checked`);\n }\n };\n\n for (const el of this.querySelectorAll(ITEM_SELECTOR)) {\n if ((el as HTMLElement).hidden)\n continue;\n if (wanted(el))\n yield el;\n }\n }\n\n // --- Object items ---\n\n #rebuildFromObjects(items: readonly unknown[]): void {\n const keyOf = (el: Element): string | null =>\n el.getAttribute(`data-key`) ?? el.getAttribute(`data-search-label`) ?? null;\n const previousKeys = new Set(\n [...this.selection.selected].map(keyOf).filter((k): k is string => k !== null),\n );\n const anchorKey = this.selection.anchor ? keyOf(this.selection.anchor) : null;\n\n this.replaceChildren(...items.map((item, index) => this.#createItemEl(item, index)));\n\n // Re-select by key so selection survives the element-reference rebuild\n if (previousKeys.size > 0 || anchorKey !== null) {\n const next: Element[] = [];\n let anchor: Element | undefined;\n for (const el of this.querySelectorAll(ITEM_SELECTOR)) {\n const key = keyOf(el);\n if (key !== null && previousKeys.has(key))\n next.push(el);\n if (key !== null && key === anchorKey)\n anchor = el;\n }\n this.selection.seed(next, anchor);\n }\n\n if (this.sort !== `none`)\n this.#applySort();\n if (this.interactionMode === `checked`)\n this._syncCheckboxes();\n this._syncItemStates();\n this.#scheduleGeometry();\n this.#scheduleGroups();\n }\n\n #createItemEl(item: unknown, index: number): HTMLLIElement {\n const li = document.createElement(`li`);\n this.#itemData.set(li, item);\n\n const content = this.formatter\n ? this.formatter(item, index)\n : (this.displayProperty\n ? this.#propertyValue(item, this.displayProperty)\n : item);\n const textColor = this.#colorValue(item, this.textColorProperty);\n const iconColor = this.#colorValue(item, this.iconColorProperty);\n if (iconColor !== undefined)\n li.setAttribute(`data-icon-color`, iconColor);\n if (typeof content === `string`) {\n const span = this._setLabel(li, content);\n if (textColor !== undefined)\n span.style.color = textColor;\n if (this.iconProperty) {\n const icon = this.#propertyValue(item, this.iconProperty);\n if (typeof icon === `string` && icon.length > 0)\n li.setAttribute(`data-icon`, icon);\n }\n } else if (content instanceof Node) {\n li.appendChild(content);\n if (textColor !== undefined)\n li.style.color = textColor;\n }\n\n if (this.keyProperty) {\n const key = this.#propertyValue(item, this.keyProperty);\n if (key !== undefined && key !== null)\n li.setAttribute(`data-key`, String(key));\n }\n this.#ensureIcon(li);\n this.#ensureBadge(li, this.#propertyValue(item, this.badgeProperty));\n return li;\n }\n\n #propertyValue(item: unknown, prop: string): unknown {\n if (typeof item !== `object` || item === null || !(prop in item))\n return undefined;\n return (item as Record<string, unknown>)[prop];\n }\n\n /** A non-empty string from `item[prop]`, else `undefined`. */\n #colorValue(item: unknown, prop: string): string | undefined {\n return prop ? appearanceColor(this.#propertyValue(item, prop)) : undefined;\n }\n\n // --- Provider (async) items ---\n\n #syncFromProvider(): void {\n if (this.provider === undefined)\n return;\n const items = this.#data.items;\n if (items === this.#builtFromProvider)\n return;\n\n // Longest common prefix by identity — pure appends extend the columns,\n // anything else rebuilds.\n let prefix = 0;\n while (\n prefix < this.#builtFromProvider.length\n && prefix < items.length\n && this.#builtFromProvider[prefix] === items[prefix]\n ) {\n prefix++;\n }\n\n if (prefix === this.#builtFromProvider.length && prefix <= items.length) {\n const tail = items.slice(prefix);\n for (const item of tail) {\n this.appendChild(this.#createItemEl(item, this.#providerBuilt++));\n }\n if (this.sort !== `none`) {\n // Coalesce: many batches arriving within a frame should trigger a\n // single re-sort rather than one full re-sort per batch.\n cancelAnimationFrame(this.#sortRaf);\n this.#sortRaf = requestAnimationFrame(() => this.#applySort());\n }\n if (this.interactionMode === `checked`)\n this._syncCheckboxes();\n this._syncItemStates();\n this.#scheduleGeometry();\n this.#scheduleGroups();\n } else {\n this.#providerBuilt = 0;\n this.#rebuildFromObjects(items);\n }\n this.#builtFromProvider = items;\n }\n\n // --- Filtering ---\n\n #applyFilterPredicate(): void {\n if (!this.filterPredicate) {\n for (const el of this.querySelectorAll(ITEM_SELECTOR)) {\n el.removeAttribute(`hidden`);\n }\n return;\n }\n for (const el of this.querySelectorAll(ITEM_SELECTOR)) {\n if (this.filterPredicate(el)) {\n el.removeAttribute(`hidden`);\n } else {\n el.setAttribute(`hidden`, ``);\n }\n }\n }\n\n // --- Sorting ---\n\n #applySort(): void {\n if (this.sort === `none`)\n return;\n const rows = [...this.querySelectorAll(ITEM_SELECTOR)] as HTMLLIElement[];\n if (rows.length < 2)\n return;\n // Grouped lists are ordered (sorted, then partitioned) in one pass by #syncGroups.\n if (this.#groupingActive()) {\n this.#scheduleGroups();\n return;\n }\n for (const el of this.#sortRows(rows))\n this.appendChild(el); // moving reorders in place\n this.#scheduleGeometry();\n this.#scheduleGroups();\n }\n\n /** Stable sort of `rows` by the current `sort` / `sortBy` / `sortComparator`. */\n #sortRows(rows: HTMLLIElement[]): HTMLLIElement[] {\n const dir = this.sort === `descending` ? -1 : 1;\n const meta = (el: HTMLLIElement): DetailSortItem => ({\n element: el,\n data: this.getItemData(el),\n label: el.getAttribute(`data-search-label`) ?? el.textContent?.trim() ?? ``,\n });\n\n let cmp: (a: HTMLLIElement, b: HTMLLIElement) => number;\n if (this.sortComparator) {\n const user = this.sortComparator;\n cmp = (a, b) => user(meta(a), meta(b));\n } else if (this.sortBy) {\n const prop = this.sortBy;\n const key = (el: HTMLLIElement): string | number => {\n const v = this.#propertyValue(this.getItemData(el), prop);\n if (typeof v === `number`)\n return v;\n return v === undefined || v === null ? `` : String(v);\n };\n cmp = (a, b) => {\n const ka = key(a);\n const kb = key(b);\n if (typeof ka === `number` && typeof kb === `number`)\n return ka - kb;\n return String(ka).localeCompare(String(kb), undefined, { numeric: true });\n };\n } else {\n cmp = (a, b) =>\n meta(a).label.localeCompare(meta(b).label, undefined, { numeric: true });\n }\n\n const indexed = rows.map((el, i) => ({ el, i }));\n indexed.sort((a, b) => cmp(a.el, b.el) * dir || a.i - b.i); // stable\n return indexed.map(({ el }) => el);\n }\n\n // --- Grouping ---\n\n #groupingActive(): boolean {\n return this.groupBy !== null && this.groupBy !== undefined && this.groupBy !== ``;\n }\n\n /** Coalesce regrouping to one pass per microtask (streaming batches, search keystrokes). */\n #scheduleGroups(): void {\n if (this.#groupsScheduled || (!this.#groupingActive() && !this.#wasGrouped))\n return;\n this.#groupsScheduled = true;\n queueMicrotask(() => {\n this.#groupsScheduled = false;\n this.#syncGroups();\n });\n }\n\n #groupValue(el: Element, name: string): unknown {\n return this.#propertyValue(this.getItemData(el as HTMLLIElement), name) ?? el.getAttribute(`data-${name}`);\n }\n\n #groupKeyOf(el: Element): string {\n const by = this.groupBy!;\n if (typeof by === `string`)\n return toGroupKey(this.#groupValue(el, by));\n return toGroupKey(by(this.getItemData(el as HTMLLIElement), el));\n }\n\n #isItemVisible(el: Element): boolean {\n return !(el as HTMLElement).hidden && (!this.filterPredicate || this.filterPredicate(el));\n }\n\n #headerFor(key: string): HTMLElement {\n let header = this.#headerEls.get(key);\n if (!header) {\n header = document.createElement(`ixfx-list-group-header`);\n header.setAttribute(GROUP_HEADER_ATTR, ``);\n header.dataset.groupKey = key;\n this.#headerEls.set(key, header);\n }\n return header;\n }\n\n /**\n * Bring the light DOM into grouped order: original order → sort → partition\n * into contiguous groups, each preceded by a header row. Idempotent — it only\n * touches the DOM when the order actually changes, so it never loops through\n * the mutation observer. Ungrouping restores the original (sorted) order.\n */\n #syncGroups(): void {\n const active = this.#groupingActive();\n if (!active && !this.#wasGrouped)\n return;\n const items = [...this.querySelectorAll(ITEM_SELECTOR)] as HTMLLIElement[];\n for (const el of items) {\n if (!this.#seq.has(el))\n this.#seq.set(el, this.#seqNext++);\n }\n let ordered = items.toSorted((a, b) => this.#seq.get(a)! - this.#seq.get(b)!);\n if (this.sort !== `none` && ordered.length > 1)\n ordered = this.#sortRows(ordered);\n\n const nodes: Element[] = [];\n const info: ListGroupInfo[] = [];\n const index = new Map<Element, string>();\n const liveHeaders = new Set<string>();\n if (active) {\n const label = this.groupLabel;\n const parts = partitionByGroup(\n ordered,\n el => this.#groupKeyOf(el),\n label ? (key, els) => label(key, (els as Element[]).map(el => this.getItemData(el as HTMLLIElement) ?? el)) : undefined,\n );\n for (const part of parts) {\n const count = part.items.filter(el => this.#isItemVisible(el)).length;\n const collapsed = count > 0 && this._collapsedGroups.has(part.key);\n if (count > 0) {\n const header = this.#headerFor(part.key) as HTMLElement & { label: string; count: number; collapsed: boolean };\n header.label = part.label;\n header.count = count;\n header.collapsed = collapsed;\n liveHeaders.add(part.key);\n nodes.push(header);\n info.push({ key: part.key, label: part.label, count, collapsed: this._collapsedGroups.has(part.key) });\n }\n for (const el of part.items) {\n index.set(el, part.key);\n el.toggleAttribute(GROUP_COLLAPSED_ATTR, collapsed);\n nodes.push(el);\n }\n }\n } else {\n for (const el of ordered)\n el.removeAttribute(GROUP_COLLAPSED_ATTR);\n nodes.push(...ordered);\n }\n for (const [key, header] of this.#headerEls) {\n if (!liveHeaders.has(key)) {\n header.remove();\n this.#headerEls.delete(key);\n }\n }\n this.#groupIndex = index;\n this.#groupList = info;\n this.#wasGrouped = active;\n\n const current = [...this.children].filter(c => c.matches(`li`) || c.hasAttribute(GROUP_HEADER_ATTR));\n if (current.length !== nodes.length || current.some((c, i) => c !== nodes[i]))\n this.append(...nodes);\n\n const cursor = this.tickled.tickledId;\n if (cursor?.hasAttribute(GROUP_COLLAPSED_ATTR))\n this.tickled.focus(undefined);\n this.#syncGroupObserver(active);\n this.#scheduleGeometry();\n }\n\n /** Filter-search hides rows via `hidden` on the `<li>`s — regroup when that changes. */\n #syncGroupObserver(active: boolean): void {\n if (!active) {\n this.#groupObserver?.disconnect();\n this.#groupObserver = undefined;\n return;\n }\n if (this.#groupObserver || !this.isConnected)\n return;\n this.#groupObserver = new MutationObserver(() => this.#scheduleGroups());\n this.#groupObserver.observe(this, { subtree: true, attributes: true, attributeFilter: [`hidden`] });\n }\n\n /** Groups in display order (empty when ungrouped). */\n get groups(): readonly ListGroupInfo[] {\n return this.#groupList;\n }\n\n /** Collapse or expand one group. Fires `list-group-toggle` when the state changes. */\n setGroupCollapsed(groupKey: string, collapsed: boolean): void {\n if (this._collapsedGroups.has(groupKey) === collapsed)\n return;\n const next = new Set(this._collapsedGroups);\n if (collapsed)\n next.add(groupKey);\n else\n next.delete(groupKey);\n this._collapsedGroups = next;\n this._dispatch<ListGroupToggleDetail>(`list-group-toggle`, { groupKey, collapsed });\n }\n\n toggleGroup(groupKey: string): void {\n this.setGroupCollapsed(groupKey, !this._collapsedGroups.has(groupKey));\n }\n\n collapseAllGroups(): void {\n for (const g of this.#groupList)\n this.setGroupCollapsed(g.key, true);\n }\n\n expandAllGroups(): void {\n for (const key of [...this._collapsedGroups])\n this.setGroupCollapsed(key, false);\n }\n\n #findGroupHeader(path: EventTarget[]): HTMLElement | undefined {\n for (const target of path) {\n if (target === this)\n break;\n if (target instanceof HTMLElement && target.parentElement === this && target.hasAttribute(GROUP_HEADER_ATTR))\n return target;\n }\n return undefined;\n }\n\n // --- Geometry (measured grid) ---\n\n #scheduleGeometry(): void {\n if (this.#geometryScheduled)\n return;\n this.#geometryScheduled = true;\n requestAnimationFrame(() => {\n this.#geometryScheduled = false;\n this.#recomputeGeometry();\n });\n }\n\n #recomputeGeometry(): void {\n this.#grid = [];\n this.#positions.clear();\n this.#tops.clear();\n if (!this.isConnected)\n return;\n\n const columns: Array<{ left: number; items: Element[] }> = [];\n for (const el of this._getVisibleItems()) {\n const rect = el.getBoundingClientRect();\n if (rect.width === 0 && rect.height === 0)\n continue;\n this.#tops.set(el, rect.top);\n let ci = columns.findIndex(c => Math.abs(c.left - rect.left) <= 1);\n if (ci === -1) {\n columns.push({ left: rect.left, items: [] });\n ci = columns.length - 1;\n }\n columns[ci].items.push(el);\n }\n columns.sort((a, b) => a.left - b.left);\n for (const col of columns)\n col.items.sort((a, b) => a.getBoundingClientRect().top - b.getBoundingClientRect().top);\n\n this.#grid = columns.map(c => c.items);\n this.#grid.forEach((col, colIdx) =>\n col.forEach((el, rowIdx) => this.#positions.set(el, { col: colIdx, row: rowIdx })),\n );\n // Geometry moves (resize, filter, sort, DOM changes) can change the\n // visible set without a scroll — check for a viewport change here so\n // every recompute path is covered.\n this.#scheduleViewportChangeEmit();\n }\n\n #positionOf(el: Element): GridPosition | undefined {\n let pos = this.#positions.get(el);\n if (pos === undefined) {\n this.#recomputeGeometry();\n pos = this.#positions.get(el);\n }\n return pos;\n }\n\n #itemAt(col: number, row: number): Element | undefined {\n return this.#grid[col]?.[row];\n }\n\n #gridSize(): { cols: number; rows: number } {\n if (this.#grid.length === 0)\n this.#recomputeGeometry();\n return { cols: this.#grid.length, rows: Math.max(0, ...this.#grid.map(c => c.length)) };\n }\n\n // --- Keyboard navigation ---\n\n #navigateTo(target: Element | undefined): void {\n if (!target)\n return;\n this.tickled.handleKeyboardNavigation(target);\n this.tickled.tickledId?.scrollIntoView({ block: `nearest`, inline: `nearest` });\n }\n\n #findNextCheckable(fromCol: number, fromRow: number, deltaCol: number, deltaRow: number): Element | undefined {\n const { cols } = this.#gridSize();\n const visibleItems = this._getVisibleItems();\n const maxIterations = visibleItems.length + 1;\n\n // Start from the next position\n // For horizontal nav: move to next column first, keep same row\n // For vertical nav: stay in same column, move row\n // For diagonal nav: both change\n let col = deltaCol !== 0 ? fromCol + deltaCol : fromCol;\n let row = deltaRow !== 0 ? fromRow + deltaRow : fromRow;\n\n // Track whether we've tried wrapping columns\n let wrappedColumns = false;\n\n for (let iterations = 0; iterations < maxIterations; iterations++) {\n // Check bounds\n const colLength = this.#grid[col]?.length ?? 0;\n\n if (row < 0 || row >= colLength) {\n // Need to move to another column\n if (deltaCol !== 0 || wrappedColumns) {\n // Already tried wrapping, or horizontal nav - stop or wrap\n if (this.itemWrap === `wrap`) {\n // Simple wrap: if deltaCol < 0, go to last column; if deltaCol > 0, go to first\n if (deltaCol < 0) {\n col = cols - 1;\n } else if (deltaCol > 0) {\n col = 0;\n }\n wrappedColumns = true;\n } else {\n return undefined;\n }\n }\n\n // Try next/prev column\n if (deltaRow > 0) {\n // Going down - try next column at row 0\n if (col + 1 < cols) {\n col = col + 1;\n row = 0;\n wrappedColumns = true;\n } else if (this.itemWrap === `wrap`) {\n col = 0;\n row = 0;\n wrappedColumns = true;\n } else {\n return undefined;\n }\n } else if (deltaRow < 0) {\n // Going up - try prev column at last row\n if (col - 1 >= 0) {\n col = col - 1;\n row = (this.#grid[col]?.length ?? 1) - 1;\n wrappedColumns = true;\n } else if (this.itemWrap === `wrap`) {\n col = cols - 1;\n row = (this.#grid[col]?.length ?? 1) - 1;\n wrappedColumns = true;\n } else {\n return undefined;\n }\n } else if (deltaCol !== 0) {\n // Horizontal navigation - adjust row if target column is shorter\n const targetColLength = this.#grid[col]?.length ?? 0;\n if (row >= targetColLength && targetColLength > 0) {\n row = targetColLength - 1;\n }\n }\n\n // If we're now at same position as start, we've looped\n if (col === fromCol && row === fromRow + deltaRow) {\n return undefined;\n }\n continue;\n }\n\n const item = this.#itemAt(col, row);\n if (item && this._isCheckable(item)) {\n return item;\n }\n\n // Move to next position\n row += deltaRow;\n }\n\n return undefined;\n }\n\n #findFirstCheckable(): Element | undefined {\n const visibleItems = this._getVisibleItems();\n return visibleItems.find(item => this._isCheckable(item));\n }\n\n #findLastCheckable(): Element | undefined {\n const visibleItems = this._getVisibleItems();\n for (let i = visibleItems.length - 1; i >= 0; i--) {\n if (this._isCheckable(visibleItems[i])) {\n return visibleItems[i];\n }\n }\n return undefined;\n }\n\n #navigateDown(): void {\n this.#recomputeGeometry();\n const cur = this.tickled.tickledId ? this.#positionOf(this.tickled.tickledId) : undefined;\n if (!cur) {\n this.#navigateTo(this.#findFirstCheckable());\n return;\n }\n const next = this.#findNextCheckable(cur.col, cur.row, 0, 1);\n if (next) {\n this.#navigateTo(next);\n }\n }\n\n #navigateUp(): void {\n this.#recomputeGeometry();\n const cur = this.tickled.tickledId ? this.#positionOf(this.tickled.tickledId) : undefined;\n if (!cur) {\n this.#navigateTo(this.#findLastCheckable());\n return;\n }\n const next = this.#findNextCheckable(cur.col, cur.row, 0, -1);\n if (next) {\n this.#navigateTo(next);\n }\n }\n\n /**\n * Left/Right target. Ungrouped lists keep the row-index rule. Grouped lists\n * have headers at arbitrary heights, so an item's row index no longer equals\n * its visual row — pick the item in the neighbouring column whose top is\n * nearest the cursor's (ties go to the upper one).\n */\n #horizontalTarget(from: GridPosition, dir: -1 | 1): Element | undefined {\n if (this.#groupList.length === 0)\n return this.#findNextCheckable(from.col, from.row, dir, 0);\n const column = this.#grid[from.col + dir];\n const current = this.tickled.tickledId;\n const top = current ? this.#tops.get(current) : undefined;\n if (!column || top === undefined)\n return undefined;\n let best: Element | undefined;\n let bestDelta = Number.POSITIVE_INFINITY;\n for (const el of column) {\n if (!this._isCheckable(el))\n continue;\n const delta = Math.abs((this.#tops.get(el) ?? Number.POSITIVE_INFINITY) - top);\n if (delta < bestDelta) {\n best = el;\n bestDelta = delta;\n }\n }\n return best;\n }\n\n #navigateRight(): void {\n this.#recomputeGeometry();\n const cur = this.tickled.tickledId ? this.#positionOf(this.tickled.tickledId) : undefined;\n if (!cur) {\n this.#navigateTo(this.#findFirstCheckable());\n return;\n }\n const next = this.#horizontalTarget(cur, 1);\n if (next) {\n this.#navigateTo(next);\n } else if (this.itemWrap === `wrap`) {\n this.#navigateTo(this.#findFirstCheckable());\n }\n }\n\n #navigateLeft(): void {\n this.#recomputeGeometry();\n const cur = this.tickled.tickledId ? this.#positionOf(this.tickled.tickledId) : undefined;\n if (!cur) {\n this.#navigateTo(this.#findFirstCheckable());\n return;\n }\n const next = this.#horizontalTarget(cur, -1);\n if (next) {\n this.#navigateTo(next);\n } else if (this.itemWrap === `wrap`) {\n this.#navigateTo(this.#findLastCheckable());\n }\n }\n\n // --- Helpers ---\n\n private _getVisibleItems(): Element[] {\n return Array.from(this.querySelectorAll(ITEM_SELECTOR)).filter((el) => {\n if ((el as HTMLElement).hidden)\n return false;\n if (el.hasAttribute(GROUP_COLLAPSED_ATTR))\n return false;\n if (this.filterPredicate && !this.filterPredicate(el))\n return false;\n return true;\n });\n }\n\n /**\n * Set the column width to fit the widest visible item.\n *\n * This is opt-in; detail lists continue to use `--detail-list-column-width`\n * (or its 220px fallback) until this method is called. The measured value is\n * set directly on this element, so it takes precedence over an inherited\n * value. Returns the applied width in pixels, or 0 when there are no items.\n */\n async fitColumnWidth(): Promise<number> {\n await this.updateComplete;\n\n const items = this._getVisibleItems();\n if (items.length === 0)\n return 0;\n\n const previousWidth = this.style.getPropertyValue(`--detail-list-column-width`);\n const previousPriority = this.style.getPropertyPriority(`--detail-list-column-width`);\n this.style.setProperty(`--detail-list-column-width`, `max-content`);\n\n // Reading the layout forces the temporary max-content width to resolve.\n const width = Math.ceil(Math.max(...items.map(item => item.getBoundingClientRect().width)));\n\n if (previousWidth) {\n this.style.setProperty(`--detail-list-column-width`, previousWidth, previousPriority);\n } else {\n this.style.removeProperty(`--detail-list-column-width`);\n }\n this.style.setProperty(`--detail-list-column-width`, `${width}px`);\n this.#scheduleGeometry();\n return width;\n }\n\n private _isCheckable(item: Element): boolean {\n if (this.interactionMode !== `checked`)\n return true;\n return !item.hasAttribute(`not-checked`);\n }\n\n /** Appends the caption span; returns it so callers can style it per item. */\n private _setLabel(li: HTMLLIElement, label: string): HTMLSpanElement {\n const span = document.createElement(`span`);\n span.style.cssText = LABEL_SPAN_CSS;\n span.textContent = label;\n li.appendChild(span);\n li.setAttribute(`data-search-label`, label);\n return span;\n }\n\n /**\n * Inject a leading `<ixfx-icon>` into an item carrying `data-icon`.\n * Idempotent — skips when the item already starts with an icon.\n */\n #ensureIcon(li: HTMLLIElement): void {\n const name = li.getAttribute(`data-icon`);\n if (!name)\n return;\n if (li.firstElementChild?.tagName === `IXFX-ICON`)\n return;\n const icon = document.createElement(`ixfx-icon`);\n icon.setAttribute(`name`, name);\n icon.style.marginInlineEnd = `var(--detail-list-icon-gap, 6px)`;\n icon.style.flexShrink = `0`;\n // Icons paint from `currentColor`, so tinting the host colours the glyph.\n const color = li.getAttribute(`data-icon-color`);\n if (color)\n icon.style.color = color;\n li.prepend(icon);\n }\n\n /**\n * Append a right-justified Finder-style badge. `badge` may be a DOM `Node`\n * or anything Lit can render (typically a `TemplateResult`). Idempotent —\n * a second call replaces the existing badge.\n */\n #ensureBadge(li: HTMLLIElement, badge: unknown): void {\n if (appearanceAbsent(badge))\n return;\n let holder = li.querySelector<HTMLElement>(`:scope > .item-badge`);\n if (!holder) {\n holder = document.createElement(`span`);\n holder.className = `item-badge`;\n holder.style.cssText = BADGE_EL_CSS;\n li.appendChild(holder);\n }\n holder.replaceChildren();\n if (badge instanceof Node)\n holder.appendChild(badge);\n else\n render(badge, holder);\n }\n\n /** Scan light-DOM children for unprocessed `data-icon` items. */\n #processChildren(): void {\n for (const el of this.querySelectorAll(ITEM_SELECTOR)) {\n this.#ensureIcon(el as HTMLLIElement);\n }\n }\n\n private _syncItemStates(): void {\n for (const el of this.querySelectorAll(ITEM_SELECTOR)) {\n el.toggleAttribute(`data-tickled`, this.tickled.isTickled(el));\n el.toggleAttribute(`data-selected`, this.selection.selected.has(el));\n if (this.interactionMode === `checked`) {\n el.toggleAttribute(\n `data-checked`,\n !el.hasAttribute(`not-checked`) && this.selection.selected.has(el),\n );\n } else {\n el.removeAttribute(`data-checked`);\n }\n }\n this.dataset.inputMode = this.tickled.inputMode;\n this._syncCheckboxes();\n }\n\n private _syncCheckboxes(): void {\n const inCheckedMode = this.interactionMode === `checked`;\n const wantsCustom = typeof this.checkboxRenderer === `function`;\n\n for (const el of this.querySelectorAll<HTMLElement>(`li`)) {\n const existing = el.querySelector<HTMLElement>(`.ixfx-list-checkbox`);\n if (!inCheckedMode) {\n if (existing)\n existing.remove();\n continue;\n }\n // Rows marked `not-checked` get no checkbox column and can't be checked\n if (el.hasAttribute(`not-checked`)) {\n if (existing)\n existing.remove();\n continue;\n }\n\n const existingIsCustom = existing?.classList.contains(`ixfx-list-checkbox-custom`) ?? false;\n if (existing && existingIsCustom !== wantsCustom)\n existing.remove();\n\n let cb: HTMLElement | null = el.querySelector<HTMLElement>(`.ixfx-list-checkbox`);\n if (!cb) {\n if (wantsCustom) {\n const opts = this.checkboxRenderer as CustomCheckboxOptions;\n const margin = opts.margin ?? `0`;\n const width = opts.width ?? `24px`;\n cb = this._createCustomCheckbox(el, margin, width);\n } else {\n cb = this._createNativeCheckboxCell(el);\n }\n el.prepend(cb);\n }\n\n const checked = this.selection.selected.has(el);\n if (wantsCustom) {\n cb.setAttribute(`aria-checked`, String(checked));\n cb.toggleAttribute(`data-checked`, checked);\n if (this.checkboxRenderer) {\n const renderer = typeof this.checkboxRenderer === `function`\n ? this.checkboxRenderer\n : (this.checkboxRenderer as CustomCheckboxOptions).renderer;\n render(renderer(checked), cb);\n }\n } else {\n const input = cb.querySelector<HTMLInputElement>(`input.ixfx-list-checkbox`);\n if (input)\n input.checked = checked;\n }\n }\n }\n\n /**\n * Native checkbox cell: a span that stretches to the row's full cross-axis\n * (so the entire column height is a click target) with a real `<input>`\n * centred inside. The span owns the click; the input is purely visual and\n * has `pointer-events:none` so a single click produces one toggle.\n */\n private _createNativeCheckboxCell(el: HTMLElement): HTMLSpanElement {\n const cell = document.createElement(`span`);\n cell.className = `ixfx-list-checkbox ixfx-list-checkbox-native`;\n cell.style.cssText = `display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;align-self:stretch;width:18px;margin:0 6px 0 0;cursor:pointer;pointer-events:auto`;\n cell.tabIndex = -1;\n cell.setAttribute(`role`, `checkbox`);\n cell.setAttribute(`part`, `checkbox`);\n cell.addEventListener(`click`, (e) => {\n e.stopPropagation();\n this.selection.toggle(el);\n });\n const input = document.createElement(`input`);\n input.type = `checkbox`;\n input.className = `ixfx-list-checkbox`;\n input.style.cssText = `pointer-events:none;cursor:pointer;margin:0`;\n cell.appendChild(input);\n return cell;\n }\n\n /** Custom checkbox cell: same shape as the native cell; renderer content inside. */\n private _createCustomCheckbox(el: HTMLElement, margin: string, width: string): HTMLSpanElement {\n const span = document.createElement(`span`);\n span.className = `ixfx-list-checkbox ixfx-list-checkbox-custom`;\n span.style.cssText = `display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;align-self:stretch;width:${width};margin:${margin};cursor:pointer;pointer-events:auto`;\n span.tabIndex = -1;\n span.setAttribute(`role`, `checkbox`);\n span.setAttribute(`part`, `checkbox`);\n span.addEventListener(`click`, (e) => {\n e.stopPropagation();\n this.selection.toggle(el);\n });\n return span;\n }\n\n private _findListItem(path: EventTarget[]): Element | undefined {\n for (const target of path) {\n if (!(target instanceof Element))\n continue;\n if (target === this)\n break;\n if (target.parentElement === this && target.matches(`li`))\n return target;\n }\n return undefined;\n }\n\n private _dispatch<T>(name: keyof DetailListElementEventMap, detail: T): void {\n this.dispatchEvent(new CustomEvent<T>(name as string, {\n detail,\n bubbles: true,\n composed: true,\n }));\n }\n\n private _dispatchCancelable<T>(name: string, detail: T): boolean {\n return this.dispatchEvent(new CustomEvent<T>(name, {\n detail,\n bubbles: true,\n composed: true,\n cancelable: true,\n }));\n }\n\n /** Scroll on the `part=\"list\"` element — rAF-coalesced viewport-change check. */\n #onListScroll = (): void => {\n if (this.#viewportScrollRaf !== 0)\n return;\n this.#viewportScrollRaf = requestAnimationFrame(() => {\n this.#viewportScrollRaf = 0;\n this.#emitViewportChangeIfChanged();\n });\n };\n\n /** Coalesce non-scroll viewport checks to at most one per animation frame. */\n #scheduleViewportChangeEmit(): void {\n if (this.#viewportScrollRaf !== 0)\n return;\n this.#viewportScrollRaf = requestAnimationFrame(() => {\n this.#viewportScrollRaf = 0;\n this.#emitViewportChangeIfChanged();\n });\n }\n\n /**\n * Keys of everything currently rendered. The list has no virtual window —\n * every non-hidden item is in the DOM — so this is all keyed items, mirroring\n * `ixfx-vertical-list.renderedKeys()` in its non-virtualized mode.\n */\n #renderedKeys(): string[] {\n const out: string[] = [];\n for (const el of this._getVisibleItems()) {\n const key = keyForElement(el);\n if (key !== undefined)\n out.push(key);\n }\n return out;\n }\n\n /**\n * Dispatch `detail-list-viewport-change` with the current key sets — unless\n * neither set changed since the last dispatch, so coalesced frames and\n * no-op scrolls stay silent.\n */\n #emitViewportChangeIfChanged(): void {\n const renderedKeys = this.#renderedKeys();\n const visibleKeys = this.visibleKeys();\n if (sameKeys(this.#lastViewportRenderedKeys, renderedKeys) && sameKeys(this.#lastViewportVisibleKeys, visibleKeys))\n return;\n this.#lastViewportRenderedKeys = renderedKeys;\n this.#lastViewportVisibleKeys = visibleKeys;\n this._dispatch<ListViewportChangeDetail>(`detail-list-viewport-change`, { renderedKeys, visibleKeys });\n }\n\n // --- Event handlers ---\n\n private _onPointerOver = (e: PointerEvent): void => {\n const item = this._findListItem(e.composedPath());\n if (item)\n this.tickled.handlePointerEnter(item);\n };\n\n private _onPointerLeave = (e: PointerEvent): void => {\n this.tickled.handlePointerLeave(e);\n };\n\n /** Restores hover transitions once the pointer takes over from the keyboard. */\n private _endKeyboardNav = (): void => {\n this.removeAttribute(`data-keyboard-nav`);\n };\n\n private _onKeyDown = (e: KeyboardEvent): void => {\n if (this.search.isOpen)\n return;\n if ((e.ctrlKey || e.metaKey) && e.key === `a`) {\n if (this.selection.canSelectAll()) {\n e.preventDefault();\n this.selection.selectAll();\n }\n return;\n }\n\n if (NAV_KEYS.has(e.key))\n this.setAttribute(`data-keyboard-nav`, ``);\n\n switch (e.key) {\n case `ArrowDown`: {\n e.preventDefault();\n this.#navigateDown();\n // vscode: Shift+Arrow extends range from anchor\n if (e.shiftKey && this.interactionMode === `vscode`) {\n const cur = this.tickled.tickledId;\n if (cur)\n this.selection.rangeTo(cur);\n }\n break;\n }\n case `ArrowUp`: {\n e.preventDefault();\n this.#navigateUp();\n if (e.shiftKey && this.interactionMode === `vscode`) {\n const cur = this.tickled.tickledId;\n if (cur)\n this.selection.rangeTo(cur);\n }\n break;\n }\n case `ArrowRight`: {\n e.preventDefault();\n this.#navigateRight();\n break;\n }\n case `ArrowLeft`: {\n e.preventDefault();\n this.#navigateLeft();\n break;\n }\n case `Home`: {\n e.preventDefault();\n this.#navigateTo(this.#findFirstCheckable());\n break;\n }\n case `End`: {\n e.preventDefault();\n this.#navigateTo(this.#findLastCheckable());\n break;\n }\n case `Enter`: {\n const id = this.tickled.tickledId;\n if (id) {\n e.preventDefault();\n this._dispatch<ListItemClickDetail>(`list-item-click`, { item: id });\n this._activateItem(id);\n }\n break;\n }\n case ` `: {\n const id = this.tickled.tickledId;\n if (id) {\n e.preventDefault();\n this.selection.handleSpace(id);\n }\n break;\n }\n case `Escape`:\n this.selection.clear();\n break;\n }\n };\n\n private _onClick = (e: MouseEvent): void => {\n if (this.#dragSelect.isDragging || this.#nativeDrag.isDragging || this.#postDragSuppressTimer !== 0)\n return;\n const path = e.composedPath();\n const header = this.#findGroupHeader(path);\n if (header) {\n this.toggleGroup(header.dataset.groupKey ?? ``);\n return;\n }\n const item = this._findListItem(path);\n if (!item)\n return;\n this.focus();\n this._dispatch<ListItemClickDetail>(`list-item-click`, { item });\n this.selection.handleClick(item, e);\n };\n\n private _onDblClick = (e: MouseEvent): void => {\n const item = this._findListItem(e.composedPath());\n if (item)\n this._activateItem(item);\n };\n\n private _onWheel = (e: WheelEvent): void => {\n // Mouse wheels report vertical-only deltaY; trackpads report a genuine\n // deltaX for horizontal swipes. Drive scrollLeft from whichever axis the\n // user is actually moving, so trackpad horizontal scrolling isn't\n // swallowed by a preventDefault() that only ever read deltaY.\n e.preventDefault();\n const delta = Math.abs(e.deltaX) > Math.abs(e.deltaY) ? e.deltaX : e.deltaY;\n this._listEl.scrollLeft += delta;\n };\n\n private _activateItem(item: Element): void {\n // manual mode: never auto-select; just fire the event\n if (this.interactionMode !== `manual`) {\n this.selection.replace(item);\n }\n this._dispatch<ListActivateDetail>(`list-activate`, { item });\n }\n\n // --- Styles ---\n\n static override styles = [themeFallbacks, scrollFadeStyles(`x`), listSearchStyles, css`\n :host {\n display: block;\n position: relative;\n background: var(--detail-list-bg, var(--surface-3));\n color: var(--detail-list-text, var(--surface-3-text));\n border-radius: var(--detail-list-radius, var(--radius-s));\n border: 1px solid var(--detail-list-border, var(--border));\n width: 100%;\n height: 100%;\n overflow: hidden;\n box-sizing: border-box;\n outline: none;\n --_detail-list-item-padding:\n var(--ixfx-detail-list-item-padding, var(--detail-list-item-padding, 0 var(--space-xs, 3px)));\n }\n\n :host(:focus-visible) {\n outline: 2px solid var(--accent);\n outline-offset: 2px;\n }\n\n .container {\n position: relative;\n width: 100%;\n height: 100%;\n }\n\n ul {\n list-style: none;\n margin: 0;\n padding: 0;\n /* keep the last column clear of the scrollbar / right edge */\n padding-inline-end: calc(var(--detail-list-column-gap, 8px) + 4px);\n width: 100%;\n height: 100%;\n display: flex;\n flex-flow: column wrap;\n align-content: flex-start;\n column-gap: var(--detail-list-column-gap, 8px);\n overflow-x: auto;\n overflow-y: hidden;\n box-sizing: border-box;\n /* Scrollbar theming: consumers override these CSS variables to control\n the native scrollbar (scrollbar-width, scrollbar-gutter, scrollbar-color). */\n scrollbar-width: var(--detail-list-scrollbar-width, auto);\n scrollbar-gutter: var(--detail-list-scrollbar-gutter, auto);\n scrollbar-color: var(--detail-list-scrollbar-color, auto);\n }\n\n ::slotted([hidden]) {\n display: none !important;\n }\n\n /* Rows of a collapsed group leave the flow; their header stays. */\n ::slotted([data-group-collapsed]) {\n display: none !important;\n }\n\n /* Group headers are rows in the column flow, the same size as an item. */\n ::slotted(ixfx-list-group-header) {\n box-sizing: border-box;\n flex: none;\n width: var(--detail-list-column-width, 220px);\n height: var(--detail-list-item-height, 28px);\n --list-group-header-height: var(--detail-list-group-header-height, var(--detail-list-item-height, 28px));\n }\n\n ::slotted(li) {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n flex: none;\n width: var(--detail-list-column-width, 220px);\n height: var(--detail-list-item-height, 28px);\n padding: var(--_detail-list-item-padding);\n cursor: pointer;\n user-select: none;\n transition: background var(--transition, 0.1s ease-out),\n outline-color var(--transition, 0.1s ease-out);\n outline: 1px solid transparent;\n }\n\n /* While navigating by keyboard, key-repeat outpaces the 0.1s fade so the\n cursor smears across rows. Snap instead. */\n :host([data-keyboard-nav]) ::slotted(li) {\n transition: none;\n }\n\n /* In checked mode, only the checkbox column is clickable; the row body\n gets a default cursor so it doesn't suggest otherwise. */\n :host([interaction-mode=\"checked\"]) ::slotted(li) {\n cursor: default;\n }\n\n ::slotted([data-tickled]) {\n background: var(--item-bg-tickled);\n outline: var(--item-border-tickled);\n }\n\n ::slotted([data-selected]) {\n background: var(--item-bg-selected);\n color: var(--item-text-selected);\n outline: 1px solid transparent;\n }\n\n ::slotted([data-selected][data-tickled]) {\n background: var(--item-bg-selected-tickled);\n outline: 2px dashed var(--surface-3);\n outline-offset: -2px;\n }\n\n /* Drag-select (marquee) rectangle + covered-row preview.\n Style hooks: part=\"marquee\", --detail-list-marquee-border,\n --detail-list-marquee-fill. */\n .marquee {\n position: absolute;\n pointer-events: none;\n z-index: 5;\n border: 1px solid var(--detail-list-marquee-border, var(--accent));\n background: var(--detail-list-marquee-fill, color-mix(in srgb, var(--accent) 15%, transparent));\n }\n\n ::slotted([data-marquee]) {\n background: var(--item-bg-selected);\n color: var(--item-text-selected);\n }\n\n ::slotted([data-drag-origin]) {\n opacity: 0.6;\n }\n\n /* Per-item icon / badge (adapter mode) are styled inline by\n #ensureBadge — ::slotted() only reaches the host's direct children,\n and these spans live inside a slotted <li>. */\n\n /* checked mode: the injected checkbox communicates selection — suppress bg */\n :host([interaction-mode=\"checked\"]) ::slotted([data-selected]) {\n background: transparent;\n color: inherit;\n outline: 1px solid transparent;\n }\n\n :host([interaction-mode=\"checked\"]) ::slotted([data-selected][data-tickled]) {\n background: var(--item-bg-tickled);\n color: inherit;\n outline: var(--item-border-tickled);\n }\n\n .loading {\n position: absolute;\n bottom: 8px;\n right: 8px;\n z-index: 10;\n background: var(--surface-4, #2a2a2a);\n border: 1px solid var(--border, #444);\n border-radius: var(--radius-m, 4px);\n padding: 2px 8px;\n font-size: var(--text-s, 11px);\n color: var(--surface-muted-text, #888);\n }\n\n .loading[hidden] {\n display: none;\n }\n `];\n\n // --- Render ---\n\n override render() {\n const loading = this.#data.loading;\n const progress = this.#data.progress;\n return html`\n <div class=\"container\">\n <ul part=\"list\" class=\"scroll-fade-x\" @scroll=${this.#onListScroll}>\n <slot></slot>\n </ul>\n ${this.#marqueeRect\n ? html`<div class=\"marquee\" part=\"marquee\" style=${this.#marqueeStyle(this.#marqueeRect)}></div>`\n : ``}\n <div class=\"loading\" part=\"loading\" ?hidden=${!loading}>\n ${loading\n ? (progress !== undefined ? `${Math.round(progress * 100)}%` : `loading…`)\n : nothing}\n </div>\n ${this.search.renderField()}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-detail-list': DetailListElement;\n }\n\n interface HTMLElementEventMap extends DetailListElementEventMap {}\n}\n\nexport interface DetailListElementEventMap extends ListElementEventMap, ListGroupEventMap {\n 'detail-list-viewport-change': ListViewportChangeEvent;\n 'list-native-drag-start': ListNativeDragStartEvent<Element>;\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"drag-ghost-DtSDvjri.js","names":[],"sources":["../src/util/drag-ghost.ts"],"sourcesContent":["/**\n * Theme-aware floating element helper.\n *\n * Creates a `position: fixed`, `pointer-events: none` element anchored to a\n * source element's theme container, then exposes imperative `move` / `destroy`\n * hooks. Used by `ixfx-tab-list` for its drag-ghost; intended to be reusable\n * by future drag/detach features.\n *\n * Theme container lookup mirrors `tooltip-controller.ts` so the floating\n * element still inherits the right CSS custom properties when the source lives\n * inside a `.theme-dark` / `.theme-light` subtree (used by the loader iframes).\n */\nlet stylesInjected = false;\n\nfunction injectGhostStyles(): void {\n if (stylesInjected)\n return;\n stylesInjected = true;\n const style = document.createElement(`style`);\n style.textContent = `\n .ixfx-drag-ghost {\n position: fixed;\n top: 0;\n left: 0;\n pointer-events: none;\n z-index: 10000;\n will-change: transform;\n opacity: 0.9;\n display: inline-flex;\n align-items: center;\n gap: var(--space-xs, 4px);\n padding: var(--padding, var(--space-m, 8px)) calc(2 * var(--padding, var(--space-m, 8px)));\n background: var(--surface-4);\n color: var(--surface-4-text);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-m, 6px);\n font-family: inherit;\n font-size: inherit;\n font-weight: 500;\n white-space: nowrap;\n max-width: 240px;\n overflow: hidden;\n text-overflow: ellipsis;\n box-shadow: var(--shadow-m);\n }\n .ixfx-drag-ghost ixfx-icon {\n flex-shrink: 0;\n }\n `;\n document.head.appendChild(style);\n}\n\nexport interface DragGhost {\n /** Position the ghost at (x, y) viewport coords, anchored around the source center. */\n move: (x: number, y: number) => void;\n /** Remove the ghost from the DOM. Idempotent. */\n destroy: () => void;\n /** The underlying ghost element (rarely needed outside this module). */\n readonly element: HTMLElement;\n}\n\nexport interface CreateDragGhostOptions {\n /** Content element to mount inside the ghost. Will be appended on create. */\n content: HTMLElement;\n /**\n * Anchor element — used to find the theme container and to compute the\n * initial offset so the ghost appears centered under the source on first move.\n */\n anchor: HTMLElement;\n /** Optional class name appended to the ghost wrapper for custom styling. */\n className?: string;\n}\n\n/**\n * Create a theme-aware floating ghost element.\n *\n * The ghost is appended to the closest `.theme-dark` / `.theme-light` ancestor\n * of `anchor`, falling back to `document.body`. This preserves CSS variable\n * inheritance for theming.\n */\nexport function createDragGhost(opts: CreateDragGhostOptions): DragGhost {\n injectGhostStyles();\n\n const ghost = document.createElement(`div`);\n ghost.className = `ixfx-drag-ghost`;\n if (opts.className)\n ghost.classList.add(opts.className);\n ghost.appendChild(opts.content);\n\n // Place ghost off-screen until first `move()` call\n ghost.style.transform = `translate3d(-9999px, -9999px, 0)`;\n\n const targetDoc = opts.anchor.ownerDocument;\n const themeContainer = opts.anchor.closest(`.theme-dark, .theme-light`);\n if (themeContainer) {\n themeContainer.appendChild(ghost);\n } else {\n targetDoc.body.appendChild(ghost);\n }\n\n // Anchor offset: distance from the source's top-left to its center.\n const anchorRect = opts.anchor.getBoundingClientRect();\n const offsetX = anchorRect.width / 2;\n const offsetY = anchorRect.height / 2;\n\n return {\n element: ghost,\n move(x: number, y: number): void {\n ghost.style.transform = `translate3d(${x - offsetX}px, ${y - offsetY}px, 0)`;\n },\n destroy(): void {\n ghost.remove();\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;AAYA,IAAI,iBAAiB;AAErB,SAAS,oBAA0B;CACjC,IAAI,gBACF;CACF,iBAAiB;CACjB,MAAM,QAAQ,SAAS,cAAc,OAAO;CAC5C,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8BpB,SAAS,KAAK,YAAY,KAAK;AACjC;;;;;;;;AA8BA,SAAgB,gBAAgB,MAAyC;CACvE,kBAAkB;CAElB,MAAM,QAAQ,SAAS,cAAc,KAAK;CAC1C,MAAM,YAAY;CAClB,IAAI,KAAK,WACP,MAAM,UAAU,IAAI,KAAK,SAAS;CACpC,MAAM,YAAY,KAAK,OAAO;CAG9B,MAAM,MAAM,YAAY;CAExB,MAAM,YAAY,KAAK,OAAO;CAC9B,MAAM,iBAAiB,KAAK,OAAO,QAAQ,2BAA2B;CACtE,IAAI,gBACF,eAAe,YAAY,KAAK;MAEhC,UAAU,KAAK,YAAY,KAAK;CAIlC,MAAM,aAAa,KAAK,OAAO,sBAAsB;CACrD,MAAM,UAAU,WAAW,QAAQ;CACnC,MAAM,UAAU,WAAW,SAAS;CAEpC,OAAO;EACL,SAAS;EACT,KAAK,GAAW,GAAiB;GAC/B,MAAM,MAAM,YAAY,eAAe,IAAI,QAAQ,MAAM,IAAI,QAAQ;EACvE;EACA,UAAgB;GACd,MAAM,OAAO;EACf;CACF;AACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"editable-label-rzXkjf1H.d.ts","names":[],"sources":["../src/editable-label/editable-label.ts"],"mappings":";;KAoCY;KACA;KACA;KAEA;WACD;;KAEC,2BAA2B,YAAY;cAGtC,sBAAsB;EACJ,MAAM;EACmB,WAAW;EACpC;EACe;EAChC;;EAG6B;;;;;;;;EASM,kBAAkB;;EAGV;;EAGG;;EAG1B,aAAa;;EAGb,aAAa;YAE1B;gBAEL,cAAc;;YAKlB;EAED;EAMA;YAQC;YACA;YACA;YACA;YAEA;UAOF;UAWA;YAOE;YAUA;;YAUA;YAWA;YAMA;YAMA;YAKA,iBAAkB,GAAG;YAgBrB,qBAAsB,GAAG;YAQzB;YAeA;YAMA;YAsBA;YAMA;YAcA;YAoBA,gBAAgB;UASlB;EAWC,wBAAM;EAgBN,QAAQ,SAAS;SA4BV,QAAQ;;QA8FlB;YACI;IACR,uBAAuB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"editable-label.js","names":["customElement"],"sources":["../src/editable-label/editable-label.ts"],"sourcesContent":["/**\n * <ixfx-editable-label> — inline editable text label.\n *\n * Two display modes:\n * label (default) — renders as plain text until clicked, then becomes an editable box.\n * editor — always renders as an editable box; becomes active on focus/click.\n *\n * Entry modes (filter characters as typed):\n * free (default) — no restrictions\n * text — alphabetical characters and spaces only\n * number — digits, decimal point, minus sign\n * percent — digits, decimal point, percent sign\n *\n * Properties (not attributes):\n * validator (value: string) => boolean — override commit validation; default uses entry-mode rules\n * formatter (value: string) => string — transform committed value for display\n *\n * Events:\n * input — CustomEvent<{ value: string }>, bubbles + composed; fired as value changes during editing\n * change — CustomEvent<{ value: string }>, bubbles + composed; fired when value is committed\n *\n * CSS variables:\n * --label-font-size defaults to var(--text-m, 12px)\n * --label-font-family defaults to var(--font-family, system-ui, sans-serif)\n * --label-color defaults to var(--surface-2-text)\n * --label-muted-color placeholder colour, defaults to var(--surface-muted-text)\n * --label-padding defaults to var(--space-xs, 3px) var(--space-s, 4px)\n * --label-radius defaults to var(--radius-s, 3px)\n * --label-align text alignment: left | center (default) | right\n */\nimport type { CSSResult, PropertyValues } from 'lit';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\n\nexport type EditableMode = `label` | `editor`;\nexport type EntryMode = `free` | `text` | `number` | `percent`;\nexport type DisplayTextLogic = `hidden` | `show` | `override` | `transient`;\n\nexport type EditableLabelChangeDetail = {\n readonly value: string;\n};\nexport type EditableLabelChangeEvent = CustomEvent<EditableLabelChangeDetail>;\n\n@customElement(`ixfx-editable-label`)\nexport class EditableLabel extends LitElement {\n @property({ reflect: true }) mode: EditableMode = `label`;\n @property({ attribute: `entry-mode`, reflect: true }) entryMode: EntryMode = `free`;\n @property({ reflect: true }) value = ``;\n @property({ type: Boolean, reflect: true }) disabled = false;\n @property() placeholder = ``;\n\n /** Override displayed text. Bypasses formatter and value. When editing, shows raw value. */\n @property({ attribute: `display-text` }) displayText?: string;\n\n /**\n * Controls when displayText is shown:\n * - 'hidden' (default): never use displayText\n * - 'show': show displayText instead of formatted value, but hide while editing; revert after disappearDelay\n * - 'override': always show displayText, even when editing\n * - 'transient': show displayText by default, switch to formatted value after appearDelay on hover/interaction; revert after disappearDelay\n */\n @property({ attribute: `display-text-logic` }) displayTextLogic: DisplayTextLogic = `hidden`;\n\n /** Delay before showing value in transient mode (ms). Default: 50 */\n @property({ type: Number, attribute: `appear-delay` }) appearDelay = 50;\n\n /** Delay before reverting to displayText after editing ends (ms). Default: 1000 */\n @property({ type: Number, attribute: `disappear-delay` }) disappearDelay = 1000;\n\n /** Override commit validation. Return true to accept, false to reject (reverts). */\n @property({ attribute: false }) validator?: (value: string) => boolean;\n\n /** Transform the committed value for display. Does not affect the stored value. */\n @property({ attribute: false }) formatter?: (value: string) => string;\n\n @state() protected _editing = false;\n\n protected get _contentEl(): HTMLElement | undefined {\n return this.renderRoot?.querySelector<HTMLElement>(`.content`) ?? undefined;\n }\n\n /** Snapshot of value taken when editing begins; restored on cancel. */\n protected _prevValue = ``;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener(`mouseenter`, this._onMouseEnter);\n this.addEventListener(`mouseleave`, this._onMouseLeave);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener(`mouseenter`, this._onMouseEnter);\n this.removeEventListener(`mouseleave`, this._onMouseLeave);\n this._clearTransientTimer();\n }\n\n // ── Transient display state ─────────────────────────────────────────────────\n protected _hovering = false;\n protected _transientShowingValue = false;\n protected _transientTimer: number | undefined = undefined;\n protected _showModeWaitingToHide = false;\n\n protected _clearTransientTimer(): void {\n if (this._transientTimer !== undefined) {\n clearTimeout(this._transientTimer);\n this._transientTimer = undefined;\n }\n }\n\n private _onMouseEnter = (): void => {\n if (this.displayTextLogic !== `transient`)\n return;\n this._hovering = true;\n this._clearTransientTimer();\n this._transientTimer = window.setTimeout(() => {\n this._transientShowingValue = true;\n this._requestDisplayUpdate();\n }, this.appearDelay);\n };\n\n private _onMouseLeave = (): void => {\n if (this.displayTextLogic !== `transient`)\n return;\n this._hovering = false;\n this._startTransientRevertTimer();\n };\n\n protected _startTransientRevertTimer(): void {\n this._clearTransientTimer();\n this._transientTimer = window.setTimeout(() => {\n if (!this._hovering && this.displayTextLogic === `transient`) {\n this._transientShowingValue = false;\n this._requestDisplayUpdate();\n }\n }, this.disappearDelay);\n }\n\n protected _requestDisplayUpdate(): void {\n if (!this._editing) {\n const el = this._contentEl;\n if (el) {\n el.textContent = this._getDisplayText();\n }\n }\n }\n\n /** Called by subclasses when user interacts (drag, keyboard, etc) to temporarily show value in transient mode */\n protected _onUserInteraction(): void {\n if (this.displayTextLogic !== `transient`)\n return;\n this._clearTransientTimer();\n this._transientTimer = window.setTimeout(() => {\n this._transientShowingValue = true;\n this._startTransientRevertTimer();\n this._requestDisplayUpdate();\n }, this.appearDelay);\n };\n\n protected _handleClick = (): void => {\n if (this.mode === `label` && !this.disabled && !this._editing) {\n this._beginEdit();\n }\n };\n\n protected _handleFocus = (): void => {\n if (this.mode === `editor` && !this.disabled && !this._editing) {\n this._beginEdit();\n }\n };\n\n protected _handleBlur = (): void => {\n if (this._editing)\n this._tryCommit();\n };\n\n protected _handleKeydown = (e: KeyboardEvent): void => {\n if (!this._editing)\n return;\n if (e.key === `Enter`) {\n e.preventDefault();\n this._tryCommit();\n if (this.mode === `editor`)\n this._contentEl?.blur();\n } else if (e.key === `Escape`) {\n e.preventDefault();\n this._cancelEdit();\n if (this.mode === `editor`)\n this._contentEl?.blur();\n }\n };\n\n protected _handleBeforeInput = (e: InputEvent): void => {\n if (e.inputType !== `insertText` || !e.data)\n return;\n if (!this._isAllowedInput(e.data)) {\n e.preventDefault();\n }\n };\n\n protected _handleInput = (): void => {\n if (!this._editing)\n return;\n\n const raw = this._contentEl?.textContent?.trim() ?? ``;\n\n this.dispatchEvent(new CustomEvent<EditableLabelChangeDetail>(`input`, {\n detail: { value: raw },\n bubbles: true,\n composed: true,\n }));\n };\n\n // ── Core logic ───────────────────────────────────────────────────────────\n\n protected _beginEdit(): void {\n this._prevValue = this.value;\n this._editing = true;\n this.removeAttribute(`invalid`);\n }\n\n protected _tryCommit(): void {\n let raw = this._contentEl?.textContent?.trim() ?? ``;\n if (this.entryMode === `percent`)\n raw = raw.replaceAll(`%`, ``).trim();\n const validate = this.validator ?? this._defaultValidator.bind(this);\n if (validate(raw)) {\n this.removeAttribute(`invalid`);\n const prev = this.value;\n this.value = raw;\n this._editing = false;\n if (raw !== prev) {\n this.dispatchEvent(new CustomEvent<EditableLabelChangeDetail>(`change`, {\n detail: { value: raw },\n bubbles: true,\n composed: true,\n }));\n }\n } else {\n this._cancelEdit();\n }\n }\n\n protected _cancelEdit(): void {\n this.value = this._prevValue;\n this._editing = false;\n this.removeAttribute(`invalid`);\n }\n\n protected _getDisplayText(): string {\n const useDisplayText = this._shouldUseDisplayText();\n if (useDisplayText && this.displayText !== undefined && this.displayText !== ``) {\n return this.displayText;\n }\n if (!this.value)\n return ``;\n if (this.formatter)\n return this.formatter(this.value);\n if (this.entryMode === `percent`)\n return `${this.value}%`;\n return this.value;\n }\n\n protected _shouldUseDisplayText(): boolean {\n if (this.displayTextLogic === `hidden`)\n return false;\n if (this.displayTextLogic === `override`)\n return true;\n if (this.displayTextLogic === `show`) {\n if (this._editing)\n return false;\n return this._showModeWaitingToHide;\n }\n if (this.displayTextLogic === `transient`) {\n if (this._editing)\n return false;\n if (this._transientShowingValue)\n return false;\n return true;\n }\n return false;\n }\n\n protected _isAllowedInput(char: string): boolean {\n switch (this.entryMode) {\n case `text`: return /^[a-z\\s]$/i.test(char);\n case `number`: return /^[\\d.\\-]$/.test(char);\n case `percent`: return /^[\\d.%]$/.test(char);\n default: return true;\n }\n }\n\n private _defaultValidator(value: string): boolean {\n switch (this.entryMode) {\n case `text`: return /^[a-z\\s]*$/i.test(value);\n case `number`: return value === `` || /^-?\\d*(?:\\.\\d*)?$/.test(value);\n case `percent`: return value === `` || /^\\d*(?:\\.\\d*)?$/.test(value);\n default: return true;\n } // asdf\n }\n\n // ── Render ───────────────────────────────────────────────────────────────\n\n override render() {\n const isEditor = this.mode === `editor`;\n return html`<div\n class=\"content\"\n contenteditable=${this._editing ? `plaintext-only` : `false`}\n data-placeholder=${this.placeholder}\n tabindex=${isEditor && !this._editing ? `0` : nothing}\n @click=${this._handleClick}\n @focus=${this._handleFocus}\n @blur=${this._handleBlur}\n @keydown=${this._handleKeydown}\n @beforeinput=${this._handleBeforeInput}\n @input=${this._handleInput}\n ></div>`;\n }\n\n override updated(changed: PropertyValues): void {\n super.updated(changed);\n if (changed.has(`_editing`) && this._editing) {\n const el = this._contentEl;\n if (el) {\n el.textContent = this.value;\n el.focus();\n _selectAll(el);\n }\n }\n // The text is never a Lit binding — `el.textContent = …` above would delete its\n // marker nodes and break the next render. It is managed imperatively (see _requestDisplayUpdate), so\n // a re-render alone does not refresh it. Refresh when display-affecting\n // properties change — e.g. a labelled wrapper toggling displayTextLogic\n // while its slider is dragged. _requestDisplayUpdate() no-ops while editing.\n if (\n (changed.has(`_editing`) && !this._editing)\n || changed.has(`displayTextLogic`)\n || changed.has(`displayText`)\n || changed.has(`formatter`)\n || changed.has(`value`)\n ) {\n this._requestDisplayUpdate();\n }\n }\n\n // ── Styles ───────────────────────────────────────────────────────────────\n\n static override styles: CSSResult[] = [themeFallbacks, css`\n :host {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n --_font-size: var(--label-font-size, var(--text-m, 12px));\n --_font-family: var(--label-font-family, var(--font-family, system-ui, sans-serif));\n --_color: var(--label-color, var(--surface-2-text));\n --_muted: var(--label-muted-color, var(--surface-muted-text, oklch(55% 0.02 240)));\n --_padding: var(--label-padding, var(--space-xs, 3px) var(--space-s, 4px));\n --_radius: var(--label-radius, var(--radius-s, 3px));\n --_align: var(--label-align, center);\n --_min-width: var(--label-min-width, 1ch);\n }\n\n .content {\n box-sizing: border-box;\n width: 100%;\n text-align: var(--_align);\n outline: none;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n min-width: var(--_min-width);\n font-family: var(--_font-family);\n font-size: var(--_font-size);\n color: var(--_color);\n padding: var(--_padding);\n border: 1px solid transparent;\n border-radius: var(--_radius);\n cursor: pointer;\n transition:\n background var(--transition, 0.15s ease-out),\n border-color var(--transition, 0.15s ease-out);\n }\n\n /* Remove overflow clipping while editing so the cursor is never hidden */\n .content[contenteditable=\"plaintext-only\"] {\n overflow: visible;\n text-overflow: clip;\n }\n\n /* ── Label mode ── */\n :host([mode=\"label\"]) .content {\n background: transparent;\n }\n\n :host([mode=\"label\"]) .content[contenteditable=\"plaintext-only\"] {\n background: var(--surface-4, oklch(22% 0.02 240));\n border: var(--border, 1px solid oklch(25% 0.02 240));\n cursor: text;\n }\n\n /* ── Editor mode — always shows box ── */\n :host([mode=\"editor\"]) .content {\n background: var(--surface-4, oklch(22% 0.02 240));\n border: var(--border, 1px solid oklch(25% 0.02 240));\n }\n\n :host([mode=\"editor\"]) .content[contenteditable=\"plaintext-only\"] {\n border-color: var(--accent, oklch(60% 0.15 140));\n cursor: text;\n }\n\n /* ── Placeholder ── */\n .content:empty::before {\n content: attr(data-placeholder);\n color: var(--_muted);\n pointer-events: none;\n }\n\n /* ── Invalid ── */\n :host([invalid]) .content {\n border-color: var(--error, oklch(60% 0.15 20));\n }\n\n /* ── Disabled ── */\n :host([disabled]) .content {\n opacity: var(--disabled-opacity, 0.5);\n cursor: not-allowed;\n pointer-events: none;\n }\n `];\n}\n\nfunction _selectAll(el: HTMLElement): void {\n const range = document.createRange();\n range.selectNodeContents(el);\n const sel = window.getSelection();\n sel?.removeAllRanges();\n sel?.addRange(range);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-editable-label': EditableLabel;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fallbacks-DQ_5OsmR.js","names":[],"sources":["../src/styles/fallbacks.ts"],"sourcesContent":["import { css } from 'lit';\n\n/**\n * Default fallback values for theme CSS variables.\n *\n * Uses `@property` to register each variable with an initial value that acts\n * as a fallback. This means:\n * - If the theme CSS (`src/style.css`) is loaded, its `:root` values cascade\n * in and override these defaults.\n * - If no theme CSS is loaded, these initial values ensure components still\n * have visible backgrounds, text colours, etc.\n *\n * `@property` registration is document-global — it is not scoped per shadow\n * root — so this is registered exactly once (via `_registerThemeFallbacksOnce`\n * below) rather than adopted into every component's shadow-root stylesheet.\n * Registering the same `@property` rule repeatedly across many shadow roots\n * causes Chrome to log \"Ignored @property rule\" for every repeat.\n */\nconst _themeFallbacksCss = css`\n @property --surface-0 {\n syntax: '<color>';\n inherits: true;\n initial-value: oklch(5% 0.02 240);\n }\n @property --surface-1 {\n syntax: '<color>';\n inherits: true;\n initial-value: oklch(8% 0.02 240);\n }\n @property --surface-2 {\n syntax: '<color>';\n inherits: true;\n initial-value: oklch(12% 0.02 240);\n }\n @property --surface-2-text {\n syntax: '<color>';\n inherits: true;\n initial-value: #fff;\n }\n @property --surface-3 {\n syntax: '<color>';\n inherits: true;\n initial-value: oklch(15% 0.02 240);\n }\n @property --surface-3-text {\n syntax: '<color>';\n inherits: true;\n initial-value: oklch(75% 0.02 240);\n }\n @property --surface-4 {\n syntax: '<color>';\n inherits: true;\n initial-value: oklch(22% 0.02 240);\n }\n @property --surface-4-text {\n syntax: '<color>';\n inherits: true;\n initial-value: #fff;\n }\n @property --surface-5 {\n syntax: '<color>';\n inherits: true;\n initial-value: oklch(19% 0.02 240);\n }\n @property --surface-5-text {\n syntax: '<color>';\n inherits: true;\n initial-value: #fff;\n }\n @property --surface-6 {\n syntax: '<color>';\n inherits: true;\n initial-value: oklch(35% 0.02 240);\n }\n @property --surface-6-text {\n syntax: '<color>';\n inherits: true;\n initial-value: #fff;\n }\n @property --surface-muted-text {\n syntax: '<color>';\n inherits: true;\n initial-value: oklch(55% 0.02 240);\n }\n @property --content {\n syntax: '<color>';\n inherits: true;\n initial-value: oklch(10% 0.01 240);\n }\n @property --content-text {\n syntax: '<color>';\n inherits: true;\n initial-value: #fff;\n }\n @property --accent {\n syntax: '<color>';\n inherits: true;\n initial-value: oklch(60% 0.15 140);\n }\n @property --accent-text {\n syntax: '<color>';\n inherits: true;\n initial-value: #fff;\n }\n @property --error {\n syntax: '<color>';\n inherits: true;\n initial-value: oklch(60% 0.15 20);\n }\n @property --error-text {\n syntax: '<color>';\n inherits: true;\n initial-value: #fff;\n }\n @property --border {\n syntax: '*';\n inherits: true;\n initial-value: 1px solid oklch(25% 0.02 240);\n }\n @property --border-subtle {\n syntax: '*';\n inherits: true;\n initial-value: 1px solid oklch(18% 0.02 240);\n }\n @property --disabled-opacity {\n syntax: '<number>';\n inherits: true;\n initial-value: 0.5;\n }\n @property --transition {\n syntax: '<time>';\n inherits: true;\n initial-value: 0.15s;\n }\n @property --prominence-idle-opacity {\n syntax: '<number>';\n inherits: true;\n initial-value: 0.6;\n }\n @property --prominence-idle-saturate {\n syntax: '<number>';\n inherits: true;\n initial-value: 0.4;\n }\n @property --prominence-tickled-opacity {\n syntax: '<number>';\n inherits: true;\n initial-value: 0.85;\n }\n @property --prominence-tickled-saturate {\n syntax: '<number>';\n inherits: true;\n initial-value: 0.8;\n }\n @property --prominence-disabled-opacity {\n syntax: '<number>';\n inherits: true;\n initial-value: 0.3;\n }\n @property --prominence-disabled-saturate {\n syntax: '<number>';\n inherits: true;\n initial-value: 0.1;\n }\n @property --crumb-item-bg {\n syntax: '<color>';\n inherits: true;\n initial-value: transparent;\n }\n @property --crumb-item-bg-tickled {\n syntax: '<color>';\n inherits: true;\n initial-value: var(--surface-5);\n }\n @property --crumb-item-text-tickled {\n syntax: '<color>';\n inherits: true;\n initial-value: inherit;\n }\n @property --crumb-item-border {\n syntax: '*';\n inherits: true;\n initial-value: 1px solid transparent;\n }\n @property --crumb-item-border-tickled {\n syntax: '<color>';\n inherits: true;\n initial-value: var(--accent);\n }\n @property --crumb-item-padding {\n syntax: '*';\n inherits: true;\n initial-value: var(--space-xs);\n }\n @property --crumb-item-border-radius {\n syntax: '<length>';\n inherits: true;\n initial-value: var(--radius-m);\n }\n @property --crumb-item-gap {\n syntax: '<length>';\n inherits: true;\n initial-value: var(--space-xs);\n }\n @property --crumb-separator {\n syntax: '<color>';\n inherits: true;\n initial-value: var(--surface-muted-text);\n }\n @property --crumb-truncate-min-width {\n syntax: '<length>';\n inherits: true;\n initial-value: 5ch;\n }\n @property --space-xs {\n syntax: '<length>';\n inherits: true;\n initial-value: 3px;\n }\n @property --space-s {\n syntax: '<length>';\n inherits: true;\n initial-value: 4px;\n }\n @property --space-m {\n syntax: '<length>';\n inherits: true;\n initial-value: 8px;\n }\n @property --space-l {\n syntax: '<length>';\n inherits: true;\n initial-value: 12px;\n }\n @property --space-xl {\n syntax: '<length>';\n inherits: true;\n initial-value: 16px;\n }\n @property --space-2xl {\n syntax: '<length>';\n inherits: true;\n initial-value: 20px;\n }\n @property --text-xs {\n syntax: '<length>';\n inherits: true;\n initial-value: 9px;\n }\n @property --text-s {\n syntax: '<length>';\n inherits: true;\n initial-value: 11px;\n }\n @property --text-m {\n syntax: '<length>';\n inherits: true;\n initial-value: 12px;\n }\n @property --text-l {\n syntax: '<length>';\n inherits: true;\n initial-value: 13px;\n }\n @property --text-xl {\n syntax: '<length>';\n inherits: true;\n initial-value: 16px;\n }\n @property --text-2xl {\n syntax: '<length>';\n inherits: true;\n initial-value: 20px;\n }\n @property --font-weight-bold {\n syntax: '<number>';\n inherits: true;\n initial-value: 600;\n }\n @property --radius-s {\n syntax: '<length>';\n inherits: true;\n initial-value: 3px;\n }\n @property --radius-m {\n syntax: '<length>';\n inherits: true;\n initial-value: 4px;\n }\n @property --radius-l {\n syntax: '<length>';\n inherits: true;\n initial-value: 6px;\n }\n @property --radius-xl {\n syntax: '<length>';\n inherits: true;\n initial-value: 8px;\n }\n @property --shadow-m {\n syntax: '*';\n inherits: true;\n initial-value: 0 4px 12px rgba(0, 0, 0, 0.3);\n }\n @property --shadow-l {\n syntax: '*';\n inherits: true;\n initial-value: 0 4px 24px rgba(0, 0, 0, 0.5);\n }\n @property --deboss-3 {\n syntax: '*';\n inherits: true;\n initial-value:\n inset 1px 1px 1px 1px color-mix(in oklch, oklch(8% 0.02 240) 60%, transparent),\n inset -1px -1px 1px 1px color-mix(in oklch, oklch(15% 0.02 240) 50%, transparent),\n -2px -2px 1px 0px color-mix(in oklch, oklch(12% 0.02 240) 30%, transparent);\n }\n @property --emboss-3 {\n syntax: '*';\n inherits: true;\n initial-value:\n inset 1px 1px 1px 1px color-mix(in oklch, oklch(22% 0.02 240) 30%, transparent),\n inset -1px -1px 1px 1px color-mix(in oklch, oklch(12% 0.02 240) 20%, transparent),\n 2px 2px 1px 0px color-mix(in oklch, oklch(12% 0.02 240) 30%, transparent);\n }\n @property --item-bg {\n syntax: '<color>';\n inherits: true;\n initial-value: transparent;\n }\n @property --item-bg-tickled {\n syntax: '<color>';\n inherits: true;\n initial-value: oklch(19% 0.02 240);\n }\n @property --item-bg-selected {\n syntax: '<color>';\n inherits: true;\n initial-value: oklch(60% 0.15 140);\n }\n @property --item-bg-selected-tickled {\n syntax: '<color>';\n inherits: true;\n initial-value: color-mix(in oklch, oklch(60% 0.15 140) 80%, oklch(0% 0 0));\n }\n @property --item-text-tickled {\n syntax: '<color>';\n inherits: true;\n initial-value: #fff;\n }\n @property --item-text-selected {\n syntax: '<color>';\n inherits: true;\n initial-value: #fff;\n }\n @property --item-border {\n syntax: '*';\n inherits: true;\n initial-value: 1px solid oklch(19% 0.02 240);\n }\n @property --item-border-tickled {\n syntax: '*';\n inherits: true;\n initial-value: 1px solid oklch(19% 0.02 240);\n }\n @property --item-border-selected {\n syntax: '*';\n inherits: true;\n initial-value: 1px dashed oklch(60% 0.15 140);\n }\n @property --item-border-active {\n syntax: '*';\n inherits: true;\n initial-value: 2px solid oklch(60% 0.15 140);\n }\n @property --item-border-dragged {\n syntax: '*';\n inherits: true;\n initial-value: 2px dotted color-mix(in oklch, oklch(60% 0.15 140) 80%, transparent);\n }\n @property --item-border-disabled {\n syntax: '*';\n inherits: true;\n initial-value: 1px solid oklch(22% 0.02 240);\n }\n @property --item-padding {\n syntax: '*';\n inherits: true;\n initial-value: 4px 8px;\n }\n @property --item-border-radius {\n syntax: '<length>';\n inherits: true;\n initial-value: 4px;\n }\n @property --item-icon-spacing {\n syntax: '<length>';\n inherits: true;\n initial-value: 4px;\n }\n`;\n\nlet _themeFallbacksRegistered = false;\n\nfunction _registerThemeFallbacksOnce(): void {\n if (_themeFallbacksRegistered || typeof document === `undefined`)\n return;\n _themeFallbacksRegistered = true;\n const styleEl = document.createElement(`style`);\n styleEl.textContent = _themeFallbacksCss.cssText;\n document.head.append(styleEl);\n}\n\n_registerThemeFallbacksOnce();\n\n/**\n * Spread this into any component whose styles reference theme variables.\n * It is an empty stylesheet — the actual `@property` rules are registered\n * once at the document level as a side effect of importing this module — so\n * this exists only to keep the familiar `static styles = [themeFallbacks, ...]`\n * pattern working across all consuming components.\n */\nexport const themeFallbacks = css``;\n"],"mappings":";;;;;;;;;;;;;;;;;;AAkBA,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgY9B,IAAI,4BAA4B;AAEhC,SAAS,8BAAoC;CAC3C,IAAI,6BAA6B,OAAO,aAAa,aACnD;CACF,4BAA4B;CAC5B,MAAM,UAAU,SAAS,cAAc,OAAO;CAC9C,QAAQ,cAAc,mBAAmB;CACzC,SAAS,KAAK,OAAO,OAAO;AAC9B;AAEA,4BAA4B;;;;;;;;AAS5B,MAAa,iBAAiB,GAAG"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"flat-list-Ohxqsy0g.d.ts","names":[],"sources":["../src/flat-list/types.ts","../src/flat-list/flat-list.ts"],"mappings":";;;;;;;;;KAGY;KAEA;;WAED;;WAEA;;WAEA,MAAM;;WAEN;;KAGC;WACD,UAAU,YAAY;WACtB,cAAc;WACd,UAAU,YAAY;;KAGrB;WACD,MAAM;;KAGL;;WAED,MAAM;WACN,cAAc;;KAGb;;WAED,MAAM;;WAEN,gBAAgB;WAChB;WACA;;KAGC;WACD,MAAM;WACN;;KAGC;WACD,MAAM;;KAGL,wBAAwB,YAAY;KACpC,sBAAsB,YAAY;KAClC,wBAAwB,YAAY;KAEpC,oBAAoB,YAAY;KAChC,2BAA2B,YAAY;KACvC,0BAA0B,YAAY;KACtC,0BAA0B,YAAY;UAEjC;EACf,sBAAsB;EACtB,oBAAoB;EACpB,sBAAsB;EACtB,kBAAkB;EAClB,0BAA0B;EAC1B,yBAAyB;EACzB,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cCkFd,wBAAwB;;EAEnC,MAAM;EAGN,OAAO;;EAIP;;EAIA,cAAc;EAGd,iBAAiB;;EAIjB,QAAQ,GAAG,UAAU,GAAG;EAGxB,aAAa;EAGb,eAAe;EAGf,iBAAiB;EAGjB;EAGA;EAGA;;EAIA;;;;;EAOA,WAAW,MAAM,UAAU,cAAc;;;;;;EAQzC,gBAAgB,eAAe,MAAM;;EAIrC;;EAIA;;EAIA;EAGA;EAGA;;EAIA;;UAIQ;;UAGS;UAEA;UACA;;MAcb,QAAQ;;MAKR,YAAY;;EAKhB,SAAS,mBAAmB,OAAO;;;;;;;EAUnC,UAAU;;MAQN,eAAe;MAIf,iBAAiB,YAAY;;EAWjC,WAAW;;EASX,aAAa;;EASb;EAqBS;YAQU,WAAW,SAAS;YAyBpB,QAAQ,SAAS;YAySjB,wBAAM;SAuDT,sBAAM;;QAqGhB;YACI;IACR,kBAAkB;;;UAIL;EACf,iBAAiB,gBAAgB,yBAC/B,MAAM,GACN,WAAW,MAAM,iBAAiB,OAAO,wBAAwB,aACjE,oBAAoB;EAEtB,iBACE,cACA,UAAU,oCACV,oBAAoB"}
|
package/dist/flat-list.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"flat-list.js","names":["#nodeForElement","#nodeForKey","#selected","#root","#setPath","#pendingSelectKey","#settleList","#renderRow","#onChevronClick","#pendingFocusKey","#lastPath","#direction","#modelUnsubscribe","#loadController","#loadingNode","#refreshRows","#applyMarked","#load","#applyRows","#onCrumbSelect","#onToolbarSlotChange","#renderEditableRow","#renderPlainRow","#renderIcon","#renderBadge","#canDropOn","#validateEditKey","#onListDragOver","#onListDrop","#onListContextMenu","#onListEditCommit","#onListEditCancel","#onListSelect","#onListActivate","#onKeyDown","#syncFocusVisible","customElement"],"sources":["../src/flat-list/flat-list.ts"],"sourcesContent":["/* eslint-disable ts/no-unsafe-declaration-merging */\nimport type { PropertyValues } from 'lit';\nimport type { TreeDataModel } from '../common/tree-data-model.js';\nimport type { LoadChildrenCallback, TreeFilterPredicate, TreeNode } from '../common/types.js';\nimport type { ListInteractionMode, ListSelectDetail, ListSelectionMode } from '../interaction/list-selection-types.js';\nimport type { ListContextMenuDetail, ListDropDetail, ListEditCancelDetail, ListEditCommitDetail } from '../vertical-list/types.js';\nimport type { VerticalListElement } from '../vertical-list/vertical-list.js';\nimport type {\n FlatListActivateDetail,\n FlatListBranchOrder,\n FlatListContextMenuDetail,\n FlatListDropDetail,\n FlatListEditCancelDetail,\n FlatListEditCommitDetail,\n FlatListElementEventMap,\n FlatListNavigateDetail,\n FlatListSelectDetail,\n} from './types.js';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { collectDataResult } from '../common/data-provider.js';\nimport { appearanceAbsent, appearanceColor } from '../common/item-appearance.js';\nimport { TickledController } from '../interaction/tickled-controller.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport '../crumbs/crumb-navigation.js';\nimport '../icons/icon.js';\nimport '../vertical-list/vertical-list.js';\n\nexport type {\n FlatListActivateDetail,\n FlatListActivateEvent,\n FlatListBranchOrder,\n FlatListContextMenuDetail,\n FlatListContextMenuEvent,\n FlatListDropDetail,\n FlatListDropEvent,\n FlatListEditCancelDetail,\n FlatListEditCancelEvent,\n FlatListEditCommitDetail,\n FlatListEditCommitEvent,\n FlatListElementEventMap,\n FlatListNavigateDetail,\n FlatListNavigateEvent,\n FlatListSelectDetail,\n FlatListSelectEvent,\n} from './types.js';\n\n/** One row handed to the inner list: the node plus its (cached) branch-ness. */\ntype FlatRow = {\n readonly key: string;\n readonly node: TreeNode;\n readonly branch: boolean;\n};\n\n/**\n * A node with children, or whose children are still to be loaded.\n * `isLeaf: false` forces a branch even when `children` is `[]` (an empty\n * folder that can still be entered); `isLeaf: true` forces a leaf.\n */\nfunction isBranch(node: TreeNode): boolean {\n return node.item.isLeaf === false || (node.item.isLeaf !== true && node.children?.length !== 0);\n}\n\nfunction sameKeys(a: readonly string[], b: readonly string[]): boolean {\n return a.length === b.length && a.every((k, i) => k === b[i]);\n}\n\nfunction sameNodes(a: readonly FlatRow[], b: readonly FlatRow[]): boolean {\n return a.length === b.length && a.every((row, i) => row.node === b[i]!.node && row.branch === b[i]!.branch);\n}\n\n/**\n * Walk `keys` down from `root`, stopping at the first key that no longer\n * resolves. Returns the nodes visited (root first), so the valid path is\n * `nodes.length - 1` keys long.\n */\nfunction resolvePath(root: TreeNode | undefined, keys: readonly string[]): TreeNode[] {\n if (!root)\n return [];\n const nodes = [root];\n for (const key of keys) {\n const next = nodes.at(-1)!.children?.find(n => n.item.key === key);\n if (!next)\n break;\n nodes.push(next);\n }\n return nodes;\n}\n\n/** Key path (excluding root) to `target`, or `undefined` if it is not in the loaded tree. */\nfunction findKeyPath(root: TreeNode, target: TreeNode): string[] | undefined {\n if (root === target)\n return [];\n for (const child of root.children ?? []) {\n const sub = findKeyPath(child, target);\n if (sub)\n return [child.item.key, ...sub];\n }\n return undefined;\n}\n\nfunction orderRows(\n children: readonly TreeNode[],\n branchOrder: FlatListBranchOrder,\n sort: ((a: TreeNode, b: TreeNode) => number) | undefined,\n): FlatRow[] {\n const rows = children.map(node => ({ key: node.item.key, node, branch: isBranch(node) }));\n const sorted = sort ? [...rows].sort((a, b) => sort(a.node, b.node)) : rows;\n if (branchOrder === `mixed`)\n return sorted;\n // Array.prototype.filter is stable, so the sort/source order holds within each half.\n return [...sorted.filter(r => r.branch), ...sorted.filter(r => !r.branch)];\n}\n\n/**\n * Navigates a tree inside one flat list. Each level shows its branches and\n * leaves together in an `ixfx-vertical-list`; entering a branch swaps the list\n * for that branch's children, and an `ixfx-crumb-navigation` pinned above the\n * scroll area shows the path and jumps back up.\n *\n * Uses the same `TreeNode` / `TreeDataModel` data as `ixfx-crumb-navigation`\n * and `ixfx-tree-list`. As in crumb-navigation, lazily loaded children are\n * written back to `node.children`.\n *\n * Selection and keyboard behaviour is the inner list's. On top of that:\n * double-click / Enter / ArrowRight enter the cursor branch;\n * ArrowLeft / Backspace go up. Selection is cleared on every level change.\n *\n * Events (all bubble, composed)\n * - `flat-list-navigate` `{ path, previousPath, node, direction }`\n * - `flat-list-select` `{ selected: Set<TreeNode>, selectedKeys, previous }`\n * - `flat-list-activate` `{ node }` — a leaf was double-clicked / Enter pressed\n * The inner list's own `list-*` events also cross the shadow boundary.\n *\n * CSS variables (others, e.g. `--list-item-height`, pass through to the list)\n * --flat-list-bg: var(--list-bg, var(--surface-3));\n * --flat-list-text: var(--list-text, var(--surface-3-text));\n * --flat-list-border: var(--list-border, var(--border));\n * --flat-list-radius: var(--list-radius, var(--radius-s));\n * --flat-list-crumb-padding: var(--space-xs);\n * --flat-list-crumb-font-size: var(--text-s);\n * --flat-list-toolbar-gap: var(--space-xs); // between the crumbs and slotted toolbar items\n * --flat-list-chevron-gap: 0.4em; // space after the branch chevron\n * --flat-list-marked-bg / --flat-list-marked-bar: the `marked-key` row\n * --flat-list-empty-text: var(--surface-muted-text);\n */\n@customElement(`ixfx-flat-list`)\nexport class FlatListElement extends LitElement {\n @property({ attribute: false })\n root: TreeNode | undefined;\n\n @property({ attribute: false })\n model: TreeDataModel | undefined;\n\n /** Keys from the root (excluded) to the level being shown. */\n @property({ attribute: false })\n path: readonly string[] = [];\n\n /** Lazily loads a branch's children when `node.children` is `undefined`. */\n @property({ attribute: false })\n loadChildren: LoadChildrenCallback | undefined;\n\n @property({ attribute: false })\n filterPredicate: TreeFilterPredicate | undefined;\n\n /** Orders nodes within the level (within each half when `branchOrder` is `first`). */\n @property({ attribute: false })\n sort: ((a: TreeNode, b: TreeNode) => number) | undefined;\n\n @property({ type: String, attribute: `branch-order`, reflect: true })\n branchOrder: FlatListBranchOrder = `first`;\n\n @property({ type: String, attribute: `selection-mode` })\n selectionMode: ListSelectionMode = `single`;\n\n @property({ type: String, attribute: `interaction-mode` })\n interactionMode: ListInteractionMode = `standard`;\n\n @property({ type: String, attribute: `item-wrap` })\n itemWrap: `stop` | `wrap` = `stop`;\n\n @property({ type: String, attribute: `search-modes`, reflect: true })\n searchModes: string | undefined;\n\n @property({ type: Boolean, attribute: `items-draggable`, reflect: true })\n itemsDraggable = false;\n\n /** Rows (and empty space) accept native drops. See `flat-list-drop`. */\n @property({ type: Boolean, attribute: `items-droppable`, reflect: true })\n itemsDroppable = false;\n\n /**\n * Refuse a drop before it is highlighted or reported. `node` is the row under\n * the drag, or the current level's node over empty space.\n */\n @property({ attribute: false })\n canDrop: ((node: TreeNode, dataTransfer: DataTransfer) => boolean) | undefined;\n\n /**\n * Opt in to in-place rename. Called with the typed text and the node when\n * the user commits; return `false` to reject it. Without it nothing can be\n * renamed and rows are plain text. Rows must also have `item.editable`.\n */\n @property({ attribute: false })\n validateEdit: ((value: string, node: TreeNode) => boolean) | undefined;\n\n /** Key of a node to keep visibly marked across level changes (unlike selection). */\n @property({ type: String, attribute: `marked-key`, reflect: true })\n markedKey: string | undefined;\n\n /** Only render the visible rows. Needs `itemHeight`. See `ixfx-vertical-list`. */\n @property({ type: Boolean, reflect: true })\n virtualize = false;\n\n /** Fixed row height in px, required for `virtualize`. */\n @property({ type: Number, attribute: `item-height` })\n itemHeight = 0;\n\n @property({ type: Boolean, attribute: `with-up`, reflect: true })\n withUp = true;\n\n @property({ type: Boolean, attribute: `hide-root`, reflect: true })\n hideRoot = false;\n\n /** Shown when the current level has no children. */\n @property({ type: String, attribute: `empty-text` })\n emptyText = `Empty`;\n\n /** Mirrors the inner list's `:focus-visible`, so the ring can go round the whole component. */\n @property({ type: Boolean, reflect: true, attribute: `data-focus-visible` })\n private _focusVisible = false;\n\n /** Whether anything is slotted into the toolbar; an empty toolbar takes no space. */\n @state() private _hasToolbar = false;\n\n @state() private _rows: readonly FlatRow[] = [];\n @state() private _loading = false;\n\n #modelUnsubscribe: (() => void) | undefined;\n #loadController: AbortController | undefined;\n #loadingNode: TreeNode | undefined;\n #lastPath: readonly string[] = [];\n /** Branch key to put the cursor on after the next rows arrive (set when going up). */\n #pendingFocusKey: string | undefined;\n #selected: ReadonlySet<TreeNode> = new Set();\n #direction: FlatListNavigateDetail[`direction`] = `jump`;\n /** Leaf key to select once the list shows its level (set when a leaf crumb is chosen). */\n #pendingSelectKey: string | undefined;\n\n /** The inner list, for registry / search commands and other advanced use. */\n get list(): VerticalListElement | undefined {\n return this.renderRoot.querySelector(`ixfx-vertical-list`) ?? undefined;\n }\n\n /** Command registry carrying the inner list's `list.search.*` commands. */\n get registry(): VerticalListElement[`registry`] {\n return this.list?.registry;\n }\n\n /** Run a command on the inner list, e.g. `dispatch('list.search.filter')`. */\n dispatch(commandId: string, args?: Record<string, unknown>): void {\n this.list?.dispatch(commandId, args);\n }\n\n /**\n * Rename a row in place. Needs `validateEdit`, and only rows whose\n * `item.editable` is true can be edited. Ends with `flat-list-edit-commit` or `flat-list-edit-cancel`; the\n * label is not rewritten — update the tree in response. Returns false if\n * the row is unknown, not editable, or not on screen.\n */\n beginEdit(key: string): boolean {\n const node = this.#nodeForKey(key);\n if (!this.validateEdit || !node?.item.editable)\n return false;\n return this.list?.beginEdit(key) ?? false;\n }\n\n /** The node whose children are listed. */\n get currentNode(): TreeNode | undefined {\n return resolvePath(this.#root, this.path).at(-1);\n }\n\n get selectedNodes(): ReadonlySet<TreeNode> {\n return this.#selected;\n }\n\n get #root(): TreeNode | undefined {\n return this.model?.root ?? this.root;\n }\n\n // --- Navigation API ---\n\n /** Show the children of the node at this key path. Returns false if the path does not resolve. */\n navigateTo(keys: readonly string[]): boolean {\n const nodes = resolvePath(this.#root, keys);\n if (nodes.length !== keys.length + 1)\n return false;\n this.#setPath(keys, `jump`);\n return true;\n }\n\n /** Enter the child branch with this key. */\n navigateInto(key: string): boolean {\n const node = this.currentNode?.children?.find(n => n.item.key === key);\n if (!node || !isBranch(node))\n return false;\n this.#setPath([...this.path, key], `into`);\n return true;\n }\n\n /** Move to the parent level. Returns false at the root. */\n navigateUp(): boolean {\n if (this.path.length === 0)\n return false;\n this.#pendingFocusKey = this.path.at(-1);\n this.#setPath(this.path.slice(0, -1), `up`);\n return true;\n }\n\n #setPath(path: readonly string[], direction: FlatListNavigateDetail[`direction`]): void {\n if (sameKeys(path, this.path))\n return;\n this.#lastPath = this.path;\n this.#direction = direction;\n // A search over the old level makes no sense on the new one.\n this.list?.search.close();\n this.list?.clearSelection();\n this.path = path;\n }\n\n // --- Lifecycle ---\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#modelUnsubscribe?.();\n this.#modelUnsubscribe = undefined;\n this.#loadController?.abort();\n this.#loadingNode = undefined;\n }\n\n protected override willUpdate(changed: PropertyValues): void {\n if (changed.has(`model`)) {\n this.#modelUnsubscribe?.();\n this.#modelUnsubscribe = this.model?._subscribe((event) => {\n if (event.type === `invalidate` && event.key === this.currentNode?.item.key) {\n const node = this.currentNode;\n if (node)\n node.children = undefined;\n }\n this.requestUpdate();\n // Model data changed in place; recompute rows even though no property did.\n this.#refreshRows(true);\n });\n }\n\n // Keep `path` valid if the tree changed underneath it.\n const valid = resolvePath(this.#root, this.path).length - 1;\n if (this.#root && valid < this.path.length)\n this.path = this.path.slice(0, valid);\n\n const rowInputs = [`root`, `model`, `path`, `branchOrder`, `sort`, `filterPredicate`, `loadChildren`] as const;\n if (rowInputs.some(p => changed.has(p)))\n this.#refreshRows(changed.has(`root`) || changed.has(`model`) || changed.has(`loadChildren`));\n }\n\n protected override updated(changed: PropertyValues): void {\n if (changed.has(`path`) && !sameKeys(this.path, this.#lastPath) && this.#root) {\n const node = this.currentNode;\n if (node) {\n const previousPath = this.#lastPath;\n this.#lastPath = this.path;\n this.dispatchEvent(new CustomEvent<FlatListNavigateDetail>(`flat-list-navigate`, {\n detail: { path: this.path, previousPath, node, direction: this.#direction },\n bubbles: true,\n composed: true,\n }));\n this.#direction = `jump`;\n }\n }\n if (changed.has(`_rows`))\n void this.#settleList();\n if (changed.has(`_rows`) || changed.has(`markedKey`))\n void this.#applyMarked();\n }\n\n /** Recompute the level's rows, loading children first when they are not yet known. */\n #refreshRows(reload: boolean): void {\n const node = this.currentNode;\n if (!node) {\n this._rows = [];\n return;\n }\n if (node.children === undefined && (this.model || this.loadChildren) && (reload || this.#loadingNode !== node)) {\n void this.#load(node);\n return;\n }\n this.#applyRows(node);\n }\n\n #applyRows(node: TreeNode): void {\n const filter = this.filterPredicate;\n const depth = this.path.length;\n const children = (node.children ?? []).filter(c => !filter || filter(c, depth));\n const rows = orderRows(children, this.branchOrder, this.sort);\n if (!sameNodes(rows, this._rows))\n this._rows = rows;\n }\n\n async #load(node: TreeNode): Promise<void> {\n this.#loadController?.abort();\n const controller = new AbortController();\n this.#loadController = controller;\n this.#loadingNode = node;\n this._loading = true;\n this._rows = [];\n try {\n const depth = this.path.length;\n const children = this.model\n ? await this.model.getChildren(node, depth, controller.signal)\n : [...await collectDataResult(this.loadChildren!({ node, depth }, controller.signal), controller.signal)];\n if (controller.signal.aborted)\n return;\n node.children = [...children];\n } catch {\n if (controller.signal.aborted)\n return;\n node.children = [];\n }\n this.#loadingNode = undefined;\n this._loading = false;\n if (node === this.currentNode)\n this.#applyRows(node);\n }\n\n // --- Interaction ---\n\n #nodeForKey(key: string | undefined): TreeNode | undefined {\n return key === undefined ? undefined : this._rows.find(r => r.key === key)?.node;\n }\n\n /** A single click on a branch's chevron enters it, without selecting the row. */\n #onChevronClick(e: Event, node: TreeNode): void {\n e.stopPropagation();\n this.navigateInto(node.item.key);\n }\n\n #nodeForElement(el: Element | undefined): TreeNode | undefined {\n return el ? this.#nodeForKey(el.getAttribute(`data-key`) ?? undefined) : this.currentNode;\n }\n\n #canDropOn = (el: Element | undefined, dataTransfer: DataTransfer): boolean => {\n const node = this.#nodeForElement(el);\n return !!node && (this.canDrop?.(node, dataTransfer) ?? true);\n };\n\n /** Accept every drag that got past `canDrop`; the consumer only hears about the drop. */\n #onListDragOver = (e: CustomEvent<ListDropDetail>): void => {\n if (this.itemsDroppable)\n e.preventDefault();\n };\n\n #onListDrop = (e: CustomEvent<ListDropDetail>): void => {\n const node = this.#nodeForKey(e.detail.key) ?? this.currentNode;\n if (!node)\n return;\n this.dispatchEvent(new CustomEvent<FlatListDropDetail>(`flat-list-drop`, {\n detail: { node, dataTransfer: e.detail.dataTransfer },\n bubbles: true,\n composed: true,\n }));\n };\n\n #onListContextMenu = (e: CustomEvent<ListContextMenuDetail>): void => {\n const node = this.#nodeForKey(e.detail.key);\n if (!node)\n return;\n const nodes = [...e.detail.selectedKeys].map(k => this.#nodeForKey(k)).filter((n): n is TreeNode => n !== undefined);\n const proceed = this.dispatchEvent(new CustomEvent<FlatListContextMenuDetail>(`flat-list-context-menu`, {\n detail: { node, nodes, x: e.detail.x, y: e.detail.y },\n bubbles: true,\n composed: true,\n cancelable: true,\n }));\n if (!proceed)\n e.preventDefault();\n };\n\n #validateEditKey = (value: string, key: string | undefined): boolean => {\n const node = this.#nodeForKey(key);\n return !!node && (this.validateEdit?.(value, node) ?? false);\n };\n\n #onListEditCommit = (e: CustomEvent<ListEditCommitDetail>): void => {\n const node = this.#nodeForKey(e.detail.key);\n if (node) {\n this.dispatchEvent(new CustomEvent<FlatListEditCommitDetail>(`flat-list-edit-commit`, {\n detail: { node, value: e.detail.value },\n bubbles: true,\n composed: true,\n }));\n }\n };\n\n #onListEditCancel = (e: CustomEvent<ListEditCancelDetail>): void => {\n const node = this.#nodeForKey(e.detail.key);\n if (node) {\n this.dispatchEvent(new CustomEvent<FlatListEditCancelDetail>(`flat-list-edit-cancel`, {\n detail: { node },\n bubbles: true,\n composed: true,\n }));\n }\n };\n\n #onListSelect = (e: CustomEvent<ListSelectDetail>): void => {\n const previous = this.#selected;\n const nodes = [...e.detail.selectedKeys]\n .map(k => this.#nodeForKey(k))\n .filter((n): n is TreeNode => n !== undefined);\n this.#selected = new Set(nodes);\n this.dispatchEvent(new CustomEvent<FlatListSelectDetail>(`flat-list-select`, {\n detail: { selected: this.#selected, selectedKeys: e.detail.selectedKeys, previous },\n bubbles: true,\n composed: true,\n }));\n };\n\n #onListActivate = (e: CustomEvent<{ item: Element }>): void => {\n const key = e.detail.item.getAttribute(`data-key`) ?? undefined;\n const node = this.#nodeForKey(key);\n if (!node)\n return;\n if (isBranch(node)) {\n this.navigateInto(node.item.key);\n return;\n }\n this.dispatchEvent(new CustomEvent<FlatListActivateDetail>(`flat-list-activate`, {\n detail: { node },\n bubbles: true,\n composed: true,\n }));\n };\n\n #onToolbarSlotChange = (e: Event): void => {\n this._hasToolbar = (e.target as HTMLSlotElement).assignedNodes({ flatten: true }).some(n => n.nodeType === Node.ELEMENT_NODE || !!n.textContent?.trim());\n };\n\n #syncFocusVisible = (): void => {\n this._focusVisible = this.list?.matches(`:focus-visible`) ?? false;\n };\n\n #onKeyDown = (e: KeyboardEvent): void => {\n if (e.defaultPrevented || e.ctrlKey || e.metaKey || e.altKey || e.shiftKey)\n return;\n // Leave the search overlay's text field alone.\n const origin = e.composedPath()[0];\n if (origin instanceof HTMLInputElement || origin instanceof HTMLTextAreaElement)\n return;\n\n if (e.key === `ArrowRight` || e.key === `ArrowLeft` || e.key === `Backspace`) {\n // The level is about to change under a resting pointer; hover must not steal the cursor.\n TickledController.ignoreHoverUntilPointerMoves();\n }\n\n if (e.key === `ArrowRight`) {\n const node = this.#nodeForKey(this.list?.tickledKey);\n if (node && isBranch(node)) {\n e.preventDefault();\n this.navigateInto(node.item.key);\n }\n } else if (e.key === `ArrowLeft` || e.key === `Backspace`) {\n if (this.navigateUp())\n e.preventDefault();\n }\n };\n\n /** A crumb was chosen (or the Up button used): go to that node, or to its parent and select it if it is a leaf. */\n #onCrumbSelect = (e: CustomEvent<{ selected: ReadonlySet<TreeNode> }>): void => {\n e.stopPropagation();\n const target = [...e.detail.selected].at(-1);\n const root = this.#root;\n if (!target || !root)\n return;\n const keys = findKeyPath(root, target);\n if (!keys)\n return;\n if (isBranch(target)) {\n const direction = keys.length < this.path.length && keys.every((k, i) => k === this.path[i]) ? `up` : `jump`;\n this.#setPath(keys, direction);\n } else {\n const levelPath = keys.slice(0, -1);\n const sameLevel = sameKeys(levelPath, this.path);\n this.#setPath(levelPath, `jump`);\n this.#pendingSelectKey = target.item.key;\n // Rows will not change when the leaf is already on this level.\n if (sameLevel)\n void this.#settleList();\n }\n };\n\n /** Flag the marked row. Rows are rebuilt with the level, so this runs after each rebuild. */\n async #applyMarked(): Promise<void> {\n const list = this.list;\n if (!list)\n return;\n await list.updateComplete;\n for (const row of list.querySelectorAll(`li[data-key]`))\n row.toggleAttribute(`data-marked`, row.getAttribute(`data-key`) === this.markedKey);\n }\n\n /** After the inner list has rebuilt, place the cursor / selection / focus. */\n async #settleList(): Promise<void> {\n const list = this.list;\n if (!list)\n return;\n const hadFocus = this.matches(`:focus-within`);\n await list.updateComplete;\n const select = this.#pendingSelectKey;\n const focusKey = this.#pendingFocusKey ?? select ?? this._rows[0]?.key;\n this.#pendingSelectKey = undefined;\n this.#pendingFocusKey = undefined;\n if (select)\n list.selectKeys([select]);\n if (focusKey !== undefined)\n list.focusKey(focusKey);\n if (hadFocus)\n list.focus();\n }\n\n // --- Rendering ---\n\n /** Two stable formatters, so toggling `validateEdit` rebuilds the rows with or without edit hooks. */\n #renderPlainRow = (row: unknown) => this.#renderRow(row, false);\n #renderEditableRow = (row: unknown) => this.#renderRow(row, true);\n\n #renderRow(row: unknown, editingEnabled: boolean) {\n const { node } = row as FlatRow;\n const textColor = appearanceColor(node.item.textColor);\n const editable = editingEnabled && node.item.editable === true;\n return html`<span class=\"label\" data-edit-label=${editable ? `` : nothing} data-edit-value=${editable ? node.item.label : nothing} style=${textColor ? `color:${textColor}` : nothing}>${node.item.label}</span>`;\n }\n\n #renderIcon = (row: unknown) => {\n const { node } = row as FlatRow;\n return node.item.icon ? html`<ixfx-icon name=${node.item.icon}></ixfx-icon>` : undefined;\n };\n\n #renderBadge = (row: unknown) => {\n const { node, branch } = row as FlatRow;\n const badge = appearanceAbsent(node.item.badge) ? nothing : node.item.badge;\n const textColor = appearanceColor(node.item.textColor);\n return html`${badge}${branch\n ? html`<span\n class=\"chevron\"\n aria-hidden=\"true\"\n style=${textColor ? `color:${textColor}` : nothing}\n @pointerdown=${(e: Event) => e.stopPropagation()}\n @click=${(e: Event) => this.#onChevronClick(e, node)}\n >›</span>`\n : nothing}`;\n };\n\n protected override render() {\n const root = this.#root;\n return html`\n <div class=\"crumbs\" part=\"crumbs\">\n <ixfx-crumb-navigation\n .root=${root}\n .selectedNode=${this.currentNode}\n .loadChildren=${this.loadChildren}\n selection-filter=\"all\"\n pad-ending\n leading-caret\n ?with-up=${this.withUp}\n ?hide-root=${this.hideRoot}\n @select=${this.#onCrumbSelect}\n ></ixfx-crumb-navigation>\n <div class=\"toolbar\" part=\"toolbar\" ?hidden=${!this._hasToolbar}>\n <slot @slotchange=${this.#onToolbarSlotChange}></slot>\n </div>\n </div>\n <div class=\"body\">\n <ixfx-vertical-list\n .items=${this._rows}\n .formatter=${this.validateEdit ? this.#renderEditableRow : this.#renderPlainRow}\n .icon=${this.#renderIcon}\n .iconColor=${(row: unknown) => appearanceColor((row as FlatRow).node.item.iconColor)}\n .badge=${this.#renderBadge}\n key-property=\"key\"\n .selectionMode=${this.selectionMode}\n .interactionMode=${this.interactionMode}\n .itemWrap=${this.itemWrap}\n .searchModes=${this.searchModes}\n ?items-draggable=${this.itemsDraggable}\n ?items-droppable=${this.itemsDroppable}\n .canDrop=${this.#canDropOn}\n .editValidator=${this.#validateEditKey}\n .virtualize=${this.virtualize}\n .itemHeight=${this.itemHeight}\n @list-drag-over=${this.#onListDragOver}\n @list-drop=${this.#onListDrop}\n @list-context-menu=${this.#onListContextMenu}\n @list-edit-commit=${this.#onListEditCommit}\n @list-edit-cancel=${this.#onListEditCancel}\n @list-select=${this.#onListSelect}\n @list-activate=${this.#onListActivate}\n @keydown=${this.#onKeyDown}\n @focusin=${this.#syncFocusVisible}\n @focusout=${this.#syncFocusVisible}\n ></ixfx-vertical-list>\n ${this._rows.length === 0\n ? html`<div class=\"empty\" part=\"empty\">${this._loading ? `Loading…` : this.emptyText}</div>`\n : nothing}\n </div>\n `;\n }\n\n static override styles = [themeFallbacks, css`\n :host {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n box-sizing: border-box;\n overflow: hidden;\n background: var(--flat-list-bg, var(--list-bg, var(--surface-3)));\n color: var(--flat-list-text, var(--list-text, var(--surface-3-text)));\n border: 1px solid var(--flat-list-border, var(--list-border, var(--border)));\n border-radius: var(--flat-list-radius, var(--list-radius, var(--radius-s)));\n }\n\n .crumbs {\n display: flex;\n align-items: center;\n gap: var(--flat-list-toolbar-gap, var(--space-xs));\n flex: none;\n font-size: var(--flat-list-crumb-font-size, var(--text-s));\n padding: var(--flat-list-crumb-padding, var(--space-xs));\n border-bottom: 1px solid var(--flat-list-border, var(--list-border, var(--border)));\n }\n\n .crumbs ixfx-crumb-navigation {\n flex: 1 1 0;\n min-width: 0;\n }\n\n .toolbar {\n display: flex;\n flex: none;\n align-items: center;\n gap: var(--flat-list-toolbar-gap, var(--space-xs));\n }\n\n .toolbar[hidden] {\n display: none;\n }\n\n .body {\n position: relative;\n flex: 1 1 auto;\n min-height: 0;\n }\n\n :host([data-focus-visible]) {\n outline: 2px solid var(--accent);\n outline-offset: 2px;\n }\n\n ixfx-vertical-list {\n /* The ring is drawn round the whole component instead. */\n outline: none;\n /* Fill .body absolutely: a percentage height does not reliably resolve\n inside a flex item, and an unbounded list never scrolls the cursor into view. */\n position: absolute;\n inset: 0;\n --list-bg: transparent;\n --list-border: none;\n --list-radius: 0;\n }\n\n .empty {\n position: absolute;\n inset: 0;\n display: grid;\n place-items: center;\n pointer-events: none;\n color: var(--flat-list-empty-text, var(--surface-muted-text));\n }\n\n li[data-marked] {\n background: var(--flat-list-marked-bg, color-mix(in srgb, var(--accent) 18%, transparent));\n box-shadow: inset 3px 0 0 var(--flat-list-marked-bar, var(--accent));\n }\n\n .label {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n /* Highlight rule for incremental search: the rows live in this shadow root,\n so the page-level ::highlight() rule cannot reach them. */\n ::highlight(vertical-list-search) {\n background: var(--accent);\n color: var(--accent-text, #fff);\n }\n\n .chevron {\n margin-inline-start: auto;\n padding-inline-start: 0.5em;\n padding-inline-end: var(--flat-list-chevron-gap, 0.4em);\n /* Inherit the row's text colour, so it follows selected / tickled states. */\n color: inherit;\n }\n `];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-flat-list': FlatListElement;\n }\n}\n\nexport interface FlatListElement {\n addEventListener<K extends keyof FlatListElementEventMap>(\n type: K,\n listener: (this: FlatListElement, event: FlatListElementEventMap[K]) => void,\n options?: boolean | AddEventListenerOptions\n ): void;\n addEventListener(\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions\n ): void;\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"form-CsXJX15p.js","names":[],"sources":["../src/form/form-values.ts","../src/form/form.ts"],"sourcesContent":["export function collectFormValues(root: ParentNode): Record<string, unknown> {\n const values: Record<string, unknown> = {};\n const elements = root.querySelectorAll(`[name]`);\n\n elements.forEach((el) => {\n const name = el.getAttribute(`name`);\n if (!name) {\n return;\n }\n\n if (el instanceof HTMLInputElement) {\n if (el.type === `radio`) {\n if (el.checked) {\n values[name] = el.value;\n }\n } else if (el.type === `checkbox`) {\n values[name] = el.checked;\n } else {\n values[name] = el.value;\n }\n } else if (el instanceof HTMLSelectElement) {\n if (el.multiple) {\n values[name] = Array.from(el.selectedOptions).map(opt => opt.value);\n } else {\n values[name] = el.value;\n }\n } else if (el instanceof HTMLTextAreaElement) {\n values[name] = el.value;\n } else if (`value` in el) {\n values[name] = (el as { value: unknown }).value;\n }\n });\n\n return values;\n}\n\nexport function applyFormValues(root: ParentNode, data: Record<string, unknown>): void {\n const elements = root.querySelectorAll(`[name]`);\n\n elements.forEach((el) => {\n const name = el.getAttribute(`name`);\n if (!name || !(name in data)) {\n return;\n }\n\n const value = data[name];\n\n if (el instanceof HTMLInputElement) {\n if (el.type === `radio`) {\n el.checked = el.value === value;\n } else if (el.type === `checkbox`) {\n el.checked = Boolean(value);\n } else {\n el.value = String(value ?? ``);\n }\n el.dispatchEvent(new Event(`input`, { bubbles: true }));\n el.dispatchEvent(new Event(`change`, { bubbles: true }));\n } else if (el instanceof HTMLSelectElement) {\n if (el.multiple && Array.isArray(value)) {\n Array.from(el.options).forEach((opt) => {\n opt.selected = value.includes(opt.value);\n });\n } else {\n el.value = String(value ?? ``);\n }\n el.dispatchEvent(new Event(`input`, { bubbles: true }));\n el.dispatchEvent(new Event(`change`, { bubbles: true }));\n } else if (el instanceof HTMLTextAreaElement) {\n el.value = String(value ?? ``);\n el.dispatchEvent(new Event(`input`, { bubbles: true }));\n el.dispatchEvent(new Event(`change`, { bubbles: true }));\n } else if (`value` in el) {\n (el as { value: unknown }).value = value;\n }\n });\n}","import { LitElement } from 'lit';\nimport { safeCustomElement } from '../util/custom-elements.js';\nimport { applyFormValues, collectFormValues } from './form-values.js';\nimport './form.css';\n\n@safeCustomElement(`ixfx-form`)\nexport class FormElement extends LitElement {\n protected override createRenderRoot() {\n return this;\n }\n\n getValues(): Record<string, unknown> {\n return collectFormValues(this);\n }\n\n setValues(data: Record<string, unknown>): void {\n applyFormValues(this, data);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-form': FormElement;\n }\n}"],"mappings":";;;AAAA,SAAgB,kBAAkB,MAA2C;CAC3E,MAAM,SAAkC,CAAC;CAGzC,KAFsB,iBAAiB,QAEhC,CAAC,CAAC,SAAS,OAAO;EACvB,MAAM,OAAO,GAAG,aAAa,MAAM;EACnC,IAAI,CAAC,MACH;EAGF,IAAI,cAAc,kBAAkB;GAClC,IAAI,GAAG,SAAS,SACV;QAAA,GAAG,SACL,OAAO,QAAQ,GAAG;GAAA,OAEf,IAAI,GAAG,SAAS,YACrB,OAAO,QAAQ,GAAG;QAElB,OAAO,QAAQ,GAAG;EAEtB,OAAO,IAAI,cAAc,mBAAmB;GAC1C,IAAI,GAAG,UACL,OAAO,QAAQ,MAAM,KAAK,GAAG,eAAe,CAAC,CAAC,KAAI,QAAO,IAAI,KAAK;QAElE,OAAO,QAAQ,GAAG;EAEtB,OAAO,IAAI,cAAc,qBACvB,OAAO,QAAQ,GAAG;OACb,IAAI,WAAW,IACpB,OAAO,QAAS,GAA0B;CAE9C,CAAC;CAED,OAAO;AACT;AAEA,SAAgB,gBAAgB,MAAkB,MAAqC;CAGrF,KAFsB,iBAAiB,QAEhC,CAAC,CAAC,SAAS,OAAO;EACvB,MAAM,OAAO,GAAG,aAAa,MAAM;EACnC,IAAI,CAAC,QAAQ,EAAE,QAAQ,OACrB;EAGF,MAAM,QAAQ,KAAK;EAEnB,IAAI,cAAc,kBAAkB;GAClC,IAAI,GAAG,SAAS,SACd,GAAG,UAAU,GAAG,UAAU;QACrB,IAAI,GAAG,SAAS,YACrB,GAAG,UAAU,QAAQ,KAAK;QAE1B,GAAG,QAAQ,OAAO,SAAS,EAAE;GAE/B,GAAG,cAAc,IAAI,MAAM,SAAS,EAAE,SAAS,KAAK,CAAC,CAAC;GACtD,GAAG,cAAc,IAAI,MAAM,UAAU,EAAE,SAAS,KAAK,CAAC,CAAC;EACzD,OAAO,IAAI,cAAc,mBAAmB;GAC1C,IAAI,GAAG,YAAY,MAAM,QAAQ,KAAK,GACpC,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,SAAS,QAAQ;IACtC,IAAI,WAAW,MAAM,SAAS,IAAI,KAAK;GACzC,CAAC;QAED,GAAG,QAAQ,OAAO,SAAS,EAAE;GAE/B,GAAG,cAAc,IAAI,MAAM,SAAS,EAAE,SAAS,KAAK,CAAC,CAAC;GACtD,GAAG,cAAc,IAAI,MAAM,UAAU,EAAE,SAAS,KAAK,CAAC,CAAC;EACzD,OAAO,IAAI,cAAc,qBAAqB;GAC5C,GAAG,QAAQ,OAAO,SAAS,EAAE;GAC7B,GAAG,cAAc,IAAI,MAAM,SAAS,EAAE,SAAS,KAAK,CAAC,CAAC;GACtD,GAAG,cAAc,IAAI,MAAM,UAAU,EAAE,SAAS,KAAK,CAAC,CAAC;EACzD,OAAO,IAAI,WAAW,IACpB,GAA2B,QAAQ;CAEvC,CAAC;AACH;;;ACrEO,IAAM,cAAN,MAAM,oBAAoB,WAAW;CAC1C,mBAAsC;EACpC,OAAO;CACT;CAEA,YAAqC;EACnC,OAAO,kBAAkB,IAAI;CAC/B;CAEA,UAAU,MAAqC;EAC7C,gBAAgB,MAAM,IAAI;CAC5B;AACF;AAbC,cAAA,WAAA,CAAA,kBAAkB,WAAW,CAAA,GAAA,WAAA"}
|
package/dist/form.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"form.d.ts","names":[],"sources":["../src/form/form.ts"],"mappings":";;cAMa,oBAAoB;YACZ;EAInB,aAAa;EAIb,UAAU,MAAM;;QAKV;YACI;IACR,aAAa"}
|