@apliteni/apliteni-ui 0.58.2 → 0.60.0

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.
@@ -162,28 +162,62 @@ function Badge({ variant = "neutral", children }) {
162
162
  return /* @__PURE__ */ jsx3("span", { className: cls, children });
163
163
  }
164
164
 
165
+ // src/primitives/Pill.tsx
166
+ import { forwardRef as forwardRef2 } from "react";
167
+ import { jsx as jsx4 } from "react/jsx-runtime";
168
+ var Pill = forwardRef2(function Pill2({
169
+ variant,
170
+ className,
171
+ ...rest
172
+ }, ref) {
173
+ const classes = ["ui-pill", variant && `ui-pill--${variant}`, className].filter(Boolean).join(" ");
174
+ return /* @__PURE__ */ jsx4("span", { ...rest, ref, className: classes });
175
+ });
176
+
177
+ // src/primitives/StatusDot.tsx
178
+ import { forwardRef as forwardRef3 } from "react";
179
+ import { jsx as jsx5 } from "react/jsx-runtime";
180
+ var StatusDot = forwardRef3(function StatusDot2({
181
+ live = false,
182
+ className,
183
+ ...rest
184
+ }, ref) {
185
+ const labelled = Boolean(rest["aria-label"]?.trim() || rest["aria-labelledby"]?.trim());
186
+ const classes = ["ui-dot", live && "is-live", className].filter(Boolean).join(" ");
187
+ return /* @__PURE__ */ jsx5(
188
+ "span",
189
+ {
190
+ role: labelled ? "img" : void 0,
191
+ "aria-hidden": labelled ? void 0 : true,
192
+ ...rest,
193
+ ref,
194
+ className: classes
195
+ }
196
+ );
197
+ });
198
+
165
199
  // src/primitives/Card.tsx
166
- import { jsx as jsx4, jsxs as jsxs2 } from "react/jsx-runtime";
200
+ import { jsx as jsx6, jsxs as jsxs2 } from "react/jsx-runtime";
167
201
  function Card({ title, sub, level = 2, children }) {
168
202
  const n = Number(level);
169
203
  const Heading = `h${[2, 3, 4, 5, 6].includes(n) ? n : 2}`;
170
204
  const titled = title != null && title !== false && title !== "";
171
205
  return /* @__PURE__ */ jsxs2("div", { className: "ui-card", children: [
172
- titled && /* @__PURE__ */ jsx4(Heading, { className: "ui-card__title", children: title }),
173
- sub != null && /* @__PURE__ */ jsx4("div", { className: "ui-card__sub", children: sub }),
206
+ titled && /* @__PURE__ */ jsx6(Heading, { className: "ui-card__title", children: title }),
207
+ sub != null && /* @__PURE__ */ jsx6("div", { className: "ui-card__sub", children: sub }),
174
208
  children
175
209
  ] });
176
210
  }
177
211
 
178
212
  // src/primitives/Callout.tsx
179
213
  import { calloutIcons, icon as kitIcon } from "@apliteni/apliteni-ui";
180
- import { jsx as jsx5, jsxs as jsxs3 } from "react/jsx-runtime";
214
+ import { jsx as jsx7, jsxs as jsxs3 } from "react/jsx-runtime";
181
215
  function Callout({ variant, icon: icon6 = calloutIcons[variant ?? "neutral"], children, actions }) {
182
216
  return /* @__PURE__ */ jsxs3("div", { className: `ui-callout${variant && variant !== "neutral" ? ` ui-callout--${variant}` : ""}`, role: variant === "danger" ? "alert" : void 0, children: [
183
- /* @__PURE__ */ jsx5("span", { className: "ui-callout__icon", dangerouslySetInnerHTML: { __html: kitIcon(icon6) } }),
217
+ /* @__PURE__ */ jsx7("span", { className: "ui-callout__icon", dangerouslySetInnerHTML: { __html: kitIcon(icon6) } }),
184
218
  /* @__PURE__ */ jsxs3("div", { className: "ui-callout__body", children: [
185
219
  children,
186
- actions != null && /* @__PURE__ */ jsx5("div", { className: "ui-toolbar ui-callout__actions", children: actions })
220
+ actions != null && /* @__PURE__ */ jsx7("div", { className: "ui-toolbar ui-callout__actions", children: actions })
187
221
  ] })
188
222
  ] });
189
223
  }
@@ -193,7 +227,7 @@ import { useId as useId2 } from "react";
193
227
 
194
228
  // src/Tooltip.tsx
195
229
  import { useEffect, useId, useLayoutEffect as useLayoutEffect2, useRef as useRef2, useState } from "react";
196
- import { jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
230
+ import { jsx as jsx8, jsxs as jsxs4 } from "react/jsx-runtime";
197
231
  function Tooltip({ text: text2, children }) {
198
232
  const id = useId();
199
233
  const host = useRef2(null);
@@ -250,7 +284,7 @@ function Tooltip({ text: text2, children }) {
250
284
  };
251
285
  }, [open]);
