@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.
- package/bundle/index.d.ts +351 -11
- package/bundle/index.js +402 -361
- package/dist/ac-text.js +1 -1
- package/dist/ac-token.js +2 -2
- package/dist/{checked-select-BmwqpgGr.js → checked-select-CC-qSO1P.js} +2 -2
- package/dist/checked-select.js +1 -1
- package/dist/{crumb-navigation-D7dAC0H-.js → crumb-navigation-C78edQGt.js} +3 -3
- package/dist/{crumb-navigation-Tm4fnsvN.d.ts → crumb-navigation-DOfOS7li.d.ts} +1 -1
- package/dist/crumbs.d.ts +1 -1
- package/dist/crumbs.js +1 -1
- package/dist/{data-grid-vasJtjFP.d.ts → data-grid-BYMZZbNc.d.ts} +32 -3
- package/dist/{data-grid-BcO3SMac.js → data-grid-CJrbLzLr.js} +80 -18
- package/dist/data-grid.d.ts +2 -2
- package/dist/data-grid.js +1 -1
- package/dist/{detail-list-E9WdMVbE.d.ts → detail-list-CBgnKkEm.d.ts} +35 -3
- package/dist/{detail-list-vPVwE1CP.js → detail-list-Dk9oSvAZ.js} +75 -10
- package/dist/detail-list.d.ts +3 -3
- package/dist/detail-list.js +1 -1
- package/dist/{flat-list-CfutGqKY.d.ts → flat-list-D5glF_vD.d.ts} +5 -3
- package/dist/flat-list.d.ts +1 -1
- package/dist/flat-list.js +5 -3
- package/dist/{grid-list-D2hinM64.js → grid-list-0wC2xGBS.js} +104 -14
- package/dist/{grid-list-OCdjuhng.d.ts → grid-list-B3T_2N0N.d.ts} +34 -4
- package/dist/grid-list.d.ts +2 -2
- package/dist/grid-list.js +1 -1
- package/dist/{incr-search-C5114RxZ.js → incr-search-Bk4acsCM.js} +14 -6
- package/dist/incr-search.d.ts +1 -1
- package/dist/incr-search.js +1 -1
- package/dist/{index-88ra6YHP.d.ts → index-BIv_Hu7C.d.ts} +4 -4
- package/dist/{index-CRLTVAyt.d.ts → index-BuvySJEc.d.ts} +5 -1
- package/dist/{index-CzhYJJsx.d.ts → index-fhZCKSY6.d.ts} +3 -3
- package/dist/index.d.ts +134 -26
- package/dist/index.js +479 -130
- package/dist/interaction-DNuFnTm0.js +3 -0
- package/dist/item-tags-Dz-jQq-4.d.ts +65 -0
- package/dist/{list-native-drag-controller-ByftBooJ.js → list-native-drag-controller-B_INa6_G.js} +109 -1
- package/dist/{list-native-drag-controller-CgXKdmjr.d.ts → list-native-drag-controller-Cs-Tmtaa.d.ts} +1 -1
- package/dist/{menu-C3DhTjHx.js → menu-CgT60B3-.js} +3 -3
- package/dist/{menu-item-BSxhlWnW.js → menu-item-CbywH4Xo.js} +3 -3
- package/dist/menu.js +2 -2
- package/dist/{miller-DqDEaXqT.js → miller-Dyv4UM7k.js} +3 -3
- package/dist/miller.d.ts +2 -2
- package/dist/miller.js +1 -1
- package/dist/narrowed-text.js +3 -3
- package/dist/{node-graph-DqEGv5QR.js → node-graph-yrbOLbYo.js} +1 -1
- package/dist/node-graph.js +1 -1
- package/dist/{notification-pill-BiHEJk-o.d.ts → notification-pill-BJonE_wo.d.ts} +14 -1
- package/dist/notifier.d.ts +1 -1
- package/dist/select-horiz.js +2 -2
- package/dist/sunburst-tree.d.ts +1 -1
- package/dist/sunburst-tree.js +1 -1
- package/dist/{sunbursttree-list-C-FuZB5z.js → sunbursttree-list-CJdznPzN.js} +2 -2
- package/dist/{sunbursttree-list-CsrmVSB8.d.ts → sunbursttree-list-CmydFG66.d.ts} +2 -2
- package/dist/{tickled-controller-BVhGKzjZ.js → tickled-controller-BsFFr_1N.js} +1 -1
- package/dist/{tickled-controller-DSPoG551.d.ts → tickled-controller-Dz0UqwlQ.d.ts} +5 -0
- package/dist/{tree-BP5fxvEX.js → tree-C3rgEEmm.js} +4 -4
- package/dist/{tree-component-DNuzfo6R.d.ts → tree-component-BE7OEIiH.d.ts} +7 -1
- package/dist/tree.d.ts +2 -2
- package/dist/tree.js +1 -1
- package/dist/{vertical-list-B9z1lbjM.js → vertical-list-By-yuhkw.js} +61 -6
- package/dist/{vertical-list-BzeXehBt.d.ts → vertical-list-C4z3La0C.d.ts} +26 -2
- package/dist/vertical-list.d.ts +2 -2
- package/dist/vertical-list.js +1 -1
- package/docs-user/README.md +1 -0
- package/docs-user/button.md +31 -1
- package/docs-user/data-grid.md +3 -0
- package/docs-user/detail-list.md +3 -0
- package/docs-user/grid-list.md +8 -0
- package/docs-user/index.json +6 -2
- package/docs-user/llms.txt +1 -0
- package/docs-user/multicol-list.md +3 -0
- package/docs-user/notifier.md +28 -0
- package/docs-user/user-item-tags.md +68 -0
- package/llms.txt +1 -0
- package/package.json +3 -3
- 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-
|
|
12
|
+
import "./menu-item-CbywH4Xo.js";
|
|
13
13
|
import { Checkbox } from "./checkbox.js";
|
|
14
|
-
import { t as CheckedSelect } from "./checked-select-
|
|
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
|
|
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 {
|
|
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-
|
|
31
|
-
import "./interaction-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
46
|
-
import { t as TickledController } from "./tickled-controller-
|
|
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-
|
|
55
|
-
import { n as MillerListElement, r as MillerBaseElement, t as MillerTreeController } from "./miller-
|
|
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-
|
|
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-
|
|
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.
|
|
1109
|
+
this._openOverlay();
|
|
1088
1110
|
}
|
|
1089
1111
|
};
|
|
1090
1112
|
this._handleCaretKeyDown = (e) => {
|
|
1091
1113
|
if (e.key === `ArrowDown`) {
|
|
1092
1114
|
e.preventDefault();
|
|
1093
|
-
this.
|
|
1115
|
+
this._openOverlay();
|
|
1094
1116
|
}
|
|
1095
1117
|
};
|
|
1118
|
+
this._handleCaretPointerDown = () => {
|
|
1119
|
+
this.#caretWasOpenOnPress = this._resolvePopover()?.matches(`:popover-open`) ?? false;
|
|
1120
|
+
};
|
|
1096
1121
|
}
|
|
1097
|
-
|
|
1098
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
1676
|
-
return [...rootSegments, ...segments.slice(0, index + 1)].join(
|
|
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)))
|
|
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(
|
|
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.
|
|
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(
|
|
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
|
|
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
|
|
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(
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
12280
|
-
|
|
12281
|
-
|
|
12282
|
-
|
|
12283
|
-
|
|
12284
|
-
|
|
12285
|
-
|
|
12286
|
-
|
|
12287
|
-
|
|
12288
|
-
|
|
12289
|
-
|
|
12290
|
-
|
|
12291
|
-
|
|
12292
|
-
|
|
12293
|
-
|
|
12294
|
-
|
|
12295
|
-
|
|
12296
|
-
|
|
12297
|
-
|
|
12298
|
-
}
|
|
12299
|
-
|
|
12300
|
-
|
|
12301
|
-
|
|
12302
|
-
|
|
12303
|
-
|
|
12304
|
-
|
|
12305
|
-
|
|
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
|
-
|
|
12310
|
-
|
|
12311
|
-
|
|
12312
|
-
|
|
12313
|
-
|
|
12314
|
-
|
|
12315
|
-
|
|
12316
|
-
|
|
12317
|
-
|
|
12318
|
-
}
|
|
12319
|
-
|
|
12320
|
-
|
|
12321
|
-
|
|
12322
|
-
|
|
12323
|
-
|
|
12324
|
-
|
|
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)
|
|
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
|
-
|
|
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)
|
|
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)
|
|
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 (
|
|
12377
|
-
|
|
12378
|
-
|
|
12379
|
-
|
|
12380
|
-
|
|
12381
|
-
|
|
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
|
-
|
|
12386
|
-
|
|
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
|
-
|
|
12389
|
-
|
|
12390
|
-
|
|
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 };
|