@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.
- package/dist/fidel.manifest.json +2 -2
- package/dist/index.cjs +285 -13
- package/dist/index.css +547 -0
- package/dist/index.d.cts +162 -2
- package/dist/index.d.ts +162 -2
- package/dist/index.js +268 -4
- package/package.json +1 -1
package/dist/fidel.manifest.json
CHANGED
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
|
|
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)(
|
|
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)(
|
|
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
|
|
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)(
|
|
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
|
|
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)(
|
|
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
|
|
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)(
|
|
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
|
|
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)(
|
|
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,
|