@ixfx/components 0.17.1 → 0.18.1

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.
Files changed (76) hide show
  1. package/bundle/index.d.ts +351 -11
  2. package/bundle/index.js +402 -361
  3. package/dist/ac-text.js +1 -1
  4. package/dist/ac-token.js +2 -2
  5. package/dist/{checked-select-BmwqpgGr.js → checked-select-CC-qSO1P.js} +2 -2
  6. package/dist/checked-select.js +1 -1
  7. package/dist/{crumb-navigation-D7dAC0H-.js → crumb-navigation-C78edQGt.js} +3 -3
  8. package/dist/{crumb-navigation-Tm4fnsvN.d.ts → crumb-navigation-DOfOS7li.d.ts} +1 -1
  9. package/dist/crumbs.d.ts +1 -1
  10. package/dist/crumbs.js +1 -1
  11. package/dist/{data-grid-vasJtjFP.d.ts → data-grid-BYMZZbNc.d.ts} +32 -3
  12. package/dist/{data-grid-BcO3SMac.js → data-grid-CJrbLzLr.js} +80 -18
  13. package/dist/data-grid.d.ts +2 -2
  14. package/dist/data-grid.js +1 -1
  15. package/dist/{detail-list-E9WdMVbE.d.ts → detail-list-CBgnKkEm.d.ts} +35 -3
  16. package/dist/{detail-list-vPVwE1CP.js → detail-list-Dk9oSvAZ.js} +75 -10
  17. package/dist/detail-list.d.ts +3 -3
  18. package/dist/detail-list.js +1 -1
  19. package/dist/{flat-list-CfutGqKY.d.ts → flat-list-D5glF_vD.d.ts} +5 -3
  20. package/dist/flat-list.d.ts +1 -1
  21. package/dist/flat-list.js +5 -3
  22. package/dist/{grid-list-D2hinM64.js → grid-list-0wC2xGBS.js} +104 -14
  23. package/dist/{grid-list-OCdjuhng.d.ts → grid-list-B3T_2N0N.d.ts} +34 -4
  24. package/dist/grid-list.d.ts +2 -2
  25. package/dist/grid-list.js +1 -1
  26. package/dist/{incr-search-C5114RxZ.js → incr-search-Bk4acsCM.js} +14 -6
  27. package/dist/incr-search.d.ts +1 -1
  28. package/dist/incr-search.js +1 -1
  29. package/dist/{index-88ra6YHP.d.ts → index-BIv_Hu7C.d.ts} +4 -4
  30. package/dist/{index-CRLTVAyt.d.ts → index-BuvySJEc.d.ts} +5 -1
  31. package/dist/{index-CzhYJJsx.d.ts → index-fhZCKSY6.d.ts} +3 -3
  32. package/dist/index.d.ts +134 -26
  33. package/dist/index.js +479 -130
  34. package/dist/interaction-DNuFnTm0.js +3 -0
  35. package/dist/item-tags-Dz-jQq-4.d.ts +65 -0
  36. package/dist/{list-native-drag-controller-ByftBooJ.js → list-native-drag-controller-B_INa6_G.js} +109 -1
  37. package/dist/{list-native-drag-controller-CgXKdmjr.d.ts → list-native-drag-controller-Cs-Tmtaa.d.ts} +1 -1
  38. package/dist/{menu-C3DhTjHx.js → menu-CgT60B3-.js} +3 -3
  39. package/dist/{menu-item-BSxhlWnW.js → menu-item-CbywH4Xo.js} +3 -3
  40. package/dist/menu.js +2 -2
  41. package/dist/{miller-DqDEaXqT.js → miller-Dyv4UM7k.js} +3 -3
  42. package/dist/miller.d.ts +2 -2
  43. package/dist/miller.js +1 -1
  44. package/dist/narrowed-text.js +3 -3
  45. package/dist/{node-graph-DqEGv5QR.js → node-graph-yrbOLbYo.js} +1 -1
  46. package/dist/node-graph.js +1 -1
  47. package/dist/{notification-pill-BiHEJk-o.d.ts → notification-pill-BJonE_wo.d.ts} +14 -1
  48. package/dist/notifier.d.ts +1 -1
  49. package/dist/select-horiz.js +2 -2
  50. package/dist/sunburst-tree.d.ts +1 -1
  51. package/dist/sunburst-tree.js +1 -1
  52. package/dist/{sunbursttree-list-C-FuZB5z.js → sunbursttree-list-CJdznPzN.js} +2 -2
  53. package/dist/{sunbursttree-list-CsrmVSB8.d.ts → sunbursttree-list-CmydFG66.d.ts} +2 -2
  54. package/dist/{tickled-controller-BVhGKzjZ.js → tickled-controller-BsFFr_1N.js} +1 -1
  55. package/dist/{tickled-controller-DSPoG551.d.ts → tickled-controller-Dz0UqwlQ.d.ts} +5 -0
  56. package/dist/{tree-BP5fxvEX.js → tree-C3rgEEmm.js} +4 -4
  57. package/dist/{tree-component-DNuzfo6R.d.ts → tree-component-BE7OEIiH.d.ts} +7 -1
  58. package/dist/tree.d.ts +2 -2
  59. package/dist/tree.js +1 -1
  60. package/dist/{vertical-list-B9z1lbjM.js → vertical-list-By-yuhkw.js} +61 -6
  61. package/dist/{vertical-list-BzeXehBt.d.ts → vertical-list-C4z3La0C.d.ts} +26 -2
  62. package/dist/vertical-list.d.ts +2 -2
  63. package/dist/vertical-list.js +1 -1
  64. package/docs-user/README.md +1 -0
  65. package/docs-user/button.md +31 -1
  66. package/docs-user/data-grid.md +3 -0
  67. package/docs-user/detail-list.md +3 -0
  68. package/docs-user/grid-list.md +8 -0
  69. package/docs-user/index.json +6 -2
  70. package/docs-user/llms.txt +1 -0
  71. package/docs-user/multicol-list.md +3 -0
  72. package/docs-user/notifier.md +28 -0
  73. package/docs-user/user-item-tags.md +68 -0
  74. package/llms.txt +1 -0
  75. package/package.json +3 -3
  76. package/dist/interaction-8Kbbf6xN.js +0 -3
package/dist/index.js CHANGED
@@ -9,28 +9,27 @@ import { TitlebarElement } from "./titlebar.js";
9
9
  import { n as buttonStyles, t as ButtonElement } from "./button-BOX1dfyd.js";
10
10
  import { t as prominenceStyles } from "./prominence-BOOQVWF-.js";
11
11
  import { t as IxfxIconElement } from "./icon-DvTQuylG.js";
12
- import "./menu-item-BSxhlWnW.js";
12
+ import "./menu-item-CbywH4Xo.js";
13
13
  import { Checkbox } from "./checkbox.js";
14
- import { t as CheckedSelect } from "./checked-select-BmwqpgGr.js";
14
+ import { t as CheckedSelect } from "./checked-select-CC-qSO1P.js";
15
15
  import { i as ICON_CLOSE, n as ICON_CHECK, r as ICON_CHEVRON_DOWN, t as ICON_CARET_RIGHT } from "./defaults-_6ELsqLb.js";
16
16
  import { n as ColourPicker, t as ColourPickerPopup } from "./colour-picker-D8g-bTSF.js";
17
17
  import { t as DataController } from "./data-controller-q-rXRMzJ.js";
18
18
  import { t as collectDataResult } from "./data-provider-C6ZNAcaT.js";
19
19
  import { a as toGroupKey, i as resolveGroupKey, n as defaultGroupLabel, o as toggleInSet, r as partitionByGroup, t as EMPTY_GROUP_LABEL } from "./grouping-kENdqzSV.js";
20
- import { a as listItemFadeKeyframes, c as captionForEntry, i as animateListItemOut, l as createDefaultListDragPreview, n as LIST_ITEM_MOTION_MS, o as prefersReducedMotion, r as animateListItemIn, s as startListItemOutAnimation, t as ListNativeDragController } from "./list-native-drag-controller-ByftBooJ.js";
20
+ import { a as TreeDataModel, c as pruneDraggedDescendants, i as TreeDropController, n as TreeListElement, o as applyTreeDrop, r as TreeBaseElement, s as dropTargetFor, t as TreeController } from "./tree-C3rgEEmm.js";
21
21
  import { i as ListDragSelectController, n as gestureOf, r as isMultiMode, t as ListSelectionController } from "./list-selection-controller-Dkh3m3hX.js";
22
22
  import { a as capKeys, c as keysAsFlags, d as partitionKeys, f as withoutFlag, i as capFlags, l as keysToArray, n as EMPTY_KEYS, o as flagsFromRecord, r as MAX_PENDING_KEYS, s as flagsToRecord, t as EMPTY_FLAGS, u as partitionFlags } from "./pending-Afl4LT64.js";
23
23
  import { i as sameKeySet, n as applyPartialAttributes, r as isPartialKey, t as PARTIAL_DESCRIPTION } from "./partial-keys-D4l_ede_.js";
24
24
  import { n as createScrollHoverGuard, t as SCROLL_HOVER_SUPPRESS_ATTR } from "./scroll-hover-guard-BGAjtyXT.js";
25
- import { a as TreeDataModel, c as pruneDraggedDescendants, i as TreeDropController, n as TreeListElement, o as applyTreeDrop, r as TreeBaseElement, s as dropTargetFor, t as TreeController } from "./tree-BP5fxvEX.js";
26
- import { t as CrumbNavigationElement } from "./crumb-navigation-D7dAC0H-.js";
25
+ import { t as CrumbNavigationElement } from "./crumb-navigation-C78edQGt.js";
27
26
  import { t as popupSurfaceStyles } from "./popup-D8IxN1Eq.js";
28
27
  import { t as scrollFadeStyles } from "./scroll-fade-DH8OXSqL.js";
29
28
  import { DataDisplayComponent } from "./data-display.js";
30
- import { t as DataGridElement } from "./data-grid-BcO3SMac.js";
31
- import "./interaction-8Kbbf6xN.js";
29
+ import { t as DataGridElement } from "./data-grid-CJrbLzLr.js";
30
+ import "./interaction-DNuFnTm0.js";
32
31
  import { DateInputElement, formatDateInput, parseDateInput } from "./date-input.js";
33
- import { t as DetailListElement } from "./detail-list-vPVwE1CP.js";
32
+ import { t as DetailListElement } from "./detail-list-Dk9oSvAZ.js";
34
33
  import { t as createDragGhost } from "./drag-ghost-DNWu_RyN.js";
35
34
  import { a as distribute, c as preserveRestoreWeights, d as toSnapshot, f as walk, i as buildModel, l as resolveTracks, n as SplitPanelElement, o as findPanelNode, r as applySnapshot, s as normalise, t as SplitLayoutElement, u as setPanelRestoreWeight } from "./split-layout-BMN_s6d7.js";
