@apliteni/apliteni-ui 0.48.0 → 0.49.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@apliteni/apliteni-ui",
3
- "version": "0.48.0",
3
+ "version": "0.49.0",
4
4
  "workspaces": [
5
5
  "react"
6
6
  ],
package/react/README.md CHANGED
@@ -28,7 +28,7 @@ import '@apliteni/apliteni-ui/react/css'; // React components' shell styles (mo
28
28
  import { DataTable, Modal, Button } from '@apliteni/apliteni-ui/react';
29
29
  ```
30
30
 
31
- Components: `DataTable`, `Pagination`, `StatBand`, `Modal`, `Confirm`, `Drawer`, `CommandPalette`, `Dropdown`, `BackLink`, `Snippet`, `Tabs`, `Button`, `Badge`, `Card`, `Icon`.
31
+ Components: `DataTable`, `Pagination`, `StatBand`, `Modal`, `Confirm`, `Drawer`, `CommandPalette`, `Dropdown`, `BackLink`, `Snippet`, `Tabs`, `Button`, `Badge`, `Card`, `Callout`, `Icon`.
32
32
 
33
33
  `Snippet` accepts `label`, `code`, `reveal`, and `copyLabel` props. It treats `code`
34
34
  as plain text and copies it exactly as provided. After a successful clipboard write,
@@ -42,6 +42,15 @@ can try again or select the text manually.
42
42
  Before a reveal snippet, explain that the secret is stored hashed and will not be
43
43
  shown again, and ask the reader to copy it now. The page decides when to remove it.
44
44
 
45
+ `Callout` accepts `children`, optional `actions`, and an `icon` override. `neutral` is the default.
46
+ The other variants are `info`, `success`, `warn`, and `danger`. Only `danger` uses `role="alert"`.
47
+
48
+ ```tsx
49
+ <Callout variant="warn" actions={<Button size="sm">Review period</Button>}>
50
+ <b>Incomplete.</b> This period is still open.
51
+ </Callout>
52
+ ```
53
+
45
54
  `Button` accepts `size="xs" | "sm" | "md" | "lg"` (default `md`). Use `xs`
46
55
  for a small inline control: `<Button size="xs" variant="ghost" icon="copy" iconOnly>Copy</Button>`.
47
56
  Its glyph is 13px and its icon-only target is 24×24px; labelled xs buttons use
@@ -41,6 +41,15 @@ declare function Card({ title, sub, level, children }: {
41
41
  children?: ReactNode;
42
42
  }): react.JSX.Element;
43
43
 
44
+ type CalloutVariant = 'neutral' | 'info' | 'success' | 'warn' | 'danger';
45
+ interface CalloutProps {
46
+ variant?: CalloutVariant;
47
+ icon?: string;
48
+ children: ReactNode;
49
+ actions?: ReactNode;
50
+ }
51
+ declare function Callout({ variant, icon, children, actions }: CalloutProps): react.JSX.Element;
52
+
44
53
  type StatTone = 'good' | 'bad' | 'neutral';
45
54
  type StatVariant = 'band' | 'tiles' | 'open';
46
55
  interface StatDelta {
@@ -544,4 +553,4 @@ declare function Toast({ children }: ToastProps): react.JSX.Element;
544
553
  declare const PAGE_SIZES: readonly number[];
545
554
  declare const DEFAULT_PAGE_SIZE: number;
546
555
 
547
- export { BackLink, type BackLinkOwnProps, type BackLinkProps, Badge, BusyRegion, type BusyRegionProps, Button, type ButtonProps, Card, type Column, type CommandGroup, type CommandItem, CommandPalette, type CommandPaletteProps, Confirm, type ConfirmProps, DEFAULT_PAGE_SIZE, DataTable, type DataTableProps, DeltaValue, type DeltaValueProps, Denied, type DeniedProps, Drawer, type DrawerProps, DrawerSection, type DrawerSectionProps, Dropdown, type DropdownBadge, type DropdownEntry, type DropdownItem, type DropdownProps, type DropdownRowProps, type DropdownSearch, type DropdownSection, type DropdownSeparator, FileField, type FileFieldProps, type Filter, FilterBar, type FilterBarProps, Icon, KeyValueList, type KeyValueListProps, type KeyValueRow, Modal, type ModalProps, NumericValue, type NumericValueProps, PAGE_SIZES, Pagination, type PaginationProps, RowIdentity, type RowIdentityProps, type SegmentOption, Segmented, type SegmentedProps, SelectField, type SelectFieldProps, Skeleton, type SkeletonProps, SkeletonTable, type SkeletonTableProps, Snippet, type SnippetProps, StatBand, type StatBandProps, type StatDelta, type StatFigure, type StatTone, type StatVariant, type TabItem, type TableSort, Tabs, type TabsProps, TextArea, type TextAreaProps, TextField, type TextFieldProps, Timeline, type TimelineEvent, type TimelineProps, Toast, type ToastNotice, type ToastProps, sortTableRows, useToast };
556
+ export { BackLink, type BackLinkOwnProps, type BackLinkProps, Badge, BusyRegion, type BusyRegionProps, Button, type ButtonProps, Callout, type CalloutProps, type CalloutVariant, Card, type Column, type CommandGroup, type CommandItem, CommandPalette, type CommandPaletteProps, Confirm, type ConfirmProps, DEFAULT_PAGE_SIZE, DataTable, type DataTableProps, DeltaValue, type DeltaValueProps, Denied, type DeniedProps, Drawer, type DrawerProps, DrawerSection, type DrawerSectionProps, Dropdown, type DropdownBadge, type DropdownEntry, type DropdownItem, type DropdownProps, type DropdownRowProps, type DropdownSearch, type DropdownSection, type DropdownSeparator, FileField, type FileFieldProps, type Filter, FilterBar, type FilterBarProps, Icon, KeyValueList, type KeyValueListProps, type KeyValueRow, Modal, type ModalProps, NumericValue, type NumericValueProps, PAGE_SIZES, Pagination, type PaginationProps, RowIdentity, type RowIdentityProps, type SegmentOption, Segmented, type SegmentedProps, SelectField, type SelectFieldProps, Skeleton, type SkeletonProps, SkeletonTable, type SkeletonTableProps, Snippet, type SnippetProps, StatBand, type StatBandProps, type StatDelta, type StatFigure, type StatTone, type StatVariant, type TabItem, type TableSort, Tabs, type TabsProps, TextArea, type TextAreaProps, TextField, type TextFieldProps, Timeline, type TimelineEvent, type TimelineProps, Toast, type ToastNotice, type ToastProps, sortTableRows, useToast };
@@ -174,9 +174,22 @@ function Card({ title, sub, level = 2, children }) {
174
174
  ] });
175
175
  }
176
176
 
177
+ // src/primitives/Callout.tsx
178
+ import { calloutIcons, icon as kitIcon } from "@apliteni/apliteni-ui";
179
+ import { jsx as jsx5, jsxs as jsxs3 } from "react/jsx-runtime";
180
+ function Callout({ variant, icon: icon5 = calloutIcons[variant ?? "neutral"], children, actions }) {
181
+ return /* @__PURE__ */ jsxs3("div", { className: `ui-callout${variant && variant !== "neutral" ? ` ui-callout--${variant}` : ""}`, role: variant === "danger" ? "alert" : void 0, children: [
182
+ /* @__PURE__ */ jsx5("span", { className: "ui-callout__icon", dangerouslySetInnerHTML: { __html: kitIcon(icon5) } }),
183
+ /* @__PURE__ */ jsxs3("div", { className: "ui-callout__body", children: [
184
+ children,
185
+ actions != null && /* @__PURE__ */ jsx5("div", { className: "ui-toolbar ui-callout__actions", children: actions })
186
+ ] })
187
+ ] });
188
+ }
189
+
177
190
  // src/primitives/StatBand.tsx
178
191
  import { useId } from "react";
179
- import { Fragment, jsx as jsx5, jsxs as jsxs3 } from "react/jsx-runtime";
192
+ import { Fragment, jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
180
193
  var GLYPH = { up: "arrowUp", down: "arrowDown", flat: "minus" };
181
194
  var directionOf = (text2) => {
182
195
  const t = text2.trim();
@@ -185,15 +198,15 @@ var directionOf = (text2) => {
185
198
  var hasChange = (d) => !!d && d.value != null && d.value !== "";
186
199
  function Delta({ delta, basisId }) {
187
200
  if (!hasChange(delta)) {
188
- return /* @__PURE__ */ jsx5("dd", { className: "ui-stat__delta ui-stat__delta--none", children: delta.none || "No earlier figure" });
201
+ return /* @__PURE__ */ jsx6("dd", { className: "ui-stat__delta ui-stat__delta--none", children: delta.none || "No earlier figure" });
189
202
  }
190
203
  const dir = delta.direction && GLYPH[delta.direction] ? delta.direction : directionOf(delta.value);
191
- return /* @__PURE__ */ jsxs3("dd", { className: "ui-stat__delta", "aria-describedby": !delta.basis && basisId ? basisId : void 0, children: [
192
- /* @__PURE__ */ jsx5(Icon, { name: GLYPH[dir] }),
193
- /* @__PURE__ */ jsx5("span", { className: "ui-stat__change", children: delta.value }),
194
- delta.basis ? /* @__PURE__ */ jsxs3(Fragment, { children: [
204
+ return /* @__PURE__ */ jsxs4("dd", { className: "ui-stat__delta", "aria-describedby": !delta.basis && basisId ? basisId : void 0, children: [
205
+ /* @__PURE__ */ jsx6(Icon, { name: GLYPH[dir] }),
206
+ /* @__PURE__ */ jsx6("span", { className: "ui-stat__change", children: delta.value }),
207
+ delta.basis ? /* @__PURE__ */ jsxs4(Fragment, { children: [
195
208
  " ",
196
- /* @__PURE__ */ jsx5("span", { className: "ui-stat__basis", children: delta.basis })
209
+ /* @__PURE__ */ jsx6("span", { className: "ui-stat__basis", children: delta.basis })
197
210
  ] }) : null
198
211
  ] });
199
212
  }
@@ -202,16 +215,16 @@ function StatBand({ stats, variant = "tiles", basis, label, id }) {
202
215
  const v = ["band", "tiles", "open"].includes(variant) ? variant : "tiles";
203
216
  const basisId = basis ? `${id || auto}-basis` : void 0;
204
217
  const root = ["ui-stats", `ui-stats--${v}`, v === "band" && "ui-card"].filter(Boolean).join(" ");
205
- return /* @__PURE__ */ jsxs3("div", { className: root, role: label ? "group" : void 0, "aria-label": label || void 0, children: [
206
- basis ? /* @__PURE__ */ jsx5("p", { className: "ui-stats__basis", id: basisId, children: basis }) : null,
207
- /* @__PURE__ */ jsx5("dl", { className: "ui-stats__list", children: stats.map((s, i) => {
218
+ return /* @__PURE__ */ jsxs4("div", { className: root, role: label ? "group" : void 0, "aria-label": label || void 0, children: [
219
+ basis ? /* @__PURE__ */ jsx6("p", { className: "ui-stats__basis", id: basisId, children: basis }) : null,
220
+ /* @__PURE__ */ jsx6("dl", { className: "ui-stats__list", children: stats.map((s, i) => {
208
221
  const tone = hasChange(s.delta) && (s.delta.tone === "good" || s.delta.tone === "bad") ? s.delta.tone : "";
209
222
  const cls = ["ui-stat", tone && `ui-stat--${tone}`, v === "tiles" && "ui-card ui-card--pad-sm"].filter(Boolean).join(" ");
210
- return /* @__PURE__ */ jsxs3("div", { className: cls, children: [
211
- /* @__PURE__ */ jsx5("dt", { className: "ui-stat__label", children: s.label }),
212
- /* @__PURE__ */ jsx5("dd", { className: "ui-stat__value", children: s.value }),
213
- s.delta ? /* @__PURE__ */ jsx5(Delta, { delta: s.delta, basisId }) : null,
214
- s.trend ? /* @__PURE__ */ jsx5("dd", { className: "ui-stat__trend", children: s.trend }) : null
223
+ return /* @__PURE__ */ jsxs4("div", { className: cls, children: [
224
+ /* @__PURE__ */ jsx6("dt", { className: "ui-stat__label", children: s.label }),
225
+ /* @__PURE__ */ jsx6("dd", { className: "ui-stat__value", children: s.value }),
226
+ s.delta ? /* @__PURE__ */ jsx6(Delta, { delta: s.delta, basisId }) : null,
227
+ s.trend ? /* @__PURE__ */ jsx6("dd", { className: "ui-stat__trend", children: s.trend }) : null
215
228
  ] }, `${s.label}-${i}`);
216
229
  }) })
217
230
  ] });
@@ -435,7 +448,7 @@ function useDialog(active, { root, panel, body, initialFocus }, onClose) {
435
448
  }
436
449
 
437
450
  // src/Modal.tsx
438
- import { jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
451
+ import { jsx as jsx7, jsxs as jsxs5 } from "react/jsx-runtime";
439
452
  function Modal({ open, title, onClose, footer, children, initialFocusRef, role = "dialog" }) {
440
453
  const id = useId2();
441
454
  const titleId = `${id}-title`;
@@ -447,7 +460,7 @@ function Modal({ open, title, onClose, footer, children, initialFocusRef, role =
447
460
  const scope = useDialog(shown, { root, panel, body, initialFocus: initialFocusRef }, onClose);
448
461
  if (!mounted) return null;
449
462
  return createPortal(
450
- /* @__PURE__ */ jsx6(DialogScope.Provider, { value: scope, children: /* @__PURE__ */ jsx6("div", { className: shown ? "rx-scrim is-open" : "rx-scrim", ref: root, onMouseDown: dismissOnScrim(onClose), children: /* @__PURE__ */ jsxs4(
463
+ /* @__PURE__ */ jsx7(DialogScope.Provider, { value: scope, children: /* @__PURE__ */ jsx7("div", { className: shown ? "rx-scrim is-open" : "rx-scrim", ref: root, onMouseDown: dismissOnScrim(onClose), children: /* @__PURE__ */ jsxs5(
451
464
  "div",
452
465
  {
453
466
  className: "rx-modal",
@@ -458,12 +471,12 @@ function Modal({ open, title, onClose, footer, children, initialFocusRef, role =
458
471
  tabIndex: -1,
459
472
  ref: panel,
460
473
  children: [
461
- /* @__PURE__ */ jsxs4("div", { className: "rx-modal__head", children: [
462
- /* @__PURE__ */ jsx6("div", { className: "rx-modal__title", id: titleId, children: title }),
463
- /* @__PURE__ */ jsx6(Button, { variant: "ghost", size: "sm", iconOnly: true, icon: "x", "aria-label": "Close", onClick: onClose })
474
+ /* @__PURE__ */ jsxs5("div", { className: "rx-modal__head", children: [
475
+ /* @__PURE__ */ jsx7("div", { className: "rx-modal__title", id: titleId, children: title }),
476
+ /* @__PURE__ */ jsx7(Button, { variant: "ghost", size: "sm", iconOnly: true, icon: "x", "aria-label": "Close", onClick: onClose })
464
477
  ] }),
465
- /* @__PURE__ */ jsx6("div", { className: "rx-modal__body", id: bodyId, ref: body, children }),
466
- footer && /* @__PURE__ */ jsx6("div", { className: "rx-modal__foot", children: footer })
478
+ /* @__PURE__ */ jsx7("div", { className: "rx-modal__body", id: bodyId, ref: body, children }),
479
+ footer && /* @__PURE__ */ jsx7("div", { className: "rx-modal__foot", children: footer })
467
480
  ]
468
481
  }
469
482
  ) }) }),
@@ -472,7 +485,7 @@ function Modal({ open, title, onClose, footer, children, initialFocusRef, role =
472
485
  }
473
486
 
474
487
  // src/Confirm.tsx
475
- import { Fragment as Fragment2, jsx as jsx7, jsxs as jsxs5 } from "react/jsx-runtime";
488
+ import { Fragment as Fragment2, jsx as jsx8, jsxs as jsxs6 } from "react/jsx-runtime";
476
489
  function Confirm({
477
490
  open,
478
491
  title,
@@ -485,7 +498,7 @@ function Confirm({
485
498
  onCancel
486
499
  }) {
487
500
  const safeAction = useRef4(null);
488
- return /* @__PURE__ */ jsx7(
501
+ return /* @__PURE__ */ jsx8(
489
502
  Modal,
490
503
  {
491
504
  open,
@@ -493,9 +506,9 @@ function Confirm({
493
506
  onClose: onCancel,
494
507
  role: "alertdialog",
495
508
  initialFocusRef: safeAction,
496
- footer: /* @__PURE__ */ jsxs5(Fragment2, { children: [
497
- /* @__PURE__ */ jsx7(Button, { ref: safeAction, variant: "ghost", onClick: onCancel, children: cancelLabel }),
498
- /* @__PURE__ */ jsx7(Button, { variant: danger ? "danger" : "primary", busy, onClick: onConfirm, children: confirmLabel })
509
+ footer: /* @__PURE__ */ jsxs6(Fragment2, { children: [
510
+ /* @__PURE__ */ jsx8(Button, { ref: safeAction, variant: "ghost", onClick: onCancel, children: cancelLabel }),
511
+ /* @__PURE__ */ jsx8(Button, { variant: danger ? "danger" : "primary", busy, onClick: onConfirm, children: confirmLabel })
499
512
  ] }),
500
513
  children: body
501
514
  }
@@ -505,7 +518,7 @@ function Confirm({
505
518
  // src/Drawer.tsx
506
519
  import { useId as useId3, useRef as useRef5 } from "react";
507
520
  import { createPortal as createPortal2 } from "react-dom";
508
- import { jsx as jsx8, jsxs as jsxs6 } from "react/jsx-runtime";
521
+ import { jsx as jsx9, jsxs as jsxs7 } from "react/jsx-runtime";
509
522
  function Drawer({
510
523
  open,
511
524
  title,
@@ -525,9 +538,9 @@ function Drawer({
525
538
  if (!mounted) return null;
526
539
  const cls = ["ui-drawer", `ui-drawer--${side}`, `ui-drawer--${size}`, shown && "is-open"].filter(Boolean).join(" ");
527
540
  return createPortal2(
528
- /* @__PURE__ */ jsx8(DialogScope.Provider, { value: scope, children: /* @__PURE__ */ jsxs6("div", { className: cls, ref: root, children: [
529
- /* @__PURE__ */ jsx8("div", { className: "ui-drawer__scrim", onMouseDown: dismissOnScrim(onClose) }),
530
- /* @__PURE__ */ jsxs6(
541
+ /* @__PURE__ */ jsx9(DialogScope.Provider, { value: scope, children: /* @__PURE__ */ jsxs7("div", { className: cls, ref: root, children: [
542
+ /* @__PURE__ */ jsx9("div", { className: "ui-drawer__scrim", onMouseDown: dismissOnScrim(onClose) }),
543
+ /* @__PURE__ */ jsxs7(
531
544
  "aside",
532
545
  {
533
546
  className: "ui-drawer__panel",
@@ -537,12 +550,12 @@ function Drawer({
537
550
  tabIndex: -1,
538
551
  ref: panel,
539
552
  children: [
540
- /* @__PURE__ */ jsxs6("header", { className: "ui-drawer__header", children: [
541
- /* @__PURE__ */ jsx8("h2", { className: "ui-drawer__title", id: titleId, children: title }),
542
- /* @__PURE__ */ jsx8("button", { type: "button", className: "ui-drawer__close", "aria-label": closeLabel, onClick: onClose, children: /* @__PURE__ */ jsx8(Icon, { name: "x" }) })
553
+ /* @__PURE__ */ jsxs7("header", { className: "ui-drawer__header", children: [
554
+ /* @__PURE__ */ jsx9("h2", { className: "ui-drawer__title", id: titleId, children: title }),
555
+ /* @__PURE__ */ jsx9("button", { type: "button", className: "ui-drawer__close", "aria-label": closeLabel, onClick: onClose, children: /* @__PURE__ */ jsx9(Icon, { name: "x" }) })
543
556
  ] }),
544
- /* @__PURE__ */ jsx8("div", { className: "ui-drawer__body", ref: body, children }),
545
- footer && /* @__PURE__ */ jsx8("footer", { className: "ui-drawer__footer", children: footer })
557
+ /* @__PURE__ */ jsx9("div", { className: "ui-drawer__body", ref: body, children }),
558
+ footer && /* @__PURE__ */ jsx9("footer", { className: "ui-drawer__footer", children: footer })
546
559
  ]
547
560
  }
548
561
  )
@@ -555,9 +568,9 @@ function Drawer({
555
568
  import { useCallback, useEffect as useEffect2, useId as useId4, useMemo, useRef as useRef6, useState as useState2 } from "react";
556
569
  import { createPortal as createPortal3 } from "react-dom";
557
570
  import { rankGroups, icon as icon2 } from "@apliteni/apliteni-ui";
558
- import { jsx as jsx9, jsxs as jsxs7 } from "react/jsx-runtime";
571
+ import { jsx as jsx10, jsxs as jsxs8 } from "react/jsx-runtime";
559
572
  var cx2 = (...a) => a.filter(Boolean).join(" ");
560
- var Glyph = ({ name, className }) => /* @__PURE__ */ jsx9("span", { className, "aria-hidden": "true", dangerouslySetInnerHTML: { __html: icon2(name) } });
573
+ var Glyph = ({ name, className }) => /* @__PURE__ */ jsx10("span", { className, "aria-hidden": "true", dangerouslySetInnerHTML: { __html: icon2(name) } });
561
574
  var keysOf = (shortcut) => shortcut == null ? [] : Array.isArray(shortcut) ? shortcut : [shortcut];
562
575
  function CommandPalette({
563
576
  open,
@@ -622,9 +635,9 @@ function CommandPalette({
622
635
  const listId = `${uid}-list`;
623
636
  let n = 0;
624
637
  return createPortal3(
625
- /* @__PURE__ */ jsx9(DialogScope.Provider, { value: scope, children: /* @__PURE__ */ jsxs7("div", { className: cx2("ui-cmdk", density === "roomy" && "ui-cmdk--roomy", "is-open"), ref: root, children: [
626
- /* @__PURE__ */ jsx9("div", { className: "ui-cmdk__scrim", onMouseDown: dismissOnScrim(onClose) }),
627
- /* @__PURE__ */ jsxs7(
638
+ /* @__PURE__ */ jsx10(DialogScope.Provider, { value: scope, children: /* @__PURE__ */ jsxs8("div", { className: cx2("ui-cmdk", density === "roomy" && "ui-cmdk--roomy", "is-open"), ref: root, children: [
639
+ /* @__PURE__ */ jsx10("div", { className: "ui-cmdk__scrim", onMouseDown: dismissOnScrim(onClose) }),
640
+ /* @__PURE__ */ jsxs8(
628
641
  "div",
629
642
  {
630
643
  className: "ui-cmdk__panel",
@@ -635,9 +648,9 @@ function CommandPalette({
635
648
  ref: panel,
636
649
  onKeyDown,
637
650
  children: [
638
- /* @__PURE__ */ jsxs7("div", { className: "ui-cmdk__search", ref: search, children: [
639
- /* @__PURE__ */ jsx9(Glyph, { name: "search", className: "ui-cmdk__search-ic" }),
640
- /* @__PURE__ */ jsx9(
651
+ /* @__PURE__ */ jsxs8("div", { className: "ui-cmdk__search", ref: search, children: [
652
+ /* @__PURE__ */ jsx10(Glyph, { name: "search", className: "ui-cmdk__search-ic" }),
653
+ /* @__PURE__ */ jsx10(
641
654
  "input",
642
655
  {
643
656
  className: "ui-cmdk__input",
@@ -659,19 +672,19 @@ function CommandPalette({
659
672
  }
660
673
  )
661
674
  ] }),
662
- /* @__PURE__ */ jsx9("div", { className: "ui-cmdk__list", id: listId, role: "listbox", "aria-label": `${label} results`, children: shown.map((group, gi) => /* @__PURE__ */ jsxs7(
675
+ /* @__PURE__ */ jsx10("div", { className: "ui-cmdk__list", id: listId, role: "listbox", "aria-label": `${label} results`, children: shown.map((group, gi) => /* @__PURE__ */ jsxs8(
663
676
  "div",
664
677
  {
665
678
  className: "ui-cmdk__group",
666
679
  role: "group",
667
680
  "aria-labelledby": group.label ? `${uid}-g${gi}` : void 0,
668
681
  children: [
669
- group.label && /* @__PURE__ */ jsx9("div", { className: "ui-cmdk__group-head", id: `${uid}-g${gi}`, children: group.label }),
682
+ group.label && /* @__PURE__ */ jsx10("div", { className: "ui-cmdk__group-head", id: `${uid}-g${gi}`, children: group.label }),
670
683
  group.items.map((item) => {
671
684
  const disabled = isDisabled(item);
672
685
  const id = `${uid}-o${n++}`;
673
686
  const on = item === active;
674
- return /* @__PURE__ */ jsxs7(
687
+ return /* @__PURE__ */ jsxs8(
675
688
  "div",
676
689
  {
677
690
  id,
@@ -691,13 +704,13 @@ function CommandPalette({
691
704
  },
692
705
  onClick: (e) => run(item, e.metaKey || e.ctrlKey),
693
706
  children: [
694
- item.icon && /* @__PURE__ */ jsx9(Glyph, { name: item.icon, className: "ui-cmdk__ic" }),
695
- /* @__PURE__ */ jsxs7("span", { className: "ui-cmdk__main", children: [
696
- /* @__PURE__ */ jsx9("span", { className: "ui-cmdk__label", children: item.label }),
697
- item.description && /* @__PURE__ */ jsx9("span", { className: "ui-cmdk__desc", children: item.description })
707
+ item.icon && /* @__PURE__ */ jsx10(Glyph, { name: item.icon, className: "ui-cmdk__ic" }),
708
+ /* @__PURE__ */ jsxs8("span", { className: "ui-cmdk__main", children: [
709
+ /* @__PURE__ */ jsx10("span", { className: "ui-cmdk__label", children: item.label }),
710
+ item.description && /* @__PURE__ */ jsx10("span", { className: "ui-cmdk__desc", children: item.description })
698
711
  ] }),
699
- item.badge && /* @__PURE__ */ jsx9("span", { className: "ui-cmdk__badge", children: item.badge }),
700
- keysOf(item.shortcut).length > 0 && /* @__PURE__ */ jsx9("span", { className: "ui-cmdk__keys", "aria-hidden": "true", children: keysOf(item.shortcut).map((k) => /* @__PURE__ */ jsx9("kbd", { className: "ui-cmdk__key", children: k }, k)) })
712
+ item.badge && /* @__PURE__ */ jsx10("span", { className: "ui-cmdk__badge", children: item.badge }),
713
+ keysOf(item.shortcut).length > 0 && /* @__PURE__ */ jsx10("span", { className: "ui-cmdk__keys", "aria-hidden": "true", children: keysOf(item.shortcut).map((k) => /* @__PURE__ */ jsx10("kbd", { className: "ui-cmdk__key", children: k }, k)) })
701
714
  ]
702
715
  },
703
716
  item.id
@@ -707,20 +720,20 @@ function CommandPalette({
707
720
  },
708
721
  group.label ?? `g${gi}`
709
722
  )) }),
710
- /* @__PURE__ */ jsx9("p", { className: "ui-cmdk__empty", hidden: countOf(shown) > 0, children: empty }),
711
- /* @__PURE__ */ jsx9("p", { className: "ui-sr", role: "status", "aria-live": "polite", children: countOf(shown) === 0 ? "No results" : `${countOf(shown)} result${countOf(shown) === 1 ? "" : "s"}` }),
712
- hint && /* @__PURE__ */ jsxs7("div", { className: "ui-cmdk__foot", "aria-hidden": "true", children: [
713
- /* @__PURE__ */ jsxs7("span", { children: [
714
- /* @__PURE__ */ jsx9("kbd", { className: "ui-cmdk__key", children: "\u2191" }),
715
- /* @__PURE__ */ jsx9("kbd", { className: "ui-cmdk__key", children: "\u2193" }),
723
+ /* @__PURE__ */ jsx10("p", { className: "ui-cmdk__empty", hidden: countOf(shown) > 0, children: empty }),
724
+ /* @__PURE__ */ jsx10("p", { className: "ui-sr", role: "status", "aria-live": "polite", children: countOf(shown) === 0 ? "No results" : `${countOf(shown)} result${countOf(shown) === 1 ? "" : "s"}` }),
725
+ hint && /* @__PURE__ */ jsxs8("div", { className: "ui-cmdk__foot", "aria-hidden": "true", children: [
726
+ /* @__PURE__ */ jsxs8("span", { children: [
727
+ /* @__PURE__ */ jsx10("kbd", { className: "ui-cmdk__key", children: "\u2191" }),
728
+ /* @__PURE__ */ jsx10("kbd", { className: "ui-cmdk__key", children: "\u2193" }),
716
729
  " move"
717
730
  ] }),
718
- /* @__PURE__ */ jsxs7("span", { children: [
719
- /* @__PURE__ */ jsx9("kbd", { className: "ui-cmdk__key", children: "\u21B5" }),
731
+ /* @__PURE__ */ jsxs8("span", { children: [
732
+ /* @__PURE__ */ jsx10("kbd", { className: "ui-cmdk__key", children: "\u21B5" }),
720
733
  " run"
721
734
  ] }),
722
- /* @__PURE__ */ jsxs7("span", { children: [
723
- /* @__PURE__ */ jsx9("kbd", { className: "ui-cmdk__key", children: "esc" }),
735
+ /* @__PURE__ */ jsxs8("span", { children: [
736
+ /* @__PURE__ */ jsx10("kbd", { className: "ui-cmdk__key", children: "esc" }),
724
737
  " close"
725
738
  ] })
726
739
  ] })
@@ -751,7 +764,7 @@ import { DEFAULT_PAGE_SIZE as DEFAULT_PAGE_SIZE2 } from "@apliteni/apliteni-ui";
751
764
  // src/Pagination.tsx
752
765
  import { useEffect as useEffect3, useId as useId5, useRef as useRef7, useState as useState3 } from "react";
753
766
  import { DEFAULT_PAGE_SIZE } from "@apliteni/apliteni-ui";
754
- import { jsx as jsx10, jsxs as jsxs8 } from "react/jsx-runtime";
767
+ import { jsx as jsx11, jsxs as jsxs9 } from "react/jsx-runtime";
755
768
  var GHOST_SM = "ui-btn ui-btn--ghost ui-btn--sm";
756
769
  var VARIANTS = ["steps", "numbered", "jump"];
757
770
  var cx3 = (...a) => a.filter(Boolean).join(" ");
@@ -843,7 +856,7 @@ function Pagination({
843
856
  const step = (label_, target, disabled) => (
844
857
  // A control at an end is disabled and stays where it is: removing it slides
845
858
  // the next control under a pointer already travelling toward it.
846
- /* @__PURE__ */ jsx10(
859
+ /* @__PURE__ */ jsx11(
847
860
  "button",
848
861
  {
849
862
  type: "button",
@@ -882,14 +895,14 @@ function Pagination({
882
895
  if (single) {
883
896
  steps = null;
884
897
  } else if (!counted) {
885
- steps = /* @__PURE__ */ jsxs8("div", { className: "ui-pager__steps", children: [
898
+ steps = /* @__PURE__ */ jsxs9("div", { className: "ui-pager__steps", children: [
886
899
  step("Prev", Math.max(1, at - 1), atStart),
887
900
  step("Next", at + 1, !hasMore)
888
901
  ] });
889
902
  } else {
890
903
  let middle = null;
891
904
  if (kind === "numbered") {
892
- middle = slotsFor(at, last).map((n, i) => n == null ? /* @__PURE__ */ jsx10("span", { className: "ui-pager__gap", "aria-hidden": "true", children: "\u2026" }, `gap${i}`) : /* @__PURE__ */ jsx10(
905
+ middle = slotsFor(at, last).map((n, i) => n == null ? /* @__PURE__ */ jsx11("span", { className: "ui-pager__gap", "aria-hidden": "true", children: "\u2026" }, `gap${i}`) : /* @__PURE__ */ jsx11(
893
906
  "button",
894
907
  {
895
908
  type: "button",
@@ -904,9 +917,9 @@ function Pagination({
904
917
  n
905
918
  ));
906
919
  } else if (kind === "jump") {
907
- middle = /* @__PURE__ */ jsxs8("span", { className: "ui-pager__jump", children: [
908
- /* @__PURE__ */ jsx10("label", { htmlFor: `${uid}-jump`, children: "Page" }),
909
- /* @__PURE__ */ jsx10(
920
+ middle = /* @__PURE__ */ jsxs9("span", { className: "ui-pager__jump", children: [
921
+ /* @__PURE__ */ jsx11("label", { htmlFor: `${uid}-jump`, children: "Page" }),
922
+ /* @__PURE__ */ jsx11(
910
923
  "input",
911
924
  {
912
925
  className: "ui-input ui-pager__jump-input",
@@ -929,13 +942,13 @@ function Pagination({
929
942
  }
930
943
  }
931
944
  ),
932
- /* @__PURE__ */ jsxs8("span", { className: "ui-pager__jump-of", children: [
945
+ /* @__PURE__ */ jsxs9("span", { className: "ui-pager__jump-of", children: [
933
946
  "of ",
934
947
  fmt(last)
935
948
  ] })
936
949
  ] });
937
950
  }
938
- steps = /* @__PURE__ */ jsxs8("div", { className: "ui-pager__steps", children: [
951
+ steps = /* @__PURE__ */ jsxs9("div", { className: "ui-pager__steps", children: [
939
952
  ends ? step("First", 1, atStart) : null,
940
953
  step("Prev", Math.max(1, at - 1), atStart),
941
954
  middle,
@@ -943,7 +956,7 @@ function Pagination({
943
956
  ends ? step("Last", last, atEnd) : null
944
957
  ] });
945
958
  }
946
- return /* @__PURE__ */ jsxs8(
959
+ return /* @__PURE__ */ jsxs9(
947
960
  "nav",
948
961
  {
949
962
  ref: nav,
@@ -951,10 +964,10 @@ function Pagination({
951
964
  "aria-label": label,
952
965
  "aria-busy": loading ? true : void 0,
953
966
  children: [
954
- /* @__PURE__ */ jsx10("p", { className: "ui-pager__status", "aria-live": "polite", "aria-atomic": "true", children: status }),
955
- sizes.length ? /* @__PURE__ */ jsxs8("div", { className: "ui-pager__size", children: [
956
- /* @__PURE__ */ jsx10("label", { className: "ui-pager__size-label", htmlFor: `${uid}-size`, children: "Rows" }),
957
- /* @__PURE__ */ jsx10(
967
+ /* @__PURE__ */ jsx11("p", { className: "ui-pager__status", "aria-live": "polite", "aria-atomic": "true", children: status }),
968
+ sizes.length ? /* @__PURE__ */ jsxs9("div", { className: "ui-pager__size", children: [
969
+ /* @__PURE__ */ jsx11("label", { className: "ui-pager__size-label", htmlFor: `${uid}-size`, children: "Rows" }),
970
+ /* @__PURE__ */ jsx11(
958
971
  "select",
959
972
  {
960
973
  className: "ui-select ui-pager__size-select",
@@ -962,7 +975,7 @@ function Pagination({
962
975
  disabled: loading,
963
976
  value: size,
964
977
  onChange: (e) => onPageSizeChange?.(Number(e.target.value)),
965
- children: sizes.map((s) => /* @__PURE__ */ jsx10("option", { value: s, children: fmt(s) }, s))
978
+ children: sizes.map((s) => /* @__PURE__ */ jsx11("option", { value: s, children: fmt(s) }, s))
966
979
  }
967
980
  )
968
981
  ] }) : null,
@@ -973,7 +986,7 @@ function Pagination({
973
986
  }
974
987
 
975
988
  // src/DataTable.tsx
976
- import { Fragment as Fragment3, jsx as jsx11, jsxs as jsxs9 } from "react/jsx-runtime";
989
+ import { Fragment as Fragment3, jsx as jsx12, jsxs as jsxs10 } from "react/jsx-runtime";
977
990
  var NO_SORT = { key: void 0, dir: -1 };
978
991
  function sortTableRows(rows, sort) {
979
992
  if (sort.key === void 0) return [...rows];
@@ -1040,7 +1053,7 @@ function DataTable({
1040
1053
  onSortChange?.(next);
1041
1054
  toFirstPage();
1042
1055
  };
1043
- const caret = (k) => /* @__PURE__ */ jsx11(
1056
+ const caret = (k) => /* @__PURE__ */ jsx12(
1044
1057
  "svg",
1045
1058
  {
1046
1059
  className: "rx-caret",
@@ -1052,29 +1065,29 @@ function DataTable({
1052
1065
  strokeLinejoin: "round",
1053
1066
  "aria-hidden": "true",
1054
1067
  focusable: "false",
1055
- children: sort.key === k ? /* @__PURE__ */ jsx11("path", { d: "m8 10 4 4 4-4" }) : /* @__PURE__ */ jsxs9(Fragment3, { children: [
1056
- /* @__PURE__ */ jsx11("path", { d: "m8 9 4-4 4 4" }),
1057
- /* @__PURE__ */ jsx11("path", { d: "m8 15 4 4 4-4" })
1068
+ children: sort.key === k ? /* @__PURE__ */ jsx12("path", { d: "m8 10 4 4 4-4" }) : /* @__PURE__ */ jsxs10(Fragment3, { children: [
1069
+ /* @__PURE__ */ jsx12("path", { d: "m8 9 4-4 4 4" }),
1070
+ /* @__PURE__ */ jsx12("path", { d: "m8 15 4 4 4-4" })
1058
1071
  ] })
1059
1072
  }
1060
1073
  );
1061
1074
  const pageAllOn = selectable && slice.length > 0 && slice.every((r) => selected.has(r.name));
1062
- return /* @__PURE__ */ jsxs9(Fragment3, { children: [
1063
- /* @__PURE__ */ jsx11(
1075
+ return /* @__PURE__ */ jsxs10(Fragment3, { children: [
1076
+ /* @__PURE__ */ jsx12(
1064
1077
  "div",
1065
1078
  {
1066
1079
  className: stickyHeader || pinnedIdentity ? "ui-table-scroll" : void 0,
1067
1080
  role: stickyHeader || pinnedIdentity ? "region" : void 0,
1068
1081
  "aria-label": stickyHeader || pinnedIdentity ? scrollLabel : void 0,
1069
1082
  tabIndex: stickyHeader || pinnedIdentity ? 0 : void 0,
1070
- children: /* @__PURE__ */ jsxs9(
1083
+ children: /* @__PURE__ */ jsxs10(
1071
1084
  "table",
1072
1085
  {
1073
1086
  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(" "),
1074
1087
  "aria-busy": loading || void 0,
1075
1088
  children: [
1076
- /* @__PURE__ */ jsx11("thead", { children: /* @__PURE__ */ jsxs9("tr", { children: [
1077
- selectable ? /* @__PURE__ */ jsx11("th", { scope: "col", className: "ui-table__selection", children: /* @__PURE__ */ jsx11(
1089
+ /* @__PURE__ */ jsx12("thead", { children: /* @__PURE__ */ jsxs10("tr", { children: [
1090
+ selectable ? /* @__PURE__ */ jsx12("th", { scope: "col", className: "ui-table__selection", children: /* @__PURE__ */ jsx12(
1078
1091
  "input",
1079
1092
  {
1080
1093
  type: "checkbox",
@@ -1087,13 +1100,13 @@ function DataTable({
1087
1100
  // The sort control is a real <button> inside the header cell. It used to be
1088
1101
  // role="button" ON the <th>, which threw away the columnheader role and put
1089
1102
  // aria-sort on a role that forbids it.
1090
- /* @__PURE__ */ jsx11(
1103
+ /* @__PURE__ */ jsx12(
1091
1104
  "th",
1092
1105
  {
1093
1106
  scope: "col",
1094
1107
  className: [pinnedIdentity && columnIndex === 0 && "ui-table__identity", c.num && "ui-table__num", c.sortable && "rx-sortable"].filter(Boolean).join(" "),
1095
1108
  "aria-sort": sort.key === c.key ? sort.dir === 1 ? "ascending" : "descending" : c.sortable && sortIsKnown ? "none" : void 0,
1096
- children: c.sortable ? /* @__PURE__ */ jsxs9("button", { type: "button", className: "rx-sort", onClick: () => onSort(c.key), children: [
1109
+ children: c.sortable ? /* @__PURE__ */ jsxs10("button", { type: "button", className: "rx-sort", onClick: () => onSort(c.key), children: [
1097
1110
  c.label,
1098
1111
  caret(c.key)
1099
1112
  ] }) : c.label
@@ -1102,10 +1115,10 @@ function DataTable({
1102
1115
  )
1103
1116
  ))
1104
1117
  ] }) }),
1105
- /* @__PURE__ */ jsxs9("tbody", { children: [
1106
- !slice.length && /* @__PURE__ */ jsx11("tr", { children: /* @__PURE__ */ jsx11("td", { colSpan: columns.length + (selectable ? 1 : 0), children: loading ? "Loading rows\u2026" : empty }) }),
1107
- slice.map((r) => /* @__PURE__ */ jsxs9("tr", { children: [
1108
- selectable ? /* @__PURE__ */ jsx11("td", { className: "ui-table__selection", children: /* @__PURE__ */ jsx11(
1118
+ /* @__PURE__ */ jsxs10("tbody", { children: [
1119
+ !slice.length && /* @__PURE__ */ jsx12("tr", { children: /* @__PURE__ */ jsx12("td", { colSpan: columns.length + (selectable ? 1 : 0), children: loading ? "Loading rows\u2026" : empty }) }),
1120
+ slice.map((r) => /* @__PURE__ */ jsxs10("tr", { children: [
1121
+ selectable ? /* @__PURE__ */ jsx12("td", { className: "ui-table__selection", children: /* @__PURE__ */ jsx12(
1109
1122
  "input",
1110
1123
  {
1111
1124
  type: "checkbox",
@@ -1114,7 +1127,7 @@ function DataTable({
1114
1127
  onChange: () => onToggle(r.name)
1115
1128
  }
1116
1129
  ) }) : null,
1117
- columns.map((c, columnIndex) => /* @__PURE__ */ jsx11("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))
1130
+ columns.map((c, columnIndex) => /* @__PURE__ */ jsx12("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))
1118
1131
  ] }, r.name))
1119
1132
  ] })
1120
1133
  ]
@@ -1122,7 +1135,7 @@ function DataTable({
1122
1135
  )
1123
1136
  }
1124
1137
  ),
1125
- pager ? /* @__PURE__ */ jsx11(
1138
+ pager ? /* @__PURE__ */ jsx12(
1126
1139
  Pagination,
1127
1140
  {
1128
1141
  page,
@@ -1147,7 +1160,7 @@ function DataTable({
1147
1160
  import { PAGE_SIZES as KIT_PAGE_SIZES, DEFAULT_PAGE_SIZE as KIT_DEFAULT_PAGE_SIZE } from "@apliteni/apliteni-ui";
1148
1161
 
1149
1162
  // src/Loading.tsx
1150
- import { jsx as jsx12, jsxs as jsxs10 } from "react/jsx-runtime";
1163
+ import { jsx as jsx13, jsxs as jsxs11 } from "react/jsx-runtime";
1151
1164
  var cx4 = (...a) => a.filter(Boolean).join(" ");
1152
1165
  function Skeleton({ lines = 3, width, height, radius, className }) {
1153
1166
  const widths = Array.isArray(lines) ? lines : null;
@@ -1157,19 +1170,19 @@ function Skeleton({ lines = 3, width, height, radius, className }) {
1157
1170
  if (!w && !height && !radius) return void 0;
1158
1171
  return { ...w && { width: w }, ...height && { height }, ...radius && { borderRadius: radius } };
1159
1172
  };
1160
- return /* @__PURE__ */ jsx12("div", { className: cx4("ui-skel", className), "aria-hidden": "true", children: Array.from({ length: n }, (_, i) => /* @__PURE__ */ jsx12("span", { className: "ui-skel__bar m-skeleton", style: styleFor(i) }, i)) });
1173
+ return /* @__PURE__ */ jsx13("div", { className: cx4("ui-skel", className), "aria-hidden": "true", children: Array.from({ length: n }, (_, i) => /* @__PURE__ */ jsx13("span", { className: "ui-skel__bar m-skeleton", style: styleFor(i) }, i)) });
1161
1174
  }
1162
1175
  function SkeletonTable({ rows = 5, cols = 4, head = true }) {
1163
- const cells = Array.from({ length: Math.max(1, cols) }, (_, i) => /* @__PURE__ */ jsx12("span", { className: "ui-skel__bar m-skeleton" }, i));
1164
- return /* @__PURE__ */ jsxs10(
1176
+ const cells = Array.from({ length: Math.max(1, cols) }, (_, i) => /* @__PURE__ */ jsx13("span", { className: "ui-skel__bar m-skeleton" }, i));
1177
+ return /* @__PURE__ */ jsxs11(
1165
1178
  "div",
1166
1179
  {
1167
1180
  className: "ui-skel ui-skel--table",
1168
1181
  style: { "--skel-cols": Math.max(1, cols) },
1169
1182
  "aria-hidden": "true",
1170
1183
  children: [
1171
- head && /* @__PURE__ */ jsx12("div", { className: "ui-skel__row ui-skel__row--head", children: cells }),
1172
- Array.from({ length: Math.max(1, rows) }, (_, i) => /* @__PURE__ */ jsx12("div", { className: "ui-skel__row", children: cells }, i))
1184
+ head && /* @__PURE__ */ jsx13("div", { className: "ui-skel__row ui-skel__row--head", children: cells }),
1185
+ Array.from({ length: Math.max(1, rows) }, (_, i) => /* @__PURE__ */ jsx13("div", { className: "ui-skel__row", children: cells }, i))
1173
1186
  ]
1174
1187
  }
1175
1188
  );
@@ -1182,7 +1195,7 @@ function BusyRegion({
1182
1195
  className,
1183
1196
  children
1184
1197
  }) {
1185
- return /* @__PURE__ */ jsxs10(
1198
+ return /* @__PURE__ */ jsxs11(
1186
1199
  "div",
1187
1200
  {
1188
1201
  className: cx4("ui-busy", className),
@@ -1190,8 +1203,8 @@ function BusyRegion({
1190
1203
  "aria-live": "polite",
1191
1204
  "aria-busy": busy,
1192
1205
  children: [
1193
- /* @__PURE__ */ jsx12("span", { className: "ui-sr", children: busy ? label : message }),
1194
- /* @__PURE__ */ jsx12("div", { className: "ui-busy__body", children: busy ? placeholder ?? /* @__PURE__ */ jsx12(Skeleton, { lines: 3 }) : children })
1206
+ /* @__PURE__ */ jsx13("span", { className: "ui-sr", children: busy ? label : message }),
1207
+ /* @__PURE__ */ jsx13("div", { className: "ui-busy__body", children: busy ? placeholder ?? /* @__PURE__ */ jsx13(Skeleton, { lines: 3 }) : children })
1195
1208
  ]
1196
1209
  }
1197
1210
  );
@@ -1204,15 +1217,15 @@ function Denied({
1204
1217
  className,
1205
1218
  children
1206
1219
  }) {
1207
- return /* @__PURE__ */ jsxs10("div", { className: cx4("ui-denied", className), children: [
1208
- /* @__PURE__ */ jsx12("div", { className: "ui-denied__seal", children: /* @__PURE__ */ jsx12(Icon, { name: icon5 }) }),
1209
- /* @__PURE__ */ jsx12("div", { className: "ui-denied__title", children: title }),
1210
- sub && /* @__PURE__ */ jsx12("div", { className: "ui-denied__sub", children: sub }),
1211
- need && /* @__PURE__ */ jsxs10("div", { className: "ui-denied__need", children: [
1220
+ return /* @__PURE__ */ jsxs11("div", { className: cx4("ui-denied", className), children: [
1221
+ /* @__PURE__ */ jsx13("div", { className: "ui-denied__seal", children: /* @__PURE__ */ jsx13(Icon, { name: icon5 }) }),
1222
+ /* @__PURE__ */ jsx13("div", { className: "ui-denied__title", children: title }),
1223
+ sub && /* @__PURE__ */ jsx13("div", { className: "ui-denied__sub", children: sub }),
1224
+ need && /* @__PURE__ */ jsxs11("div", { className: "ui-denied__need", children: [
1212
1225
  "Needs ",
1213
- /* @__PURE__ */ jsx12("code", { className: "ui-code", children: need })
1226
+ /* @__PURE__ */ jsx13("code", { className: "ui-code", children: need })
1214
1227
  ] }),
1215
- children && /* @__PURE__ */ jsx12("div", { className: "ui-denied__actions", children })
1228
+ children && /* @__PURE__ */ jsx13("div", { className: "ui-denied__actions", children })
1216
1229
  ] });
1217
1230
  }
1218
1231
 
@@ -1226,10 +1239,10 @@ import {
1226
1239
  useState as useState5
1227
1240
  } from "react";
1228
1241
  import { icon as icon3, dropdownMatch, dropdownFiltering } from "@apliteni/apliteni-ui";
1229
- import { Fragment as Fragment5, jsx as jsx13, jsxs as jsxs11 } from "react/jsx-runtime";
1242
+ import { Fragment as Fragment5, jsx as jsx14, jsxs as jsxs12 } from "react/jsx-runtime";
1230
1243
  var cx5 = (...a) => a.filter(Boolean).join(" ");
1231
1244
  var isRow = (it) => Boolean(it) && it !== "---" && !it.separator;
1232
- var Glyph2 = ({ name, className, hidden }) => /* @__PURE__ */ jsx13(
1245
+ var Glyph2 = ({ name, className, hidden }) => /* @__PURE__ */ jsx14(
1233
1246
  "span",
1234
1247
  {
1235
1248
  className,
@@ -1242,7 +1255,7 @@ function RowBadge({ badge }) {
1242
1255
  const given = typeof badge === "string" ? "" : badge.tone || "";
1243
1256
  let tone = given || (/^live$/i.test(String(text2)) ? "live" : "neutral");
1244
1257
  if (!given && tone === "neutral" && /^(?:off|unset|disabled|archive|archived)$/i.test(text2)) tone = "state";
1245
- return /* @__PURE__ */ jsx13("span", { className: `ui-dropdown__badge is-${tone}`, children: text2 });
1258
+ return /* @__PURE__ */ jsx14("span", { className: `ui-dropdown__badge is-${tone}`, children: text2 });
1246
1259
  }
1247
1260
  var keyOf = (it) => it.value != null ? `v:${it.value}` : `l:${it.label}`;
1248
1261
  var itemsIn = (panel) => Array.from(panel?.querySelectorAll("[data-dd-item]") ?? []).filter((el) => el.getAttribute("aria-disabled") !== "true" && !el.hidden);
@@ -1457,7 +1470,7 @@ function Dropdown({
1457
1470
  };
1458
1471
  function renderRow(entry, key) {
1459
1472
  if (!isRow(entry)) {
1460
- return /* @__PURE__ */ jsx13("div", { className: "ui-dropdown__sep", role: "separator", hidden: filtering || void 0 }, key);
1473
+ return /* @__PURE__ */ jsx14("div", { className: "ui-dropdown__sep", role: "separator", hidden: filtering || void 0 }, key);
1461
1474
  }
1462
1475
  const disabled = !!entry.disabled;
1463
1476
  const selected = selectedOf(entry);
@@ -1479,23 +1492,23 @@ function Dropdown({
1479
1492
  ...asLink ? { href: entry.href, ...entry.target ? { target: entry.target } : null } : null,
1480
1493
  ...sx ? { id: rowIds.get(entry), hidden: hiddenBy(entry) || void 0 } : null,
1481
1494
  onClick: (e) => choose(entry, e),
1482
- children: /* @__PURE__ */ jsxs11(Fragment5, { children: [
1483
- entry.icon && /* @__PURE__ */ jsx13(Glyph2, { name: entry.icon, className: "ui-dropdown__ic" }),
1484
- /* @__PURE__ */ jsxs11("span", { className: "ui-dropdown__main", children: [
1485
- /* @__PURE__ */ jsx13("span", { className: "ui-dropdown__label", children: entry.label }),
1486
- entry.description && /* @__PURE__ */ jsx13("span", { className: "ui-dropdown__desc", children: entry.description })
1495
+ children: /* @__PURE__ */ jsxs12(Fragment5, { children: [
1496
+ entry.icon && /* @__PURE__ */ jsx14(Glyph2, { name: entry.icon, className: "ui-dropdown__ic" }),
1497
+ /* @__PURE__ */ jsxs12("span", { className: "ui-dropdown__main", children: [
1498
+ /* @__PURE__ */ jsx14("span", { className: "ui-dropdown__label", children: entry.label }),
1499
+ entry.description && /* @__PURE__ */ jsx14("span", { className: "ui-dropdown__desc", children: entry.description })
1487
1500
  ] }),
1488
- entry.badge ? /* @__PURE__ */ jsx13(RowBadge, { badge: entry.badge }) : null,
1489
- asOption && /* @__PURE__ */ jsx13(Glyph2, { name: "check", className: "ui-dropdown__tick", hidden: true })
1501
+ entry.badge ? /* @__PURE__ */ jsx14(RowBadge, { badge: entry.badge }) : null,
1502
+ asOption && /* @__PURE__ */ jsx14(Glyph2, { name: "check", className: "ui-dropdown__tick", hidden: true })
1490
1503
  ] })
1491
1504
  };
1492
- if (row) return /* @__PURE__ */ jsx13(Fragment4, { children: row(entry, props) }, key);
1505
+ if (row) return /* @__PURE__ */ jsx14(Fragment4, { children: row(entry, props) }, key);
1493
1506
  const Tag = asLink ? "a" : "div";
1494
- return /* @__PURE__ */ jsx13(Tag, { ...props }, key);
1507
+ return /* @__PURE__ */ jsx14(Tag, { ...props }, key);
1495
1508
  }
1496
1509
  const body = sections?.length ? sections.map((section, si) => {
1497
1510
  const gone = filtering && !(section.items || []).some((it) => isRow(it) && !hiddenBy(it));
1498
- return /* @__PURE__ */ jsxs11(
1511
+ return /* @__PURE__ */ jsxs12(
1499
1512
  "div",
1500
1513
  {
1501
1514
  className: "ui-dropdown__section",
@@ -1503,7 +1516,7 @@ function Dropdown({
1503
1516
  "aria-label": section.label || void 0,
1504
1517
  hidden: gone || void 0,
1505
1518
  children: [
1506
- section.label && /* @__PURE__ */ jsx13("div", { className: "ui-dropdown__group", role: "presentation", children: section.label }),
1519
+ section.label && /* @__PURE__ */ jsx14("div", { className: "ui-dropdown__group", role: "presentation", children: section.label }),
1507
1520
  (section.items || []).map((entry, i) => renderRow(entry, `s${si}-${i}`))
1508
1521
  ]
1509
1522
  },
@@ -1511,12 +1524,12 @@ function Dropdown({
1511
1524
  );
1512
1525
  }) : (items || []).map((entry, i) => renderRow(entry, `i${i}`));
1513
1526
  const cap = scroll && scroll !== true ? { maxHeight: typeof scroll === "number" ? `${scroll}px` : scroll } : void 0;
1514
- const none = sx && filtering && !visible.length ? /* @__PURE__ */ jsxs11(Fragment5, { children: [
1515
- /* @__PURE__ */ jsx13("span", { className: "ui-dropdown__none-title", children: sx.empty.replace("{q}", () => query.trim()) }),
1516
- /* @__PURE__ */ jsx13("span", { className: "ui-dropdown__none-hint", children: sx.hint })
1527
+ const none = sx && filtering && !visible.length ? /* @__PURE__ */ jsxs12(Fragment5, { children: [
1528
+ /* @__PURE__ */ jsx14("span", { className: "ui-dropdown__none-title", children: sx.empty.replace("{q}", () => query.trim()) }),
1529
+ /* @__PURE__ */ jsx14("span", { className: "ui-dropdown__none-hint", children: sx.hint })
1517
1530
  ] }) : null;
1518
- return /* @__PURE__ */ jsxs11("div", { className: cx5("ui-dropdown", open && "open"), id, ref: root, onKeyDown, children: [
1519
- /* @__PURE__ */ jsxs11(
1531
+ return /* @__PURE__ */ jsxs12("div", { className: cx5("ui-dropdown", open && "open"), id, ref: root, onKeyDown, children: [
1532
+ /* @__PURE__ */ jsxs12(
1520
1533
  "button",
1521
1534
  {
1522
1535
  type: "button",
@@ -1531,15 +1544,15 @@ function Dropdown({
1531
1544
  setOpen(!open);
1532
1545
  },
1533
1546
  children: [
1534
- triggerContent != null ? triggerContent : /* @__PURE__ */ jsxs11(Fragment5, { children: [
1535
- label && /* @__PURE__ */ jsx13("span", { className: "ui-dropdown__pre", children: label }),
1536
- /* @__PURE__ */ jsx13("span", { className: "ui-dropdown__value", children: shown != null ? shown : placeholder })
1547
+ triggerContent != null ? triggerContent : /* @__PURE__ */ jsxs12(Fragment5, { children: [
1548
+ label && /* @__PURE__ */ jsx14("span", { className: "ui-dropdown__pre", children: label }),
1549
+ /* @__PURE__ */ jsx14("span", { className: "ui-dropdown__value", children: shown != null ? shown : placeholder })
1537
1550
  ] }),
1538
- chevron && /* @__PURE__ */ jsx13("span", { className: "ui-dropdown__chevron", "aria-hidden": "true" })
1551
+ chevron && /* @__PURE__ */ jsx14("span", { className: "ui-dropdown__chevron", "aria-hidden": "true" })
1539
1552
  ]
1540
1553
  }
1541
1554
  ),
1542
- /* @__PURE__ */ jsxs11(
1555
+ /* @__PURE__ */ jsxs12(
1543
1556
  "div",
1544
1557
  {
1545
1558
  className: cx5(
@@ -1559,10 +1572,10 @@ function Dropdown({
1559
1572
  onMouseMove,
1560
1573
  children: [
1561
1574
  header,
1562
- sx ? /* @__PURE__ */ jsxs11(Fragment5, { children: [
1563
- /* @__PURE__ */ jsxs11("div", { className: "ui-dropdown__search", children: [
1564
- /* @__PURE__ */ jsx13(Glyph2, { name: "search", className: "ui-dropdown__search-ic", hidden: true }),
1565
- /* @__PURE__ */ jsx13(
1575
+ sx ? /* @__PURE__ */ jsxs12(Fragment5, { children: [
1576
+ /* @__PURE__ */ jsxs12("div", { className: "ui-dropdown__search", children: [
1577
+ /* @__PURE__ */ jsx14(Glyph2, { name: "search", className: "ui-dropdown__search-ic", hidden: true }),
1578
+ /* @__PURE__ */ jsx14(
1566
1579
  "input",
1567
1580
  {
1568
1581
  className: "ui-dropdown__search-input",
@@ -1586,8 +1599,8 @@ function Dropdown({
1586
1599
  }
1587
1600
  )
1588
1601
  ] }),
1589
- /* @__PURE__ */ jsx13("div", { className: "ui-dropdown__list", role: "listbox", id: listId, "aria-label": name, style: cap, children: body }),
1590
- /* @__PURE__ */ jsx13(
1602
+ /* @__PURE__ */ jsx14("div", { className: "ui-dropdown__list", role: "listbox", id: listId, "aria-label": name, style: cap, children: body }),
1603
+ /* @__PURE__ */ jsx14(
1591
1604
  "div",
1592
1605
  {
1593
1606
  className: "ui-dropdown__none",
@@ -1612,7 +1625,7 @@ function strip(o) {
1612
1625
  }
1613
1626
 
1614
1627
  // src/BackLink.tsx
1615
- import { jsx as jsx14, jsxs as jsxs12 } from "react/jsx-runtime";
1628
+ import { jsx as jsx15, jsxs as jsxs13 } from "react/jsx-runtime";
1616
1629
  var BARE = "Back";
1617
1630
  var SCRIPTED = /^javascript:/i;
1618
1631
  var LEADING = /^[\u0000-\u0020]+/;
@@ -1631,7 +1644,7 @@ function BackLink({
1631
1644
  const name = text(label).replace(SAID, "");
1632
1645
  const bare = !name || name.toLowerCase() === BARE.toLowerCase();
1633
1646
  const Tag = as ?? "a";
1634
- return /* @__PURE__ */ jsxs12(
1647
+ return /* @__PURE__ */ jsxs13(
1635
1648
  Tag,
1636
1649
  {
1637
1650
  className: ["ui-back", className].filter(Boolean).join(" "),
@@ -1639,8 +1652,8 @@ function BackLink({
1639
1652
  "aria-label": bare ? void 0 : `${BARE} to ${name}`,
1640
1653
  ...rest,
1641
1654
  children: [
1642
- /* @__PURE__ */ jsx14(Icon, { name: "chevronLeft" }),
1643
- /* @__PURE__ */ jsx14("span", { className: "ui-back__label", children: bare ? BARE : name })
1655
+ /* @__PURE__ */ jsx15(Icon, { name: "chevronLeft" }),
1656
+ /* @__PURE__ */ jsx15("span", { className: "ui-back__label", children: bare ? BARE : name })
1644
1657
  ]
1645
1658
  }
1646
1659
  );
@@ -1648,36 +1661,36 @@ function BackLink({
1648
1661
 
1649
1662
  // src/TableValues.tsx
1650
1663
  import { numericValue, deltaValue } from "@apliteni/apliteni-ui";
1651
- import { jsx as jsx15, jsxs as jsxs13 } from "react/jsx-runtime";
1664
+ import { jsx as jsx16, jsxs as jsxs14 } from "react/jsx-runtime";
1652
1665
  function NumericValue(props) {
1653
- return /* @__PURE__ */ jsx15("span", { dangerouslySetInnerHTML: { __html: numericValue(props) } });
1666
+ return /* @__PURE__ */ jsx16("span", { dangerouslySetInnerHTML: { __html: numericValue(props) } });
1654
1667
  }
1655
1668
  function DeltaValue(props) {
1656
- return /* @__PURE__ */ jsx15("span", { dangerouslySetInnerHTML: { __html: deltaValue(props) } });
1669
+ return /* @__PURE__ */ jsx16("span", { dangerouslySetInnerHTML: { __html: deltaValue(props) } });
1657
1670
  }
1658
1671
  function RowIdentity({ symbol, name, logo, href }) {
1659
1672
  const Tag = href ? "a" : "span";
1660
- return /* @__PURE__ */ jsxs13(Tag, { className: "ui-identity", href, children: [
1661
- /* @__PURE__ */ jsxs13("span", { className: "ui-identity__logo", "aria-hidden": "true", children: [
1662
- /* @__PURE__ */ jsx15("span", { children: symbol.slice(0, 1) }),
1663
- logo && /* @__PURE__ */ jsx15("img", { src: logo, alt: "", onLoad: (e) => {
1673
+ return /* @__PURE__ */ jsxs14(Tag, { className: "ui-identity", href, children: [
1674
+ /* @__PURE__ */ jsxs14("span", { className: "ui-identity__logo", "aria-hidden": "true", children: [
1675
+ /* @__PURE__ */ jsx16("span", { children: symbol.slice(0, 1) }),
1676
+ logo && /* @__PURE__ */ jsx16("img", { src: logo, alt: "", onLoad: (e) => {
1664
1677
  e.currentTarget.hidden = false;
1665
1678
  }, onError: (e) => {
1666
1679
  e.currentTarget.hidden = true;
1667
1680
  } })
1668
1681
  ] }),
1669
- /* @__PURE__ */ jsx15("span", { className: "ui-identity__symbol", children: symbol }),
1670
- /* @__PURE__ */ jsx15("span", { className: "ui-identity__name", children: name })
1682
+ /* @__PURE__ */ jsx16("span", { className: "ui-identity__symbol", children: symbol }),
1683
+ /* @__PURE__ */ jsx16("span", { className: "ui-identity__name", children: name })
1671
1684
  ] });
1672
1685
  }
1673
1686
 
1674
1687
  // src/Segmented.tsx
1675
1688
  import { segmentedNextIndex } from "@apliteni/apliteni-ui";
1676
- import { jsx as jsx16 } from "react/jsx-runtime";
1689
+ import { jsx as jsx17 } from "react/jsx-runtime";
1677
1690
  function Segmented({ options, value, onChange, label, appearance = "pill", disabled = false }) {
1678
1691
  const enabled = options.filter((o) => !o.disabled);
1679
1692
  const tabValue = enabled.some((o) => o.value === value) ? value : enabled[0]?.value;
1680
- return /* @__PURE__ */ jsx16("div", { className: `ui-seg${appearance === "underline" ? " ui-seg--underline" : ""}`, role: "toolbar", "aria-label": label, children: options.map((option) => /* @__PURE__ */ jsx16(
1693
+ return /* @__PURE__ */ jsx17("div", { className: `ui-seg${appearance === "underline" ? " ui-seg--underline" : ""}`, role: "toolbar", "aria-label": label, children: options.map((option) => /* @__PURE__ */ jsx17(
1681
1694
  "button",
1682
1695
  {
1683
1696
  type: "button",
@@ -1704,7 +1717,7 @@ function Segmented({ options, value, onChange, label, appearance = "pill", disab
1704
1717
  // src/FilterBar.tsx
1705
1718
  import { useLayoutEffect as useLayoutEffect3, useRef as useRef9 } from "react";
1706
1719
  import { filterBar, initFilterBar } from "@apliteni/apliteni-ui";
1707
- import { jsx as jsx17 } from "react/jsx-runtime";
1720
+ import { jsx as jsx18 } from "react/jsx-runtime";
1708
1721
  function FilterBar(props) {
1709
1722
  const host = useRef9(null);
1710
1723
  const latest = useRef9(props);
@@ -1733,36 +1746,36 @@ function FilterBar(props) {
1733
1746
  useLayoutEffect3(() => {
1734
1747
  controller.current?.update(props);
1735
1748
  }, [props.filters, props.label, props.clearLabel, props.disabled, props.busy]);
1736
- return /* @__PURE__ */ jsx17("div", { ref: host, dangerouslySetInnerHTML: initial.current });
1749
+ return /* @__PURE__ */ jsx18("div", { ref: host, dangerouslySetInnerHTML: initial.current });
1737
1750
  }
1738
1751
 
1739
1752
  // src/KeyValueList.tsx
1740
- import { jsx as jsx18, jsxs as jsxs14 } from "react/jsx-runtime";
1753
+ import { jsx as jsx19, jsxs as jsxs15 } from "react/jsx-runtime";
1741
1754
  function detail({ value, redacted }) {
1742
- if (redacted) return /* @__PURE__ */ jsxs14("span", { className: "ui-kv__hidden", children: [
1743
- /* @__PURE__ */ jsx18(Icon, { name: "eyeOff" }),
1755
+ if (redacted) return /* @__PURE__ */ jsxs15("span", { className: "ui-kv__hidden", children: [
1756
+ /* @__PURE__ */ jsx19(Icon, { name: "eyeOff" }),
1744
1757
  "Hidden"
1745
1758
  ] });
1746
1759
  if (value == null) return "\u2014";
1747
1760
  return typeof value === "boolean" ? String(value) : value;
1748
1761
  }
1749
1762
  function KeyValueList({ rows, columns = 1, className, ...rest }) {
1750
- return /* @__PURE__ */ jsx18("dl", { ...rest, className: ["ui-drawer__rows", "ui-kv", columns === 2 && "ui-kv--two-columns", className].filter(Boolean).join(" "), children: rows.map((row, index) => /* @__PURE__ */ jsxs14("div", { className: "ui-drawer__row", children: [
1751
- /* @__PURE__ */ jsx18("dt", { children: row.label }),
1752
- /* @__PURE__ */ jsx18("dd", { children: detail(row) })
1763
+ return /* @__PURE__ */ jsx19("dl", { ...rest, className: ["ui-drawer__rows", "ui-kv", columns === 2 && "ui-kv--two-columns", className].filter(Boolean).join(" "), children: rows.map((row, index) => /* @__PURE__ */ jsxs15("div", { className: "ui-drawer__row", children: [
1764
+ /* @__PURE__ */ jsx19("dt", { children: row.label }),
1765
+ /* @__PURE__ */ jsx19("dd", { children: detail(row) })
1753
1766
  ] }, index)) });
1754
1767
  }
1755
1768
  function DrawerSection({ title, headingLevel = 3, className, children, ...rest }) {
1756
1769
  const Heading = `h${headingLevel}`;
1757
- return /* @__PURE__ */ jsxs14("section", { ...rest, className: ["ui-drawer__section", className].filter(Boolean).join(" "), children: [
1758
- title != null && /* @__PURE__ */ jsx18(Heading, { className: "ui-drawer__section-title", children: title }),
1770
+ return /* @__PURE__ */ jsxs15("section", { ...rest, className: ["ui-drawer__section", className].filter(Boolean).join(" "), children: [
1771
+ title != null && /* @__PURE__ */ jsx19(Heading, { className: "ui-drawer__section-title", children: title }),
1759
1772
  children
1760
1773
  ] });
1761
1774
  }
1762
1775
 
1763
1776
  // src/Snippet.tsx
1764
1777
  import { useEffect as useEffect5, useRef as useRef10, useState as useState6 } from "react";
1765
- import { jsx as jsx19, jsxs as jsxs15 } from "react/jsx-runtime";
1778
+ import { jsx as jsx20, jsxs as jsxs16 } from "react/jsx-runtime";
1766
1779
  function Snippet({ label = "shell", code = "", reveal = false, copyLabel = "Copy" }) {
1767
1780
  const [status, setStatus] = useState6("idle");
1768
1781
  const request = useRef10(0);
@@ -1787,22 +1800,22 @@ function Snippet({ label = "shell", code = "", reveal = false, copyLabel = "Copy
1787
1800
  if (current === request.current) setStatus("failed");
1788
1801
  }
1789
1802
  }
1790
- return /* @__PURE__ */ jsxs15("div", { className: reveal ? "ui-snippet ui-snippet--reveal" : "ui-snippet", children: [
1791
- /* @__PURE__ */ jsxs15("div", { className: "ui-snippet__bar", children: [
1792
- /* @__PURE__ */ jsx19("span", { children: label }),
1793
- /* @__PURE__ */ jsxs15("button", { type: "button", className: "ui-snippet__copy", "aria-live": "polite", "aria-atomic": "true", onClick: copy, children: [
1794
- /* @__PURE__ */ jsx19(Icon, { name: status === "copied" ? "check" : "copy" }),
1803
+ return /* @__PURE__ */ jsxs16("div", { className: reveal ? "ui-snippet ui-snippet--reveal" : "ui-snippet", children: [
1804
+ /* @__PURE__ */ jsxs16("div", { className: "ui-snippet__bar", children: [
1805
+ /* @__PURE__ */ jsx20("span", { children: label }),
1806
+ /* @__PURE__ */ jsxs16("button", { type: "button", className: "ui-snippet__copy", "aria-live": "polite", "aria-atomic": "true", onClick: copy, children: [
1807
+ /* @__PURE__ */ jsx20(Icon, { name: status === "copied" ? "check" : "copy" }),
1795
1808
  status === "copied" ? "Copied" : status === "failed" ? "Copy failed" : copyLabel
1796
1809
  ] })
1797
1810
  ] }),
1798
- /* @__PURE__ */ jsx19("pre", { children: code })
1811
+ /* @__PURE__ */ jsx20("pre", { children: code })
1799
1812
  ] });
1800
1813
  }
1801
1814
 
1802
1815
  // src/Tabs.tsx
1803
1816
  import { useEffect as useEffect6, useId as useId7, useRef as useRef11 } from "react";
1804
1817
  import { playEntrance } from "@apliteni/apliteni-ui/motion";
1805
- import { Fragment as Fragment6, jsx as jsx20, jsxs as jsxs16 } from "react/jsx-runtime";
1818
+ import { Fragment as Fragment6, jsx as jsx21, jsxs as jsxs17 } from "react/jsx-runtime";
1806
1819
  function Tabs({ items, value, onChange, label }) {
1807
1820
  const id = useId7();
1808
1821
  const previous = useRef11(value);
@@ -1812,8 +1825,8 @@ function Tabs({ items, value, onChange, label }) {
1812
1825
  if (previous.current !== value) playEntrance(activePanel.current);
1813
1826
  previous.current = value;
1814
1827
  }, [value]);
1815
- return /* @__PURE__ */ jsxs16("div", { className: "ui-tabs", children: [
1816
- /* @__PURE__ */ jsx20("div", { className: "ui-tabs__list", role: "tablist", "aria-label": label, children: items.map((item, i) => /* @__PURE__ */ jsxs16(
1828
+ return /* @__PURE__ */ jsxs17("div", { className: "ui-tabs", children: [
1829
+ /* @__PURE__ */ jsx21("div", { className: "ui-tabs__list", role: "tablist", "aria-label": label, children: items.map((item, i) => /* @__PURE__ */ jsxs17(
1817
1830
  "button",
1818
1831
  {
1819
1832
  type: "button",
@@ -1851,7 +1864,7 @@ function Tabs({ items, value, onChange, label }) {
1851
1864
  },
1852
1865
  children: [
1853
1866
  item.label,
1854
- item.count != null && /* @__PURE__ */ jsxs16(Fragment6, { children: [
1867
+ item.count != null && /* @__PURE__ */ jsxs17(Fragment6, { children: [
1855
1868
  " ",
1856
1869
  item.count
1857
1870
  ] })
@@ -1859,7 +1872,7 @@ function Tabs({ items, value, onChange, label }) {
1859
1872
  },
1860
1873
  item.value
1861
1874
  )) }),
1862
- /* @__PURE__ */ jsx20("div", { className: "ui-tabs__panels", children: items.map((item, i) => /* @__PURE__ */ jsx20(
1875
+ /* @__PURE__ */ jsx21("div", { className: "ui-tabs__panels", children: items.map((item, i) => /* @__PURE__ */ jsx21(
1863
1876
  "div",
1864
1877
  {
1865
1878
  className: "ui-tabs__panel",
@@ -1877,17 +1890,17 @@ function Tabs({ items, value, onChange, label }) {
1877
1890
  }
1878
1891
 
1879
1892
  // src/Timeline.tsx
1880
- import { jsx as jsx21, jsxs as jsxs17 } from "react/jsx-runtime";
1893
+ import { jsx as jsx22, jsxs as jsxs18 } from "react/jsx-runtime";
1881
1894
  function Timeline({ events, className, ...rest }) {
1882
- return /* @__PURE__ */ jsx21("ol", { ...rest, role: "list", className: ["ui-timeline", className].filter(Boolean).join(" "), children: events.map((event) => /* @__PURE__ */ jsxs17("li", { className: "ui-timeline__event", children: [
1883
- /* @__PURE__ */ jsxs17("div", { className: "ui-timeline__head", children: [
1884
- /* @__PURE__ */ jsx21("span", { className: "ui-timeline__actor", children: event.actor }),
1885
- /* @__PURE__ */ jsx21("time", { dateTime: event.dateTime, children: event.timestamp })
1895
+ return /* @__PURE__ */ jsx22("ol", { ...rest, role: "list", className: ["ui-timeline", className].filter(Boolean).join(" "), children: events.map((event) => /* @__PURE__ */ jsxs18("li", { className: "ui-timeline__event", children: [
1896
+ /* @__PURE__ */ jsxs18("div", { className: "ui-timeline__head", children: [
1897
+ /* @__PURE__ */ jsx22("span", { className: "ui-timeline__actor", children: event.actor }),
1898
+ /* @__PURE__ */ jsx22("time", { dateTime: event.dateTime, children: event.timestamp })
1886
1899
  ] }),
1887
- /* @__PURE__ */ jsx21("p", { className: "ui-timeline__description", children: event.description }),
1888
- (event.meta != null || event.undo) && /* @__PURE__ */ jsxs17("div", { className: "ui-timeline__meta", children: [
1889
- event.meta != null && /* @__PURE__ */ jsx21("span", { children: event.meta }),
1890
- event.undo && /* @__PURE__ */ jsx21(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" })
1900
+ /* @__PURE__ */ jsx22("p", { className: "ui-timeline__description", children: event.description }),
1901
+ (event.meta != null || event.undo) && /* @__PURE__ */ jsxs18("div", { className: "ui-timeline__meta", children: [
1902
+ event.meta != null && /* @__PURE__ */ jsx22("span", { children: event.meta }),
1903
+ event.undo && /* @__PURE__ */ jsx22(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" })
1891
1904
  ] })
1892
1905
  ] }, event.id)) });
1893
1906
  }
@@ -1895,15 +1908,15 @@ function Timeline({ events, className, ...rest }) {
1895
1908
  // src/Field.tsx
1896
1909
  import { useEffect as useEffect7, useId as useId8, useRef as useRef12, useState as useState7 } from "react";
1897
1910
  import { esc, icon as icon4 } from "@apliteni/apliteni-ui";
1898
- import { jsx as jsx22, jsxs as jsxs18 } from "react/jsx-runtime";
1911
+ import { jsx as jsx23, jsxs as jsxs19 } from "react/jsx-runtime";
1899
1912
  function Frame({ id, label, hint, error, required, children }) {
1900
- return /* @__PURE__ */ jsxs18("div", { className: "ui-field", children: [
1901
- /* @__PURE__ */ jsxs18("label", { className: "ui-field__label", htmlFor: id, children: [
1913
+ return /* @__PURE__ */ jsxs19("div", { className: "ui-field", children: [
1914
+ /* @__PURE__ */ jsxs19("label", { className: "ui-field__label", htmlFor: id, children: [
1902
1915
  label,
1903
- required && /* @__PURE__ */ jsx22("span", { className: "ui-field__req", "aria-hidden": "true", children: "*" })
1916
+ required && /* @__PURE__ */ jsx23("span", { className: "ui-field__req", "aria-hidden": "true", children: "*" })
1904
1917
  ] }),
1905
1918
  children,
1906
- (error || hint) && /* @__PURE__ */ jsx22(
1919
+ (error || hint) && /* @__PURE__ */ jsx23(
1907
1920
  "div",
1908
1921
  {
1909
1922
  id: `${id}-message`,
@@ -1920,7 +1933,7 @@ function TextField({ label, hint, error, required, type = "text", unit, classNam
1920
1933
  const id = useId8();
1921
1934
  const hasUnit = type === "number" && !!unit;
1922
1935
  const describedBy = [error || hint ? `${id}-message` : "", hasUnit ? `${id}-unit` : ""].filter(Boolean).join(" ") || void 0;
1923
- const control = /* @__PURE__ */ jsx22(
1936
+ const control = /* @__PURE__ */ jsx23(
1924
1937
  "input",
1925
1938
  {
1926
1939
  ...props,
@@ -1932,14 +1945,14 @@ function TextField({ label, hint, error, required, type = "text", unit, classNam
1932
1945
  className: `ui-input${error ? " is-invalid" : ""} ${className}`
1933
1946
  }
1934
1947
  );
1935
- return /* @__PURE__ */ jsx22(Frame, { ...{ id, label, hint, error, required }, children: hasUnit ? /* @__PURE__ */ jsxs18("div", { className: "ui-field-number", children: [
1948
+ return /* @__PURE__ */ jsx23(Frame, { ...{ id, label, hint, error, required }, children: hasUnit ? /* @__PURE__ */ jsxs19("div", { className: "ui-field-number", children: [
1936
1949
  control,
1937
- /* @__PURE__ */ jsx22("span", { id: `${id}-unit`, className: "ui-field-number__unit", children: unit })
1950
+ /* @__PURE__ */ jsx23("span", { id: `${id}-unit`, className: "ui-field-number__unit", children: unit })
1938
1951
  ] }) : control });
1939
1952
  }
1940
1953
  function TextArea({ label, hint, error, required, className = "", ...props }) {
1941
1954
  const id = useId8();
1942
- return /* @__PURE__ */ jsx22(Frame, { ...{ id, label, hint, error, required }, children: /* @__PURE__ */ jsx22(
1955
+ return /* @__PURE__ */ jsx23(Frame, { ...{ id, label, hint, error, required }, children: /* @__PURE__ */ jsx23(
1943
1956
  "textarea",
1944
1957
  {
1945
1958
  rows: 4,
@@ -1952,7 +1965,7 @@ function TextArea({ label, hint, error, required, className = "", ...props }) {
1952
1965
  }
1953
1966
  function SelectField({ label, hint, error, required, className = "", children, ...props }) {
1954
1967
  const id = useId8();
1955
- return /* @__PURE__ */ jsx22(Frame, { ...{ id, label, hint, error, required }, children: /* @__PURE__ */ jsx22(
1968
+ return /* @__PURE__ */ jsx23(Frame, { ...{ id, label, hint, error, required }, children: /* @__PURE__ */ jsx23(
1956
1969
  "select",
1957
1970
  {
1958
1971
  ...props,
@@ -1981,7 +1994,7 @@ function FileField({ label, hint, error, required, disabled, onFileChange, class
1981
1994
  setFile(next);
1982
1995
  onFileChange?.(next);
1983
1996
  };
1984
- return /* @__PURE__ */ jsx22(Frame, { ...{ id, label, hint, error, required }, children: /* @__PURE__ */ jsxs18(
1997
+ return /* @__PURE__ */ jsx23(Frame, { ...{ id, label, hint, error, required }, children: /* @__PURE__ */ jsxs19(
1985
1998
  "div",
1986
1999
  {
1987
2000
  className: `ui-file${dragging && !disabled ? " is-dragging" : ""}${file ? " has-file" : ""}${error ? " is-invalid" : ""}${disabled ? " is-disabled" : ""}`,
@@ -2002,12 +2015,12 @@ function FileField({ label, hint, error, required, disabled, onFileChange, class
2002
2015
  update(transfer.files[0]);
2003
2016
  },
2004
2017
  children: [
2005
- /* @__PURE__ */ jsx22("span", { className: "ui-file__glyph", children: /* @__PURE__ */ jsx22(Icon, { name: "upload" }) }),
2006
- /* @__PURE__ */ jsx22("div", { "aria-live": "polite", children: file ? file.name : "Drop a file here" }),
2007
- /* @__PURE__ */ jsx22("div", { children: "or choose one from your device" }),
2008
- /* @__PURE__ */ jsxs18("span", { className: "ui-file__choose", children: [
2009
- /* @__PURE__ */ jsx22("span", { className: "ui-btn ui-btn--secondary ui-btn--sm", "aria-hidden": "true", "aria-disabled": disabled || void 0, children: file ? "Replace file" : "Choose file" }),
2010
- /* @__PURE__ */ jsx22(
2018
+ /* @__PURE__ */ jsx23("span", { className: "ui-file__glyph", children: /* @__PURE__ */ jsx23(Icon, { name: "upload" }) }),
2019
+ /* @__PURE__ */ jsx23("div", { "aria-live": "polite", children: file ? file.name : "Drop a file here" }),
2020
+ /* @__PURE__ */ jsx23("div", { children: "or choose one from your device" }),
2021
+ /* @__PURE__ */ jsxs19("span", { className: "ui-file__choose", children: [
2022
+ /* @__PURE__ */ jsx23("span", { className: "ui-btn ui-btn--secondary ui-btn--sm", "aria-hidden": "true", "aria-disabled": disabled || void 0, children: file ? "Replace file" : "Choose file" }),
2023
+ /* @__PURE__ */ jsx23(
2011
2024
  "input",
2012
2025
  {
2013
2026
  ...props,
@@ -2029,7 +2042,7 @@ function FileField({ label, hint, error, required, disabled, onFileChange, class
2029
2042
  // src/Toast.tsx
2030
2043
  import { createContext as createContext2, useCallback as useCallback3, useContext as useContext2, useEffect as useEffect8, useRef as useRef13, useState as useState8 } from "react";
2031
2044
  import { createPortal as createPortal4 } from "react-dom";
2032
- import { jsx as jsx23, jsxs as jsxs19 } from "react/jsx-runtime";
2045
+ import { jsx as jsx24, jsxs as jsxs20 } from "react/jsx-runtime";
2033
2046
  var Context = createContext2(null);
2034
2047
  var glyphs = { success: "circleCheck", danger: "circleX", warn: "circleAlert", info: "info", neutral: "bolt" };
2035
2048
  function useToast() {
@@ -2075,7 +2088,7 @@ function Notice({ notice, remove }) {
2075
2088
  remaining.current = Math.max(0, remaining.current - (Date.now() - started));
2076
2089
  };
2077
2090
  }, [dismiss, leaving2, notice.action, paused]);
2078
- return /* @__PURE__ */ jsxs19(
2091
+ return /* @__PURE__ */ jsxs20(
2079
2092
  "div",
2080
2093
  {
2081
2094
  ref: root,
@@ -2089,12 +2102,12 @@ function Notice({ notice, remove }) {
2089
2102
  if (!event.currentTarget.contains(event.relatedTarget)) setFocused(false);
2090
2103
  },
2091
2104
  children: [
2092
- /* @__PURE__ */ jsx23("span", { className: "ui-toast__icon", children: /* @__PURE__ */ jsx23(Icon, { name: glyphs[tone] }) }),
2093
- /* @__PURE__ */ jsxs19("div", { className: "ui-toast__body", children: [
2094
- /* @__PURE__ */ jsx23("div", { className: "ui-toast__title", children: notice.title }),
2095
- notice.text && /* @__PURE__ */ jsx23("div", { className: "ui-toast__text", children: notice.text })
2105
+ /* @__PURE__ */ jsx24("span", { className: "ui-toast__icon", children: /* @__PURE__ */ jsx24(Icon, { name: glyphs[tone] }) }),
2106
+ /* @__PURE__ */ jsxs20("div", { className: "ui-toast__body", children: [
2107
+ /* @__PURE__ */ jsx24("div", { className: "ui-toast__title", children: notice.title }),
2108
+ notice.text && /* @__PURE__ */ jsx24("div", { className: "ui-toast__text", children: notice.text })
2096
2109
  ] }),
2097
- notice.action && /* @__PURE__ */ jsx23(
2110
+ notice.action && /* @__PURE__ */ jsx24(
2098
2111
  "button",
2099
2112
  {
2100
2113
  type: "button",
@@ -2109,8 +2122,8 @@ function Notice({ notice, remove }) {
2109
2122
  children: notice.action.label
2110
2123
  }
2111
2124
  ),
2112
- /* @__PURE__ */ jsx23("button", { type: "button", className: "ui-toast__close", "aria-label": "Dismiss", disabled: leaving2, onClick: dismiss, children: /* @__PURE__ */ jsx23(Icon, { name: "x" }) }),
2113
- !notice.action && /* @__PURE__ */ jsx23(
2125
+ /* @__PURE__ */ jsx24("button", { type: "button", className: "ui-toast__close", "aria-label": "Dismiss", disabled: leaving2, onClick: dismiss, children: /* @__PURE__ */ jsx24(Icon, { name: "x" }) }),
2126
+ !notice.action && /* @__PURE__ */ jsx24(
2114
2127
  "span",
2115
2128
  {
2116
2129
  className: "ui-toast__timer is-running",
@@ -2130,10 +2143,10 @@ function Toast({ children }) {
2130
2143
  const remove = () => setEntries((current) => current.filter((entry) => entry.id !== id));
2131
2144
  setEntries((current) => [...current, { id, notice, remove }]);
2132
2145
  }, []);
2133
- return /* @__PURE__ */ jsxs19(Context.Provider, { value: push, children: [
2146
+ return /* @__PURE__ */ jsxs20(Context.Provider, { value: push, children: [
2134
2147
  children,
2135
2148
  typeof document !== "undefined" && createPortal4(
2136
- /* @__PURE__ */ jsx23("div", { className: "ui-toast-stack rx-toast-stack", children: entries.map((entry) => /* @__PURE__ */ jsx23(Notice, { notice: entry.notice, remove: entry.remove }, entry.id)) }),
2149
+ /* @__PURE__ */ jsx24("div", { className: "ui-toast-stack rx-toast-stack", children: entries.map((entry) => /* @__PURE__ */ jsx24(Notice, { notice: entry.notice, remove: entry.remove }, entry.id)) }),
2137
2150
  document.body
2138
2151
  )
2139
2152
  ] });
@@ -2147,6 +2160,7 @@ export {
2147
2160
  Badge,
2148
2161
  BusyRegion,
2149
2162
  Button,
2163
+ Callout,
2150
2164
  Card,
2151
2165
  CommandPalette,
2152
2166
  Confirm,
@@ -218,8 +218,10 @@ export function switchToggle({ checked = false, disabled = false, name, label =
218
218
  }
219
219
 
220
220
  // ---- Callout / toast / success ------------------------------------------
221
- export function callout({ variant, icon: ic = 'info', body } = {}) {
222
- return `<div class="${esc(cx('ui-callout', variant && `ui-callout--${variant}`))}"><span class="ui-callout__icon">${icon(ic)}</span><div>${body}</div></div>`;
221
+ export const calloutIcons = { info: 'info', success: 'check', warn: 'alert', danger: 'alert', neutral: 'info' };
222
+
223
+ export function callout({ variant, icon: ic = calloutIcons[variant] || 'info', body, actions } = {}) {
224
+ return `<div class="${esc(cx('ui-callout', variant && variant !== 'neutral' && `ui-callout--${variant}`))}"><span class="ui-callout__icon">${icon(ic)}</span><div class="ui-callout__body">${body}${actions != null ? `<div class="ui-toolbar ui-callout__actions">${actions}</div>` : ''}</div></div>`;
223
225
  }
224
226
  // Default icon per status — overridable with `icon`. The circle family is not
225
227
  // decoration: a circled glyph is a STATE the system reports, a bare one is an
@@ -12,6 +12,8 @@
12
12
  line-height: 1.55;
13
13
  color: var(--text);
14
14
  }
15
+ .ui-callout__body { min-width: 0; overflow-wrap: break-word; }
16
+ .ui-callout__actions { margin-top: 15px; }
15
17
  .ui-callout__icon { width: 18px; height: 18px; flex: none; margin-top: 1px; /* muted-ink: glyph — nonverbal callout icon */ color: var(--muted); }
16
18
  .ui-callout__icon svg { width: 100%; height: 100%; stroke: currentColor; fill: none; stroke-width: 2.1; } /* 2.1 of a 24 box drawn at 18px = 1.58 CSS px, which is what buys the 3:1 graphic bar rather than the 4.5:1 text one. docs/specification.md#icons-and-glyphs */
17
19
  .ui-callout b { color: var(--text); font-weight: var(--weight-semibold); }
@@ -21,6 +23,7 @@
21
23
  .ui-callout--info .ui-callout__icon { color: var(--chip-info-ink); } /* the chip inks, not the raw signals: in light the raw signal cleared the graphic bar by a tenth on its own wash and read as a smudge, and a stroke is read the way text is. The two are the same value in dark by construction, so only light moves. #206 */
22
24
  .ui-callout--success { --ring-gap: inherit; background: var(--glow-green); /* ring-gap: inherit — translucent wash retains the opaque containing gap. */ }
23
25
  .ui-callout--success .ui-callout__icon { color: var(--chip-success-ink); }
26
+ .ui-callout--success a { /* muted-ink: state — opaque accent/text blend keeps links above 4.5:1 on the success wash. */ color: color-mix(in srgb, var(--accent) 95%, var(--text)); }
24
27
  .ui-callout--warn { --ring-gap: inherit; background: color-mix(in srgb, var(--amber) 13%, transparent); /* ring-gap: inherit — translucent wash retains the opaque containing gap. */ }
25
28
  .ui-callout--warn .ui-callout__icon { color: var(--chip-warn-ink); }
26
29
  .ui-callout--danger { --ring-gap: inherit; background: var(--glow-pink); /* ring-gap: inherit — translucent wash retains the opaque containing gap. */ }