achery-ui 0.5.8 → 0.6.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/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);
@@ -1065,8 +1196,10 @@ function Table({
1065
1196
  onPageSizeChange,
1066
1197
  pageSizeOptions,
1067
1198
  paginationWindow = 2,
1199
+ height,
1068
1200
  toolbar: toolbar2,
1069
1201
  emptyState: emptyState2,
1202
+ loading = false,
1070
1203
  className
1071
1204
  }) {
1072
1205
  const [internalSortKey, setInternalSortKey] = react.useState(defaultSortKey ?? null);
@@ -1100,81 +1233,88 @@ function Table({
1100
1233
  const totalPages = pageSize && totalRows ? Math.ceil(totalRows / pageSize) : null;
1101
1234
  const isFirstPage = pageIndex === 0;
1102
1235
  const isLastPage = totalPages !== null ? pageIndex >= totalPages - 1 : true;
1103
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: [tableWrapper, className].filter(Boolean).join(" "), children: [
1104
- toolbar2 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: toolbar, children: toolbar2 }),
1105
- /* @__PURE__ */ jsxRuntime.jsx(
1106
- "div",
1107
- {
1108
- className: tableScroll,
1109
- style: pageSize ? { minHeight: 37 + pageSize * 38 } : void 0,
1110
- children: /* @__PURE__ */ jsxRuntime.jsxs("table", { className: table, children: [
1111
- /* @__PURE__ */ jsxRuntime.jsx("thead", { className: thead, children: /* @__PURE__ */ jsxRuntime.jsx("tr", { children: columns.map((col) => /* @__PURE__ */ jsxRuntime.jsxs(
1112
- "th",
1236
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1237
+ "div",
1238
+ {
1239
+ className: [tableWrapper, className].filter(Boolean).join(" "),
1240
+ style: height ? { height, display: "flex", flexDirection: "column" } : void 0,
1241
+ children: [
1242
+ toolbar2 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: toolbar, children: toolbar2 }),
1243
+ /* @__PURE__ */ jsxRuntime.jsx(
1244
+ "div",
1245
+ {
1246
+ className: tableScroll,
1247
+ style: height ? { flex: 1, overflowY: "auto", minHeight: 0 } : pageSize ? { minHeight: 37 + pageSize * 38 } : void 0,
1248
+ children: /* @__PURE__ */ jsxRuntime.jsxs("table", { className: table, children: [
1249
+ /* @__PURE__ */ jsxRuntime.jsx("thead", { className: thead, children: /* @__PURE__ */ jsxRuntime.jsx("tr", { children: columns.map((col) => /* @__PURE__ */ jsxRuntime.jsxs(
1250
+ "th",
1251
+ {
1252
+ className: col.sortable ? thSortable : th,
1253
+ style: col.width ? { width: col.width } : void 0,
1254
+ onClick: col.sortable ? () => handleSort(col.key) : void 0,
1255
+ "aria-sort": activeSortKey === col.key ? activeSortDir === "asc" ? "ascending" : "descending" : void 0,
1256
+ children: [
1257
+ col.label,
1258
+ col.sortable && activeSortKey === col.key && activeSortDir && /* @__PURE__ */ jsxRuntime.jsx("span", { className: sortIndicator, "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx(Glyph, { name: activeSortDir === "asc" ? "arrow-up" : "arrow-right", size: 10 }) })
1259
+ ]
1260
+ },
1261
+ col.key
1262
+ )) }) }),
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) => {
1264
+ const key = rowKey(row);
1265
+ const isSelected = selectedKeys?.includes(key) ?? false;
1266
+ return /* @__PURE__ */ jsxRuntime.jsx(
1267
+ "tr",
1268
+ {
1269
+ className: tr,
1270
+ "data-selected": isSelected,
1271
+ onClick: onRowClick ? () => onRowClick(key, row) : void 0,
1272
+ style: onRowClick ? { cursor: "pointer" } : void 0,
1273
+ 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))
1274
+ },
1275
+ key
1276
+ );
1277
+ }) })
1278
+ ] })
1279
+ }
1280
+ ),
1281
+ pageSize && totalPages !== null && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: pagination, children: [
1282
+ pageSizeOptions && /* @__PURE__ */ jsxRuntime.jsx(
1283
+ "select",
1113
1284
  {
1114
- className: col.sortable ? thSortable : th,
1115
- style: col.width ? { width: col.width } : void 0,
1116
- onClick: col.sortable ? () => handleSort(col.key) : void 0,
1117
- "aria-sort": activeSortKey === col.key ? activeSortDir === "asc" ? "ascending" : "descending" : void 0,
1118
- children: [
1119
- col.label,
1120
- col.sortable && activeSortKey === col.key && activeSortDir && /* @__PURE__ */ jsxRuntime.jsx("span", { className: sortIndicator, "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx(Glyph, { name: activeSortDir === "asc" ? "arrow-up" : "arrow-right", size: 10 }) })
1121
- ]
1122
- },
1123
- col.key
1124
- )) }) }),
1125
- /* @__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) => {
1126
- const key = rowKey(row);
1127
- const isSelected = selectedKeys?.includes(key) ?? false;
1128
- return /* @__PURE__ */ jsxRuntime.jsx(
1129
- "tr",
1130
- {
1131
- className: tr,
1132
- "data-selected": isSelected,
1133
- onClick: onRowClick ? () => onRowClick(key, row) : void 0,
1134
- style: onRowClick ? { cursor: "pointer" } : void 0,
1135
- 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))
1136
- },
1137
- key
1138
- );
1139
- }) })
1285
+ className: pageSizeSelect,
1286
+ value: pageSize,
1287
+ onChange: (e) => onPageSizeChange?.(Number(e.target.value)),
1288
+ "aria-label": "Rows per page",
1289
+ children: pageSizeOptions.map((n) => /* @__PURE__ */ jsxRuntime.jsxs("option", { value: n, children: [
1290
+ n,
1291
+ " / page"
1292
+ ] }, n))
1293
+ }
1294
+ ),
1295
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: paginationControls, children: [
1296
+ /* @__PURE__ */ jsxRuntime.jsx("button", { className: pageNavButton, onClick: () => onPageChange?.(0), disabled: isFirstPage, "aria-label": "First page", children: "\xAB" }),
1297
+ /* @__PURE__ */ jsxRuntime.jsx("button", { className: pageNavButton, onClick: () => onPageChange?.(pageIndex - 1), disabled: isFirstPage, "aria-label": "Previous page", children: "\u2039" }),
1298
+ buildPageWindow(pageIndex, totalPages, paginationWindow).map(
1299
+ (entry, i) => entry === null ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: paginationEllipsis, children: "\u2026" }, `ellipsis-${i}`) : /* @__PURE__ */ jsxRuntime.jsx(
1300
+ "button",
1301
+ {
1302
+ className: entry === pageIndex ? pageButtonActive : pageButton,
1303
+ onClick: () => onPageChange?.(entry),
1304
+ "aria-label": `Page ${entry + 1}`,
1305
+ "aria-current": entry === pageIndex ? "page" : void 0,
1306
+ children: entry + 1
1307
+ },
1308
+ entry
1309
+ )
1310
+ ),
1311
+ /* @__PURE__ */ jsxRuntime.jsx("button", { className: pageNavButton, onClick: () => onPageChange?.(pageIndex + 1), disabled: isLastPage, "aria-label": "Next page", children: "\u203A" }),
1312
+ /* @__PURE__ */ jsxRuntime.jsx("button", { className: pageNavButton, onClick: () => onPageChange?.(totalPages - 1), disabled: isLastPage, "aria-label": "Last page", children: "\xBB" })
1313
+ ] })
1140
1314
  ] })
