achery-ui 0.5.9 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -241,6 +241,13 @@ function Mark(props) {
241
241
  /* @__PURE__ */ jsxRuntime.jsx("polygon", { points: "56,50 47,58 47,52", stroke: "none" })
242
242
  ] });
243
243
  }
244
+ function Menu(props) {
245
+ return /* @__PURE__ */ jsxRuntime.jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.8", strokeLinecap: "round", ...props, children: [
246
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "3", y1: "7", x2: "21", y2: "7" }),
247
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "3", y1: "12", x2: "21", y2: "12" }),
248
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "3", y1: "17", x2: "21", y2: "17" })
249
+ ] });
250
+ }
244
251
  function Mercury(props) {
245
252
  return /* @__PURE__ */ jsxRuntime.jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.4", strokeLinecap: "round", strokeLinejoin: "round", ...props, children: [
246
253
  /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "12", cy: "9", r: "5" }),
@@ -282,6 +289,9 @@ function Sigil(props) {
282
289
  /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "24", cy: "24", r: "3" })
283
290
  ] });
284
291
  }
292
+ function Spinner(props) {
293
+ return /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.8", strokeLinecap: "round", ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 3a9 9 0 1 0 9 9" }) });
294
+ }
285
295
  function Sprig(props) {
286
296
  return /* @__PURE__ */ jsxRuntime.jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.4", strokeLinecap: "round", ...props, children: [
287
297
  /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 3v18" }),
@@ -332,13 +342,6 @@ function Wordmark(props) {
332
342
  /* @__PURE__ */ jsxRuntime.jsx("g", { transform: "translate(82,72)", fontFamily: "'Space Grotesk', sansSerif", fontWeight: "600", fontSize: "10", letterSpacing: "6", stroke: "none", children: /* @__PURE__ */ jsxRuntime.jsx("text", { x: "2", y: "0", children: "\u2014 W O R K S H O P \u2014" }) })
333
343
  ] });
334
344
  }
335
- function Menu(props) {
336
- return /* @__PURE__ */ jsxRuntime.jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.8", strokeLinecap: "round", ...props, children: [
337
- /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "3", y1: "7", x2: "21", y2: "7" }),
338
- /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "3", y1: "12", x2: "21", y2: "12" }),
339
- /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "3", y1: "17", x2: "21", y2: "17" })
340
- ] });
341
- }
342
345
  var glyphMap = {
343
346
  "arrow-right": ArrowRight,
344
347
  "arrow-up": ArrowUp,
@@ -365,6 +368,7 @@ var glyphMap = {
365
368
  "salt": Salt,
366
369
  "scroll": Scroll,
367
370
  "sigil": Sigil,
371
+ "spinner": Spinner,
368
372
  "sprig": Sprig,
369
373
  "square": Square,
370
374
  "star": Star,
@@ -473,45 +477,56 @@ function Badge({
473
477
  }
474
478
  );
475
479
  }
476
- var button = createRuntimeFn.createRuntimeFn({ defaultClassName: "Button_button__1torrqc0", variantClassNames: { variant: { primary: "Button_button_variant_primary__1torrqc1", secondary: "Button_button_variant_secondary__1torrqc2", accent: "Button_button_variant_accent__1torrqc3", ghost: "Button_button_variant_ghost__1torrqc4", danger: "Button_button_variant_danger__1torrqc5" }, size: { sm: "Button_button_size_sm__1torrqc6", md: "Button_button_size_md__1torrqc7" } }, defaultVariants: { variant: "secondary", size: "md" }, compoundVariants: [] });
477
- var kbdHint = "Button_kbdHint__1torrqc8";
480
+ var button = createRuntimeFn.createRuntimeFn({ defaultClassName: "Button_button__1torrqc2", variantClassNames: { variant: { primary: "Button_button_variant_primary__1torrqc3", secondary: "Button_button_variant_secondary__1torrqc4", accent: "Button_button_variant_accent__1torrqc5", ghost: "Button_button_variant_ghost__1torrqc6", danger: "Button_button_variant_danger__1torrqc7" }, size: { sm: "Button_button_size_sm__1torrqc8", md: "Button_button_size_md__1torrqc9" } }, defaultVariants: { variant: "secondary", size: "md" }, compoundVariants: [] });
481
+ var kbdHint = "Button_kbdHint__1torrqca";
482
+ var spinner = "Button_spinner__1torrqc1";
478
483
  function Button({
479
484
  variant = "secondary",
480
485
  size = "md",
481
486
  glyph: glyph2,
482
487
  glyphPosition = "start",
483
488
  kbd,
489
+ loading = false,
490
+ loadingLabel = "Loading\u2026",
484
491
  children,
485
492
  className,
486
493
  ...props
487
494
  }) {
488
495
  const glyphSize = size === "sm" ? 12 : 14;
489
- return /* @__PURE__ */ jsxRuntime.jsxs(
496
+ return /* @__PURE__ */ jsxRuntime.jsx(
490
497
  "button",
491
498
  {
492
499
  className: [button({ variant, size }), className].filter(Boolean).join(" "),
500
+ disabled: loading || props.disabled,
501
+ "aria-busy": loading || void 0,
493
502
  ...props,
494
- children: [
503
+ children: loading ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
504
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: spinner, "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx(Glyph, { name: "spinner", size: glyphSize }) }),
505
+ loadingLabel
506
+ ] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
495
507
  glyph2 && glyphPosition === "start" && /* @__PURE__ */ jsxRuntime.jsx(Glyph, { name: glyph2, size: glyphSize, "aria-hidden": "true" }),
496
508
  children,
497
509
  glyph2 && glyphPosition === "end" && /* @__PURE__ */ jsxRuntime.jsx(Glyph, { name: glyph2, size: glyphSize, "aria-hidden": "true" }),
498
510
  kbd && /* @__PURE__ */ jsxRuntime.jsx("span", { className: kbdHint, children: kbd })
499
- ]
511
+ ] })
500
512
  }