36
35
  import { t as TabListElement } from "./tab-list-CFJy3hVm.js";
@@ -38,12 +37,12 @@ import { EditableLabel } from "./editable-label.js";
38
37
  import { n as EditableNumber, t as LabelledSliderInput } from "./labelled-slider-input-CfRKd5kC.js";
39
38
  import { FlatListElement } from "./flat-list.js";
40
39
  import { n as formStyles, r as adoptLightDomStyles, t as FormElement } from "./form-Cxx2sO8_.js";
41
- import { t as GridListElement } from "./grid-list-D2hinM64.js";
40
+ import { t as GridListElement } from "./grid-list-0wC2xGBS.js";
42
41
  import { GroupedItemListerElement } from "./grouped-item-lister.js";
43
- import { t as VerticalListElement } from "./vertical-list-B9z1lbjM.js";
42
+ import { t as VerticalListElement } from "./vertical-list-By-yuhkw.js";
44
43
  import { t as IxfxHexEditorElement } from "./hex-editor-DephDhuu.js";
45
- import { a as LIST_SEARCH_COMMAND_IDS, c as createElementListSearchAdapter, f as createDataListSearchAdapter, g as createFuzzySearch, h as createAcCompletionProvider, i as ListSearchController, l as KeyedElementIndex, m as createIncrSearch, n as listSearchStyles, o as registerListSearchCommands, p as IncrSearchTreeController, r as LIST_SEARCH_MODES, s as createElementIncrSearch, t as createTreeListSearchAdapter, u as keyForElement } from "./incr-search-C5114RxZ.js";
46
- import { t as TickledController } from "./tickled-controller-BVhGKzjZ.js";
44
+ import { a as LIST_SEARCH_COMMAND_IDS, c as createElementListSearchAdapter, f as createDataListSearchAdapter, g as createFuzzySearch, h as createAcCompletionProvider, i as ListSearchController, l as KeyedElementIndex, m as createIncrSearch, n as listSearchStyles, o as registerListSearchCommands, p as IncrSearchTreeController, r as LIST_SEARCH_MODES, s as createElementIncrSearch, t as createTreeListSearchAdapter, u as keyForElement } from "./incr-search-Bk4acsCM.js";
45
+ import { t as TickledController } from "./tickled-controller-BsFFr_1N.js";
47
46
  import { a as resolveKeyPath, i as reconcileSelection$1, n as reconcileCursor, t as pathFromJson } from "./tree-DUc-iQcg.js";
48
47
  import { a as restoreElementScroll, c as VIEW_STATE_VERSION, i as onUserScrollIntent, n as anchorFromRow, o as scrollToOffset, r as captureElementScroll, s as VIEW_STATE_CHANGE, t as ViewStateController } from "./view-state-controller-DiPAPiA7.js";
49
48
  import "./icons.js";
@@ -51,11 +50,12 @@ import { LabelledRadialInput } from "./labelled-radial-input.js";
51
50
  import { LabelledRangeInput } from "./labelled-range-input.js";
52
51
  import { LedElement } from "./led.js";
53
52
  import { ListGroupHeaderElement } from "./list-group-header.js";
54
- import { a as menuFromTreeToElements, t as menu_exports } from "./menu-C3DhTjHx.js";
55
- import { n as MillerListElement, r as MillerBaseElement, t as MillerTreeController } from "./miller-DqDEaXqT.js";
53
+ import { a as menuFromTreeToElements, t as menu_exports } from "./menu-CgT60B3-.js";
54
+ import { n as MillerListElement, r as MillerBaseElement, t as MillerTreeController } from "./miller-Dyv4UM7k.js";
56
55
  import { a as iconBus, c as setIconFont, i as hasIcon, l as svgToDataUri, n as getIconEntry, o as registerFontIcon, r as getIconFont, s as registerIcon, t as getIcon } from "./registry-DcF0fO7l.js";
56
+ import { _ as sameTags, a as listItemFadeKeyframes, c as captionForEntry, d as ItemTagResolver, f as TAG_PART_PREFIX, g as sameTagKeys, h as resolveTagFlags, i as animateListItemOut, l as createDefaultListDragPreview, m as collectTags, n as LIST_ITEM_MOTION_MS, o as prefersReducedMotion, p as applyTagAttributes, r as animateListItemIn, s as startListItemOutAnimation, t as ListNativeDragController, u as DEFAULT_ITEM_TAG_FLAGS, v as tagPartTokens, y as tagsAttribute } from "./list-native-drag-controller-B_INa6_G.js";
57
57
  import { NarrowedTextElement } from "./narrowed-text.js";
58
- import { $ as forceState, A as marqueeStyle, At as outDegreeOf, B as NODE_SHAPES, C as zoomAt, Ct as edgeId, D as MARQUEE_THRESHOLD_PX, Dt as inDegreeOf, E as NodeDragController, Et as hasWire, F as findSnapTarget, Ft as toEdges, G as resizeRect, H as shapeSpec, I as proximityFactor, It as toNodeGraph, J as blinkPeriodSeconds, K as GraphPortElement, L as settled, M as rectFromPoints, Mt as portId, N as rectsIntersect, Nt as removeNode, O as MarqueeController, Ot as incomingEdge, P as wantsMarquee, Pt as removeWire, Q as forcePositions, R as smoothStep, S as screenToFlow, St as cycleBlockedNodes, T as DRAG_THRESHOLD_PX, Tt as fromEdges, U as RESIZE_HANDLES, V as isNodeShape, W as isResizeHandle, X as forceMovement, Y as DEFAULT_FORCE_OPTIONS, Z as forcePin, _ as clampZoom, _t as normaliseConnection, a as selectionAfterNodePress, at as edgeShape, b as flowToScreen, bt as addWire, c as collapsedOffset, ct as polylinePath, d as sanitizeFlowSpeed, dt as EASY_CONNECT_MARGIN, et as forceStep, f as withEntry, ft as inEasyConnectZone, g as boundsOf, gt as findValidWire, h as isEditableTarget, ht as canConnect, i as selectionAfterEdgeClick, it as edgePath, j as nodesInRect, jt as parsePortId, k as combineSelection, kt as incomingEdges, l as measureNode, lt as polylineShape, m as PanZoomController, mt as removeNodes, n as renderWires, nt as defaultSide, o as findProximityConnection, ot as extendFromSide, p as withWireFlow, pt as pickStartPort, q as MAX_BLINK_HZ, r as WireDragController, rt as edgeMidpoint, s as rectGap, st as polylineMidpoint, t as NodeGraphElement, tt as EDGE_CORNER_RADIUS, u as MAX_FLOW_SPEED, ut as stepPoints, v as fitBounds, vt as resolveConnection, w as nodeGraphStyles, wt as ensurePort, x as panBy, xt as connectContext, y as fitRects, yt as typesCompatible, z as GraphNodeElement } from "./node-graph-DqEGv5QR.js";
58
+ import { $ as forceState, A as marqueeStyle, At as outDegreeOf, B as NODE_SHAPES, C as zoomAt, Ct as edgeId, D as MARQUEE_THRESHOLD_PX, Dt as inDegreeOf, E as NodeDragController, Et as hasWire, F as findSnapTarget, Ft as toEdges, G as resizeRect, H as shapeSpec, I as proximityFactor, It as toNodeGraph, J as blinkPeriodSeconds, K as GraphPortElement, L as settled, M as rectFromPoints, Mt as portId, N as rectsIntersect, Nt as removeNode, O as MarqueeController, Ot as incomingEdge, P as wantsMarquee, Pt as removeWire, Q as forcePositions, R as smoothStep, S as screenToFlow, St as cycleBlockedNodes, T as DRAG_THRESHOLD_PX, Tt as fromEdges, U as RESIZE_HANDLES, V as isNodeShape, W as isResizeHandle, X as forceMovement, Y as DEFAULT_FORCE_OPTIONS, Z as forcePin, _ as clampZoom, _t as normaliseConnection, a as selectionAfterNodePress, at as edgeShape, b as flowToScreen, bt as addWire, c as collapsedOffset, ct as polylinePath, d as sanitizeFlowSpeed, dt as EASY_CONNECT_MARGIN, et as forceStep, f as withEntry, ft as inEasyConnectZone, g as boundsOf, gt as findValidWire, h as isEditableTarget, ht as canConnect, i as selectionAfterEdgeClick, it as edgePath, j as nodesInRect, jt as parsePortId, k as combineSelection, kt as incomingEdges, l as measureNode, lt as polylineShape, m as PanZoomController, mt as removeNodes, n as renderWires, nt as defaultSide, o as findProximityConnection, ot as extendFromSide, p as withWireFlow, pt as pickStartPort, q as MAX_BLINK_HZ, r as WireDragController, rt as edgeMidpoint, s as rectGap, st as polylineMidpoint, t as NodeGraphElement, tt as EDGE_CORNER_RADIUS, u as MAX_FLOW_SPEED, ut as stepPoints, v as fitBounds, vt as resolveConnection, w as nodeGraphStyles, wt as ensurePort, x as panBy, xt as connectContext, y as fitRects, yt as typesCompatible, z as GraphNodeElement } from "./node-graph-yrbOLbYo.js";
59
59
  import { NotificationPillElement } from "./notifier.js";
60
60
  import { t as PanTextElement } from "./pan-text-DrJYKQKN.js";
61
61
  import { PanelElement } from "./panel.js";
@@ -71,7 +71,7 @@ import { t as WheelNudgeMixin } from "./wheel-nudge-DgJzrL28.js";
71
71
  import { t as SliderInputElement } from "./slider-input-C3mbUBZi.js";
72
72
  import { SnackbarElement } from "./snackbar.js";
73
73
  import { SnapContainer } from "./snap-container.js";
74
- import { a as findSunburstId, c as sunburstChildId, d as sunburstParentId, f as sunburstPathToId, i as defaultSunburstValueAccessor, l as sunburstHasChildren, n as computeSunburstLayout, o as findSunburstNodeById, p as SUNBURST_PATH_SEPARATOR, r as createValueResolver, s as isSunburstAncestorId, t as SunburstTreeListElement, u as sunburstIdToPath } from "./sunbursttree-list-C-FuZB5z.js";
74
+ import { a as findSunburstId, c as sunburstChildId, d as sunburstParentId, f as sunburstPathToId, i as defaultSunburstValueAccessor, l as sunburstHasChildren, n as computeSunburstLayout, o as findSunburstNodeById, p as SUNBURST_PATH_SEPARATOR, r as createValueResolver, s as isSunburstAncestorId, t as SunburstTreeListElement, u as sunburstIdToPath } from "./sunbursttree-list-CJdznPzN.js";
75
75
  import { SwipeElement } from "./swipe.js";