1141
- }
1142
- ),
1143
- pageSize && totalPages !== null && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: pagination, children: [
1144
- pageSizeOptions && /* @__PURE__ */ jsxRuntime.jsx(
1145
- "select",
1146
- {
1147
- className: pageSizeSelect,
1148
- value: pageSize,
1149
- onChange: (e) => onPageSizeChange?.(Number(e.target.value)),
1150
- "aria-label": "Rows per page",
1151
- children: pageSizeOptions.map((n) => /* @__PURE__ */ jsxRuntime.jsxs("option", { value: n, children: [
1152
- n,
1153
- " / page"
1154
- ] }, n))
1155
- }
1156
- ),
1157
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: paginationControls, children: [
1158
- /* @__PURE__ */ jsxRuntime.jsx("button", { className: pageNavButton, onClick: () => onPageChange?.(0), disabled: isFirstPage, "aria-label": "First page", children: "\xAB" }),
1159
- /* @__PURE__ */ jsxRuntime.jsx("button", { className: pageNavButton, onClick: () => onPageChange?.(pageIndex - 1), disabled: isFirstPage, "aria-label": "Previous page", children: "\u2039" }),
1160
- buildPageWindow(pageIndex, totalPages, paginationWindow).map(
1161
- (entry, i) => entry === null ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: paginationEllipsis, children: "\u2026" }, `ellipsis-${i}`) : /* @__PURE__ */ jsxRuntime.jsx(
1162
- "button",
1163
- {
1164
- className: entry === pageIndex ? pageButtonActive : pageButton,
1165
- onClick: () => onPageChange?.(entry),
1166
- "aria-label": `Page ${entry + 1}`,
1167
- "aria-current": entry === pageIndex ? "page" : void 0,
1168
- children: entry + 1
1169
- },
1170
- entry
1171
- )
1172
- ),
1173
- /* @__PURE__ */ jsxRuntime.jsx("button", { className: pageNavButton, onClick: () => onPageChange?.(pageIndex + 1), disabled: isLastPage, "aria-label": "Next page", children: "\u203A" }),
1174
- /* @__PURE__ */ jsxRuntime.jsx("button", { className: pageNavButton, onClick: () => onPageChange?.(totalPages - 1), disabled: isLastPage, "aria-label": "Last page", children: "\xBB" })
1175
- ] })
1176
- ] })
1177
- ] });
1315
+ ]
1316
+ }
1317
+ );
1178
1318
  }