252
286
  return /* @__PURE__ */ jsxs4("span", { ref: host, className: "ui-tip-host", style: { display: "inline-block" }, children: [
253
- /* @__PURE__ */ jsx6(
287
+ /* @__PURE__ */ jsx8(
254
288
  "span",
255
289
  {
256
290
  ref: trigger,
@@ -287,12 +321,12 @@ function Tooltip({ text: text2, children }) {
287
321
  children
288
322
  }
289
323
  ),
290
- /* @__PURE__ */ jsx6("span", { ref: tip, id, role: "tooltip", className: `ui-tip${open ? " is-open" : ""}`, children: /* @__PURE__ */ jsx6("span", { className: "ui-tip__label", children: text2 }) })
324
+ /* @__PURE__ */ jsx8("span", { ref: tip, id, role: "tooltip", className: `ui-tip${open ? " is-open" : ""}`, children: /* @__PURE__ */ jsx8("span", { className: "ui-tip__label", children: text2 }) })
291
325
  ] });
292
326
  }
293
327
 
294
328
  // src/primitives/StatBand.tsx
295
- import { Fragment, jsx as jsx7, jsxs as jsxs5 } from "react/jsx-runtime";
329
+ import { Fragment, jsx as jsx9, jsxs as jsxs5 } from "react/jsx-runtime";
296
330
  var GLYPH = { up: "arrowUp", down: "arrowDown", flat: "minus" };
297
331
  var directionOf = (text2) => {
298
332
  const t = text2.trim();
@@ -301,15 +335,15 @@ var directionOf = (text2) => {
301
335
  var hasChange = (d) => !!d && d.value != null && d.value !== "";
302
336
  function Delta({ delta, basisId }) {
303
337
  if (!hasChange(delta)) {
304
- return /* @__PURE__ */ jsx7("dd", { className: "ui-stat__delta ui-stat__delta--none", children: delta.none || "No earlier figure" });
338
+ return /* @__PURE__ */ jsx9("dd", { className: "ui-stat__delta ui-stat__delta--none", children: delta.none || "No earlier figure" });
305
339
  }
306
340
  const dir = delta.direction && GLYPH[delta.direction] ? delta.direction : directionOf(delta.value);
307
341
  return /* @__PURE__ */ jsxs5("dd", { className: "ui-stat__delta", "aria-describedby": !delta.basis && basisId ? basisId : void 0, children: [
308
- /* @__PURE__ */ jsx7(Icon, { name: GLYPH[dir] }),
309
- delta.tooltip ? /* @__PURE__ */ jsx7(Tooltip, { text: delta.tooltip, children: /* @__PURE__ */ jsx7("span", { className: "ui-stat__change", children: delta.value }) }) : /* @__PURE__ */ jsx7("span", { className: "ui-stat__change", children: delta.value }),
342
+ /* @__PURE__ */ jsx9(Icon, { name: GLYPH[dir] }),
343
+ delta.tooltip ? /* @__PURE__ */ jsx9(Tooltip, { text: delta.tooltip, children: /* @__PURE__ */ jsx9("span", { className: "ui-stat__change", children: delta.value }) }) : /* @__PURE__ */ jsx9("span", { className: "ui-stat__change", children: delta.value }),
310
344
  delta.basis ? /* @__PURE__ */ jsxs5(Fragment, { children: [
311
345
  " ",
312
- /* @__PURE__ */ jsx7("span", { className: "ui-stat__basis", children: delta.basis })
346
+ /* @__PURE__ */ jsx9("span", { className: "ui-stat__basis", children: delta.basis })
313
347
  ] }) : null
314
348
  ] });
315
349
  }
@@ -319,15 +353,15 @@ function StatBand({ stats, variant = "tiles", basis, basisId: sharedBasisId, lab
319
353
  const basisId = basis ? `${id || auto}-basis` : sharedBasisId;
320
354
  const root = ["ui-stats", `ui-stats--${v}`, v === "band" && "ui-card"].filter(Boolean).join(" ");
321
355
  return /* @__PURE__ */ jsxs5("div", { className: root, role: label ? "group" : void 0, "aria-label": label || void 0, children: [
322
- basis ? /* @__PURE__ */ jsx7("p", { className: "ui-stats__basis", id: basisId, children: basis }) : null,
323
- /* @__PURE__ */ jsx7("dl", { className: "ui-stats__list", children: stats.map((s, i) => {
356
+ basis ? /* @__PURE__ */ jsx9("p", { className: "ui-stats__basis", id: basisId, children: basis }) : null,
357
+ /* @__PURE__ */ jsx9("dl", { className: "ui-stats__list", children: stats.map((s, i) => {
324
358
  const tone = hasChange(s.delta) && (s.delta.tone === "good" || s.delta.tone === "bad") ? s.delta.tone : "";
325
359
  const cls = ["ui-stat", tone && `ui-stat--${tone}`, v === "tiles" && "ui-card ui-card--pad-sm"].filter(Boolean).join(" ");
326
360
  return /* @__PURE__ */ jsxs5("div", { className: cls, children: [
327
- /* @__PURE__ */ jsx7("dt", { className: "ui-stat__label", children: s.label }),
328
- /* @__PURE__ */ jsx7("dd", { className: "ui-stat__value", children: s.value }),
329
- s.delta ? /* @__PURE__ */ jsx7(Delta, { delta: s.delta, basisId }) : null,
330
- s.trend ? /* @__PURE__ */ jsx7("dd", { className: "ui-stat__trend", children: s.trend }) : null
361
+ /* @__PURE__ */ jsx9("dt", { className: "ui-stat__label", children: s.label }),
362
+ /* @__PURE__ */ jsx9("dd", { className: "ui-stat__value", children: s.value }),
363
+ s.delta ? /* @__PURE__ */ jsx9(Delta, { delta: s.delta, basisId }) : null,
364
+ s.trend ? /* @__PURE__ */ jsx9("dd", { className: "ui-stat__trend", children: s.trend }) : null
331
365
  ] }, `${s.label}-${i}`);
332
366
  }) })
333
367
  ] });
@@ -551,7 +585,7 @@ function useDialog(active, { root, panel, body, initialFocus }, onClose) {
551
585
  }
552
586
 
553
587
  // src/Modal.tsx
554
- import { jsx as jsx8, jsxs as jsxs6 } from "react/jsx-runtime";
588
+ import { jsx as jsx10, jsxs as jsxs6 } from "react/jsx-runtime";
555
589
  function Modal({ open, title, onClose, footer, children, initialFocusRef, role = "dialog" }) {
556
590
  const id = useId3();
557
591
  const titleId = `${id}-title`;
@@ -563,7 +597,7 @@ function Modal({ open, title, onClose, footer, children, initialFocusRef, role =
563
597
  const scope = useDialog(shown, { root, panel, body, initialFocus: initialFocusRef }, onClose);
564
598
  if (!mounted) return null;
565
599
  return createPortal(
566
- /* @__PURE__ */ jsx8(DialogScope.Provider, { value: scope, children: /* @__PURE__ */ jsx8("div", { className: shown ? "rx-scrim is-open" : "rx-scrim", ref: root, onMouseDown: dismissOnScrim(onClose), children: /* @__PURE__ */ jsxs6(
600
+ /* @__PURE__ */ jsx10(DialogScope.Provider, { value: scope, children: /* @__PURE__ */ jsx10("div", { className: shown ? "rx-scrim is-open" : "rx-scrim", ref: root, onMouseDown: dismissOnScrim(onClose), children: /* @__PURE__ */ jsxs6(
567
601
  "div",
568
602
  {
569
603
  className: "rx-modal",
@@ -575,11 +609,11 @@ function Modal({ open, title, onClose, footer, children, initialFocusRef, role =
575
609
  ref: panel,
576
610
  children: [
577
611
  /* @__PURE__ */ jsxs6("div", { className: "rx-modal__head", children: [
578
- /* @__PURE__ */ jsx8("h2", { className: "rx-modal__title", id: titleId, children: title }),
579
- /* @__PURE__ */ jsx8(Button, { variant: "ghost", size: "sm", iconOnly: true, icon: "x", "aria-label": "Close", onClick: onClose })
612
+ /* @__PURE__ */ jsx10("h2", { className: "rx-modal__title", id: titleId, children: title }),
613
+ /* @__PURE__ */ jsx10(Button, { variant: "ghost", size: "sm", iconOnly: true, icon: "x", "aria-label": "Close", onClick: onClose })
580
614
  ] }),
581
- /* @__PURE__ */ jsx8("div", { className: "rx-modal__body", id: bodyId, ref: body, children }),
582
- footer && /* @__PURE__ */ jsx8("div", { className: "rx-modal__foot", children: footer })
615
+ /* @__PURE__ */ jsx10("div", { className: "rx-modal__body", id: bodyId, ref: body, children }),
616
+ footer && /* @__PURE__ */ jsx10("div", { className: "rx-modal__foot", children: footer })
583
617
  ]
584
618
  }
585
619
  ) }) }),
@@ -588,7 +622,7 @@ function Modal({ open, title, onClose, footer, children, initialFocusRef, role =
588
622
  }
589
623
 
590
624
  // src/Confirm.tsx
591
- import { Fragment as Fragment2, jsx as jsx9, jsxs as jsxs7 } from "react/jsx-runtime";
625
+ import { Fragment as Fragment2, jsx as jsx11, jsxs as jsxs7 } from "react/jsx-runtime";
592
626
  function Confirm({
593
627
  open,
594
628
  title,
@@ -601,7 +635,7 @@ function Confirm({
601
635
  onCancel
602
636
  }) {
603
637
  const safeAction = useRef5(null);
604
- return /* @__PURE__ */ jsx9(
638
+ return /* @__PURE__ */ jsx11(
605
639
  Modal,
606
640
  {
607
641
  open,
@@ -610,8 +644,8 @@ function Confirm({
610
644
  role: "alertdialog",
611
645
  initialFocusRef: safeAction,
612
646
  footer: /* @__PURE__ */ jsxs7(Fragment2, { children: [
613
- /* @__PURE__ */ jsx9(Button, { ref: safeAction, variant: "ghost", onClick: onCancel, children: cancelLabel }),
614
- /* @__PURE__ */ jsx9(Button, { variant: danger ? "danger" : "primary", busy, onClick: onConfirm, children: confirmLabel })
647
+ /* @__PURE__ */ jsx11(Button, { ref: safeAction, variant: "ghost", onClick: onCancel, children: cancelLabel }),
648
+ /* @__PURE__ */ jsx11(Button, { variant: danger ? "danger" : "primary", busy, onClick: onConfirm, children: confirmLabel })
615
649
  ] }),
616
650
  children: body
617
651
  }
@@ -621,7 +655,7 @@ function Confirm({
621
655
  // src/Drawer.tsx
622
656
  import { useId as useId4, useRef as useRef6 } from "react";
623
657
  import { createPortal as createPortal2 } from "react-dom";
624
- import { jsx as jsx10, jsxs as jsxs8 } from "react/jsx-runtime";
658
+ import { jsx as jsx12, jsxs as jsxs8 } from "react/jsx-runtime";
625
659
  function Drawer({
626
660
  open,
627
661
  title,
@@ -641,8 +675,8 @@ function Drawer({
641
675
  if (!mounted) return null;
642
676
  const cls = ["ui-drawer", `ui-drawer--${side}`, `ui-drawer--${size}`, shown && "is-open"].filter(Boolean).join(" ");
643
677
  return createPortal2(
644
- /* @__PURE__ */ jsx10(DialogScope.Provider, { value: scope, children: /* @__PURE__ */ jsxs8("div", { className: cls, ref: root, children: [
645
- /* @__PURE__ */ jsx10("div", { className: "ui-drawer__scrim", onMouseDown: dismissOnScrim(onClose) }),
678
+ /* @__PURE__ */ jsx12(DialogScope.Provider, { value: scope, children: /* @__PURE__ */ jsxs8("div", { className: cls, ref: root, children: [
679
+ /* @__PURE__ */ jsx12("div", { className: "ui-drawer__scrim", onMouseDown: dismissOnScrim(onClose) }),
646
680
  /* @__PURE__ */ jsxs8(
647
681
  "aside",
648
682
  {
@@ -654,11 +688,11 @@ function Drawer({
654
688
  ref: panel,
655
689
  children: [
656
690
  /* @__PURE__ */ jsxs8("header", { className: "ui-drawer__header", children: [
657
- /* @__PURE__ */ jsx10("h2", { className: "ui-drawer__title", id: titleId, children: title }),
658
- /* @__PURE__ */ jsx10("button", { type: "button", className: "ui-drawer__close", "aria-label": closeLabel, onClick: onClose, children: /* @__PURE__ */ jsx10(Icon, { name: "x" }) })
691
+ /* @__PURE__ */ jsx12("h2", { className: "ui-drawer__title", id: titleId, children: title }),
692
+ /* @__PURE__ */ jsx12("button", { type: "button", className: "ui-drawer__close", "aria-label": closeLabel, onClick: onClose, children: /* @__PURE__ */ jsx12(Icon, { name: "x" }) })
659
693
  ] }),
660
- /* @__PURE__ */ jsx10("div", { className: "ui-drawer__body", ref: body, children }),
661
- footer && /* @__PURE__ */ jsx10("footer", { className: "ui-drawer__footer", children: footer })
694
+ /* @__PURE__ */ jsx12("div", { className: "ui-drawer__body", ref: body, children }),
695
+ footer && /* @__PURE__ */ jsx12("footer", { className: "ui-drawer__footer", children: footer })
662
696
  ]
663
697
  }
664
698
  )
@@ -671,9 +705,9 @@ function Drawer({
671
705
  import { useCallback, useEffect as useEffect3, useId as useId5, useMemo, useRef as useRef7, useState as useState3 } from "react";
672
706
  import { createPortal as createPortal3 } from "react-dom";
673
707
  import { rankGroups, icon as icon2 } from "@apliteni/apliteni-ui";
674
- import { jsx as jsx11, jsxs as jsxs9 } from "react/jsx-runtime";
708
+ import { jsx as jsx13, jsxs as jsxs9 } from "react/jsx-runtime";
675
709
  var cx2 = (...a) => a.filter(Boolean).join(" ");
676
- var Glyph = ({ name, className }) => /* @__PURE__ */ jsx11("span", { className, "aria-hidden": "true", dangerouslySetInnerHTML: { __html: icon2(name) } });
710
+ var Glyph = ({ name, className }) => /* @__PURE__ */ jsx13("span", { className, "aria-hidden": "true", dangerouslySetInnerHTML: { __html: icon2(name) } });
677
711
  var keysOf = (shortcut) => shortcut == null ? [] : Array.isArray(shortcut) ? shortcut : [shortcut];
678
712
  function CommandPalette({
679
713
  open,
@@ -738,8 +772,8 @@ function CommandPalette({
738
772
  const listId = `${uid}-list`;
739
773
  let n = 0;
740
774
  return createPortal3(
741
- /* @__PURE__ */ jsx11(DialogScope.Provider, { value: scope, children: /* @__PURE__ */ jsxs9("div", { className: cx2("ui-cmdk", density === "roomy" && "ui-cmdk--roomy", "is-open"), ref: root, children: [
742
- /* @__PURE__ */ jsx11("div", { className: "ui-cmdk__scrim", onMouseDown: dismissOnScrim(onClose) }),
775
+ /* @__PURE__ */ jsx13(DialogScope.Provider, { value: scope, children: /* @__PURE__ */ jsxs9("div", { className: cx2("ui-cmdk", density === "roomy" && "ui-cmdk--roomy", "is-open"), ref: root, children: [
776
+ /* @__PURE__ */ jsx13("div", { className: "ui-cmdk__scrim", onMouseDown: dismissOnScrim(onClose) }),
743
777
  /* @__PURE__ */ jsxs9(
744
778
  "div",
745
779
  {
@@ -752,8 +786,8 @@ function CommandPalette({
752
786
  onKeyDown,
753
787
  children: [
754
788
  /* @__PURE__ */ jsxs9("div", { className: "ui-cmdk__search", ref: search, children: [
755
- /* @__PURE__ */ jsx11(Glyph, { name: "search", className: "ui-cmdk__search-ic" }),
756
- /* @__PURE__ */ jsx11(
789
+ /* @__PURE__ */ jsx13(Glyph, { name: "search", className: "ui-cmdk__search-ic" }),
790
+ /* @__PURE__ */ jsx13(
757
791
  "input",
758
792
  {
759
793
  className: "ui-cmdk__input",
@@ -775,14 +809,14 @@ function CommandPalette({
775
809
  }
776
810
  )
777
811
  ] }),
778
- /* @__PURE__ */ jsx11("div", { className: "ui-cmdk__list", id: listId, role: "listbox", "aria-label": `${label} results`, children: shown.map((group, gi) => /* @__PURE__ */ jsxs9(
812
+ /* @__PURE__ */ jsx13("div", { className: "ui-cmdk__list", id: listId, role: "listbox", "aria-label": `${label} results`, children: shown.map((group, gi) => /* @__PURE__ */ jsxs9(
779
813
  "div",
780
814
  {
781
815
  className: "ui-cmdk__group",
782
816
  role: "group",
783
817
  "aria-labelledby": group.label ? `${uid}-g${gi}` : void 0,
784
818
  children: [
785
- group.label && /* @__PURE__ */ jsx11("div", { className: "ui-cmdk__group-head", id: `${uid}-g${gi}`, children: group.label }),
819
+ group.label && /* @__PURE__ */ jsx13("div", { className: "ui-cmdk__group-head", id: `${uid}-g${gi}`, children: group.label }),
786
820
  group.items.map((item) => {
787
821
  const disabled = isDisabled(item);
788
822
  const id = `${uid}-o${n++}`;
@@ -807,13 +841,13 @@ function CommandPalette({
807
841
  },
808
842
  onClick: (e) => run(item, e.metaKey || e.ctrlKey),
809
843
  children: [
810
- item.icon && /* @__PURE__ */ jsx11(Glyph, { name: item.icon, className: "ui-cmdk__ic" }),
844
+ item.icon && /* @__PURE__ */ jsx13(Glyph, { name: item.icon, className: "ui-cmdk__ic" }),
811
845
  /* @__PURE__ */ jsxs9("span", { className: "ui-cmdk__main", children: [
812
- /* @__PURE__ */ jsx11("span", { className: "ui-cmdk__label", children: item.label }),
813
- item.description && /* @__PURE__ */ jsx11("span", { className: "ui-cmdk__desc", children: item.description })
846
+ /* @__PURE__ */ jsx13("span", { className: "ui-cmdk__label", children: item.label }),
847
+ item.description && /* @__PURE__ */ jsx13("span", { className: "ui-cmdk__desc", children: item.description })
814
848
  ] }),
815
- item.badge && /* @__PURE__ */ jsx11("span", { className: "ui-cmdk__badge", children: item.badge }),
816
- keysOf(item.shortcut).length > 0 && /* @__PURE__ */ jsx11("span", { className: "ui-cmdk__keys", "aria-hidden": "true", children: keysOf(item.shortcut).map((k) => /* @__PURE__ */ jsx11("kbd", { className: "ui-cmdk__key", children: k }, k)) })
849
+ item.badge && /* @__PURE__ */ jsx13("span", { className: "ui-cmdk__badge", children: item.badge }),
850
+ keysOf(item.shortcut).length > 0 && /* @__PURE__ */ jsx13("span", { className: "ui-cmdk__keys", "aria-hidden": "true", children: keysOf(item.shortcut).map((k) => /* @__PURE__ */ jsx13("kbd", { className: "ui-cmdk__key", children: k }, k)) })
817
851
  ]
818
852
  },
819
853
  item.id
@@ -823,20 +857,20 @@ function CommandPalette({
823
857
  },
824
858
  group.label ?? `g${gi}`
825
859
  )) }),
826
- /* @__PURE__ */ jsx11("p", { className: "ui-cmdk__empty", hidden: countOf(shown) > 0, children: empty }),
827
- /* @__PURE__ */ jsx11("p", { className: "ui-sr", role: "status", "aria-live": "polite", children: countOf(shown) === 0 ? "No results" : `${countOf(shown)} result${countOf(shown) === 1 ? "" : "s"}` }),
860
+ /* @__PURE__ */ jsx13("p", { className: "ui-cmdk__empty", hidden: countOf(shown) > 0, children: empty }),
861
+ /* @__PURE__ */ jsx13("p", { className: "ui-sr", role: "status", "aria-live": "polite", children: countOf(shown) === 0 ? "No results" : `${countOf(shown)} result${countOf(shown) === 1 ? "" : "s"}` }),
828
862
  hint && /* @__PURE__ */ jsxs9("div", { className: "ui-cmdk__foot", "aria-hidden": "true", children: [
829
863
  /* @__PURE__ */ jsxs9("span", { children: [
830
- /* @__PURE__ */ jsx11("kbd", { className: "ui-cmdk__key", children: "\u2191" }),
831
- /* @__PURE__ */ jsx11("kbd", { className: "ui-cmdk__key", children: "\u2193" }),
864
+ /* @__PURE__ */ jsx13("kbd", { className: "ui-cmdk__key", children: "\u2191" }),
865
+ /* @__PURE__ */ jsx13("kbd", { className: "ui-cmdk__key", children: "\u2193" }),
832
866
  " move"
833
867
  ] }),
834
868
  /* @__PURE__ */ jsxs9("span", { children: [
835
- /* @__PURE__ */ jsx11("kbd", { className: "ui-cmdk__key", children: "\u21B5" }),
869
+ /* @__PURE__ */ jsx13("kbd", { className: "ui-cmdk__key", children: "\u21B5" }),
836
870
  " run"
837
871
  ] }),
838
872
  /* @__PURE__ */ jsxs9("span", { children: [
839
- /* @__PURE__ */ jsx11("kbd", { className: "ui-cmdk__key", children: "esc" }),
873
+ /* @__PURE__ */ jsx13("kbd", { className: "ui-cmdk__key", children: "esc" }),
840
874
  " close"
841
875
  ] })
842
876
  ] })
@@ -867,7 +901,7 @@ import { DEFAULT_PAGE_SIZE as DEFAULT_PAGE_SIZE2 } from "@apliteni/apliteni-ui";
867
901
  // src/Pagination.tsx
868
902
  import { useEffect as useEffect4, useId as useId6, useRef as useRef8, useState as useState4 } from "react";
869
903
  import { DEFAULT_PAGE_SIZE } from "@apliteni/apliteni-ui";
870
- import { jsx as jsx12, jsxs as jsxs10 } from "react/jsx-runtime";
904
+ import { jsx as jsx14, jsxs as jsxs10 } from "react/jsx-runtime";
871
905
  var GHOST_SM = "ui-btn ui-btn--ghost ui-btn--sm";
872
906
  var VARIANTS = ["steps", "numbered", "jump"];
873
907
  var cx3 = (...a) => a.filter(Boolean).join(" ");
@@ -959,7 +993,7 @@ function Pagination({
959
993
  const step = (label_, target, disabled) => (
960
994
  // A control at an end is disabled and stays where it is: removing it slides
961
995
  // the next control under a pointer already travelling toward it.
962
- /* @__PURE__ */ jsx12(
996
+ /* @__PURE__ */ jsx14(
963
997
  "button",
964
998
  {
965
999
  type: "button",
@@ -1005,7 +1039,7 @@ function Pagination({
1005
1039
  } else {
1006
1040
  let middle = null;
1007
1041
  if (kind === "numbered") {
1008
- middle = slotsFor(at, last).map((n, i) => n == null ? /* @__PURE__ */ jsx12("span", { className: "ui-pager__gap", "aria-hidden": "true", children: "\u2026" }, `gap${i}`) : /* @__PURE__ */ jsx12(
1042
+ middle = slotsFor(at, last).map((n, i) => n == null ? /* @__PURE__ */ jsx14("span", { className: "ui-pager__gap", "aria-hidden": "true", children: "\u2026" }, `gap${i}`) : /* @__PURE__ */ jsx14(
1009
1043
  "button",
1010
1044
  {
1011
1045
  type: "button",
@@ -1021,8 +1055,8 @@ function Pagination({
1021
1055
  ));
1022
1056
  } else if (kind === "jump") {
1023
1057
  middle = /* @__PURE__ */ jsxs10("span", { className: "ui-pager__jump", children: [
1024
- /* @__PURE__ */ jsx12("label", { htmlFor: `${uid}-jump`, children: "Page" }),
1025
- /* @__PURE__ */ jsx12(
1058
+ /* @__PURE__ */ jsx14("label", { htmlFor: `${uid}-jump`, children: "Page" }),
1059
+ /* @__PURE__ */ jsx14(
1026
1060
  "input",
1027
1061
  {
1028
1062
  className: "ui-input ui-pager__jump-input",
@@ -1067,10 +1101,10 @@ function Pagination({
1067
1101
  "aria-label": label,
1068
1102
  "aria-busy": loading ? true : void 0,
1069
1103
  children: [
1070
- /* @__PURE__ */ jsx12("p", { className: "ui-pager__status", "aria-live": "polite", "aria-atomic": "true", children: status }),
1104
+ /* @__PURE__ */ jsx14("p", { className: "ui-pager__status", "aria-live": "polite", "aria-atomic": "true", children: status }),
1071
1105
  sizes.length ? /* @__PURE__ */ jsxs10("div", { className: "ui-pager__size", children: [
1072
- /* @__PURE__ */ jsx12("label", { className: "ui-pager__size-label", htmlFor: `${uid}-size`, children: "Rows" }),
1073
- /* @__PURE__ */ jsx12(
1106
+ /* @__PURE__ */ jsx14("label", { className: "ui-pager__size-label", htmlFor: `${uid}-size`, children: "Rows" }),
1107
+ /* @__PURE__ */ jsx14(
1074
1108
  "select",
1075
1109
  {
1076
1110
  className: "ui-select ui-pager__size-select",
@@ -1078,7 +1112,7 @@ function Pagination({
1078
1112
  disabled: loading,
1079
1113
  value: size,
1080
1114
  onChange: (e) => onPageSizeChange?.(Number(e.target.value)),
1081
- children: sizes.map((s) => /* @__PURE__ */ jsx12("option", { value: s, children: fmt(s) }, s))
1115
+ children: sizes.map((s) => /* @__PURE__ */ jsx14("option", { value: s, children: fmt(s) }, s))
1082
1116
  }
1083
1117
  )
1084
1118
  ] }) : null,
@@ -1089,7 +1123,7 @@ function Pagination({
1089
1123
  }
1090
1124
 
1091
1125
  // src/DataTable.tsx
1092
- import { Fragment as Fragment3, jsx as jsx13, jsxs as jsxs11 } from "react/jsx-runtime";
1126
+ import { Fragment as Fragment3, jsx as jsx15, jsxs as jsxs11 } from "react/jsx-runtime";
1093
1127
  var NO_SORT = { key: void 0, dir: -1 };
1094
1128
  function sortTableRows(rows, sort) {
1095
1129
  if (sort.key === void 0) return [...rows];
@@ -1182,7 +1216,7 @@ function DataTable({
1182
1216
  onSortChange?.(next);
1183
1217
  toFirstPage();
1184
1218
  };
1185
- const caret = (k) => /* @__PURE__ */ jsx13(
1219
+ const caret = (k) => /* @__PURE__ */ jsx15(
1186
1220
  "svg",
1187
1221
  {
1188
1222
  className: "rx-caret",
@@ -1194,19 +1228,19 @@ function DataTable({
1194
1228
  strokeLinejoin: "round",
1195
1229
  "aria-hidden": "true",
1196
1230
  focusable: "false",
1197
- children: sort.key === k ? /* @__PURE__ */ jsx13("path", { d: "m8 10 4 4 4-4" }) : /* @__PURE__ */ jsxs11(Fragment3, { children: [
1198
- /* @__PURE__ */ jsx13("path", { d: "m8 9 4-4 4 4" }),
1199
- /* @__PURE__ */ jsx13("path", { d: "m8 15 4 4 4-4" })
1231
+ children: sort.key === k ? /* @__PURE__ */ jsx15("path", { d: "m8 10 4 4 4-4" }) : /* @__PURE__ */ jsxs11(Fragment3, { children: [
1232
+ /* @__PURE__ */ jsx15("path", { d: "m8 9 4-4 4 4" }),
1233
+ /* @__PURE__ */ jsx15("path", { d: "m8 15 4 4 4-4" })
1200
1234
  ] })
1201
1235
  }
1202
1236
  );
1203
1237
  const pageAllOn = selectable && slice.length > 0 && slice.every((r) => selected.has(r.name));
1204
1238
  return /* @__PURE__ */ jsxs11(Fragment3, { children: [
1205
1239
  scrollable && columnScroll.overflow && /* @__PURE__ */ jsxs11("div", { className: "ui-card__row", role: "group", "aria-label": `${scrollLabel} columns`, children: [
1206
- /* @__PURE__ */ jsx13(Button, { size: "sm", icon: "arrowLeft", "aria-controls": scrollId, disabled: columnScroll.start, onClick: () => scrollColumns(-1), children: "Previous columns" }),
1207
- /* @__PURE__ */ jsx13(Button, { size: "sm", iconRight: "arrowRight", "aria-controls": scrollId, disabled: columnScroll.end, onClick: () => scrollColumns(1), children: "More columns" })
1240
+ /* @__PURE__ */ jsx15(Button, { size: "sm", icon: "arrowLeft", "aria-controls": scrollId, disabled: columnScroll.start, onClick: () => scrollColumns(-1), children: "Previous columns" }),
1241
+ /* @__PURE__ */ jsx15(Button, { size: "sm", iconRight: "arrowRight", "aria-controls": scrollId, disabled: columnScroll.end, onClick: () => scrollColumns(1), children: "More columns" })
1208
1242
  ] }),
1209
- /* @__PURE__ */ jsx13(
1243
+ /* @__PURE__ */ jsx15(
1210
1244
  "div",
1211
1245
  {
1212
1246
  id: scrollId,
@@ -1222,8 +1256,8 @@ function DataTable({
1222
1256
  className: ["ui-table ui-table--hover", (density === "dense" || !density && dense) && "ui-table--dense", density === "compact" && "ui-table--compact", stickyHeader && "ui-table--sticky", pinnedIdentity && "ui-table--pinned"].filter(Boolean).join(" "),
1223
1257
  "aria-busy": loading || void 0,
1224
1258
  children: [
1225
- /* @__PURE__ */ jsx13("thead", { children: /* @__PURE__ */ jsxs11("tr", { children: [
1226
- selectable ? /* @__PURE__ */ jsx13("th", { scope: "col", className: "ui-table__selection", children: /* @__PURE__ */ jsx13(
1259
+ /* @__PURE__ */ jsx15("thead", { children: /* @__PURE__ */ jsxs11("tr", { children: [
1260
+ selectable ? /* @__PURE__ */ jsx15("th", { scope: "col", className: "ui-table__selection", children: /* @__PURE__ */ jsx15(
1227
1261
  "input",
1228
1262
  {
1229
1263
  type: "checkbox",
@@ -1236,7 +1270,7 @@ function DataTable({
1236
1270
  // The sort control is a real <button> inside the header cell. It used to be
1237
1271
  // role="button" ON the <th>, which threw away the columnheader role and put
1238
1272
  // aria-sort on a role that forbids it.
1239
- /* @__PURE__ */ jsx13(
1273
+ /* @__PURE__ */ jsx15(
1240
1274
  "th",
1241
1275
  {
1242
1276
  scope: "col",
@@ -1252,9 +1286,9 @@ function DataTable({
1252
1286
  ))
1253
1287
  ] }) }),
1254
1288
  /* @__PURE__ */ jsxs11("tbody", { children: [
1255
- !slice.length && /* @__PURE__ */ jsx13("tr", { children: /* @__PURE__ */ jsx13("td", { colSpan: columns.length + (selectable ? 1 : 0), children: loading ? "Loading rows\u2026" : empty }) }),
1289
+ !slice.length && /* @__PURE__ */ jsx15("tr", { children: /* @__PURE__ */ jsx15("td", { colSpan: columns.length + (selectable ? 1 : 0), children: loading ? "Loading rows\u2026" : empty }) }),
1256
1290
  slice.map((r) => /* @__PURE__ */ jsxs11("tr", { children: [
1257
- selectable ? /* @__PURE__ */ jsx13("td", { className: "ui-table__selection", children: /* @__PURE__ */ jsx13(
1291
+ selectable ? /* @__PURE__ */ jsx15("td", { className: "ui-table__selection", children: /* @__PURE__ */ jsx15(
1258
1292
  "input",
1259
1293
  {
1260
1294
  type: "checkbox",
@@ -1263,7 +1297,7 @@ function DataTable({
1263
1297
  onChange: () => onToggle(r.name)
1264
1298
  }
1265
1299
  ) }) : null,
1266
- columns.map((c, columnIndex) => /* @__PURE__ */ jsx13("td", { className: [c.num && "ui-table__num", pinnedIdentity && columnIndex === 0 && "ui-table__identity"].filter(Boolean).join(" "), children: c.render ? c.render(r) : String(r[c.key]) }, c.key))
1300
+ columns.map((c, columnIndex) => /* @__PURE__ */ jsx15("td", { className: [c.num && "ui-table__num", pinnedIdentity && columnIndex === 0 && "ui-table__identity"].filter(Boolean).join(" "), children: c.render ? c.render(r) : String(r[c.key]) }, c.key))
1267
1301
  ] }, r.name))
1268
1302
  ] })
1269
1303
  ]
@@ -1271,7 +1305,7 @@ function DataTable({
1271
1305
  )
1272
1306
  }
1273
1307
  ),
1274
- pager ? /* @__PURE__ */ jsx13(
1308
+ pager ? /* @__PURE__ */ jsx15(
1275
1309
  Pagination,
1276
1310
  {
1277
1311
  page,
@@ -1296,7 +1330,7 @@ function DataTable({
1296
1330
  import { PAGE_SIZES as KIT_PAGE_SIZES, DEFAULT_PAGE_SIZE as KIT_DEFAULT_PAGE_SIZE } from "@apliteni/apliteni-ui";
1297
1331
 
1298
1332
  // src/Loading.tsx
1299
- import { jsx as jsx14, jsxs as jsxs12 } from "react/jsx-runtime";
1333
+ import { jsx as jsx16, jsxs as jsxs12 } from "react/jsx-runtime";
1300
1334
  var cx4 = (...a) => a.filter(Boolean).join(" ");
1301
1335
  function Skeleton({ lines = 3, width, height, radius, className }) {
1302
1336
  const widths = Array.isArray(lines) ? lines : null;
@@ -1306,10 +1340,10 @@ function Skeleton({ lines = 3, width, height, radius, className }) {
1306
1340
  if (!w && !height && !radius) return void 0;
1307
1341
  return { ...w && { width: w }, ...height && { height }, ...radius && { borderRadius: radius } };
1308
1342
  };
1309
- return /* @__PURE__ */ jsx14("div", { className: cx4("ui-skel", className), "aria-hidden": "true", children: Array.from({ length: n }, (_, i) => /* @__PURE__ */ jsx14("span", { className: "ui-skel__bar m-skeleton", style: styleFor(i) }, i)) });
1343
+ return /* @__PURE__ */ jsx16("div", { className: cx4("ui-skel", className), "aria-hidden": "true", children: Array.from({ length: n }, (_, i) => /* @__PURE__ */ jsx16("span", { className: "ui-skel__bar m-skeleton", style: styleFor(i) }, i)) });
1310
1344
  }
1311
1345
  function SkeletonTable({ rows = 5, cols = 4, head = true }) {
1312
- const cells = Array.from({ length: Math.max(1, cols) }, (_, i) => /* @__PURE__ */ jsx14("span", { className: "ui-skel__bar m-skeleton" }, i));
1346
+ const cells = Array.from({ length: Math.max(1, cols) }, (_, i) => /* @__PURE__ */ jsx16("span", { className: "ui-skel__bar m-skeleton" }, i));
1313
1347
  return /* @__PURE__ */ jsxs12(
1314
1348
  "div",
1315
1349
  {
@@ -1317,8 +1351,8 @@ function SkeletonTable({ rows = 5, cols = 4, head = true }) {
1317
1351
  style: { "--skel-cols": Math.max(1, cols) },
1318
1352
  "aria-hidden": "true",
1319
1353
  children: [
1320
- head && /* @__PURE__ */ jsx14("div", { className: "ui-skel__row ui-skel__row--head", children: cells }),
1321
- Array.from({ length: Math.max(1, rows) }, (_, i) => /* @__PURE__ */ jsx14("div", { className: "ui-skel__row", children: cells }, i))
1354
+ head && /* @__PURE__ */ jsx16("div", { className: "ui-skel__row ui-skel__row--head", children: cells }),
1355
+ Array.from({ length: Math.max(1, rows) }, (_, i) => /* @__PURE__ */ jsx16("div", { className: "ui-skel__row", children: cells }, i))
1322
1356
  ]
1323
1357
  }
1324
1358
  );
@@ -1339,8 +1373,8 @@ function BusyRegion({
1339
1373
  "aria-live": "polite",
1340
1374
  "aria-busy": busy,
1341
1375
  children: [
1342
- /* @__PURE__ */ jsx14("span", { className: "ui-sr", children: busy ? label : message }),
1343
- /* @__PURE__ */ jsx14("div", { className: "ui-busy__body", children: busy ? placeholder ?? /* @__PURE__ */ jsx14(Skeleton, { lines: 3 }) : children })
1376
+ /* @__PURE__ */ jsx16("span", { className: "ui-sr", children: busy ? label : message }),
1377
+ /* @__PURE__ */ jsx16("div", { className: "ui-busy__body", children: busy ? placeholder ?? /* @__PURE__ */ jsx16(Skeleton, { lines: 3 }) : children })
1344
1378
  ]
1345
1379
  }
1346
1380
  );
@@ -1354,14 +1388,14 @@ function Denied({
1354
1388
  children
1355
1389
  }) {
1356
1390
  return /* @__PURE__ */ jsxs12("div", { className: cx4("ui-denied", className), children: [
1357
- /* @__PURE__ */ jsx14("div", { className: "ui-denied__seal", children: /* @__PURE__ */ jsx14(Icon, { name: icon6 }) }),
1358
- /* @__PURE__ */ jsx14("div", { className: "ui-denied__title", children: title }),
1359
- sub && /* @__PURE__ */ jsx14("div", { className: "ui-denied__sub", children: sub }),
1391
+ /* @__PURE__ */ jsx16("div", { className: "ui-denied__seal", children: /* @__PURE__ */ jsx16(Icon, { name: icon6 }) }),
1392
+ /* @__PURE__ */ jsx16("div", { className: "ui-denied__title", children: title }),
1393
+ sub && /* @__PURE__ */ jsx16("div", { className: "ui-denied__sub", children: sub }),
1360
1394
  need && /* @__PURE__ */ jsxs12("div", { className: "ui-denied__need", children: [
1361
1395
  "Needs ",
1362
- /* @__PURE__ */ jsx14("code", { className: "ui-code", children: need })
1396
+ /* @__PURE__ */ jsx16("code", { className: "ui-code", children: need })
1363
1397
  ] }),
1364
- children && /* @__PURE__ */ jsx14("div", { className: "ui-denied__actions", children })
1398
+ children && /* @__PURE__ */ jsx16("div", { className: "ui-denied__actions", children })
1365
1399
  ] });
1366
1400
  }
1367
1401
 
@@ -1375,10 +1409,10 @@ import {
1375
1409
  useState as useState6
1376
1410
  } from "react";
1377
1411
  import { icon as icon3, dropdownMatch, dropdownFiltering } from "@apliteni/apliteni-ui";
1378
- import { Fragment as Fragment5, jsx as jsx15, jsxs as jsxs13 } from "react/jsx-runtime";
1412
+ import { Fragment as Fragment5, jsx as jsx17, jsxs as jsxs13 } from "react/jsx-runtime";
1379
1413
  var cx5 = (...a) => a.filter(Boolean).join(" ");
1380
1414
  var isRow = (it) => Boolean(it) && it !== "---" && !it.separator;
1381
- var Glyph2 = ({ name, className, hidden }) => /* @__PURE__ */ jsx15(
1415
+ var Glyph2 = ({ name, className, hidden }) => /* @__PURE__ */ jsx17(
1382
1416
  "span",
1383
1417
  {
1384
1418
  className,
@@ -1391,7 +1425,7 @@ function RowBadge({ badge }) {
1391
1425
  const given = typeof badge === "string" ? "" : badge.tone || "";
1392
1426
  let tone = given || (/^live$/i.test(String(text2)) ? "live" : "neutral");
1393
1427
  if (!given && tone === "neutral" && /^(?:off|unset|disabled|archive|archived)$/i.test(text2)) tone = "state";
1394
- return /* @__PURE__ */ jsx15("span", { className: `ui-dropdown__badge is-${tone}`, children: text2 });
1428
+ return /* @__PURE__ */ jsx17("span", { className: `ui-dropdown__badge is-${tone}`, children: text2 });
1395
1429
  }
1396
1430
  var keyOf = (it) => it.value != null ? `v:${it.value}` : `l:${it.label}`;
1397
1431
  var itemsIn = (panel) => Array.from(panel?.querySelectorAll("[data-dd-item]") ?? []).filter((el) => el.getAttribute("aria-disabled") !== "true" && !el.hidden);
@@ -1606,7 +1640,7 @@ function Dropdown({
1606
1640
  };
1607
1641
  function renderRow(entry, key) {
1608
1642
  if (!isRow(entry)) {
1609
- return /* @__PURE__ */ jsx15("div", { className: "ui-dropdown__sep", role: "separator", hidden: filtering || void 0 }, key);
1643
+ return /* @__PURE__ */ jsx17("div", { className: "ui-dropdown__sep", role: "separator", hidden: filtering || void 0 }, key);
1610
1644
  }
1611
1645
  const disabled = !!entry.disabled;
1612
1646
  const selected = selectedOf(entry);
@@ -1629,18 +1663,18 @@ function Dropdown({
1629
1663
  ...sx ? { id: rowIds.get(entry), hidden: hiddenBy(entry) || void 0 } : null,
1630
1664
  onClick: (e) => choose(entry, e),
1631
1665
  children: /* @__PURE__ */ jsxs13(Fragment5, { children: [
1632
- entry.icon && /* @__PURE__ */ jsx15(Glyph2, { name: entry.icon, className: "ui-dropdown__ic" }),
1666
+ entry.icon && /* @__PURE__ */ jsx17(Glyph2, { name: entry.icon, className: "ui-dropdown__ic" }),
1633
1667
  /* @__PURE__ */ jsxs13("span", { className: "ui-dropdown__main", children: [
1634
- /* @__PURE__ */ jsx15("span", { className: "ui-dropdown__label", children: entry.label }),
1635
- entry.description && /* @__PURE__ */ jsx15("span", { className: "ui-dropdown__desc", children: entry.description })
1668
+ /* @__PURE__ */ jsx17("span", { className: "ui-dropdown__label", children: entry.label }),
1669
+ entry.description && /* @__PURE__ */ jsx17("span", { className: "ui-dropdown__desc", children: entry.description })
1636
1670
  ] }),
1637
- entry.badge ? /* @__PURE__ */ jsx15(RowBadge, { badge: entry.badge }) : null,
1638
- asOption && /* @__PURE__ */ jsx15(Glyph2, { name: "check", className: "ui-dropdown__tick", hidden: true })
1671
+ entry.badge ? /* @__PURE__ */ jsx17(RowBadge, { badge: entry.badge }) : null,
1672
+ asOption && /* @__PURE__ */ jsx17(Glyph2, { name: "check", className: "ui-dropdown__tick", hidden: true })
1639
1673
  ] })
1640
1674
  };
1641
- if (row) return /* @__PURE__ */ jsx15(Fragment4, { children: row(entry, props) }, key);
1675
+ if (row) return /* @__PURE__ */ jsx17(Fragment4, { children: row(entry, props) }, key);
1642
1676
  const Tag = asLink ? "a" : "div";
1643
- return /* @__PURE__ */ jsx15(Tag, { ...props }, key);
1677
+ return /* @__PURE__ */ jsx17(Tag, { ...props }, key);
1644
1678
  }
1645
1679
  const body = sections?.length ? sections.map((section, si) => {
1646
1680
  const gone = filtering && !(section.items || []).some((it) => isRow(it) && !hiddenBy(it));
@@ -1652,7 +1686,7 @@ function Dropdown({
1652
1686
  "aria-label": section.label || void 0,
1653
1687
  hidden: gone || void 0,
1654
1688
  children: [
1655
- section.label && /* @__PURE__ */ jsx15("div", { className: "ui-dropdown__group", role: "presentation", children: section.label }),
1689
+ section.label && /* @__PURE__ */ jsx17("div", { className: "ui-dropdown__group", role: "presentation", children: section.label }),
1656
1690
  (section.items || []).map((entry, i) => renderRow(entry, `s${si}-${i}`))
1657
1691
  ]
1658
1692
  },
@@ -1661,8 +1695,8 @@ function Dropdown({
1661
1695
  }) : (items || []).map((entry, i) => renderRow(entry, `i${i}`));
1662
1696
  const cap = scroll && scroll !== true ? { maxHeight: typeof scroll === "number" ? `${scroll}px` : scroll } : void 0;
1663
1697
  const none = sx && filtering && !visible.length ? /* @__PURE__ */ jsxs13(Fragment5, { children: [
1664
- /* @__PURE__ */ jsx15("span", { className: "ui-dropdown__none-title", children: sx.empty.replace("{q}", () => query.trim()) }),
1665
- /* @__PURE__ */ jsx15("span", { className: "ui-dropdown__none-hint", children: sx.hint })
1698
+ /* @__PURE__ */ jsx17("span", { className: "ui-dropdown__none-title", children: sx.empty.replace("{q}", () => query.trim()) }),
1699
+ /* @__PURE__ */ jsx17("span", { className: "ui-dropdown__none-hint", children: sx.hint })
1666
1700
  ] }) : null;
1667
1701
  return /* @__PURE__ */ jsxs13("div", { className: cx5("ui-dropdown", open && "open"), id, ref: root, onKeyDown, children: [
1668
1702
  /* @__PURE__ */ jsxs13(
@@ -1681,10 +1715,10 @@ function Dropdown({
1681
1715
  },
1682
1716
  children: [
1683
1717
  triggerContent != null ? triggerContent : /* @__PURE__ */ jsxs13(Fragment5, { children: [
1684
- label && /* @__PURE__ */ jsx15("span", { className: "ui-dropdown__pre", children: label }),
1685
- /* @__PURE__ */ jsx15("span", { className: "ui-dropdown__value", children: shown != null ? shown : placeholder })
1718
+ label && /* @__PURE__ */ jsx17("span", { className: "ui-dropdown__pre", children: label }),
1719
+ /* @__PURE__ */ jsx17("span", { className: "ui-dropdown__value", children: shown != null ? shown : placeholder })
1686
1720
  ] }),
1687
- chevron && /* @__PURE__ */ jsx15("span", { className: "ui-dropdown__chevron", "aria-hidden": "true" })
1721
+ chevron && /* @__PURE__ */ jsx17("span", { className: "ui-dropdown__chevron", "aria-hidden": "true" })
1688
1722
  ]
1689
1723
  }
1690
1724
  ),
@@ -1710,8 +1744,8 @@ function Dropdown({
1710
1744
  header,
1711
1745
  sx ? /* @__PURE__ */ jsxs13(Fragment5, { children: [
1712
1746
  /* @__PURE__ */ jsxs13("div", { className: "ui-dropdown__search", children: [
1713
- /* @__PURE__ */ jsx15(Glyph2, { name: "search", className: "ui-dropdown__search-ic", hidden: true }),
1714
- /* @__PURE__ */ jsx15(
1747
+ /* @__PURE__ */ jsx17(Glyph2, { name: "search", className: "ui-dropdown__search-ic", hidden: true }),
1748
+ /* @__PURE__ */ jsx17(
1715
1749
  "input",
1716
1750
  {
1717
1751
  className: "ui-dropdown__search-input",
@@ -1735,8 +1769,8 @@ function Dropdown({
1735
1769
  }
1736
1770
  )
1737
1771
  ] }),
1738
- /* @__PURE__ */ jsx15("div", { className: "ui-dropdown__list", role: "listbox", id: listId, "aria-label": name, style: cap, children: body }),
1739
- /* @__PURE__ */ jsx15(
1772
+ /* @__PURE__ */ jsx17("div", { className: "ui-dropdown__list", role: "listbox", id: listId, "aria-label": name, style: cap, children: body }),
1773
+ /* @__PURE__ */ jsx17(
1740
1774
  "div",
1741
1775
  {
1742
1776
  className: "ui-dropdown__none",
@@ -1761,7 +1795,7 @@ function strip(o) {
1761
1795
  }
1762
1796
 
1763
1797
  // src/BackLink.tsx
1764
- import { jsx as jsx16, jsxs as jsxs14 } from "react/jsx-runtime";
1798
+ import { jsx as jsx18, jsxs as jsxs14 } from "react/jsx-runtime";
1765
1799
  var BARE = "Back";
1766
1800
  var SCRIPTED = /^javascript:/i;
1767
1801
  var LEADING = /^[\u0000-\u0020]+/;
@@ -1788,45 +1822,50 @@ function BackLink({
1788
1822
  "aria-label": bare ? void 0 : `${BARE} to ${name}`,
1789
1823
  ...rest,
1790
1824
  children: [
1791
- /* @__PURE__ */ jsx16(Icon, { name: "chevronLeft" }),
1792
- /* @__PURE__ */ jsx16("span", { className: "ui-back__label", children: bare ? BARE : name })
1825
+ /* @__PURE__ */ jsx18(Icon, { name: "chevronLeft" }),
1826
+ /* @__PURE__ */ jsx18("span", { className: "ui-back__label", children: bare ? BARE : name })
1793
1827
  ]
1794
1828
  }
1795
1829
  );
1796
1830
  }
1797
1831
 
1798
1832
  // src/TableValues.tsx
1799
- import { numericValue, deltaValue } from "@apliteni/apliteni-ui";
1800
- import { jsx as jsx17, jsxs as jsxs15 } from "react/jsx-runtime";
1833
+ import { formatNumericValue, formatDeltaValue } from "@apliteni/apliteni-ui";
1834
+ import { jsx as jsx19, jsxs as jsxs15 } from "react/jsx-runtime";
1801
1835
  function NumericValue(props) {
1802
- return /* @__PURE__ */ jsx17("span", { dangerouslySetInnerHTML: { __html: numericValue(props) } });
1836
+ const value = formatNumericValue(props);
1837
+ return /* @__PURE__ */ jsx19("span", { children: /* @__PURE__ */ jsxs15("span", { className: "ui-value", "aria-label": value.missing, children: [
1838
+ value.text,
1839
+ value.unit && /* @__PURE__ */ jsx19("span", { className: "ui-value__unit", children: value.unit })
1840
+ ] }) });
1803
1841
  }
1804
1842
  function DeltaValue(props) {
1805
- return /* @__PURE__ */ jsx17("span", { dangerouslySetInnerHTML: { __html: deltaValue(props) } });
1843
+ const value = formatDeltaValue(props);
1844
+ return /* @__PURE__ */ jsx19("span", { children: /* @__PURE__ */ jsx19("span", { className: value.className, "aria-describedby": value.basisId || void 0, children: value.text }) });
1806
1845
  }
1807
1846
  function RowIdentity({ symbol, name, logo, href }) {
1808
1847
  const Tag = href ? "a" : "span";
1809
1848
  return /* @__PURE__ */ jsxs15(Tag, { className: "ui-identity", href, children: [
1810
1849
  /* @__PURE__ */ jsxs15("span", { className: "ui-identity__logo", "aria-hidden": "true", children: [
1811
- /* @__PURE__ */ jsx17("span", { children: symbol.slice(0, 1) }),
1812
- logo && /* @__PURE__ */ jsx17("img", { src: logo, alt: "", onLoad: (e) => {
1850
+ /* @__PURE__ */ jsx19("span", { children: symbol.slice(0, 1) }),
1851
+ logo && /* @__PURE__ */ jsx19("img", { src: logo, alt: "", onLoad: (e) => {
1813
1852
  e.currentTarget.hidden = false;
1814
1853
  }, onError: (e) => {
1815
1854
  e.currentTarget.hidden = true;
1816
1855
  } })
1817
1856
  ] }),
1818
- /* @__PURE__ */ jsx17("span", { className: "ui-identity__symbol", children: symbol }),
1819
- /* @__PURE__ */ jsx17("span", { className: "ui-identity__name", children: name })
1857
+ /* @__PURE__ */ jsx19("span", { className: "ui-identity__symbol", children: symbol }),
1858
+ /* @__PURE__ */ jsx19("span", { className: "ui-identity__name", children: name })
1820
1859
  ] });
1821
1860
  }
1822
1861
 
1823
1862
  // src/Segmented.tsx
1824
1863
  import { segmentedNextIndex } from "@apliteni/apliteni-ui";
1825
- import { jsx as jsx18 } from "react/jsx-runtime";
1864
+ import { jsx as jsx20 } from "react/jsx-runtime";
1826
1865
  function Segmented({ options, value, onChange, label, appearance = "pill", disabled = false }) {
1827
1866
  const enabled = options.filter((o) => !o.disabled);
1828
1867
  const tabValue = enabled.some((o) => o.value === value) ? value : enabled[0]?.value;
1829
- return /* @__PURE__ */ jsx18("div", { className: `ui-seg${appearance === "underline" ? " ui-seg--underline" : ""}`, role: "toolbar", "aria-label": label, children: options.map((option) => /* @__PURE__ */ jsx18(
1868
+ return /* @__PURE__ */ jsx20("div", { className: `ui-seg${appearance === "underline" ? " ui-seg--underline" : ""}`, role: "toolbar", "aria-label": label, children: options.map((option) => /* @__PURE__ */ jsx20(
1830
1869
  "button",
1831
1870
  {
1832
1871
  type: "button",
@@ -1852,69 +1891,120 @@ function Segmented({ options, value, onChange, label, appearance = "pill", disab
1852
1891
  }
1853
1892
 
1854
1893
  // src/FilterBar.tsx
1855
- import { useLayoutEffect as useLayoutEffect4, useRef as useRef11 } from "react";
1856
- import { filterBar, initFilterBar } from "@apliteni/apliteni-ui";
1857
- import { jsx as jsx19 } from "react/jsx-runtime";
1858
- function FilterBar(props) {
1859
- const host = useRef11(null);
1860
- const latest = useRef11(props);
1861
- latest.current = props;
1862
- const controller = useRef11(null);
1863
- const initial = useRef11({ __html: filterBar(props) });
1864
- useLayoutEffect4(() => {
1865
- const el = host.current;
1866
- controller.current = initFilterBar(el, latest.current);
1867
- const remove = (e) => latest.current.onRemove(e.detail.id);
1868
- const clear = () => latest.current.onClear();
1869
- const change = (e) => {
1870
- const { id, value } = e.detail;
1871
- latest.current.onChange(id, value);
1872
- };
1873
- el.addEventListener("ui-filter-remove", remove);
1874
- el.addEventListener("ui-filter-clear", clear);
1875
- el.addEventListener("ui-filter-change", change);
1876
- return () => {
1877
- controller.current?.destroy();
1878
- el.removeEventListener("ui-filter-remove", remove);
1879
- el.removeEventListener("ui-filter-clear", clear);
1880
- el.removeEventListener("ui-filter-change", change);
1881
- };
1882
- }, []);
1883
- useLayoutEffect4(() => {
1884
- controller.current?.update(props);
1885
- }, [props.filters, props.label, props.clearLabel, props.disabled, props.busy]);
1886
- return /* @__PURE__ */ jsx19("div", { ref: host, dangerouslySetInnerHTML: initial.current });
1894
+ import { useRef as useRef11, useState as useState7 } from "react";
1895
+ import { jsx as jsx21, jsxs as jsxs16 } from "react/jsx-runtime";
1896
+ function FilterBar({ filters, label = "Filters", clearLabel = "Clear all filters", disabled = false, busy = false, onRemove, onClear, onChange }) {
1897
+ const bar = useRef11(null);
1898
+ const focused = useRef11(null);
1899
+ const [opened, setOpened] = useState7({});
1900
+ const blocked = disabled || busy;
1901
+ useIsoLayoutEffect(() => {
1902
+ const stale = Object.keys(opened).filter((id) => !filters.some((filter) => filter.id === id && filter.open === opened[id].against));
1903
+ if (stale.length) setOpened((previous) => Object.fromEntries(Object.entries(previous).filter(([id]) => !stale.includes(id))));
1904
+ const prior = focused.current;
1905
+ if (!prior || prior.id === null && filters.length > 0 || filters.some((f) => f.id === prior.id)) return;
1906
+ const chips = Array.from(bar.current?.querySelectorAll("[data-filter-id]") ?? []);
1907
+ const next = chips.slice(prior.index).find((chip) => !chip.disabled) || chips.slice(0, prior.index).reverse().find((chip) => !chip.disabled);
1908
+ const target = !blocked && next?.querySelector("[data-dropdown-trigger]");
1909
+ focused.current = null;
1910
+ (target || bar.current)?.focus();
1911
+ });
1912
+ return /* @__PURE__ */ jsx21("div", { children: /* @__PURE__ */ jsxs16(
1913
+ "fieldset",
1914
+ {
1915
+ ref: bar,
1916
+ className: "ui-filter-bar",
1917
+ "data-filter-bar": "",
1918
+ disabled: blocked,
1919
+ "aria-busy": busy || void 0,
1920
+ tabIndex: -1,
1921
+ onBlur: (event) => {
1922
+ if (event.relatedTarget && !event.currentTarget.contains(event.relatedTarget)) focused.current = null;
1923
+ },
1924
+ children: [
1925
+ /* @__PURE__ */ jsx21("legend", { className: "ui-filter-bar__legend", children: label }),
1926
+ filters.map((filter, index) => /* @__PURE__ */ jsxs16(
1927
+ "fieldset",
1928
+ {
1929
+ className: "ui-filter-bar__chip",
1930
+ "data-filter-id": filter.id,
1931
+ disabled: filter.disabled,
1932
+ onFocus: () => {
1933
+ focused.current = { id: filter.id, index };
1934
+ },
1935
+ children: [
1936
+ /* @__PURE__ */ jsx21("legend", { className: "ui-filter-bar__legend", children: filter.label }),
1937
+ /* @__PURE__ */ jsx21(
1938
+ Dropdown,
1939
+ {
1940
+ label: filter.label,
1941
+ value: filter.value,
1942
+ items: filter.items,
1943
+ variant: "select",
1944
+ ariaLabel: `${filter.label}: ${filter.value}`,
1945
+ open: !blocked && !filter.disabled && (opened[filter.id] && opened[filter.id].against === filter.open ? opened[filter.id].open : !!filter.open),
1946
+ onOpenChange: (open) => setOpened((previous) => ({ ...previous, [filter.id]: { open, against: filter.open } })),
1947
+ onSelect: (value) => {
1948
+ if (!blocked && !filter.disabled) onChange(filter.id, value == null ? void 0 : String(value));
1949
+ }
1950
+ }
1951
+ ),
1952
+ /* @__PURE__ */ jsx21(
1953
+ "button",
1954
+ {
1955
+ type: "button",
1956
+ className: "ui-filter-bar__remove",
1957
+ "data-filter-remove": "",
1958
+ "aria-label": `Remove ${filter.label} filter`,
1959
+ onClick: () => {
1960
+ if (!blocked && !filter.disabled) onRemove(filter.id);
1961
+ },
1962
+ children: "\xD7"
1963
+ }
1964
+ )
1965
+ ]
1966
+ },
1967
+ filter.id
1968
+ )),
1969
+ /* @__PURE__ */ jsx21("span", { "data-filter-clear": "", onFocus: () => {
1970
+ focused.current = { id: null, index: 0 };
1971
+ }, children: /* @__PURE__ */ jsx21(Button, { size: "sm", variant: "ghost", disabled: !filters.length, onClick: () => {
1972
+ if (!blocked) onClear();
1973
+ }, children: clearLabel }) })
1974
+ ]
1975
+ }
1976
+ ) });
1887
1977
  }
1888
1978
 
1889
1979
  // src/KeyValueList.tsx
1890
- import { jsx as jsx20, jsxs as jsxs16 } from "react/jsx-runtime";
1980
+ import { jsx as jsx22, jsxs as jsxs17 } from "react/jsx-runtime";
1891
1981
  function detail({ value, redacted }) {
1892
- if (redacted) return /* @__PURE__ */ jsxs16("span", { className: "ui-kv__hidden", children: [
1893
- /* @__PURE__ */ jsx20(Icon, { name: "eyeOff" }),
1982
+ if (redacted) return /* @__PURE__ */ jsxs17("span", { className: "ui-kv__hidden", children: [
1983
+ /* @__PURE__ */ jsx22(Icon, { name: "eyeOff" }),
1894
1984
  "Hidden"
1895
1985
  ] });
1896
1986
  if (value == null) return "\u2014";
1897
1987
  return typeof value === "boolean" ? String(value) : value;
1898
1988
  }
1899
1989
  function KeyValueList({ rows, columns = 1, className, ...rest }) {
1900
- return /* @__PURE__ */ jsx20("dl", { ...rest, className: ["ui-kv", columns === 2 && "ui-kv--two-columns", className].filter(Boolean).join(" "), children: rows.map((row, index) => /* @__PURE__ */ jsxs16("div", { className: "ui-drawer__row", children: [
1901
- /* @__PURE__ */ jsx20("dt", { children: row.label }),
1902
- /* @__PURE__ */ jsx20("dd", { children: detail(row) })
1990
+ return /* @__PURE__ */ jsx22("dl", { ...rest, className: ["ui-kv", columns === 2 && "ui-kv--two-columns", className].filter(Boolean).join(" "), children: rows.map((row, index) => /* @__PURE__ */ jsxs17("div", { className: "ui-drawer__row", children: [
1991
+ /* @__PURE__ */ jsx22("dt", { children: row.label }),
1992
+ /* @__PURE__ */ jsx22("dd", { children: detail(row) })
1903
1993
  ] }, index)) });
1904
1994
  }
1905
1995
  function DrawerSection({ title, headingLevel = 3, className, children, ...rest }) {
1906
1996
  const Heading = `h${headingLevel}`;
1907
- return /* @__PURE__ */ jsxs16("section", { ...rest, className: ["ui-drawer__section", className].filter(Boolean).join(" "), children: [
1908
- title != null && /* @__PURE__ */ jsx20(Heading, { className: "ui-drawer__section-title", children: title }),
1997
+ return /* @__PURE__ */ jsxs17("section", { ...rest, className: ["ui-drawer__section", className].filter(Boolean).join(" "), children: [
1998
+ title != null && /* @__PURE__ */ jsx22(Heading, { className: "ui-drawer__section-title", children: title }),
1909
1999
  children
1910
2000
  ] });
1911
2001
  }
1912
2002
 
1913
2003
  // src/Snippet.tsx
1914
- import { useEffect as useEffect7, useRef as useRef12, useState as useState7 } from "react";
1915
- import { jsx as jsx21, jsxs as jsxs17 } from "react/jsx-runtime";
2004
+ import { useEffect as useEffect7, useRef as useRef12, useState as useState8 } from "react";
2005
+ import { jsx as jsx23, jsxs as jsxs18 } from "react/jsx-runtime";
1916
2006
  function Snippet({ label = "shell", code = "", reveal = false, copyLabel = "Copy" }) {
1917
- const [status, setStatus] = useState7("idle");
2007
+ const [status, setStatus] = useState8("idle");
1918
2008
  const request = useRef12(0);
1919
2009
  const timer = useRef12(void 0);
1920
2010
  useEffect7(() => {
@@ -1937,22 +2027,22 @@ function Snippet({ label = "shell", code = "", reveal = false, copyLabel = "Copy
1937
2027
  if (current === request.current) setStatus("failed");
1938
2028
  }
1939
2029
  }
1940
- return /* @__PURE__ */ jsxs17("div", { className: reveal ? "ui-snippet ui-snippet--reveal" : "ui-snippet", children: [
1941
- /* @__PURE__ */ jsxs17("div", { className: "ui-snippet__bar", children: [
1942
- /* @__PURE__ */ jsx21("span", { children: label }),
1943
- /* @__PURE__ */ jsxs17("button", { type: "button", className: "ui-snippet__copy", "aria-live": "polite", "aria-atomic": "true", onClick: copy, children: [
1944
- /* @__PURE__ */ jsx21(Icon, { name: status === "copied" ? "check" : "copy" }),
2030
+ return /* @__PURE__ */ jsxs18("div", { className: reveal ? "ui-snippet ui-snippet--reveal" : "ui-snippet", children: [
2031
+ /* @__PURE__ */ jsxs18("div", { className: "ui-snippet__bar", children: [
2032
+ /* @__PURE__ */ jsx23("span", { children: label }),
2033
+ /* @__PURE__ */ jsxs18("button", { type: "button", className: "ui-snippet__copy", "aria-live": "polite", "aria-atomic": "true", onClick: copy, children: [
2034
+ /* @__PURE__ */ jsx23(Icon, { name: status === "copied" ? "check" : "copy" }),
1945
2035
  status === "copied" ? "Copied" : status === "failed" ? "Copy failed" : copyLabel
1946
2036
  ] })
1947
2037
  ] }),
1948
- /* @__PURE__ */ jsx21("pre", { children: code })
2038
+ /* @__PURE__ */ jsx23("pre", { children: code })
1949
2039
  ] });
1950
2040
  }
1951
2041
 
1952
2042
  // src/Tabs.tsx
1953
2043
  import { useEffect as useEffect8, useId as useId9, useRef as useRef13 } from "react";
1954
2044
  import { playEntrance } from "@apliteni/apliteni-ui/motion";
1955
- import { Fragment as Fragment6, jsx as jsx22, jsxs as jsxs18 } from "react/jsx-runtime";
2045
+ import { Fragment as Fragment6, jsx as jsx24, jsxs as jsxs19 } from "react/jsx-runtime";
1956
2046
  function Tabs({ items, value, onChange, label }) {
1957
2047
  const id = useId9();
1958
2048
  const previous = useRef13(value);
@@ -1962,8 +2052,8 @@ function Tabs({ items, value, onChange, label }) {
1962
2052
  if (previous.current !== value) playEntrance(activePanel.current);
1963
2053
  previous.current = value;
1964
2054
  }, [value]);
1965
- return /* @__PURE__ */ jsxs18("div", { className: "ui-tabs", children: [
1966
- /* @__PURE__ */ jsx22("div", { className: "ui-tabs__list", role: "tablist", "aria-label": label, children: items.map((item, i) => /* @__PURE__ */ jsxs18(
2055
+ return /* @__PURE__ */ jsxs19("div", { className: "ui-tabs", children: [
2056
+ /* @__PURE__ */ jsx24("div", { className: "ui-tabs__list", role: "tablist", "aria-label": label, children: items.map((item, i) => /* @__PURE__ */ jsxs19(
1967
2057
  "button",
1968
2058
  {
1969
2059
  type: "button",
@@ -2001,7 +2091,7 @@ function Tabs({ items, value, onChange, label }) {
2001
2091
  },
2002
2092
  children: [
2003
2093
  item.label,
2004
- item.count != null && /* @__PURE__ */ jsxs18(Fragment6, { children: [
2094
+ item.count != null && /* @__PURE__ */ jsxs19(Fragment6, { children: [
2005
2095
  " ",
2006
2096
  item.count
2007
2097
  ] })
@@ -2009,7 +2099,7 @@ function Tabs({ items, value, onChange, label }) {
2009
2099
  },
2010
2100
  item.value
2011
2101
  )) }),
2012
- /* @__PURE__ */ jsx22("div", { className: "ui-tabs__panels", children: items.map((item, i) => /* @__PURE__ */ jsx22(
2102
+ /* @__PURE__ */ jsx24("div", { className: "ui-tabs__panels", children: items.map((item, i) => /* @__PURE__ */ jsx24(
2013
2103
  "div",
2014
2104
  {
2015
2105
  className: "ui-tabs__panel",
@@ -2029,7 +2119,7 @@ function Tabs({ items, value, onChange, label }) {
2029
2119
  // src/Timeline.tsx
2030
2120
  import { useEffect as useEffect9, useRef as useRef14 } from "react";
2031
2121
  import { playEntrance as playEntrance2, prefersReducedMotion } from "@apliteni/apliteni-ui/motion";
2032
- import { jsx as jsx23, jsxs as jsxs19 } from "react/jsx-runtime";
2122
+ import { jsx as jsx25, jsxs as jsxs20 } from "react/jsx-runtime";
2033
2123
  var kindIcons = { person: "user", rule: "bolt", reversal: "refresh" };
2034
2124
  function Timeline({ events, className, ...rest }) {
2035
2125
  const previousIds = useRef14(new Set(events.map((event) => event.id)));
@@ -2046,7 +2136,7 @@ function Timeline({ events, className, ...rest }) {
2046
2136
  }
2047
2137
  previousIds.current = new Set(events.map((event) => event.id));
2048
2138
  }, [events]);
2049
- return /* @__PURE__ */ jsx23("ol", { ...rest, role: "list", className: ["ui-timeline", events.some((event) => event.kind) && "ui-timeline--kinds", className].filter(Boolean).join(" "), children: events.map((event, index) => /* @__PURE__ */ jsxs19(
2139
+ return /* @__PURE__ */ jsx25("ol", { ...rest, role: "list", className: ["ui-timeline", events.some((event) => event.kind) && "ui-timeline--kinds", className].filter(Boolean).join(" "), children: events.map((event, index) => /* @__PURE__ */ jsxs20(
2050
2140
  "li",
2051
2141
  {
2052
2142
  className: "ui-timeline__event",
@@ -2055,20 +2145,20 @@ function Timeline({ events, className, ...rest }) {
2055
2145
  else rows.current.delete(event.id);
2056
2146
  },
2057
2147
  children: [
2058
- /* @__PURE__ */ jsx23("span", { "aria-hidden": "true", className: [
2148
+ /* @__PURE__ */ jsx25("span", { "aria-hidden": "true", className: [
2059
2149
  "ui-timeline__marker",
2060
2150
  event.kind && "ui-timeline__marker--kind",
2061
2151
  event.kind === "reversal" && "ui-timeline__marker--reversal"
2062
- ].filter(Boolean).join(" "), children: event.kind && /* @__PURE__ */ jsx23(Icon, { name: kindIcons[event.kind] }) }),
2063
- /* @__PURE__ */ jsxs19("div", { className: "ui-timeline__head", children: [
2064
- /* @__PURE__ */ jsx23("span", { className: "ui-timeline__actor", children: event.actor }),
2065
- /* @__PURE__ */ jsx23("time", { dateTime: event.dateTime, children: event.timestamp }),
2066
- index === events.length - 1 && event.relativeTimestamp && /* @__PURE__ */ jsx23("span", { className: "ui-timeline__relative", children: event.relativeTimestamp })
2152
+ ].filter(Boolean).join(" "), children: event.kind && /* @__PURE__ */ jsx25(Icon, { name: kindIcons[event.kind] }) }),
2153
+ /* @__PURE__ */ jsxs20("div", { className: "ui-timeline__head", children: [
2154
+ /* @__PURE__ */ jsx25("span", { className: "ui-timeline__actor", children: event.actor }),
2155
+ /* @__PURE__ */ jsx25("time", { dateTime: event.dateTime, children: event.timestamp }),
2156
+ index === events.length - 1 && event.relativeTimestamp && /* @__PURE__ */ jsx25("span", { className: "ui-timeline__relative", children: event.relativeTimestamp })
2067
2157
  ] }),
2068
- /* @__PURE__ */ jsx23("p", { className: "ui-timeline__description", children: event.description }),
2069
- (event.meta != null || event.undo) && /* @__PURE__ */ jsxs19("div", { className: "ui-timeline__meta", children: [
2070
- event.meta != null && /* @__PURE__ */ jsx23("span", { children: event.meta }),
2071
- event.undo && /* @__PURE__ */ jsx23(Button, { variant: "ghost", size: "xs", className: "ui-btn ui-btn--ghost ui-btn--xs ui-timeline__undo", "aria-label": event.undo.label, onClick: event.undo.onUndo, children: "Undo" })
2158
+ /* @__PURE__ */ jsx25("p", { className: "ui-timeline__description", children: event.description }),
2159
+ (event.meta != null || event.undo) && /* @__PURE__ */ jsxs20("div", { className: "ui-timeline__meta", children: [
2160
+ event.meta != null && /* @__PURE__ */ jsx25("span", { children: event.meta }),
2161
+ event.undo && /* @__PURE__ */ jsx25(Button, { variant: "ghost", size: "xs", className: "ui-btn ui-btn--ghost ui-btn--xs ui-timeline__undo", "aria-label": event.undo.label, onClick: event.undo.onUndo, children: "Undo" })
2072
2162
  ] })
2073
2163
  ]
2074
2164
  },
@@ -2077,20 +2167,20 @@ function Timeline({ events, className, ...rest }) {
2077
2167
  }
2078
2168
 
2079
2169
  // src/Field.tsx
2080
- import { useEffect as useEffect10, useId as useId10, useRef as useRef15, useState as useState8 } from "react";
2170
+ import { useEffect as useEffect10, useId as useId10, useRef as useRef15, useState as useState9 } from "react";
2081
2171
  import { esc, icon as icon4 } from "@apliteni/apliteni-ui";
2082
- import { jsx as jsx24, jsxs as jsxs20 } from "react/jsx-runtime";
2172
+ import { jsx as jsx26, jsxs as jsxs21 } from "react/jsx-runtime";
2083
2173
  function messages(id, hint, error) {
2084
2174
  return [error && `${id}-error`, hint && `${id}-hint`].filter(Boolean).join(" ") || void 0;
2085
2175
  }
2086
2176
  function Frame({ id, label, hint, error, required, children }) {
2087
- return /* @__PURE__ */ jsxs20("div", { className: "ui-field", children: [
2088
- /* @__PURE__ */ jsxs20("label", { className: "ui-field__label", htmlFor: id, children: [
2177
+ return /* @__PURE__ */ jsxs21("div", { className: "ui-field", children: [
2178
+ /* @__PURE__ */ jsxs21("label", { className: "ui-field__label", htmlFor: id, children: [
2089
2179
  label,
2090
- required && /* @__PURE__ */ jsx24("span", { className: "ui-field__req", "aria-hidden": "true", children: "*" })
2180
+ required && /* @__PURE__ */ jsx26("span", { className: "ui-field__req", "aria-hidden": "true", children: "*" })
2091
2181
  ] }),
2092
2182
  children,
2093
- error && /* @__PURE__ */ jsx24(
2183
+ error && /* @__PURE__ */ jsx26(
2094
2184
  "div",
2095
2185
  {
2096
2186
  id: `${id}-error`,
@@ -2099,7 +2189,7 @@ function Frame({ id, label, hint, error, required, children }) {
2099
2189
  dangerouslySetInnerHTML: { __html: icon4("alert") + esc(error) }
2100
2190
  }
2101
2191
  ),
2102
- hint && /* @__PURE__ */ jsx24("div", { id: `${id}-hint`, className: "ui-field__hint", children: hint })
2192
+ hint && /* @__PURE__ */ jsx26("div", { id: `${id}-hint`, className: "ui-field__hint", children: hint })
2103
2193
  ] });
2104
2194
  }
2105
2195
  function wiring(id, hint, error) {
@@ -2109,7 +2199,7 @@ function TextField({ label, hint, error, required, type = "text", unit, classNam
2109
2199
  const id = useId10();
2110
2200
  const hasUnit = type === "number" && !!unit;
2111
2201
  const describedBy = [messages(id, hint, error), hasUnit ? `${id}-unit` : ""].filter(Boolean).join(" ") || void 0;
2112
- const control = /* @__PURE__ */ jsx24(
2202
+ const control = /* @__PURE__ */ jsx26(
2113
2203
  "input",
2114
2204
  {
2115
2205
  ...props,
@@ -2121,14 +2211,14 @@ function TextField({ label, hint, error, required, type = "text", unit, classNam
2121
2211
  className: `ui-input${error ? " is-invalid" : ""} ${className}`
2122
2212
  }
2123
2213
  );
2124
- return /* @__PURE__ */ jsx24(Frame, { ...{ id, label, hint, error, required }, children: hasUnit ? /* @__PURE__ */ jsxs20("div", { className: "ui-field-number", children: [
2214
+ return /* @__PURE__ */ jsx26(Frame, { ...{ id, label, hint, error, required }, children: hasUnit ? /* @__PURE__ */ jsxs21("div", { className: "ui-field-number", children: [
2125
2215
  control,
2126
- /* @__PURE__ */ jsx24("span", { id: `${id}-unit`, className: "ui-field-number__unit", children: unit })
2216
+ /* @__PURE__ */ jsx26("span", { id: `${id}-unit`, className: "ui-field-number__unit", children: unit })
2127
2217
  ] }) : control });
2128
2218
  }
2129
2219
  function TextArea({ label, hint, error, required, className = "", ...props }) {
2130
2220
  const id = useId10();
2131
- return /* @__PURE__ */ jsx24(Frame, { ...{ id, label, hint, error, required }, children: /* @__PURE__ */ jsx24(
2221
+ return /* @__PURE__ */ jsx26(Frame, { ...{ id, label, hint, error, required }, children: /* @__PURE__ */ jsx26(
2132
2222
  "textarea",
2133
2223
  {
2134
2224
  rows: 4,
@@ -2141,7 +2231,7 @@ function TextArea({ label, hint, error, required, className = "", ...props }) {
2141
2231
  }
2142
2232
  function SelectField({ label, hint, error, required, className = "", children, ...props }) {
2143
2233
  const id = useId10();
2144
- return /* @__PURE__ */ jsx24(Frame, { ...{ id, label, hint, error, required }, children: /* @__PURE__ */ jsx24(
2234
+ return /* @__PURE__ */ jsx26(Frame, { ...{ id, label, hint, error, required }, children: /* @__PURE__ */ jsx26(
2145
2235
  "select",
2146
2236
  {
2147
2237
  ...props,
@@ -2155,8 +2245,8 @@ function SelectField({ label, hint, error, required, className = "", children, .
2155
2245
  function FileField({ label, hint, error, required, disabled, onFileChange, className = "", ...props }) {
2156
2246
  const id = useId10();
2157
2247
  const input = useRef15(null);
2158
- const [file, setFile] = useState8(null);
2159
- const [dragging, setDragging] = useState8(false);
2248
+ const [file, setFile] = useState9(null);
2249
+ const [dragging, setDragging] = useState9(false);
2160
2250
  useEffect10(() => {
2161
2251
  const form = input.current?.form;
2162
2252
  const reset = () => {
@@ -2170,7 +2260,7 @@ function FileField({ label, hint, error, required, disabled, onFileChange, class
2170
2260
  setFile(next);
2171
2261
  onFileChange?.(next);
2172
2262
  };
2173
- return /* @__PURE__ */ jsx24(Frame, { ...{ id, label, hint, error, required }, children: /* @__PURE__ */ jsxs20(
2263
+ return /* @__PURE__ */ jsx26(Frame, { ...{ id, label, hint, error, required }, children: /* @__PURE__ */ jsxs21(
2174
2264
  "div",
2175
2265
  {
2176
2266
  className: `ui-file${dragging && !disabled ? " is-dragging" : ""}${file ? " has-file" : ""}${error ? " is-invalid" : ""}${disabled ? " is-disabled" : ""}`,
@@ -2191,12 +2281,12 @@ function FileField({ label, hint, error, required, disabled, onFileChange, class
2191
2281
  update(transfer.files[0]);
2192
2282
  },
2193
2283
  children: [
2194
- /* @__PURE__ */ jsx24("span", { className: "ui-file__glyph", children: /* @__PURE__ */ jsx24(Icon, { name: "upload" }) }),
2195
- /* @__PURE__ */ jsx24("div", { "aria-live": "polite", children: file ? file.name : "Drop a file here" }),
2196
- /* @__PURE__ */ jsx24("div", { children: "or choose one from your device" }),
2197
- /* @__PURE__ */ jsxs20("span", { className: "ui-file__choose", children: [
2198
- /* @__PURE__ */ jsx24("span", { className: "ui-btn ui-btn--secondary ui-btn--sm", "aria-hidden": "true", "aria-disabled": disabled || void 0, children: file ? "Replace file" : "Choose file" }),
2199
- /* @__PURE__ */ jsx24(
2284
+ /* @__PURE__ */ jsx26("span", { className: "ui-file__glyph", children: /* @__PURE__ */ jsx26(Icon, { name: "upload" }) }),
2285
+ /* @__PURE__ */ jsx26("div", { "aria-live": "polite", children: file ? file.name : "Drop a file here" }),
2286
+ /* @__PURE__ */ jsx26("div", { children: "or choose one from your device" }),
2287
+ /* @__PURE__ */ jsxs21("span", { className: "ui-file__choose", children: [
2288
+ /* @__PURE__ */ jsx26("span", { className: "ui-btn ui-btn--secondary ui-btn--sm", "aria-hidden": "true", "aria-disabled": disabled || void 0, children: file ? "Replace file" : "Choose file" }),
2289
+ /* @__PURE__ */ jsx26(
2200
2290
  "input",
2201
2291
  {
2202
2292
  ...props,
@@ -2216,9 +2306,9 @@ function FileField({ label, hint, error, required, disabled, onFileChange, class
2216
2306
  }
2217
2307
 
2218
2308
  // src/Toast.tsx
2219
- import { createContext as createContext2, useCallback as useCallback3, useContext as useContext2, useEffect as useEffect11, useLayoutEffect as useLayoutEffect5, useRef as useRef16, useState as useState9 } from "react";
2309
+ import { createContext as createContext2, useCallback as useCallback3, useContext as useContext2, useEffect as useEffect11, useLayoutEffect as useLayoutEffect4, useRef as useRef16, useState as useState10 } from "react";
2220
2310
  import { createPortal as createPortal4 } from "react-dom";
2221
- import { jsx as jsx25, jsxs as jsxs21 } from "react/jsx-runtime";
2311
+ import { jsx as jsx27, jsxs as jsxs22 } from "react/jsx-runtime";
2222
2312
  var Context = createContext2(null);
2223
2313
  var glyphs = { success: "circleCheck", danger: "circleX", warn: "circleAlert", info: "info", neutral: "bolt" };
2224
2314
  function useToast() {
@@ -2228,11 +2318,11 @@ function useToast() {
2228
2318
  }
2229
2319
  function Notice({ notice, remove }) {
2230
2320
  const root = useRef16(null);
2231
- const [leaving2, setLeaving] = useState9(false);
2321
+ const [leaving2, setLeaving] = useState10(false);
2232
2322
  const dismissed = useRef16(false);
2233
2323
  const remaining = useRef16(5e3);
2234
- const [hovered, setHovered] = useState9(false);
2235
- const [focused, setFocused] = useState9(false);
2324
+ const [hovered, setHovered] = useState10(false);
2325
+ const [focused, setFocused] = useState10(false);
2236
2326
  const paused = hovered || focused;
2237
2327
  const tone = notice.tone ?? "success";
2238
2328
  const dismiss = useCallback3(() => {
@@ -2264,7 +2354,7 @@ function Notice({ notice, remove }) {
2264
2354
  remaining.current = Math.max(0, remaining.current - (Date.now() - started));
2265
2355
  };
2266
2356
  }, [dismiss, leaving2, notice.action, paused]);
2267
- return /* @__PURE__ */ jsxs21(
2357
+ return /* @__PURE__ */ jsxs22(
2268
2358
  "div",
2269
2359
  {
2270
2360
  ref: root,
@@ -2278,12 +2368,12 @@ function Notice({ notice, remove }) {
2278
2368
  if (!event.currentTarget.contains(event.relatedTarget)) setFocused(false);
2279
2369
  },
2280
2370
  children: [
2281
- /* @__PURE__ */ jsx25("span", { className: "ui-toast__icon", children: /* @__PURE__ */ jsx25(Icon, { name: glyphs[tone] }) }),
2282
- /* @__PURE__ */ jsxs21("div", { className: "ui-toast__body", children: [
2283
- /* @__PURE__ */ jsx25("div", { className: "ui-toast__title", children: notice.title }),
2284
- notice.text && /* @__PURE__ */ jsx25("div", { className: "ui-toast__text", children: notice.text })
2371
+ /* @__PURE__ */ jsx27("span", { className: "ui-toast__icon", children: /* @__PURE__ */ jsx27(Icon, { name: glyphs[tone] }) }),
2372
+ /* @__PURE__ */ jsxs22("div", { className: "ui-toast__body", children: [
2373
+ /* @__PURE__ */ jsx27("div", { className: "ui-toast__title", children: notice.title }),
2374
+ notice.text && /* @__PURE__ */ jsx27("div", { className: "ui-toast__text", children: notice.text })
2285
2375
  ] }),
2286
- notice.action && /* @__PURE__ */ jsx25(
2376
+ notice.action && /* @__PURE__ */ jsx27(
2287
2377
  "button",
2288
2378
  {
2289
2379
  type: "button",
@@ -2298,8 +2388,8 @@ function Notice({ notice, remove }) {
2298
2388
  children: notice.action.label
2299
2389
  }
2300
2390
  ),
2301
- /* @__PURE__ */ jsx25("button", { type: "button", className: "ui-toast__close", "aria-label": "Dismiss", disabled: leaving2, onClick: dismiss, children: /* @__PURE__ */ jsx25(Icon, { name: "x" }) }),
2302
- !notice.action && /* @__PURE__ */ jsx25(
2391
+ /* @__PURE__ */ jsx27("button", { type: "button", className: "ui-toast__close", "aria-label": "Dismiss", disabled: leaving2, onClick: dismiss, children: /* @__PURE__ */ jsx27(Icon, { name: "x" }) }),
2392
+ !notice.action && /* @__PURE__ */ jsx27(
2303
2393
  "span",
2304
2394
  {
2305
2395
  className: "ui-toast__timer is-running",
@@ -2313,7 +2403,7 @@ function Notice({ notice, remove }) {
2313
2403
  }
2314
2404
  var REACH = "--rx-toast-stack";
2315
2405
  function usePublishedReach(stack2, count) {
2316
- useLayoutEffect5(() => {
2406
+ useLayoutEffect4(() => {
2317
2407
  const element = stack2.current;
2318
2408
  const view = element?.ownerDocument.defaultView;
2319
2409
  const root = element?.ownerDocument.documentElement;
@@ -2332,7 +2422,7 @@ function usePublishedReach(stack2, count) {
2332
2422
  }, [stack2, count]);
2333
2423
  }
2334
2424
  function Toast({ children }) {
2335
- const [entries, setEntries] = useState9([]);
2425
+ const [entries, setEntries] = useState10([]);
2336
2426
  const nextId = useRef16(0);
2337
2427
  const stack2 = useRef16(null);
2338
2428
  const push = useCallback3((notice) => {
@@ -2341,19 +2431,19 @@ function Toast({ children }) {
2341
2431
  setEntries((current) => [...current, { id, notice, remove }]);
2342
2432
  }, []);
2343
2433
  usePublishedReach(stack2, entries.length);
2344
- return /* @__PURE__ */ jsxs21(Context.Provider, { value: push, children: [
2434
+ return /* @__PURE__ */ jsxs22(Context.Provider, { value: push, children: [
2345
2435
  children,
2346
2436
  typeof document !== "undefined" && createPortal4(
2347
- /* @__PURE__ */ jsx25("div", { className: "ui-toast-stack rx-toast-stack", ref: stack2, children: entries.map((entry) => /* @__PURE__ */ jsx25(Notice, { notice: entry.notice, remove: entry.remove }, entry.id)) }),
2437
+ /* @__PURE__ */ jsx27("div", { className: "ui-toast-stack rx-toast-stack", ref: stack2, children: entries.map((entry) => /* @__PURE__ */ jsx27(Notice, { notice: entry.notice, remove: entry.remove }, entry.id)) }),
2348
2438
  document.body
2349
2439
  )
2350
2440
  ] });
2351
2441
  }
2352
2442
 
2353
2443
  // src/AppShell.tsx
2354
- import { useEffect as useEffect12, useId as useId11, useState as useState10 } from "react";
2444
+ import { useEffect as useEffect12, useId as useId11, useState as useState11 } from "react";
2355
2445
  import { applyTheme, paletteHotkey, prism, railCollapsed, themeIcon, themeName } from "@apliteni/apliteni-ui";
2356
- import { Fragment as Fragment7, jsx as jsx26, jsxs as jsxs22 } from "react/jsx-runtime";
2446
+ import { Fragment as Fragment7, jsx as jsx28, jsxs as jsxs23 } from "react/jsx-runtime";
2357
2447
  var path = (value) => value.split(/[?#]/)[0].replace(/\/+$/, "") || "/";
2358
2448
  function AppShell({
2359
2449
  sections,
@@ -2375,10 +2465,10 @@ function AppShell({
2375
2465
  renderLink
2376
2466
  }) {
2377
2467
  const uid = useId11();
2378
- const [collapsed, setCollapsed] = useState10(defaultCollapsed);
2379
- const [search, setSearch] = useState10(false);
2380
- const [more, setMore] = useState10(false);
2381
- const [theme, setTheme] = useState10("dark");
2468
+ const [collapsed, setCollapsed] = useState11(defaultCollapsed);
2469
+ const [search, setSearch] = useState11(false);
2470
+ const [more, setMore] = useState11(false);
2471
+ const [theme, setTheme] = useState11("dark");
2382
2472
  const current = path(pathname);
2383
2473
  const active = sections.filter((section) => current === path(section.href) || path(section.href) !== "/" && current.startsWith(`${path(section.href)}/`)).sort((a, b) => path(b.href).length - path(a.href).length)[0];
2384
2474
  useEffect12(() => {
@@ -2424,44 +2514,44 @@ function AppShell({
2424
2514
  onClick: (event) => {
2425
2515
  if (!event.metaKey && !event.ctrlKey && !event.shiftKey && !event.altKey) setMore(false);
2426
2516
  },
2427
- children: /* @__PURE__ */ jsxs22(Fragment7, { children: [
2428
- /* @__PURE__ */ jsx26("span", { className: "ui-nav__ic", children: /* @__PURE__ */ jsx26(Icon, { name: section.icon }) }),
2429
- /* @__PURE__ */ jsx26("span", { className: "ui-nav__label", children: section.label }),
2430
- section.count != null && /* @__PURE__ */ jsx26("span", { className: "ui-nav__badge", children: section.count })
2517
+ children: /* @__PURE__ */ jsxs23(Fragment7, { children: [
2518
+ /* @__PURE__ */ jsx28("span", { className: "ui-nav__ic", children: /* @__PURE__ */ jsx28(Icon, { name: section.icon }) }),
2519
+ /* @__PURE__ */ jsx28("span", { className: "ui-nav__label", children: section.label }),
2520
+ section.count != null && /* @__PURE__ */ jsx28("span", { className: "ui-nav__badge", children: section.count })
2431
2521
  ] })
2432
2522
  };
2433
- return /* @__PURE__ */ jsx26("li", { children: renderLink ? renderLink(section, linkProps) : /* @__PURE__ */ jsx26("a", { ...linkProps }) }, section.href);
2523
+ return /* @__PURE__ */ jsx28("li", { children: renderLink ? renderLink(section, linkProps) : /* @__PURE__ */ jsx28("a", { ...linkProps }) }, section.href);
2434
2524
  });
2435
2525
  const foldLabel = collapsed ? "Expand sidebar" : "Collapse sidebar";
2436
2526
  const visible = sections.length > 4 ? sections.slice(0, 3) : sections;
2437
2527
  const remaining = sections.slice(visible.length);
2438
2528
  const initials = account.name.trim().split(/\s+/).map((part) => part[0]).slice(0, 2).join("");
2439
- return /* @__PURE__ */ jsxs22("div", { className: `ui-app ui-app--topbar ui-react-app${collapsed ? " is-collapsed" : ""}`, children: [
2440
- /* @__PURE__ */ jsxs22("div", { className: "ui-app__rail", children: [
2441
- /* @__PURE__ */ jsx26("div", { className: "ui-app__head", children: /* @__PURE__ */ jsxs22("a", { className: "ui-app__brand", href: brandHref, "aria-label": word, children: [
2442
- brand ?? /* @__PURE__ */ jsx26("i", { "aria-hidden": "true", className: "ui-react-app__mark", dangerouslySetInnerHTML: { __html: prism(uid, 24) } }),
2443
- /* @__PURE__ */ jsx26("span", { children: word })
2529
+ return /* @__PURE__ */ jsxs23("div", { className: `ui-app ui-app--topbar ui-react-app${collapsed ? " is-collapsed" : ""}`, children: [
2530
+ /* @__PURE__ */ jsxs23("div", { className: "ui-app__rail", children: [
2531
+ /* @__PURE__ */ jsx28("div", { className: "ui-app__head", children: /* @__PURE__ */ jsxs23("a", { className: "ui-app__brand", href: brandHref, "aria-label": word, children: [
2532
+ brand ?? /* @__PURE__ */ jsx28("i", { "aria-hidden": "true", className: "ui-react-app__mark", dangerouslySetInnerHTML: { __html: prism(uid, 24) } }),
2533
+ /* @__PURE__ */ jsx28("span", { children: word })
2444
2534
  ] }) }),
2445
- /* @__PURE__ */ jsx26("nav", { className: "ui-nav ui-nav--side", "aria-label": "Sections", children: /* @__PURE__ */ jsx26("ul", { className: "ui-nav__list", children: links(sections) }) }),
2446
- /* @__PURE__ */ jsx26("div", { className: "ui-app__foot", children: /* @__PURE__ */ jsx26("div", { className: "ui-app__fold-row", children: /* @__PURE__ */ jsxs22("button", { type: "button", className: "ui-nav__item ui-app__fold", "aria-expanded": !collapsed, "aria-label": foldLabel, onClick: fold, children: [
2447
- /* @__PURE__ */ jsx26("span", { className: "ui-nav__ic", children: /* @__PURE__ */ jsxs22("svg", { className: "ui-icon", viewBox: "0 0 24 24", "aria-hidden": "true", children: [
2448
- /* @__PURE__ */ jsx26("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2" }),
2449
- /* @__PURE__ */ jsx26("path", { className: "ui-app__fold-seam", d: "M9 3v18" })
2535
+ /* @__PURE__ */ jsx28("nav", { className: "ui-nav ui-nav--side", "aria-label": "Sections", children: /* @__PURE__ */ jsx28("ul", { className: "ui-nav__list", children: links(sections) }) }),
2536
+ /* @__PURE__ */ jsx28("div", { className: "ui-app__foot", children: /* @__PURE__ */ jsx28("div", { className: "ui-app__fold-row", children: /* @__PURE__ */ jsxs23("button", { type: "button", className: "ui-nav__item ui-app__fold", "aria-expanded": !collapsed, "aria-label": foldLabel, onClick: fold, children: [
2537
+ /* @__PURE__ */ jsx28("span", { className: "ui-nav__ic", children: /* @__PURE__ */ jsxs23("svg", { className: "ui-icon", viewBox: "0 0 24 24", "aria-hidden": "true", children: [
2538
+ /* @__PURE__ */ jsx28("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2" }),
2539
+ /* @__PURE__ */ jsx28("path", { className: "ui-app__fold-seam", d: "M9 3v18" })
2450
2540
  ] }) }),
2451
- /* @__PURE__ */ jsx26("span", { className: "ui-nav__label", children: foldLabel })
2541
+ /* @__PURE__ */ jsx28("span", { className: "ui-nav__label", children: foldLabel })
2452
2542
  ] }) }) })
2453
2543
  ] }),
2454
- /* @__PURE__ */ jsxs22("div", { className: "ui-app__well", children: [
2455
- /* @__PURE__ */ jsxs22("header", { className: "ui-app__bar", children: [
2456
- /* @__PURE__ */ jsxs22("button", { type: "button", className: "ui-app__search", "aria-haspopup": "dialog", onClick: () => setSearch(true), children: [
2457
- /* @__PURE__ */ jsx26("span", { className: "ui-app__search-ic", children: /* @__PURE__ */ jsx26(Icon, { name: "search" }) }),
2458
- /* @__PURE__ */ jsx26("span", { className: "ui-app__search-txt", children: "Search or run a command\u2026" }),
2459
- /* @__PURE__ */ jsx26("kbd", { className: "ui-cmdk__key", children: paletteHotkey() })
2544
+ /* @__PURE__ */ jsxs23("div", { className: "ui-app__well", children: [
2545
+ /* @__PURE__ */ jsxs23("header", { className: "ui-app__bar", children: [
2546
+ /* @__PURE__ */ jsxs23("button", { type: "button", className: "ui-app__search", "aria-haspopup": "dialog", onClick: () => setSearch(true), children: [
2547
+ /* @__PURE__ */ jsx28("span", { className: "ui-app__search-ic", children: /* @__PURE__ */ jsx28(Icon, { name: "search" }) }),
2548
+ /* @__PURE__ */ jsx28("span", { className: "ui-app__search-txt", children: "Search or run a command\u2026" }),
2549
+ /* @__PURE__ */ jsx28("kbd", { className: "ui-cmdk__key", children: paletteHotkey() })
2460
2550
  ] }),
2461
- /* @__PURE__ */ jsx26("span", { className: "ui-app__bar-gap" }),
2551
+ /* @__PURE__ */ jsx28("span", { className: "ui-app__bar-gap" }),
2462
2552
  bandControl,
2463
- /* @__PURE__ */ jsx26("button", { type: "button", className: "toggle", "aria-label": themeName(theme), title: themeName(theme), onClick: () => applyTheme(theme === "light" ? "dark" : "light"), children: /* @__PURE__ */ jsx26("span", { className: "ic", "aria-hidden": "true", dangerouslySetInnerHTML: { __html: themeIcon(theme) } }) }),
2464
- /* @__PURE__ */ jsx26("div", { className: "ui-app__user ui-app__user--bar", children: /* @__PURE__ */ jsx26(
2553
+ /* @__PURE__ */ jsx28("button", { type: "button", className: "toggle", "aria-label": themeName(theme), title: themeName(theme), onClick: () => applyTheme(theme === "light" ? "dark" : "light"), children: /* @__PURE__ */ jsx28("span", { className: "ic", "aria-hidden": "true", dangerouslySetInnerHTML: { __html: themeIcon(theme) } }) }),
2554
+ /* @__PURE__ */ jsx28("div", { className: "ui-app__user ui-app__user--bar", children: /* @__PURE__ */ jsx28(
2465
2555
  Dropdown,
2466
2556
  {
2467
2557
  variant: "menu",
@@ -2470,27 +2560,27 @@ function AppShell({
2470
2560
  ariaLabel: `Signed in as ${account.name}, ${account.email}`,
2471
2561
  triggerClass: "ui-app__user-trigger",
2472
2562
  panelClass: "ui-app__user-panel",
2473
- triggerContent: /* @__PURE__ */ jsx26("span", { className: "ui-app__av", "aria-hidden": "true", children: initials }),
2474
- header: /* @__PURE__ */ jsxs22("div", { className: "ui-dropdown__head", children: [
2475
- /* @__PURE__ */ jsx26("b", { children: account.name }),
2476
- /* @__PURE__ */ jsx26("span", { children: account.email })
2563
+ triggerContent: /* @__PURE__ */ jsx28("span", { className: "ui-app__av", "aria-hidden": "true", children: initials }),
2564
+ header: /* @__PURE__ */ jsxs23("div", { className: "ui-dropdown__head", children: [
2565
+ /* @__PURE__ */ jsx28("b", { children: account.name }),
2566
+ /* @__PURE__ */ jsx28("span", { children: account.email })
2477
2567
  ] }),
2478
2568
  items: [{ label: "Sign out", icon: "logout", danger: true }],
2479
2569
  onSelect: onSignOut
2480
2570
  }
2481
2571
  ) })
2482
2572
  ] }),
2483
- /* @__PURE__ */ jsxs22("main", { className: `ui-app__main${width === "wide" ? " ui-app__main--wide" : ""}`, children: [
2484
- back && /* @__PURE__ */ jsx26(BackLink, { ...back }),
2485
- /* @__PURE__ */ jsx26("h1", { children: title }),
2486
- lede && /* @__PURE__ */ jsx26("p", { className: "ui-app__sub", children: lede }),
2487
- actions && /* @__PURE__ */ jsx26("div", { className: "ui-react-app__actions", children: actions }),
2488
- /* @__PURE__ */ jsx26("div", { className: "ui-app__body", children })
2573
+ /* @__PURE__ */ jsxs23("main", { className: `ui-app__main${width === "wide" ? " ui-app__main--wide" : ""}`, children: [
2574
+ back && /* @__PURE__ */ jsx28(BackLink, { ...back }),
2575
+ /* @__PURE__ */ jsx28("h1", { children: title }),
2576
+ lede && /* @__PURE__ */ jsx28("p", { className: "ui-app__sub", children: lede }),
2577
+ actions && /* @__PURE__ */ jsx28("div", { className: "ui-react-app__actions", children: actions }),
2578
+ /* @__PURE__ */ jsx28("div", { className: "ui-app__body", children })
2489
2579
  ] })
2490
2580
  ] }),
2491
- /* @__PURE__ */ jsx26("nav", { className: "ui-nav ui-react-app__bottom", "aria-label": "Sections on mobile", children: /* @__PURE__ */ jsxs22("ul", { className: "ui-nav__list", children: [
2581
+ /* @__PURE__ */ jsx28("nav", { className: "ui-nav ui-react-app__bottom", "aria-label": "Sections on mobile", children: /* @__PURE__ */ jsxs23("ul", { className: "ui-nav__list", children: [
2492
2582
  links(visible),
2493
- remaining.length > 0 && /* @__PURE__ */ jsx26("li", { children: /* @__PURE__ */ jsxs22(
2583
+ remaining.length > 0 && /* @__PURE__ */ jsx28("li", { children: /* @__PURE__ */ jsxs23(
2494
2584
  "button",
2495
2585
  {
2496
2586
  type: "button",
@@ -2499,20 +2589,20 @@ function AppShell({
2499
2589
  "aria-expanded": more,
2500
2590
  onClick: () => setMore(true),
2501
2591
  children: [
2502
- /* @__PURE__ */ jsx26("span", { className: "ui-nav__ic", children: /* @__PURE__ */ jsx26(Icon, { name: "moreHorizontal" }) }),
2503
- /* @__PURE__ */ jsx26("span", { className: "ui-nav__label", children: "More" })
2592
+ /* @__PURE__ */ jsx28("span", { className: "ui-nav__ic", children: /* @__PURE__ */ jsx28(Icon, { name: "moreHorizontal" }) }),
2593
+ /* @__PURE__ */ jsx28("span", { className: "ui-nav__label", children: "More" })
2504
2594
  ]
2505
2595
  }
2506
2596
  ) })
2507
2597
  ] }) }),
2508
- /* @__PURE__ */ jsx26(Drawer, { open: more, onClose: () => setMore(false), title: "More sections", side: "bottom", children: /* @__PURE__ */ jsx26("nav", { className: "ui-nav ui-nav--side", "aria-label": "More sections", children: /* @__PURE__ */ jsx26("ul", { className: "ui-nav__list", children: links(remaining) }) }) }),
2509
- /* @__PURE__ */ jsx26(CommandPalette, { ...palette ?? { groups: [{ items: sections.map((section) => ({ id: section.href, ...section })) }] }, open: search, onClose: () => setSearch(false) })
2598
+ /* @__PURE__ */ jsx28(Drawer, { open: more, onClose: () => setMore(false), title: "More sections", side: "bottom", children: /* @__PURE__ */ jsx28("nav", { className: "ui-nav ui-nav--side", "aria-label": "More sections", children: /* @__PURE__ */ jsx28("ul", { className: "ui-nav__list", children: links(remaining) }) }) }),
2599
+ /* @__PURE__ */ jsx28(CommandPalette, { ...palette ?? { groups: [{ items: sections.map((section) => ({ id: section.href, ...section })) }] }, open: search, onClose: () => setSearch(false) })
2510
2600
  ] });
2511
2601
  }
2512
2602
 
2513
2603
  // src/EmptyState.tsx
2514
2604
  import { icon as kitIcon2, illo } from "@apliteni/apliteni-ui";
2515
- import { jsx as jsx27, jsxs as jsxs23 } from "react/jsx-runtime";
2605
+ import { jsx as jsx29, jsxs as jsxs24 } from "react/jsx-runtime";
2516
2606
  var cases = {
2517
2607
  "first-run": { title: "Nothing needs you yet", sub: "New items will appear here when they need your attention.", icon: "check" },
2518
2608
  "no-matches": { title: "No results in this view", sub: "Try another search or clear your filters.", icon: "search" },
@@ -2524,18 +2614,18 @@ function EmptyState({ variant = "first-run", title, sub, icon: icon6, art, actio
2524
2614
  const heading = title ?? preset.title;
2525
2615
  const guidance = sub ?? preset.sub;
2526
2616
  const glyph = icon6 ?? preset.icon;
2527
- return /* @__PURE__ */ jsxs23("div", { className: "ui-empty", children: [
2528
- art ? typeof art === "string" ? /* @__PURE__ */ jsx27("div", { className: "ui-empty__art", dangerouslySetInnerHTML: { __html: /<svg/.test(art) ? art : illo(art) } }) : /* @__PURE__ */ jsx27("div", { className: "ui-empty__art", "aria-hidden": "true", children: art }) : glyph ? /* @__PURE__ */ jsx27("div", { className: "ui-empty__icon", dangerouslySetInnerHTML: { __html: kitIcon2(glyph) } }) : null,
2529
- heading && /* @__PURE__ */ jsx27("div", { className: "ui-empty__title", children: heading }),
2530
- guidance && /* @__PURE__ */ jsx27("div", { className: "ui-empty__sub", children: guidance }),
2531
- actions && /* @__PURE__ */ jsx27("div", { className: "ui-empty__actions", children: actions })
2617
+ return /* @__PURE__ */ jsxs24("div", { className: "ui-empty", children: [
2618
+ art ? typeof art === "string" ? /* @__PURE__ */ jsx29("div", { className: "ui-empty__art", dangerouslySetInnerHTML: { __html: /<svg/.test(art) ? art : illo(art) } }) : /* @__PURE__ */ jsx29("div", { className: "ui-empty__art", "aria-hidden": "true", children: art }) : glyph ? /* @__PURE__ */ jsx29("div", { className: "ui-empty__icon", dangerouslySetInnerHTML: { __html: kitIcon2(glyph) } }) : null,
2619
+ heading && /* @__PURE__ */ jsx29("div", { className: "ui-empty__title", children: heading }),
2620
+ guidance && /* @__PURE__ */ jsx29("div", { className: "ui-empty__sub", children: guidance }),
2621
+ actions && /* @__PURE__ */ jsx29("div", { className: "ui-empty__actions", children: actions })
2532
2622
  ] });
2533
2623
  }
2534
2624
 
2535
2625
  // src/ThemeToggle.tsx
2536
2626
  import { useSyncExternalStore } from "react";
2537
2627
  import { icon as icon5 } from "@apliteni/apliteni-ui";
2538
- import { jsx as jsx28, jsxs as jsxs24 } from "react/jsx-runtime";
2628
+ import { jsx as jsx30, jsxs as jsxs25 } from "react/jsx-runtime";
2539
2629
  var STORAGE_KEY = "apliteni-strategy-theme";
2540
2630
  var CHOICE_EVENT = "apliteni-theme-choice";
2541
2631
  var THEME_INIT_SCRIPT = `(()=>{let t;try{t=localStorage.getItem('apliteni-strategy-theme')}catch{}document.documentElement.setAttribute('data-theme',t==='dark'||t==='light'?t:window.matchMedia?.('(prefers-color-scheme: light)').matches?'light':'dark')})()`;
@@ -2593,10 +2683,10 @@ function ThemeToggle({ labelled = false }) {
2593
2683
  }
2594
2684
  window.dispatchEvent(new Event(CHOICE_EVENT));
2595
2685
  };
2596
- const button = /* @__PURE__ */ jsx28("button", { type: "button", className: "toggle", "aria-label": name, title: name, onClick: toggle, children: /* @__PURE__ */ jsx28("span", { className: "ic", "aria-hidden": "true", dangerouslySetInnerHTML: { __html: icon5(theme === "auto" ? "monitor" : theme === "light" ? "sun" : "moon") } }) });
2597
- return labelled ? /* @__PURE__ */ jsxs24("span", { className: "ui-theme-toggle", children: [
2686
+ const button = /* @__PURE__ */ jsx30("button", { type: "button", className: "toggle", "aria-label": name, title: name, onClick: toggle, children: /* @__PURE__ */ jsx30("span", { className: "ic", "aria-hidden": "true", dangerouslySetInnerHTML: { __html: icon5(theme === "auto" ? "monitor" : theme === "light" ? "sun" : "moon") } }) });
2687
+ return labelled ? /* @__PURE__ */ jsxs25("span", { className: "ui-theme-toggle", children: [
2598
2688
  button,
2599
- /* @__PURE__ */ jsxs24("span", { children: [
2689
+ /* @__PURE__ */ jsxs25("span", { children: [
2600
2690
  label,
2601
2691
  " theme"
2602
2692
  ] })
@@ -2632,6 +2722,7 @@ export {
2632
2722
  NumericValue,
2633
2723
  PAGE_SIZES,
2634
2724
  Pagination,
2725
+ Pill,
2635
2726
  RowIdentity,
2636
2727
  Segmented,
2637
2728
  SelectField,
@@ -2639,6 +2730,7 @@ export {
2639
2730
  SkeletonTable,
2640
2731
  Snippet,
2641
2732
  StatBand,
2733
+ StatusDot,
2642
2734
  THEME_INIT_SCRIPT,
2643
2735
  Tabs,
2644
2736
  TextArea,