501
513
  );
502
514
  }
503
515
 
504
516
  // src/components/Toggle/Toggle.css.ts
505
- var label = "Toggle_label__trpmwc3";
506
- var thumb = "Toggle_thumb__trpmwc1";
507
- var track = "Toggle_track__trpmwc0";
508
- var wrapper = "Toggle_wrapper__trpmwc2";
517
+ var label = "Toggle_label__trpmwc4";
518
+ var statusIndicator = "Toggle_statusIndicator__trpmwc5";
519
+ var statusIndicatorVariants = { saving: "Toggle_statusIndicatorVariants_saving__trpmwc6", saved: "Toggle_statusIndicatorVariants_saved__trpmwc7", error: "Toggle_statusIndicatorVariants_error__trpmwc8" };
520
+ var thumb = "Toggle_thumb__trpmwc2";
521
+ var track = "Toggle_track__trpmwc1";
522
+ var wrapper = "Toggle_wrapper__trpmwc3";
509
523
  function Toggle({
510
524
  pressed,
511
525
  defaultPressed,
512
526
  onPressedChange,
513
527
  disabled,
514
528
  label: label4,
529
+ status,
515
530
  className,
516
531
  "aria-label": ariaLabel
517
532
  }) {
@@ -528,7 +543,8 @@ function Toggle({
528
543
  children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: thumb })
529
544
  }
530
545
  ),
531
- label4 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: label, children: label4 })
546
+ label4 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: label, children: label4 }),
547
+ status && status !== "idle" && /* @__PURE__ */ jsxRuntime.jsx("span", { className: [statusIndicator, statusIndicatorVariants[status]].join(" "), "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx(Glyph, { name: status === "saving" ? "spinner" : status === "saved" ? "tick" : "cross", size: 12 }) })
532
548
  ] });
533
549
  }
534
550
 
