@xeonr/platform-ui 1.5.1 → 1.6.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 (94) hide show
  1. package/dist/index.d.ts +12 -5
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +12 -3
  4. package/dist/index.js.map +1 -1
  5. package/dist/kit/Anchored.d.ts.map +1 -1
  6. package/dist/kit/Anchored.js +4 -1
  7. package/dist/kit/Anchored.js.map +1 -1
  8. package/dist/kit/Blocks.d.ts +6 -1
  9. package/dist/kit/Blocks.d.ts.map +1 -1
  10. package/dist/kit/Blocks.js +13 -2
  11. package/dist/kit/Blocks.js.map +1 -1
  12. package/dist/kit/Card.d.ts +6 -1
  13. package/dist/kit/Card.d.ts.map +1 -1
  14. package/dist/kit/Card.js +19 -4
  15. package/dist/kit/Card.js.map +1 -1
  16. package/dist/kit/Charts.d.ts +39 -3
  17. package/dist/kit/Charts.d.ts.map +1 -1
  18. package/dist/kit/Charts.js +70 -15
  19. package/dist/kit/Charts.js.map +1 -1
  20. package/dist/kit/CommandPalette.d.ts +47 -0
  21. package/dist/kit/CommandPalette.d.ts.map +1 -0
  22. package/dist/kit/CommandPalette.js +204 -0
  23. package/dist/kit/CommandPalette.js.map +1 -0
  24. package/dist/kit/DataTable.d.ts +18 -2
  25. package/dist/kit/DataTable.d.ts.map +1 -1
  26. package/dist/kit/DataTable.js +45 -6
  27. package/dist/kit/DataTable.js.map +1 -1
  28. package/dist/kit/Editable.d.ts +30 -0
  29. package/dist/kit/Editable.d.ts.map +1 -1
  30. package/dist/kit/Editable.js +150 -3
  31. package/dist/kit/Editable.js.map +1 -1
  32. package/dist/kit/EmptyState.d.ts +9 -2
  33. package/dist/kit/EmptyState.d.ts.map +1 -1
  34. package/dist/kit/EmptyState.js +16 -2
  35. package/dist/kit/EmptyState.js.map +1 -1
  36. package/dist/kit/GroupedMultiSelect.d.ts +57 -0
  37. package/dist/kit/GroupedMultiSelect.d.ts.map +1 -0
  38. package/dist/kit/GroupedMultiSelect.js +219 -0
  39. package/dist/kit/GroupedMultiSelect.js.map +1 -0
  40. package/dist/kit/List.d.ts +18 -1
  41. package/dist/kit/List.d.ts.map +1 -1
  42. package/dist/kit/List.js +38 -10
  43. package/dist/kit/List.js.map +1 -1
  44. package/dist/kit/LogView.d.ts +39 -3
  45. package/dist/kit/LogView.d.ts.map +1 -1
  46. package/dist/kit/LogView.js +52 -10
  47. package/dist/kit/LogView.js.map +1 -1
  48. package/dist/kit/Marker.d.ts +19 -0
  49. package/dist/kit/Marker.d.ts.map +1 -1
  50. package/dist/kit/Marker.js +50 -0
  51. package/dist/kit/Marker.js.map +1 -1
  52. package/dist/kit/Modal.d.ts +13 -3
  53. package/dist/kit/Modal.d.ts.map +1 -1
  54. package/dist/kit/Modal.js +39 -9
  55. package/dist/kit/Modal.js.map +1 -1
  56. package/dist/kit/Panel.d.ts +21 -0
  57. package/dist/kit/Panel.d.ts.map +1 -1
  58. package/dist/kit/Panel.js +36 -0
  59. package/dist/kit/Panel.js.map +1 -1
  60. package/dist/kit/PipelineFlow.d.ts +44 -0
  61. package/dist/kit/PipelineFlow.d.ts.map +1 -0
  62. package/dist/kit/PipelineFlow.js +215 -0
  63. package/dist/kit/PipelineFlow.js.map +1 -0
  64. package/dist/kit/Popover.d.ts.map +1 -1
  65. package/dist/kit/Popover.js +4 -1
  66. package/dist/kit/Popover.js.map +1 -1
  67. package/dist/kit/Reorder.d.ts +54 -0
  68. package/dist/kit/Reorder.d.ts.map +1 -0
  69. package/dist/kit/Reorder.js +171 -0
  70. package/dist/kit/Reorder.js.map +1 -0
  71. package/dist/kit/Stat.d.ts +38 -5
  72. package/dist/kit/Stat.d.ts.map +1 -1
  73. package/dist/kit/Stat.js +99 -11
  74. package/dist/kit/Stat.js.map +1 -1
  75. package/dist/kit/Tooltip.d.ts.map +1 -1
  76. package/dist/kit/Tooltip.js +5 -2
  77. package/dist/kit/Tooltip.js.map +1 -1
  78. package/dist/theme/ThemeScope.d.ts +30 -0
  79. package/dist/theme/ThemeScope.d.ts.map +1 -0
  80. package/dist/theme/ThemeScope.js +61 -0
  81. package/dist/theme/ThemeScope.js.map +1 -0
  82. package/dist/theme/brand.d.ts +2 -1
  83. package/dist/theme/brand.d.ts.map +1 -1
  84. package/dist/theme/brand.js +10 -6
  85. package/dist/theme/brand.js.map +1 -1
  86. package/dist/theme/scope.d.ts +23 -0
  87. package/dist/theme/scope.d.ts.map +1 -0
  88. package/dist/theme/scope.js +32 -0
  89. package/dist/theme/scope.js.map +1 -0
  90. package/dist/theme/tokens.d.ts +2 -1
  91. package/dist/theme/tokens.d.ts.map +1 -1
  92. package/dist/theme/tokens.js +65 -100
  93. package/dist/theme/tokens.js.map +1 -1
  94. package/package.json +1 -1