1179
1319
  var body2 = "Modal_body__1kcb5si8";
1180
1320
  var bodyScrollable = "Modal_bodyScrollable__1kcb5sie";
@@ -1283,10 +1423,12 @@ function ToastProvider({ children }) {
1283
1423
  }
1284
1424
 
1285
1425
  // src/components/Checkbox/Checkbox.css.ts
1286
- var indicator = "Checkbox_indicator__nnmycq2";
1287
- var label3 = "Checkbox_label__nnmycq3";
1288
- var root = "Checkbox_root__nnmycq1";
1289
- var wrapper2 = "Checkbox_wrapper__nnmycq0";
1426
+ var indicator = "Checkbox_indicator__nnmycq3";
1427
+ var label3 = "Checkbox_label__nnmycq4";
1428
+ var root = "Checkbox_root__nnmycq2";
1429
+ var statusIndicator2 = "Checkbox_statusIndicator__nnmycq5";
1430
+ var statusIndicatorVariants2 = { saving: "Checkbox_statusIndicatorVariants_saving__nnmycq6", saved: "Checkbox_statusIndicatorVariants_saved__nnmycq7", error: "Checkbox_statusIndicatorVariants_error__nnmycq8" };
1431
+ var wrapper2 = "Checkbox_wrapper__nnmycq1";
1290
1432
  function Checkbox({
1291
1433
  checked,
1292
1434
  defaultChecked,
@@ -1294,6 +1436,7 @@ function Checkbox({
1294
1436
  disabled,
1295
1437
  label: label4,
1296
1438
  id,
1439
+ status,
1297
1440
  className,
1298
1441
  "aria-label": ariaLabel
1299
1442
  }) {
@@ -1312,7 +1455,8 @@ function Checkbox({
1312
1455
  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" }) }) })
1313
1456
  }
1314
1457
  ),
1315
- label4 && /* @__PURE__ */ jsxRuntime.jsx("label", { htmlFor: resolvedId, className: label3, style: { cursor: disabled ? "not-allowed" : "pointer" }, children: label4 })
1458
+ label4 && /* @__PURE__ */ jsxRuntime.jsx("label", { htmlFor: resolvedId, className: label3, style: { cursor: disabled ? "not-allowed" : "pointer" }, children: label4 }),
1459
+ 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 }) })
1316
1460
  ] });