@@ -554,17 +570,24 @@ function Marginalia({
554
570
  }
555
571
 
556
572
  // src/components/Input/Input.css.ts
557
- var errorText = "Input_errorText__6w3tie3";
558
- var fieldRoot = "Input_fieldRoot__6w3tie0";
559
- var hint = "Input_hint__6w3tie2";
560
- var inputBase = "Input_inputBase__6w3tie4";
561
- var inputError = "Input_inputError__6w3tie5";
562
- var label2 = "Input_label__6w3tie1";
563
- var searchIcon = "Input_searchIcon__6w3tie9";
564
- var searchInput = "Input_searchInput__6w3tiea Input_inputBase__6w3tie4";
565
- var searchWrapper = "Input_searchWrapper__6w3tie8";
566
- var selectInput = "Input_selectInput__6w3tie7 Input_inputBase__6w3tie4";
567
- var textarea = "Input_textarea__6w3tie6 Input_inputBase__6w3tie4";
573
+ var errorText = "Input_errorText__6w3tie4";
574
+ var fieldRoot = "Input_fieldRoot__6w3tie1";
575
+ var hint = "Input_hint__6w3tie3";
576
+ var inputBase = "Input_inputBase__6w3tie5";
577
+ var inputError = "Input_inputError__6w3tie6";
578
+ var inputWithStatus = "Input_inputWithStatus__6w3tiea Input_inputBase__6w3tie5";
579
+ var inputWrapper = "Input_inputWrapper__6w3tie9";
580
+ var label2 = "Input_label__6w3tie2";
581
+ var searchIcon = "Input_searchIcon__6w3tiej";
582
+ var searchInput = "Input_searchInput__6w3tiek Input_inputBase__6w3tie5";
583
+ var searchWrapper = "Input_searchWrapper__6w3tiei";
584
+ var selectInput = "Input_selectInput__6w3tie8 Input_inputBase__6w3tie5";
585
+ var selectWithStatus = "Input_selectWithStatus__6w3tiec";
586
+ var statusIcon = "Input_statusIcon__6w3tied";
587
+ var statusIconTextarea = "Input_statusIconTextarea__6w3tiee Input_statusIcon__6w3tied";
588
+ var statusIconVariants = { saving: "Input_statusIconVariants_saving__6w3tief", saved: "Input_statusIconVariants_saved__6w3tieg", error: "Input_statusIconVariants_error__6w3tieh" };
589
+ var textarea = "Input_textarea__6w3tie7 Input_inputBase__6w3tie5";
590
+ var textareaWithStatus = "Input_textareaWithStatus__6w3tieb";
568
591
  function Field({ label: label4, hint: hint2, error, children, className }) {
569
592
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: [fieldRoot, className].filter(Boolean).join(" "), children: [
570
593
  label4 && /* @__PURE__ */ jsxRuntime.jsx("label", { className: label2, children: label4 }),
@@ -573,33 +596,73 @@ function Field({ label: label4, hint: hint2, error, children, className }) {
573
596
  !error && hint2 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: hint, children: hint2 })
574
597
  ] });
575
598
  }
576
- function Input({ error, className, ...props }) {
577
- return /* @__PURE__ */ jsxRuntime.jsx(
578
- "input",
579
- {
580
- className: [inputBase, error && inputError, className].filter(Boolean).join(" "),
581
- ...props
582
- }
583
- );
599
+ function Input({ error, status, className, ...props }) {
600
+ const hasStatus = status && status !== "idle";
601
+ if (!hasStatus) {
602
+ return /* @__PURE__ */ jsxRuntime.jsx(
603
+ "input",
604
+ {
605
+ className: [inputBase, error && inputError, className].filter(Boolean).join(" "),
606
+ ...props
607
+ }
608
+ );
609
+ }
610
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: [inputWrapper, className].filter(Boolean).join(" "), children: [
611
+ /* @__PURE__ */ jsxRuntime.jsx(
612
+ "input",
613
+ {
614
+ className: [inputBase, inputWithStatus, error && inputError].filter(Boolean).join(" "),
615
+ ...props
616
+ }
617
+ ),
618
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: [statusIcon, statusIconVariants[status]].join(" "), "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx(Glyph, { name: status === "saving" ? "spinner" : status === "saved" ? "tick" : "cross", size: 12 }) })
619
+ ] });
584
620
  }