@@ -0,0 +1,215 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Fragment, useEffect, useLayoutEffect, useRef, useState } from "react";
3
+ import styled, { css, keyframes } from "styled-components";
4
+ import { v } from "../theme/tokens.js";
5
+ /**
6
+ * Cuts the steps into those before the fan-out, one lane per group, and those
7
+ * after. Lanes are keyed rather than adjacent, so a producer that emits
8
+ * position-major (group A's step 1, group B's step 1, A's step 2…) still gets a
9
+ * row per group; lane order follows first appearance. The grouped block is
10
+ * assumed contiguous — slicing rather than filtering keeps that visible.
11
+ */
12
+ export function splitPipeline(steps) {
13
+ const first = steps.findIndex((s) => s.group);
14
+ if (first < 0)
15
+ return { before: steps, lanes: [], after: [] };
16
+ let last = first;
17
+ for (let i = steps.length - 1; i > first; i -= 1) {
18
+ if (steps[i].group) {
19
+ last = i;
20
+ break;
21
+ }
22
+ }
23
+ const lanes = [];
24
+ const byKey = new Map();
25
+ for (const s of steps) {
26
+ if (!s.group)
27
+ continue;
28
+ let lane = byKey.get(s.group);
29
+ if (!lane) {
30
+ lane = { key: s.group, steps: [] };
31
+ byKey.set(s.group, lane);
32
+ lanes.push(lane);
33
+ }
34
+ lane.steps.push(s);
35
+ }
36
+ return { before: steps.slice(0, first), lanes, after: steps.slice(last + 1) };
37
+ }
38
+ const tone = {
39
+ pending: v.faint,
40
+ running: v.running,
41
+ done: v.success,
42
+ failed: v.danger,
43
+ skipped: v.faint,
44
+ };
45
+ const Wrap = styled.div `
46
+ display: flex;
47
+ flex-direction: column;
48
+ gap: 12px;
49
+ min-width: 0;
50
+ `;
51
+ const Lane = styled.div `
52
+ display: flex;
53
+ flex-direction: column;
54
+ gap: 6px;
55
+ min-width: 0;
56
+ padding-left: 14px;
57
+ border-left: 1px solid ${v.line2};
58
+ `;
59
+ const LaneLabel = styled.span `
60
+ font-size: 11px;
61
+ font-weight: 600;
62
+ color: ${v.muted};
63
+ `;
64
+ const Row = styled.ol `
65
+ display: flex;
66
+ align-items: flex-start;
67
+ margin: 0;
68
+ padding: 0;
69
+ list-style: none;
70
+ min-width: 0;
71
+ ${(p) => p.$stacked && css `
72
+ flex-direction: column;
73
+ gap: 8px;
74
+ `}
75
+ `;
76
+ /* The rule between two steps takes the colour of the step behind it, so a
77
+ completed run reads as one continuous line. Hidden once stacked: the gap
78
+ already says the same thing. */
79
+ const Link = styled.li `
80
+ flex: 1 1 14px;
81
+ min-width: 14px;
82
+ height: 1px;
83
+ margin-top: 8px;
84
+ list-style: none;
85
+ background: ${(p) => (p.$state === "pending" || p.$state === "skipped" ? v.line2 : tone[p.$state])};
86
+ ${(p) => p.$stacked && css `display: none;`}
87
+ `;
88
+ const Step = styled.li `
89
+ display: block;
90
+ min-width: 0;
91
+ flex: ${(p) => (p.$state === "running" ? "1 1 auto" : "0 1 auto")};
92
+ max-width: ${(p) => (p.$stacked ? "100%" : p.$state === "running" ? "32rem" : "14rem")};
93
+ ${(p) => p.$state === "skipped" && css `opacity: 0.6;`}
94
+ `;
95
+ const Head = styled.span `
96
+ display: flex;
97
+ align-items: center;
98
+ gap: 8px;
99
+ min-width: 0;
100
+ `;
101
+ /* Filled once the step has happened, hollow while it is merely expected: a
102
+ step that is ahead must not read as a step that is done. */
103
+ const Dot = styled.span `
104
+ flex: none;
105
+ width: 15px;
106
+ height: 15px;
107
+ border-radius: 50%;
108
+ border: 2px solid ${(p) => tone[p.$state]};
109
+ background: ${(p) => (p.$state === "pending" ? "transparent" : tone[p.$state])};
110
+ `;
111
+ const Label = styled.span `
112
+ font-size: 13px;
113
+ font-weight: ${(p) => (p.$state === "running" ? 650 : 400)};
114
+ color: ${(p) => (p.$state === "pending" || p.$state === "skipped" ? v.faint : v.text)};
115
+ min-width: 0;
116
+ /* a label that cannot fit is cut short (its whole text is the title), never
117
+ drawn over its neighbour */
118
+ overflow: hidden;
119
+ text-overflow: ellipsis;
120
+ white-space: nowrap;
121
+ `;
122
+ const Meta = styled.span `
123
+ display: block;
124
+ margin: 2px 0 0 23px;
125
+ font-size: 11px;
126
+ color: ${v.faint};
127
+ overflow: hidden;
128
+ text-overflow: ellipsis;
129
+ white-space: nowrap;
130
+ `;
131
+ const slide = keyframes `
132
+ from { transform: translateX(-100%); }
133
+ to { transform: translateX(400%); }
134
+ `;
135
+ const Bar = styled.span `
136
+ display: block;
137
+ margin: 5px 0 0 23px;
138
+ max-width: 192px;
139
+ height: 3px;
140
+ overflow: hidden;
141
+ border-radius: 999px;
142
+ background: ${v.field};
143
+
144
+ &::after {
145
+ content: "";
146
+ display: block;
147
+ height: 100%;
148
+ border-radius: 999px;
149
+ background: ${v.grad90};
150
+ /* the figure arrives as a custom property, so a poll does not mint a class per value */
151
+ width: ${(p) => (p.$indeterminate ? "25%" : "clamp(0%, calc(var(--value, 0) * 100%), 100%)")};
152
+ ${(p) => p.$indeterminate && css `animation: ${slide} 2.4s ease-in-out infinite;`}
153
+ }
154
+ @media (prefers-reduced-motion: reduce) { &::after { animation: none; } }
155
+ `;
156
+ const useIsoLayoutEffect = typeof window === "undefined" ? useEffect : useLayoutEffect;
157
+ /** A step's dot and the gap after it, and the shortest rule between two steps. */
158
+ const DOT_AND_GAP = 23;
159
+ const LINK_MIN = 14;
160
+ /**
161
+ * A row stacks when its steps, at their natural width, would not fit across
162
+ * it. The labels' scrollWidth is their natural width whether they are drawn
163
+ * cut short (in a row) or whole (stacked), so the decision does not flip-flop
164
+ * as the layout changes under it.
165
+ */
166
+ function StepRow({ steps, width }) {
167
+ const row = useRef(null);
168
+ const [need, setNeed] = useState(null);
169
+ useIsoLayoutEffect(() => {
170
+ const el = row.current;
171
+ if (!el)
172
+ return;
173
+ let total = (steps.length - 1) * LINK_MIN;
174
+ el.querySelectorAll("[data-pipeline-label]").forEach((l) => { total += l.scrollWidth + DOT_AND_GAP; });
175
+ setNeed(total);
176
+ }, [steps, width]);
177
+ const stacked = width !== null && need !== null && width < need;
178
+ return (_jsx(Row, { ref: row, "$stacked": stacked, "data-stacked": stacked || undefined, children: steps.map((s, i) => (_jsxs(Fragment, { children: [i > 0 ? _jsx(Link, { "$state": steps[i - 1].state, "$stacked": stacked, "aria-hidden": true }) : null, _jsxs(Step, { "$state": s.state, "$stacked": stacked, "data-state": s.state, "aria-current": s.state === "running" ? "step" : undefined, children: [_jsxs(Head, { children: [_jsx(Dot, { "$state": s.state, "aria-hidden": true }), _jsx(Label, { "$state": s.state, "data-pipeline-label": true, title: typeof s.label === "string" ? s.label : undefined, children: s.label }), _jsx("span", { style: SR_ONLY, children: `, ${s.state}` })] }), s.meta ? _jsx(Meta, { title: typeof s.meta === "string" ? s.meta : undefined, children: s.meta }) : null, s.state === "running" && s.progress !== undefined ? (_jsx(Bar, { role: "progressbar", "aria-valuemin": 0, "aria-valuemax": 100, ...(s.progress === "indeterminate" ? {} : { "aria-valuenow": Math.round(s.progress * 100) }), "$indeterminate": s.progress === "indeterminate", style: s.progress === "indeterminate" ? undefined : { "--value": s.progress } })) : null] })] }, s.id))) }));
179
+ }
180
+ /** The element's content width, followed as it changes; null until measured (and on the server). */
181
+ function useWidth(ref, mounted) {
182
+ const [width, setWidth] = useState(null);
183
+ useIsoLayoutEffect(() => {
184
+ const el = ref.current;
185
+ if (!el)
186
+ return;
187
+ const read = () => setWidth(el.clientWidth);
188
+ read();
189
+ if (typeof ResizeObserver === "undefined")
190
+ return;
191
+ const ro = new ResizeObserver(read);
192
+ ro.observe(el);
193
+ return () => ro.disconnect();
194
+ }, [ref, mounted]);
195
+ return width;
196
+ }
197
+ const SR_ONLY = {
198
+ position: "absolute", width: 1, height: 1, overflow: "hidden", clip: "rect(0 0 0 0)", whiteSpace: "nowrap",
199
+ };
200
+ /**
201
+ * PipelineFlow: ordered steps with a state each, drawn as a connected row (a
202
+ * stack when narrow). A step's `meta` is the line under it and `progress` the
203
+ * bar under a running step (`"indeterminate"` sweeps, for work that finds out
204
+ * its size by finishing). Steps carrying a `group` are lifted into a row per
205
+ * group between the trunk steps that bracket them; `groups` names the lanes.
206
+ */
207
+ export function PipelineFlow({ steps, groups, label = "Pipeline" }) {
208
+ const ref = useRef(null);
209
+ const width = useWidth(ref, steps.length > 0);
210
+ if (steps.length === 0)
211
+ return null;
212
+ const { before, lanes, after } = splitPipeline(steps);
213
+ return (_jsxs(Wrap, { ref: ref, role: "group", "aria-label": label, children: [before.length > 0 ? _jsx(StepRow, { steps: before, width: width }) : null, lanes.map((l) => (_jsxs(Lane, { children: [_jsx(LaneLabel, { children: groups?.[l.key] ?? l.key }), _jsx(StepRow, { steps: l.steps, width: width })] }, l.key))), after.length > 0 ? _jsx(StepRow, { steps: after, width: width }) : null] }));
214
+ }
215
+ //# sourceMappingURL=PipelineFlow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PipelineFlow.js","sourceRoot":"","sources":["../../src/kit/PipelineFlow.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Popover.d.ts","sourceRoot":"","sources":["../../src/kit/Popover.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAgD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AA0CrF,eAAO,MAAM,WAAW;;WAgBvB,CAAC;AAEF,eAAO,MAAM,WAAW;;;aAAyB,OAAO,GAAG,SAAS;YAMnE,CAAC;AAEF,eAAO,MAAM,WAAW;;WAKvB,CAAC;AAEF,+EAA+E;AAC/E,eAAO,MAAM,YAAY;;WAIxB,CAAC;AAEF,MAAM,WAAW,YAAY;IAC3B,uEAAuE;IACvE,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,6CAA6C;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,uEAAuE;IACvE,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC3B,mDAAmD;IACnD,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5B;;;;OAIG;IACH,IAAI,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;IACvD;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,GAAG,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC/C,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,wBAAgB,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,KAAW,EAAE,IAAW,EAAE,KAAK,EAAE,IAAe,EAAE,KAAe,EAAE,QAAQ,EAAE,EAAE,YAAY,+BAiE5I"}
1
+ {"version":3,"file":"Popover.d.ts","sourceRoot":"","sources":["../../src/kit/Popover.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAgD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AA2CrF,eAAO,MAAM,WAAW;;WAgBvB,CAAC;AAEF,eAAO,MAAM,WAAW;;;aAAyB,OAAO,GAAG,SAAS;YAMnE,CAAC;AAEF,eAAO,MAAM,WAAW;;WAKvB,CAAC;AAEF,+EAA+E;AAC/E,eAAO,MAAM,YAAY;;WAIxB,CAAC;AAEF,MAAM,WAAW,YAAY;IAC3B,uEAAuE;IACvE,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,6CAA6C;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,uEAAuE;IACvE,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC3B,mDAAmD;IACnD,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5B;;;;OAIG;IACH,IAAI,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;IACvD;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,GAAG,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC/C,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,wBAAgB,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,KAAW,EAAE,IAAW,EAAE,KAAK,EAAE,IAAe,EAAE,KAAe,EAAE,QAAQ,EAAE,EAAE,YAAY,+BAmE5I"}
@@ -1,6 +1,7 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { useEffect, useLayoutEffect, useRef, useState } from "react";
3
3
  import { createPortal } from "react-dom";
4
+ import { usePortalTarget } from "../theme/ThemeScope.js";
4
5
  import styled from "styled-components";
5
6
  import { v } from "../theme/tokens.js";
6
7
  import { useEscapeLayer } from "./layers.js";
@@ -75,6 +76,8 @@ export const PopoverGroup = styled.div `
75
76
  `;
76
77
  export function Popover({ anchor, onClose, label, width = 268, flip = true, sheet, side = "bottom", align = "start", children }) {
77
78
  const ref = useRef(null);
79
+ // the nearest ThemeScope's host, or body (CON-148)
80
+ const portalTarget = usePortalTarget();
78
81
  const [pos, setPos] = useState({ top: anchor.bottom + 4, left: anchor.left });
79
82
  // Escape closes this before any drawer or modal it sits in (CON-59)
80
83
  useEscapeLayer(true, onClose);
@@ -130,6 +133,6 @@ export function Popover({ anchor, onClose, label, width = 268, flip = true, shee
130
133
  window.clearTimeout(id);
131
134
  };
132
135
  }, [onClose]);
133
- return createPortal(_jsx(Sheet, { ref: ref, "$width": width, "$sheet": sheet, "$raised": raised, style: { top: pos.top, left: pos.left }, role: "dialog", "aria-label": label, children: children }), document.body);
136
+ return createPortal(_jsx(Sheet, { ref: ref, "$width": width, "$sheet": sheet, "$raised": raised, style: { top: pos.top, left: pos.left }, role: "dialog", "aria-label": label, children: children }), portalTarget ?? document.body);
134
137
  }