76
76
  import { a as resolveCssVars, i as attachTimelineInteractions, n as TimelineTrackTabElement, o as resolveGrid, r as timelineStyles, s as TimelineController, t as IxfxTimelineElement } from "./timeline-Br5JIeLI.js";
77
77
  import { TransitoryLabelElement } from "./transitory-label.js";
@@ -1014,6 +1014,11 @@ let SplitButton = class SplitButton extends ButtonElement {
1014
1014
  super(..._args);
1015
1015
  this.mode = `default`;
1016
1016
  this.defaultValue = ``;
1017
+ this.popoverTarget = ``;
1018
+ this._hasPopoverSlot = false;
1019
+ this._popoverOpen = false;
1020
+ this.#caretWasOpenOnPress = false;
1021
+ this.#buildingPopover = false;
1017
1022
  this._selectedCommand = ``;
1018
1023
  this._selectedLabel = ``;
1019
1024
  this._selectedIcon = ``;
@@ -1021,6 +1026,12 @@ let SplitButton = class SplitButton extends ButtonElement {
1021
1026
  this._dynamicItems = [];
1022
1027
  this._loadingItems = false;
1023
1028
  this._menuHasItems = false;
1029
+ this._onPopoverSlotChange = (e) => {
1030
+ this._hasPopoverSlot = e.target.assignedElements({ flatten: true }).length > 0;
1031
+ };
1032
+ this._onPopoverToggle = (e) => {
1033
+ this._popoverOpen = e.newState === `open`;
1034
+ };
1024
1035
  this._onDefaultMenuSlotChange = (e) => {
1025
1036
  const slot = e.target;
1026
1037
  this._menuHasItems = slot.assignedElements({ flatten: true }).length > 0;
@@ -1059,6 +1070,17 @@ let SplitButton = class SplitButton extends ButtonElement {
1059
1070
  };
1060
1071
  this._handleCaretClick = async (e) => {
1061
1072
  e.stopPropagation();
1073
+ if (this._popoverMode) {
1074
+ const wasOpen = this.#caretWasOpenOnPress;
1075
+ this.#caretWasOpenOnPress = false;
1076
+ if (wasOpen) {
1077
+ const el = this._resolvePopover();
1078
+ if (el?.matches(`:popover-open`)) el.hidePopover();
1079
+ return;
1080
+ }
1081
+ await this._showPopover(true);
1082
+ return;
1083
+ }
1062
1084
  if (this._menuTrigger?.isOpen) {
1063
1085
  this._menuTrigger.closeMenu();
1064
1086
  return;
@@ -1084,25 +1106,21 @@ let SplitButton = class SplitButton extends ButtonElement {
1084
1106
  this._handlePrimaryKeyDown = (e) => {
1085
1107
  if (e.key === `ArrowDown`) {
1086
1108
  e.preventDefault();
1087
- this._menuTrigger?.openMenu();
1109
+ this._openOverlay();
1088
1110
  }
1089
1111
  };
1090
1112
  this._handleCaretKeyDown = (e) => {
1091
1113
  if (e.key === `ArrowDown`) {
1092
1114
  e.preventDefault();
1093
- this._menuTrigger?.openMenu();
1115
+ this._openOverlay();
1094
1116
  }
1095
1117
  };
1118
+ this._handleCaretPointerDown = () => {
1119
+ this.#caretWasOpenOnPress = this._resolvePopover()?.matches(`:popover-open`) ?? false;
1120
+ };
1096
1121
  }
1097
- disconnectedCallback() {
1098
- super.disconnectedCallback();
1099
- this._menuTrigger?.removeEventListener(`menu-command`, this._handleSwitcherMenuCommand);
1100
- }
1101
- firstUpdated() {
1102
- this.updateComplete.then(() => {
1103
- this._menuTrigger?.addEventListener(`menu-command`, this._handleSwitcherMenuCommand);
1104
- });
1105
- }
1122
+ #caretWasOpenOnPress;
1123
+ #buildingPopover;
1106
1124
  updated(changedProperties) {
1107
1125
  super.updated(changedProperties);
1108
1126
  if ((changedProperties.has(`items`) || changedProperties.has(`mode`)) && this.items && !this.itemsProvider) this._applyItems(this.items);
@@ -1145,11 +1163,41 @@ let SplitButton = class SplitButton extends ButtonElement {
1145
1163
  }
1146
1164
  /** True when there is (or will be) popup content. Used to dim the caret visually. */
1147
1165
  get _caretHasContent() {
1166
+ if (this._popoverMode) return true;
1148
1167
  if (this.itemsProvider) return true;
1149
1168
  if (this.items && this.items.length > 0) return true;
1150
1169
  if (this.mode === `switcher`) return this._switcherItems.length > 1;
1151
1170
  return this._menuHasItems;
1152
1171
  }
1172
+ /** The caret toggles a popover (slotted content, `popover-target` or `popoverProvider`) rather than the menu. */
1173
+ get _popoverMode() {
1174
+ return this.popoverTarget !== `` || this.popoverProvider !== void 0 || this._hasPopoverSlot;
1175
+ }
1176
+ _resolvePopover() {
1177
+ if (this.popoverTarget !== ``) {
1178
+ const el = this.getRootNode().getElementById?.(this.popoverTarget);
1179
+ return el instanceof HTMLElement && el.popover !== null ? el : void 0;
1180
+ }
1181
+ return this._popoverPanel;
1182
+ }
1183
+ /** Show the popover (building its content first). `toggle`: hide it instead when already open. */
1184
+ async _showPopover(toggle) {
1185
+ const el = this._resolvePopover();
1186
+ if (!el || this.#buildingPopover) return;
1187
+ if (el.matches(`:popover-open`)) {
1188
+ if (toggle) el.hidePopover();
1189
+ return;
1190
+ }
1191
+ if (this.popoverProvider) {
1192
+ this.#buildingPopover = true;
1193
+ try {
1194
+ await this.popoverProvider(el);
1195
+ } finally {
1196
+ this.#buildingPopover = false;
1197
+ }
1198
+ }
1199
+ el.showPopover({ source: this._caretEl });
1200
+ }
1153
1201
  _applySwitcherItems(items) {
1154
1202
  this._switcherItems = items;
1155
1203
  if (!this._selectedCommand && items.length > 0) {
@@ -1159,6 +1207,10 @@ let SplitButton = class SplitButton extends ButtonElement {
1159
1207
  this._selectedIcon = picked.icon;
1160
1208
  }
1161
1209
  }
1210
+ _openOverlay() {
1211
+ if (this._popoverMode) this._showPopover(false);
1212
+ else this._menuTrigger?.openMenu();
1213
+ }
1162
1214
  render() {
1163
1215
  return this.mode === `switcher` ? this._renderSwitcher() : this._renderDefault();
1164
1216
  }
@@ -1171,13 +1223,36 @@ let SplitButton = class SplitButton extends ButtonElement {
1171
1223
  part="caret"
1172
1224
  ?disabled=${this.disabled}
1173
1225
  ?data-empty=${empty}
1174
- aria-haspopup="true"
1226
+ aria-haspopup=${this._popoverMode ? `dialog` : `true`}
1227
+ aria-expanded=${this._popoverMode ? String(this._popoverOpen) : nothing}
1175
1228
  aria-label=${ariaLabel}
1229
+ @pointerdown=${this._handleCaretPointerDown}
1176
1230
  @click=${this._handleCaretClick}
1177
1231
  @keydown=${this._handleCaretKeyDown}
1178
1232
  >
1179
1233
  <ixfx-icon name="${iconName}"></ixfx-icon>
1180
1234
  </button>
1235
+ `;
1236
+ }
1237
+ /** The caret with its overlay: the popover panel in popover mode, otherwise the menu trigger + menu. */
1238
+ _renderCaretArea(iconName, ariaLabel, menuContent) {
1239
+ const panel = html`
1240
+ <div class="popover-panel" part="popover" popover="auto" @toggle=${this._onPopoverToggle}>
1241
+ <slot name="popover" @slotchange=${this._onPopoverSlotChange}></slot>
1242
+ </div>
1243
+ `;
1244
+ if (this._popoverMode) return html`
1245
+ <div class="caret-area">
1246
+ ${this._renderCaret(iconName, ariaLabel)}
1247
+ ${this.popoverTarget === `` ? panel : nothing}
1248
+ </div>
1249
+ `;
1250
+ return html`
1251
+ <ixfx-menu-trigger .registry=${this.registry} .keyboardManager=${this.keyboardManager} @menu-command=${this._handleSwitcherMenuCommand}>
1252
+ ${this._renderCaret(iconName, ariaLabel)}
1253
+ ${menuContent}
1254
+ </ixfx-menu-trigger>
1255
+ ${panel}
1181
1256
  `;
1182
1257
  }
1183
1258
  _renderLoadingOrItems(items) {
@@ -1208,10 +1283,7 @@ let SplitButton = class SplitButton extends ButtonElement {
1208
1283
  >
1209
1284
  ${this._renderIcon()}${label}
1210
1285
  </button>
1211
- <ixfx-menu-trigger .registry=${this.registry} .keyboardManager=${this.keyboardManager}>
1212
- ${this._renderCaret(`chevron-down`, `Open menu`)}
1213
- ${menuContent}
1214
- </ixfx-menu-trigger>
1286
+ ${this._renderCaretArea(`chevron-down`, `Open menu`, menuContent)}
1215
1287
  </div>
1216
1288
  `;
1217
1289
  }
@@ -1238,12 +1310,11 @@ let SplitButton = class SplitButton extends ButtonElement {
1238
1310
  >
1239
1311
  ${primaryIcon}${primaryLabel}
1240
1312
  </button>
1241
- <ixfx-menu-trigger .registry=${this.registry} .keyboardManager=${this.keyboardManager}>
1242
- ${this._renderCaret(`chevron-right`, `Choose action`)}
1313
+ ${this._renderCaretArea(`chevron-right`, `Choose action`, html`
1243
1314
  <ixfx-menu-container slot="menu">
1244
1315
  ${popupItems}
1245
1316
  </ixfx-menu-container>
1246
- </ixfx-menu-trigger>
1317
+ `)}
1247
1318
  </div>
1248
1319
  `;
1249
1320
  }
@@ -1386,10 +1457,33 @@ let SplitButton = class SplitButton extends ButtonElement {
1386
1457
  background: color-mix(in oklch, var(--surface-3, #ccc) 70%, transparent);
1387
1458
  }
1388
1459
 
1389
- ixfx-menu-trigger {
1460
+ ixfx-menu-trigger,
1461
+ .caret-area {
1390
1462
  display: inline-flex;
1391
1463
  align-items: stretch;
1392
1464
  }
1465
+
1466
+ button.caret {
1467
+ anchor-name: --split-caret;
1468
+ }
1469
+
1470
+ .popover-panel {
1471
+ position: fixed;
1472
+ inset: auto;
1473
+ margin: 0;
1474
+ position-anchor: --split-caret;
1475
+ top: calc(anchor(bottom) + var(--space-s, 4px));
1476
+ right: anchor(right);
1477
+ position-try-fallbacks: flip-block, flip-inline;
1478
+ padding: var(--space-m, 8px);
1479
+ background: var(--surface-3, #ccc);
1480
+ color: var(--surface-3-text, #000);
1481
+ border: var(--border, 1px solid #999);
1482
+ border-radius: var(--radius-l, 8px);
1483
+ box-shadow: 0 4px 16px color-mix(in oklch, black 30%, transparent);
1484
+ max-width: min(90vw, var(--ixfx-split-button-popover-max-width, 40ch));
1485
+ overflow: auto;
1486
+ }
1393
1487
  `
1394
1488
  ];
1395
1489
  }
@@ -1403,7 +1497,16 @@ __decorate([property({
1403
1497
  })], SplitButton.prototype, "defaultValue", void 0);
1404
1498
  __decorate([property({ attribute: false })], SplitButton.prototype, "itemsProvider", void 0);
1405
1499
  __decorate([property({ attribute: false })], SplitButton.prototype, "items", void 0);
1500
+ __decorate([property({
1501
+ type: String,
1502
+ attribute: `popover-target`
1503
+ })], SplitButton.prototype, "popoverTarget", void 0);
1504
+ __decorate([property({ attribute: false })], SplitButton.prototype, "popoverProvider", void 0);
1406
1505
  __decorate([query(`ixfx-menu-trigger`)], SplitButton.prototype, "_menuTrigger", void 0);
1506
+ __decorate([query(`.popover-panel`)], SplitButton.prototype, "_popoverPanel", void 0);
1507
+ __decorate([query(`button.caret`)], SplitButton.prototype, "_caretEl", void 0);
1508
+ __decorate([state()], SplitButton.prototype, "_hasPopoverSlot", void 0);
1509
+ __decorate([state()], SplitButton.prototype, "_popoverOpen", void 0);
1407
1510
  __decorate([state()], SplitButton.prototype, "_selectedCommand", void 0);
1408
1511
  __decorate([state()], SplitButton.prototype, "_selectedLabel", void 0);
1409
1512
  __decorate([state()], SplitButton.prototype, "_selectedIcon", void 0);
@@ -1538,6 +1641,11 @@ var CrumbPathController = class {
1538
1641
  };
1539
1642
  // src/crumbs/crumb-path.ts
1540
1643
  const INVALID_ANCHOR_CHARS_RE = /[^\w-]/g;
1644
+ /**
1645
+ * Internal delimiter for cumulative-path keys (`data-cumulative`, sibling
1646
+ * cache). Deliberately not the display `separator`, so a label may contain it.
1647
+ */
1648
+ const KEY_SEP = `\u001F`;
1541
1649
  let CrumbPathElement = class CrumbPathElement extends LitElement {
1542
1650
  constructor(..._args) {
1543
1651
  super(..._args);
@@ -1559,6 +1667,7 @@ let CrumbPathElement = class CrumbPathElement extends LitElement {
1559
1667
  this._hintSegments = null;
1560
1668
  this.#uid = Math.random().toString(36).slice(2, 8);
1561
1669
  this.#clickSuppressUntil = 0;
1670
+ this.#hintValues = [];
1562
1671
  this.#onPopoverToggle = (e) => {
1563
1672
  if (e.newState === `closed` && this._openIdx !== null) {
1564
1673
  this._openIdx = null;
@@ -1614,8 +1723,10 @@ let CrumbPathElement = class CrumbPathElement extends LitElement {
1614
1723
  #uid;
1615
1724
  /** Clicks within this window after a drag are ignored (post-drag click-through guard). */
1616
1725
  #clickSuppressUntil;
1726
+ /** Values parallel to `_hintSegments`, recorded in structured mode. */
1727
+ #hintValues;
1617
1728
  #anchorName(cumPath) {
1618
- return `--cp-${this.#uid}-${cumPath.replaceAll(this.separator, `-`).replaceAll(` `, `-`).replace(INVALID_ANCHOR_CHARS_RE, `-`)}`;
1729
+ return `--cp-${this.#uid}-${cumPath.replaceAll(KEY_SEP, `-`).replaceAll(this.separator, `-`).replaceAll(` `, `-`).replace(INVALID_ANCHOR_CHARS_RE, `-`)}`;
1619
1730
  }
1620
1731
  #closeDropdown() {
1621
1732
  if (this._openIdx !== null) {
@@ -1660,7 +1771,41 @@ let CrumbPathElement = class CrumbPathElement extends LitElement {
1660
1771
  this.#pendingIndex = void 0;
1661
1772
  }
1662
1773
  }
1774
+ willUpdate(changed) {
1775
+ if (changed.has(`segments`) && this.segments !== void 0) {
1776
+ const text = this.segments.map((seg) => seg.label).join(this.separator);
1777
+ if (text !== this.path) this.path = text;
1778
+ }
1779
+ }
1780
+ /** Structured segments, or the text path parsed into value-less segments. */
1781
+ getSegments() {
1782
+ return this.segments ? this.segments.map((seg) => ({ ...seg })) : this.#getSegments().map((label) => ({ label }));
1783
+ }
1784
+ /**
1785
+ * Apply a new relative path. In structured mode also rebuilds `segments`,
1786
+ * reusing existing/hinted values where the label at that index is unchanged
1787
+ * and taking `tailValue` for the final segment.
1788
+ */
1789
+ #assignPath(labels, hadLeading, tailValue) {
1790
+ const joined = labels.join(this.separator);
1791
+ if (this.segments === void 0) {
1792
+ this.path = hadLeading ? this.separator + joined : joined;
1793
+ return joined;
1794
+ }
1795
+ const previous = this.segments;
1796
+ this.segments = labels.map((label, i) => {
1797
+ let value = previous[i]?.label === label ? previous[i].value : this.#hintValues[i];
1798
+ if (i === labels.length - 1 && tailValue !== void 0) value = tailValue;
1799
+ return value === void 0 ? { label } : {
1800
+ label,
1801
+ value
1802
+ };
1803
+ });
1804
+ this.path = joined;
1805
+ return joined;
1806
+ }
1663
1807
  #getSegments() {
1808
+ if (this.segments) return this.segments.map((seg) => seg.label);
1664
1809
  const fullPath = this.path;
1665
1810
  if (this.pathRoot.length > 0 && fullPath.startsWith(this.pathRoot)) return fullPath.slice(this.pathRoot.length).split(this.separator).filter((p) => p.length > 0);
1666
1811
  return this.path.split(this.separator).filter((p) => p.length > 0);
@@ -1672,8 +1817,8 @@ let CrumbPathElement = class CrumbPathElement extends LitElement {
1672
1817
  #getCumulativePath(index, isRoot) {
1673
1818
  const segments = this.#getSegments();
1674
1819
  const rootSegments = this.#getRootSegments();
1675
- if (isRoot) return rootSegments.slice(0, index + 1).join(this.separator);
1676
- return [...rootSegments, ...segments.slice(0, index + 1)].join(this.separator);
1820
+ if (isRoot) return rootSegments.slice(0, index + 1).join(KEY_SEP);
1821
+ return [...rootSegments, ...segments.slice(0, index + 1)].join(KEY_SEP);
1677
1822
  }
1678
1823
  #resolveFullPathSegments(index, isRoot) {
1679
1824
  const rootSegments = this.#getRootSegments();
@@ -1703,21 +1848,28 @@ let CrumbPathElement = class CrumbPathElement extends LitElement {
1703
1848
  #recordHintOnShorten(oldSegments, newSegments) {
1704
1849
  if (!this.hintPrevious) return;
1705
1850
  const hint = this._hintSegments;
1706
- if (!(hint !== null && this.#isSegmentPrefix(newSegments, hint))) this._hintSegments = oldSegments;
1851
+ if (!(hint !== null && this.#isSegmentPrefix(newSegments, hint))) {
1852
+ this._hintSegments = oldSegments;
1853
+ this.#hintValues = this.segments?.map((seg) => seg.value) ?? [];
1854
+ }
1707
1855
  }
1708
1856
  #resolveSegmentIcon(fullPathSegments, index) {
1709
1857
  const direct = this.segmentIconLookup?.(fullPathSegments, index);
1710
1858
  if (typeof direct === `string` && direct.length > 0) return direct;
1711
1859
  const label = fullPathSegments[index];
1712
1860
  if (label === void 0) return;
1713
- const parentKey = fullPathSegments.slice(0, index).join(this.separator);
1861
+ const parentKey = fullPathSegments.slice(0, index).join(KEY_SEP);
1714
1862
  return (this._cachedSiblings.get(parentKey)?.find((s) => s.label === label))?.icon;
1715
1863
  }
1716
1864
  setPath(newPath) {
1717
1865
  this.#cleanupPending();
1718
1866
  if (this.pathRoot.length > 0 && !newPath.startsWith(this.pathRoot)) newPath = this.pathRoot;
1719
- if (newPath === this.path) return;
1720
- this.path = newPath;
1867
+ if (newPath === this.path && this.segments === void 0) return;
1868
+ if (this.segments !== void 0) {
1869
+ const labels = newPath.split(this.separator).filter((p) => p.length > 0);
1870
+ if (labels.join(this.separator) === this.path) return;
1871
+ this.#assignPath(labels, false);
1872
+ } else this.path = newPath;
1721
1873
  this._cachedSiblings = /* @__PURE__ */ new Map();
1722
1874
  this._openIdx = null;
1723
1875
  this._leafSegmentIndex = null;
@@ -1732,6 +1884,10 @@ let CrumbPathElement = class CrumbPathElement extends LitElement {
1732
1884
  getPath() {
1733
1885
  return this.path;
1734
1886
  }
1887
+ /** `{ segments }` event-detail fragment in structured mode, else nothing. */
1888
+ #segmentsDetail() {
1889
+ return this.segments ? { segments: this.getSegments() } : {};
1890
+ }
1735
1891
  #onCaretClick(index, event) {
1736
1892
  event.preventDefault();
1737
1893
  event.stopPropagation();
@@ -1745,7 +1901,7 @@ let CrumbPathElement = class CrumbPathElement extends LitElement {
1745
1901
  this._dropdownActiveIndex = -1;
1746
1902
  const segments = this.#getSegments();
1747
1903
  const rootSegments = this.#getRootSegments();
1748
- const pathSegments = cumPath ? cumPath.split(this.separator).filter((p) => p.length > 0) : index === -1 ? rootSegments : segments.slice(0, index + 1);
1904
+ const pathSegments = cumPath ? cumPath.split(KEY_SEP).filter((p) => p.length > 0) : index === -1 ? rootSegments : segments.slice(0, index + 1);
1749
1905
  const cacheKey = cumPath ?? String(index);
1750
1906
  if (!this._cachedSiblings.has(cacheKey) && this.siblingLookup) {
1751
1907
  this.#cleanupPending();
@@ -1915,8 +2071,7 @@ let CrumbPathElement = class CrumbPathElement extends LitElement {
1915
2071
  const truncatedSegments = segments.slice(0, index + 1);
1916
2072
  this.#recordHintOnShorten(segments, truncatedSegments);
1917
2073
  const hadLeading = this.path.startsWith(this.separator);
1918
- const newPath = truncatedSegments.join(this.separator);
1919
- this.path = hadLeading ? this.separator + newPath : newPath;
2074
+ const newPath = this.#assignPath(truncatedSegments, hadLeading);
1920
2075
  this._cachedSiblings = /* @__PURE__ */ new Map();
1921
2076
  this._leafSegmentIndex = null;
1922
2077
  const parentPath = truncatedSegments.slice(0, -1).join(this.separator);
@@ -1925,7 +2080,8 @@ let CrumbPathElement = class CrumbPathElement extends LitElement {
1925
2080
  index,
1926
2081
  label: truncatedSegments[index],
1927
2082
  parentPath,
1928
- fullPath: newPath
2083
+ fullPath: newPath,
2084
+ ...this.#segmentsDetail()
1929
2085
  },
1930
2086
  bubbles: true,
1931
2087
  composed: true
@@ -1940,8 +2096,7 @@ let CrumbPathElement = class CrumbPathElement extends LitElement {
1940
2096
  if (!hint) return;
1941
2097
  const truncatedSegments = hint.slice(0, hintIndex + 1);
1942
2098
  const hadLeading = this.path.startsWith(this.separator);
1943
- const newPath = truncatedSegments.join(this.separator);
1944
- this.path = hadLeading ? this.separator + newPath : newPath;
2099
+ const newPath = this.#assignPath(truncatedSegments, hadLeading);
1945
2100
  this._cachedSiblings = /* @__PURE__ */ new Map();
1946
2101
  this._leafSegmentIndex = null;
1947
2102
  const parentPath = truncatedSegments.slice(0, -1).join(this.separator);
@@ -1950,7 +2105,8 @@ let CrumbPathElement = class CrumbPathElement extends LitElement {
1950
2105
  index: hintIndex,
1951
2106
  label: truncatedSegments[hintIndex],
1952
2107
  parentPath,
1953
- fullPath: newPath
2108
+ fullPath: newPath,
2109
+ ...this.#segmentsDetail()
1954
2110
  },
1955
2111
  bubbles: true,
1956
2112
  composed: true
@@ -1962,7 +2118,7 @@ let CrumbPathElement = class CrumbPathElement extends LitElement {
1962
2118
  const segments = this.#getSegments();
1963
2119
  const rootSegments = this.#getRootSegments();
1964
2120
  let newSegments;
1965
- if (cumPath) newSegments = [...cumPath.split(this.separator).filter((p) => p.length > 0), segment.label];
2121
+ if (cumPath) newSegments = [...cumPath.split(KEY_SEP).filter((p) => p.length > 0), segment.label];
1966
2122
  else if (this.pathRoot.length > 0 && index < rootSegments.length) newSegments = [...rootSegments.slice(0, index + 1), segment.label];
1967
2123
  else newSegments = [
1968
2124
  ...rootSegments,
@@ -1970,8 +2126,7 @@ let CrumbPathElement = class CrumbPathElement extends LitElement {
1970
2126
  segment.label
1971
2127
  ];
1972
2128
  const hadLeading = this.path.startsWith(this.separator);
1973
- const newPath = newSegments.join(this.separator);
1974
- this.path = hadLeading ? this.separator + newPath : newPath;
2129
+ const newPath = this.#assignPath(newSegments, hadLeading, segment.value);
1975
2130
  this._cachedSiblings = /* @__PURE__ */ new Map();
1976
2131
  const leafIndex = segment.isLeaf ? newSegments.length - 1 : null;
1977
2132
  this._leafSegmentIndex = leafIndex;
@@ -1982,7 +2137,8 @@ let CrumbPathElement = class CrumbPathElement extends LitElement {
1982
2137
  index,
1983
2138
  label: segment.label,
1984
2139
  parentPath,
1985
- fullPath: newPath
2140
+ fullPath: newPath,
2141
+ ...this.#segmentsDetail()
1986
2142
  },
1987
2143
  bubbles: true,
1988
2144
  composed: true
@@ -2147,7 +2303,7 @@ let CrumbPathElement = class CrumbPathElement extends LitElement {
2147
2303
  #onAcChange(e) {
2148
2304
  e.stopPropagation();
2149
2305
  const newPath = e.detail.value;
2150
- this.path = newPath;
2306
+ this.#applyEditedText(newPath);
2151
2307
  this._cachedSiblings = /* @__PURE__ */ new Map();
2152
2308
  this._leafSegmentIndex = newPath.endsWith(this.separator) ? null : newPath.split(this.separator).filter((p) => p.length > 0).length - 1;
2153
2309
  this._editing = false;
@@ -2161,7 +2317,7 @@ let CrumbPathElement = class CrumbPathElement extends LitElement {
2161
2317
  if (!this._editingCancelled) {
2162
2318
  const newPath = (this.shadowRoot?.querySelector(`ixfx-ac-text`))?.value ?? this.path;
2163
2319
  if (newPath !== this.path) {
2164
- this.path = newPath;
2320
+ this.#applyEditedText(newPath);
2165
2321
  this._cachedSiblings = /* @__PURE__ */ new Map();
2166
2322
  this._leafSegmentIndex = newPath.endsWith(this.separator) ? null : newPath.split(this.separator).filter((p) => p.length > 0).length - 1;
2167
2323
  this.#dispatchChangeEvent(newPath);
@@ -2171,15 +2327,24 @@ let CrumbPathElement = class CrumbPathElement extends LitElement {
2171
2327
  this._editStartIndex = null;
2172
2328
  }
2173
2329
  }
2330
+ /** Edited text is split on the separator; in structured mode this rebuilds `segments`. */
2331
+ #applyEditedText(text) {
2332
+ if (this.segments === void 0) {
2333
+ this.path = text;
2334
+ return;
2335
+ }
2336
+ this.#assignPath(text.split(this.separator).filter((p) => p.length > 0), false);
2337
+ }
2174
2338
  #dispatchChangeEvent(newPath) {
2175
- const segments = newPath.split(this.separator).filter((p) => p.length > 0);
2339
+ const segments = this.segments ? this.segments.map((seg) => seg.label) : newPath.split(this.separator).filter((p) => p.length > 0);
2176
2340
  const label = segments.at(-1) ?? ``;
2177
2341
  const parentPath = segments.slice(0, -1).join(this.separator);
2178
2342
  this.dispatchEvent(new CustomEvent(`change`, {
2179
2343
  detail: {
2180
2344
  label,
2181
2345
  parentPath,
2182
- fullPath: newPath
2346
+ fullPath: newPath,
2347
+ ...this.#segmentsDetail()
2183
2348
  },
2184
2349
  bubbles: true,
2185
2350
  composed: true
@@ -2450,6 +2615,7 @@ let CrumbPathElement = class CrumbPathElement extends LitElement {
2450
2615
  }
2451
2616
  };
2452
2617
  __decorate([property({ type: String })], CrumbPathElement.prototype, "path", void 0);
2618
+ __decorate([property({ attribute: false })], CrumbPathElement.prototype, "segments", void 0);
2453
2619
  __decorate([property({ type: String })], CrumbPathElement.prototype, "separator", void 0);
2454
2620
  __decorate([property({
2455
2621
  type: String,
@@ -11009,6 +11175,7 @@ var MulticolColumnController = class {
11009
11175
  if (this.#listerEl) {
11010
11176
  this.#pushItems();
11011
11177
  this.#restoreAfterSync();
11178
+ this.#applyTags();
11012
11179
  }
11013
11180
  if (r.changed) this.#onSelectionChange(this.id, r.selected, r.restored ? `restore` : `data`);
11014
11181
  }
@@ -11047,6 +11214,38 @@ var MulticolColumnController = class {
11047
11214
  #applyPartialKeys() {
11048
11215
  if (!this.#listerEl) return;
11049
11216
  for (const list of this.#listerEl.querySelectorAll(`ixfx-vertical-list`)) list.partialKeys = this.#partialKeys;
11217
+ this.#applyTags();
11218
+ }
11219
+ #tagKeys;
11220
+ #tagHook;
11221
+ #tagBehaviour;
11222
+ /**
11223
+ * Item tags for this column: `keys` (by item key) merged with `hook` results,
11224
+ * and the behaviour per tag. Forwarded to the column's inner lists.
11225
+ */
11226
+ setTags(keys, hook, behaviour) {
11227
+ this.#tagKeys = keys;
11228
+ this.#tagHook = hook;
11229
+ this.#tagBehaviour = behaviour;
11230
+ this.#applyTags();
11231
+ }
11232
+ #applyTags() {
11233
+ if (!this.#listerEl) return;
11234
+ let merged = this.#tagKeys;
11235
+ if (this.#tagHook) {
11236
+ const byTag = /* @__PURE__ */ new Map();
11237
+ for (const [tag, keys] of this.#tagKeys ?? []) byTag.set(tag, new Set(keys));
11238
+ for (const item of this.#lastItems) for (const tag of this.#tagHook(item, this.id) ?? []) {
11239
+ const set = byTag.get(tag) ?? /* @__PURE__ */ new Set();
11240
+ set.add(item.key);
11241
+ byTag.set(tag, set);
11242
+ }
11243
+ merged = byTag;
11244
+ }
11245
+ for (const list of this.#listerEl.querySelectorAll(`ixfx-vertical-list`)) {
11246
+ list.tagBehaviour = this.#tagBehaviour;
11247
+ list.tagKeys = merged;
11248
+ }
11050
11249
  }
11051
11250
  #handleSelect = () => {
11052
11251
  if (this.#syncingSelection || this.#syncsInFlight > 0) return;
@@ -11595,6 +11794,7 @@ let MulticolListElement = class MulticolListElement extends LitElement {
11595
11794
  }
11596
11795
  updated(changedProperties) {
11597
11796
  if (changedProperties.has(`categories`)) this.#resolvePendingColumns();
11797
+ if (changedProperties.has(`tags`)) this.refreshTags();
11598
11798
  const seedCategory = flattenCategories(this.categories)[0];
11599
11799
  if (!this._autoSeeded && this._columns.length === 0 && seedCategory) {
11600
11800
  this._autoSeeded = true;
@@ -11666,6 +11866,30 @@ let MulticolListElement = class MulticolListElement extends LitElement {
11666
11866
  _getCategoryTooltip(key) {
11667
11867
  return findCategory(this.categories, key)?.description ?? `Change category`;
11668
11868
  }
11869
+ #tagKeys;
11870
+ #tagBehaviour;
11871
+ /** Tags by item key, in every column with an item of that key: tag name → keys. */
11872
+ get tagKeys() {
11873
+ return this.#tagKeys;
11874
+ }
11875
+ set tagKeys(value) {
11876
+ if (sameTagKeys(value, this.#tagKeys)) return;
11877
+ this.#tagKeys = value;
11878
+ this.refreshTags();
11879
+ }
11880
+ /** Interaction flags per tag name (`selectable`, `focusable`, `draggable`, `searchable`); the most restrictive flag wins. */
11881
+ get tagBehaviour() {
11882
+ return this.#tagBehaviour;
11883
+ }
11884
+ set tagBehaviour(value) {
11885
+ if (value === this.#tagBehaviour) return;
11886
+ this.#tagBehaviour = value;
11887
+ this.refreshTags();
11888
+ }
11889
+ /** Re-evaluate every column's tags. */
11890
+ refreshTags() {
11891
+ for (const col of this._columns) col.setTags(this.#tagKeys, this.tags, this.#tagBehaviour);
11892
+ }
11669
11893
  #partialKeys;
11670
11894
  #columnPartialKeys;
11671
11895
  /**
@@ -11712,6 +11936,7 @@ let MulticolListElement = class MulticolListElement extends LitElement {
11712
11936
  #createController(id, category) {
11713
11937
  const controller = this.#createColumnController(id, category);
11714
11938
  controller.setPartialKeys(this.#partialFor(id));
11939
+ controller.setTags(this.#tagKeys, this.tags, this.#tagBehaviour);
11715
11940
  return controller;
11716
11941
  }
11717
11942
  #createColumnController(id, category) {
@@ -12078,6 +12303,7 @@ __decorate([state()], MulticolListElement.prototype, "_resizingColumnId", void 0
12078
12303
  __decorate([state()], MulticolListElement.prototype, "_draggingColumnId", void 0);
12079
12304
  __decorate([state()], MulticolListElement.prototype, "_dropCaretX", void 0);
12080
12305
  __decorate([query(`#container`)], MulticolListElement.prototype, "_containerEl", void 0);
12306
+ __decorate([property({ attribute: false })], MulticolListElement.prototype, "tags", void 0);
12081
12307
  MulticolListElement = __decorate([safeCustomElement(`ixfx-multicol-list`)], MulticolListElement);
12082
12308
  function withoutKey(map, key) {
12083
12309
  const next = new Map(map);
@@ -12276,58 +12502,104 @@ function createPillRenderer(options = {}) {
12276
12502
  };
12277
12503
  }
12278
12504
  // src/notifier/manager.ts
12279
- const options = {
12280
- renderer: void 0,
12281
- timeout: 4e3,
12282
- timeoutError: 8e3,
12283
- queue: true,
12284
- queueSize: 3,
12285
- tapBehaviour: `dismiss`,
12286
- tapHandlerDefault: void 0
12287
- };
12288
- /** Rank-ordered, index 0 = oldest/first (next to be evicted or timed out). Length never exceeds queueSize (or 1 when queuing is disabled). */
12289
- const visible = [];
12290
- let renderer = null;
12291
- let defaultRenderer = null;
12292
- function getDefaultRenderer() {
12293
- defaultRenderer ??= createPillRenderer({ position: `top-right` });
12294
- return defaultRenderer;
12295
- }
12296
- function getRenderer() {
12297
- return renderer ?? getDefaultRenderer();
12298
- }
12299
- function syncRenderer() {
12300
- getRenderer().setNotifications([...visible], options.queueSize);
12301
- }
12302
- function clearTimer(managed) {
12303
- if (managed.timer !== null) {
12304
- clearTimeout(managed.timer);
12305
- managed.timer = null;
12505
+ const DEFAULT_HISTORY_LIMIT = 100;
12506
+ function createNotificationManager(initial = {}) {
12507
+ const options = {
12508
+ renderer: void 0,
12509
+ timeout: 4e3,
12510
+ timeoutError: 8e3,
12511
+ queue: true,
12512
+ queueSize: 3,
12513
+ tapBehaviour: `dismiss`,
12514
+ tapHandlerDefault: void 0,
12515
+ historyLimit: DEFAULT_HISTORY_LIMIT
12516
+ };
12517
+ /** Rank-ordered, index 0 = oldest/first (next to be evicted or timed out). Length never exceeds queueSize (or 1 when queuing is disabled). */
12518
+ const visible = [];
12519
+ const history = [];
12520
+ const listeners = /* @__PURE__ */ new Set();
12521
+ let renderer = null;
12522
+ let defaultRenderer = null;
12523
+ function getDefaultRenderer() {
12524
+ defaultRenderer ??= createPillRenderer({ position: `top-right` });
12525
+ return defaultRenderer;
12526
+ }
12527
+ function getRenderer() {
12528
+ return renderer ?? getDefaultRenderer();
12529
+ }
12530
+ function syncRenderer() {
12531
+ getRenderer().setNotifications([...visible], options.queueSize);
12532
+ }
12533
+ function emitHistory() {
12534
+ if (listeners.size === 0) return;
12535
+ const snapshot = getHistory();
12536
+ for (const listener of [...listeners]) try {
12537
+ listener(snapshot);
12538
+ } catch (err) {
12539
+ console.error(`Notification history listener failed:`, err);
12540
+ }
12306
12541
  }
12307
- }
12308
- /**
12309
- * A message shown alone takes the full timeout. A message that joined a
12310
- * non-empty queue at arrival time is permanently "wasQueued" and gets
12311
- * 1/queueSize of the timeout once it reaches the front. The timer for a
12312
- * given message is only ever started once - when it first becomes front.
12313
- */
12314
- function startTimer(managed) {
12315
- const base = managed.type === `error` ? options.timeoutError : options.timeout;
12316
- const duration = managed.wasQueued ? base / options.queueSize : base;
12317
- managed.timer = window.setTimeout(dismiss, duration, managed.id);
12318
- }
12319
- function ensureFrontTimer() {
12320
- const front = visible[0];
12321
- if (front && front.timer === null) startTimer(front);
12322
- }
12323
- const NotificationManager = {
12324
- configure(opts) {
12542
+ function getHistory() {
12543
+ return history.map((entry) => ({ ...entry }));
12544
+ }
12545
+ function historyEntry(id) {
12546
+ return history.find((entry) => entry.id === id);
12547
+ }
12548
+ function markDismissed(id) {
12549
+ const entry = historyEntry(id);
12550
+ if (entry && entry.dismissedAt === void 0) {
12551
+ entry.dismissedAt = Date.now();
12552
+ emitHistory();
12553
+ }
12554
+ }
12555
+ function clearTimer(managed) {
12556
+ if (managed.timer !== null) {
12557
+ clearTimeout(managed.timer);
12558
+ managed.timer = null;
12559
+ }
12560
+ }
12561
+ /** Remove from the visible queue (timer + history bookkeeping), without rendering. */
12562
+ function evict(managed) {
12563
+ clearTimer(managed);
12564
+ markDismissed(managed.id);
12565
+ }
12566
+ /**
12567
+ * A message shown alone takes the full timeout. A message that joined a
12568
+ * non-empty queue at arrival time is permanently "wasQueued" and gets
12569
+ * 1/queueSize of the timeout once it reaches the front. The timer for a
12570
+ * given message is only ever started once - when it first becomes front.
12571
+ */
12572
+ function startTimer(managed) {
12573
+ const base = managed.type === `error` ? options.timeoutError : options.timeout;
12574
+ const duration = managed.wasQueued ? base / options.queueSize : base;
12575
+ managed.timer = window.setTimeout(dismiss, duration, managed.id);
12576
+ }
12577
+ function ensureFrontTimer() {
12578
+ const front = visible[0];
12579
+ if (front && front.timer === null) startTimer(front);
12580
+ }
12581
+ function dismiss(id) {
12582
+ const idx = visible.findIndex((m) => m.id === id);
12583
+ if (idx === -1) return;
12584
+ evict(visible.splice(idx, 1)[0]);
12585
+ ensureFrontTimer();
12586
+ syncRenderer();
12587
+ }
12588
+ function markRead(id) {
12589
+ const entry = historyEntry(id);
12590
+ if (entry && !entry.read) {
12591
+ entry.read = true;
12592
+ emitHistory();
12593
+ }
12594
+ }
12595
+ function configure(opts) {
12325
12596
  if (opts.renderer !== void 0) {
12326
12597
  renderer?.detach?.();
12327
12598
  renderer = opts.renderer;
12328
12599
  renderer.attach({ onTap(id) {
12329
12600
  const notification = visible.find((n) => n.id === id);
12330
12601
  if (!notification) return;
12602
+ markRead(id);
12331
12603
  if (notification.onTap) notification.onTap(id);
12332
12604
  else options.tapHandlerDefault?.(notification);
12333
12605
  if (options.tapBehaviour === `dismiss`) dismiss(id);
@@ -12339,14 +12611,21 @@ const NotificationManager = {
12339
12611
  if (opts.queue !== void 0) options.queue = opts.queue;
12340
12612
  if (opts.queueSize !== void 0) {
12341
12613
  options.queueSize = Math.max(1, opts.queueSize);
12342
- while (visible.length > options.queueSize) clearTimer(visible.shift());
12614
+ while (visible.length > options.queueSize) evict(visible.shift());
12343
12615
  ensureFrontTimer();
12344
12616
  syncRenderer();
12345
12617
  }
12346
12618
  if (opts.tapBehaviour !== void 0) options.tapBehaviour = opts.tapBehaviour;
12347
12619
  if (opts.tapHandlerDefault !== void 0) options.tapHandlerDefault = opts.tapHandlerDefault;
12348
- },
12349
- notify(content) {
12620
+ if (opts.historyLimit !== void 0) {
12621
+ options.historyLimit = Math.max(0, Math.floor(opts.historyLimit));
12622
+ if (history.length > options.historyLimit) {
12623
+ history.splice(0, history.length - options.historyLimit);
12624
+ emitHistory();
12625
+ }
12626
+ }
12627
+ }
12628
+ function notify(content) {
12350
12629
  const id = crypto.randomUUID();
12351
12630
  const now = Date.now();
12352
12631
  const icon = content.icon ?? (content.type === `error` ? `error` : void 0);
@@ -12360,44 +12639,114 @@ const NotificationManager = {
12360
12639
  wasQueued: false
12361
12640
  };
12362
12641
  if (options.queue) {
12363
- if (visible.length >= options.queueSize) clearTimer(visible.shift());
12642
+ if (visible.length >= options.queueSize) evict(visible.shift());
12364
12643
  managed.wasQueued = visible.length > 0;
12365
12644
  visible.push(managed);
12366
12645
  } else {
12367
- while (visible.length > 0) clearTimer(visible.pop());
12646
+ while (visible.length > 0) evict(visible.pop());
12368
12647
  visible.push(managed);
12369
12648
  }
12649
+ if (options.historyLimit > 0) {
12650
+ const { timer: _timer, wasQueued: _wasQueued, ...record } = managed;
12651
+ history.push({
12652
+ ...record,
12653
+ read: false
12654
+ });
12655
+ if (history.length > options.historyLimit) history.splice(0, history.length - options.historyLimit);
12656
+ emitHistory();
12657
+ }
12370
12658
  ensureFrontTimer();
12371
12659
  syncRenderer();
12372
12660
  return id;
12373
- },
12374
- update(id, content) {
12661
+ }
12662
+ function update(id, content) {
12375
12663
  const managed = visible.find((n) => n.id === id);
12376
- if (!managed) return;
12377
- Object.assign(managed, content);
12378
- managed.updatedAt = Date.now();
12379
- if (visible[0] === managed) {
12380
- clearTimer(managed);
12381
- startTimer(managed);
12664
+ if (managed) {
12665
+ Object.assign(managed, content);
12666
+ managed.updatedAt = Date.now();
12667
+ if (visible[0] === managed) {
12668
+ clearTimer(managed);
12669
+ startTimer(managed);
12670
+ }
12671
+ syncRenderer();
12382
12672
  }
12673
+ const entry = historyEntry(id);
12674
+ if (entry) {
12675
+ Object.assign(entry, content);
12676
+ entry.updatedAt = Date.now();
12677
+ emitHistory();
12678
+ }
12679
+ }
12680
+ function dismissAll() {
12681
+ for (const m of visible) evict(m);
12682
+ visible.length = 0;
12383
12683
  syncRenderer();
12684
+ }
12685
+ function markAllRead() {
12686
+ let changed = false;
12687
+ for (const entry of history) if (!entry.read) {
12688
+ entry.read = true;
12689
+ changed = true;
12690
+ }
12691
+ if (changed) emitHistory();
12692
+ }
12693
+ function clearHistory() {
12694
+ if (history.length === 0) return;
12695
+ history.length = 0;
12696
+ emitHistory();
12697
+ }
12698
+ function destroy() {
12699
+ dismissAll();
12700
+ history.length = 0;
12701
+ listeners.clear();
12702
+ renderer?.detach?.();
12703
+ renderer = null;
12704
+ }
12705
+ configure(initial);
12706
+ return {
12707
+ configure,
12708
+ notify,
12709
+ update,
12710
+ dismiss,
12711
+ dismissAll,
12712
+ getHistory,
12713
+ get unreadCount() {
12714
+ return history.reduce((n, entry) => entry.read ? n : n + 1, 0);
12715
+ },
12716
+ markRead,
12717
+ markAllRead,
12718
+ clearHistory,
12719
+ subscribe(listener) {
12720
+ listeners.add(listener);
12721
+ return () => listeners.delete(listener);
12722
+ },
12723
+ destroy
12724
+ };
12725
+ }
12726
+ const scopes = /* @__PURE__ */ new Map();
12727
+ const defaultManager = createNotificationManager();
12728
+ /**
12729
+ * The default, app-wide manager. Also a registry of named, independent
12730
+ * scopes: `NotificationManager.scope('lister-1', { renderer })`.
12731
+ */
12732
+ const NotificationManager = {
12733
+ ...defaultManager,
12734
+ get unreadCount() {
12735
+ return defaultManager.unreadCount;
12384
12736
  },
12385
- dismiss(id) {
12386
- dismiss(id);
12737
+ scope(name, opts) {
12738
+ let instance = scopes.get(name);
12739
+ if (!instance) {
12740
+ instance = createNotificationManager(opts);
12741
+ scopes.set(name, instance);
12742
+ }
12743
+ return instance;
12387
12744
  },
12388
- dismissAll() {
12389
- for (const m of visible) clearTimer(m);
12390
- visible.length = 0;
12391
- syncRenderer();
12745
+ releaseScope(name) {
12746
+ scopes.get(name)?.destroy();
12747
+ scopes.delete(name);
12392
12748
  }
12393
12749
  };
12394
- function dismiss(id) {
12395
- const idx = visible.findIndex((m) => m.id === id);
12396
- if (idx === -1) return;
12397
- clearTimer(visible.splice(idx, 1)[0]);
12398
- ensureFrontTimer();
12399
- syncRenderer();
12400
- }
12401
12750
  // src/panel/panel-group.ts
12402
12751
  /** Pointer movement threshold (px) before a press becomes a drag. */
12403
12752
  const DRAG_THRESHOLD_PX$2 = 5;
@@ -17807,4 +18156,4 @@ function monitorIndeterminate(targetElOrQuery, watchedElsOrQueries) {
17807
18156
  function init() {
17808
18157
  console.log(`Init`);
17809
18158
  }
17810
- export { AGE_UNITS, AcTextElement, AcTokenElement, BottomDrawerElement, ButtonElement, Checkbox, CheckedSelect, ColourPicker, ColourPickerPopup, CrumbNavigationElement, CrumbPathController, CrumbPathElement, DEFAULT_FORCE_OPTIONS, DEFAULT_SIBLING_SPACING, DRAG_THRESHOLD_PX, DataController, DataDisplayComponent, DataGridElement, DataTableElement, DateInputElement, DetailListElement, DockHostElement, DockPanelElement, EASY_CONNECT_MARGIN, EDGE_CORNER_RADIUS, EMPTY_FLAGS, EMPTY_GROUP_LABEL, EMPTY_KEYS, EditableLabel, EditableNumber, FlatListElement, FormElement, FormGroupElement, FormOptionsElement, FormPartElement, FormRowElement, GraphNodeElement, GraphPortElement, GridListElement, GroupedItemListerElement, HyperbolicTreeListElement, ICON_CARET_RIGHT, ICON_CHECK, ICON_CHEVRON_DOWN, ICON_CLOSE, IcicleTreeListElement, IncrSearchTreeController as IncrSearchMillerController, IncrSearchTreeController, IxfxHexEditorElement, IxfxIconElement, IxfxTimelineElement, KeyedElementIndex, LIST_ITEM_MOTION_MS, LIST_SEARCH_COMMAND_IDS, LIST_SEARCH_MODES, LabelledRadialInput, LabelledRangeInput, LabelledSliderInput, LedElement, ListDragSelectController, ListGroupHeaderElement, ListNativeDragController, ListSearchController, ListSelectionController, MARQUEE_THRESHOLD_PX, MAX_BLINK_HZ, MAX_FLOW_SPEED, MAX_PENDING_KEYS, MarqueeController, menu_exports as Menu, MillerBaseElement, MillerListElement, MillerTreeController, MulticolListElement, NODE_SHAPES, NarrowedTextElement, NodeDragController, NodeGraphElement, NotificationManager, NotificationPillElement, PARTIAL_DESCRIPTION, PanTextElement, PanZoomController, PanelElement, PanelGroupElement, PlotDataSeries, PlotHistogram, PlotMultiAxis, PlotSingleAxis, PlotXyAxis, PolarPad, RESIZE_HANDLES, RadialInputElement, RadioGroup, RangeElement, RangeInput, RangeMultiElement, RatingElement, SCROLL_HOVER_SUPPRESS_ATTR, SIZE_UNITS, SUNBURST_PATH_SEPARATOR, SelectHorizElement, ShapefillValueElement, SliderInputElement, SlidingNumberElement, SnackbarElement, SnapContainer, SplitButton, SplitLayoutElement, SplitPanelElement, SunburstTreeListElement, SwipeElement, TabController, TabListElement, TabListItemElement, TabPanelElement, TabPanelsElement, TextShimmerElement, TickledController, TimelineController, TimelineTrackTabElement, TitlebarElement, ToolbarElement, ToolbarGroupElement, TooltipElement, TransitoryLabelElement, TreeBaseElement, TreeController, TreeDataModel, TreeDropController, TreeKeyboardNavController, TreeListElement, TreemapListElement, TwoSplitLayoutElement, UnitInputElement, VIEW_STATE_CHANGE, VIEW_STATE_VERSION, VerticalListElement, ViewStateController, WireDragController, XyPad, addPanelToStack, addWire, anchorFromRow, animateListItemIn, animateListItemOut, applyAgeModification, applyHighlights, applyIsometry, applyPartialAttributes, applySnapshot, applyTreeDrop, attachTimelineInteractions, bestUnit, bindViewState, blinkPeriodSeconds, bottomDrawerCommandId, boundsOf, buildHighlightTargets, buildModel, canConnect, capFlags, capKeys, captionForEntry, captureElementScroll, clampToDisk, clampZoom, clearHighlights, collapsedOffset, collectContainerNames, collectDataResult, collectPanelIds, collectStackPaths, combineSelection, composeIsometry, computeCanonicalPositions, computeColour, computeHyperbolicLayout, computeIcicleLayout, computeLeafGeoms, computeSunburstLayout, computeTreemapLayout, connectContext, createAcCompletionProvider, createDataListSearchAdapter, createDefaultListDragPreview, createElementIncrSearch, createElementListSearchAdapter, createEmptyLayout, createEmptyStack, createFuzzySearch, createIncrSearch, createPillRenderer, createScrollHoverGuard, createSplit, createStack, createTreeListAdapter, createTreeListSearchAdapter, createValueResolver, createVerticalListAdapter, cycleBlockedNodes, decomposeViewIsometry, defaultGroupLabel, defaultSide, defaultSunburstValueAccessor, distribute, dropTargetFor, edgeId, edgeMidpoint, edgePath, edgeShape, ensurePort, euclideanRadiusForHyperbolicDistance, extendFromSide, extractStack, findEmptiedStacks, findHyperbolicIdOf, findHyperbolicKeyPath, findHyperbolicNode, findHyperbolicPath, findHyperbolicPathById, findIcicleKeyPath, findIcicleNode, findIciclePath, findNode, findPanelNode, findParentOf, findProximityConnection, findSnapTarget, findStackOf, findStackPathByName, findSunburstId, findSunburstNodeById, findTreemapNode, findTreemapPath, findValidWire, fitBounds, fitRects, flagsFromRecord, flagsToRecord, flowToScreen, forceMovement, forcePin, forcePositions, forceState, forceStep, formatDateInput, fromEdges, geodesicInterpolate, geodesicPath, geodesicSegment, gestureOf, getActiveDragPanelId, getIcon, getIconEntry, getIconFont, getLeafNeighbours, hasIcon, hasWire, hyperbolicBranchId, hyperbolicChildIds, hyperbolicDistanceForEuclideanRadius, hyperbolicIdDepth, hyperbolicRelativeFrame, iconBus, identityIsometry, inDegreeOf, inEasyConnectZone, incomingEdge, incomingEdges, init, insertBeside, invertIsometry, isDragging, isEditableTarget, isHyperbolicDescendantId, isMultiMode, isNodeShape, isPartialKey, isResizeHandle, isSplit, isStack, isSunburstAncestorId, isViewStateful, keyForElement, keysAsFlags, keysToArray, listItemFadeKeyframes, listSearchStyles, marqueeStyle, measureNode, mobiusAdd, mobiusFromOrigin, mobiusToOrigin, monitorIndeterminate, moveLeafNodeToEdge, moveLeafStep, nodeGraphStyles, nodesInRect, norm, normalise, normaliseConnection, normaliseValue, normalize, onUserScrollIntent, outDegreeOf, panBy, panelGapIndex, parseColourScaleAttr, parseDateInput, parseLayout, parsePortId, partitionByGroup, partitionFlags, partitionKeys, pickStartPort, poincareDistance, pointerOverAnyHost, polylineMidpoint, polylinePath, polylineShape, portId, prefersReducedMotion, preserveRestoreWeights, proximityFactor, pruneDraggedDescendants, readBaseColour, rectFromPoints, rectGap, rectsIntersect, registerFontIcon, registerIcon, registerListSearchCommands, removeNode, removeNodes, removePanelFromStack, removeWire, renderWires, resizeRect, resolveConnection, resolveCssVars, resolveGrid, resolveGroupKey, resolveIcicleKeyPath, resolveLeafPath, resolveTracks, restoreElementScroll, rotationIsometry, sameKeySet, sanitizeFlowSpeed, screenToFlow, scrollToOffset, selectionAfterEdgeClick, selectionAfterNodePress, serializeLayout, setActive, setIconFont, setPanelRestoreWeight, settled, shapeSpec, smoothStep, snapshotNonEmptyStacks, startListItemOutAnimation, stepPoints, sunburstChildId, sunburstHasChildren, sunburstIdToPath, sunburstParentId, sunburstPathToId, svgToDataUri, swapLeaves, tickledItemStyles, tickledStyles, timelineStyles, toBase, toEdges, toGroupKey, toNodeGraph, toSnapshot, toggleInSet, toolbarGapIndex, translationFromOrigin, typesCompatible, viewIsometry, walk, wantsMarquee, withEntry, withWireFlow, withoutFlag, wrapRoot, zoomAt };
18159
+ export { AGE_UNITS, AcTextElement, AcTokenElement, BottomDrawerElement, ButtonElement, Checkbox, CheckedSelect, ColourPicker, ColourPickerPopup, CrumbNavigationElement, CrumbPathController, CrumbPathElement, DEFAULT_FORCE_OPTIONS, DEFAULT_ITEM_TAG_FLAGS, DEFAULT_SIBLING_SPACING, DRAG_THRESHOLD_PX, DataController, DataDisplayComponent, DataGridElement, DataTableElement, DateInputElement, DetailListElement, DockHostElement, DockPanelElement, EASY_CONNECT_MARGIN, EDGE_CORNER_RADIUS, EMPTY_FLAGS, EMPTY_GROUP_LABEL, EMPTY_KEYS, EditableLabel, EditableNumber, FlatListElement, FormElement, FormGroupElement, FormOptionsElement, FormPartElement, FormRowElement, GraphNodeElement, GraphPortElement, GridListElement, GroupedItemListerElement, HyperbolicTreeListElement, ICON_CARET_RIGHT, ICON_CHECK, ICON_CHEVRON_DOWN, ICON_CLOSE, IcicleTreeListElement, IncrSearchTreeController as IncrSearchMillerController, IncrSearchTreeController, ItemTagResolver, IxfxHexEditorElement, IxfxIconElement, IxfxTimelineElement, KeyedElementIndex, LIST_ITEM_MOTION_MS, LIST_SEARCH_COMMAND_IDS, LIST_SEARCH_MODES, LabelledRadialInput, LabelledRangeInput, LabelledSliderInput, LedElement, ListDragSelectController, ListGroupHeaderElement, ListNativeDragController, ListSearchController, ListSelectionController, MARQUEE_THRESHOLD_PX, MAX_BLINK_HZ, MAX_FLOW_SPEED, MAX_PENDING_KEYS, MarqueeController, menu_exports as Menu, MillerBaseElement, MillerListElement, MillerTreeController, MulticolListElement, NODE_SHAPES, NarrowedTextElement, NodeDragController, NodeGraphElement, NotificationManager, NotificationPillElement, PARTIAL_DESCRIPTION, PanTextElement, PanZoomController, PanelElement, PanelGroupElement, PlotDataSeries, PlotHistogram, PlotMultiAxis, PlotSingleAxis, PlotXyAxis, PolarPad, RESIZE_HANDLES, RadialInputElement, RadioGroup, RangeElement, RangeInput, RangeMultiElement, RatingElement, SCROLL_HOVER_SUPPRESS_ATTR, SIZE_UNITS, SUNBURST_PATH_SEPARATOR, SelectHorizElement, ShapefillValueElement, SliderInputElement, SlidingNumberElement, SnackbarElement, SnapContainer, SplitButton, SplitLayoutElement, SplitPanelElement, SunburstTreeListElement, SwipeElement, TAG_PART_PREFIX, TabController, TabListElement, TabListItemElement, TabPanelElement, TabPanelsElement, TextShimmerElement, TickledController, TimelineController, TimelineTrackTabElement, TitlebarElement, ToolbarElement, ToolbarGroupElement, TooltipElement, TransitoryLabelElement, TreeBaseElement, TreeController, TreeDataModel, TreeDropController, TreeKeyboardNavController, TreeListElement, TreemapListElement, TwoSplitLayoutElement, UnitInputElement, VIEW_STATE_CHANGE, VIEW_STATE_VERSION, VerticalListElement, ViewStateController, WireDragController, XyPad, addPanelToStack, addWire, anchorFromRow, animateListItemIn, animateListItemOut, applyAgeModification, applyHighlights, applyIsometry, applyPartialAttributes, applySnapshot, applyTagAttributes, applyTreeDrop, attachTimelineInteractions, bestUnit, bindViewState, blinkPeriodSeconds, bottomDrawerCommandId, boundsOf, buildHighlightTargets, buildModel, canConnect, capFlags, capKeys, captionForEntry, captureElementScroll, clampToDisk, clampZoom, clearHighlights, collapsedOffset, collectContainerNames, collectDataResult, collectPanelIds, collectStackPaths, collectTags, combineSelection, composeIsometry, computeCanonicalPositions, computeColour, computeHyperbolicLayout, computeIcicleLayout, computeLeafGeoms, computeSunburstLayout, computeTreemapLayout, connectContext, createAcCompletionProvider, createDataListSearchAdapter, createDefaultListDragPreview, createElementIncrSearch, createElementListSearchAdapter, createEmptyLayout, createEmptyStack, createFuzzySearch, createIncrSearch, createNotificationManager, createPillRenderer, createScrollHoverGuard, createSplit, createStack, createTreeListAdapter, createTreeListSearchAdapter, createValueResolver, createVerticalListAdapter, cycleBlockedNodes, decomposeViewIsometry, defaultGroupLabel, defaultSide, defaultSunburstValueAccessor, distribute, dropTargetFor, edgeId, edgeMidpoint, edgePath, edgeShape, ensurePort, euclideanRadiusForHyperbolicDistance, extendFromSide, extractStack, findEmptiedStacks, findHyperbolicIdOf, findHyperbolicKeyPath, findHyperbolicNode, findHyperbolicPath, findHyperbolicPathById, findIcicleKeyPath, findIcicleNode, findIciclePath, findNode, findPanelNode, findParentOf, findProximityConnection, findSnapTarget, findStackOf, findStackPathByName, findSunburstId, findSunburstNodeById, findTreemapNode, findTreemapPath, findValidWire, fitBounds, fitRects, flagsFromRecord, flagsToRecord, flowToScreen, forceMovement, forcePin, forcePositions, forceState, forceStep, formatDateInput, fromEdges, geodesicInterpolate, geodesicPath, geodesicSegment, gestureOf, getActiveDragPanelId, getIcon, getIconEntry, getIconFont, getLeafNeighbours, hasIcon, hasWire, hyperbolicBranchId, hyperbolicChildIds, hyperbolicDistanceForEuclideanRadius, hyperbolicIdDepth, hyperbolicRelativeFrame, iconBus, identityIsometry, inDegreeOf, inEasyConnectZone, incomingEdge, incomingEdges, init, insertBeside, invertIsometry, isDragging, isEditableTarget, isHyperbolicDescendantId, isMultiMode, isNodeShape, isPartialKey, isResizeHandle, isSplit, isStack, isSunburstAncestorId, isViewStateful, keyForElement, keysAsFlags, keysToArray, listItemFadeKeyframes, listSearchStyles, marqueeStyle, measureNode, mobiusAdd, mobiusFromOrigin, mobiusToOrigin, monitorIndeterminate, moveLeafNodeToEdge, moveLeafStep, nodeGraphStyles, nodesInRect, norm, normalise, normaliseConnection, normaliseValue, normalize, onUserScrollIntent, outDegreeOf, panBy, panelGapIndex, parseColourScaleAttr, parseDateInput, parseLayout, parsePortId, partitionByGroup, partitionFlags, partitionKeys, pickStartPort, poincareDistance, pointerOverAnyHost, polylineMidpoint, polylinePath, polylineShape, portId, prefersReducedMotion, preserveRestoreWeights, proximityFactor, pruneDraggedDescendants, readBaseColour, rectFromPoints, rectGap, rectsIntersect, registerFontIcon, registerIcon, registerListSearchCommands, removeNode, removeNodes, removePanelFromStack, removeWire, renderWires, resizeRect, resolveConnection, resolveCssVars, resolveGrid, resolveGroupKey, resolveIcicleKeyPath, resolveLeafPath, resolveTagFlags, resolveTracks, restoreElementScroll, rotationIsometry, sameKeySet, sameTagKeys, sameTags, sanitizeFlowSpeed, screenToFlow, scrollToOffset, selectionAfterEdgeClick, selectionAfterNodePress, serializeLayout, setActive, setIconFont, setPanelRestoreWeight, settled, shapeSpec, smoothStep, snapshotNonEmptyStacks, startListItemOutAnimation, stepPoints, sunburstChildId, sunburstHasChildren, sunburstIdToPath, sunburstParentId, sunburstPathToId, svgToDataUri, swapLeaves, tagPartTokens, tagsAttribute, tickledItemStyles, tickledStyles, timelineStyles, toBase, toEdges, toGroupKey, toNodeGraph, toSnapshot, toggleInSet, toolbarGapIndex, translationFromOrigin, typesCompatible, viewIsometry, walk, wantsMarquee, withEntry, withWireFlow, withoutFlag, wrapRoot, zoomAt };