585
- function Textarea({ error, className, ...props }) {
586
- return /* @__PURE__ */ jsxRuntime.jsx(
587
- "textarea",
588
- {
589
- className: [textarea, error && inputError, className].filter(Boolean).join(" "),
590
- ...props
591
- }
592
- );
621
+ function Textarea({ error, status, className, ...props }) {
622
+ const hasStatus = status && status !== "idle";
623
+ if (!hasStatus) {
624
+ return /* @__PURE__ */ jsxRuntime.jsx(
625
+ "textarea",
626
+ {
627
+ className: [textarea, error && inputError, className].filter(Boolean).join(" "),
628
+ ...props
629
+ }
630
+ );
631
+ }
632
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: [inputWrapper, className].filter(Boolean).join(" "), children: [
633
+ /* @__PURE__ */ jsxRuntime.jsx(
634
+ "textarea",
635
+ {
636
+ className: [textarea, textareaWithStatus, error && inputError].filter(Boolean).join(" "),
637
+ ...props
638
+ }
639
+ ),
640
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: [statusIconTextarea, statusIconVariants[status]].join(" "), "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx(Glyph, { name: status === "saving" ? "spinner" : status === "saved" ? "tick" : "cross", size: 12 }) })
641
+ ] });
593
642
  }
594
- function Select({ error, children, className, ...props }) {
595
- return /* @__PURE__ */ jsxRuntime.jsx(
596
- "select",
597
- {
598
- className: [selectInput, error && inputError, className].filter(Boolean).join(" "),
599
- ...props,
600
- children
601
- }
602
- );
643
+ function Select({ error, status, children, className, ...props }) {
644
+ const hasStatus = status && status !== "idle";
645
+ if (!hasStatus) {
646
+ return /* @__PURE__ */ jsxRuntime.jsx(
647
+ "select",
648
+ {
649
+ className: [selectInput, error && inputError, className].filter(Boolean).join(" "),
650
+ ...props,
651
+ children
652
+ }
653
+ );
654
+ }
655
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: [inputWrapper, className].filter(Boolean).join(" "), children: [
656
+ /* @__PURE__ */ jsxRuntime.jsx(
657
+ "select",
658
+ {
659
+ className: [selectInput, selectWithStatus, error && inputError].filter(Boolean).join(" "),
660
+ ...props,
661
+ children
662
+ }
663
+ ),
664
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: [statusIcon, statusIconVariants[status]].join(" "), "aria-hidden": "true", style: { right: "28px" }, children: /* @__PURE__ */ jsxRuntime.jsx(Glyph, { name: status === "saving" ? "spinner" : status === "saved" ? "tick" : "cross", size: 12 }) })
665
+ ] });
603
666
  }