135
138
  //# sourceMappingURL=Popover.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Popover.js","sourceRoot":"","sources":["../../src/kit/Popover.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Popover.js","sourceRoot":"","sources":["../../src/kit/Popover.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import { type ReactNode } from "react";
2
+ type MarkerTone = "brand" | "info" | "warn";
3
+ /** The line between two rows, and how it moves. */
4
+ export type ReorderMarker<T> = {
5
+ /** the index of the row the line sits under; null draws no line */
6
+ after: number | null;
7
+ /** the line moved (to under row `after`) or, with null, was cleared */
8
+ onMove: (after: number | null) => void;
9
+ /** what the line says */
10
+ label: ReactNode;
11
+ /** the line's name in button labels and announcements, e.g. "Cutoff" */
12
+ name: string;
13
+ tone?: MarkerTone | undefined;
14
+ /** which rows can hold the line (default: every row) */
15
+ canHold?: ((item: T, index: number) => boolean) | undefined;
16
+ /** the offer, revealed on a row's hover or focus, to put the line under it; omit for none */
17
+ placeLabel?: ReactNode | undefined;
18
+ /** whether the line has a clear button */
19
+ clearable?: boolean | undefined;
20
+ };
21
+ export type ReorderListProps<T> = {
22
+ items: T[];
23
+ /** the whole list in its new order; `from` and `to` are the moved row's indexes */
24
+ onReorder: (next: T[], move: {
25
+ from: number;
26
+ to: number;
27
+ }) => void;
28
+ /** a stable key per item — React keeps a moved row's DOM, so its fields keep focus */
29
+ itemKey: (item: T, index: number) => string;
30
+ /** the row's name in plain text, for button labels and announcements */
31
+ itemLabel: (item: T, index: number) => string;
32
+ /** the row's content */
33
+ render: (item: T, index: number) => ReactNode;
34
+ /** an inline field after the content — a ceiling, a weight, a toggle */
35
+ field?: ((item: T, index: number) => ReactNode) | undefined;
36
+ /** trailing actions (remove, overflow menu) */
37
+ actions?: ((item: T, index: number) => ReactNode) | undefined;
38
+ /** dim a row that is in the list but out of play (excluded, disabled) */
39
+ dim?: ((item: T, index: number) => boolean) | undefined;
40
+ marker?: ReorderMarker<T> | undefined;
41
+ /** reveal the move buttons only on hover or focus — for a long list where they would crowd it */
42
+ quiet?: boolean | undefined;
43
+ disabled?: boolean | undefined;
44
+ "aria-label"?: string | undefined;
45
+ };
46
+ /**
47
+ * ReorderList: a controlled, keyboard-accessible ordered list. Each row has
48
+ * up/down buttons (and Alt+↑/↓ from anywhere in the row); every move is
49
+ * announced. Optionally a marker line between rows that moves on its own, an
50
+ * inline field per row, and trailing actions.
51
+ */
52
+ export declare function ReorderList<T>({ items, onReorder, itemKey, itemLabel, render, field, actions, dim, marker, quiet, disabled, "aria-label": ariaLabel, }: ReorderListProps<T>): import("react").JSX.Element;
53
+ export {};
54
+ //# sourceMappingURL=Reorder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Reorder.d.ts","sourceRoot":"","sources":["../../src/kit/Reorder.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAyD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AA8D9F,KAAK,UAAU,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AAiC5C,mDAAmD;AACnD,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI;IAC7B,mEAAmE;IACnE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,uEAAuE;IACvE,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACvC,yBAAyB;IACzB,KAAK,EAAE,SAAS,CAAC;IACjB,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IAC9B,wDAAwD;IACxD,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,SAAS,CAAC;IAC5D,6FAA6F;IAC7F,UAAU,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IACnC,0CAA0C;IAC1C,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI;IAChC,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,mFAAmF;IACnF,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACnE,sFAAsF;IACtF,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAC5C,wEAAwE;IACxE,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAC9C,wBAAwB;IACxB,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,SAAS,CAAC;IAC9C,wEAAwE;IACxE,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,SAAS,CAAC,GAAG,SAAS,CAAC;IAC5D,+CAA+C;IAC/C,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,SAAS,CAAC,GAAG,SAAS,CAAC;IAC9D,yEAAyE;IACzE,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,SAAS,CAAC;IACxD,MAAM,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IACtC,iGAAiG;IACjG,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5B,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC/B,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACnC,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,EAC7B,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,GACpH,EAAE,gBAAgB,CAAC,CAAC,CAAC,+BAiIrB"}
@@ -0,0 +1,171 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useLayoutEffect, useRef, useState } from "react";
3
+ import styled, { css } from "styled-components";
4
+ import { v } from "../theme/tokens.js";
5
+ import { IconButton } from "./Button.js";
6
+ import { Icon } from "./Icon.js";
7
+ // An ordered list whose order is the setting: a quality ladder, a provider
8
+ // preference, a fallback chain. RepeaterRows adds and removes; this moves.
9
+ // Up/down buttons rather than drag — they work from the keyboard and on a
10
+ // phone, and a list of three to ten rows is a click or two either way. Alt+↑/↓
11
+ // moves the row that holds focus without leaving the field it is in.
12
+ //
13
+ // The marker is a line between two rows that moves on its own — XMB's
14
+ // "upgrade until here" cutoff. It names a position, not an item: the caller
15
+ // decides what it means and whether it follows an item when rows move.
16
+ const Wrap = styled.div `
17
+ display: flex;
18
+ flex-direction: column;
19
+ border: 1px solid ${v.line};
20
+ border-radius: ${v.rCard};
21
+ background: ${v.surface};
22
+ `;
23
+ const Item = styled.div `
24
+ border-bottom: 1px solid ${v.line};
25
+ &:last-of-type { border-bottom: none; }
26
+ `;
27
+ const RowEl = styled.div `
28
+ display: flex;
29
+ align-items: center;
30
+ gap: 10px;
31
+ padding: 6px 12px 6px 6px;
32
+ font-size: 12.5px;
33
+ color: ${(p) => (p.$dim ? v.faint : v.text)};
34
+ &:hover .reorder-reveal, &:focus-within .reorder-reveal { opacity: 1; }
35
+ `;
36
+ const Moves = styled.div `
37
+ flex: none;
38
+ display: grid;
39
+ gap: 1px;
40
+ ${(p) => p.$quiet && css `opacity: 0; transition: opacity 0.14s ease; &:focus-within { opacity: 1; }`}
41
+ > button { width: 26px; height: 18px; font-size: 11px; }
42
+ > button:disabled { opacity: 0.35; cursor: default; }
43
+ `;
44
+ const Body = styled.div `flex: 1 1 auto; min-width: 0;`;
45
+ const Slot = styled.div `flex: none; display: flex; align-items: center; gap: 6px;`;
46
+ const Place = styled.button `
47
+ flex: none;
48
+ /* every row keeps the slot, so the fields after it line up down the list */
49
+ ${(p) => p.$held && css `visibility: hidden;`}
50
+ font-size: 11.5px;
51
+ color: ${v.faint};
52
+ opacity: 0;
53
+ transition: opacity 0.14s ease;
54
+ &:hover, &:focus-visible { opacity: 1; color: ${v.brand}; }
55
+ `;
56
+ const markerTones = {
57
+ brand: { ink: v.brand, bg: v.brand08 },
58
+ info: { ink: v.info, bg: v.infoBg },
59
+ warn: { ink: v.warning, bg: v.warningBg },
60
+ };
61
+ const MarkerEl = styled.div `
62
+ display: flex;
63
+ align-items: center;
64
+ gap: 10px;
65
+ margin: 6px 8px;
66
+ padding: 4px 8px 4px 0;
67
+ border: 1px dashed ${(p) => markerTones[p.$tone].ink};
68
+ border-radius: ${v.rCtl};
69
+ background: ${(p) => markerTones[p.$tone].bg};
70
+ color: ${(p) => markerTones[p.$tone].ink};
71
+ font-size: 12px;
72
+ > ${Moves} { padding-left: 4px; }
73
+ > ${Moves} > button, > .marker-clear { color: inherit; }
74
+ `;
75
+ // Visually hidden, read by assistive tech: the sentence a sighted person gets
76
+ // from watching the row jump.
77
+ const Announce = styled.span `
78
+ position: absolute;
79
+ width: 1px;
80
+ height: 1px;
81
+ overflow: hidden;
82
+ clip: rect(0 0 0 0);
83
+ white-space: nowrap;
84
+ `;
85
+ /**
86
+ * ReorderList: a controlled, keyboard-accessible ordered list. Each row has
87
+ * up/down buttons (and Alt+↑/↓ from anywhere in the row); every move is
88
+ * announced. Optionally a marker line between rows that moves on its own, an
89
+ * inline field per row, and trailing actions.
90
+ */
91
+ export function ReorderList({ items, onReorder, itemKey, itemLabel, render, field, actions, dim, marker, quiet, disabled, "aria-label": ariaLabel, }) {
92
+ const [said, setSaid] = useState("");
93
+ const rows = useRef(new Map());
94
+ const markerEl = useRef(null);
95
+ // A moved row can lose focus when React re-inserts it, the button that
96
+ // moved it to the top is now disabled, and the marker's buttons remount
97
+ // under another row. Put focus back after the commit.
98
+ const refocus = useRef(null);
99
+ useLayoutEffect(() => {
100
+ const pending = refocus.current;
101
+ if (!pending)
102
+ return;
103
+ refocus.current = null;
104
+ const el = pending.el;
105
+ if (el && el.isConnected && !el.disabled) {
106
+ if (document.activeElement !== el)
107
+ el.focus();
108
+ return;
109
+ }
110
+ // the same direction's button if it can still move, else the other's
111
+ const box = pending.within();
112
+ const same = box?.querySelector(`[data-move="${pending.dir === -1 ? "up" : "down"}"]`);
113
+ const other = box?.querySelector(`[data-move="${pending.dir === -1 ? "down" : "up"}"]`);
114
+ (same && !same.disabled ? same : other)?.focus();
115
+ });
116
+ const n = items.length;
117
+ const holds = (i) => i >= 0 && i < n && (marker?.canHold ? marker.canHold(items[i], i) : true);
118
+ const move = (from, dir) => {
119
+ const to = from + dir;
120
+ if (disabled || to < 0 || to >= n)
121
+ return;
122
+ const next = items.slice();
123
+ const [it] = next.splice(from, 1);
124
+ next.splice(to, 0, it);
125
+ const key = itemKey(it, from);
126
+ refocus.current = { el: document.activeElement, within: () => rows.current.get(key), dir };
127
+ setSaid(`${itemLabel(it, from)} moved to position ${to + 1} of ${n}.`);
128
+ onReorder(next, { from, to });
129
+ };
130
+ // The marker steps to the next row that can hold it.
131
+ const markerStep = (dir) => {
132
+ if (marker?.after == null)
133
+ return null;
134
+ for (let i = marker.after + dir; i >= 0 && i < n; i += dir)
135
+ if (holds(i))
136
+ return i;
137
+ return null;
138
+ };
139
+ const placeMarker = (after, dir) => {
140
+ if (!marker || disabled)
141
+ return;
142
+ if (dir)
143
+ refocus.current = { el: null, within: () => markerEl.current, dir };
144
+ setSaid(after === null ? `${marker.name} removed.` : `${marker.name} moved under ${itemLabel(items[after], after)}.`);
145
+ marker.onMove(after);
146
+ };
147
+ const onRowKey = (i) => (e) => {
148
+ if (!e.altKey || (e.key !== "ArrowUp" && e.key !== "ArrowDown"))
149
+ return;
150
+ e.preventDefault();
151
+ move(i, e.key === "ArrowUp" ? -1 : 1);
152
+ };
153
+ const markerRow = () => {
154
+ if (!marker || marker.after === null)
155
+ return null;
156
+ const up = markerStep(-1);
157
+ const down = markerStep(1);
158
+ return (_jsxs(MarkerEl, { ref: markerEl, "$tone": marker.tone ?? "brand", role: "separator", "aria-label": marker.name, children: [_jsxs(Moves, { "$quiet": false, children: [_jsx(IconButton, { "data-move": "up", "aria-label": `Move ${marker.name} up`, disabled: disabled || up === null, onClick: () => placeMarker(up, -1), children: _jsx(Icon, { name: "chevron-up" }) }), _jsx(IconButton, { "data-move": "down", "aria-label": `Move ${marker.name} down`, disabled: disabled || down === null, onClick: () => placeMarker(down, 1), children: _jsx(Icon, { name: "chevron-down" }) })] }), _jsx(Body, { children: marker.label }), marker.clearable ? (_jsx(IconButton, { className: "marker-clear", "$size": 24, "aria-label": `Remove ${marker.name}`, disabled: disabled, onClick: () => placeMarker(null), children: _jsx(Icon, { name: "close" }) })) : null] }));
159
+ };
160
+ return (_jsxs(Wrap, { role: "list", "aria-label": ariaLabel, children: [items.map((item, i) => {
161
+ const key = itemKey(item, i);
162
+ const label = itemLabel(item, i);
163
+ const offer = marker?.placeLabel !== undefined && marker.after !== i && holds(i);
164
+ const offerSlot = marker?.placeLabel !== undefined;
165
+ return (_jsxs(Item, { role: "listitem", children: [_jsxs(RowEl, { ref: (el) => { if (el)
166
+ rows.current.set(key, el);
167
+ else
168
+ rows.current.delete(key); }, "$dim": dim?.(item, i), onKeyDown: onRowKey(i), children: [_jsxs(Moves, { "$quiet": quiet, className: quiet ? "reorder-reveal" : undefined, children: [_jsx(IconButton, { "data-move": "up", "aria-label": `Move ${label} up`, disabled: disabled || i === 0, onClick: () => move(i, -1), children: _jsx(Icon, { name: "chevron-up" }) }), _jsx(IconButton, { "data-move": "down", "aria-label": `Move ${label} down`, disabled: disabled || i === n - 1, onClick: () => move(i, 1), children: _jsx(Icon, { name: "chevron-down" }) })] }), _jsx(Body, { children: render(item, i) }), field ? _jsx(Slot, { children: field(item, i) }) : null, offerSlot ? (_jsx(Place, { type: "button", className: "reorder-reveal", "$held": !offer, "aria-hidden": offer ? undefined : true, tabIndex: offer ? undefined : -1, disabled: disabled || !offer, onClick: () => placeMarker(i), children: marker?.placeLabel })) : null, actions ? _jsx(Slot, { children: actions(item, i) }) : null] }), marker?.after === i ? markerRow() : null] }, key));
169
+ }), _jsx(Announce, { role: "status", "aria-live": "polite", children: said })] }));
170
+ }
171
+ //# sourceMappingURL=Reorder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Reorder.js","sourceRoot":"","sources":["../../src/kit/Reorder.tsx"],"names":[],"mappings":"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"}
@@ -13,23 +13,56 @@ export declare function StatValue({ label, value, sub, tone }: {
13
13
  tone?: "ok" | "warn" | "crit" | "brand" | undefined;
14
14
  }): import("react").JSX.Element;
