achery-ui 0.5.9 → 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);
@@ -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(
@@ -1291,10 +1423,12 @@ function ToastProvider({ children }) {
1291
1423
  }
1292
1424
 
1293
1425
  // 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";
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";
1298
1432
  function Checkbox({
1299
1433
  checked,
1300
1434
  defaultChecked,
@@ -1302,6 +1436,7 @@ function Checkbox({
1302
1436
  disabled,
1303
1437
  label: label4,
1304
1438
  id,
1439
+ status,
1305
1440
  className,
1306
1441
  "aria-label": ariaLabel
1307
1442
  }) {
@@ -1320,7 +1455,8 @@ function Checkbox({
1320
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" }) }) })
1321
1456
  }
1322
1457
  ),
1323
- 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 }) })
1324
1460
  ] });
1325
1461
  }
1326
1462
 
@@ -1365,7 +1501,10 @@ function Menu2({ trigger: trigger2, items, side = "bottom", align = "end", class
1365
1501
  }
1366
1502
 
1367
1503
  // src/components/DatePicker/DatePicker.css.ts
1368
- 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";
1369
1508
  function DatePicker({
1370
1509
  type = "date",
1371
1510
  value: value2,
@@ -1374,11 +1513,13 @@ function DatePicker({
1374
1513
  max,
1375
1514
  disabled,
1376
1515
  error,
1516
+ status,
1377
1517
  placeholder,
1378
1518
  className,
1379
1519
  ...rest
1380
1520
  }) {
1381
- return /* @__PURE__ */ jsxRuntime.jsx(
1521
+ const hasStatus = status && status !== "idle";
1522
+ const input3 = /* @__PURE__ */ jsxRuntime.jsx(
1382
1523
  "input",
1383
1524
  {
1384
1525
  type,
@@ -1389,10 +1530,16 @@ function DatePicker({
1389
1530
  disabled,
1390
1531
  placeholder,
1391
1532
  "data-error": error || void 0,
1392
- className: [input, className].filter(Boolean).join(" "),
1533
+ "data-has-status": hasStatus || void 0,
1534
+ className: [input, !hasStatus && className].filter(Boolean).join(" "),
1393
1535
  ...rest
1394
1536
  }
1395
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
+ ] });
1396
1543
  }
1397
1544
 
1398
1545
  // src/components/Combobox/Combobox.css.ts
@@ -1403,7 +1550,7 @@ var option = "Combobox_option__1irfr5o7";
1403
1550
  var optionCheck = "Combobox_optionCheck__1irfr5o8";
1404
1551
  var popover = "Combobox_popover__1irfr5o6";
1405
1552
  var trigger = "Combobox_trigger__1irfr5o1";
1406
- var wrapper3 = "Combobox_wrapper__1irfr5o0";
1553
+ var wrapper4 = "Combobox_wrapper__1irfr5o0";
1407
1554
  function Combobox({
1408
1555
  value: value2,
1409
1556
  onChange,
@@ -1473,7 +1620,7 @@ function Combobox({
1473
1620
  return /* @__PURE__ */ jsxRuntime.jsxs(
1474
1621
  "div",
1475
1622
  {
1476
- className: [wrapper3, className].filter(Boolean).join(" "),
1623
+ className: [wrapper4, className].filter(Boolean).join(" "),
1477
1624
  onClick: () => {
1478
1625
  if (!disabled) inputRef.current?.focus();
1479
1626
  },
@@ -1621,7 +1768,7 @@ function SingleCombobox({
1621
1768
  return /* @__PURE__ */ jsxRuntime.jsxs(
1622
1769
  "div",
1623
1770
  {
1624
- className: [wrapper3, className].filter(Boolean).join(" "),
1771
+ className: [wrapper4, className].filter(Boolean).join(" "),
1625
1772
  onClick: () => {
1626
1773
  if (!disabled) inputRef.current?.focus();
1627
1774
  },
@@ -1820,7 +1967,7 @@ function Sparkline({
1820
1967
  // src/components/KpiTile/KpiTile.css.ts
1821
1968
  var inner = "KpiTile_inner__1yi98c61";
1822
1969
  var value = "KpiTile_value__1yi98c62";
1823
- var wrapper4 = "KpiTile_wrapper__1yi98c60";
1970
+ var wrapper5 = "KpiTile_wrapper__1yi98c60";
1824
1971
  var deltaToneToBadge = {
1825
1972
  positive: "saved",
1826
1973
  negative: "stopped",
@@ -1833,16 +1980,22 @@ function KpiTile({
1833
1980
  deltaTone = "neutral",
1834
1981
  sparkData,
1835
1982
  onClick,
1983
+ loading = false,
1836
1984
  className
1837
1985
  }) {
1838
1986
  const inner2 = /* @__PURE__ */ jsxRuntime.jsx(Card, { variant: "stamp", padding: "md", ...className !== void 0 ? { className } : {}, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: inner, children: [
1839
1987
  /* @__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 })
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
+ ] })
1843
1996
  ] }) });
1844
1997
  if (onClick) {
1845
- 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 });
1846
1999
  }
1847
2000
  return inner2;
1848
2001
  }
@@ -1896,6 +2049,7 @@ exports.SearchInput = SearchInput;
1896
2049
  exports.Select = Select;
1897
2050
  exports.Sidebar = Sidebar;
1898
2051
  exports.SingleCombobox = SingleCombobox;
2052
+ exports.Skeleton = Skeleton;
1899
2053
  exports.Sparkline = Sparkline;
1900
2054
  exports.StatePill = StatePill;
1901
2055
  exports.Table = Table;