604
667
  function SearchInput({ className, ...props }) {
605
668
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: [searchWrapper, className].filter(Boolean).join(" "), children: [
@@ -861,12 +924,66 @@ function NavItem({ item: item2, active, onClick, renderLink, collapsed }) {
861
924
  );
862
925
  }
863
926
 
927
+ // src/components/Skeleton/Skeleton.css.ts
928
+ var block = "Skeleton_block__112laiw3 Skeleton_skeleton__112laiw1";
929
+ var line = "Skeleton_line__112laiw2 Skeleton_skeleton__112laiw1";
930
+ var Skeleton = ({ lines = 1, width = "100%", block: block2 = false, height, style, className }) => {
931
+ if (block2) {
932
+ return /* @__PURE__ */ jsxRuntime.jsx(
933
+ "span",
934
+ {
935
+ className: [block, className].filter(Boolean).join(" "),
936
+ style: height ? { height, ...style } : style,
937
+ "aria-hidden": "true"
938
+ }
939
+ );
940
+ }
941
+ const widths = Array.isArray(width) ? width : Array.from({ length: lines }, () => width);
942
+ if (lines === 1) {
943
+ return /* @__PURE__ */ jsxRuntime.jsx(
944
+ "span",
945
+ {
946
+ className: [line, className].filter(Boolean).join(" "),
947
+ style: widths[0] !== "100%" ? { width: widths[0], ...style } : style,
948
+ "aria-hidden": "true"
949
+ }
950
+ );
951
+ }
952
+ return /* @__PURE__ */ jsxRuntime.jsx(
953
+ "span",
954
+ {
955
+ style: { display: "flex", flexDirection: "column", gap: "6px", width: "100%" },
956
+ "aria-hidden": "true",
957
+ children: Array.from({ length: lines }, (_, i) => /* @__PURE__ */ jsxRuntime.jsx(
958
+ "span",
959
+ {
960
+ className: line,
961
+ style: widths[i] !== "100%" ? { width: widths[i] } : void 0
962
+ },
963
+ i
964
+ ))
965
+ }
966
+ );
967
+ };
968
+
864
969
  // src/components/ProgressBar/ProgressBar.css.ts
865
970
  var fill = "ProgressBar_fill__1686i1k3";
866
971
  var fillTone = { neutral: "ProgressBar_fillTone_neutral__1686i1k4", accent: "ProgressBar_fillTone_accent__1686i1k5" };
867
972
  var track2 = "ProgressBar_track__1686i1k0";
868
973
  var trackSize = { sm: "ProgressBar_trackSize_sm__1686i1k1", md: "ProgressBar_trackSize_md__1686i1k2" };
869
- function ProgressBar({ value: value2, size = "md", tone = "neutral", className }) {
974
+ var trackHeightPx = { sm: "4px", md: "8px" };
975
+ function ProgressBar({ value: value2, size = "md", tone = "neutral", loading = false, className }) {
976
+ if (loading) {
977
+ return /* @__PURE__ */ jsxRuntime.jsx(
978
+ Skeleton,
979
+ {
980
+ block: true,
981
+ height: trackHeightPx[size],
982
+ className,
983
+ style: { borderRadius: 0 }
984
+ }
985
+ );
986
+ }
870
987
  const pct = Math.min(100, Math.max(0, value2));
871
988
  return /* @__PURE__ */ jsxRuntime.jsx(
872
989
  "div",
@@ -888,7 +1005,20 @@ function ProgressBar({ value: value2, size = "md", tone = "neutral", className }
888
1005
  }
889
1006
  var avatar = createRuntimeFn.createRuntimeFn({ defaultClassName: "Avatar_avatar__16f6qlf0", variantClassNames: { size: { sm: "Avatar_avatar_size_sm__16f6qlf1", md: "Avatar_avatar_size_md__16f6qlf2", lg: "Avatar_avatar_size_lg__16f6qlf3" }, tone: { moss: "Avatar_avatar_tone_moss__16f6qlf4", neutral: "Avatar_avatar_tone_neutral__16f6qlf5" } }, defaultVariants: { size: "md", tone: "neutral" }, compoundVariants: [] });
890
1007
  var initials = "Avatar_initials__16f6qlf6";
891
- function Avatar({ initials: initials2, size = "md", tone = "neutral", className }) {
1008
+ var avatarPx = { sm: "24px", md: "32px", lg: "40px" };
1009
+ function Avatar({ initials: initials2, size = "md", tone = "neutral", loading = false, className }) {
1010
+ if (loading) {
1011
+ const px = avatarPx[size];
1012
+ return /* @__PURE__ */ jsxRuntime.jsx(
1013
+ Skeleton,
1014
+ {
1015
+ block: true,
1016
+ height: px,
1017
+ className,
1018
+ style: { width: px, borderRadius: "50%", flexShrink: 0 }
1019
+ }
1020
+ );
1021
+ }
892
1022
  const display2 = initials2.slice(0, 2).toUpperCase();
893
1023
  return /* @__PURE__ */ jsxRuntime.jsx(
894
1024
  "span",
@@ -1031,6 +1161,7 @@ var thSortable = "Table_thSortable__1a2tbys5 Table_th__1a2tbys4";
1031
1161
  var thead = "Table_thead__1a2tbys3";
1032
1162
  var toolbar = "Table_toolbar__1a2tbysa";
1033
1163
  var tr = "Table_tr__1a2tbys7";
1164
+ var skeletonWidths = ["75%", "90%", "65%", "85%", "70%", "95%", "60%", "80%"];
1034
1165
  function buildPageWindow(current, total, window2) {
1035
1166
  const pages = /* @__PURE__ */ new Set();
1036
1167
  pages.add(0);
@@ -1068,6 +1199,7 @@ function Table({
1068
1199
  height,
1069
1200
  toolbar: toolbar2,
1070
1201
  emptyState: emptyState2,
1202
+ loading = false,
1071
1203
  className
1072
1204
  }) {
1073
1205
  const [internalSortKey, setInternalSortKey] = react.useState(defaultSortKey ?? null);
@@ -1128,7 +1260,7 @@ function Table({
1128
1260
  },
1129
1261
  col.key
1130
1262
  )) }) }),
1131
- /* @__PURE__ */ jsxRuntime.jsx("tbody", { children: data.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("tr", { children: /* @__PURE__ */ jsxRuntime.jsx("td", { colSpan: columns.length, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: emptyState, children: emptyState2 ?? "No data." }) }) }) : sortedData.map((row) => {
1263
+ /* @__PURE__ */ jsxRuntime.jsx("tbody", { children: loading ? Array.from({ length: pageSize ?? 10 }, (_, i) => /* @__PURE__ */ jsxRuntime.jsx("tr", { className: tr, "aria-hidden": "true", children: columns.map((col) => /* @__PURE__ */ jsxRuntime.jsx("td", { className: col.mono ? tdMono : td, children: /* @__PURE__ */ jsxRuntime.jsx(Skeleton, { width: col.width ? "80%" : skeletonWidths[i % skeletonWidths.length] }) }, col.key)) }, i)) : data.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("tr", { children: /* @__PURE__ */ jsxRuntime.jsx("td", { colSpan: columns.length, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: emptyState, children: emptyState2 ?? "No data." }) }) }) : sortedData.map((row) => {
1132
1264
  const key = rowKey(row);
1133
1265
  const isSelected = selectedKeys?.includes(key) ?? false;
1134
1266
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -1136,7 +1268,11 @@ function Table({
1136
1268
  {
1137
1269
  className: tr,
1138
1270
  "data-selected": isSelected,
1139
- onClick: onRowClick ? () => onRowClick(key, row) : void 0,
1271
+ onClick: onRowClick ? (e) => {
1272
+ const target = e.target;
1273
+ if (target.closest('a, button, input, select, textarea, [role="checkbox"], [role="button"]')) return;
1274
+ onRowClick(key, row);
1275
+ } : void 0,
1140
1276
  style: onRowClick ? { cursor: "pointer" } : void 0,
1141
1277
  children: columns.map((col) => /* @__PURE__ */ jsxRuntime.jsx("td", { className: col.mono ? tdMono : td, children: col.render ? col.render(row) : String(row[col.key] ?? "") }, col.key))
1142
1278
  },
@@ -1291,10 +1427,12 @@ function ToastProvider({ children }) {
1291
1427
  }
1292
1428
 
1293
1429
  // src/components/Checkbox/Checkbox.css.ts
1294
- var indicator = "Checkbox_indicator__nnmycq2";
1295
- var label3 = "Checkbox_label__nnmycq3";
1296
- var root = "Checkbox_root__nnmycq1";
1297
- var wrapper2 = "Checkbox_wrapper__nnmycq0";
1430
+ var indicator = "Checkbox_indicator__nnmycq3";
1431
+ var label3 = "Checkbox_label__nnmycq4";
1432
+ var root = "Checkbox_root__nnmycq2";
1433
+ var statusIndicator2 = "Checkbox_statusIndicator__nnmycq5";
1434
+ var statusIndicatorVariants2 = { saving: "Checkbox_statusIndicatorVariants_saving__nnmycq6", saved: "Checkbox_statusIndicatorVariants_saved__nnmycq7", error: "Checkbox_statusIndicatorVariants_error__nnmycq8" };
1435
+ var wrapper2 = "Checkbox_wrapper__nnmycq1";
1298
1436
  function Checkbox({
1299
1437
  checked,
1300
1438
  defaultChecked,
@@ -1302,6 +1440,7 @@ function Checkbox({
1302
1440
  disabled,
1303
1441
  label: label4,
1304
1442
  id,
1443
+ status,
1305
1444
  className,
1306
1445
  "aria-label": ariaLabel
1307
1446
  }) {
@@ -1320,7 +1459,8 @@ function Checkbox({
1320
1459
  children: /* @__PURE__ */ jsxRuntime.jsx(RadixCheckbox__namespace.Indicator, { className: indicator, children: checked === "indeterminate" ? /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "10", height: "2", viewBox: "0 0 10 2", fill: "currentColor", children: /* @__PURE__ */ jsxRuntime.jsx("rect", { width: "10", height: "2", rx: "1" }) }) : /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "10", height: "8", viewBox: "0 0 10 8", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "1,4 4,7 9,1" }) }) })
1321
1460
  }
1322
1461
  ),
1323
- label4 && /* @__PURE__ */ jsxRuntime.jsx("label", { htmlFor: resolvedId, className: label3, style: { cursor: disabled ? "not-allowed" : "pointer" }, children: label4 })
1462
+ label4 && /* @__PURE__ */ jsxRuntime.jsx("label", { htmlFor: resolvedId, className: label3, style: { cursor: disabled ? "not-allowed" : "pointer" }, children: label4 }),
1463
+ status && status !== "idle" && /* @__PURE__ */ jsxRuntime.jsx("span", { className: [statusIndicator2, statusIndicatorVariants2[status]].join(" "), "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx(Glyph, { name: status === "saving" ? "spinner" : status === "saved" ? "tick" : "cross", size: 12 }) })
1324
1464
  ] });
1325
1465
  }
1326
1466
 
@@ -1365,7 +1505,10 @@ function Menu2({ trigger: trigger2, items, side = "bottom", align = "end", class
1365
1505
  }
1366
1506
 
1367
1507
  // src/components/DatePicker/DatePicker.css.ts
1368
- var input = "DatePicker_input__1etdrw70";
1508
+ var input = "DatePicker_input__1etdrw71";
1509
+ var statusIcon2 = "DatePicker_statusIcon__1etdrw73";
1510
+ var statusIconVariants2 = { saving: "DatePicker_statusIconVariants_saving__1etdrw74", saved: "DatePicker_statusIconVariants_saved__1etdrw75", error: "DatePicker_statusIconVariants_error__1etdrw76" };
1511
+ var wrapper3 = "DatePicker_wrapper__1etdrw72";
1369
1512
  function DatePicker({
1370
1513
  type = "date",
1371
1514
  value: value2,
@@ -1374,11 +1517,13 @@ function DatePicker({
1374
1517
  max,
1375
1518
  disabled,
1376
1519
  error,
1520
+ status,
1377
1521
  placeholder,
1378
1522
  className,
1379
1523
  ...rest
1380
1524
  }) {
1381
- return /* @__PURE__ */ jsxRuntime.jsx(
1525
+ const hasStatus = status && status !== "idle";
1526
+ const input3 = /* @__PURE__ */ jsxRuntime.jsx(
1382
1527
  "input",
1383
1528
  {
1384
1529
  type,
@@ -1389,10 +1534,16 @@ function DatePicker({
1389
1534
  disabled,
1390
1535
  placeholder,
1391
1536
  "data-error": error || void 0,
1392
- className: [input, className].filter(Boolean).join(" "),
1537
+ "data-has-status": hasStatus || void 0,
1538
+ className: [input, !hasStatus && className].filter(Boolean).join(" "),
1393
1539
  ...rest
1394
1540
  }
1395
1541
  );
1542
+ if (!hasStatus) return input3;
1543
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: [wrapper3, className].filter(Boolean).join(" "), children: [
1544
+ input3,
1545
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: [statusIcon2, statusIconVariants2[status]].join(" "), "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx(Glyph, { name: status === "saving" ? "spinner" : status === "saved" ? "tick" : "cross", size: 12 }) })
1546
+ ] });
1396
1547
  }
1397
1548
 
1398
1549
  // src/components/Combobox/Combobox.css.ts
@@ -1403,7 +1554,7 @@ var option = "Combobox_option__1irfr5o7";
1403
1554
  var optionCheck = "Combobox_optionCheck__1irfr5o8";
1404
1555
  var popover = "Combobox_popover__1irfr5o6";
1405
1556
  var trigger = "Combobox_trigger__1irfr5o1";
1406
- var wrapper3 = "Combobox_wrapper__1irfr5o0";
1557
+ var wrapper4 = "Combobox_wrapper__1irfr5o0";
1407
1558
  function Combobox({
1408
1559
  value: value2,
1409
1560
  onChange,
@@ -1473,7 +1624,7 @@ function Combobox({
1473
1624
  return /* @__PURE__ */ jsxRuntime.jsxs(
1474
1625
  "div",
1475
1626
  {
1476
- className: [wrapper3, className].filter(Boolean).join(" "),
1627
+ className: [wrapper4, className].filter(Boolean).join(" "),
1477
1628
  onClick: () => {
1478
1629
  if (!disabled) inputRef.current?.focus();
1479
1630
  },
@@ -1621,7 +1772,7 @@ function SingleCombobox({
1621
1772
  return /* @__PURE__ */ jsxRuntime.jsxs(
1622
1773
  "div",
1623
1774
  {
1624
- className: [wrapper3, className].filter(Boolean).join(" "),
1775
+ className: [wrapper4, className].filter(Boolean).join(" "),
1625
1776
  onClick: () => {
1626
1777
  if (!disabled) inputRef.current?.focus();
1627
1778
  },
@@ -1820,7 +1971,7 @@ function Sparkline({
1820
1971
  // src/components/KpiTile/KpiTile.css.ts
1821
1972
  var inner = "KpiTile_inner__1yi98c61";
1822
1973
  var value = "KpiTile_value__1yi98c62";
1823
- var wrapper4 = "KpiTile_wrapper__1yi98c60";
1974
+ var wrapper5 = "KpiTile_wrapper__1yi98c60";
1824
1975
  var deltaToneToBadge = {
1825
1976
  positive: "saved",
1826
1977
  negative: "stopped",
@@ -1833,16 +1984,22 @@ function KpiTile({
1833
1984
  deltaTone = "neutral",
1834
1985
  sparkData,
1835
1986
  onClick,
1987
+ loading = false,
1836
1988
  className
1837
1989
  }) {
1838
1990
  const inner2 = /* @__PURE__ */ jsxRuntime.jsx(Card, { variant: "stamp", padding: "md", ...className !== void 0 ? { className } : {}, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: inner, children: [
1839
1991
  /* @__PURE__ */ jsxRuntime.jsx(Eyebrow, { children: label4 }),
1840
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: value, children: value2 }),
1841
- delta && /* @__PURE__ */ jsxRuntime.jsx(Badge, { tone: deltaToneToBadge[deltaTone], dot: true, children: delta }),
1842
- sparkData && sparkData.length >= 2 && /* @__PURE__ */ jsxRuntime.jsx(Sparkline, { data: sparkData, tone: deltaTone, width: 80, height: 24 })
1992
+ loading ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1993
+ /* @__PURE__ */ jsxRuntime.jsx(Skeleton, { width: "55%" }),
1994
+ /* @__PURE__ */ jsxRuntime.jsx(Skeleton, { width: "70%" })
1995
+ ] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1996
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: value, children: value2 }),
1997
+ delta && /* @__PURE__ */ jsxRuntime.jsx(Badge, { tone: deltaToneToBadge[deltaTone], dot: true, children: delta }),
1998
+ sparkData && sparkData.length >= 2 && /* @__PURE__ */ jsxRuntime.jsx(Sparkline, { data: sparkData, tone: deltaTone, width: 80, height: 24 })
1999
+ ] })
1843
2000
  ] }) });
1844
2001
  if (onClick) {
1845
- return /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick, className: wrapper4, children: inner2 });
2002
+ return /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick, className: wrapper5, children: inner2 });
1846
2003
  }
1847
2004
  return inner2;
1848
2005
  }
@@ -1896,6 +2053,7 @@ exports.SearchInput = SearchInput;
1896
2053
  exports.Select = Select;
1897
2054
  exports.Sidebar = Sidebar;
1898
2055
  exports.SingleCombobox = SingleCombobox;
2056
+ exports.Skeleton = Skeleton;
1899
2057
  exports.Sparkline = Sparkline;
1900
2058
  exports.StatePill = StatePill;
1901
2059
  exports.Table = Table;