@usefidel/design-system 0.25.1 → 0.26.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.
@@ -10,6 +10,6 @@
10
10
  "webapp.css"
11
11
  ],
12
12
  "storybookUrl": null,
13
- "packageVersion": "0.25.1",
14
- "resolvedSha": "2a60ecf8472c4876519b50b31956e94901b4a5ab"
13
+ "packageVersion": "0.26.0",
14
+ "resolvedSha": "e6bd155b42b9ee54a33f8bcc559834e5cb8c77d1"
15
15
  }
package/dist/index.cjs CHANGED
@@ -32,9 +32,11 @@ __export(index_exports, {
32
32
  Callout: () => Callout,
33
33
  Card: () => Card,
34
34
  Checkbox: () => Checkbox,
35
+ Checklist: () => Checklist,
35
36
  DiffPropertyList: () => DiffPropertyList,
36
37
  DiffSection: () => DiffSection,
37
38
  Divider: () => Divider,
39
+ Drawer: () => Drawer,
38
40
  EmptyState: () => EmptyState,
39
41
  IconButton: () => IconButton,
40
42
  Input: () => Input,
@@ -43,11 +45,16 @@ __export(index_exports, {
43
45
  MismatchCard: () => MismatchCard,
44
46
  Modal: () => Modal,
45
47
  MultiSelect: () => MultiSelect,
48
+ NumberedSteps: () => NumberedSteps,
49
+ OptionList: () => OptionList,
50
+ OptionRow: () => OptionRow,
46
51
  PageHeader: () => PageHeader,
52
+ PageSkeleton: () => PageSkeleton,
47
53
  Pagination: () => Pagination,
48
54
  PricingCard: () => PricingCard,
49
55
  Radio: () => Radio,
50
56
  RadioCard: () => RadioCard,
57
+ ResourceCard: () => ResourceCard,
51
58
  SearchInput: () => SearchInput,
52
59
  SectionHeader: () => SectionHeader,
53
60
  SegmentedControl: () => SegmentedControl,
@@ -63,6 +70,7 @@ __export(index_exports, {
63
70
  Stat: () => Stat,
64
71
  StatusDot: () => StatusDot,
65
72
  StepList: () => StepList,
73
+ Stepper: () => Stepper,
66
74
  Swatch: () => Swatch,
67
75
  TabNav: () => TabNav,
68
76
  Table: () => Table,
@@ -1022,12 +1030,23 @@ function Badge({ tone = "neutral", icon, className, children, ...rest }) {
1022
1030
  }
1023
1031
 
1024
1032
  // src/components/Tag/Tag.tsx
1033
+ var import_lucide_react = require("lucide-react");
1025
1034
  var import_jsx_runtime16 = require("react/jsx-runtime");
1026
- function Tag({ dot, icon, className, children, ...rest }) {
1035
+ function Tag({ dot, icon, onRemove, removeLabel, className, children, ...rest }) {
1027
1036
  return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("span", { className: ["fds-tag", className].filter(Boolean).join(" "), ...rest, children: [
1028
1037
  dot && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { className: `fds-dot fds-dot--${dot}`, "aria-hidden": "true" }),
1029
1038
  icon != null && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { className: "fds-tag__icon", "aria-hidden": "true", children: icon }),
1030
- children
1039
+ children,
1040
+ onRemove && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1041
+ "button",
1042
+ {
1043
+ type: "button",
1044
+ className: "fds-tag__remove",
1045
+ "aria-label": `Remove ${removeLabel ?? (typeof children === "string" ? children : "")}`.trim(),
1046
+ onClick: onRemove,
1047
+ children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_lucide_react.X, { "aria-hidden": "true" })
1048
+ }
1049
+ )
1031
1050
  ] });
1032
1051
  }
1033
1052
 
@@ -1700,7 +1719,7 @@ function IconButton({
1700
1719
 
1701
1720
  // src/components/Menu/Menu.tsx
1702
1721
  var import_react17 = require("react");
1703
- var import_lucide_react = require("lucide-react");
1722
+ var import_lucide_react2 = require("lucide-react");
1704
1723
  var import_jsx_runtime34 = require("react/jsx-runtime");
1705
1724
  var isItem = (e) => !("type" in e);
1706
1725
  function searchText(it) {
@@ -1856,7 +1875,7 @@ function Menu({
1856
1875
  wired,
1857
1876
  open && /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)("div", { className: listClasses, onKeyDown: onListKeyDown, children: [
1858
1877
  search && /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)("div", { className: "fds-menu__search", children: [
1859
- /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_lucide_react.Search, { "aria-hidden": "true" }),
1878
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_lucide_react2.Search, { "aria-hidden": "true" }),
1860
1879
  /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
1861
1880
  "input",
1862
1881
  {
@@ -1912,7 +1931,7 @@ function Menu({
1912
1931
  e.description != null && /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("span", { className: "fds-menu__description", children: e.description })
1913
1932
  ] }),
1914
1933
  e.trailing != null && /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("span", { className: "fds-menu__trailing", children: e.trailing }),
1915
- e.selected && /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_lucide_react.Check, { className: "fds-menu__check", "aria-hidden": "true" })
1934
+ e.selected && /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_lucide_react2.Check, { className: "fds-menu__check", "aria-hidden": "true" })
1916
1935
  ]
1917
1936
  },
1918
1937
  i
@@ -2101,12 +2120,12 @@ function Tooltip({ content, children, side = "right", delay = 400, disabled = fa
2101
2120
  }
2102
2121
 
2103
2122
  // src/components/BrandButton/BrandButton.tsx
2104
- var import_lucide_react2 = require("lucide-react");
2123
+ var import_lucide_react3 = require("lucide-react");
2105
2124
  var import_jsx_runtime41 = require("react/jsx-runtime");
2106
2125
  function BrandButton({ mark, hoverIcon, type = "button", className, ...rest }) {
2107
2126
  return /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("button", { type, className: ["fds-brand-button", className].filter(Boolean).join(" "), ...rest, children: [
2108
2127
  /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("span", { className: "fds-brand-button__mark", "aria-hidden": "true", children: mark }),
2109
- /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("span", { className: "fds-brand-button__hover", "aria-hidden": "true", children: hoverIcon ?? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_lucide_react2.PanelLeftOpen, {}) })
2128
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("span", { className: "fds-brand-button__hover", "aria-hidden": "true", children: hoverIcon ?? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_lucide_react3.PanelLeftOpen, {}) })
2110
2129
  ] });
2111
2130
  }
2112
2131
 
@@ -2146,7 +2165,7 @@ function SidebarItem({
2146
2165
 
2147
2166
  // src/components/Sidebar/Sidebar.tsx
2148
2167
  var import_react20 = require("react");
2149
- var import_lucide_react3 = require("lucide-react");
2168
+ var import_lucide_react4 = require("lucide-react");
2150
2169
  var import_jsx_runtime43 = require("react/jsx-runtime");
2151
2170
  function SidebarRoot({
2152
2171
  collapsed: controlled,
@@ -2215,7 +2234,7 @@ function SidebarBrand({
2215
2234
  {
2216
2235
  variant: "ghost",
2217
2236
  size: "small",
2218
- icon: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_lucide_react3.PanelLeftClose, {}),
2237
+ icon: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_lucide_react4.PanelLeftClose, {}),
2219
2238
  "aria-label": collapseLabel,
2220
2239
  "aria-keyshortcuts": "Meta+Backslash Control+Backslash",
2221
2240
  onClick: () => sidebar?.setCollapsed(true)
@@ -2273,7 +2292,7 @@ var Sidebar = Object.assign(SidebarRoot, {
2273
2292
 
2274
2293
  // src/components/WorkspaceSwitcher/WorkspaceSwitcher.tsx
2275
2294
  var import_react21 = require("react");
2276
- var import_lucide_react4 = require("lucide-react");
2295
+ var import_lucide_react5 = require("lucide-react");
2277
2296
  var import_jsx_runtime44 = require("react/jsx-runtime");
2278
2297
  function WorkspaceAvatar({ name }) {
2279
2298
  return /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("span", { className: "fds-workspace-avatar", "aria-hidden": "true", children: name.trim().charAt(0).toUpperCase() || "?" });
@@ -2294,7 +2313,7 @@ var WorkspaceSwitcher = (0, import_react21.forwardRef)(function WorkspaceSwitche
2294
2313
  /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)("span", { className: "fds-workspace-switcher__text", "aria-hidden": iconOnly || void 0, children: [
2295
2314
  /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("span", { className: "fds-workspace-switcher__name", children: name }),
2296
2315
  plan && /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("span", { className: "fds-workspace-switcher__plan", children: plan }),
2297
- /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_lucide_react4.ChevronDown, { className: "fds-workspace-switcher__chevron", "aria-hidden": "true" })
2316
+ /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_lucide_react5.ChevronDown, { className: "fds-workspace-switcher__chevron", "aria-hidden": "true" })
2298
2317
  ] })
2299
2318
  ]
2300
2319
  }
@@ -2352,7 +2371,7 @@ function PageHeader({ title, description, breadcrumb, actions, className, childr
2352
2371
 
2353
2372
  // src/components/Toast/Toast.tsx
2354
2373
  var import_react23 = require("react");
2355
- var import_lucide_react5 = require("lucide-react");
2374
+ var import_lucide_react6 = require("lucide-react");
2356
2375
  var import_jsx_runtime48 = require("react/jsx-runtime");
2357
2376
  function ToastRegion({ className, children, ...rest }) {
2358
2377
  return /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("div", { className: ["fds-toast-region", className].filter(Boolean).join(" "), "aria-live": "polite", ...rest, children });
@@ -2366,9 +2385,254 @@ function Toast({ children, action, onDismiss, duration, className, ...rest }) {
2366
2385
  return /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { role: "status", className: ["fds-toast", className].filter(Boolean).join(" "), ...rest, children: [
2367
2386
  /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("span", { className: "fds-toast__message", children }),
2368
2387
  action && /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("button", { type: "button", className: "fds-toast__action", onClick: action.onClick, children: action.label }),
2369
- onDismiss && /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("button", { type: "button", className: "fds-toast__close", "aria-label": "Dismiss", onClick: onDismiss, children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_lucide_react5.X, { "aria-hidden": "true" }) })
2388
+ onDismiss && /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("button", { type: "button", className: "fds-toast__close", "aria-label": "Dismiss", onClick: onDismiss, children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_lucide_react6.X, { "aria-hidden": "true" }) })
2389
+ ] });
2390
+ }
2391
+
2392
+ // src/components/Stepper/Stepper.tsx
2393
+ var import_react24 = require("react");
2394
+ var import_lucide_react7 = require("lucide-react");
2395
+ var import_jsx_runtime49 = require("react/jsx-runtime");
2396
+ function StepperStep(_) {
2397
+ return null;
2398
+ }
2399
+ function StepperRoot({ className, children, ...rest }) {
2400
+ const steps = import_react24.Children.toArray(children).filter(import_react24.isValidElement);
2401
+ return /* @__PURE__ */ (0, import_jsx_runtime49.jsx)("ol", { className: ["fds-stepper", className].filter(Boolean).join(" "), ...rest, children: steps.map((step, i) => {
2402
+ const { status, children: label } = step.props;
2403
+ return /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(
2404
+ "li",
2405
+ {
2406
+ className: `fds-stepper__step fds-stepper__step--${status}`,
2407
+ "aria-current": status === "current" ? "step" : void 0,
2408
+ children: [
2409
+ /* @__PURE__ */ (0, import_jsx_runtime49.jsx)("span", { className: "fds-stepper__marker", "aria-hidden": "true", children: status === "done" ? /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(import_lucide_react7.Check, {}) : i + 1 }),
2410
+ /* @__PURE__ */ (0, import_jsx_runtime49.jsx)("span", { className: "fds-stepper__label", children: label })
2411
+ ]
2412
+ },
2413
+ i
2414
+ );
2415
+ }) });
2416
+ }
2417
+ var Stepper = Object.assign(StepperRoot, { Step: StepperStep });
2418
+
2419
+ // src/components/NumberedSteps/NumberedSteps.tsx
2420
+ var import_react25 = require("react");
2421
+ var import_jsx_runtime50 = require("react/jsx-runtime");
2422
+ function NumberedStepsRoot({ className, children, ...rest }) {
2423
+ return /* @__PURE__ */ (0, import_jsx_runtime50.jsx)("ol", { className: ["fds-numbered-steps", className].filter(Boolean).join(" "), ...rest, children: import_react25.Children.toArray(children) });
2424
+ }
2425
+ function NumberedStepsItem({ className, children, ...rest }) {
2426
+ return /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)("li", { className: ["fds-numbered-steps__item", className].filter(Boolean).join(" "), ...rest, children: [
2427
+ /* @__PURE__ */ (0, import_jsx_runtime50.jsx)("span", { className: "fds-numbered-steps__marker", "aria-hidden": "true" }),
2428
+ /* @__PURE__ */ (0, import_jsx_runtime50.jsx)("div", { className: "fds-numbered-steps__body", children })
2429
+ ] });
2430
+ }
2431
+ var NumberedSteps = Object.assign(NumberedStepsRoot, { Item: NumberedStepsItem });
2432
+
2433
+ // src/components/OptionList/OptionList.tsx
2434
+ var import_jsx_runtime51 = require("react/jsx-runtime");
2435
+ function OptionListRoot({ className, children, ...rest }) {
2436
+ return /* @__PURE__ */ (0, import_jsx_runtime51.jsx)("div", { className: ["fds-option-list", className].filter(Boolean).join(" "), ...rest, children });
2437
+ }
2438
+ function OptionListLabel({ className, children, ...rest }) {
2439
+ return /* @__PURE__ */ (0, import_jsx_runtime51.jsx)("div", { className: ["fds-option-list__label", className].filter(Boolean).join(" "), ...rest, children });
2440
+ }
2441
+ function OptionRow({ control = "radio", title, description, meta, className, checked, disabled, ...rest }) {
2442
+ const Control = control === "checkbox" ? Checkbox : Radio;
2443
+ return /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(
2444
+ "div",
2445
+ {
2446
+ className: ["fds-option-row", checked ? "fds-option-row--checked" : "", className].filter(Boolean).join(" "),
2447
+ "data-disabled": disabled ? "" : void 0,
2448
+ children: [
2449
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(Control, { label: title, description, checked, disabled, ...rest }),
2450
+ meta != null && /* @__PURE__ */ (0, import_jsx_runtime51.jsx)("span", { className: "fds-option-row__meta", children: meta })
2451
+ ]
2452
+ }
2453
+ );
2454
+ }
2455
+ var OptionList = Object.assign(OptionListRoot, { Label: OptionListLabel, Row: OptionRow });
2456
+
2457
+ // src/components/Checklist/Checklist.tsx
2458
+ var import_lucide_react8 = require("lucide-react");
2459
+ var import_jsx_runtime52 = require("react/jsx-runtime");
2460
+ function ChecklistRoot({ title, className, children, ...rest }) {
2461
+ return /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)("section", { className: ["fds-checklist", className].filter(Boolean).join(" "), ...rest, children: [
2462
+ title != null && /* @__PURE__ */ (0, import_jsx_runtime52.jsx)("h3", { className: "fds-checklist__title", children: title }),
2463
+ /* @__PURE__ */ (0, import_jsx_runtime52.jsx)("ul", { className: "fds-checklist__items", children })
2464
+ ] });
2465
+ }
2466
+ function ChecklistItem({ done, label, value }) {
2467
+ return /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)("li", { className: ["fds-checklist__item", done ? "fds-checklist__item--done" : ""].filter(Boolean).join(" "), children: [
2468
+ /* @__PURE__ */ (0, import_jsx_runtime52.jsx)("span", { className: "fds-checklist__mark", "aria-hidden": "true", children: done && /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(import_lucide_react8.Check, {}) }),
2469
+ /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)("span", { className: "fds-checklist__text", children: [
2470
+ /* @__PURE__ */ (0, import_jsx_runtime52.jsx)("span", { className: "fds-checklist__label", children: label }),
2471
+ /* @__PURE__ */ (0, import_jsx_runtime52.jsx)("span", { className: "fds-checklist__value", children: value })
2472
+ ] })
2473
+ ] });
2474
+ }
2475
+ var Checklist = Object.assign(ChecklistRoot, { Item: ChecklistItem });
2476
+
2477
+ // src/components/Drawer/Drawer.tsx
2478
+ var import_react26 = require("react");
2479
+ var import_react_dom3 = require("react-dom");
2480
+ var import_lucide_react9 = require("lucide-react");
2481
+ var import_jsx_runtime53 = require("react/jsx-runtime");
2482
+ var FOCUSABLE2 = 'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])';
2483
+ function Drawer({ open, onClose, title, description, children, footer, dismissible = true }) {
2484
+ const titleId = (0, import_react26.useId)();
2485
+ const descriptionId = (0, import_react26.useId)();
2486
+ const panelRef = (0, import_react26.useRef)(null);
2487
+ const onCloseRef = (0, import_react26.useRef)(onClose);
2488
+ onCloseRef.current = onClose;
2489
+ const dismissibleRef = (0, import_react26.useRef)(dismissible);
2490
+ dismissibleRef.current = dismissible;
2491
+ (0, import_react26.useEffect)(() => {
2492
+ if (!open) return;
2493
+ const panel = panelRef.current;
2494
+ const previouslyFocused = document.activeElement;
2495
+ (panel?.querySelector("[data-autofocus]") ?? panel?.querySelector(`.fds-drawer__body ${FOCUSABLE2}`) ?? panel)?.focus();
2496
+ const previousOverflow = document.body.style.overflow;
2497
+ document.body.style.overflow = "hidden";
2498
+ const onKey = (e) => {
2499
+ if (e.key === "Escape" && dismissibleRef.current) {
2500
+ e.preventDefault();
2501
+ onCloseRef.current();
2502
+ return;
2503
+ }
2504
+ if (e.key === "Tab" && panel) {
2505
+ const focusable = Array.from(panel.querySelectorAll(FOCUSABLE2));
2506
+ if (focusable.length === 0) return;
2507
+ const first = focusable[0];
2508
+ const last = focusable[focusable.length - 1];
2509
+ if (e.shiftKey && (document.activeElement === first || document.activeElement === panel)) {
2510
+ e.preventDefault();
2511
+ last.focus();
2512
+ } else if (!e.shiftKey && document.activeElement === last) {
2513
+ e.preventDefault();
2514
+ first.focus();
2515
+ }
2516
+ }
2517
+ };
2518
+ window.addEventListener("keydown", onKey);
2519
+ return () => {
2520
+ window.removeEventListener("keydown", onKey);
2521
+ document.body.style.overflow = previousOverflow;
2522
+ previouslyFocused?.focus?.();
2523
+ };
2524
+ }, [open]);
2525
+ if (!open || typeof document === "undefined") return null;
2526
+ return (0, import_react_dom3.createPortal)(
2527
+ /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
2528
+ "div",
2529
+ {
2530
+ className: "fds-drawer__scrim",
2531
+ onMouseDown: (e) => {
2532
+ if (e.target === e.currentTarget && dismissible) onClose();
2533
+ },
2534
+ children: /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)(
2535
+ "div",
2536
+ {
2537
+ ref: panelRef,
2538
+ className: "fds-drawer",
2539
+ role: "dialog",
2540
+ "aria-modal": "true",
2541
+ "aria-labelledby": titleId,
2542
+ "aria-describedby": description != null ? descriptionId : void 0,
2543
+ tabIndex: -1,
2544
+ children: [
2545
+ /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)("header", { className: "fds-drawer__header", children: [
2546
+ /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)("div", { className: "fds-drawer__heading", children: [
2547
+ /* @__PURE__ */ (0, import_jsx_runtime53.jsx)("h2", { id: titleId, className: "fds-drawer__title", children: title }),
2548
+ description != null && /* @__PURE__ */ (0, import_jsx_runtime53.jsx)("p", { id: descriptionId, className: "fds-drawer__description", children: description })
2549
+ ] }),
2550
+ /* @__PURE__ */ (0, import_jsx_runtime53.jsx)("button", { type: "button", className: "fds-drawer__close", onClick: onClose, disabled: !dismissible, "aria-label": "Close", children: /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(import_lucide_react9.X, { "aria-hidden": "true" }) })
2551
+ ] }),
2552
+ /* @__PURE__ */ (0, import_jsx_runtime53.jsx)("div", { className: "fds-drawer__body", children }),
2553
+ footer != null && /* @__PURE__ */ (0, import_jsx_runtime53.jsx)("footer", { className: "fds-drawer__footer", children: footer })
2554
+ ]
2555
+ }
2556
+ )
2557
+ }
2558
+ ),
2559
+ document.body
2560
+ );
2561
+ }
2562
+
2563
+ // src/components/ResourceCard/ResourceCard.tsx
2564
+ var import_jsx_runtime54 = require("react/jsx-runtime");
2565
+ function ResourceCard({ icon, title, badge, meta, stats, action, variant = "default", className, ...rest }) {
2566
+ return /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: ["fds-resource-card", `fds-resource-card--${variant}`, className].filter(Boolean).join(" "), ...rest, children: [
2567
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: "fds-resource-card__main", children: [
2568
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: "fds-resource-card__title", children: [
2569
+ icon != null && /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("span", { className: "fds-resource-card__icon", "aria-hidden": "true", children: icon }),
2570
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("span", { children: title }),
2571
+ badge
2572
+ ] }),
2573
+ meta?.map((line, i) => /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("div", { className: "fds-resource-card__meta", children: line }, i))
2574
+ ] }),
2575
+ stats && stats.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("dl", { className: "fds-resource-card__stats", children: stats.map((s, i) => /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: "fds-resource-card__stat", children: [
2576
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("dt", { children: s.label }),
2577
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("dd", { children: s.value })
2578
+ ] }, i)) }),
2579
+ action != null && /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("div", { className: "fds-resource-card__action", children: action })
2370
2580
  ] });