15
15
  /** StatTile: label over a big number, with an optional subline. */
16
- export declare function StatTile({ label, value, sub, tone, icon, to }: {
16
+ export declare function StatTile({ label, value, sub, subTone, emphasis, tone, icon, to }: {
17
17
  label: ReactNode;
18
18
  value: ReactNode;
19
19
  sub?: ReactNode | undefined;
20
+ /** tints the subline — the footnote that is the bad news ("3 need attention") */
21
+ subTone?: "ok" | "warn" | "crit" | undefined;
22
+ /** washes the whole tile (border and ground) in the accent, or in `tone`'s
23
+ * colour when it has one — the tile that needs looking at */
24
+ emphasis?: boolean | undefined;
20
25
  tone?: "ok" | "warn" | "crit" | "brand" | undefined;
21
26
  /** a brand-tinted glyph beside the label */
22
27
  icon?: IconName | undefined;
23
28
  /** the tile is also the way in: a router link to the section it counts */
24
29
  to?: string | undefined;
25
30
  }): import("react").JSX.Element;
26
- /** Meter: value out of max as a bar; tone defaults from the ratio. */
27
- export declare function Meter({ value, max, tone, label, width }: {
31
+ type MeterTone = "ok" | "warn" | "crit" | "brand" | "info" | "mut";
32
+ export interface MeterSegment {
28
33
  value: number;
34
+ tone: MeterTone;
35
+ /** accessible name of the segment (also its tooltip) */
36
+ label?: string | undefined;
37
+ /** part of the previous top-level segment: drawn as the leading part of that span, over it, rather than after it */
38
+ nested?: boolean | undefined;
39
+ }
40
+ export interface MeterProps {
41
+ value?: number | undefined;
29
42
  max: number;
30
- tone?: "ok" | "warn" | "crit" | "brand" | undefined;
43
+ tone?: MeterTone | undefined;
31
44
  label?: string | undefined;
32
45
  /** fixed width in px (inside a table cell); fills the container otherwise */
33
46
  width?: number | undefined;
34
- }): import("react").JSX.Element;
47
+ segments?: MeterSegment[] | undefined;
48
+ tall?: boolean | undefined;
49
+ indeterminate?: boolean | undefined;
50
+ /** a caption above the bar ("/data"); `label` stays the accessible name */
51
+ head?: ReactNode | undefined;
52
+ /** a caption below the bar ("312 GB of 500 GB used") */
53
+ foot?: ReactNode | undefined;
54
+ }
55
+ /**
56
+ * Meter: value out of max as a bar; tone defaults from the ratio.
57
+ *
58
+ * `segments` replaces `value` with several spans that read left to right, each
59
+ * starting where the last top-level one ended. A `nested` segment is part of the
60
+ * span before it and is drawn as that span's leading part, over it — the way a
61
+ * "held" figure sits inside "committed" (stacking both from the left would paint
62
+ * the larger last and hide the smaller). `tall` is the detail-page height,
63
+ * `indeterminate` a sweeping bar for work with no figure yet. `head` and `foot`
64
+ * are captions above and below the bar; `label` stays its accessible name.
65
+ */
66
+ export declare function Meter({ head, foot, ...props }: MeterProps): import("react").JSX.Element;
67
+ export {};
35
68
  //# sourceMappingURL=Stat.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Stat.d.ts","sourceRoot":"","sources":["../../src/kit/Stat.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAKvC,OAAO,EAAQ,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AAIjD,eAAO,MAAM,QAAQ;;;WAAuB,MAAM,GAAG,SAAS;YAI7D,CAAC;AA6BF,0FAA0F;AAC1F,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;IACrD,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,SAAS,CAAC;IACjB,GAAG,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAC5B,IAAI,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;CACrD,+BAQA;AAED,mEAAmE;AACnE,wBAAgB,QAAQ,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE;IAC9D,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,SAAS,CAAC;IACjB,GAAG,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAC5B,IAAI,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IACpD,4CAA4C;IAC5C,IAAI,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC5B,0EAA0E;IAC1E,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACzB,+BAeA;AAoCD,sEAAsE;AACtE,wBAAgB,KAAK,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IACpD,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B,+BAQA"}
1
+ {"version":3,"file":"Stat.d.ts","sourceRoot":"","sources":["../../src/kit/Stat.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAKvC,OAAO,EAAQ,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AAIjD,eAAO,MAAM,QAAQ;;;WAAuB,MAAM,GAAG,SAAS;YAI7D,CAAC;AAyCF,0FAA0F;AAC1F,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;IACrD,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,SAAS,CAAC;IACjB,GAAG,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAC5B,IAAI,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;CACrD,+BAQA;AAED,mEAAmE;AACnE,wBAAgB,QAAQ,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE;IACjF,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,SAAS,CAAC;IACjB,GAAG,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAC5B,iFAAiF;IACjF,OAAO,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAC7C;kEAC8D;IAC9D,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC/B,IAAI,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IACpD,4CAA4C;IAC5C,IAAI,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC5B,0EAA0E;IAC1E,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACzB,+BAgBA;AAsBD,KAAK,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;AA2CnE,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,SAAS,CAAC;IAChB,wDAAwD;IACxD,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,oHAAoH;IACpH,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC9B;AAyBD,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,QAAQ,CAAC,EAAE,YAAY,EAAE,GAAG,SAAS,CAAC;IACtC,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC3B,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACpC,2EAA2E;IAC3E,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAC7B,wDAAwD;IACxD,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;CAC9B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,KAAK,EAAE,EAAE,UAAU,+BASzD"}