1317
1461
  }
1318
1462
 
@@ -1357,7 +1501,10 @@ function Menu2({ trigger: trigger2, items, side = "bottom", align = "end", class
1357
1501
  }
1358
1502
 
1359
1503
  // src/components/DatePicker/DatePicker.css.ts
1360
- var input = "DatePicker_input__1etdrw70";
1504
+ var input = "DatePicker_input__1etdrw71";
1505
+ var statusIcon2 = "DatePicker_statusIcon__1etdrw73";
1506
+ var statusIconVariants2 = { saving: "DatePicker_statusIconVariants_saving__1etdrw74", saved: "DatePicker_statusIconVariants_saved__1etdrw75", error: "DatePicker_statusIconVariants_error__1etdrw76" };
1507
+ var wrapper3 = "DatePicker_wrapper__1etdrw72";
1361
1508
  function DatePicker({
1362
1509
  type = "date",
1363
1510
  value: value2,
@@ -1366,11 +1513,13 @@ function DatePicker({
1366
1513
  max,
1367
1514
  disabled,
1368
1515
  error,
1516
+ status,
1369
1517
  placeholder,
1370
1518
  className,
1371
1519
  ...rest
1372
1520
  }) {
1373
- return /* @__PURE__ */ jsxRuntime.jsx(
1521
+ const hasStatus = status && status !== "idle";
1522
+ const input3 = /* @__PURE__ */ jsxRuntime.jsx(
1374
1523
  "input",
1375
1524
  {
1376
1525
  type,
@@ -1381,10 +1530,16 @@ function DatePicker({
1381
1530
  disabled,
1382
1531
  placeholder,
1383
1532
  "data-error": error || void 0,
1384
- className: [input, className].filter(Boolean).join(" "),
1533
+ "data-has-status": hasStatus || void 0,
1534
+ className: [input, !hasStatus && className].filter(Boolean).join(" "),
1385
1535
  ...rest
1386
1536
  }
1387
1537
  );
1538
+ if (!hasStatus) return input3;
1539
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: [wrapper3, className].filter(Boolean).join(" "), children: [
1540
+ input3,
1541
+ /* @__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 }) })
1542
+ ] });
1388
1543
  }
1389
1544
 
1390
1545
  // src/components/Combobox/Combobox.css.ts
@@ -1395,7 +1550,7 @@ var option = "Combobox_option__1irfr5o7";
1395
1550
  var optionCheck = "Combobox_optionCheck__1irfr5o8";
1396
1551
  var popover = "Combobox_popover__1irfr5o6";
1397
1552
  var trigger = "Combobox_trigger__1irfr5o1";
1398
- var wrapper3 = "Combobox_wrapper__1irfr5o0";
1553
+ var wrapper4 = "Combobox_wrapper__1irfr5o0";
1399
1554
  function Combobox({
1400
1555
  value: value2,
1401
1556
  onChange,
@@ -1465,7 +1620,7 @@ function Combobox({
1465
1620
  return /* @__PURE__ */ jsxRuntime.jsxs(
1466
1621
  "div",
1467
1622
  {
1468
- className: [wrapper3, className].filter(Boolean).join(" "),
1623
+ className: [wrapper4, className].filter(Boolean).join(" "),
1469
1624
  onClick: () => {
1470
1625
  if (!disabled) inputRef.current?.focus();
1471
1626
  },
@@ -1613,7 +1768,7 @@ function SingleCombobox({
1613
1768
  return /* @__PURE__ */ jsxRuntime.jsxs(
1614
1769
  "div",
1615
1770
  {
1616
- className: [wrapper3, className].filter(Boolean).join(" "),
1771
+ className: [wrapper4, className].filter(Boolean).join(" "),
1617
1772
  onClick: () => {
1618
1773
  if (!disabled) inputRef.current?.focus();
1619
1774
  },
@@ -1812,7 +1967,7 @@ function Sparkline({
1812
1967
  // src/components/KpiTile/KpiTile.css.ts
1813
1968
  var inner = "KpiTile_inner__1yi98c61";
1814
1969
  var value = "KpiTile_value__1yi98c62";
1815
- var wrapper4 = "KpiTile_wrapper__1yi98c60";
1970
+ var wrapper5 = "KpiTile_wrapper__1yi98c60";
1816
1971
  var deltaToneToBadge = {
1817
1972
  positive: "saved",
1818
1973
  negative: "stopped",
@@ -1825,16 +1980,22 @@ function KpiTile({
1825
1980
  deltaTone = "neutral",
1826
1981
  sparkData,
1827
1982
  onClick,
1983
+ loading = false,
1828
1984
  className
1829
1985
  }) {
1830
1986
  const inner2 = /* @__PURE__ */ jsxRuntime.jsx(Card, { variant: "stamp", padding: "md", ...className !== void 0 ? { className } : {}, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: inner, children: [
1831
1987
  /* @__PURE__ */ jsxRuntime.jsx(Eyebrow, { children: label4 }),
1832
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: value, children: value2 }),
1833
- delta && /* @__PURE__ */ jsxRuntime.jsx(Badge, { tone: deltaToneToBadge[deltaTone], dot: true, children: delta }),
1834
- sparkData && sparkData.length >= 2 && /* @__PURE__ */ jsxRuntime.jsx(Sparkline, { data: sparkData, tone: deltaTone, width: 80, height: 24 })
1988
+ loading ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1989
+ /* @__PURE__ */ jsxRuntime.jsx(Skeleton, { width: "55%" }),
1990
+ /* @__PURE__ */ jsxRuntime.jsx(Skeleton, { width: "70%" })
1991
+ ] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1992
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: value, children: value2 }),
1993
+ delta && /* @__PURE__ */ jsxRuntime.jsx(Badge, { tone: deltaToneToBadge[deltaTone], dot: true, children: delta }),
1994
+ sparkData && sparkData.length >= 2 && /* @__PURE__ */ jsxRuntime.jsx(Sparkline, { data: sparkData, tone: deltaTone, width: 80, height: 24 })
1995
+ ] })
1835
1996
  ] }) });
1836
1997
  if (onClick) {
1837
- return /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick, className: wrapper4, children: inner2 });
1998
+ return /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick, className: wrapper5, children: inner2 });
1838
1999
  }
1839
2000
  return inner2;
1840
2001
  }
@@ -1888,6 +2049,7 @@ exports.SearchInput = SearchInput;
1888
2049
  exports.Select = Select;
1889
2050
  exports.Sidebar = Sidebar;
1890
2051
  exports.SingleCombobox = SingleCombobox;
2052
+ exports.Skeleton = Skeleton;
1891
2053
  exports.Sparkline = Sparkline;
1892
2054
  exports.StatePill = StatePill;
1893
2055
  exports.Table = Table;