2371
2581
  }
2582
+
2583
+ // src/components/PageSkeleton/PageSkeleton.tsx
2584
+ var import_jsx_runtime55 = require("react/jsx-runtime");
2585
+ function PageSkeletonRoot({ label = "Loading", children }) {
2586
+ return /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(SkeletonGroup, { label, className: "fds-page-skeleton", children });
2587
+ }
2588
+ function PageSkeletonHeader({ title, description, breadcrumb, action, tabs = 0 }) {
2589
+ return /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
2590
+ PageHeader,
2591
+ {
2592
+ breadcrumb: breadcrumb ? /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(Skeleton, { shape: "text", width: 140 }) : void 0,
2593
+ title: title ?? /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(Skeleton, { width: 220, height: 28 }),
2594
+ description: description === true ? /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(Skeleton, { shape: "text", width: 320 }) : description || void 0,
2595
+ actions: action ? /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(Skeleton, { width: 128, height: 36 }) : void 0,
2596
+ children: tabs > 0 && /* @__PURE__ */ (0, import_jsx_runtime55.jsx)("div", { className: "fds-page-skeleton__tabs", children: Array.from({ length: tabs }, (_, i) => /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(Skeleton, { shape: "text", width: 80 }, i)) })
2597
+ }
2598
+ );
2599
+ }
2600
+ function PageSkeletonToolbar({ filters = 2 }) {
2601
+ return /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)("div", { className: "fds-page-skeleton__toolbar", children: [
2602
+ /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(Skeleton, { width: 280, height: 36 }),
2603
+ Array.from({ length: filters }, (_, i) => /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(Skeleton, { width: 140, height: 36 }, i))
2604
+ ] });
2605
+ }
2606
+ function PageSkeletonTable({ rows = 5, columns = 5 }) {
2607
+ const cells = (key, width) => Array.from({ length: columns }, (_, c) => /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(Skeleton, { shape: "text", width: c === 0 ? "60%" : width }, `${key}-${c}`));
2608
+ return /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)("div", { className: "fds-page-skeleton__table", style: { ["--fds-page-skeleton-columns"]: columns }, children: [
2609
+ /* @__PURE__ */ (0, import_jsx_runtime55.jsx)("div", { className: "fds-page-skeleton__row fds-page-skeleton__row--head", children: cells("h", "40%") }),
2610
+ Array.from({ length: rows }, (_, r) => /* @__PURE__ */ (0, import_jsx_runtime55.jsx)("div", { className: "fds-page-skeleton__row", children: cells(`r${r}`, "50%") }, r))
2611
+ ] });
2612
+ }
2613
+ function PageSkeletonCards({ count = 3, height = 120, columns = 3 }) {
2614
+ return /* @__PURE__ */ (0, import_jsx_runtime55.jsx)("div", { className: "fds-page-skeleton__cards", style: { ["--fds-page-skeleton-columns"]: columns }, children: Array.from({ length: count }, (_, i) => /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(Skeleton, { height, className: "fds-page-skeleton__card" }, i)) });
2615
+ }
2616
+ function PageSkeletonForm({ fields = 3 }) {
2617
+ return /* @__PURE__ */ (0, import_jsx_runtime55.jsx)("div", { className: "fds-page-skeleton__form", children: Array.from({ length: fields }, (_, i) => /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)("div", { className: "fds-page-skeleton__field", children: [
2618
+ /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(Skeleton, { shape: "text", width: 120 }),
2619
+ /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(Skeleton, { height: 36 })
2620
+ ] }, i)) });
2621
+ }
2622
+ function PageSkeletonSplit({ children, aside }) {
2623
+ return /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)("div", { className: "fds-page-skeleton__split", children: [
2624
+ /* @__PURE__ */ (0, import_jsx_runtime55.jsx)("div", { className: "fds-page-skeleton__main", children }),
2625
+ /* @__PURE__ */ (0, import_jsx_runtime55.jsx)("div", { className: "fds-page-skeleton__aside", children: aside })
2626
+ ] });
2627
+ }
2628
+ var PageSkeleton = Object.assign(PageSkeletonRoot, {
2629
+ Header: PageSkeletonHeader,
2630
+ Toolbar: PageSkeletonToolbar,
2631
+ Table: PageSkeletonTable,
2632
+ Cards: PageSkeletonCards,
2633
+ Form: PageSkeletonForm,
2634
+ Split: PageSkeletonSplit
2635
+ });
2372
2636
  // Annotate the CommonJS export names for ESM import in node:
2373
2637
  0 && (module.exports = {
2374
2638
  Accordion,
@@ -2383,9 +2647,11 @@ function Toast({ children, action, onDismiss, duration, className, ...rest }) {
2383
2647
  Callout,
2384
2648
  Card,
2385
2649
  Checkbox,
2650
+ Checklist,
2386
2651
  DiffPropertyList,
2387
2652
  DiffSection,
2388
2653
  Divider,
2654
+ Drawer,
2389
2655
  EmptyState,
2390
2656
  IconButton,
2391
2657
  Input,
@@ -2394,11 +2660,16 @@ function Toast({ children, action, onDismiss, duration, className, ...rest }) {
2394
2660
  MismatchCard,
2395
2661
  Modal,
2396
2662
  MultiSelect,
2663
+ NumberedSteps,
2664
+ OptionList,
2665
+ OptionRow,
2397
2666
  PageHeader,
2667
+ PageSkeleton,
2398
2668
  Pagination,
2399
2669
  PricingCard,
2400
2670
  Radio,
2401
2671
  RadioCard,
2672
+ ResourceCard,
2402
2673
  SearchInput,
2403
2674
  SectionHeader,
2404
2675
  SegmentedControl,
@@ -2414,6 +2685,7 @@ function Toast({ children, action, onDismiss, duration, className, ...rest }) {
2414
2685
  Stat,
2415
2686
  StatusDot,
2416
2687
  StepList,
2688
+ Stepper,
2417
2689
  Swatch,
2418
2690
  TabNav,
2419
2691
  Table,