@ship-it-ui/ui 0.0.3 → 0.0.5
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 +1504 -630
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +436 -28
- package/dist/index.d.ts +436 -28
- package/dist/index.js +1487 -619
- package/dist/index.js.map +1 -1
- package/package.json +6 -4
- package/src/styles/globals.css +26 -0
package/dist/index.js
CHANGED
|
@@ -201,14 +201,29 @@ var buttonStyles = cva(
|
|
|
201
201
|
md: "h-[32px] px-3 text-[12px] gap-[6px] rounded-md",
|
|
202
202
|
lg: "h-[38px] px-4 text-[13px] gap-[7px] rounded-[7px]"
|
|
203
203
|
},
|
|
204
|
+
density: {
|
|
205
|
+
comfortable: "",
|
|
206
|
+
touch: ""
|
|
207
|
+
},
|
|
204
208
|
fullWidth: {
|
|
205
209
|
true: "w-full",
|
|
206
210
|
false: ""
|
|
207
211
|
}
|
|
208
212
|
},
|
|
213
|
+
compoundVariants: [
|
|
214
|
+
// Mobile density — bumps every size to meet 44pt minimum touch target.
|
|
215
|
+
{
|
|
216
|
+
size: "sm",
|
|
217
|
+
density: "touch",
|
|
218
|
+
class: "h-[36px] px-[14px] text-[13px] gap-[7px] rounded-base"
|
|
219
|
+
},
|
|
220
|
+
{ size: "md", density: "touch", class: "h-touch px-[18px] text-m-body gap-2 rounded-base" },
|
|
221
|
+
{ size: "lg", density: "touch", class: "h-[52px] px-[22px] text-[16px] gap-2 rounded-base" }
|
|
222
|
+
],
|
|
209
223
|
defaultVariants: {
|
|
210
224
|
variant: "primary",
|
|
211
225
|
size: "md",
|
|
226
|
+
density: "comfortable",
|
|
212
227
|
fullWidth: false
|
|
213
228
|
}
|
|
214
229
|
}
|
|
@@ -223,10 +238,14 @@ function Spinner({ size }) {
|
|
|
223
238
|
}
|
|
224
239
|
);
|
|
225
240
|
}
|
|
226
|
-
var iconSize = {
|
|
241
|
+
var iconSize = {
|
|
242
|
+
comfortable: { sm: 11, md: 12, lg: 13 },
|
|
243
|
+
touch: { sm: 13, md: 15, lg: 16 }
|
|
244
|
+
};
|
|
227
245
|
var Button = forwardRef(function Button2({
|
|
228
246
|
variant,
|
|
229
247
|
size,
|
|
248
|
+
density,
|
|
230
249
|
fullWidth,
|
|
231
250
|
icon,
|
|
232
251
|
trailing,
|
|
@@ -239,8 +258,8 @@ var Button = forwardRef(function Button2({
|
|
|
239
258
|
...props
|
|
240
259
|
}, ref) {
|
|
241
260
|
const isDisabled = disabled || loading;
|
|
242
|
-
const iconPx = iconSize[size ?? "md"];
|
|
243
|
-
const composedClassName = cn(buttonStyles({ variant, size, fullWidth }), className);
|
|
261
|
+
const iconPx = iconSize[density ?? "comfortable"][size ?? "md"];
|
|
262
|
+
const composedClassName = cn(buttonStyles({ variant, size, density, fullWidth }), className);
|
|
244
263
|
if (asChild) {
|
|
245
264
|
return /* @__PURE__ */ jsx(
|
|
246
265
|
Slot,
|
|
@@ -301,18 +320,28 @@ var iconButtonStyles = cva2(
|
|
|
301
320
|
sm: "h-[26px] w-[26px] text-[12px] rounded-[5px]",
|
|
302
321
|
md: "h-[32px] w-[32px] text-[13px] rounded-md",
|
|
303
322
|
lg: "h-[38px] w-[38px] text-[15px] rounded-[7px]"
|
|
323
|
+
},
|
|
324
|
+
density: {
|
|
325
|
+
comfortable: "",
|
|
326
|
+
touch: ""
|
|
304
327
|
}
|
|
305
328
|
},
|
|
306
|
-
|
|
329
|
+
compoundVariants: [
|
|
330
|
+
// Mobile density — 44pt minimum touch target, circular tap.
|
|
331
|
+
{ size: "sm", density: "touch", class: "h-[36px] w-[36px] text-[14px] rounded-full" },
|
|
332
|
+
{ size: "md", density: "touch", class: "h-touch w-touch text-[16px] rounded-full" },
|
|
333
|
+
{ size: "lg", density: "touch", class: "h-[52px] w-[52px] text-[18px] rounded-full" }
|
|
334
|
+
],
|
|
335
|
+
defaultVariants: { variant: "secondary", size: "md", density: "comfortable" }
|
|
307
336
|
}
|
|
308
337
|
);
|
|
309
|
-
var IconButton = forwardRef2(function IconButton2({ variant, size, icon, type, className, ...props }, ref) {
|
|
338
|
+
var IconButton = forwardRef2(function IconButton2({ variant, size, density, icon, type, className, ...props }, ref) {
|
|
310
339
|
return /* @__PURE__ */ jsx2(
|
|
311
340
|
"button",
|
|
312
341
|
{
|
|
313
342
|
ref,
|
|
314
343
|
type: type ?? "button",
|
|
315
|
-
className: cn(iconButtonStyles({ variant, size }), className),
|
|
344
|
+
className: cn(iconButtonStyles({ variant, size, density }), className),
|
|
316
345
|
...props,
|
|
317
346
|
children: icon
|
|
318
347
|
}
|
|
@@ -432,14 +461,16 @@ FAB.displayName = "FAB";
|
|
|
432
461
|
import * as RadixCheckbox from "@radix-ui/react-checkbox";
|
|
433
462
|
import { forwardRef as forwardRef6, useId } from "react";
|
|
434
463
|
import { jsx as jsx6, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
435
|
-
var Checkbox = forwardRef6(function Checkbox2({ label, className, id: idProp, ...props }, ref) {
|
|
464
|
+
var Checkbox = forwardRef6(function Checkbox2({ label, density = "comfortable", className, id: idProp, ...props }, ref) {
|
|
436
465
|
const reactId = useId();
|
|
437
466
|
const id = idProp ?? `cb-${reactId}`;
|
|
467
|
+
const isTouch = density === "touch";
|
|
438
468
|
return /* @__PURE__ */ jsxs3(
|
|
439
469
|
"span",
|
|
440
470
|
{
|
|
441
471
|
className: cn(
|
|
442
|
-
"inline-flex items-center
|
|
472
|
+
"inline-flex items-center select-none",
|
|
473
|
+
isTouch ? "min-h-touch gap-3" : "gap-2",
|
|
443
474
|
props.disabled && "cursor-not-allowed opacity-40",
|
|
444
475
|
className
|
|
445
476
|
),
|
|
@@ -450,18 +481,32 @@ var Checkbox = forwardRef6(function Checkbox2({ label, className, id: idProp, ..
|
|
|
450
481
|
ref,
|
|
451
482
|
id,
|
|
452
483
|
className: cn(
|
|
453
|
-
"grid
|
|
454
|
-
"
|
|
484
|
+
"grid place-items-center",
|
|
485
|
+
isTouch ? "h-[22px] w-[22px] rounded-sm border-[1.5px]" : "h-4 w-4 rounded-xs border",
|
|
486
|
+
"bg-panel border-border-strong",
|
|
455
487
|
"data-[state=checked]:bg-accent data-[state=checked]:border-accent",
|
|
456
488
|
"data-[state=indeterminate]:bg-accent data-[state=indeterminate]:border-accent",
|
|
457
489
|
"transition-[background,border-color] duration-(--duration-micro)",
|
|
458
490
|
"focus-visible:ring-accent-dim outline-none focus-visible:ring-[3px]"
|
|
459
491
|
),
|
|
460
492
|
...props,
|
|
461
|
-
children: /* @__PURE__ */ jsx6(
|
|
493
|
+
children: /* @__PURE__ */ jsx6(
|
|
494
|
+
RadixCheckbox.Indicator,
|
|
495
|
+
{
|
|
496
|
+
className: cn("text-on-accent leading-none", isTouch ? "text-[14px]" : "text-[11px]"),
|
|
497
|
+
children: props.checked === "indeterminate" ? "\u2212" : "\u2713"
|
|
498
|
+
}
|
|
499
|
+
)
|
|
462
500
|
}
|
|
463
501
|
),
|
|
464
|
-
label && /* @__PURE__ */ jsx6(
|
|
502
|
+
label && /* @__PURE__ */ jsx6(
|
|
503
|
+
"label",
|
|
504
|
+
{
|
|
505
|
+
htmlFor: id,
|
|
506
|
+
className: cn("cursor-pointer", isTouch ? "text-m-body" : "text-[13px]"),
|
|
507
|
+
children: label
|
|
508
|
+
}
|
|
509
|
+
)
|
|
465
510
|
]
|
|
466
511
|
}
|
|
467
512
|
);
|
|
@@ -512,17 +557,28 @@ var inputWrapperStyles = cva3(
|
|
|
512
557
|
tone: {
|
|
513
558
|
default: "bg-panel border-border focus-within:border-accent focus-within:ring-accent-dim",
|
|
514
559
|
err: "bg-panel border-err focus-within:border-err focus-within:ring-err/30"
|
|
560
|
+
},
|
|
561
|
+
density: {
|
|
562
|
+
comfortable: "",
|
|
563
|
+
touch: ""
|
|
515
564
|
}
|
|
516
565
|
},
|
|
517
|
-
|
|
566
|
+
compoundVariants: [
|
|
567
|
+
// Mobile density — 52px standard input height (MInput in the canvas);
|
|
568
|
+
// sm collapses to 44pt min, lg pushes to 56pt for prominent forms.
|
|
569
|
+
{ size: "sm", density: "touch", class: "h-touch px-3 text-m-body rounded-m-tab" },
|
|
570
|
+
{ size: "md", density: "touch", class: "h-[52px] px-[14px] text-m-body rounded-m-tab" },
|
|
571
|
+
{ size: "lg", density: "touch", class: "h-row px-4 text-m-body-lg rounded-m-tab" }
|
|
572
|
+
],
|
|
573
|
+
defaultVariants: { size: "md", tone: "default", density: "comfortable" }
|
|
518
574
|
}
|
|
519
575
|
);
|
|
520
|
-
var Input = forwardRef7(function Input2({ size, tone, icon, trailing, error, width, className, style, disabled, ...props }, ref) {
|
|
576
|
+
var Input = forwardRef7(function Input2({ size, tone, density, icon, trailing, error, width, className, style, disabled, ...props }, ref) {
|
|
521
577
|
const computedTone = error ? "err" : tone;
|
|
522
578
|
return /* @__PURE__ */ jsxs5(
|
|
523
579
|
"div",
|
|
524
580
|
{
|
|
525
|
-
className: cn(inputWrapperStyles({ size, tone: computedTone }), className),
|
|
581
|
+
className: cn(inputWrapperStyles({ size, tone: computedTone, density }), className),
|
|
526
582
|
style: { width, ...style },
|
|
527
583
|
children: [
|
|
528
584
|
icon && /* @__PURE__ */ jsx8("span", { className: "text-text-dim leading-none", children: icon }),
|
|
@@ -551,27 +607,32 @@ Input.displayName = "Input";
|
|
|
551
607
|
import { forwardRef as forwardRef8 } from "react";
|
|
552
608
|
import { jsx as jsx9, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
553
609
|
var SearchInput = forwardRef8(function SearchInput2({
|
|
554
|
-
shortcut
|
|
555
|
-
width
|
|
610
|
+
shortcut,
|
|
611
|
+
width,
|
|
612
|
+
density = "comfortable",
|
|
556
613
|
className,
|
|
557
614
|
style,
|
|
558
615
|
placeholder = "Search\u2026",
|
|
559
616
|
"aria-label": ariaLabel,
|
|
560
617
|
...props
|
|
561
618
|
}, ref) {
|
|
619
|
+
const isTouch = density === "touch";
|
|
620
|
+
const resolvedWidth = width ?? (isTouch ? "100%" : 360);
|
|
621
|
+
const resolvedShortcut = shortcut ?? (isTouch ? void 0 : "\u2318K");
|
|
562
622
|
return /* @__PURE__ */ jsxs6(
|
|
563
623
|
"div",
|
|
564
624
|
{
|
|
565
625
|
className: cn(
|
|
566
|
-
"
|
|
626
|
+
"flex items-center gap-2 font-sans",
|
|
627
|
+
isTouch ? "h-touch rounded-m-tab px-[14px]" : "rounded-base h-9 px-3",
|
|
567
628
|
"bg-panel-2 border-border border",
|
|
568
629
|
"focus-within:border-accent focus-within:ring-accent-dim focus-within:ring-[3px]",
|
|
569
630
|
"transition-[border-color,box-shadow] duration-(--duration-micro)",
|
|
570
631
|
className
|
|
571
632
|
),
|
|
572
|
-
style: { width, ...style },
|
|
633
|
+
style: { width: resolvedWidth, ...style },
|
|
573
634
|
children: [
|
|
574
|
-
/* @__PURE__ */ jsx9("span", { className: "text-text-dim leading-none", "aria-hidden": true, children: "\u2315" }),
|
|
635
|
+
/* @__PURE__ */ jsx9("span", { className: cn("text-text-dim leading-none", isTouch && "text-[18px]"), "aria-hidden": true, children: "\u2315" }),
|
|
575
636
|
/* @__PURE__ */ jsx9(
|
|
576
637
|
"input",
|
|
577
638
|
{
|
|
@@ -579,11 +640,14 @@ var SearchInput = forwardRef8(function SearchInput2({
|
|
|
579
640
|
type: "search",
|
|
580
641
|
placeholder,
|
|
581
642
|
"aria-label": ariaLabel ?? (typeof placeholder === "string" ? placeholder : "Search"),
|
|
582
|
-
className:
|
|
643
|
+
className: cn(
|
|
644
|
+
"text-text placeholder:text-text-dim min-w-0 flex-1 border-none bg-transparent outline-none",
|
|
645
|
+
isTouch ? "text-m-body" : "text-[13px]"
|
|
646
|
+
),
|
|
583
647
|
...props
|
|
584
648
|
}
|
|
585
649
|
),
|
|
586
|
-
|
|
650
|
+
resolvedShortcut && /* @__PURE__ */ jsx9("kbd", { className: "text-text-dim border-border rounded-xs border px-[6px] py-[2px] font-mono text-[10px]", children: resolvedShortcut })
|
|
587
651
|
]
|
|
588
652
|
}
|
|
589
653
|
);
|
|
@@ -917,14 +981,26 @@ import * as RadixSwitch from "@radix-ui/react-switch";
|
|
|
917
981
|
import { forwardRef as forwardRef13, useId as useId5 } from "react";
|
|
918
982
|
import { jsx as jsx14, jsxs as jsxs11 } from "react/jsx-runtime";
|
|
919
983
|
var trackClasses = {
|
|
920
|
-
|
|
921
|
-
|
|
984
|
+
comfortable: {
|
|
985
|
+
sm: "h-4 w-7",
|
|
986
|
+
md: "h-5 w-9"
|
|
987
|
+
},
|
|
988
|
+
touch: {
|
|
989
|
+
sm: "h-[26px] w-[44px]",
|
|
990
|
+
md: "h-[30px] w-[50px]"
|
|
991
|
+
}
|
|
922
992
|
};
|
|
923
993
|
var thumbClasses = {
|
|
924
|
-
|
|
925
|
-
|
|
994
|
+
comfortable: {
|
|
995
|
+
sm: "h-3 w-3 data-[state=checked]:translate-x-3",
|
|
996
|
+
md: "h-4 w-4 data-[state=checked]:translate-x-4"
|
|
997
|
+
},
|
|
998
|
+
touch: {
|
|
999
|
+
sm: "h-[22px] w-[22px] data-[state=checked]:translate-x-[18px]",
|
|
1000
|
+
md: "h-[26px] w-[26px] data-[state=checked]:translate-x-5"
|
|
1001
|
+
}
|
|
926
1002
|
};
|
|
927
|
-
var Switch = forwardRef13(function Switch2({ label, size = "md", className, id: idProp, ...props }, ref) {
|
|
1003
|
+
var Switch = forwardRef13(function Switch2({ label, size = "md", density = "comfortable", className, id: idProp, ...props }, ref) {
|
|
928
1004
|
const reactId = useId5();
|
|
929
1005
|
const id = idProp ?? `sw-${reactId}`;
|
|
930
1006
|
return /* @__PURE__ */ jsxs11(
|
|
@@ -946,7 +1022,7 @@ var Switch = forwardRef13(function Switch2({ label, size = "md", className, id:
|
|
|
946
1022
|
"bg-panel-2 border-border data-[state=checked]:bg-accent data-[state=checked]:border-accent",
|
|
947
1023
|
"focus-visible:ring-accent-dim outline-none focus-visible:ring-[3px]",
|
|
948
1024
|
"disabled:cursor-not-allowed",
|
|
949
|
-
trackClasses[size]
|
|
1025
|
+
trackClasses[density][size]
|
|
950
1026
|
),
|
|
951
1027
|
...props,
|
|
952
1028
|
children: /* @__PURE__ */ jsx14(
|
|
@@ -955,13 +1031,20 @@ var Switch = forwardRef13(function Switch2({ label, size = "md", className, id:
|
|
|
955
1031
|
className: cn(
|
|
956
1032
|
"bg-text absolute top-1/2 left-[1px] -translate-y-1/2 rounded-full shadow-sm",
|
|
957
1033
|
"data-[state=checked]:bg-on-accent transition-transform duration-(--duration-micro)",
|
|
958
|
-
thumbClasses[size]
|
|
1034
|
+
thumbClasses[density][size]
|
|
959
1035
|
)
|
|
960
1036
|
}
|
|
961
1037
|
)
|
|
962
1038
|
}
|
|
963
1039
|
),
|
|
964
|
-
label && /* @__PURE__ */ jsx14(
|
|
1040
|
+
label && /* @__PURE__ */ jsx14(
|
|
1041
|
+
"label",
|
|
1042
|
+
{
|
|
1043
|
+
htmlFor: id,
|
|
1044
|
+
className: cn("cursor-pointer", density === "touch" ? "text-m-body" : "text-[13px]"),
|
|
1045
|
+
children: label
|
|
1046
|
+
}
|
|
1047
|
+
)
|
|
965
1048
|
]
|
|
966
1049
|
}
|
|
967
1050
|
);
|
|
@@ -1229,7 +1312,7 @@ import { cva as cva6 } from "class-variance-authority";
|
|
|
1229
1312
|
import { forwardRef as forwardRef19 } from "react";
|
|
1230
1313
|
import { jsx as jsx20, jsxs as jsxs16 } from "react/jsx-runtime";
|
|
1231
1314
|
var cardStyles = cva6(
|
|
1232
|
-
"block bg-panel border border-border
|
|
1315
|
+
"block bg-panel border border-border transition-[border-color,transform,box-shadow] duration-(--duration-step)",
|
|
1233
1316
|
{
|
|
1234
1317
|
variants: {
|
|
1235
1318
|
variant: {
|
|
@@ -1240,14 +1323,19 @@ var cardStyles = cva6(
|
|
|
1240
1323
|
interactive: {
|
|
1241
1324
|
true: "cursor-pointer hover:border-border-strong hover:-translate-y-px hover:shadow",
|
|
1242
1325
|
false: ""
|
|
1326
|
+
},
|
|
1327
|
+
density: {
|
|
1328
|
+
comfortable: "rounded-base",
|
|
1329
|
+
touch: "rounded-m-card"
|
|
1243
1330
|
}
|
|
1244
1331
|
},
|
|
1245
|
-
defaultVariants: { variant: "default", interactive: false }
|
|
1332
|
+
defaultVariants: { variant: "default", interactive: false, density: "comfortable" }
|
|
1246
1333
|
}
|
|
1247
1334
|
);
|
|
1248
1335
|
var Card = forwardRef19(function Card2({
|
|
1249
1336
|
variant,
|
|
1250
1337
|
interactive,
|
|
1338
|
+
density,
|
|
1251
1339
|
title,
|
|
1252
1340
|
description,
|
|
1253
1341
|
actions,
|
|
@@ -1284,7 +1372,11 @@ var Card = forwardRef19(function Card2({
|
|
|
1284
1372
|
onKeyDown: handleKeyDown,
|
|
1285
1373
|
role: isInteractive ? "button" : void 0,
|
|
1286
1374
|
tabIndex: isInteractive ? 0 : void 0,
|
|
1287
|
-
className: cn(
|
|
1375
|
+
className: cn(
|
|
1376
|
+
cardStyles({ variant, interactive: wantsInteractive, density }),
|
|
1377
|
+
density === "touch" ? "p-4" : "p-[18px]",
|
|
1378
|
+
className
|
|
1379
|
+
),
|
|
1288
1380
|
...props,
|
|
1289
1381
|
children: [
|
|
1290
1382
|
(title || actions) && /* @__PURE__ */ jsxs16("div", { className: cn("flex items-start gap-3", (description || children) && "mb-[10px]"), children: [
|
|
@@ -1299,15 +1391,16 @@ var Card = forwardRef19(function Card2({
|
|
|
1299
1391
|
);
|
|
1300
1392
|
});
|
|
1301
1393
|
Card.displayName = "Card";
|
|
1302
|
-
var CardLink = forwardRef19(function CardLink2({ variant, title, description, footer, className, children, href, ...props }, ref) {
|
|
1394
|
+
var CardLink = forwardRef19(function CardLink2({ variant, density, title, description, footer, className, children, href, ...props }, ref) {
|
|
1303
1395
|
return /* @__PURE__ */ jsxs16(
|
|
1304
1396
|
"a",
|
|
1305
1397
|
{
|
|
1306
1398
|
ref,
|
|
1307
1399
|
href,
|
|
1308
1400
|
className: cn(
|
|
1309
|
-
cardStyles({ variant, interactive: true }),
|
|
1310
|
-
"focus-visible:ring-accent-dim
|
|
1401
|
+
cardStyles({ variant, interactive: true, density }),
|
|
1402
|
+
"focus-visible:ring-accent-dim no-underline outline-none focus-visible:ring-[3px]",
|
|
1403
|
+
density === "touch" ? "p-4" : "p-[18px]",
|
|
1311
1404
|
className
|
|
1312
1405
|
),
|
|
1313
1406
|
...props,
|
|
@@ -1358,19 +1451,21 @@ StatCard.displayName = "StatCard";
|
|
|
1358
1451
|
// src/components/Chip/Chip.tsx
|
|
1359
1452
|
import { forwardRef as forwardRef21 } from "react";
|
|
1360
1453
|
import { jsx as jsx22, jsxs as jsxs18 } from "react/jsx-runtime";
|
|
1361
|
-
var Chip = forwardRef21(function Chip2({ icon, onRemove, className, children, ...props }, ref) {
|
|
1454
|
+
var Chip = forwardRef21(function Chip2({ icon, onRemove, density = "comfortable", className, children, ...props }, ref) {
|
|
1455
|
+
const isTouch = density === "touch";
|
|
1362
1456
|
return /* @__PURE__ */ jsxs18(
|
|
1363
1457
|
"span",
|
|
1364
1458
|
{
|
|
1365
1459
|
ref,
|
|
1366
1460
|
className: cn(
|
|
1367
|
-
"inline-flex
|
|
1461
|
+
"inline-flex items-center gap-[6px] font-sans",
|
|
1462
|
+
isTouch ? "text-m-mono h-8 py-[5px] pr-[6px] pl-3" : "h-[26px] py-[4px] pr-1 pl-[10px] text-[12px]",
|
|
1368
1463
|
"bg-panel-2 text-text border-border rounded-full border",
|
|
1369
1464
|
className
|
|
1370
1465
|
),
|
|
1371
1466
|
...props,
|
|
1372
1467
|
children: [
|
|
1373
|
-
icon && /* @__PURE__ */ jsx22("span", { className: "text-text-dim inline-flex text-[10px]", children: icon }),
|
|
1468
|
+
icon && /* @__PURE__ */ jsx22("span", { className: cn("text-text-dim inline-flex", isTouch ? "text-[12px]" : "text-[10px]"), children: icon }),
|
|
1374
1469
|
children,
|
|
1375
1470
|
onRemove && /* @__PURE__ */ jsx22(
|
|
1376
1471
|
"button",
|
|
@@ -1378,7 +1473,10 @@ var Chip = forwardRef21(function Chip2({ icon, onRemove, className, children, ..
|
|
|
1378
1473
|
type: "button",
|
|
1379
1474
|
onClick: onRemove,
|
|
1380
1475
|
"aria-label": "Remove",
|
|
1381
|
-
className:
|
|
1476
|
+
className: cn(
|
|
1477
|
+
"bg-panel text-text-dim hover:text-text grid place-items-center rounded-full leading-none",
|
|
1478
|
+
isTouch ? "h-[22px] w-[22px] text-[12px]" : "h-[18px] w-[18px] text-[10px]"
|
|
1479
|
+
),
|
|
1382
1480
|
children: "\xD7"
|
|
1383
1481
|
}
|
|
1384
1482
|
)
|
|
@@ -1409,10 +1507,71 @@ var Kbd = forwardRef22(function Kbd2({ className, children, ...props }, ref) {
|
|
|
1409
1507
|
});
|
|
1410
1508
|
Kbd.displayName = "Kbd";
|
|
1411
1509
|
|
|
1510
|
+
// src/components/ScrollArea/ScrollArea.tsx
|
|
1511
|
+
import * as RadixScrollArea from "@radix-ui/react-scroll-area";
|
|
1512
|
+
import { forwardRef as forwardRef23 } from "react";
|
|
1513
|
+
import { jsx as jsx24, jsxs as jsxs19 } from "react/jsx-runtime";
|
|
1514
|
+
var scrollbarBase = "flex touch-none select-none p-[2px] transition-colors duration-(--duration-micro)";
|
|
1515
|
+
var thumbBase = 'relative flex-1 rounded-full bg-text-muted/40 hover:bg-text-muted/60 before:absolute before:inset-1/2 before:size-full before:min-h-[44px] before:min-w-[44px] before:-translate-x-1/2 before:-translate-y-1/2 before:content-[""]';
|
|
1516
|
+
var ScrollArea = forwardRef23(function ScrollArea2({
|
|
1517
|
+
type = "hover",
|
|
1518
|
+
orientation = "vertical",
|
|
1519
|
+
scrollHideDelay = 600,
|
|
1520
|
+
className,
|
|
1521
|
+
viewportClassName,
|
|
1522
|
+
viewportRef,
|
|
1523
|
+
children,
|
|
1524
|
+
...props
|
|
1525
|
+
}, ref) {
|
|
1526
|
+
const showVertical = orientation === "vertical" || orientation === "both";
|
|
1527
|
+
const showHorizontal = orientation === "horizontal" || orientation === "both";
|
|
1528
|
+
return /* @__PURE__ */ jsxs19(
|
|
1529
|
+
RadixScrollArea.Root,
|
|
1530
|
+
{
|
|
1531
|
+
ref,
|
|
1532
|
+
type,
|
|
1533
|
+
scrollHideDelay,
|
|
1534
|
+
className: cn("relative overflow-hidden", className),
|
|
1535
|
+
...props,
|
|
1536
|
+
children: [
|
|
1537
|
+
/* @__PURE__ */ jsx24(
|
|
1538
|
+
RadixScrollArea.Viewport,
|
|
1539
|
+
{
|
|
1540
|
+
ref: viewportRef,
|
|
1541
|
+
className: cn("h-full w-full rounded-[inherit]", viewportClassName),
|
|
1542
|
+
children
|
|
1543
|
+
}
|
|
1544
|
+
),
|
|
1545
|
+
showVertical && /* @__PURE__ */ jsx24(
|
|
1546
|
+
RadixScrollArea.Scrollbar,
|
|
1547
|
+
{
|
|
1548
|
+
orientation: "vertical",
|
|
1549
|
+
className: cn(scrollbarBase, "bg-panel-2/40 hover:bg-panel-2/80 h-full w-[10px]"),
|
|
1550
|
+
children: /* @__PURE__ */ jsx24(RadixScrollArea.Thumb, { className: thumbBase })
|
|
1551
|
+
}
|
|
1552
|
+
),
|
|
1553
|
+
showHorizontal && /* @__PURE__ */ jsx24(
|
|
1554
|
+
RadixScrollArea.Scrollbar,
|
|
1555
|
+
{
|
|
1556
|
+
orientation: "horizontal",
|
|
1557
|
+
className: cn(
|
|
1558
|
+
scrollbarBase,
|
|
1559
|
+
"bg-panel-2/40 hover:bg-panel-2/80 h-[10px] w-full flex-col"
|
|
1560
|
+
),
|
|
1561
|
+
children: /* @__PURE__ */ jsx24(RadixScrollArea.Thumb, { className: thumbBase })
|
|
1562
|
+
}
|
|
1563
|
+
),
|
|
1564
|
+
orientation === "both" && /* @__PURE__ */ jsx24(RadixScrollArea.Corner, { className: "bg-panel-2/60" })
|
|
1565
|
+
]
|
|
1566
|
+
}
|
|
1567
|
+
);
|
|
1568
|
+
});
|
|
1569
|
+
ScrollArea.displayName = "ScrollArea";
|
|
1570
|
+
|
|
1412
1571
|
// src/components/Skeleton/Skeleton.tsx
|
|
1413
1572
|
import { cva as cva7 } from "class-variance-authority";
|
|
1414
|
-
import { forwardRef as
|
|
1415
|
-
import { jsx as
|
|
1573
|
+
import { forwardRef as forwardRef24 } from "react";
|
|
1574
|
+
import { jsx as jsx25 } from "react/jsx-runtime";
|
|
1416
1575
|
var skeletonStyles = cva7("block bg-panel-2 animate-[ship-skeleton_1.4s_infinite]", {
|
|
1417
1576
|
variants: {
|
|
1418
1577
|
shape: {
|
|
@@ -1424,11 +1583,11 @@ var skeletonStyles = cva7("block bg-panel-2 animate-[ship-skeleton_1.4s_infinite
|
|
|
1424
1583
|
defaultVariants: { shape: "line" }
|
|
1425
1584
|
});
|
|
1426
1585
|
var defaultHeight = { line: 14, block: 80, circle: 40 };
|
|
1427
|
-
var Skeleton =
|
|
1586
|
+
var Skeleton = forwardRef24(function Skeleton2({ shape = "line", width = "100%", height, standalone = false, className, style, ...props }, ref) {
|
|
1428
1587
|
const h = height ?? defaultHeight[shape];
|
|
1429
1588
|
const w = shape === "circle" ? h : width;
|
|
1430
1589
|
const a11yProps = standalone ? { role: "status", "aria-busy": true, "aria-label": "Loading" } : { "aria-hidden": true };
|
|
1431
|
-
return /* @__PURE__ */
|
|
1590
|
+
return /* @__PURE__ */ jsx25(
|
|
1432
1591
|
"div",
|
|
1433
1592
|
{
|
|
1434
1593
|
ref,
|
|
@@ -1440,11 +1599,11 @@ var Skeleton = forwardRef23(function Skeleton2({ shape = "line", width = "100%",
|
|
|
1440
1599
|
);
|
|
1441
1600
|
});
|
|
1442
1601
|
Skeleton.displayName = "Skeleton";
|
|
1443
|
-
var SkeletonGroup =
|
|
1602
|
+
var SkeletonGroup = forwardRef24(function SkeletonGroup2({ label = "Loading", loading = true, className, children, ...props }, ref) {
|
|
1444
1603
|
if (!loading) {
|
|
1445
|
-
return /* @__PURE__ */
|
|
1604
|
+
return /* @__PURE__ */ jsx25("div", { ref, className, ...props, children });
|
|
1446
1605
|
}
|
|
1447
|
-
return /* @__PURE__ */
|
|
1606
|
+
return /* @__PURE__ */ jsx25(
|
|
1448
1607
|
"div",
|
|
1449
1608
|
{
|
|
1450
1609
|
ref,
|
|
@@ -1460,10 +1619,10 @@ var SkeletonGroup = forwardRef23(function SkeletonGroup2({ label = "Loading", lo
|
|
|
1460
1619
|
SkeletonGroup.displayName = "SkeletonGroup";
|
|
1461
1620
|
|
|
1462
1621
|
// src/components/Tag/Tag.tsx
|
|
1463
|
-
import { forwardRef as
|
|
1464
|
-
import { jsx as
|
|
1465
|
-
var Tag =
|
|
1466
|
-
return /* @__PURE__ */
|
|
1622
|
+
import { forwardRef as forwardRef25 } from "react";
|
|
1623
|
+
import { jsx as jsx26, jsxs as jsxs20 } from "react/jsx-runtime";
|
|
1624
|
+
var Tag = forwardRef25(function Tag2({ onRemove, icon, size = 22, className, children, ...props }, ref) {
|
|
1625
|
+
return /* @__PURE__ */ jsxs20(
|
|
1467
1626
|
"span",
|
|
1468
1627
|
{
|
|
1469
1628
|
ref,
|
|
@@ -1475,9 +1634,9 @@ var Tag = forwardRef24(function Tag2({ onRemove, icon, size = 22, className, chi
|
|
|
1475
1634
|
style: { height: size },
|
|
1476
1635
|
...props,
|
|
1477
1636
|
children: [
|
|
1478
|
-
icon && /* @__PURE__ */
|
|
1637
|
+
icon && /* @__PURE__ */ jsx26("span", { className: "text-text-dim inline-flex", children: icon }),
|
|
1479
1638
|
children,
|
|
1480
|
-
onRemove && /* @__PURE__ */
|
|
1639
|
+
onRemove && /* @__PURE__ */ jsx26(
|
|
1481
1640
|
"button",
|
|
1482
1641
|
{
|
|
1483
1642
|
type: "button",
|
|
@@ -1495,14 +1654,14 @@ Tag.displayName = "Tag";
|
|
|
1495
1654
|
|
|
1496
1655
|
// src/components/ContextMenu/ContextMenu.tsx
|
|
1497
1656
|
import * as RadixContext from "@radix-ui/react-context-menu";
|
|
1498
|
-
import { forwardRef as
|
|
1499
|
-
import { jsx as
|
|
1657
|
+
import { forwardRef as forwardRef26 } from "react";
|
|
1658
|
+
import { jsx as jsx27, jsxs as jsxs21 } from "react/jsx-runtime";
|
|
1500
1659
|
var ContextMenuRoot = RadixContext.Root;
|
|
1501
1660
|
var ContextMenuTrigger = RadixContext.Trigger;
|
|
1502
1661
|
var ContextMenuPortal = RadixContext.Portal;
|
|
1503
|
-
var ContextMenuContent =
|
|
1662
|
+
var ContextMenuContent = forwardRef26(
|
|
1504
1663
|
function ContextMenuContent2({ className, ...props }, ref) {
|
|
1505
|
-
return /* @__PURE__ */
|
|
1664
|
+
return /* @__PURE__ */ jsx27(RadixContext.Portal, { children: /* @__PURE__ */ jsx27(
|
|
1506
1665
|
RadixContext.Content,
|
|
1507
1666
|
{
|
|
1508
1667
|
ref,
|
|
@@ -1522,26 +1681,26 @@ var itemBase = cn(
|
|
|
1522
1681
|
"data-[highlighted]:bg-panel-2",
|
|
1523
1682
|
"data-[disabled]:opacity-40 data-[disabled]:cursor-not-allowed"
|
|
1524
1683
|
);
|
|
1525
|
-
var ContextMenuItem =
|
|
1684
|
+
var ContextMenuItem = forwardRef26(
|
|
1526
1685
|
function ContextMenuItem2({ icon, trailing, destructive, className, children, ...props }, ref) {
|
|
1527
|
-
return /* @__PURE__ */
|
|
1686
|
+
return /* @__PURE__ */ jsxs21(
|
|
1528
1687
|
RadixContext.Item,
|
|
1529
1688
|
{
|
|
1530
1689
|
ref,
|
|
1531
1690
|
className: cn(itemBase, destructive ? "text-err" : "text-text", className),
|
|
1532
1691
|
...props,
|
|
1533
1692
|
children: [
|
|
1534
|
-
icon && /* @__PURE__ */
|
|
1535
|
-
/* @__PURE__ */
|
|
1536
|
-
trailing && /* @__PURE__ */
|
|
1693
|
+
icon && /* @__PURE__ */ jsx27("span", { className: "w-[14px] text-[12px] opacity-70", children: icon }),
|
|
1694
|
+
/* @__PURE__ */ jsx27("span", { className: "flex-1", children }),
|
|
1695
|
+
trailing && /* @__PURE__ */ jsx27("span", { className: "text-text-dim font-mono text-[10px]", children: trailing })
|
|
1537
1696
|
]
|
|
1538
1697
|
}
|
|
1539
1698
|
);
|
|
1540
1699
|
}
|
|
1541
1700
|
);
|
|
1542
1701
|
ContextMenuItem.displayName = "ContextMenuItem";
|
|
1543
|
-
var ContextMenuSeparator =
|
|
1544
|
-
return /* @__PURE__ */
|
|
1702
|
+
var ContextMenuSeparator = forwardRef26(function ContextMenuSeparator2({ className, ...props }, ref) {
|
|
1703
|
+
return /* @__PURE__ */ jsx27(
|
|
1545
1704
|
RadixContext.Separator,
|
|
1546
1705
|
{
|
|
1547
1706
|
ref,
|
|
@@ -1555,15 +1714,15 @@ var ContextMenu = RadixContext.Root;
|
|
|
1555
1714
|
|
|
1556
1715
|
// src/components/Dialog/Dialog.tsx
|
|
1557
1716
|
import * as RadixDialog from "@radix-ui/react-dialog";
|
|
1558
|
-
import { forwardRef as
|
|
1559
|
-
import { jsx as
|
|
1717
|
+
import { forwardRef as forwardRef27 } from "react";
|
|
1718
|
+
import { jsx as jsx28, jsxs as jsxs22 } from "react/jsx-runtime";
|
|
1560
1719
|
var DialogRoot = RadixDialog.Root;
|
|
1561
1720
|
var DialogTrigger = RadixDialog.Trigger;
|
|
1562
1721
|
var DialogClose = RadixDialog.Close;
|
|
1563
1722
|
var DialogPortal = RadixDialog.Portal;
|
|
1564
|
-
var DialogOverlay =
|
|
1723
|
+
var DialogOverlay = forwardRef27(
|
|
1565
1724
|
function DialogOverlay2({ className, ...props }, ref) {
|
|
1566
|
-
return /* @__PURE__ */
|
|
1725
|
+
return /* @__PURE__ */ jsx28(
|
|
1567
1726
|
RadixDialog.Overlay,
|
|
1568
1727
|
{
|
|
1569
1728
|
ref,
|
|
@@ -1578,10 +1737,10 @@ var DialogOverlay = forwardRef26(
|
|
|
1578
1737
|
}
|
|
1579
1738
|
);
|
|
1580
1739
|
DialogOverlay.displayName = "DialogOverlay";
|
|
1581
|
-
var DialogContent =
|
|
1582
|
-
return /* @__PURE__ */
|
|
1583
|
-
/* @__PURE__ */
|
|
1584
|
-
/* @__PURE__ */
|
|
1740
|
+
var DialogContent = forwardRef27(function DialogContent2({ className, width = 460, style, children, ...props }, ref) {
|
|
1741
|
+
return /* @__PURE__ */ jsxs22(DialogPortal, { children: [
|
|
1742
|
+
/* @__PURE__ */ jsx28(DialogOverlay, {}),
|
|
1743
|
+
/* @__PURE__ */ jsx28(
|
|
1585
1744
|
RadixDialog.Content,
|
|
1586
1745
|
{
|
|
1587
1746
|
ref,
|
|
@@ -1601,31 +1760,32 @@ var DialogContent = forwardRef26(function DialogContent2({ className, width = 46
|
|
|
1601
1760
|
});
|
|
1602
1761
|
DialogContent.displayName = "DialogContent";
|
|
1603
1762
|
function Dialog({ title, description, footer, width, children, ...rootProps }) {
|
|
1604
|
-
return /* @__PURE__ */
|
|
1605
|
-
title && /* @__PURE__ */
|
|
1763
|
+
return /* @__PURE__ */ jsx28(DialogRoot, { ...rootProps, children: /* @__PURE__ */ jsxs22(DialogContent, { width, children: [
|
|
1764
|
+
title && /* @__PURE__ */ jsx28(
|
|
1606
1765
|
RadixDialog.Title,
|
|
1607
1766
|
{
|
|
1608
1767
|
className: cn("text-[16px] font-medium", description ? "mb-[6px]" : "mb-4"),
|
|
1609
1768
|
children: title
|
|
1610
1769
|
}
|
|
1611
1770
|
),
|
|
1612
|
-
description && /* @__PURE__ */
|
|
1771
|
+
description && /* @__PURE__ */ jsx28(RadixDialog.Description, { className: "text-text-muted mb-[18px] text-[13px] leading-[1.55]", children: description }),
|
|
1613
1772
|
children,
|
|
1614
|
-
footer && /* @__PURE__ */
|
|
1773
|
+
footer && /* @__PURE__ */ jsx28("div", { className: "mt-5 flex justify-end gap-2", children: footer })
|
|
1615
1774
|
] }) });
|
|
1616
1775
|
}
|
|
1617
1776
|
|
|
1618
1777
|
// src/components/Dialog/Drawer.tsx
|
|
1619
1778
|
import * as RadixDialog2 from "@radix-ui/react-dialog";
|
|
1620
|
-
import { forwardRef as
|
|
1621
|
-
import { jsx as
|
|
1779
|
+
import { forwardRef as forwardRef28 } from "react";
|
|
1780
|
+
import { jsx as jsx29, jsxs as jsxs23 } from "react/jsx-runtime";
|
|
1622
1781
|
var sideClasses = {
|
|
1623
|
-
left: "left-0 border-r border-border-strong data-[state=open]:animate-[ship-slide-in-left_220ms_var(--easing-out)]",
|
|
1624
|
-
right: "right-0 border-l border-border-strong data-[state=open]:animate-[ship-slide-in-right_220ms_var(--easing-out)]"
|
|
1782
|
+
left: "top-0 bottom-0 left-0 border-r border-border-strong data-[state=open]:animate-[ship-slide-in-left_220ms_var(--easing-out)]",
|
|
1783
|
+
right: "top-0 bottom-0 right-0 border-l border-border-strong data-[state=open]:animate-[ship-slide-in-right_220ms_var(--easing-out)]",
|
|
1784
|
+
bottom: "bottom-0 left-0 right-0 border-t border-border-strong rounded-t-m-sheet data-[state=open]:animate-[ship-slide-in-bottom_240ms_var(--easing-out)]"
|
|
1625
1785
|
};
|
|
1626
|
-
var DrawerHeader = ({ title, onClose }) => /* @__PURE__ */
|
|
1627
|
-
/* @__PURE__ */
|
|
1628
|
-
/* @__PURE__ */
|
|
1786
|
+
var DrawerHeader = ({ title, onClose }) => /* @__PURE__ */ jsxs23("div", { className: "border-border flex items-center justify-between border-b p-[16px] px-5", children: [
|
|
1787
|
+
/* @__PURE__ */ jsx29(RadixDialog2.Title, { className: "text-[14px] font-medium", children: title }),
|
|
1788
|
+
/* @__PURE__ */ jsx29(
|
|
1629
1789
|
RadixDialog2.Close,
|
|
1630
1790
|
{
|
|
1631
1791
|
onClick: onClose,
|
|
@@ -1635,22 +1795,28 @@ var DrawerHeader = ({ title, onClose }) => /* @__PURE__ */ jsxs22("div", { class
|
|
|
1635
1795
|
}
|
|
1636
1796
|
)
|
|
1637
1797
|
] });
|
|
1638
|
-
var
|
|
1639
|
-
|
|
1640
|
-
|
|
1641
|
-
|
|
1798
|
+
var SheetHeader = ({ title }) => /* @__PURE__ */ jsx29("div", { className: "px-5 pb-3", children: /* @__PURE__ */ jsx29(RadixDialog2.Title, { className: "text-m-body-lg font-semibold tracking-tight", children: title }) });
|
|
1799
|
+
var DragHandle = () => /* @__PURE__ */ jsx29("div", { className: "flex justify-center pt-3 pb-2", "aria-hidden": true, children: /* @__PURE__ */ jsx29("span", { className: "bg-border-strong h-1 w-9 rounded-full" }) });
|
|
1800
|
+
var Drawer = forwardRef28(function Drawer2({ side = "right", title, width = 420, height = "85vh", handle, children, ...rootProps }, ref) {
|
|
1801
|
+
const isBottom = side === "bottom";
|
|
1802
|
+
const showHandle = isBottom && (handle ?? true);
|
|
1803
|
+
const dimensionStyle = isBottom ? { height } : { width };
|
|
1804
|
+
return /* @__PURE__ */ jsx29(DialogRoot, { ...rootProps, children: /* @__PURE__ */ jsxs23(DialogPortal, { children: [
|
|
1805
|
+
/* @__PURE__ */ jsx29(DialogOverlay, {}),
|
|
1806
|
+
/* @__PURE__ */ jsxs23(
|
|
1642
1807
|
RadixDialog2.Content,
|
|
1643
1808
|
{
|
|
1644
1809
|
ref,
|
|
1645
1810
|
"aria-describedby": void 0,
|
|
1646
1811
|
className: cn(
|
|
1647
|
-
"bg-panel z-modal fixed
|
|
1812
|
+
"bg-panel z-modal fixed flex flex-col shadow-lg outline-none",
|
|
1648
1813
|
sideClasses[side]
|
|
1649
1814
|
),
|
|
1650
|
-
style:
|
|
1815
|
+
style: dimensionStyle,
|
|
1651
1816
|
children: [
|
|
1652
|
-
|
|
1653
|
-
/* @__PURE__ */
|
|
1817
|
+
showHandle && /* @__PURE__ */ jsx29(DragHandle, {}),
|
|
1818
|
+
title ? isBottom ? /* @__PURE__ */ jsx29(SheetHeader, { title }) : /* @__PURE__ */ jsx29(DrawerHeader, { title }) : /* @__PURE__ */ jsx29(RadixDialog2.Title, { className: "sr-only", children: isBottom ? "Sheet" : "Drawer" }),
|
|
1819
|
+
/* @__PURE__ */ jsx29("div", { className: cn("flex-1 overflow-auto", isBottom ? "px-5 pb-6" : "p-5"), children })
|
|
1654
1820
|
]
|
|
1655
1821
|
}
|
|
1656
1822
|
)
|
|
@@ -1660,12 +1826,12 @@ Drawer.displayName = "Drawer";
|
|
|
1660
1826
|
|
|
1661
1827
|
// src/components/Dialog/Sheet.tsx
|
|
1662
1828
|
import * as RadixDialog3 from "@radix-ui/react-dialog";
|
|
1663
|
-
import { forwardRef as
|
|
1664
|
-
import { jsx as
|
|
1665
|
-
var Sheet =
|
|
1666
|
-
return /* @__PURE__ */
|
|
1667
|
-
/* @__PURE__ */
|
|
1668
|
-
/* @__PURE__ */
|
|
1829
|
+
import { forwardRef as forwardRef29 } from "react";
|
|
1830
|
+
import { jsx as jsx30, jsxs as jsxs24 } from "react/jsx-runtime";
|
|
1831
|
+
var Sheet = forwardRef29(function Sheet2({ title, width = "min(640px, 90vw)", children, ...rootProps }, ref) {
|
|
1832
|
+
return /* @__PURE__ */ jsx30(DialogRoot, { ...rootProps, children: /* @__PURE__ */ jsxs24(DialogPortal, { children: [
|
|
1833
|
+
/* @__PURE__ */ jsx30(DialogOverlay, {}),
|
|
1834
|
+
/* @__PURE__ */ jsxs24(
|
|
1669
1835
|
RadixDialog3.Content,
|
|
1670
1836
|
{
|
|
1671
1837
|
ref,
|
|
@@ -1677,7 +1843,7 @@ var Sheet = forwardRef28(function Sheet2({ title, width = "min(640px, 90vw)", ch
|
|
|
1677
1843
|
),
|
|
1678
1844
|
style: { width },
|
|
1679
1845
|
children: [
|
|
1680
|
-
title ? /* @__PURE__ */
|
|
1846
|
+
title ? /* @__PURE__ */ jsx30(RadixDialog3.Title, { className: "mb-1 text-[15px] font-medium", children: title }) : /* @__PURE__ */ jsx30(RadixDialog3.Title, { className: "sr-only", children: "Sheet" }),
|
|
1681
1847
|
children
|
|
1682
1848
|
]
|
|
1683
1849
|
}
|
|
@@ -1688,15 +1854,15 @@ Sheet.displayName = "Sheet";
|
|
|
1688
1854
|
|
|
1689
1855
|
// src/components/Dialog/AlertDialog.tsx
|
|
1690
1856
|
import * as RadixAlert from "@radix-ui/react-alert-dialog";
|
|
1691
|
-
import { forwardRef as
|
|
1692
|
-
import { jsx as
|
|
1857
|
+
import { forwardRef as forwardRef30 } from "react";
|
|
1858
|
+
import { jsx as jsx31, jsxs as jsxs25 } from "react/jsx-runtime";
|
|
1693
1859
|
var AlertDialogRoot = RadixAlert.Root;
|
|
1694
1860
|
var AlertDialogTrigger = RadixAlert.Trigger;
|
|
1695
1861
|
var AlertDialogAction = RadixAlert.Action;
|
|
1696
1862
|
var AlertDialogCancel = RadixAlert.Cancel;
|
|
1697
|
-
var AlertDialog =
|
|
1698
|
-
return /* @__PURE__ */
|
|
1699
|
-
/* @__PURE__ */
|
|
1863
|
+
var AlertDialog = forwardRef30(function AlertDialog2({ title, description, footer, width = 460, children, ...rootProps }, ref) {
|
|
1864
|
+
return /* @__PURE__ */ jsx31(AlertDialogRoot, { ...rootProps, children: /* @__PURE__ */ jsxs25(RadixAlert.Portal, { children: [
|
|
1865
|
+
/* @__PURE__ */ jsx31(
|
|
1700
1866
|
RadixAlert.Overlay,
|
|
1701
1867
|
{
|
|
1702
1868
|
className: cn(
|
|
@@ -1705,7 +1871,7 @@ var AlertDialog = forwardRef29(function AlertDialog2({ title, description, foote
|
|
|
1705
1871
|
)
|
|
1706
1872
|
}
|
|
1707
1873
|
),
|
|
1708
|
-
/* @__PURE__ */
|
|
1874
|
+
/* @__PURE__ */ jsxs25(
|
|
1709
1875
|
RadixAlert.Content,
|
|
1710
1876
|
{
|
|
1711
1877
|
ref,
|
|
@@ -1716,16 +1882,16 @@ var AlertDialog = forwardRef29(function AlertDialog2({ title, description, foote
|
|
|
1716
1882
|
"data-[state=open]:animate-[ship-dialog-in_180ms_var(--easing-out)]"
|
|
1717
1883
|
),
|
|
1718
1884
|
children: [
|
|
1719
|
-
/* @__PURE__ */
|
|
1885
|
+
/* @__PURE__ */ jsx31(
|
|
1720
1886
|
RadixAlert.Title,
|
|
1721
1887
|
{
|
|
1722
1888
|
className: cn("text-[16px] font-medium", description ? "mb-[6px]" : "mb-4"),
|
|
1723
1889
|
children: title
|
|
1724
1890
|
}
|
|
1725
1891
|
),
|
|
1726
|
-
description && /* @__PURE__ */
|
|
1892
|
+
description && /* @__PURE__ */ jsx31(RadixAlert.Description, { className: "text-text-muted mb-[18px] text-[13px] leading-[1.55]", children: description }),
|
|
1727
1893
|
children,
|
|
1728
|
-
footer && /* @__PURE__ */
|
|
1894
|
+
footer && /* @__PURE__ */ jsx31("div", { className: "mt-5 flex justify-end gap-2", children: footer })
|
|
1729
1895
|
]
|
|
1730
1896
|
}
|
|
1731
1897
|
)
|
|
@@ -1735,17 +1901,17 @@ AlertDialog.displayName = "AlertDialog";
|
|
|
1735
1901
|
|
|
1736
1902
|
// src/components/DropdownMenu/DropdownMenu.tsx
|
|
1737
1903
|
import * as RadixMenu from "@radix-ui/react-dropdown-menu";
|
|
1738
|
-
import { forwardRef as
|
|
1739
|
-
import { jsx as
|
|
1904
|
+
import { forwardRef as forwardRef31 } from "react";
|
|
1905
|
+
import { jsx as jsx32, jsxs as jsxs26 } from "react/jsx-runtime";
|
|
1740
1906
|
var DropdownMenuRoot = RadixMenu.Root;
|
|
1741
1907
|
var DropdownMenuTrigger = RadixMenu.Trigger;
|
|
1742
1908
|
var DropdownMenuPortal = RadixMenu.Portal;
|
|
1743
1909
|
var DropdownMenuGroup = RadixMenu.Group;
|
|
1744
1910
|
var DropdownMenuLabel = RadixMenu.Label;
|
|
1745
1911
|
var DropdownMenuRadioGroup = RadixMenu.RadioGroup;
|
|
1746
|
-
var DropdownMenuContent =
|
|
1912
|
+
var DropdownMenuContent = forwardRef31(
|
|
1747
1913
|
function DropdownMenuContent2({ className, sideOffset = 6, align = "start", ...props }, ref) {
|
|
1748
|
-
return /* @__PURE__ */
|
|
1914
|
+
return /* @__PURE__ */ jsx32(RadixMenu.Portal, { children: /* @__PURE__ */ jsx32(
|
|
1749
1915
|
RadixMenu.Content,
|
|
1750
1916
|
{
|
|
1751
1917
|
ref,
|
|
@@ -1767,32 +1933,32 @@ var itemBase2 = cn(
|
|
|
1767
1933
|
"data-[highlighted]:bg-panel-2",
|
|
1768
1934
|
"data-[disabled]:opacity-40 data-[disabled]:cursor-not-allowed"
|
|
1769
1935
|
);
|
|
1770
|
-
var MenuItem =
|
|
1771
|
-
return /* @__PURE__ */
|
|
1936
|
+
var MenuItem = forwardRef31(function MenuItem2({ icon, trailing, destructive, className, children, ...props }, ref) {
|
|
1937
|
+
return /* @__PURE__ */ jsxs26(
|
|
1772
1938
|
RadixMenu.Item,
|
|
1773
1939
|
{
|
|
1774
1940
|
ref,
|
|
1775
1941
|
className: cn(itemBase2, destructive ? "text-err" : "text-text", className),
|
|
1776
1942
|
...props,
|
|
1777
1943
|
children: [
|
|
1778
|
-
icon && /* @__PURE__ */
|
|
1779
|
-
/* @__PURE__ */
|
|
1780
|
-
trailing && /* @__PURE__ */
|
|
1944
|
+
icon && /* @__PURE__ */ jsx32("span", { className: "w-[14px] text-[12px] opacity-70", children: icon }),
|
|
1945
|
+
/* @__PURE__ */ jsx32("span", { className: "flex-1", children }),
|
|
1946
|
+
trailing && /* @__PURE__ */ jsx32("span", { className: "text-text-dim font-mono text-[10px]", children: trailing })
|
|
1781
1947
|
]
|
|
1782
1948
|
}
|
|
1783
1949
|
);
|
|
1784
1950
|
});
|
|
1785
1951
|
MenuItem.displayName = "MenuItem";
|
|
1786
|
-
var MenuCheckboxItem =
|
|
1952
|
+
var MenuCheckboxItem = forwardRef31(
|
|
1787
1953
|
function MenuCheckboxItem2({ className, children, ...props }, ref) {
|
|
1788
|
-
return /* @__PURE__ */
|
|
1954
|
+
return /* @__PURE__ */ jsxs26(
|
|
1789
1955
|
RadixMenu.CheckboxItem,
|
|
1790
1956
|
{
|
|
1791
1957
|
ref,
|
|
1792
1958
|
className: cn(itemBase2, "text-text relative pl-[26px]", className),
|
|
1793
1959
|
...props,
|
|
1794
1960
|
children: [
|
|
1795
|
-
/* @__PURE__ */
|
|
1961
|
+
/* @__PURE__ */ jsx32(RadixMenu.ItemIndicator, { className: "text-accent absolute top-1/2 left-2 -translate-y-1/2 text-[10px]", children: "\u2713" }),
|
|
1796
1962
|
children
|
|
1797
1963
|
]
|
|
1798
1964
|
}
|
|
@@ -1800,9 +1966,9 @@ var MenuCheckboxItem = forwardRef30(
|
|
|
1800
1966
|
}
|
|
1801
1967
|
);
|
|
1802
1968
|
MenuCheckboxItem.displayName = "MenuCheckboxItem";
|
|
1803
|
-
var MenuSeparator =
|
|
1969
|
+
var MenuSeparator = forwardRef31(
|
|
1804
1970
|
function MenuSeparator2({ className, ...props }, ref) {
|
|
1805
|
-
return /* @__PURE__ */
|
|
1971
|
+
return /* @__PURE__ */ jsx32(
|
|
1806
1972
|
RadixMenu.Separator,
|
|
1807
1973
|
{
|
|
1808
1974
|
ref,
|
|
@@ -1817,14 +1983,14 @@ var DropdownMenu = RadixMenu.Root;
|
|
|
1817
1983
|
|
|
1818
1984
|
// src/components/HoverCard/HoverCard.tsx
|
|
1819
1985
|
import * as RadixHoverCard from "@radix-ui/react-hover-card";
|
|
1820
|
-
import { forwardRef as
|
|
1821
|
-
import { jsx as
|
|
1986
|
+
import { forwardRef as forwardRef32 } from "react";
|
|
1987
|
+
import { jsx as jsx33, jsxs as jsxs27 } from "react/jsx-runtime";
|
|
1822
1988
|
var HoverCardRoot = RadixHoverCard.Root;
|
|
1823
1989
|
var HoverCardTrigger = RadixHoverCard.Trigger;
|
|
1824
1990
|
var HoverCardPortal = RadixHoverCard.Portal;
|
|
1825
|
-
var HoverCardContent =
|
|
1991
|
+
var HoverCardContent = forwardRef32(
|
|
1826
1992
|
function HoverCardContent2({ className, sideOffset = 4, ...props }, ref) {
|
|
1827
|
-
return /* @__PURE__ */
|
|
1993
|
+
return /* @__PURE__ */ jsx33(RadixHoverCard.Portal, { children: /* @__PURE__ */ jsx33(
|
|
1828
1994
|
RadixHoverCard.Content,
|
|
1829
1995
|
{
|
|
1830
1996
|
ref,
|
|
@@ -1841,25 +2007,25 @@ var HoverCardContent = forwardRef31(
|
|
|
1841
2007
|
);
|
|
1842
2008
|
HoverCardContent.displayName = "HoverCardContent";
|
|
1843
2009
|
function HoverCard({ trigger, content, ...rootProps }) {
|
|
1844
|
-
return /* @__PURE__ */
|
|
1845
|
-
/* @__PURE__ */
|
|
1846
|
-
/* @__PURE__ */
|
|
2010
|
+
return /* @__PURE__ */ jsxs27(RadixHoverCard.Root, { openDelay: 200, closeDelay: 120, ...rootProps, children: [
|
|
2011
|
+
/* @__PURE__ */ jsx33(RadixHoverCard.Trigger, { asChild: true, children: trigger }),
|
|
2012
|
+
/* @__PURE__ */ jsx33(HoverCardContent, { children: content })
|
|
1847
2013
|
] });
|
|
1848
2014
|
}
|
|
1849
2015
|
|
|
1850
2016
|
// src/components/Popover/Popover.tsx
|
|
1851
2017
|
import * as RadixPopover from "@radix-ui/react-popover";
|
|
1852
|
-
import { forwardRef as
|
|
1853
|
-
import { jsx as
|
|
2018
|
+
import { forwardRef as forwardRef33 } from "react";
|
|
2019
|
+
import { jsx as jsx34 } from "react/jsx-runtime";
|
|
1854
2020
|
var PopoverRoot = RadixPopover.Root;
|
|
1855
2021
|
var PopoverTrigger = RadixPopover.Trigger;
|
|
1856
2022
|
var PopoverAnchor = RadixPopover.Anchor;
|
|
1857
2023
|
var PopoverPortal = RadixPopover.Portal;
|
|
1858
2024
|
var PopoverClose = RadixPopover.Close;
|
|
1859
2025
|
var PopoverArrow = RadixPopover.Arrow;
|
|
1860
|
-
var PopoverContent =
|
|
2026
|
+
var PopoverContent = forwardRef33(
|
|
1861
2027
|
function PopoverContent2({ className, align = "start", sideOffset = 6, ...props }, ref) {
|
|
1862
|
-
return /* @__PURE__ */
|
|
2028
|
+
return /* @__PURE__ */ jsx34(RadixPopover.Portal, { children: /* @__PURE__ */ jsx34(
|
|
1863
2029
|
RadixPopover.Content,
|
|
1864
2030
|
{
|
|
1865
2031
|
ref,
|
|
@@ -1882,13 +2048,13 @@ var Popover = RadixPopover.Root;
|
|
|
1882
2048
|
import * as RadixToast from "@radix-ui/react-toast";
|
|
1883
2049
|
import {
|
|
1884
2050
|
createContext,
|
|
1885
|
-
forwardRef as
|
|
2051
|
+
forwardRef as forwardRef34,
|
|
1886
2052
|
useCallback as useCallback6,
|
|
1887
2053
|
useContext,
|
|
1888
2054
|
useMemo,
|
|
1889
2055
|
useState as useState7
|
|
1890
2056
|
} from "react";
|
|
1891
|
-
import { jsx as
|
|
2057
|
+
import { jsx as jsx35, jsxs as jsxs28 } from "react/jsx-runtime";
|
|
1892
2058
|
var ToastContext = createContext(null);
|
|
1893
2059
|
var variantIcon = {
|
|
1894
2060
|
default: "\u25CF",
|
|
@@ -1931,10 +2097,10 @@ function ToastProvider({ children }) {
|
|
|
1931
2097
|
setToasts((prev) => prev.filter((t) => t.id !== id));
|
|
1932
2098
|
}, []);
|
|
1933
2099
|
const value = useMemo(() => ({ toast, dismiss }), [toast, dismiss]);
|
|
1934
|
-
return /* @__PURE__ */
|
|
2100
|
+
return /* @__PURE__ */ jsx35(ToastContext.Provider, { value, children: /* @__PURE__ */ jsxs28(RadixToast.Provider, { swipeDirection: "right", children: [
|
|
1935
2101
|
children,
|
|
1936
|
-
toasts.map((t) => /* @__PURE__ */
|
|
1937
|
-
/* @__PURE__ */
|
|
2102
|
+
toasts.map((t) => /* @__PURE__ */ jsx35(ToastCard, { toast: t, onDismiss: () => dismiss(t.id) }, t.id)),
|
|
2103
|
+
/* @__PURE__ */ jsx35(RadixToast.Viewport, { className: "z-toast fixed right-5 bottom-5 flex w-[380px] max-w-[calc(100vw-40px)] flex-col gap-2 outline-none" })
|
|
1938
2104
|
] }) });
|
|
1939
2105
|
}
|
|
1940
2106
|
function useToast() {
|
|
@@ -1942,9 +2108,9 @@ function useToast() {
|
|
|
1942
2108
|
if (!ctx) throw new Error("useToast must be inside <ToastProvider>");
|
|
1943
2109
|
return ctx;
|
|
1944
2110
|
}
|
|
1945
|
-
var ToastCard =
|
|
2111
|
+
var ToastCard = forwardRef34(function ToastCard2({ toast, onDismiss }, ref) {
|
|
1946
2112
|
const variant = toast.variant ?? "default";
|
|
1947
|
-
return /* @__PURE__ */
|
|
2113
|
+
return /* @__PURE__ */ jsxs28(
|
|
1948
2114
|
RadixToast.Root,
|
|
1949
2115
|
{
|
|
1950
2116
|
ref,
|
|
@@ -1959,13 +2125,13 @@ var ToastCard = forwardRef33(function ToastCard2({ toast, onDismiss }, ref) {
|
|
|
1959
2125
|
variantBorderLeft[variant]
|
|
1960
2126
|
),
|
|
1961
2127
|
children: [
|
|
1962
|
-
/* @__PURE__ */
|
|
1963
|
-
/* @__PURE__ */
|
|
1964
|
-
/* @__PURE__ */
|
|
1965
|
-
toast.description && /* @__PURE__ */
|
|
1966
|
-
toast.action && /* @__PURE__ */
|
|
2128
|
+
/* @__PURE__ */ jsx35("span", { className: cn("mt-px text-[14px] leading-none", variantTextColor[variant]), children: variantIcon[variant] }),
|
|
2129
|
+
/* @__PURE__ */ jsxs28("div", { className: "min-w-0 flex-1", children: [
|
|
2130
|
+
/* @__PURE__ */ jsx35(RadixToast.Title, { className: "text-text text-[13px] font-medium", children: toast.title }),
|
|
2131
|
+
toast.description && /* @__PURE__ */ jsx35(RadixToast.Description, { className: "text-text-muted mt-[2px] text-[12px] leading-[1.5]", children: toast.description }),
|
|
2132
|
+
toast.action && /* @__PURE__ */ jsx35("div", { className: "mt-2", children: toast.action })
|
|
1967
2133
|
] }),
|
|
1968
|
-
/* @__PURE__ */
|
|
2134
|
+
/* @__PURE__ */ jsx35(
|
|
1969
2135
|
RadixToast.Close,
|
|
1970
2136
|
{
|
|
1971
2137
|
"aria-label": "Dismiss",
|
|
@@ -1981,16 +2147,16 @@ ToastCard.displayName = "ToastCard";
|
|
|
1981
2147
|
|
|
1982
2148
|
// src/components/Tooltip/Tooltip.tsx
|
|
1983
2149
|
import * as RadixTooltip from "@radix-ui/react-tooltip";
|
|
1984
|
-
import { forwardRef as
|
|
1985
|
-
import { jsx as
|
|
2150
|
+
import { forwardRef as forwardRef35 } from "react";
|
|
2151
|
+
import { jsx as jsx36, jsxs as jsxs29 } from "react/jsx-runtime";
|
|
1986
2152
|
var TooltipProvider = RadixTooltip.Provider;
|
|
1987
2153
|
var TooltipRoot = RadixTooltip.Root;
|
|
1988
2154
|
var TooltipTrigger = RadixTooltip.Trigger;
|
|
1989
2155
|
var TooltipPortal = RadixTooltip.Portal;
|
|
1990
2156
|
var TooltipArrow = RadixTooltip.Arrow;
|
|
1991
|
-
var TooltipContent =
|
|
2157
|
+
var TooltipContent = forwardRef35(
|
|
1992
2158
|
function TooltipContent2({ className, sideOffset = 6, ...props }, ref) {
|
|
1993
|
-
return /* @__PURE__ */
|
|
2159
|
+
return /* @__PURE__ */ jsx36(RadixTooltip.Portal, { children: /* @__PURE__ */ jsx36(
|
|
1994
2160
|
RadixTooltip.Content,
|
|
1995
2161
|
{
|
|
1996
2162
|
ref,
|
|
@@ -2008,16 +2174,16 @@ var TooltipContent = forwardRef34(
|
|
|
2008
2174
|
);
|
|
2009
2175
|
TooltipContent.displayName = "TooltipContent";
|
|
2010
2176
|
function Tooltip({ content, children, side = "top", delayDuration = 400 }) {
|
|
2011
|
-
return /* @__PURE__ */
|
|
2012
|
-
/* @__PURE__ */
|
|
2013
|
-
/* @__PURE__ */
|
|
2177
|
+
return /* @__PURE__ */ jsx36(TooltipProvider, { delayDuration, children: /* @__PURE__ */ jsxs29(TooltipRoot, { children: [
|
|
2178
|
+
/* @__PURE__ */ jsx36(TooltipTrigger, { asChild: true, children }),
|
|
2179
|
+
/* @__PURE__ */ jsx36(TooltipContent, { side, children: content })
|
|
2014
2180
|
] }) });
|
|
2015
2181
|
}
|
|
2016
2182
|
|
|
2017
2183
|
// src/patterns/Alert/Alert.tsx
|
|
2018
2184
|
import { cva as cva8 } from "class-variance-authority";
|
|
2019
|
-
import { forwardRef as
|
|
2020
|
-
import { jsx as
|
|
2185
|
+
import { forwardRef as forwardRef36 } from "react";
|
|
2186
|
+
import { jsx as jsx37, jsxs as jsxs30 } from "react/jsx-runtime";
|
|
2021
2187
|
var alertStyles = cva8("flex items-start gap-3 rounded-base border bg-panel p-3 text-[13px]", {
|
|
2022
2188
|
variants: {
|
|
2023
2189
|
tone: {
|
|
@@ -2041,7 +2207,7 @@ var defaultGlyph = {
|
|
|
2041
2207
|
warn: "!",
|
|
2042
2208
|
err: "\xD7"
|
|
2043
2209
|
};
|
|
2044
|
-
var Alert =
|
|
2210
|
+
var Alert = forwardRef36(function Alert2({
|
|
2045
2211
|
tone = "accent",
|
|
2046
2212
|
title,
|
|
2047
2213
|
description,
|
|
@@ -2053,7 +2219,7 @@ var Alert = forwardRef35(function Alert2({
|
|
|
2053
2219
|
...props
|
|
2054
2220
|
}, ref) {
|
|
2055
2221
|
const t = tone ?? "accent";
|
|
2056
|
-
return /* @__PURE__ */
|
|
2222
|
+
return /* @__PURE__ */ jsxs30(
|
|
2057
2223
|
"div",
|
|
2058
2224
|
{
|
|
2059
2225
|
ref,
|
|
@@ -2062,13 +2228,13 @@ var Alert = forwardRef35(function Alert2({
|
|
|
2062
2228
|
className: cn(alertStyles({ tone }), className),
|
|
2063
2229
|
...props,
|
|
2064
2230
|
children: [
|
|
2065
|
-
/* @__PURE__ */
|
|
2066
|
-
/* @__PURE__ */
|
|
2067
|
-
title && /* @__PURE__ */
|
|
2068
|
-
description && /* @__PURE__ */
|
|
2231
|
+
/* @__PURE__ */ jsx37("span", { "aria-hidden": true, className: cn("mt-[1px] text-[14px] leading-none", iconColorClass[t]), children: icon ?? defaultGlyph[t] }),
|
|
2232
|
+
/* @__PURE__ */ jsxs30("div", { className: "min-w-0 flex-1", children: [
|
|
2233
|
+
title && /* @__PURE__ */ jsx37("div", { className: "font-medium", children: title }),
|
|
2234
|
+
description && /* @__PURE__ */ jsx37("div", { className: "text-text-muted mt-[2px] text-[12px]", children: description }),
|
|
2069
2235
|
children
|
|
2070
2236
|
] }),
|
|
2071
|
-
action && /* @__PURE__ */
|
|
2237
|
+
action && /* @__PURE__ */ jsx37("div", { className: "ml-1 shrink-0", children: action })
|
|
2072
2238
|
]
|
|
2073
2239
|
}
|
|
2074
2240
|
);
|
|
@@ -2077,8 +2243,8 @@ Alert.displayName = "Alert";
|
|
|
2077
2243
|
|
|
2078
2244
|
// src/patterns/Banner/Banner.tsx
|
|
2079
2245
|
import { cva as cva9 } from "class-variance-authority";
|
|
2080
|
-
import { forwardRef as
|
|
2081
|
-
import { jsx as
|
|
2246
|
+
import { forwardRef as forwardRef37 } from "react";
|
|
2247
|
+
import { jsx as jsx38, jsxs as jsxs31 } from "react/jsx-runtime";
|
|
2082
2248
|
var bannerStyles = cva9(
|
|
2083
2249
|
"flex items-center gap-3 border-b border-border px-[14px] py-2 text-[12px]",
|
|
2084
2250
|
{
|
|
@@ -2103,9 +2269,9 @@ var defaultGlyph2 = {
|
|
|
2103
2269
|
warn: "!",
|
|
2104
2270
|
err: "\xD7"
|
|
2105
2271
|
};
|
|
2106
|
-
var Banner =
|
|
2272
|
+
var Banner = forwardRef37(function Banner2({ tone = "accent", sticky, icon, action, live = "polite", className, children, ...props }, ref) {
|
|
2107
2273
|
const t = tone ?? "accent";
|
|
2108
|
-
return /* @__PURE__ */
|
|
2274
|
+
return /* @__PURE__ */ jsxs31(
|
|
2109
2275
|
"div",
|
|
2110
2276
|
{
|
|
2111
2277
|
ref,
|
|
@@ -2114,9 +2280,9 @@ var Banner = forwardRef36(function Banner2({ tone = "accent", sticky, icon, acti
|
|
|
2114
2280
|
className: cn(bannerStyles({ tone, sticky }), className),
|
|
2115
2281
|
...props,
|
|
2116
2282
|
children: [
|
|
2117
|
-
/* @__PURE__ */
|
|
2118
|
-
/* @__PURE__ */
|
|
2119
|
-
action && /* @__PURE__ */
|
|
2283
|
+
/* @__PURE__ */ jsx38("span", { "aria-hidden": true, className: "leading-none", children: icon ?? defaultGlyph2[t] }),
|
|
2284
|
+
/* @__PURE__ */ jsx38("div", { className: "min-w-0 flex-1", children }),
|
|
2285
|
+
action && /* @__PURE__ */ jsx38("div", { className: "ml-auto", children: action })
|
|
2120
2286
|
]
|
|
2121
2287
|
}
|
|
2122
2288
|
);
|
|
@@ -2126,30 +2292,30 @@ Banner.displayName = "Banner";
|
|
|
2126
2292
|
// src/patterns/Breadcrumbs/Breadcrumbs.tsx
|
|
2127
2293
|
import {
|
|
2128
2294
|
Children as Children2,
|
|
2129
|
-
forwardRef as
|
|
2295
|
+
forwardRef as forwardRef38,
|
|
2130
2296
|
isValidElement as isValidElement2
|
|
2131
2297
|
} from "react";
|
|
2132
|
-
import { jsx as
|
|
2133
|
-
var Breadcrumbs =
|
|
2298
|
+
import { jsx as jsx39, jsxs as jsxs32 } from "react/jsx-runtime";
|
|
2299
|
+
var Breadcrumbs = forwardRef38(function Breadcrumbs2({ separator = "/", className, children, ...props }, ref) {
|
|
2134
2300
|
const crumbs = Children2.toArray(children).filter(isValidElement2);
|
|
2135
2301
|
const last = crumbs.length - 1;
|
|
2136
|
-
return /* @__PURE__ */
|
|
2302
|
+
return /* @__PURE__ */ jsx39("nav", { ref, "aria-label": "Breadcrumb", className: cn("text-[13px]", className), ...props, children: /* @__PURE__ */ jsx39("ol", { className: "text-text-muted flex flex-wrap items-center gap-[6px]", children: crumbs.map((crumb, i) => {
|
|
2137
2303
|
const isCurrent = i === last;
|
|
2138
|
-
return /* @__PURE__ */
|
|
2139
|
-
isCurrent ? /* @__PURE__ */
|
|
2140
|
-
!isCurrent && /* @__PURE__ */
|
|
2304
|
+
return /* @__PURE__ */ jsxs32("li", { className: "inline-flex items-center gap-[6px]", children: [
|
|
2305
|
+
isCurrent ? /* @__PURE__ */ jsx39(Crumb, { ...crumb.props, current: true }) : crumb,
|
|
2306
|
+
!isCurrent && /* @__PURE__ */ jsx39("span", { "aria-hidden": true, className: "text-text-dim", children: separator })
|
|
2141
2307
|
] }, i);
|
|
2142
2308
|
}) }) });
|
|
2143
2309
|
});
|
|
2144
2310
|
Breadcrumbs.displayName = "Breadcrumbs";
|
|
2145
|
-
var Crumb =
|
|
2311
|
+
var Crumb = forwardRef38(function Crumb2({ current, className, href, children, ...props }, ref) {
|
|
2146
2312
|
if (current) {
|
|
2147
|
-
return /* @__PURE__ */
|
|
2313
|
+
return /* @__PURE__ */ jsx39("span", { "aria-current": "page", className: cn("text-text", className), children });
|
|
2148
2314
|
}
|
|
2149
2315
|
if (href === void 0) {
|
|
2150
|
-
return /* @__PURE__ */
|
|
2316
|
+
return /* @__PURE__ */ jsx39("span", { className: cn("text-text-dim", className), children });
|
|
2151
2317
|
}
|
|
2152
|
-
return /* @__PURE__ */
|
|
2318
|
+
return /* @__PURE__ */ jsx39(
|
|
2153
2319
|
"a",
|
|
2154
2320
|
{
|
|
2155
2321
|
ref,
|
|
@@ -2164,14 +2330,14 @@ Crumb.displayName = "Crumb";
|
|
|
2164
2330
|
|
|
2165
2331
|
// src/patterns/Combobox/Combobox.tsx
|
|
2166
2332
|
import {
|
|
2167
|
-
forwardRef as
|
|
2333
|
+
forwardRef as forwardRef39,
|
|
2168
2334
|
useEffect as useEffect5,
|
|
2169
2335
|
useId as useId6,
|
|
2170
2336
|
useMemo as useMemo2,
|
|
2171
2337
|
useRef as useRef4,
|
|
2172
2338
|
useState as useState8
|
|
2173
2339
|
} from "react";
|
|
2174
|
-
import { jsx as
|
|
2340
|
+
import { jsx as jsx40, jsxs as jsxs33 } from "react/jsx-runtime";
|
|
2175
2341
|
function normalize(option) {
|
|
2176
2342
|
if (typeof option === "string") {
|
|
2177
2343
|
return { value: option, label: option, searchText: option.toLowerCase() };
|
|
@@ -2187,7 +2353,7 @@ function normalize(option) {
|
|
|
2187
2353
|
};
|
|
2188
2354
|
}
|
|
2189
2355
|
var defaultFilter = (option, query) => option.searchText.includes(query.toLowerCase());
|
|
2190
|
-
var Combobox =
|
|
2356
|
+
var Combobox = forwardRef39(function Combobox2({
|
|
2191
2357
|
options,
|
|
2192
2358
|
value: valueProp,
|
|
2193
2359
|
defaultValue,
|
|
@@ -2264,8 +2430,8 @@ var Combobox = forwardRef38(function Combobox2({
|
|
|
2264
2430
|
setOpen(false);
|
|
2265
2431
|
}
|
|
2266
2432
|
};
|
|
2267
|
-
return /* @__PURE__ */
|
|
2268
|
-
/* @__PURE__ */
|
|
2433
|
+
return /* @__PURE__ */ jsxs33("div", { ref: wrapperRef, className: "relative", style: { width }, children: [
|
|
2434
|
+
/* @__PURE__ */ jsx40(
|
|
2269
2435
|
"input",
|
|
2270
2436
|
{
|
|
2271
2437
|
ref,
|
|
@@ -2299,7 +2465,7 @@ var Combobox = forwardRef38(function Combobox2({
|
|
|
2299
2465
|
)
|
|
2300
2466
|
}
|
|
2301
2467
|
),
|
|
2302
|
-
open && /* @__PURE__ */
|
|
2468
|
+
open && /* @__PURE__ */ jsx40(
|
|
2303
2469
|
"ul",
|
|
2304
2470
|
{
|
|
2305
2471
|
id: listboxId,
|
|
@@ -2309,9 +2475,9 @@ var Combobox = forwardRef38(function Combobox2({
|
|
|
2309
2475
|
"z-dropdown absolute top-full right-0 left-0 mt-1 max-h-[220px] overflow-auto",
|
|
2310
2476
|
"border-border bg-panel rounded-md border p-1 shadow-lg"
|
|
2311
2477
|
),
|
|
2312
|
-
children: filtered.length === 0 ? /* @__PURE__ */
|
|
2478
|
+
children: filtered.length === 0 ? /* @__PURE__ */ jsx40("li", { className: "text-text-dim px-2 py-3 text-center text-[12px]", role: "presentation", children: emptyState ?? "No matches" }) : filtered.map((option, i) => {
|
|
2313
2479
|
const isActive = i === cursor;
|
|
2314
|
-
return /* @__PURE__ */
|
|
2480
|
+
return /* @__PURE__ */ jsxs33(
|
|
2315
2481
|
"li",
|
|
2316
2482
|
{
|
|
2317
2483
|
id: `${listboxId}-option-${i}`,
|
|
@@ -2329,8 +2495,8 @@ var Combobox = forwardRef38(function Combobox2({
|
|
|
2329
2495
|
option.disabled && "pointer-events-none opacity-40"
|
|
2330
2496
|
),
|
|
2331
2497
|
children: [
|
|
2332
|
-
/* @__PURE__ */
|
|
2333
|
-
option.description && /* @__PURE__ */
|
|
2498
|
+
/* @__PURE__ */ jsx40("div", { children: option.label }),
|
|
2499
|
+
option.description && /* @__PURE__ */ jsx40("div", { className: "text-text-dim text-[11px]", children: option.description })
|
|
2334
2500
|
]
|
|
2335
2501
|
},
|
|
2336
2502
|
option.value
|
|
@@ -2338,19 +2504,19 @@ var Combobox = forwardRef38(function Combobox2({
|
|
|
2338
2504
|
})
|
|
2339
2505
|
}
|
|
2340
2506
|
),
|
|
2341
|
-
name && /* @__PURE__ */
|
|
2507
|
+
name && /* @__PURE__ */ jsx40("input", { type: "hidden", name, value: value ?? "", readOnly: true })
|
|
2342
2508
|
] });
|
|
2343
2509
|
});
|
|
2344
2510
|
Combobox.displayName = "Combobox";
|
|
2345
2511
|
|
|
2346
2512
|
// src/patterns/CommandPalette/CommandPalette.tsx
|
|
2347
2513
|
import * as RadixDialog4 from "@radix-ui/react-dialog";
|
|
2348
|
-
import { forwardRef as
|
|
2349
|
-
import { Fragment, jsx as
|
|
2514
|
+
import { forwardRef as forwardRef40, useEffect as useEffect6, useId as useId7, useMemo as useMemo3 } from "react";
|
|
2515
|
+
import { Fragment, jsx as jsx41, jsxs as jsxs34 } from "react/jsx-runtime";
|
|
2350
2516
|
function flatItems(groups) {
|
|
2351
2517
|
return groups.flatMap((g) => g.items);
|
|
2352
2518
|
}
|
|
2353
|
-
var CommandPalette =
|
|
2519
|
+
var CommandPalette = forwardRef40(
|
|
2354
2520
|
function CommandPalette2({
|
|
2355
2521
|
open,
|
|
2356
2522
|
onOpenChange,
|
|
@@ -2379,8 +2545,8 @@ var CommandPalette = forwardRef39(
|
|
|
2379
2545
|
useEffect6(() => {
|
|
2380
2546
|
setCursor(0);
|
|
2381
2547
|
}, [query, groups, setCursor]);
|
|
2382
|
-
return /* @__PURE__ */
|
|
2383
|
-
/* @__PURE__ */
|
|
2548
|
+
return /* @__PURE__ */ jsx41(RadixDialog4.Root, { open, onOpenChange, children: /* @__PURE__ */ jsxs34(RadixDialog4.Portal, { children: [
|
|
2549
|
+
/* @__PURE__ */ jsx41(
|
|
2384
2550
|
RadixDialog4.Overlay,
|
|
2385
2551
|
{
|
|
2386
2552
|
className: cn(
|
|
@@ -2389,7 +2555,7 @@ var CommandPalette = forwardRef39(
|
|
|
2389
2555
|
)
|
|
2390
2556
|
}
|
|
2391
2557
|
),
|
|
2392
|
-
/* @__PURE__ */
|
|
2558
|
+
/* @__PURE__ */ jsxs34(
|
|
2393
2559
|
RadixDialog4.Content,
|
|
2394
2560
|
{
|
|
2395
2561
|
ref,
|
|
@@ -2403,10 +2569,10 @@ var CommandPalette = forwardRef39(
|
|
|
2403
2569
|
),
|
|
2404
2570
|
onKeyDown,
|
|
2405
2571
|
children: [
|
|
2406
|
-
/* @__PURE__ */
|
|
2407
|
-
/* @__PURE__ */
|
|
2408
|
-
/* @__PURE__ */
|
|
2409
|
-
/* @__PURE__ */
|
|
2572
|
+
/* @__PURE__ */ jsx41(RadixDialog4.Title, { className: "sr-only", children: "Command palette" }),
|
|
2573
|
+
/* @__PURE__ */ jsxs34("div", { className: "border-border flex items-center gap-[10px] border-b px-4 py-[14px]", children: [
|
|
2574
|
+
/* @__PURE__ */ jsx41("span", { "aria-hidden": true, className: "text-text-dim", children: "\u2315" }),
|
|
2575
|
+
/* @__PURE__ */ jsx41(
|
|
2410
2576
|
"input",
|
|
2411
2577
|
{
|
|
2412
2578
|
autoFocus: true,
|
|
@@ -2423,9 +2589,9 @@ var CommandPalette = forwardRef39(
|
|
|
2423
2589
|
className: "text-text placeholder:text-text-dim flex-1 border-0 bg-transparent text-[14px] outline-none"
|
|
2424
2590
|
}
|
|
2425
2591
|
),
|
|
2426
|
-
/* @__PURE__ */
|
|
2592
|
+
/* @__PURE__ */ jsx41("span", { className: "border-border text-text-dim rounded-xs border px-[6px] py-[2px] font-mono text-[10px]", children: "ESC" })
|
|
2427
2593
|
] }),
|
|
2428
|
-
/* @__PURE__ */
|
|
2594
|
+
/* @__PURE__ */ jsx41("div", { id: listboxId, className: "min-h-[220px] p-2", role: "listbox", "aria-label": "Results", children: flat.length === 0 ? emptyState ?? /* @__PURE__ */ jsx41("div", { className: "text-text-dim px-3 py-5 text-center text-[12px]", children: "No matches" }) : /* @__PURE__ */ jsx41(
|
|
2429
2595
|
CommandGroups,
|
|
2430
2596
|
{
|
|
2431
2597
|
groups,
|
|
@@ -2435,7 +2601,7 @@ var CommandPalette = forwardRef39(
|
|
|
2435
2601
|
optionId
|
|
2436
2602
|
}
|
|
2437
2603
|
) }),
|
|
2438
|
-
footer && /* @__PURE__ */
|
|
2604
|
+
footer && /* @__PURE__ */ jsx41("div", { className: "border-border text-text-dim flex gap-4 border-t px-[14px] py-[10px] font-mono text-[10px]", children: footer })
|
|
2439
2605
|
]
|
|
2440
2606
|
}
|
|
2441
2607
|
)
|
|
@@ -2445,10 +2611,10 @@ var CommandPalette = forwardRef39(
|
|
|
2445
2611
|
CommandPalette.displayName = "CommandPalette";
|
|
2446
2612
|
function CommandGroups({ groups, cursor, setCursor, onSelect, optionId }) {
|
|
2447
2613
|
let runningIndex = 0;
|
|
2448
|
-
return /* @__PURE__ */
|
|
2614
|
+
return /* @__PURE__ */ jsx41(Fragment, { children: groups.map((group, gIdx) => {
|
|
2449
2615
|
if (group.items.length === 0) return null;
|
|
2450
|
-
return /* @__PURE__ */
|
|
2451
|
-
group.label && /* @__PURE__ */
|
|
2616
|
+
return /* @__PURE__ */ jsxs34("div", { children: [
|
|
2617
|
+
group.label && /* @__PURE__ */ jsxs34("div", { className: "text-text-dim px-2 pt-2 pb-1 font-mono text-[9px] tracking-[1.4px] uppercase", children: [
|
|
2452
2618
|
group.label,
|
|
2453
2619
|
" \xB7 ",
|
|
2454
2620
|
group.items.length
|
|
@@ -2456,7 +2622,7 @@ function CommandGroups({ groups, cursor, setCursor, onSelect, optionId }) {
|
|
|
2456
2622
|
group.items.map((item) => {
|
|
2457
2623
|
const myIndex = runningIndex++;
|
|
2458
2624
|
const isActive = cursor === myIndex;
|
|
2459
|
-
return /* @__PURE__ */
|
|
2625
|
+
return /* @__PURE__ */ jsxs34(
|
|
2460
2626
|
"button",
|
|
2461
2627
|
{
|
|
2462
2628
|
id: optionId(myIndex),
|
|
@@ -2470,7 +2636,7 @@ function CommandGroups({ groups, cursor, setCursor, onSelect, optionId }) {
|
|
|
2470
2636
|
isActive ? "bg-accent-dim text-accent" : "text-text hover:bg-panel-2"
|
|
2471
2637
|
),
|
|
2472
2638
|
children: [
|
|
2473
|
-
item.glyph != null && /* @__PURE__ */
|
|
2639
|
+
item.glyph != null && /* @__PURE__ */ jsx41(
|
|
2474
2640
|
"span",
|
|
2475
2641
|
{
|
|
2476
2642
|
"aria-hidden": true,
|
|
@@ -2481,11 +2647,11 @@ function CommandGroups({ groups, cursor, setCursor, onSelect, optionId }) {
|
|
|
2481
2647
|
children: item.glyph
|
|
2482
2648
|
}
|
|
2483
2649
|
),
|
|
2484
|
-
/* @__PURE__ */
|
|
2485
|
-
/* @__PURE__ */
|
|
2486
|
-
item.description && /* @__PURE__ */
|
|
2650
|
+
/* @__PURE__ */ jsxs34("span", { className: "min-w-0 flex-1", children: [
|
|
2651
|
+
/* @__PURE__ */ jsx41("span", { className: "block truncate text-[13px]", children: item.label }),
|
|
2652
|
+
item.description && /* @__PURE__ */ jsx41("span", { className: "text-text-dim block truncate text-[11px]", children: item.description })
|
|
2487
2653
|
] }),
|
|
2488
|
-
item.trailing && /* @__PURE__ */
|
|
2654
|
+
item.trailing && /* @__PURE__ */ jsx41("span", { className: "text-text-dim font-mono text-[10px]", children: item.trailing })
|
|
2489
2655
|
]
|
|
2490
2656
|
},
|
|
2491
2657
|
item.id
|
|
@@ -2508,7 +2674,7 @@ function filterCommandItems(query, groups) {
|
|
|
2508
2674
|
|
|
2509
2675
|
// src/patterns/DataTable/DataTable.tsx
|
|
2510
2676
|
import { useEffect as useEffect7, useMemo as useMemo4, useRef as useRef5 } from "react";
|
|
2511
|
-
import { jsx as
|
|
2677
|
+
import { jsx as jsx42, jsxs as jsxs35 } from "react/jsx-runtime";
|
|
2512
2678
|
var alignClass = {
|
|
2513
2679
|
left: "text-left",
|
|
2514
2680
|
right: "text-right",
|
|
@@ -2596,10 +2762,10 @@ function DataTable(props) {
|
|
|
2596
2762
|
return next;
|
|
2597
2763
|
});
|
|
2598
2764
|
};
|
|
2599
|
-
return /* @__PURE__ */
|
|
2600
|
-
caption && /* @__PURE__ */
|
|
2601
|
-
/* @__PURE__ */
|
|
2602
|
-
selectable && /* @__PURE__ */
|
|
2765
|
+
return /* @__PURE__ */ jsxs35("table", { ref, className: cn("w-full border-collapse text-[12px]", className), children: [
|
|
2766
|
+
caption && /* @__PURE__ */ jsx42("caption", { className: "sr-only", children: caption }),
|
|
2767
|
+
/* @__PURE__ */ jsx42("thead", { className: cn("bg-panel-2", stickyHeader && "z-raised sticky top-0"), children: /* @__PURE__ */ jsxs35("tr", { children: [
|
|
2768
|
+
selectable && /* @__PURE__ */ jsx42("th", { scope: "col", className: "border-border w-8 border-b px-3 py-2 text-left", children: /* @__PURE__ */ jsx42(
|
|
2603
2769
|
"input",
|
|
2604
2770
|
{
|
|
2605
2771
|
ref: headerCheckRef,
|
|
@@ -2615,8 +2781,8 @@ function DataTable(props) {
|
|
|
2615
2781
|
const isSorted = sort?.key === col.key;
|
|
2616
2782
|
const ariaSort = !sortable ? void 0 : isSorted ? sort?.direction === "asc" ? "ascending" : "descending" : "none";
|
|
2617
2783
|
const align = col.align ?? "left";
|
|
2618
|
-
const indicator = sortable && isSorted && /* @__PURE__ */
|
|
2619
|
-
return /* @__PURE__ */
|
|
2784
|
+
const indicator = sortable && isSorted && /* @__PURE__ */ jsx42("span", { "aria-hidden": true, className: "ml-1", children: sort?.direction === "asc" ? "\u2191" : "\u2193" });
|
|
2785
|
+
return /* @__PURE__ */ jsx42(
|
|
2620
2786
|
"th",
|
|
2621
2787
|
{
|
|
2622
2788
|
scope: "col",
|
|
@@ -2628,7 +2794,7 @@ function DataTable(props) {
|
|
|
2628
2794
|
sortable && "cursor-pointer",
|
|
2629
2795
|
isSorted ? "text-accent" : "text-text-dim"
|
|
2630
2796
|
),
|
|
2631
|
-
children: sortable ? /* @__PURE__ */
|
|
2797
|
+
children: sortable ? /* @__PURE__ */ jsxs35(
|
|
2632
2798
|
"button",
|
|
2633
2799
|
{
|
|
2634
2800
|
type: "button",
|
|
@@ -2645,8 +2811,8 @@ function DataTable(props) {
|
|
|
2645
2811
|
);
|
|
2646
2812
|
})
|
|
2647
2813
|
] }) }),
|
|
2648
|
-
/* @__PURE__ */
|
|
2649
|
-
sortedData.length === 0 && /* @__PURE__ */
|
|
2814
|
+
/* @__PURE__ */ jsxs35("tbody", { children: [
|
|
2815
|
+
sortedData.length === 0 && /* @__PURE__ */ jsx42("tr", { children: /* @__PURE__ */ jsx42(
|
|
2650
2816
|
"td",
|
|
2651
2817
|
{
|
|
2652
2818
|
colSpan: columns.length + (selectable ? 1 : 0),
|
|
@@ -2657,7 +2823,7 @@ function DataTable(props) {
|
|
|
2657
2823
|
sortedData.map((row) => {
|
|
2658
2824
|
const id = rowKey(row);
|
|
2659
2825
|
const isSelected = selectedSet.has(id);
|
|
2660
|
-
return /* @__PURE__ */
|
|
2826
|
+
return /* @__PURE__ */ jsxs35(
|
|
2661
2827
|
"tr",
|
|
2662
2828
|
{
|
|
2663
2829
|
"data-state": isSelected ? "selected" : void 0,
|
|
@@ -2666,7 +2832,7 @@ function DataTable(props) {
|
|
|
2666
2832
|
isSelected ? "bg-accent-dim/50" : "hover:bg-panel-2"
|
|
2667
2833
|
),
|
|
2668
2834
|
children: [
|
|
2669
|
-
selectable && /* @__PURE__ */
|
|
2835
|
+
selectable && /* @__PURE__ */ jsx42("td", { className: "px-3 py-[10px]", children: /* @__PURE__ */ jsx42(
|
|
2670
2836
|
"input",
|
|
2671
2837
|
{
|
|
2672
2838
|
type: "checkbox",
|
|
@@ -2676,7 +2842,7 @@ function DataTable(props) {
|
|
|
2676
2842
|
className: "cursor-pointer accent-[var(--color-accent)]"
|
|
2677
2843
|
}
|
|
2678
2844
|
) }),
|
|
2679
|
-
columns.map((col) => /* @__PURE__ */
|
|
2845
|
+
columns.map((col) => /* @__PURE__ */ jsx42("td", { className: cn("px-3 py-[10px]", alignClass[col.align ?? "left"]), children: col.cell ? col.cell(row) : col.accessor ? String(col.accessor(row)) : null }, col.key))
|
|
2680
2846
|
]
|
|
2681
2847
|
},
|
|
2682
2848
|
id
|
|
@@ -2688,13 +2854,13 @@ function DataTable(props) {
|
|
|
2688
2854
|
|
|
2689
2855
|
// src/patterns/DatePicker/Calendar.tsx
|
|
2690
2856
|
import {
|
|
2691
|
-
forwardRef as
|
|
2857
|
+
forwardRef as forwardRef41,
|
|
2692
2858
|
useCallback as useCallback7,
|
|
2693
2859
|
useEffect as useEffect8,
|
|
2694
2860
|
useRef as useRef6,
|
|
2695
2861
|
useState as useState9
|
|
2696
2862
|
} from "react";
|
|
2697
|
-
import { jsx as
|
|
2863
|
+
import { jsx as jsx43, jsxs as jsxs36 } from "react/jsx-runtime";
|
|
2698
2864
|
var MONTHS = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
|
|
2699
2865
|
var DAYS = ["S", "M", "T", "W", "T", "F", "S"];
|
|
2700
2866
|
function isSameDay(a, b) {
|
|
@@ -2705,7 +2871,7 @@ function clampDay(year, month, day) {
|
|
|
2705
2871
|
const max = new Date(year, month + 1, 0).getDate();
|
|
2706
2872
|
return Math.min(Math.max(1, day), max);
|
|
2707
2873
|
}
|
|
2708
|
-
var Calendar =
|
|
2874
|
+
var Calendar = forwardRef41(function Calendar2({
|
|
2709
2875
|
value,
|
|
2710
2876
|
defaultValue,
|
|
2711
2877
|
onValueChange,
|
|
@@ -2836,7 +3002,7 @@ var Calendar = forwardRef40(function Calendar2({
|
|
|
2836
3002
|
},
|
|
2837
3003
|
[month, year, moveFocus]
|
|
2838
3004
|
);
|
|
2839
|
-
return /* @__PURE__ */
|
|
3005
|
+
return /* @__PURE__ */ jsxs36(
|
|
2840
3006
|
"div",
|
|
2841
3007
|
{
|
|
2842
3008
|
ref,
|
|
@@ -2848,14 +3014,14 @@ var Calendar = forwardRef40(function Calendar2({
|
|
|
2848
3014
|
),
|
|
2849
3015
|
...props,
|
|
2850
3016
|
children: [
|
|
2851
|
-
/* @__PURE__ */
|
|
2852
|
-
/* @__PURE__ */
|
|
3017
|
+
/* @__PURE__ */ jsxs36("div", { className: "mb-3 flex items-center justify-between", children: [
|
|
3018
|
+
/* @__PURE__ */ jsxs36("span", { className: "text-[13px] font-medium", "aria-live": "polite", children: [
|
|
2853
3019
|
MONTHS[month],
|
|
2854
3020
|
" ",
|
|
2855
3021
|
year
|
|
2856
3022
|
] }),
|
|
2857
|
-
/* @__PURE__ */
|
|
2858
|
-
/* @__PURE__ */
|
|
3023
|
+
/* @__PURE__ */ jsxs36("div", { className: "flex gap-1", children: [
|
|
3024
|
+
/* @__PURE__ */ jsx43(
|
|
2859
3025
|
IconButton,
|
|
2860
3026
|
{
|
|
2861
3027
|
size: "sm",
|
|
@@ -2865,11 +3031,11 @@ var Calendar = forwardRef40(function Calendar2({
|
|
|
2865
3031
|
onClick: goPrev
|
|
2866
3032
|
}
|
|
2867
3033
|
),
|
|
2868
|
-
/* @__PURE__ */
|
|
3034
|
+
/* @__PURE__ */ jsx43(IconButton, { size: "sm", variant: "ghost", icon: "\u203A", "aria-label": "Next month", onClick: goNext })
|
|
2869
3035
|
] })
|
|
2870
3036
|
] }),
|
|
2871
|
-
/* @__PURE__ */
|
|
2872
|
-
/* @__PURE__ */
|
|
3037
|
+
/* @__PURE__ */ jsxs36("div", { role: "grid", "aria-label": `${MONTHS[month]} ${year}`, className: "flex flex-col gap-[2px]", children: [
|
|
3038
|
+
/* @__PURE__ */ jsx43("div", { role: "row", className: "grid grid-cols-7 gap-[2px]", children: DAYS.map((d, i) => /* @__PURE__ */ jsx43(
|
|
2873
3039
|
"div",
|
|
2874
3040
|
{
|
|
2875
3041
|
role: "columnheader",
|
|
@@ -2889,7 +3055,7 @@ var Calendar = forwardRef40(function Calendar2({
|
|
|
2889
3055
|
const cellIndex = r * 7 + c;
|
|
2890
3056
|
const dayNum = cellIndex - firstDayOfMonth + 1;
|
|
2891
3057
|
if (dayNum < 1 || dayNum > daysInMonth) {
|
|
2892
|
-
cells.push(/* @__PURE__ */
|
|
3058
|
+
cells.push(/* @__PURE__ */ jsx43("div", { role: "gridcell", "aria-hidden": true }, `pad-${r}-${c}`));
|
|
2893
3059
|
continue;
|
|
2894
3060
|
}
|
|
2895
3061
|
const date = new Date(year, month, dayNum);
|
|
@@ -2899,7 +3065,7 @@ var Calendar = forwardRef40(function Calendar2({
|
|
|
2899
3065
|
const isFocused = dayNum === effectiveFocusDay;
|
|
2900
3066
|
const day = dayNum;
|
|
2901
3067
|
cells.push(
|
|
2902
|
-
/* @__PURE__ */
|
|
3068
|
+
/* @__PURE__ */ jsx43("div", { role: "gridcell", "aria-selected": isSelected, children: /* @__PURE__ */ jsx43(
|
|
2903
3069
|
"button",
|
|
2904
3070
|
{
|
|
2905
3071
|
ref: (node) => {
|
|
@@ -2930,7 +3096,7 @@ var Calendar = forwardRef40(function Calendar2({
|
|
|
2930
3096
|
);
|
|
2931
3097
|
}
|
|
2932
3098
|
rows.push(
|
|
2933
|
-
/* @__PURE__ */
|
|
3099
|
+
/* @__PURE__ */ jsx43("div", { role: "row", className: "grid grid-cols-7 gap-[2px]", children: cells }, `row-${r}`)
|
|
2934
3100
|
);
|
|
2935
3101
|
}
|
|
2936
3102
|
return rows;
|
|
@@ -2944,10 +3110,10 @@ Calendar.displayName = "Calendar";
|
|
|
2944
3110
|
|
|
2945
3111
|
// src/patterns/DatePicker/DatePicker.tsx
|
|
2946
3112
|
import * as RadixPopover2 from "@radix-ui/react-popover";
|
|
2947
|
-
import { forwardRef as
|
|
2948
|
-
import { jsx as
|
|
3113
|
+
import { forwardRef as forwardRef42, useState as useState10 } from "react";
|
|
3114
|
+
import { jsx as jsx44, jsxs as jsxs37 } from "react/jsx-runtime";
|
|
2949
3115
|
var defaultFormat = (d) => d.toLocaleDateString();
|
|
2950
|
-
var DatePicker =
|
|
3116
|
+
var DatePicker = forwardRef42(function DatePicker2({
|
|
2951
3117
|
value: valueProp,
|
|
2952
3118
|
defaultValue,
|
|
2953
3119
|
onValueChange,
|
|
@@ -2967,8 +3133,8 @@ var DatePicker = forwardRef41(function DatePicker2({
|
|
|
2967
3133
|
defaultValue,
|
|
2968
3134
|
onChange: onValueChange
|
|
2969
3135
|
});
|
|
2970
|
-
return /* @__PURE__ */
|
|
2971
|
-
/* @__PURE__ */
|
|
3136
|
+
return /* @__PURE__ */ jsxs37(RadixPopover2.Root, { open, onOpenChange: setOpen, children: [
|
|
3137
|
+
/* @__PURE__ */ jsx44(RadixPopover2.Trigger, { asChild: true, children: /* @__PURE__ */ jsxs37(
|
|
2972
3138
|
"button",
|
|
2973
3139
|
{
|
|
2974
3140
|
ref,
|
|
@@ -2985,18 +3151,18 @@ var DatePicker = forwardRef41(function DatePicker2({
|
|
|
2985
3151
|
),
|
|
2986
3152
|
style: { width },
|
|
2987
3153
|
children: [
|
|
2988
|
-
/* @__PURE__ */
|
|
2989
|
-
/* @__PURE__ */
|
|
3154
|
+
/* @__PURE__ */ jsx44("span", { "aria-hidden": true, className: "text-text-dim", children: "\u25A2" }),
|
|
3155
|
+
/* @__PURE__ */ jsx44("span", { className: cn("flex-1 truncate", !value && "text-text-dim"), children: value ? format(value) : emptyLabel ?? placeholder })
|
|
2990
3156
|
]
|
|
2991
3157
|
}
|
|
2992
3158
|
) }),
|
|
2993
|
-
/* @__PURE__ */
|
|
3159
|
+
/* @__PURE__ */ jsx44(RadixPopover2.Portal, { children: /* @__PURE__ */ jsx44(
|
|
2994
3160
|
RadixPopover2.Content,
|
|
2995
3161
|
{
|
|
2996
3162
|
align: "start",
|
|
2997
3163
|
sideOffset: 6,
|
|
2998
3164
|
className: "z-popover outline-none data-[state=open]:animate-[ship-pop-in_140ms_var(--easing-out)]",
|
|
2999
|
-
children: /* @__PURE__ */
|
|
3165
|
+
children: /* @__PURE__ */ jsx44(
|
|
3000
3166
|
Calendar,
|
|
3001
3167
|
{
|
|
3002
3168
|
value,
|
|
@@ -3011,17 +3177,17 @@ var DatePicker = forwardRef41(function DatePicker2({
|
|
|
3011
3177
|
)
|
|
3012
3178
|
}
|
|
3013
3179
|
) }),
|
|
3014
|
-
name && /* @__PURE__ */
|
|
3180
|
+
name && /* @__PURE__ */ jsx44("input", { type: "hidden", name, value: value ? value.toISOString() : "", readOnly: true })
|
|
3015
3181
|
] });
|
|
3016
3182
|
});
|
|
3017
3183
|
DatePicker.displayName = "DatePicker";
|
|
3018
3184
|
|
|
3019
3185
|
// src/patterns/Dots/Dots.tsx
|
|
3020
|
-
import { forwardRef as
|
|
3021
|
-
import { jsx as
|
|
3022
|
-
var Dots =
|
|
3186
|
+
import { forwardRef as forwardRef43 } from "react";
|
|
3187
|
+
import { jsx as jsx45 } from "react/jsx-runtime";
|
|
3188
|
+
var Dots = forwardRef43(function Dots2({ total, current, onChange, className, "aria-label": ariaLabel = "Progress", ...props }, ref) {
|
|
3023
3189
|
const interactive = typeof onChange === "function";
|
|
3024
|
-
return /* @__PURE__ */
|
|
3190
|
+
return /* @__PURE__ */ jsx45(
|
|
3025
3191
|
"nav",
|
|
3026
3192
|
{
|
|
3027
3193
|
ref,
|
|
@@ -3035,7 +3201,7 @@ var Dots = forwardRef42(function Dots2({ total, current, onChange, className, "a
|
|
|
3035
3201
|
isActive ? "w-[18px] bg-accent" : "w-[6px] bg-panel-2"
|
|
3036
3202
|
);
|
|
3037
3203
|
if (interactive) {
|
|
3038
|
-
return /* @__PURE__ */
|
|
3204
|
+
return /* @__PURE__ */ jsx45(
|
|
3039
3205
|
"button",
|
|
3040
3206
|
{
|
|
3041
3207
|
type: "button",
|
|
@@ -3052,7 +3218,7 @@ var Dots = forwardRef42(function Dots2({ total, current, onChange, className, "a
|
|
|
3052
3218
|
i
|
|
3053
3219
|
);
|
|
3054
3220
|
}
|
|
3055
|
-
return /* @__PURE__ */
|
|
3221
|
+
return /* @__PURE__ */ jsx45("span", { "aria-hidden": true, className: sharedClass }, i);
|
|
3056
3222
|
})
|
|
3057
3223
|
}
|
|
3058
3224
|
);
|
|
@@ -3061,15 +3227,15 @@ Dots.displayName = "Dots";
|
|
|
3061
3227
|
|
|
3062
3228
|
// src/patterns/Dropzone/Dropzone.tsx
|
|
3063
3229
|
import {
|
|
3064
|
-
forwardRef as
|
|
3230
|
+
forwardRef as forwardRef44,
|
|
3065
3231
|
useState as useState11
|
|
3066
3232
|
} from "react";
|
|
3067
|
-
import { jsx as
|
|
3233
|
+
import { jsx as jsx46, jsxs as jsxs38 } from "react/jsx-runtime";
|
|
3068
3234
|
function listToArray(list) {
|
|
3069
3235
|
if (!list) return [];
|
|
3070
3236
|
return Array.from(list);
|
|
3071
3237
|
}
|
|
3072
|
-
var Dropzone =
|
|
3238
|
+
var Dropzone = forwardRef44(function Dropzone2({
|
|
3073
3239
|
onFiles,
|
|
3074
3240
|
accept,
|
|
3075
3241
|
multiple = true,
|
|
@@ -3094,7 +3260,7 @@ var Dropzone = forwardRef43(function Dropzone2({
|
|
|
3094
3260
|
const files = listToArray(e.dataTransfer.files);
|
|
3095
3261
|
if (files.length) onFiles?.(files);
|
|
3096
3262
|
};
|
|
3097
|
-
return /* @__PURE__ */
|
|
3263
|
+
return /* @__PURE__ */ jsxs38(
|
|
3098
3264
|
"label",
|
|
3099
3265
|
{
|
|
3100
3266
|
ref,
|
|
@@ -3111,7 +3277,7 @@ var Dropzone = forwardRef43(function Dropzone2({
|
|
|
3111
3277
|
),
|
|
3112
3278
|
...props,
|
|
3113
3279
|
children: [
|
|
3114
|
-
/* @__PURE__ */
|
|
3280
|
+
/* @__PURE__ */ jsx46(
|
|
3115
3281
|
"input",
|
|
3116
3282
|
{
|
|
3117
3283
|
type: "file",
|
|
@@ -3127,7 +3293,7 @@ var Dropzone = forwardRef43(function Dropzone2({
|
|
|
3127
3293
|
}
|
|
3128
3294
|
}
|
|
3129
3295
|
),
|
|
3130
|
-
/* @__PURE__ */
|
|
3296
|
+
/* @__PURE__ */ jsx46(
|
|
3131
3297
|
"div",
|
|
3132
3298
|
{
|
|
3133
3299
|
"aria-hidden": true,
|
|
@@ -3135,8 +3301,8 @@ var Dropzone = forwardRef43(function Dropzone2({
|
|
|
3135
3301
|
children: icon
|
|
3136
3302
|
}
|
|
3137
3303
|
),
|
|
3138
|
-
/* @__PURE__ */
|
|
3139
|
-
description && /* @__PURE__ */
|
|
3304
|
+
/* @__PURE__ */ jsx46("div", { className: "mb-1 text-[13px] font-medium", children: title }),
|
|
3305
|
+
description && /* @__PURE__ */ jsx46("div", { className: "text-text-dim text-[11px]", children: description })
|
|
3140
3306
|
]
|
|
3141
3307
|
}
|
|
3142
3308
|
);
|
|
@@ -3145,8 +3311,8 @@ Dropzone.displayName = "Dropzone";
|
|
|
3145
3311
|
|
|
3146
3312
|
// src/patterns/EmptyState/EmptyState.tsx
|
|
3147
3313
|
import { cva as cva10 } from "class-variance-authority";
|
|
3148
|
-
import { forwardRef as
|
|
3149
|
-
import { jsx as
|
|
3314
|
+
import { forwardRef as forwardRef45 } from "react";
|
|
3315
|
+
import { jsx as jsx47, jsxs as jsxs39 } from "react/jsx-runtime";
|
|
3150
3316
|
var plateStyles = cva10("grid h-12 w-12 place-items-center rounded-base text-[22px]", {
|
|
3151
3317
|
variants: {
|
|
3152
3318
|
tone: {
|
|
@@ -3159,8 +3325,8 @@ var plateStyles = cva10("grid h-12 w-12 place-items-center rounded-base text-[22
|
|
|
3159
3325
|
},
|
|
3160
3326
|
defaultVariants: { tone: "neutral" }
|
|
3161
3327
|
});
|
|
3162
|
-
var EmptyState =
|
|
3163
|
-
return /* @__PURE__ */
|
|
3328
|
+
var EmptyState = forwardRef45(function EmptyState2({ icon, title, description, action, chips, tone, className, ...props }, ref) {
|
|
3329
|
+
return /* @__PURE__ */ jsxs39(
|
|
3164
3330
|
"div",
|
|
3165
3331
|
{
|
|
3166
3332
|
ref,
|
|
@@ -3170,10 +3336,10 @@ var EmptyState = forwardRef44(function EmptyState2({ icon, title, description, a
|
|
|
3170
3336
|
),
|
|
3171
3337
|
...props,
|
|
3172
3338
|
children: [
|
|
3173
|
-
icon != null && /* @__PURE__ */
|
|
3174
|
-
/* @__PURE__ */
|
|
3175
|
-
description && /* @__PURE__ */
|
|
3176
|
-
chips && chips.length > 0 && /* @__PURE__ */
|
|
3339
|
+
icon != null && /* @__PURE__ */ jsx47("span", { "aria-hidden": true, className: plateStyles({ tone: tone ?? "neutral" }), children: icon }),
|
|
3340
|
+
/* @__PURE__ */ jsx47("div", { className: "text-[14px] font-medium", children: title }),
|
|
3341
|
+
description && /* @__PURE__ */ jsx47("div", { className: "text-text-muted max-w-[260px] text-[12px] leading-[1.5]", children: description }),
|
|
3342
|
+
chips && chips.length > 0 && /* @__PURE__ */ jsx47("div", { className: "flex w-full flex-col gap-1", children: chips.map((c, i) => /* @__PURE__ */ jsx47(
|
|
3177
3343
|
"button",
|
|
3178
3344
|
{
|
|
3179
3345
|
type: "button",
|
|
@@ -3195,18 +3361,18 @@ var EmptyState = forwardRef44(function EmptyState2({ icon, title, description, a
|
|
|
3195
3361
|
EmptyState.displayName = "EmptyState";
|
|
3196
3362
|
|
|
3197
3363
|
// src/patterns/FileChip/FileChip.tsx
|
|
3198
|
-
import { forwardRef as
|
|
3199
|
-
import { jsx as
|
|
3364
|
+
import { forwardRef as forwardRef46 } from "react";
|
|
3365
|
+
import { jsx as jsx48, jsxs as jsxs40 } from "react/jsx-runtime";
|
|
3200
3366
|
function deriveExt(name) {
|
|
3201
3367
|
const dot = name.lastIndexOf(".");
|
|
3202
3368
|
if (dot < 0) return "FILE";
|
|
3203
3369
|
return name.slice(dot + 1).slice(0, 4).toUpperCase();
|
|
3204
3370
|
}
|
|
3205
|
-
var FileChip =
|
|
3371
|
+
var FileChip = forwardRef46(function FileChip2({ name, size, progress, icon, onRemove, failed, className, ...props }, ref) {
|
|
3206
3372
|
const ext = deriveExt(name);
|
|
3207
3373
|
const showProgress = typeof progress === "number";
|
|
3208
3374
|
const isComplete = showProgress && progress >= 100;
|
|
3209
|
-
return /* @__PURE__ */
|
|
3375
|
+
return /* @__PURE__ */ jsxs40(
|
|
3210
3376
|
"div",
|
|
3211
3377
|
{
|
|
3212
3378
|
ref,
|
|
@@ -3216,7 +3382,7 @@ var FileChip = forwardRef45(function FileChip2({ name, size, progress, icon, onR
|
|
|
3216
3382
|
),
|
|
3217
3383
|
...props,
|
|
3218
3384
|
children: [
|
|
3219
|
-
/* @__PURE__ */
|
|
3385
|
+
/* @__PURE__ */ jsx48(
|
|
3220
3386
|
"span",
|
|
3221
3387
|
{
|
|
3222
3388
|
"aria-hidden": true,
|
|
@@ -3224,17 +3390,17 @@ var FileChip = forwardRef45(function FileChip2({ name, size, progress, icon, onR
|
|
|
3224
3390
|
children: icon ?? ext
|
|
3225
3391
|
}
|
|
3226
3392
|
),
|
|
3227
|
-
/* @__PURE__ */
|
|
3228
|
-
/* @__PURE__ */
|
|
3229
|
-
/* @__PURE__ */
|
|
3393
|
+
/* @__PURE__ */ jsxs40("div", { className: "min-w-0 flex-1", children: [
|
|
3394
|
+
/* @__PURE__ */ jsx48("div", { className: "truncate text-[12px] font-medium", children: name }),
|
|
3395
|
+
/* @__PURE__ */ jsxs40("div", { className: cn("font-mono text-[10px]", failed ? "text-err" : "text-text-dim"), children: [
|
|
3230
3396
|
size,
|
|
3231
|
-
showProgress && !isComplete && /* @__PURE__ */
|
|
3397
|
+
showProgress && !isComplete && /* @__PURE__ */ jsxs40("span", { children: [
|
|
3232
3398
|
" \xB7 ",
|
|
3233
3399
|
Math.round(progress),
|
|
3234
3400
|
"%"
|
|
3235
3401
|
] })
|
|
3236
3402
|
] }),
|
|
3237
|
-
showProgress && !isComplete && /* @__PURE__ */
|
|
3403
|
+
showProgress && !isComplete && /* @__PURE__ */ jsx48("div", { className: "bg-panel mt-1 h-[2px] overflow-hidden rounded-full", children: /* @__PURE__ */ jsx48(
|
|
3238
3404
|
"div",
|
|
3239
3405
|
{
|
|
3240
3406
|
className: cn(
|
|
@@ -3245,7 +3411,7 @@ var FileChip = forwardRef45(function FileChip2({ name, size, progress, icon, onR
|
|
|
3245
3411
|
}
|
|
3246
3412
|
) })
|
|
3247
3413
|
] }),
|
|
3248
|
-
onRemove && /* @__PURE__ */
|
|
3414
|
+
onRemove && /* @__PURE__ */ jsx48(
|
|
3249
3415
|
"button",
|
|
3250
3416
|
{
|
|
3251
3417
|
type: "button",
|
|
@@ -3264,120 +3430,429 @@ var FileChip = forwardRef45(function FileChip2({ name, size, progress, icon, onR
|
|
|
3264
3430
|
});
|
|
3265
3431
|
FileChip.displayName = "FileChip";
|
|
3266
3432
|
|
|
3267
|
-
// src/patterns/
|
|
3268
|
-
import
|
|
3269
|
-
import {
|
|
3270
|
-
|
|
3271
|
-
var
|
|
3272
|
-
|
|
3273
|
-
|
|
3433
|
+
// src/patterns/FilterPanel/FilterPanel.tsx
|
|
3434
|
+
import { forwardRef as forwardRef47, useCallback as useCallback8, useState as useState12 } from "react";
|
|
3435
|
+
import { jsx as jsx49, jsxs as jsxs41 } from "react/jsx-runtime";
|
|
3436
|
+
var EMPTY = Object.freeze({});
|
|
3437
|
+
var FilterPanel = forwardRef47(function FilterPanel2({
|
|
3438
|
+
facets,
|
|
3439
|
+
value,
|
|
3440
|
+
defaultValue,
|
|
3441
|
+
onValueChange,
|
|
3442
|
+
onReset,
|
|
3443
|
+
counts,
|
|
3444
|
+
title = "Filter",
|
|
3445
|
+
resetLabel = "Reset",
|
|
3446
|
+
className,
|
|
3447
|
+
...props
|
|
3448
|
+
}, ref) {
|
|
3449
|
+
const [selection, setSelection] = useControllableState({
|
|
3450
|
+
value,
|
|
3451
|
+
defaultValue: defaultValue ?? EMPTY,
|
|
3452
|
+
onChange: onValueChange
|
|
3453
|
+
});
|
|
3454
|
+
const total = facets.reduce((sum, facet) => sum + (selection[facet.id]?.length ?? 0), 0);
|
|
3455
|
+
const toggle = useCallback8(
|
|
3456
|
+
(facetId, optionValue, next) => {
|
|
3457
|
+
setSelection((prev) => {
|
|
3458
|
+
const current = prev?.[facetId] ?? [];
|
|
3459
|
+
const filtered = current.filter((v) => v !== optionValue);
|
|
3460
|
+
const updated = next ? [...filtered, optionValue] : filtered;
|
|
3461
|
+
return { ...prev ?? {}, [facetId]: updated };
|
|
3462
|
+
});
|
|
3463
|
+
},
|
|
3464
|
+
[setSelection]
|
|
3465
|
+
);
|
|
3466
|
+
const handleReset = useCallback8(() => {
|
|
3467
|
+
setSelection(EMPTY);
|
|
3468
|
+
onReset?.();
|
|
3469
|
+
}, [setSelection, onReset]);
|
|
3470
|
+
return /* @__PURE__ */ jsxs41(
|
|
3471
|
+
"div",
|
|
3274
3472
|
{
|
|
3275
3473
|
ref,
|
|
3474
|
+
role: "group",
|
|
3475
|
+
"aria-label": typeof title === "string" ? title : void 0,
|
|
3276
3476
|
className: cn(
|
|
3277
|
-
"border-border bg-panel flex
|
|
3477
|
+
"rounded-base border-border bg-panel flex w-[260px] flex-col gap-3 border p-4",
|
|
3278
3478
|
className
|
|
3279
3479
|
),
|
|
3280
|
-
...props
|
|
3480
|
+
...props,
|
|
3481
|
+
children: [
|
|
3482
|
+
/* @__PURE__ */ jsxs41("div", { className: "flex items-center gap-2", children: [
|
|
3483
|
+
/* @__PURE__ */ jsx49("span", { className: "text-text-dim font-mono text-[10px] tracking-[1.4px] uppercase", children: title }),
|
|
3484
|
+
total > 0 && /* @__PURE__ */ jsx49(Badge, { size: "sm", variant: "accent", children: total }),
|
|
3485
|
+
/* @__PURE__ */ jsx49(
|
|
3486
|
+
Button,
|
|
3487
|
+
{
|
|
3488
|
+
type: "button",
|
|
3489
|
+
variant: "ghost",
|
|
3490
|
+
size: "sm",
|
|
3491
|
+
onClick: handleReset,
|
|
3492
|
+
disabled: total === 0,
|
|
3493
|
+
className: "ml-auto",
|
|
3494
|
+
children: resetLabel
|
|
3495
|
+
}
|
|
3496
|
+
)
|
|
3497
|
+
] }),
|
|
3498
|
+
facets.map((facet) => /* @__PURE__ */ jsx49(
|
|
3499
|
+
FilterFacetGroup,
|
|
3500
|
+
{
|
|
3501
|
+
facet,
|
|
3502
|
+
selected: selection[facet.id] ?? [],
|
|
3503
|
+
counts: counts?.[facet.id],
|
|
3504
|
+
onToggle: toggle
|
|
3505
|
+
},
|
|
3506
|
+
facet.id
|
|
3507
|
+
))
|
|
3508
|
+
]
|
|
3281
3509
|
}
|
|
3282
3510
|
);
|
|
3283
3511
|
});
|
|
3284
|
-
|
|
3285
|
-
|
|
3286
|
-
|
|
3287
|
-
|
|
3288
|
-
|
|
3289
|
-
|
|
3512
|
+
FilterPanel.displayName = "FilterPanel";
|
|
3513
|
+
function FilterFacetGroup({ facet, selected, counts, onToggle }) {
|
|
3514
|
+
const collapsible = facet.collapsible ?? true;
|
|
3515
|
+
const [open, setOpen] = useState12(facet.defaultOpen ?? true);
|
|
3516
|
+
const isOpen = !collapsible || open;
|
|
3517
|
+
const selectedCount = selected.length;
|
|
3518
|
+
const headingClass = "text-text-muted flex items-center gap-[6px] font-mono text-[10px] tracking-[1.4px] uppercase";
|
|
3519
|
+
return /* @__PURE__ */ jsxs41("section", { className: "flex flex-col gap-1", children: [
|
|
3520
|
+
collapsible ? /* @__PURE__ */ jsxs41(
|
|
3521
|
+
"button",
|
|
3290
3522
|
{
|
|
3291
|
-
|
|
3523
|
+
type: "button",
|
|
3524
|
+
"aria-expanded": isOpen,
|
|
3525
|
+
onClick: () => setOpen((v) => !v),
|
|
3292
3526
|
className: cn(
|
|
3293
|
-
|
|
3294
|
-
"
|
|
3295
|
-
"data-[state=open]:bg-panel-2 hover:bg-panel-2",
|
|
3527
|
+
headingClass,
|
|
3528
|
+
"cursor-pointer rounded-xs px-1 py-[2px] outline-none",
|
|
3296
3529
|
"focus-visible:ring-accent-dim focus-visible:ring-[3px]",
|
|
3297
|
-
|
|
3530
|
+
"hover:text-text"
|
|
3298
3531
|
),
|
|
3299
|
-
|
|
3532
|
+
children: [
|
|
3533
|
+
/* @__PURE__ */ jsx49("span", { className: "flex-1 text-left", children: facet.label }),
|
|
3534
|
+
selectedCount > 0 && /* @__PURE__ */ jsx49(Badge, { size: "sm", variant: "neutral", children: selectedCount }),
|
|
3535
|
+
/* @__PURE__ */ jsx49("span", { "aria-hidden": true, className: "text-[10px] opacity-70", children: isOpen ? "\u25BE" : "\u25B8" })
|
|
3536
|
+
]
|
|
3300
3537
|
}
|
|
3301
|
-
)
|
|
3302
|
-
|
|
3303
|
-
)
|
|
3304
|
-
|
|
3305
|
-
|
|
3306
|
-
|
|
3307
|
-
|
|
3308
|
-
|
|
3309
|
-
|
|
3310
|
-
|
|
3311
|
-
|
|
3312
|
-
|
|
3313
|
-
|
|
3314
|
-
|
|
3315
|
-
|
|
3316
|
-
className
|
|
3538
|
+
) : /* @__PURE__ */ jsxs41("div", { className: cn(headingClass, "px-1 py-[2px]"), children: [
|
|
3539
|
+
/* @__PURE__ */ jsx49("span", { className: "flex-1", children: facet.label }),
|
|
3540
|
+
selectedCount > 0 && /* @__PURE__ */ jsx49(Badge, { size: "sm", variant: "neutral", children: selectedCount })
|
|
3541
|
+
] }),
|
|
3542
|
+
isOpen && /* @__PURE__ */ jsx49("ul", { className: "m-0 flex list-none flex-col gap-[2px] p-0", children: facet.options.map((option) => {
|
|
3543
|
+
const isSelected = selected.includes(option.value);
|
|
3544
|
+
const count = counts?.[option.value];
|
|
3545
|
+
return /* @__PURE__ */ jsxs41("li", { className: "flex items-center gap-2 px-1 py-[3px]", children: [
|
|
3546
|
+
/* @__PURE__ */ jsx49(
|
|
3547
|
+
Checkbox,
|
|
3548
|
+
{
|
|
3549
|
+
checked: isSelected,
|
|
3550
|
+
onCheckedChange: (next) => onToggle(facet.id, option.value, next === true),
|
|
3551
|
+
label: option.label
|
|
3552
|
+
}
|
|
3317
3553
|
),
|
|
3318
|
-
|
|
3319
|
-
}
|
|
3320
|
-
) })
|
|
3321
|
-
}
|
|
3322
|
-
|
|
3323
|
-
MenubarContent.displayName = "MenubarContent";
|
|
3324
|
-
var itemBase3 = cn(
|
|
3325
|
-
"flex items-center gap-2 rounded-sm px-[10px] py-[6px] text-[12px] cursor-pointer outline-none",
|
|
3326
|
-
"data-[highlighted]:bg-panel-2",
|
|
3327
|
-
"data-[disabled]:opacity-40 data-[disabled]:cursor-not-allowed"
|
|
3328
|
-
);
|
|
3329
|
-
var MenubarItem = forwardRef46(function MenubarItem2({ trailing, destructive, className, children, ...props }, ref) {
|
|
3330
|
-
return /* @__PURE__ */ jsxs40(
|
|
3331
|
-
RadixMenubar.Item,
|
|
3332
|
-
{
|
|
3333
|
-
ref,
|
|
3334
|
-
className: cn(itemBase3, destructive ? "text-err" : "text-text", className),
|
|
3335
|
-
...props,
|
|
3336
|
-
children: [
|
|
3337
|
-
/* @__PURE__ */ jsx48("span", { className: "flex-1", children }),
|
|
3338
|
-
trailing && /* @__PURE__ */ jsx48("span", { className: "text-text-dim font-mono text-[10px]", children: trailing })
|
|
3339
|
-
]
|
|
3340
|
-
}
|
|
3341
|
-
);
|
|
3342
|
-
});
|
|
3343
|
-
MenubarItem.displayName = "MenubarItem";
|
|
3344
|
-
var MenubarSeparator = forwardRef46(
|
|
3345
|
-
function MenubarSeparator2({ className, ...props }, ref) {
|
|
3346
|
-
return /* @__PURE__ */ jsx48(
|
|
3347
|
-
RadixMenubar.Separator,
|
|
3348
|
-
{
|
|
3349
|
-
ref,
|
|
3350
|
-
className: cn("bg-border my-1 h-px", className),
|
|
3351
|
-
...props
|
|
3352
|
-
}
|
|
3353
|
-
);
|
|
3354
|
-
}
|
|
3355
|
-
);
|
|
3356
|
-
MenubarSeparator.displayName = "MenubarSeparator";
|
|
3554
|
+
typeof count === "number" && /* @__PURE__ */ jsx49("span", { className: "text-text-dim ml-auto font-mono text-[10px] tabular-nums", children: count })
|
|
3555
|
+
] }, option.value);
|
|
3556
|
+
}) })
|
|
3557
|
+
] });
|
|
3558
|
+
}
|
|
3357
3559
|
|
|
3358
|
-
// src/patterns/
|
|
3359
|
-
import
|
|
3360
|
-
import {
|
|
3361
|
-
forwardRef as forwardRef48,
|
|
3362
|
-
useCallback as useCallback9,
|
|
3363
|
-
useEffect as useEffect9,
|
|
3364
|
-
useRef as useRef7,
|
|
3365
|
-
useState as useState13
|
|
3366
|
-
} from "react";
|
|
3560
|
+
// src/patterns/HealthScore/HealthScore.tsx
|
|
3561
|
+
import { forwardRef as forwardRef49 } from "react";
|
|
3367
3562
|
|
|
3368
|
-
// src/patterns/
|
|
3369
|
-
import {
|
|
3370
|
-
|
|
3371
|
-
|
|
3372
|
-
|
|
3373
|
-
|
|
3374
|
-
|
|
3375
|
-
|
|
3376
|
-
|
|
3377
|
-
|
|
3378
|
-
|
|
3379
|
-
|
|
3380
|
-
|
|
3563
|
+
// src/patterns/RadialProgress/RadialProgress.tsx
|
|
3564
|
+
import { forwardRef as forwardRef48 } from "react";
|
|
3565
|
+
import { jsx as jsx50, jsxs as jsxs42 } from "react/jsx-runtime";
|
|
3566
|
+
var toneStrokeClass = {
|
|
3567
|
+
accent: "stroke-accent",
|
|
3568
|
+
ok: "stroke-ok",
|
|
3569
|
+
warn: "stroke-warn",
|
|
3570
|
+
err: "stroke-err"
|
|
3571
|
+
};
|
|
3572
|
+
var RadialProgress = forwardRef48(
|
|
3573
|
+
function RadialProgress2({
|
|
3574
|
+
value,
|
|
3575
|
+
max = 100,
|
|
3576
|
+
size = 64,
|
|
3577
|
+
thickness = 4,
|
|
3578
|
+
tone,
|
|
3579
|
+
children,
|
|
3580
|
+
className,
|
|
3581
|
+
"aria-label": ariaLabel,
|
|
3582
|
+
...props
|
|
3583
|
+
}, ref) {
|
|
3584
|
+
const clamped = Math.min(max, Math.max(0, value));
|
|
3585
|
+
const pct = max > 0 ? clamped / max * 100 : 0;
|
|
3586
|
+
const r = (size - thickness) / 2;
|
|
3587
|
+
const c = 2 * Math.PI * r;
|
|
3588
|
+
const dash = pct / 100 * c;
|
|
3589
|
+
const resolvedTone = tone ?? (clamped >= max ? "ok" : "accent");
|
|
3590
|
+
return /* @__PURE__ */ jsxs42(
|
|
3591
|
+
"div",
|
|
3592
|
+
{
|
|
3593
|
+
ref,
|
|
3594
|
+
role: "progressbar",
|
|
3595
|
+
"aria-valuemin": 0,
|
|
3596
|
+
"aria-valuemax": max,
|
|
3597
|
+
"aria-valuenow": Math.round(pct),
|
|
3598
|
+
"aria-label": ariaLabel ?? `${Math.round(pct)}%`,
|
|
3599
|
+
className: cn("relative inline-grid place-items-center", className),
|
|
3600
|
+
style: { width: size, height: size },
|
|
3601
|
+
...props,
|
|
3602
|
+
children: [
|
|
3603
|
+
/* @__PURE__ */ jsxs42("svg", { width: size, height: size, viewBox: `0 0 ${size} ${size}`, children: [
|
|
3604
|
+
/* @__PURE__ */ jsx50(
|
|
3605
|
+
"circle",
|
|
3606
|
+
{
|
|
3607
|
+
cx: size / 2,
|
|
3608
|
+
cy: size / 2,
|
|
3609
|
+
r,
|
|
3610
|
+
fill: "none",
|
|
3611
|
+
strokeWidth: thickness,
|
|
3612
|
+
className: "stroke-panel-2"
|
|
3613
|
+
}
|
|
3614
|
+
),
|
|
3615
|
+
/* @__PURE__ */ jsx50(
|
|
3616
|
+
"circle",
|
|
3617
|
+
{
|
|
3618
|
+
cx: size / 2,
|
|
3619
|
+
cy: size / 2,
|
|
3620
|
+
r,
|
|
3621
|
+
fill: "none",
|
|
3622
|
+
strokeWidth: thickness,
|
|
3623
|
+
strokeLinecap: "round",
|
|
3624
|
+
strokeDasharray: `${dash} ${c}`,
|
|
3625
|
+
transform: `rotate(-90 ${size / 2} ${size / 2})`,
|
|
3626
|
+
className: cn(
|
|
3627
|
+
"transition-[stroke-dasharray] duration-(--duration-step)",
|
|
3628
|
+
toneStrokeClass[resolvedTone]
|
|
3629
|
+
)
|
|
3630
|
+
}
|
|
3631
|
+
)
|
|
3632
|
+
] }),
|
|
3633
|
+
/* @__PURE__ */ jsx50("div", { className: "absolute inset-0 grid place-items-center font-mono text-[11px] font-medium tabular-nums", children: children ?? `${Math.round(pct)}%` })
|
|
3634
|
+
]
|
|
3635
|
+
}
|
|
3636
|
+
);
|
|
3637
|
+
}
|
|
3638
|
+
);
|
|
3639
|
+
RadialProgress.displayName = "RadialProgress";
|
|
3640
|
+
|
|
3641
|
+
// src/patterns/HealthScore/HealthScore.tsx
|
|
3642
|
+
import { jsx as jsx51, jsxs as jsxs43 } from "react/jsx-runtime";
|
|
3643
|
+
function deltaTone(delta) {
|
|
3644
|
+
if (delta > 0) return "ok";
|
|
3645
|
+
if (delta < 0) return "err";
|
|
3646
|
+
return "accent";
|
|
3647
|
+
}
|
|
3648
|
+
function deltaGlyph(delta) {
|
|
3649
|
+
if (delta > 0) return "\u2191";
|
|
3650
|
+
if (delta < 0) return "\u2193";
|
|
3651
|
+
return "\xB7";
|
|
3652
|
+
}
|
|
3653
|
+
var toneTextClass = {
|
|
3654
|
+
accent: "text-text-muted",
|
|
3655
|
+
ok: "text-ok",
|
|
3656
|
+
warn: "text-warn",
|
|
3657
|
+
err: "text-err"
|
|
3658
|
+
};
|
|
3659
|
+
var HealthScore = forwardRef49(function HealthScore2({
|
|
3660
|
+
value,
|
|
3661
|
+
max = 100,
|
|
3662
|
+
delta,
|
|
3663
|
+
label,
|
|
3664
|
+
breakdown,
|
|
3665
|
+
size = 72,
|
|
3666
|
+
tone,
|
|
3667
|
+
className,
|
|
3668
|
+
"aria-label": ariaLabel,
|
|
3669
|
+
...props
|
|
3670
|
+
}, ref) {
|
|
3671
|
+
const pct = max > 0 ? Math.round(Math.min(max, Math.max(0, value)) / max * 100) : 0;
|
|
3672
|
+
const resolvedTone = tone ?? (pct >= 80 ? "ok" : pct >= 50 ? "accent" : "warn");
|
|
3673
|
+
const indicatorTone = typeof delta === "number" ? deltaTone(delta) : "accent";
|
|
3674
|
+
const core = /* @__PURE__ */ jsxs43(
|
|
3675
|
+
"div",
|
|
3676
|
+
{
|
|
3677
|
+
ref,
|
|
3678
|
+
className: cn("inline-flex flex-col items-center gap-1", className),
|
|
3679
|
+
"aria-label": ariaLabel ?? `${pct}% health`,
|
|
3680
|
+
...props,
|
|
3681
|
+
children: [
|
|
3682
|
+
/* @__PURE__ */ jsx51(RadialProgress, { value, max, size, tone: resolvedTone }),
|
|
3683
|
+
label && /* @__PURE__ */ jsx51("div", { className: "text-text-muted mt-1 text-[12px] leading-tight", children: label }),
|
|
3684
|
+
typeof delta === "number" && /* @__PURE__ */ jsxs43("div", { className: cn("font-mono text-[11px] tabular-nums", toneTextClass[indicatorTone]), children: [
|
|
3685
|
+
/* @__PURE__ */ jsx51("span", { "aria-hidden": true, children: deltaGlyph(delta) }),
|
|
3686
|
+
" ",
|
|
3687
|
+
Math.abs(delta)
|
|
3688
|
+
] })
|
|
3689
|
+
]
|
|
3690
|
+
}
|
|
3691
|
+
);
|
|
3692
|
+
if (!breakdown || breakdown.length === 0) {
|
|
3693
|
+
return core;
|
|
3694
|
+
}
|
|
3695
|
+
return /* @__PURE__ */ jsx51(
|
|
3696
|
+
HoverCard,
|
|
3697
|
+
{
|
|
3698
|
+
trigger: /* @__PURE__ */ jsx51("span", { className: "inline-flex", children: core }),
|
|
3699
|
+
content: /* @__PURE__ */ jsxs43("div", { className: "flex min-w-[180px] flex-col gap-2", children: [
|
|
3700
|
+
/* @__PURE__ */ jsx51("div", { className: "text-text-dim font-mono text-[9px] tracking-[1.4px] uppercase", children: "Breakdown" }),
|
|
3701
|
+
/* @__PURE__ */ jsx51("ul", { className: "m-0 flex list-none flex-col gap-1 p-0 text-[12px]", children: breakdown.map((entry, i) => /* @__PURE__ */ jsxs43("li", { className: "flex items-center gap-2", children: [
|
|
3702
|
+
/* @__PURE__ */ jsx51("span", { className: "text-text-muted flex-1 truncate", children: entry.label }),
|
|
3703
|
+
/* @__PURE__ */ jsx51(
|
|
3704
|
+
"span",
|
|
3705
|
+
{
|
|
3706
|
+
className: cn(
|
|
3707
|
+
"font-mono tabular-nums",
|
|
3708
|
+
entry.tone ? toneTextClass[entry.tone] : "text-text"
|
|
3709
|
+
),
|
|
3710
|
+
children: entry.value
|
|
3711
|
+
}
|
|
3712
|
+
)
|
|
3713
|
+
] }, i)) })
|
|
3714
|
+
] })
|
|
3715
|
+
}
|
|
3716
|
+
);
|
|
3717
|
+
});
|
|
3718
|
+
HealthScore.displayName = "HealthScore";
|
|
3719
|
+
|
|
3720
|
+
// src/patterns/LargeTitle/LargeTitle.tsx
|
|
3721
|
+
import { forwardRef as forwardRef50 } from "react";
|
|
3722
|
+
import { jsx as jsx52, jsxs as jsxs44 } from "react/jsx-runtime";
|
|
3723
|
+
var LargeTitle = forwardRef50(function LargeTitle2({ title, eyebrow, trailing, className, ...props }, ref) {
|
|
3724
|
+
return /* @__PURE__ */ jsxs44(
|
|
3725
|
+
"header",
|
|
3726
|
+
{
|
|
3727
|
+
ref,
|
|
3728
|
+
className: cn("px-screen flex items-end justify-between gap-3 py-3 pb-4", className),
|
|
3729
|
+
...props,
|
|
3730
|
+
children: [
|
|
3731
|
+
/* @__PURE__ */ jsxs44("div", { className: "min-w-0 flex-1", children: [
|
|
3732
|
+
eyebrow && /* @__PURE__ */ jsx52("div", { className: "text-m-eyebrow text-accent mb-[6px] font-mono tracking-wide uppercase", children: eyebrow }),
|
|
3733
|
+
/* @__PURE__ */ jsx52("h1", { className: "text-m-h1 m-0 truncate leading-tight font-medium tracking-tight", children: title })
|
|
3734
|
+
] }),
|
|
3735
|
+
trailing && /* @__PURE__ */ jsx52("div", { className: "shrink-0", children: trailing })
|
|
3736
|
+
]
|
|
3737
|
+
}
|
|
3738
|
+
);
|
|
3739
|
+
});
|
|
3740
|
+
LargeTitle.displayName = "LargeTitle";
|
|
3741
|
+
|
|
3742
|
+
// src/patterns/Menubar/Menubar.tsx
|
|
3743
|
+
import * as RadixMenubar from "@radix-ui/react-menubar";
|
|
3744
|
+
import { forwardRef as forwardRef51 } from "react";
|
|
3745
|
+
import { jsx as jsx53, jsxs as jsxs45 } from "react/jsx-runtime";
|
|
3746
|
+
var Menubar = forwardRef51(function Menubar2({ className, ...props }, ref) {
|
|
3747
|
+
return /* @__PURE__ */ jsx53(
|
|
3748
|
+
RadixMenubar.Root,
|
|
3749
|
+
{
|
|
3750
|
+
ref,
|
|
3751
|
+
className: cn(
|
|
3752
|
+
"border-border bg-panel flex h-[30px] items-center gap-[2px] border-b px-3",
|
|
3753
|
+
className
|
|
3754
|
+
),
|
|
3755
|
+
...props
|
|
3756
|
+
}
|
|
3757
|
+
);
|
|
3758
|
+
});
|
|
3759
|
+
Menubar.displayName = "Menubar";
|
|
3760
|
+
var MenubarMenu = RadixMenubar.Menu;
|
|
3761
|
+
var MenubarTrigger = forwardRef51(
|
|
3762
|
+
function MenubarTrigger2({ className, ...props }, ref) {
|
|
3763
|
+
return /* @__PURE__ */ jsx53(
|
|
3764
|
+
RadixMenubar.Trigger,
|
|
3765
|
+
{
|
|
3766
|
+
ref,
|
|
3767
|
+
className: cn(
|
|
3768
|
+
"text-text cursor-pointer rounded-xs border-0 bg-transparent px-[10px] py-1 text-[12px] outline-none",
|
|
3769
|
+
"transition-colors duration-(--duration-micro)",
|
|
3770
|
+
"data-[state=open]:bg-panel-2 hover:bg-panel-2",
|
|
3771
|
+
"focus-visible:ring-accent-dim focus-visible:ring-[3px]",
|
|
3772
|
+
className
|
|
3773
|
+
),
|
|
3774
|
+
...props
|
|
3775
|
+
}
|
|
3776
|
+
);
|
|
3777
|
+
}
|
|
3778
|
+
);
|
|
3779
|
+
MenubarTrigger.displayName = "MenubarTrigger";
|
|
3780
|
+
var MenubarContent = forwardRef51(
|
|
3781
|
+
function MenubarContent2({ className, sideOffset = 6, align = "start", ...props }, ref) {
|
|
3782
|
+
return /* @__PURE__ */ jsx53(RadixMenubar.Portal, { children: /* @__PURE__ */ jsx53(
|
|
3783
|
+
RadixMenubar.Content,
|
|
3784
|
+
{
|
|
3785
|
+
ref,
|
|
3786
|
+
sideOffset,
|
|
3787
|
+
align,
|
|
3788
|
+
className: cn(
|
|
3789
|
+
"border-border-strong bg-panel z-popover min-w-[180px] rounded-md border p-1 shadow-lg outline-none",
|
|
3790
|
+
"data-[state=open]:animate-[ship-pop-in_140ms_var(--easing-out)]",
|
|
3791
|
+
className
|
|
3792
|
+
),
|
|
3793
|
+
...props
|
|
3794
|
+
}
|
|
3795
|
+
) });
|
|
3796
|
+
}
|
|
3797
|
+
);
|
|
3798
|
+
MenubarContent.displayName = "MenubarContent";
|
|
3799
|
+
var itemBase3 = cn(
|
|
3800
|
+
"flex items-center gap-2 rounded-sm px-[10px] py-[6px] text-[12px] cursor-pointer outline-none",
|
|
3801
|
+
"data-[highlighted]:bg-panel-2",
|
|
3802
|
+
"data-[disabled]:opacity-40 data-[disabled]:cursor-not-allowed"
|
|
3803
|
+
);
|
|
3804
|
+
var MenubarItem = forwardRef51(function MenubarItem2({ trailing, destructive, className, children, ...props }, ref) {
|
|
3805
|
+
return /* @__PURE__ */ jsxs45(
|
|
3806
|
+
RadixMenubar.Item,
|
|
3807
|
+
{
|
|
3808
|
+
ref,
|
|
3809
|
+
className: cn(itemBase3, destructive ? "text-err" : "text-text", className),
|
|
3810
|
+
...props,
|
|
3811
|
+
children: [
|
|
3812
|
+
/* @__PURE__ */ jsx53("span", { className: "flex-1", children }),
|
|
3813
|
+
trailing && /* @__PURE__ */ jsx53("span", { className: "text-text-dim font-mono text-[10px]", children: trailing })
|
|
3814
|
+
]
|
|
3815
|
+
}
|
|
3816
|
+
);
|
|
3817
|
+
});
|
|
3818
|
+
MenubarItem.displayName = "MenubarItem";
|
|
3819
|
+
var MenubarSeparator = forwardRef51(
|
|
3820
|
+
function MenubarSeparator2({ className, ...props }, ref) {
|
|
3821
|
+
return /* @__PURE__ */ jsx53(
|
|
3822
|
+
RadixMenubar.Separator,
|
|
3823
|
+
{
|
|
3824
|
+
ref,
|
|
3825
|
+
className: cn("bg-border my-1 h-px", className),
|
|
3826
|
+
...props
|
|
3827
|
+
}
|
|
3828
|
+
);
|
|
3829
|
+
}
|
|
3830
|
+
);
|
|
3831
|
+
MenubarSeparator.displayName = "MenubarSeparator";
|
|
3832
|
+
|
|
3833
|
+
// src/patterns/NavBar/NavBar.tsx
|
|
3834
|
+
import * as RadixNav from "@radix-ui/react-navigation-menu";
|
|
3835
|
+
import {
|
|
3836
|
+
forwardRef as forwardRef53,
|
|
3837
|
+
useCallback as useCallback10,
|
|
3838
|
+
useEffect as useEffect9,
|
|
3839
|
+
useRef as useRef7,
|
|
3840
|
+
useState as useState14
|
|
3841
|
+
} from "react";
|
|
3842
|
+
|
|
3843
|
+
// src/patterns/Sidebar/Sidebar.tsx
|
|
3844
|
+
import {
|
|
3845
|
+
forwardRef as forwardRef52,
|
|
3846
|
+
useCallback as useCallback9,
|
|
3847
|
+
useState as useState13
|
|
3848
|
+
} from "react";
|
|
3849
|
+
import { Fragment as Fragment2, jsx as jsx54, jsxs as jsxs46 } from "react/jsx-runtime";
|
|
3850
|
+
var Sidebar = forwardRef52(function Sidebar2({ width = 240, className, style, ...props }, ref) {
|
|
3851
|
+
return /* @__PURE__ */ jsx54(
|
|
3852
|
+
"aside",
|
|
3853
|
+
{
|
|
3854
|
+
ref,
|
|
3855
|
+
style: { width, ...style },
|
|
3381
3856
|
className: cn(
|
|
3382
3857
|
"border-border bg-panel flex h-full flex-col gap-2 border-r p-[14px]",
|
|
3383
3858
|
className
|
|
@@ -3387,12 +3862,12 @@ var Sidebar = forwardRef47(function Sidebar2({ width = 240, className, style, ..
|
|
|
3387
3862
|
);
|
|
3388
3863
|
});
|
|
3389
3864
|
Sidebar.displayName = "Sidebar";
|
|
3390
|
-
var NavItem =
|
|
3865
|
+
var NavItem = forwardRef52(
|
|
3391
3866
|
function NavItem2({ icon, label, active, badge, href, disabled, className, ...props }, ref) {
|
|
3392
|
-
const inner = /* @__PURE__ */
|
|
3393
|
-
icon && /* @__PURE__ */
|
|
3394
|
-
/* @__PURE__ */
|
|
3395
|
-
badge != null && /* @__PURE__ */
|
|
3867
|
+
const inner = /* @__PURE__ */ jsxs46(Fragment2, { children: [
|
|
3868
|
+
icon && /* @__PURE__ */ jsx54("span", { "aria-hidden": true, className: "w-[14px] text-center opacity-80", children: icon }),
|
|
3869
|
+
/* @__PURE__ */ jsx54("span", { className: "flex-1 truncate", children: label }),
|
|
3870
|
+
badge != null && /* @__PURE__ */ jsx54(
|
|
3396
3871
|
"span",
|
|
3397
3872
|
{
|
|
3398
3873
|
className: cn(
|
|
@@ -3413,7 +3888,7 @@ var NavItem = forwardRef47(
|
|
|
3413
3888
|
);
|
|
3414
3889
|
if (href) {
|
|
3415
3890
|
const anchorProps = props;
|
|
3416
|
-
return /* @__PURE__ */
|
|
3891
|
+
return /* @__PURE__ */ jsx54(
|
|
3417
3892
|
"a",
|
|
3418
3893
|
{
|
|
3419
3894
|
ref,
|
|
@@ -3427,7 +3902,7 @@ var NavItem = forwardRef47(
|
|
|
3427
3902
|
);
|
|
3428
3903
|
}
|
|
3429
3904
|
const buttonProps = props;
|
|
3430
|
-
return /* @__PURE__ */
|
|
3905
|
+
return /* @__PURE__ */ jsx54(
|
|
3431
3906
|
"button",
|
|
3432
3907
|
{
|
|
3433
3908
|
ref,
|
|
@@ -3442,7 +3917,7 @@ var NavItem = forwardRef47(
|
|
|
3442
3917
|
}
|
|
3443
3918
|
);
|
|
3444
3919
|
NavItem.displayName = "NavItem";
|
|
3445
|
-
var NavSection =
|
|
3920
|
+
var NavSection = forwardRef52(function NavSection2({
|
|
3446
3921
|
label,
|
|
3447
3922
|
icon,
|
|
3448
3923
|
action,
|
|
@@ -3456,16 +3931,16 @@ var NavSection = forwardRef47(function NavSection2({
|
|
|
3456
3931
|
...props
|
|
3457
3932
|
}, ref) {
|
|
3458
3933
|
const isControlled = open !== void 0;
|
|
3459
|
-
const [internalOpen, setInternalOpen] =
|
|
3934
|
+
const [internalOpen, setInternalOpen] = useState13(defaultOpen);
|
|
3460
3935
|
const isOpen = !collapsible || (isControlled ? open : internalOpen);
|
|
3461
|
-
const toggle =
|
|
3936
|
+
const toggle = useCallback9(() => {
|
|
3462
3937
|
const next = !isOpen;
|
|
3463
3938
|
if (!isControlled) setInternalOpen(next);
|
|
3464
3939
|
onOpenChange?.(next);
|
|
3465
3940
|
}, [isOpen, isControlled, onOpenChange]);
|
|
3466
3941
|
const eyebrowClass = "text-text-dim flex items-center gap-[6px] px-2 pt-2 font-mono text-[9px] tracking-[1.4px] uppercase";
|
|
3467
|
-
return /* @__PURE__ */
|
|
3468
|
-
collapsible ? /* @__PURE__ */
|
|
3942
|
+
return /* @__PURE__ */ jsxs46("div", { ref, className: cn("flex flex-col gap-1", className), ...props, children: [
|
|
3943
|
+
collapsible ? /* @__PURE__ */ jsxs46(
|
|
3469
3944
|
"button",
|
|
3470
3945
|
{
|
|
3471
3946
|
type: "button",
|
|
@@ -3478,18 +3953,18 @@ var NavSection = forwardRef47(function NavSection2({
|
|
|
3478
3953
|
"hover:text-text-muted"
|
|
3479
3954
|
),
|
|
3480
3955
|
children: [
|
|
3481
|
-
icon != null && /* @__PURE__ */
|
|
3482
|
-
/* @__PURE__ */
|
|
3956
|
+
icon != null && /* @__PURE__ */ jsx54("span", { "aria-hidden": true, className: "opacity-80", children: icon }),
|
|
3957
|
+
/* @__PURE__ */ jsx54("span", { className: "flex-1 text-left", children: label }),
|
|
3483
3958
|
action,
|
|
3484
|
-
/* @__PURE__ */
|
|
3959
|
+
/* @__PURE__ */ jsx54("span", { "aria-hidden": true, className: "text-[10px] opacity-70", children: isOpen ? "\u25BE" : "\u25B8" })
|
|
3485
3960
|
]
|
|
3486
3961
|
}
|
|
3487
|
-
) : /* @__PURE__ */
|
|
3488
|
-
icon != null && /* @__PURE__ */
|
|
3489
|
-
/* @__PURE__ */
|
|
3962
|
+
) : /* @__PURE__ */ jsxs46("div", { className: eyebrowClass, children: [
|
|
3963
|
+
icon != null && /* @__PURE__ */ jsx54("span", { "aria-hidden": true, className: "opacity-80", children: icon }),
|
|
3964
|
+
/* @__PURE__ */ jsx54("span", { className: "flex-1", children: label }),
|
|
3490
3965
|
action
|
|
3491
3966
|
] }),
|
|
3492
|
-
isOpen && /* @__PURE__ */
|
|
3967
|
+
isOpen && /* @__PURE__ */ jsx54(
|
|
3493
3968
|
"div",
|
|
3494
3969
|
{
|
|
3495
3970
|
className: cn("flex flex-col gap-[2px]", indent > 0 && "border-border ml-2 border-l"),
|
|
@@ -3502,12 +3977,12 @@ var NavSection = forwardRef47(function NavSection2({
|
|
|
3502
3977
|
NavSection.displayName = "NavSection";
|
|
3503
3978
|
|
|
3504
3979
|
// src/patterns/NavBar/NavBar.tsx
|
|
3505
|
-
import { Fragment as Fragment3, jsx as
|
|
3980
|
+
import { Fragment as Fragment3, jsx as jsx55, jsxs as jsxs47 } from "react/jsx-runtime";
|
|
3506
3981
|
function isActiveTree(item, activeId) {
|
|
3507
3982
|
if (item.id === activeId) return true;
|
|
3508
3983
|
return item.children?.some((c) => isActiveTree(c, activeId)) ?? false;
|
|
3509
3984
|
}
|
|
3510
|
-
var NavBar =
|
|
3985
|
+
var NavBar = forwardRef53(function NavBar2({
|
|
3511
3986
|
orientation = "horizontal",
|
|
3512
3987
|
items,
|
|
3513
3988
|
brand,
|
|
@@ -3521,17 +3996,17 @@ var NavBar = forwardRef48(function NavBar2({
|
|
|
3521
3996
|
...props
|
|
3522
3997
|
}, ref) {
|
|
3523
3998
|
const isControlled = value !== void 0;
|
|
3524
|
-
const [internalValue, setInternalValue] =
|
|
3999
|
+
const [internalValue, setInternalValue] = useState14(defaultValue);
|
|
3525
4000
|
const activeId = isControlled ? value : internalValue;
|
|
3526
|
-
const [drawerOpen, setDrawerOpen] =
|
|
3527
|
-
const select =
|
|
4001
|
+
const [drawerOpen, setDrawerOpen] = useState14(false);
|
|
4002
|
+
const select = useCallback10(
|
|
3528
4003
|
(id) => {
|
|
3529
4004
|
if (!isControlled) setInternalValue(id);
|
|
3530
4005
|
onValueChange?.(id);
|
|
3531
4006
|
},
|
|
3532
4007
|
[isControlled, onValueChange]
|
|
3533
4008
|
);
|
|
3534
|
-
const handleItemActivate =
|
|
4009
|
+
const handleItemActivate = useCallback10(
|
|
3535
4010
|
(id) => {
|
|
3536
4011
|
select(id);
|
|
3537
4012
|
setDrawerOpen(false);
|
|
@@ -3543,7 +4018,7 @@ var NavBar = forwardRef48(function NavBar2({
|
|
|
3543
4018
|
// drawer is open on a viewport that's resizing past `md`, both navs can
|
|
3544
4019
|
// sit in the DOM together. Identical accessible names would trip axe's
|
|
3545
4020
|
// `landmark-unique` rule.
|
|
3546
|
-
/* @__PURE__ */
|
|
4021
|
+
/* @__PURE__ */ jsx55("nav", { "aria-label": "Mobile navigation", className: "flex flex-col gap-1", children: items.map((item) => /* @__PURE__ */ jsx55(
|
|
3547
4022
|
VerticalItem,
|
|
3548
4023
|
{
|
|
3549
4024
|
item,
|
|
@@ -3553,14 +4028,14 @@ var NavBar = forwardRef48(function NavBar2({
|
|
|
3553
4028
|
item.id
|
|
3554
4029
|
)) })
|
|
3555
4030
|
);
|
|
3556
|
-
const mobileBar = responsive ? /* @__PURE__ */
|
|
4031
|
+
const mobileBar = responsive ? /* @__PURE__ */ jsxs47(
|
|
3557
4032
|
"div",
|
|
3558
4033
|
{
|
|
3559
4034
|
className: cn(
|
|
3560
4035
|
"border-border bg-panel z-overlay sticky top-0 flex h-[52px] items-center gap-4 border-b px-5 md:hidden"
|
|
3561
4036
|
),
|
|
3562
4037
|
children: [
|
|
3563
|
-
/* @__PURE__ */
|
|
4038
|
+
/* @__PURE__ */ jsx55(
|
|
3564
4039
|
"button",
|
|
3565
4040
|
{
|
|
3566
4041
|
type: "button",
|
|
@@ -3570,15 +4045,15 @@ var NavBar = forwardRef48(function NavBar2({
|
|
|
3570
4045
|
children: "\u2630"
|
|
3571
4046
|
}
|
|
3572
4047
|
),
|
|
3573
|
-
brand && /* @__PURE__ */
|
|
3574
|
-
actions && /* @__PURE__ */
|
|
4048
|
+
brand && /* @__PURE__ */ jsx55("div", { className: "flex flex-1 items-center text-[13px] font-medium whitespace-nowrap", children: brand }),
|
|
4049
|
+
actions && /* @__PURE__ */ jsx55("div", { className: "flex items-center gap-3", children: actions })
|
|
3575
4050
|
]
|
|
3576
4051
|
}
|
|
3577
4052
|
) : null;
|
|
3578
4053
|
if (orientation === "horizontal") {
|
|
3579
|
-
return /* @__PURE__ */
|
|
4054
|
+
return /* @__PURE__ */ jsxs47(Fragment3, { children: [
|
|
3580
4055
|
mobileBar,
|
|
3581
|
-
/* @__PURE__ */
|
|
4056
|
+
/* @__PURE__ */ jsxs47(
|
|
3582
4057
|
"header",
|
|
3583
4058
|
{
|
|
3584
4059
|
ref,
|
|
@@ -3589,10 +4064,10 @@ var NavBar = forwardRef48(function NavBar2({
|
|
|
3589
4064
|
),
|
|
3590
4065
|
...props,
|
|
3591
4066
|
children: [
|
|
3592
|
-
brand && /* @__PURE__ */
|
|
3593
|
-
/* @__PURE__ */
|
|
3594
|
-
/* @__PURE__ */
|
|
3595
|
-
(item) => item.children?.length ? /* @__PURE__ */
|
|
4067
|
+
brand && /* @__PURE__ */ jsx55("div", { className: "shrink-0 text-[13px] font-medium whitespace-nowrap", children: brand }),
|
|
4068
|
+
/* @__PURE__ */ jsxs47(RadixNav.Root, { className: "relative flex-1", delayDuration: 120, children: [
|
|
4069
|
+
/* @__PURE__ */ jsx55(RadixNav.List, { className: "m-0! flex list-none! items-center gap-1 p-0! [&_li]:m-0!", children: items.map(
|
|
4070
|
+
(item) => item.children?.length ? /* @__PURE__ */ jsx55(
|
|
3596
4071
|
HorizontalDropdown,
|
|
3597
4072
|
{
|
|
3598
4073
|
item,
|
|
@@ -3601,7 +4076,7 @@ var NavBar = forwardRef48(function NavBar2({
|
|
|
3601
4076
|
onActivate: handleItemActivate
|
|
3602
4077
|
},
|
|
3603
4078
|
item.id
|
|
3604
|
-
) : /* @__PURE__ */
|
|
4079
|
+
) : /* @__PURE__ */ jsx55(RadixNav.Item, { children: /* @__PURE__ */ jsx55(
|
|
3605
4080
|
HorizontalLink,
|
|
3606
4081
|
{
|
|
3607
4082
|
item,
|
|
@@ -3610,13 +4085,13 @@ var NavBar = forwardRef48(function NavBar2({
|
|
|
3610
4085
|
}
|
|
3611
4086
|
) }, item.id)
|
|
3612
4087
|
) }),
|
|
3613
|
-
/* @__PURE__ */
|
|
4088
|
+
/* @__PURE__ */ jsx55("div", { className: "z-popover absolute top-full left-0 flex justify-start", children: /* @__PURE__ */ jsx55(RadixNav.Viewport, { className: "origin-top-left data-[state=open]:animate-[ship-fade-in_120ms_var(--easing-out)]" }) })
|
|
3614
4089
|
] }),
|
|
3615
|
-
actions && /* @__PURE__ */
|
|
4090
|
+
actions && /* @__PURE__ */ jsx55("div", { className: "flex items-center gap-3", children: actions })
|
|
3616
4091
|
]
|
|
3617
4092
|
}
|
|
3618
4093
|
),
|
|
3619
|
-
responsive && /* @__PURE__ */
|
|
4094
|
+
responsive && /* @__PURE__ */ jsx55(
|
|
3620
4095
|
Drawer,
|
|
3621
4096
|
{
|
|
3622
4097
|
open: drawerOpen,
|
|
@@ -3629,9 +4104,9 @@ var NavBar = forwardRef48(function NavBar2({
|
|
|
3629
4104
|
)
|
|
3630
4105
|
] });
|
|
3631
4106
|
}
|
|
3632
|
-
return /* @__PURE__ */
|
|
4107
|
+
return /* @__PURE__ */ jsxs47(Fragment3, { children: [
|
|
3633
4108
|
mobileBar,
|
|
3634
|
-
/* @__PURE__ */
|
|
4109
|
+
/* @__PURE__ */ jsxs47(
|
|
3635
4110
|
"aside",
|
|
3636
4111
|
{
|
|
3637
4112
|
ref,
|
|
@@ -3644,8 +4119,8 @@ var NavBar = forwardRef48(function NavBar2({
|
|
|
3644
4119
|
),
|
|
3645
4120
|
...props,
|
|
3646
4121
|
children: [
|
|
3647
|
-
brand && /* @__PURE__ */
|
|
3648
|
-
/* @__PURE__ */
|
|
4122
|
+
brand && /* @__PURE__ */ jsx55("div", { className: "px-2 py-1 text-[13px] font-medium", children: brand }),
|
|
4123
|
+
/* @__PURE__ */ jsx55("nav", { "aria-label": "Sidebar navigation", className: "flex flex-1 flex-col gap-1 overflow-y-auto", children: items.map((item) => /* @__PURE__ */ jsx55(
|
|
3649
4124
|
VerticalItem,
|
|
3650
4125
|
{
|
|
3651
4126
|
item,
|
|
@@ -3654,11 +4129,11 @@ var NavBar = forwardRef48(function NavBar2({
|
|
|
3654
4129
|
},
|
|
3655
4130
|
item.id
|
|
3656
4131
|
)) }),
|
|
3657
|
-
actions && /* @__PURE__ */
|
|
4132
|
+
actions && /* @__PURE__ */ jsx55("div", { className: "border-border mt-auto flex flex-col gap-2 border-t pt-3", children: actions })
|
|
3658
4133
|
]
|
|
3659
4134
|
}
|
|
3660
4135
|
),
|
|
3661
|
-
responsive && /* @__PURE__ */
|
|
4136
|
+
responsive && /* @__PURE__ */ jsx55(
|
|
3662
4137
|
Drawer,
|
|
3663
4138
|
{
|
|
3664
4139
|
open: drawerOpen,
|
|
@@ -3687,13 +4162,13 @@ function HorizontalLink({ item, active, onActivate }) {
|
|
|
3687
4162
|
}
|
|
3688
4163
|
onActivate(item.id);
|
|
3689
4164
|
};
|
|
3690
|
-
const inner = /* @__PURE__ */
|
|
3691
|
-
item.icon != null && /* @__PURE__ */
|
|
3692
|
-
/* @__PURE__ */
|
|
3693
|
-
item.badge != null && /* @__PURE__ */
|
|
4165
|
+
const inner = /* @__PURE__ */ jsxs47(Fragment3, { children: [
|
|
4166
|
+
item.icon != null && /* @__PURE__ */ jsx55("span", { "aria-hidden": true, className: "opacity-80", children: item.icon }),
|
|
4167
|
+
/* @__PURE__ */ jsx55("span", { children: item.label }),
|
|
4168
|
+
item.badge != null && /* @__PURE__ */ jsx55(ItemBadge, { active, children: item.badge })
|
|
3694
4169
|
] });
|
|
3695
4170
|
if (item.href) {
|
|
3696
|
-
return /* @__PURE__ */
|
|
4171
|
+
return /* @__PURE__ */ jsx55(RadixNav.Link, { asChild: true, active, children: /* @__PURE__ */ jsx55(
|
|
3697
4172
|
"a",
|
|
3698
4173
|
{
|
|
3699
4174
|
href: item.href,
|
|
@@ -3705,7 +4180,7 @@ function HorizontalLink({ item, active, onActivate }) {
|
|
|
3705
4180
|
}
|
|
3706
4181
|
) });
|
|
3707
4182
|
}
|
|
3708
|
-
return /* @__PURE__ */
|
|
4183
|
+
return /* @__PURE__ */ jsx55(RadixNav.Link, { asChild: true, active, children: /* @__PURE__ */ jsx55(
|
|
3709
4184
|
"button",
|
|
3710
4185
|
{
|
|
3711
4186
|
type: "button",
|
|
@@ -3718,8 +4193,8 @@ function HorizontalLink({ item, active, onActivate }) {
|
|
|
3718
4193
|
) });
|
|
3719
4194
|
}
|
|
3720
4195
|
function HorizontalDropdown({ item, active, activeId, onActivate }) {
|
|
3721
|
-
return /* @__PURE__ */
|
|
3722
|
-
/* @__PURE__ */
|
|
4196
|
+
return /* @__PURE__ */ jsxs47(RadixNav.Item, { children: [
|
|
4197
|
+
/* @__PURE__ */ jsxs47(
|
|
3723
4198
|
RadixNav.Trigger,
|
|
3724
4199
|
{
|
|
3725
4200
|
className: cn(
|
|
@@ -3731,9 +4206,9 @@ function HorizontalDropdown({ item, active, activeId, onActivate }) {
|
|
|
3731
4206
|
),
|
|
3732
4207
|
disabled: item.disabled,
|
|
3733
4208
|
children: [
|
|
3734
|
-
item.icon != null && /* @__PURE__ */
|
|
3735
|
-
/* @__PURE__ */
|
|
3736
|
-
/* @__PURE__ */
|
|
4209
|
+
item.icon != null && /* @__PURE__ */ jsx55("span", { "aria-hidden": true, className: "opacity-80", children: item.icon }),
|
|
4210
|
+
/* @__PURE__ */ jsx55("span", { children: item.label }),
|
|
4211
|
+
/* @__PURE__ */ jsx55(
|
|
3737
4212
|
"span",
|
|
3738
4213
|
{
|
|
3739
4214
|
"aria-hidden": true,
|
|
@@ -3744,7 +4219,7 @@ function HorizontalDropdown({ item, active, activeId, onActivate }) {
|
|
|
3744
4219
|
]
|
|
3745
4220
|
}
|
|
3746
4221
|
),
|
|
3747
|
-
/* @__PURE__ */
|
|
4222
|
+
/* @__PURE__ */ jsx55(RadixNav.Content, { className: "border-border bg-panel min-w-[220px] rounded-xs border p-2 shadow-lg", children: /* @__PURE__ */ jsx55("ul", { className: "m-0! flex list-none! flex-col gap-[2px] p-0! [&_li]:m-0!", children: item.children.map((child) => /* @__PURE__ */ jsx55("li", { children: /* @__PURE__ */ jsx55(DropdownLink, { item: child, active: child.id === activeId, onActivate }) }, child.id)) }) })
|
|
3748
4223
|
] });
|
|
3749
4224
|
}
|
|
3750
4225
|
function DropdownLink({ item, active, onActivate }) {
|
|
@@ -3761,13 +4236,13 @@ function DropdownLink({ item, active, onActivate }) {
|
|
|
3761
4236
|
}
|
|
3762
4237
|
onActivate(item.id);
|
|
3763
4238
|
};
|
|
3764
|
-
const inner = /* @__PURE__ */
|
|
3765
|
-
item.icon != null && /* @__PURE__ */
|
|
3766
|
-
/* @__PURE__ */
|
|
3767
|
-
item.badge != null && /* @__PURE__ */
|
|
4239
|
+
const inner = /* @__PURE__ */ jsxs47(Fragment3, { children: [
|
|
4240
|
+
item.icon != null && /* @__PURE__ */ jsx55("span", { "aria-hidden": true, className: "opacity-80", children: item.icon }),
|
|
4241
|
+
/* @__PURE__ */ jsx55("span", { className: "flex-1", children: item.label }),
|
|
4242
|
+
item.badge != null && /* @__PURE__ */ jsx55(ItemBadge, { active, children: item.badge })
|
|
3768
4243
|
] });
|
|
3769
4244
|
if (item.href) {
|
|
3770
|
-
return /* @__PURE__ */
|
|
4245
|
+
return /* @__PURE__ */ jsx55(RadixNav.Link, { asChild: true, active, children: /* @__PURE__ */ jsx55(
|
|
3771
4246
|
"a",
|
|
3772
4247
|
{
|
|
3773
4248
|
href: item.href,
|
|
@@ -3779,7 +4254,7 @@ function DropdownLink({ item, active, onActivate }) {
|
|
|
3779
4254
|
}
|
|
3780
4255
|
) });
|
|
3781
4256
|
}
|
|
3782
|
-
return /* @__PURE__ */
|
|
4257
|
+
return /* @__PURE__ */ jsx55(RadixNav.Link, { asChild: true, active, children: /* @__PURE__ */ jsx55(
|
|
3783
4258
|
"button",
|
|
3784
4259
|
{
|
|
3785
4260
|
type: "button",
|
|
@@ -3794,7 +4269,7 @@ function DropdownLink({ item, active, onActivate }) {
|
|
|
3794
4269
|
function VerticalItem({ item, activeId, onActivate }) {
|
|
3795
4270
|
const hasChildren = (item.children?.length ?? 0) > 0;
|
|
3796
4271
|
const treeActive = isActiveTree(item, activeId);
|
|
3797
|
-
const [open, setOpen] =
|
|
4272
|
+
const [open, setOpen] = useState14(treeActive);
|
|
3798
4273
|
const prevTreeActive = useRef7(treeActive);
|
|
3799
4274
|
useEffect9(() => {
|
|
3800
4275
|
if (treeActive && !prevTreeActive.current) setOpen(true);
|
|
@@ -3808,7 +4283,7 @@ function VerticalItem({ item, activeId, onActivate }) {
|
|
|
3808
4283
|
}
|
|
3809
4284
|
onActivate(item.id);
|
|
3810
4285
|
};
|
|
3811
|
-
return /* @__PURE__ */
|
|
4286
|
+
return /* @__PURE__ */ jsx55(
|
|
3812
4287
|
NavItem,
|
|
3813
4288
|
{
|
|
3814
4289
|
icon: item.icon,
|
|
@@ -3821,8 +4296,8 @@ function VerticalItem({ item, activeId, onActivate }) {
|
|
|
3821
4296
|
}
|
|
3822
4297
|
);
|
|
3823
4298
|
}
|
|
3824
|
-
return /* @__PURE__ */
|
|
3825
|
-
/* @__PURE__ */
|
|
4299
|
+
return /* @__PURE__ */ jsxs47("div", { className: "flex flex-col", children: [
|
|
4300
|
+
/* @__PURE__ */ jsxs47(
|
|
3826
4301
|
"button",
|
|
3827
4302
|
{
|
|
3828
4303
|
type: "button",
|
|
@@ -3838,18 +4313,18 @@ function VerticalItem({ item, activeId, onActivate }) {
|
|
|
3838
4313
|
item.disabled && "pointer-events-none opacity-50"
|
|
3839
4314
|
),
|
|
3840
4315
|
children: [
|
|
3841
|
-
item.icon != null && /* @__PURE__ */
|
|
3842
|
-
/* @__PURE__ */
|
|
3843
|
-
item.badge != null && /* @__PURE__ */
|
|
3844
|
-
/* @__PURE__ */
|
|
4316
|
+
item.icon != null && /* @__PURE__ */ jsx55("span", { "aria-hidden": true, className: "w-[14px] text-center opacity-80", children: item.icon }),
|
|
4317
|
+
/* @__PURE__ */ jsx55("span", { className: "flex-1 truncate", children: item.label }),
|
|
4318
|
+
item.badge != null && /* @__PURE__ */ jsx55(ItemBadge, { active: treeActive, children: item.badge }),
|
|
4319
|
+
/* @__PURE__ */ jsx55("span", { "aria-hidden": true, className: "text-[10px] opacity-60", children: open ? "\u25BE" : "\u25B8" })
|
|
3845
4320
|
]
|
|
3846
4321
|
}
|
|
3847
4322
|
),
|
|
3848
|
-
open && /* @__PURE__ */
|
|
4323
|
+
open && /* @__PURE__ */ jsx55("div", { className: "border-border mt-1 ml-[18px] flex flex-col gap-[2px] border-l pl-3", children: item.children.map((child) => /* @__PURE__ */ jsx55(VerticalItem, { item: child, activeId, onActivate }, child.id)) })
|
|
3849
4324
|
] });
|
|
3850
4325
|
}
|
|
3851
4326
|
function ItemBadge({ active, children }) {
|
|
3852
|
-
return /* @__PURE__ */
|
|
4327
|
+
return /* @__PURE__ */ jsx55(
|
|
3853
4328
|
"span",
|
|
3854
4329
|
{
|
|
3855
4330
|
className: cn(
|
|
@@ -3861,9 +4336,105 @@ function ItemBadge({ active, children }) {
|
|
|
3861
4336
|
);
|
|
3862
4337
|
}
|
|
3863
4338
|
|
|
4339
|
+
// src/patterns/OnboardingChecklist/OnboardingChecklist.tsx
|
|
4340
|
+
import { forwardRef as forwardRef54 } from "react";
|
|
4341
|
+
import { Fragment as Fragment4, jsx as jsx56, jsxs as jsxs48 } from "react/jsx-runtime";
|
|
4342
|
+
var statusDot = {
|
|
4343
|
+
pending: "off",
|
|
4344
|
+
"in-progress": "sync",
|
|
4345
|
+
done: "ok"
|
|
4346
|
+
};
|
|
4347
|
+
var labelStateClass = {
|
|
4348
|
+
pending: "text-text",
|
|
4349
|
+
"in-progress": "text-text",
|
|
4350
|
+
done: "text-text-dim line-through"
|
|
4351
|
+
};
|
|
4352
|
+
var OnboardingChecklist = forwardRef54(
|
|
4353
|
+
function OnboardingChecklist2({ items, onItemClick, title = "Get started", progressLabel, hideProgress, className, ...props }, ref) {
|
|
4354
|
+
const total = items.length;
|
|
4355
|
+
const done = items.filter((i) => i.status === "done").length;
|
|
4356
|
+
return /* @__PURE__ */ jsxs48(
|
|
4357
|
+
"section",
|
|
4358
|
+
{
|
|
4359
|
+
ref,
|
|
4360
|
+
"aria-label": typeof title === "string" ? title : void 0,
|
|
4361
|
+
className: cn(
|
|
4362
|
+
"rounded-base border-border bg-panel flex flex-col gap-3 border p-5",
|
|
4363
|
+
className
|
|
4364
|
+
),
|
|
4365
|
+
...props,
|
|
4366
|
+
children: [
|
|
4367
|
+
/* @__PURE__ */ jsxs48("header", { className: "flex items-center gap-2", children: [
|
|
4368
|
+
/* @__PURE__ */ jsx56("span", { className: "text-[14px] font-medium", children: title }),
|
|
4369
|
+
/* @__PURE__ */ jsx56("span", { className: "text-text-dim ml-auto font-mono text-[11px] tabular-nums", children: progressLabel ?? `${done} of ${total} complete` })
|
|
4370
|
+
] }),
|
|
4371
|
+
!hideProgress && total > 0 && /* @__PURE__ */ jsx56(
|
|
4372
|
+
"div",
|
|
4373
|
+
{
|
|
4374
|
+
role: "progressbar",
|
|
4375
|
+
"aria-valuemin": 0,
|
|
4376
|
+
"aria-valuemax": total,
|
|
4377
|
+
"aria-valuenow": done,
|
|
4378
|
+
"aria-label": typeof title === "string" ? `${title} progress` : "Setup progress",
|
|
4379
|
+
className: "bg-panel-2 h-[3px] w-full overflow-hidden rounded-full",
|
|
4380
|
+
children: /* @__PURE__ */ jsx56(
|
|
4381
|
+
"span",
|
|
4382
|
+
{
|
|
4383
|
+
"aria-hidden": true,
|
|
4384
|
+
className: cn(
|
|
4385
|
+
"block h-full rounded-full transition-[width] duration-(--duration-step)",
|
|
4386
|
+
done === total ? "bg-ok" : "bg-accent"
|
|
4387
|
+
),
|
|
4388
|
+
style: { width: `${total > 0 ? done / total * 100 : 0}%` }
|
|
4389
|
+
}
|
|
4390
|
+
)
|
|
4391
|
+
}
|
|
4392
|
+
),
|
|
4393
|
+
/* @__PURE__ */ jsx56("ul", { className: "m-0 flex list-none flex-col gap-1 p-0", children: items.map((item) => {
|
|
4394
|
+
const interactive = typeof onItemClick === "function";
|
|
4395
|
+
const labelBlock = /* @__PURE__ */ jsxs48(Fragment4, { children: [
|
|
4396
|
+
/* @__PURE__ */ jsx56(
|
|
4397
|
+
StatusDot,
|
|
4398
|
+
{
|
|
4399
|
+
state: statusDot[item.status],
|
|
4400
|
+
pulse: item.status === "in-progress",
|
|
4401
|
+
size: 10,
|
|
4402
|
+
className: "mt-[3px]"
|
|
4403
|
+
}
|
|
4404
|
+
),
|
|
4405
|
+
/* @__PURE__ */ jsxs48("div", { className: "flex min-w-0 flex-1 flex-col gap-[2px]", children: [
|
|
4406
|
+
/* @__PURE__ */ jsx56("span", { className: cn("text-[13px]", labelStateClass[item.status]), children: item.label }),
|
|
4407
|
+
item.description && /* @__PURE__ */ jsx56("span", { className: "text-text-muted text-[12px] leading-[1.45]", children: item.description })
|
|
4408
|
+
] })
|
|
4409
|
+
] });
|
|
4410
|
+
const labelRegionClass = cn(
|
|
4411
|
+
"flex flex-1 items-start gap-3 rounded-md px-2 py-2 text-left transition-colors duration-(--duration-micro)",
|
|
4412
|
+
interactive && "cursor-pointer outline-none hover:bg-panel-2 focus-visible:ring-[3px] focus-visible:ring-accent-dim"
|
|
4413
|
+
);
|
|
4414
|
+
return /* @__PURE__ */ jsxs48("li", { className: "flex items-start gap-2", children: [
|
|
4415
|
+
interactive ? /* @__PURE__ */ jsx56(
|
|
4416
|
+
"button",
|
|
4417
|
+
{
|
|
4418
|
+
type: "button",
|
|
4419
|
+
"aria-current": item.status === "in-progress" ? "step" : void 0,
|
|
4420
|
+
onClick: () => onItemClick(item.id),
|
|
4421
|
+
className: labelRegionClass,
|
|
4422
|
+
children: labelBlock
|
|
4423
|
+
}
|
|
4424
|
+
) : /* @__PURE__ */ jsx56("div", { className: labelRegionClass, children: labelBlock }),
|
|
4425
|
+
item.action && /* @__PURE__ */ jsx56("div", { className: "shrink-0 self-center", children: item.action })
|
|
4426
|
+
] }, item.id);
|
|
4427
|
+
}) })
|
|
4428
|
+
]
|
|
4429
|
+
}
|
|
4430
|
+
);
|
|
4431
|
+
}
|
|
4432
|
+
);
|
|
4433
|
+
OnboardingChecklist.displayName = "OnboardingChecklist";
|
|
4434
|
+
|
|
3864
4435
|
// src/patterns/Pagination/Pagination.tsx
|
|
3865
|
-
import { forwardRef as
|
|
3866
|
-
import { jsx as
|
|
4436
|
+
import { forwardRef as forwardRef55 } from "react";
|
|
4437
|
+
import { jsx as jsx57, jsxs as jsxs49 } from "react/jsx-runtime";
|
|
3867
4438
|
function buildRange(page, total, siblings) {
|
|
3868
4439
|
if (total <= 0) return [];
|
|
3869
4440
|
const items = [];
|
|
@@ -3876,9 +4447,9 @@ function buildRange(page, total, siblings) {
|
|
|
3876
4447
|
if (total > 1) items.push(total);
|
|
3877
4448
|
return items;
|
|
3878
4449
|
}
|
|
3879
|
-
var Pagination =
|
|
4450
|
+
var Pagination = forwardRef55(function Pagination2({ page, total, onPageChange, siblings = 1, className, ...props }, ref) {
|
|
3880
4451
|
const items = buildRange(page, total, siblings);
|
|
3881
|
-
return /* @__PURE__ */
|
|
4452
|
+
return /* @__PURE__ */ jsxs49(
|
|
3882
4453
|
"nav",
|
|
3883
4454
|
{
|
|
3884
4455
|
ref,
|
|
@@ -3886,7 +4457,7 @@ var Pagination = forwardRef49(function Pagination2({ page, total, onPageChange,
|
|
|
3886
4457
|
className: cn("inline-flex items-center gap-1", className),
|
|
3887
4458
|
...props,
|
|
3888
4459
|
children: [
|
|
3889
|
-
/* @__PURE__ */
|
|
4460
|
+
/* @__PURE__ */ jsx57(
|
|
3890
4461
|
IconButton,
|
|
3891
4462
|
{
|
|
3892
4463
|
size: "sm",
|
|
@@ -3899,7 +4470,7 @@ var Pagination = forwardRef49(function Pagination2({ page, total, onPageChange,
|
|
|
3899
4470
|
),
|
|
3900
4471
|
items.map((item, i) => {
|
|
3901
4472
|
if (item === "start-ellipsis" || item === "end-ellipsis") {
|
|
3902
|
-
return /* @__PURE__ */
|
|
4473
|
+
return /* @__PURE__ */ jsx57(
|
|
3903
4474
|
"span",
|
|
3904
4475
|
{
|
|
3905
4476
|
"aria-hidden": true,
|
|
@@ -3910,7 +4481,7 @@ var Pagination = forwardRef49(function Pagination2({ page, total, onPageChange,
|
|
|
3910
4481
|
);
|
|
3911
4482
|
}
|
|
3912
4483
|
const isActive = item === page;
|
|
3913
|
-
return /* @__PURE__ */
|
|
4484
|
+
return /* @__PURE__ */ jsx57(
|
|
3914
4485
|
"button",
|
|
3915
4486
|
{
|
|
3916
4487
|
type: "button",
|
|
@@ -3928,7 +4499,7 @@ var Pagination = forwardRef49(function Pagination2({ page, total, onPageChange,
|
|
|
3928
4499
|
item
|
|
3929
4500
|
);
|
|
3930
4501
|
}),
|
|
3931
|
-
/* @__PURE__ */
|
|
4502
|
+
/* @__PURE__ */ jsx57(
|
|
3932
4503
|
IconButton,
|
|
3933
4504
|
{
|
|
3934
4505
|
size: "sm",
|
|
@@ -3947,8 +4518,8 @@ Pagination.displayName = "Pagination";
|
|
|
3947
4518
|
|
|
3948
4519
|
// src/patterns/Progress/Progress.tsx
|
|
3949
4520
|
import { cva as cva11 } from "class-variance-authority";
|
|
3950
|
-
import { forwardRef as
|
|
3951
|
-
import { jsx as
|
|
4521
|
+
import { forwardRef as forwardRef56 } from "react";
|
|
4522
|
+
import { jsx as jsx58, jsxs as jsxs50 } from "react/jsx-runtime";
|
|
3952
4523
|
var trackStyles = cva11("w-full rounded-full bg-panel-2 overflow-hidden", {
|
|
3953
4524
|
variants: {
|
|
3954
4525
|
size: {
|
|
@@ -3970,7 +4541,7 @@ var fillStyles = cva11("h-full rounded-full transition-[width] duration-(--durat
|
|
|
3970
4541
|
},
|
|
3971
4542
|
defaultVariants: { tone: "accent" }
|
|
3972
4543
|
});
|
|
3973
|
-
var Progress =
|
|
4544
|
+
var Progress = forwardRef56(function Progress2({
|
|
3974
4545
|
value = 0,
|
|
3975
4546
|
max = 100,
|
|
3976
4547
|
indeterminate = false,
|
|
@@ -3984,15 +4555,15 @@ var Progress = forwardRef50(function Progress2({
|
|
|
3984
4555
|
const clamped = Math.min(max, Math.max(0, value));
|
|
3985
4556
|
const pct = max > 0 ? clamped / max * 100 : 0;
|
|
3986
4557
|
const display = Math.round(pct);
|
|
3987
|
-
return /* @__PURE__ */
|
|
3988
|
-
label != null && /* @__PURE__ */
|
|
3989
|
-
/* @__PURE__ */
|
|
3990
|
-
showValue && !indeterminate && /* @__PURE__ */
|
|
4558
|
+
return /* @__PURE__ */ jsxs50("div", { ref, className: cn("flex w-full flex-col gap-2", className), ...props, children: [
|
|
4559
|
+
label != null && /* @__PURE__ */ jsxs50("div", { className: "flex text-[12px]", children: [
|
|
4560
|
+
/* @__PURE__ */ jsx58("span", { className: "text-text-muted", children: label }),
|
|
4561
|
+
showValue && !indeterminate && /* @__PURE__ */ jsxs50("span", { className: "text-text ml-auto font-mono tabular-nums", children: [
|
|
3991
4562
|
display,
|
|
3992
4563
|
"%"
|
|
3993
4564
|
] })
|
|
3994
4565
|
] }),
|
|
3995
|
-
/* @__PURE__ */
|
|
4566
|
+
/* @__PURE__ */ jsx58(
|
|
3996
4567
|
"div",
|
|
3997
4568
|
{
|
|
3998
4569
|
role: "progressbar",
|
|
@@ -4001,7 +4572,7 @@ var Progress = forwardRef50(function Progress2({
|
|
|
4001
4572
|
"aria-valuenow": indeterminate ? void 0 : display,
|
|
4002
4573
|
"aria-label": typeof label === "string" ? label : void 0,
|
|
4003
4574
|
className: trackStyles({ size }),
|
|
4004
|
-
children: indeterminate ? /* @__PURE__ */
|
|
4575
|
+
children: indeterminate ? /* @__PURE__ */ jsx58(
|
|
4005
4576
|
"span",
|
|
4006
4577
|
{
|
|
4007
4578
|
"aria-hidden": true,
|
|
@@ -4011,94 +4582,61 @@ var Progress = forwardRef50(function Progress2({
|
|
|
4011
4582
|
"animate-[ship-indeterminate_1.4s_linear_infinite]"
|
|
4012
4583
|
)
|
|
4013
4584
|
}
|
|
4014
|
-
) : /* @__PURE__ */
|
|
4585
|
+
) : /* @__PURE__ */ jsx58("span", { "aria-hidden": true, className: fillStyles({ tone }), style: { width: `${pct}%` } })
|
|
4015
4586
|
}
|
|
4016
4587
|
)
|
|
4017
4588
|
] });
|
|
4018
4589
|
});
|
|
4019
4590
|
Progress.displayName = "Progress";
|
|
4020
4591
|
|
|
4021
|
-
// src/patterns/
|
|
4022
|
-
import { forwardRef as
|
|
4023
|
-
import { jsx as
|
|
4024
|
-
var
|
|
4025
|
-
|
|
4026
|
-
|
|
4027
|
-
|
|
4028
|
-
|
|
4592
|
+
// src/patterns/PullToRefresh/PullToRefresh.tsx
|
|
4593
|
+
import { forwardRef as forwardRef57 } from "react";
|
|
4594
|
+
import { jsx as jsx59, jsxs as jsxs51 } from "react/jsx-runtime";
|
|
4595
|
+
var labels = {
|
|
4596
|
+
idle: "Pull to refresh",
|
|
4597
|
+
pulling: "Pull to refresh",
|
|
4598
|
+
ready: "Release to refresh",
|
|
4599
|
+
loading: "Refreshing\u2026"
|
|
4029
4600
|
};
|
|
4030
|
-
var
|
|
4031
|
-
|
|
4032
|
-
|
|
4033
|
-
|
|
4034
|
-
|
|
4035
|
-
|
|
4036
|
-
|
|
4037
|
-
|
|
4038
|
-
|
|
4039
|
-
|
|
4040
|
-
|
|
4041
|
-
|
|
4042
|
-
|
|
4043
|
-
|
|
4044
|
-
|
|
4045
|
-
|
|
4046
|
-
|
|
4047
|
-
|
|
4048
|
-
|
|
4049
|
-
|
|
4050
|
-
{
|
|
4051
|
-
ref,
|
|
4052
|
-
role: "progressbar",
|
|
4053
|
-
"aria-valuemin": 0,
|
|
4054
|
-
"aria-valuemax": max,
|
|
4055
|
-
"aria-valuenow": Math.round(pct),
|
|
4056
|
-
"aria-label": ariaLabel ?? `${Math.round(pct)}%`,
|
|
4057
|
-
className: cn("relative inline-grid place-items-center", className),
|
|
4058
|
-
style: { width: size, height: size },
|
|
4059
|
-
...props,
|
|
4060
|
-
children: [
|
|
4061
|
-
/* @__PURE__ */ jsxs45("svg", { width: size, height: size, viewBox: `0 0 ${size} ${size}`, children: [
|
|
4062
|
-
/* @__PURE__ */ jsx53(
|
|
4063
|
-
"circle",
|
|
4064
|
-
{
|
|
4065
|
-
cx: size / 2,
|
|
4066
|
-
cy: size / 2,
|
|
4067
|
-
r,
|
|
4068
|
-
fill: "none",
|
|
4069
|
-
strokeWidth: thickness,
|
|
4070
|
-
className: "stroke-panel-2"
|
|
4071
|
-
}
|
|
4601
|
+
var PullToRefresh = forwardRef57(function PullToRefresh2({ state = "idle", label, className, ...props }, ref) {
|
|
4602
|
+
const isLoading = state === "loading";
|
|
4603
|
+
const transform = state === "ready" ? "rotate(180deg)" : state === "pulling" ? "rotate(90deg)" : "rotate(0deg)";
|
|
4604
|
+
return /* @__PURE__ */ jsxs51(
|
|
4605
|
+
"div",
|
|
4606
|
+
{
|
|
4607
|
+
ref,
|
|
4608
|
+
role: "status",
|
|
4609
|
+
"aria-live": "polite",
|
|
4610
|
+
"aria-busy": isLoading || void 0,
|
|
4611
|
+
className: cn("text-text-muted flex flex-col items-center gap-[6px] py-3", className),
|
|
4612
|
+
...props,
|
|
4613
|
+
children: [
|
|
4614
|
+
/* @__PURE__ */ jsx59(
|
|
4615
|
+
"div",
|
|
4616
|
+
{
|
|
4617
|
+
"aria-hidden": true,
|
|
4618
|
+
className: cn(
|
|
4619
|
+
"border-border border-t-accent rounded-full border-2",
|
|
4620
|
+
isLoading && "animate-[ship-spin_700ms_linear_infinite]"
|
|
4072
4621
|
),
|
|
4073
|
-
|
|
4074
|
-
|
|
4075
|
-
|
|
4076
|
-
|
|
4077
|
-
|
|
4078
|
-
|
|
4079
|
-
|
|
4080
|
-
|
|
4081
|
-
|
|
4082
|
-
|
|
4083
|
-
|
|
4084
|
-
|
|
4085
|
-
|
|
4086
|
-
|
|
4087
|
-
)
|
|
4088
|
-
}
|
|
4089
|
-
)
|
|
4090
|
-
] }),
|
|
4091
|
-
/* @__PURE__ */ jsx53("div", { className: "absolute inset-0 grid place-items-center font-mono text-[11px] font-medium tabular-nums", children: children ?? `${Math.round(pct)}%` })
|
|
4092
|
-
]
|
|
4093
|
-
}
|
|
4094
|
-
);
|
|
4095
|
-
}
|
|
4096
|
-
);
|
|
4097
|
-
RadialProgress.displayName = "RadialProgress";
|
|
4622
|
+
style: {
|
|
4623
|
+
width: 22,
|
|
4624
|
+
height: 22,
|
|
4625
|
+
transform: isLoading ? void 0 : transform,
|
|
4626
|
+
transition: isLoading ? void 0 : "transform 200ms var(--easing-out)"
|
|
4627
|
+
}
|
|
4628
|
+
}
|
|
4629
|
+
),
|
|
4630
|
+
/* @__PURE__ */ jsx59("span", { className: "text-m-eyebrow font-mono tracking-wide uppercase", children: label ?? labels[state] })
|
|
4631
|
+
]
|
|
4632
|
+
}
|
|
4633
|
+
);
|
|
4634
|
+
});
|
|
4635
|
+
PullToRefresh.displayName = "PullToRefresh";
|
|
4098
4636
|
|
|
4099
4637
|
// src/patterns/Sparkline/Sparkline.tsx
|
|
4100
|
-
import { forwardRef as
|
|
4101
|
-
import { jsx as
|
|
4638
|
+
import { forwardRef as forwardRef58, useMemo as useMemo5 } from "react";
|
|
4639
|
+
import { jsx as jsx60, jsxs as jsxs52 } from "react/jsx-runtime";
|
|
4102
4640
|
function buildPath(values, w, h) {
|
|
4103
4641
|
if (values.length === 0) return { line: "", area: "" };
|
|
4104
4642
|
const pad = 2;
|
|
@@ -4117,7 +4655,7 @@ function buildPath(values, w, h) {
|
|
|
4117
4655
|
)} L${pad.toFixed(2)},${(h - pad).toFixed(2)} Z`;
|
|
4118
4656
|
return { line, area };
|
|
4119
4657
|
}
|
|
4120
|
-
var Sparkline =
|
|
4658
|
+
var Sparkline = forwardRef58(function Sparkline2({
|
|
4121
4659
|
values,
|
|
4122
4660
|
width = 160,
|
|
4123
4661
|
height = 32,
|
|
@@ -4129,7 +4667,7 @@ var Sparkline = forwardRef52(function Sparkline2({
|
|
|
4129
4667
|
...props
|
|
4130
4668
|
}, ref) {
|
|
4131
4669
|
const { line, area } = useMemo5(() => buildPath(values, width, height), [values, width, height]);
|
|
4132
|
-
return /* @__PURE__ */
|
|
4670
|
+
return /* @__PURE__ */ jsxs52(
|
|
4133
4671
|
"svg",
|
|
4134
4672
|
{
|
|
4135
4673
|
ref,
|
|
@@ -4141,8 +4679,8 @@ var Sparkline = forwardRef52(function Sparkline2({
|
|
|
4141
4679
|
className: cn("inline-block", className),
|
|
4142
4680
|
...props,
|
|
4143
4681
|
children: [
|
|
4144
|
-
fill && /* @__PURE__ */
|
|
4145
|
-
/* @__PURE__ */
|
|
4682
|
+
fill && /* @__PURE__ */ jsx60("path", { d: area, fill: stroke, fillOpacity: 0.16, stroke: "none" }),
|
|
4683
|
+
/* @__PURE__ */ jsx60(
|
|
4146
4684
|
"path",
|
|
4147
4685
|
{
|
|
4148
4686
|
d: line,
|
|
@@ -4160,16 +4698,16 @@ var Sparkline = forwardRef52(function Sparkline2({
|
|
|
4160
4698
|
Sparkline.displayName = "Sparkline";
|
|
4161
4699
|
|
|
4162
4700
|
// src/patterns/Spinner/Spinner.tsx
|
|
4163
|
-
import { forwardRef as
|
|
4164
|
-
import { jsx as
|
|
4701
|
+
import { forwardRef as forwardRef59 } from "react";
|
|
4702
|
+
import { jsx as jsx61 } from "react/jsx-runtime";
|
|
4165
4703
|
var sizes = {
|
|
4166
4704
|
sm: { box: "h-3 w-3", border: "border-[2px]" },
|
|
4167
4705
|
md: { box: "h-4 w-4", border: "border-[2px]" },
|
|
4168
4706
|
lg: { box: "h-5 w-5", border: "border-[2px]" }
|
|
4169
4707
|
};
|
|
4170
|
-
var Spinner2 =
|
|
4708
|
+
var Spinner2 = forwardRef59(function Spinner3({ size = "md", label = "Loading", className, ...props }, ref) {
|
|
4171
4709
|
const s = sizes[size];
|
|
4172
|
-
return /* @__PURE__ */
|
|
4710
|
+
return /* @__PURE__ */ jsx61(
|
|
4173
4711
|
"span",
|
|
4174
4712
|
{
|
|
4175
4713
|
ref,
|
|
@@ -4177,7 +4715,7 @@ var Spinner2 = forwardRef53(function Spinner3({ size = "md", label = "Loading",
|
|
|
4177
4715
|
"aria-label": label,
|
|
4178
4716
|
className: cn("inline-block", className),
|
|
4179
4717
|
...props,
|
|
4180
|
-
children: /* @__PURE__ */
|
|
4718
|
+
children: /* @__PURE__ */ jsx61(
|
|
4181
4719
|
"span",
|
|
4182
4720
|
{
|
|
4183
4721
|
"aria-hidden": true,
|
|
@@ -4194,15 +4732,15 @@ var Spinner2 = forwardRef53(function Spinner3({ size = "md", label = "Loading",
|
|
|
4194
4732
|
Spinner2.displayName = "Spinner";
|
|
4195
4733
|
|
|
4196
4734
|
// src/patterns/Stepper/Stepper.tsx
|
|
4197
|
-
import { forwardRef as
|
|
4198
|
-
import { jsx as
|
|
4735
|
+
import { forwardRef as forwardRef60, Fragment as Fragment5 } from "react";
|
|
4736
|
+
import { jsx as jsx62, jsxs as jsxs53 } from "react/jsx-runtime";
|
|
4199
4737
|
var dotBase = "h-6 w-6 rounded-full grid place-items-center text-[11px] font-mono font-semibold border";
|
|
4200
4738
|
var dotStateClass = {
|
|
4201
4739
|
done: "bg-accent text-on-accent border-accent",
|
|
4202
4740
|
current: "bg-accent-dim text-accent border-accent",
|
|
4203
4741
|
upcoming: "bg-panel text-text-dim border-border"
|
|
4204
4742
|
};
|
|
4205
|
-
var
|
|
4743
|
+
var labelStateClass2 = {
|
|
4206
4744
|
done: "text-text",
|
|
4207
4745
|
current: "text-text font-medium",
|
|
4208
4746
|
upcoming: "text-text-dim"
|
|
@@ -4212,8 +4750,8 @@ function stateFor(index, current) {
|
|
|
4212
4750
|
if (index === current) return "current";
|
|
4213
4751
|
return "upcoming";
|
|
4214
4752
|
}
|
|
4215
|
-
var Stepper =
|
|
4216
|
-
return /* @__PURE__ */
|
|
4753
|
+
var Stepper = forwardRef60(function Stepper2({ steps, current, className, ...props }, ref) {
|
|
4754
|
+
return /* @__PURE__ */ jsx62(
|
|
4217
4755
|
"ol",
|
|
4218
4756
|
{
|
|
4219
4757
|
ref,
|
|
@@ -4225,19 +4763,19 @@ var Stepper = forwardRef54(function Stepper2({ steps, current, className, ...pro
|
|
|
4225
4763
|
const id = typeof step === "string" ? void 0 : step.id;
|
|
4226
4764
|
const state = stateFor(i, current);
|
|
4227
4765
|
const connectorActive = i < current;
|
|
4228
|
-
return /* @__PURE__ */
|
|
4229
|
-
/* @__PURE__ */
|
|
4766
|
+
return /* @__PURE__ */ jsxs53(Fragment5, { children: [
|
|
4767
|
+
/* @__PURE__ */ jsxs53(
|
|
4230
4768
|
"li",
|
|
4231
4769
|
{
|
|
4232
4770
|
"aria-current": state === "current" ? "step" : void 0,
|
|
4233
4771
|
className: "flex items-center gap-2",
|
|
4234
4772
|
children: [
|
|
4235
|
-
/* @__PURE__ */
|
|
4236
|
-
/* @__PURE__ */
|
|
4773
|
+
/* @__PURE__ */ jsx62("span", { "aria-hidden": true, className: cn(dotBase, dotStateClass[state]), children: state === "done" ? "\u2713" : i + 1 }),
|
|
4774
|
+
/* @__PURE__ */ jsx62("span", { className: cn("text-[12px]", labelStateClass2[state]), children: label })
|
|
4237
4775
|
]
|
|
4238
4776
|
}
|
|
4239
4777
|
),
|
|
4240
|
-
i < steps.length - 1 && /* @__PURE__ */
|
|
4778
|
+
i < steps.length - 1 && /* @__PURE__ */ jsx62(
|
|
4241
4779
|
"span",
|
|
4242
4780
|
{
|
|
4243
4781
|
"aria-hidden": true,
|
|
@@ -4251,11 +4789,113 @@ var Stepper = forwardRef54(function Stepper2({ steps, current, className, ...pro
|
|
|
4251
4789
|
});
|
|
4252
4790
|
Stepper.displayName = "Stepper";
|
|
4253
4791
|
|
|
4792
|
+
// src/patterns/TabBar/TabBar.tsx
|
|
4793
|
+
import {
|
|
4794
|
+
forwardRef as forwardRef61,
|
|
4795
|
+
useCallback as useCallback11,
|
|
4796
|
+
useState as useState15
|
|
4797
|
+
} from "react";
|
|
4798
|
+
import { jsx as jsx63, jsxs as jsxs54 } from "react/jsx-runtime";
|
|
4799
|
+
var TabBar = forwardRef61(function TabBar2({ items, value, defaultValue, onValueChange, className, ...props }, ref) {
|
|
4800
|
+
const isControlled = value !== void 0;
|
|
4801
|
+
const [internalValue, setInternalValue] = useState15(defaultValue);
|
|
4802
|
+
const activeId = isControlled ? value : internalValue;
|
|
4803
|
+
const handleSelect = useCallback11(
|
|
4804
|
+
(id, e) => {
|
|
4805
|
+
if (!isControlled) setInternalValue(id);
|
|
4806
|
+
onValueChange?.(id);
|
|
4807
|
+
e.stopPropagation();
|
|
4808
|
+
},
|
|
4809
|
+
[isControlled, onValueChange]
|
|
4810
|
+
);
|
|
4811
|
+
return /* @__PURE__ */ jsx63(
|
|
4812
|
+
"nav",
|
|
4813
|
+
{
|
|
4814
|
+
ref,
|
|
4815
|
+
"aria-label": "Primary",
|
|
4816
|
+
className: cn(
|
|
4817
|
+
"border-border bg-panel h-tabbar grid items-center border-t",
|
|
4818
|
+
"pb-[env(safe-area-inset-bottom)]",
|
|
4819
|
+
className
|
|
4820
|
+
),
|
|
4821
|
+
style: { gridTemplateColumns: `repeat(${items.length}, minmax(0, 1fr))` },
|
|
4822
|
+
...props,
|
|
4823
|
+
children: items.map((item) => {
|
|
4824
|
+
const isActive = item.id === activeId;
|
|
4825
|
+
if (item.elevated) {
|
|
4826
|
+
return /* @__PURE__ */ jsx63("div", { className: "grid place-items-center", children: /* @__PURE__ */ jsxs54(
|
|
4827
|
+
"button",
|
|
4828
|
+
{
|
|
4829
|
+
type: "button",
|
|
4830
|
+
"aria-current": isActive ? "page" : void 0,
|
|
4831
|
+
disabled: item.disabled,
|
|
4832
|
+
onClick: (e) => handleSelect(item.id, e),
|
|
4833
|
+
className: cn(
|
|
4834
|
+
"bg-accent text-on-accent grid place-items-center rounded-2xl shadow-lg",
|
|
4835
|
+
"-mt-[10px] h-[52px] w-[52px]",
|
|
4836
|
+
"transition-[filter,transform] duration-(--duration-micro)",
|
|
4837
|
+
"hover:brightness-110 active:scale-95",
|
|
4838
|
+
"focus-visible:ring-accent-dim outline-none focus-visible:ring-[3px]",
|
|
4839
|
+
"disabled:cursor-not-allowed disabled:opacity-40"
|
|
4840
|
+
),
|
|
4841
|
+
children: [
|
|
4842
|
+
/* @__PURE__ */ jsx63("span", { "aria-hidden": true, children: item.icon }),
|
|
4843
|
+
/* @__PURE__ */ jsx63("span", { className: "sr-only", children: item.label })
|
|
4844
|
+
]
|
|
4845
|
+
}
|
|
4846
|
+
) }, item.id);
|
|
4847
|
+
}
|
|
4848
|
+
return /* @__PURE__ */ jsxs54(
|
|
4849
|
+
"button",
|
|
4850
|
+
{
|
|
4851
|
+
type: "button",
|
|
4852
|
+
"aria-current": isActive ? "page" : void 0,
|
|
4853
|
+
disabled: item.disabled,
|
|
4854
|
+
onClick: (e) => handleSelect(item.id, e),
|
|
4855
|
+
className: cn(
|
|
4856
|
+
"flex flex-col items-center justify-center gap-[3px] border-0 bg-transparent",
|
|
4857
|
+
"h-full cursor-pointer outline-none",
|
|
4858
|
+
"focus-visible:ring-accent-dim focus-visible:ring-[3px]",
|
|
4859
|
+
"disabled:cursor-not-allowed disabled:opacity-40",
|
|
4860
|
+
isActive ? "text-accent-text" : "text-text-muted hover:text-text"
|
|
4861
|
+
),
|
|
4862
|
+
children: [
|
|
4863
|
+
/* @__PURE__ */ jsxs54("span", { className: "relative inline-flex", "aria-hidden": true, children: [
|
|
4864
|
+
item.icon,
|
|
4865
|
+
item.badge != null && /* @__PURE__ */ jsx63(
|
|
4866
|
+
"span",
|
|
4867
|
+
{
|
|
4868
|
+
className: cn(
|
|
4869
|
+
"absolute -top-1 -right-2 rounded-full font-mono leading-none",
|
|
4870
|
+
"bg-err text-on-accent min-w-[16px] px-[5px] py-[2px] text-center text-[9px]"
|
|
4871
|
+
),
|
|
4872
|
+
children: item.badge
|
|
4873
|
+
}
|
|
4874
|
+
)
|
|
4875
|
+
] }),
|
|
4876
|
+
/* @__PURE__ */ jsxs54("span", { className: "text-[10px] font-medium tracking-tight", children: [
|
|
4877
|
+
item.label,
|
|
4878
|
+
item.badge != null && /* @__PURE__ */ jsxs54("span", { className: "sr-only", children: [
|
|
4879
|
+
", ",
|
|
4880
|
+
item.badge,
|
|
4881
|
+
" unread"
|
|
4882
|
+
] })
|
|
4883
|
+
] })
|
|
4884
|
+
]
|
|
4885
|
+
},
|
|
4886
|
+
item.id
|
|
4887
|
+
);
|
|
4888
|
+
})
|
|
4889
|
+
}
|
|
4890
|
+
);
|
|
4891
|
+
});
|
|
4892
|
+
TabBar.displayName = "TabBar";
|
|
4893
|
+
|
|
4254
4894
|
// src/patterns/Tabs/Tabs.tsx
|
|
4255
4895
|
import * as RadixTabs from "@radix-ui/react-tabs";
|
|
4256
4896
|
import { cva as cva12 } from "class-variance-authority";
|
|
4257
|
-
import { createContext as createContext2, forwardRef as
|
|
4258
|
-
import { jsx as
|
|
4897
|
+
import { createContext as createContext2, forwardRef as forwardRef62, useContext as useContext2 } from "react";
|
|
4898
|
+
import { jsx as jsx64 } from "react/jsx-runtime";
|
|
4259
4899
|
var TabsVariantContext = createContext2("underline");
|
|
4260
4900
|
var tabsListStyles = cva12("", {
|
|
4261
4901
|
variants: {
|
|
@@ -4286,8 +4926,8 @@ var tabsTriggerStyles = cva12(
|
|
|
4286
4926
|
}
|
|
4287
4927
|
}
|
|
4288
4928
|
);
|
|
4289
|
-
var Tabs =
|
|
4290
|
-
return /* @__PURE__ */
|
|
4929
|
+
var Tabs = forwardRef62(function Tabs2({ variant = "underline", className, ...props }, ref) {
|
|
4930
|
+
return /* @__PURE__ */ jsx64(TabsVariantContext.Provider, { value: variant, children: /* @__PURE__ */ jsx64(
|
|
4291
4931
|
RadixTabs.Root,
|
|
4292
4932
|
{
|
|
4293
4933
|
ref,
|
|
@@ -4297,14 +4937,14 @@ var Tabs = forwardRef55(function Tabs2({ variant = "underline", className, ...pr
|
|
|
4297
4937
|
) });
|
|
4298
4938
|
});
|
|
4299
4939
|
Tabs.displayName = "Tabs";
|
|
4300
|
-
var TabsList =
|
|
4940
|
+
var TabsList = forwardRef62(function TabsList2({ className, ...props }, ref) {
|
|
4301
4941
|
const variant = useContext2(TabsVariantContext);
|
|
4302
|
-
return /* @__PURE__ */
|
|
4942
|
+
return /* @__PURE__ */ jsx64(RadixTabs.List, { ref, className: cn(tabsListStyles({ variant }), className), ...props });
|
|
4303
4943
|
});
|
|
4304
4944
|
TabsList.displayName = "TabsList";
|
|
4305
|
-
var Tab =
|
|
4945
|
+
var Tab = forwardRef62(function Tab2({ className, ...props }, ref) {
|
|
4306
4946
|
const variant = useContext2(TabsVariantContext);
|
|
4307
|
-
return /* @__PURE__ */
|
|
4947
|
+
return /* @__PURE__ */ jsx64(
|
|
4308
4948
|
RadixTabs.Trigger,
|
|
4309
4949
|
{
|
|
4310
4950
|
ref,
|
|
@@ -4314,9 +4954,9 @@ var Tab = forwardRef55(function Tab2({ className, ...props }, ref) {
|
|
|
4314
4954
|
);
|
|
4315
4955
|
});
|
|
4316
4956
|
Tab.displayName = "Tab";
|
|
4317
|
-
var TabsContent =
|
|
4957
|
+
var TabsContent = forwardRef62(
|
|
4318
4958
|
function TabsContent2({ className, ...props }, ref) {
|
|
4319
|
-
return /* @__PURE__ */
|
|
4959
|
+
return /* @__PURE__ */ jsx64(
|
|
4320
4960
|
RadixTabs.Content,
|
|
4321
4961
|
{
|
|
4322
4962
|
ref,
|
|
@@ -4332,8 +4972,8 @@ var TabsContent = forwardRef55(
|
|
|
4332
4972
|
TabsContent.displayName = "TabsContent";
|
|
4333
4973
|
|
|
4334
4974
|
// src/patterns/Timeline/Timeline.tsx
|
|
4335
|
-
import { forwardRef as
|
|
4336
|
-
import { jsx as
|
|
4975
|
+
import { forwardRef as forwardRef63 } from "react";
|
|
4976
|
+
import { jsx as jsx65, jsxs as jsxs55 } from "react/jsx-runtime";
|
|
4337
4977
|
var ringClass = {
|
|
4338
4978
|
accent: "border-accent",
|
|
4339
4979
|
ok: "border-ok",
|
|
@@ -4341,8 +4981,8 @@ var ringClass = {
|
|
|
4341
4981
|
err: "border-err",
|
|
4342
4982
|
muted: "border-text-dim"
|
|
4343
4983
|
};
|
|
4344
|
-
var Timeline =
|
|
4345
|
-
return /* @__PURE__ */
|
|
4984
|
+
var Timeline = forwardRef63(function Timeline2({ events, className, children, ...props }, ref) {
|
|
4985
|
+
return /* @__PURE__ */ jsx65(
|
|
4346
4986
|
"ol",
|
|
4347
4987
|
{
|
|
4348
4988
|
ref,
|
|
@@ -4352,14 +4992,14 @@ var Timeline = forwardRef56(function Timeline2({ events, className, children, ..
|
|
|
4352
4992
|
className
|
|
4353
4993
|
),
|
|
4354
4994
|
...props,
|
|
4355
|
-
children: events ? events.map((e, i) => /* @__PURE__ */
|
|
4995
|
+
children: events ? events.map((e, i) => /* @__PURE__ */ jsx65(TimelineItem, { tone: e.tone, time: e.time, description: e.description, children: e.title }, i)) : children
|
|
4356
4996
|
}
|
|
4357
4997
|
);
|
|
4358
4998
|
});
|
|
4359
4999
|
Timeline.displayName = "Timeline";
|
|
4360
|
-
var TimelineItem =
|
|
4361
|
-
return /* @__PURE__ */
|
|
4362
|
-
/* @__PURE__ */
|
|
5000
|
+
var TimelineItem = forwardRef63(function TimelineItem2({ tone = "accent", description, time, className, children, ...props }, ref) {
|
|
5001
|
+
return /* @__PURE__ */ jsxs55("li", { ref, className: cn("relative mb-[18px] last:mb-0", className), ...props, children: [
|
|
5002
|
+
/* @__PURE__ */ jsx65(
|
|
4363
5003
|
"span",
|
|
4364
5004
|
{
|
|
4365
5005
|
"aria-hidden": true,
|
|
@@ -4369,31 +5009,174 @@ var TimelineItem = forwardRef56(function TimelineItem2({ tone = "accent", descri
|
|
|
4369
5009
|
)
|
|
4370
5010
|
}
|
|
4371
5011
|
),
|
|
4372
|
-
/* @__PURE__ */
|
|
4373
|
-
description && /* @__PURE__ */
|
|
4374
|
-
time && /* @__PURE__ */
|
|
5012
|
+
/* @__PURE__ */ jsx65("div", { className: "text-[13px] font-medium", children }),
|
|
5013
|
+
description && /* @__PURE__ */ jsx65("div", { className: "text-text-muted text-[12px]", children: description }),
|
|
5014
|
+
time && /* @__PURE__ */ jsx65("div", { className: "text-text-dim mt-[2px] font-mono text-[10px]", children: time })
|
|
4375
5015
|
] });
|
|
4376
5016
|
});
|
|
4377
5017
|
TimelineItem.displayName = "TimelineItem";
|
|
4378
5018
|
|
|
5019
|
+
// src/patterns/Timeline/ActivityTimeline.tsx
|
|
5020
|
+
import { forwardRef as forwardRef64 } from "react";
|
|
5021
|
+
|
|
5022
|
+
// src/patterns/Timeline/formatRelative.ts
|
|
5023
|
+
var SECOND = 1e3;
|
|
5024
|
+
var MINUTE = 60 * SECOND;
|
|
5025
|
+
var HOUR = 60 * MINUTE;
|
|
5026
|
+
var DAY = 24 * HOUR;
|
|
5027
|
+
var WEEK = 7 * DAY;
|
|
5028
|
+
var MONTH = 30 * DAY;
|
|
5029
|
+
var YEAR = 365 * DAY;
|
|
5030
|
+
var UNITS = [
|
|
5031
|
+
{ ms: YEAR, short: "y" },
|
|
5032
|
+
{ ms: MONTH, short: "mo" },
|
|
5033
|
+
{ ms: WEEK, short: "w" },
|
|
5034
|
+
{ ms: DAY, short: "d" },
|
|
5035
|
+
{ ms: HOUR, short: "h" },
|
|
5036
|
+
{ ms: MINUTE, short: "m" },
|
|
5037
|
+
{ ms: SECOND, short: "s" }
|
|
5038
|
+
];
|
|
5039
|
+
function formatRelative(input, now = /* @__PURE__ */ new Date()) {
|
|
5040
|
+
const target = input instanceof Date ? input : new Date(input);
|
|
5041
|
+
if (Number.isNaN(target.getTime())) return "";
|
|
5042
|
+
const diffMs = now.getTime() - target.getTime();
|
|
5043
|
+
const abs = Math.abs(diffMs);
|
|
5044
|
+
if (abs < 5 * SECOND) return "just now";
|
|
5045
|
+
for (const unit of UNITS) {
|
|
5046
|
+
if (abs >= unit.ms) {
|
|
5047
|
+
const n = Math.floor(abs / unit.ms);
|
|
5048
|
+
return diffMs >= 0 ? `${n}${unit.short} ago` : `in ${n}${unit.short}`;
|
|
5049
|
+
}
|
|
5050
|
+
}
|
|
5051
|
+
return "just now";
|
|
5052
|
+
}
|
|
5053
|
+
|
|
5054
|
+
// src/patterns/Timeline/ActivityTimeline.tsx
|
|
5055
|
+
import { jsx as jsx66, jsxs as jsxs56 } from "react/jsx-runtime";
|
|
5056
|
+
var ringClass2 = {
|
|
5057
|
+
accent: "border-accent",
|
|
5058
|
+
ok: "border-ok",
|
|
5059
|
+
warn: "border-warn",
|
|
5060
|
+
err: "border-err",
|
|
5061
|
+
muted: "border-text-dim"
|
|
5062
|
+
};
|
|
5063
|
+
var ActivityTimeline = forwardRef64(
|
|
5064
|
+
function ActivityTimeline2({ events, relativeNow, className, ...props }, ref) {
|
|
5065
|
+
const now = relativeNow ?? /* @__PURE__ */ new Date();
|
|
5066
|
+
return /* @__PURE__ */ jsx66(
|
|
5067
|
+
"ol",
|
|
5068
|
+
{
|
|
5069
|
+
ref,
|
|
5070
|
+
className: cn(
|
|
5071
|
+
"relative m-0 list-none p-0 pl-6",
|
|
5072
|
+
"before:bg-border before:absolute before:top-[6px] before:bottom-[6px] before:left-[7px] before:w-px",
|
|
5073
|
+
className
|
|
5074
|
+
),
|
|
5075
|
+
...props,
|
|
5076
|
+
children: events.map((event) => {
|
|
5077
|
+
const tone = event.tone ?? "accent";
|
|
5078
|
+
const time = formatRelative(event.at, now);
|
|
5079
|
+
return /* @__PURE__ */ jsxs56("li", { className: "relative mb-4 last:mb-0", children: [
|
|
5080
|
+
/* @__PURE__ */ jsx66(
|
|
5081
|
+
"span",
|
|
5082
|
+
{
|
|
5083
|
+
"aria-hidden": true,
|
|
5084
|
+
className: cn(
|
|
5085
|
+
"bg-bg absolute top-[4px] -left-6 h-[14px] w-[14px] rounded-full border-2",
|
|
5086
|
+
ringClass2[tone]
|
|
5087
|
+
)
|
|
5088
|
+
}
|
|
5089
|
+
),
|
|
5090
|
+
/* @__PURE__ */ jsxs56("div", { className: "flex items-baseline gap-2", children: [
|
|
5091
|
+
event.icon && /* @__PURE__ */ jsx66("span", { "aria-hidden": true, className: "text-text-muted font-mono text-[12px]", children: event.icon }),
|
|
5092
|
+
/* @__PURE__ */ jsx66("div", { className: "text-[13px] font-medium", children: event.title }),
|
|
5093
|
+
time && /* @__PURE__ */ jsx66("time", { className: "text-text-dim ml-auto font-mono text-[10px]", children: time })
|
|
5094
|
+
] }),
|
|
5095
|
+
event.actor && /* @__PURE__ */ jsxs56("div", { className: "text-text-muted mt-[2px] flex items-center gap-[6px] text-[12px]", children: [
|
|
5096
|
+
event.actor.avatar && /* @__PURE__ */ jsx66("span", { "aria-hidden": true, className: "inline-flex", children: event.actor.avatar }),
|
|
5097
|
+
/* @__PURE__ */ jsx66("span", { children: event.actor.name })
|
|
5098
|
+
] }),
|
|
5099
|
+
event.payload && /* @__PURE__ */ jsx66("div", { className: "border-border bg-panel-2 mt-2 rounded-md border px-3 py-2 font-mono text-[11px] leading-[1.5]", children: event.payload })
|
|
5100
|
+
] }, event.id);
|
|
5101
|
+
})
|
|
5102
|
+
}
|
|
5103
|
+
);
|
|
5104
|
+
}
|
|
5105
|
+
);
|
|
5106
|
+
ActivityTimeline.displayName = "ActivityTimeline";
|
|
5107
|
+
|
|
4379
5108
|
// src/patterns/Topbar/Topbar.tsx
|
|
4380
|
-
import { forwardRef as
|
|
4381
|
-
import { jsx as
|
|
4382
|
-
var Topbar =
|
|
4383
|
-
|
|
5109
|
+
import { forwardRef as forwardRef65 } from "react";
|
|
5110
|
+
import { jsx as jsx67, jsxs as jsxs57 } from "react/jsx-runtime";
|
|
5111
|
+
var Topbar = forwardRef65(function Topbar2({
|
|
5112
|
+
title,
|
|
5113
|
+
eyebrow,
|
|
5114
|
+
leading,
|
|
5115
|
+
back,
|
|
5116
|
+
onBack,
|
|
5117
|
+
actions,
|
|
5118
|
+
density = "comfortable",
|
|
5119
|
+
className,
|
|
5120
|
+
children,
|
|
5121
|
+
...props
|
|
5122
|
+
}, ref) {
|
|
5123
|
+
const isTouch = density === "touch";
|
|
5124
|
+
const backHandler = typeof back === "function" ? back : back ? onBack : void 0;
|
|
5125
|
+
return /* @__PURE__ */ jsxs57(
|
|
4384
5126
|
"header",
|
|
4385
5127
|
{
|
|
4386
5128
|
ref,
|
|
4387
5129
|
className: cn(
|
|
4388
|
-
"border-border bg-panel flex
|
|
5130
|
+
"border-border bg-panel flex items-center border-b",
|
|
5131
|
+
isTouch ? "h-navbar gap-2 px-3" : "h-[52px] gap-4 px-5",
|
|
4389
5132
|
className
|
|
4390
5133
|
),
|
|
4391
5134
|
...props,
|
|
4392
5135
|
children: [
|
|
5136
|
+
isTouch && back && /* @__PURE__ */ jsx67(
|
|
5137
|
+
"button",
|
|
5138
|
+
{
|
|
5139
|
+
type: "button",
|
|
5140
|
+
onClick: backHandler,
|
|
5141
|
+
"aria-label": "Back",
|
|
5142
|
+
className: cn(
|
|
5143
|
+
"text-text inline-grid place-items-center rounded-md bg-transparent",
|
|
5144
|
+
// The back button is only rendered in touch density — use the
|
|
5145
|
+
// touch token (44pt) instead of `h-9 w-9` (36px) so it meets the
|
|
5146
|
+
// HIG minimum the rest of the touch surface enforces.
|
|
5147
|
+
"hover:bg-panel-2 h-touch w-touch",
|
|
5148
|
+
"focus-visible:ring-accent-dim outline-none focus-visible:ring-[3px]"
|
|
5149
|
+
),
|
|
5150
|
+
children: /* @__PURE__ */ jsx67(
|
|
5151
|
+
"svg",
|
|
5152
|
+
{
|
|
5153
|
+
width: "20",
|
|
5154
|
+
height: "20",
|
|
5155
|
+
viewBox: "0 0 24 24",
|
|
5156
|
+
fill: "none",
|
|
5157
|
+
stroke: "currentColor",
|
|
5158
|
+
strokeWidth: "2",
|
|
5159
|
+
"aria-hidden": true,
|
|
5160
|
+
children: /* @__PURE__ */ jsx67("path", { d: "m15 18-6-6 6-6" })
|
|
5161
|
+
}
|
|
5162
|
+
)
|
|
5163
|
+
}
|
|
5164
|
+
),
|
|
4393
5165
|
leading,
|
|
4394
|
-
title && /* @__PURE__ */
|
|
4395
|
-
|
|
4396
|
-
|
|
5166
|
+
(title || isTouch && eyebrow) && /* @__PURE__ */ jsxs57("div", { className: cn("min-w-0", isTouch && "flex-1"), children: [
|
|
5167
|
+
isTouch && eyebrow && /* @__PURE__ */ jsx67("div", { className: "text-m-eyebrow text-accent font-mono tracking-wide uppercase", children: eyebrow }),
|
|
5168
|
+
title && /* @__PURE__ */ jsx67(
|
|
5169
|
+
"div",
|
|
5170
|
+
{
|
|
5171
|
+
className: cn(
|
|
5172
|
+
isTouch ? "text-m-body-lg truncate font-semibold tracking-tight" : "text-[13px] font-medium"
|
|
5173
|
+
),
|
|
5174
|
+
children: title
|
|
5175
|
+
}
|
|
5176
|
+
)
|
|
5177
|
+
] }),
|
|
5178
|
+
!isTouch && /* @__PURE__ */ jsx67("div", { className: "flex flex-1 items-center" }),
|
|
5179
|
+
actions && /* @__PURE__ */ jsx67("div", { className: cn("flex items-center", isTouch ? "gap-1" : "gap-3"), children: actions }),
|
|
4397
5180
|
children
|
|
4398
5181
|
]
|
|
4399
5182
|
}
|
|
@@ -4403,14 +5186,14 @@ Topbar.displayName = "Topbar";
|
|
|
4403
5186
|
|
|
4404
5187
|
// src/patterns/Tree/Tree.tsx
|
|
4405
5188
|
import {
|
|
4406
|
-
forwardRef as
|
|
4407
|
-
useCallback as
|
|
5189
|
+
forwardRef as forwardRef66,
|
|
5190
|
+
useCallback as useCallback12,
|
|
4408
5191
|
useEffect as useEffect10,
|
|
4409
5192
|
useMemo as useMemo6,
|
|
4410
5193
|
useRef as useRef8,
|
|
4411
|
-
useState as
|
|
5194
|
+
useState as useState16
|
|
4412
5195
|
} from "react";
|
|
4413
|
-
import { jsx as
|
|
5196
|
+
import { jsx as jsx68, jsxs as jsxs58 } from "react/jsx-runtime";
|
|
4414
5197
|
var EMPTY_SET2 = /* @__PURE__ */ new Set();
|
|
4415
5198
|
function flattenVisible(items, expanded, level, parentId, out) {
|
|
4416
5199
|
for (const item of items) {
|
|
@@ -4421,7 +5204,7 @@ function flattenVisible(items, expanded, level, parentId, out) {
|
|
|
4421
5204
|
}
|
|
4422
5205
|
}
|
|
4423
5206
|
}
|
|
4424
|
-
var Tree =
|
|
5207
|
+
var Tree = forwardRef66(function Tree2({
|
|
4425
5208
|
items,
|
|
4426
5209
|
expanded: expandedProp,
|
|
4427
5210
|
defaultExpanded,
|
|
@@ -4449,7 +5232,7 @@ var Tree = forwardRef58(function Tree2({
|
|
|
4449
5232
|
flattenVisible(items, expandedSet, 1, null, out);
|
|
4450
5233
|
return out;
|
|
4451
5234
|
}, [items, expandedSet]);
|
|
4452
|
-
const [activeId, setActiveId] =
|
|
5235
|
+
const [activeId, setActiveId] = useState16(null);
|
|
4453
5236
|
useEffect10(() => {
|
|
4454
5237
|
if (activeId && !flatVisible.some((f) => f.id === activeId)) {
|
|
4455
5238
|
setActiveId(null);
|
|
@@ -4461,7 +5244,7 @@ var Tree = forwardRef58(function Tree2({
|
|
|
4461
5244
|
return flatVisible[0]?.id ?? null;
|
|
4462
5245
|
}, [activeId, flatVisible, value]);
|
|
4463
5246
|
const listRef = useRef8(null);
|
|
4464
|
-
const setRefs =
|
|
5247
|
+
const setRefs = useCallback12(
|
|
4465
5248
|
(node) => {
|
|
4466
5249
|
listRef.current = node;
|
|
4467
5250
|
if (typeof ref === "function") ref(node);
|
|
@@ -4469,20 +5252,20 @@ var Tree = forwardRef58(function Tree2({
|
|
|
4469
5252
|
},
|
|
4470
5253
|
[ref]
|
|
4471
5254
|
);
|
|
4472
|
-
const focusItem =
|
|
5255
|
+
const focusItem = useCallback12((id) => {
|
|
4473
5256
|
const root = listRef.current;
|
|
4474
5257
|
if (!root) return;
|
|
4475
5258
|
const el = root.querySelector(`[data-treeitem-id="${CSS.escape(id)}"]`);
|
|
4476
5259
|
el?.focus();
|
|
4477
5260
|
}, []);
|
|
4478
|
-
const moveActive =
|
|
5261
|
+
const moveActive = useCallback12(
|
|
4479
5262
|
(id) => {
|
|
4480
5263
|
setActiveId(id);
|
|
4481
5264
|
queueMicrotask(() => focusItem(id));
|
|
4482
5265
|
},
|
|
4483
5266
|
[focusItem]
|
|
4484
5267
|
);
|
|
4485
|
-
const toggle =
|
|
5268
|
+
const toggle = useCallback12(
|
|
4486
5269
|
(id) => {
|
|
4487
5270
|
setExpanded((prev) => {
|
|
4488
5271
|
const next = new Set(prev ?? EMPTY_SET2);
|
|
@@ -4493,7 +5276,7 @@ var Tree = forwardRef58(function Tree2({
|
|
|
4493
5276
|
},
|
|
4494
5277
|
[setExpanded]
|
|
4495
5278
|
);
|
|
4496
|
-
const expand =
|
|
5279
|
+
const expand = useCallback12(
|
|
4497
5280
|
(id) => {
|
|
4498
5281
|
setExpanded((prev) => {
|
|
4499
5282
|
const base = prev ?? EMPTY_SET2;
|
|
@@ -4505,7 +5288,7 @@ var Tree = forwardRef58(function Tree2({
|
|
|
4505
5288
|
},
|
|
4506
5289
|
[setExpanded]
|
|
4507
5290
|
);
|
|
4508
|
-
const collapse =
|
|
5291
|
+
const collapse = useCallback12(
|
|
4509
5292
|
(id) => {
|
|
4510
5293
|
setExpanded((prev) => {
|
|
4511
5294
|
const base = prev ?? EMPTY_SET2;
|
|
@@ -4517,13 +5300,13 @@ var Tree = forwardRef58(function Tree2({
|
|
|
4517
5300
|
},
|
|
4518
5301
|
[setExpanded]
|
|
4519
5302
|
);
|
|
4520
|
-
const selectItem =
|
|
5303
|
+
const selectItem = useCallback12(
|
|
4521
5304
|
(id) => {
|
|
4522
5305
|
setValue(id);
|
|
4523
5306
|
},
|
|
4524
5307
|
[setValue]
|
|
4525
5308
|
);
|
|
4526
|
-
const handleKeyDown =
|
|
5309
|
+
const handleKeyDown = useCallback12(
|
|
4527
5310
|
(e) => {
|
|
4528
5311
|
onKeyDown?.(e);
|
|
4529
5312
|
if (e.defaultPrevented) return;
|
|
@@ -4603,7 +5386,7 @@ var Tree = forwardRef58(function Tree2({
|
|
|
4603
5386
|
toggle
|
|
4604
5387
|
]
|
|
4605
5388
|
);
|
|
4606
|
-
return /* @__PURE__ */
|
|
5389
|
+
return /* @__PURE__ */ jsx68(
|
|
4607
5390
|
"ul",
|
|
4608
5391
|
{
|
|
4609
5392
|
ref: setRefs,
|
|
@@ -4611,7 +5394,7 @@ var Tree = forwardRef58(function Tree2({
|
|
|
4611
5394
|
className: cn("flex flex-col gap-px text-[12px]", className),
|
|
4612
5395
|
onKeyDown: handleKeyDown,
|
|
4613
5396
|
...props,
|
|
4614
|
-
children: items.map((item) => /* @__PURE__ */
|
|
5397
|
+
children: items.map((item) => /* @__PURE__ */ jsx68(
|
|
4615
5398
|
TreeItemRow,
|
|
4616
5399
|
{
|
|
4617
5400
|
item,
|
|
@@ -4646,8 +5429,8 @@ function TreeItemRow({
|
|
|
4646
5429
|
const isExpanded = hasChildren && expanded.has(item.id);
|
|
4647
5430
|
const isSelected = selected === item.id;
|
|
4648
5431
|
const isTabStop = tabStopId === item.id;
|
|
4649
|
-
return /* @__PURE__ */
|
|
4650
|
-
/* @__PURE__ */
|
|
5432
|
+
return /* @__PURE__ */ jsxs58("li", { role: "none", children: [
|
|
5433
|
+
/* @__PURE__ */ jsxs58(
|
|
4651
5434
|
"div",
|
|
4652
5435
|
{
|
|
4653
5436
|
role: "treeitem",
|
|
@@ -4670,14 +5453,14 @@ function TreeItemRow({
|
|
|
4670
5453
|
isSelected ? "bg-accent-dim text-accent" : "text-text hover:bg-panel-2"
|
|
4671
5454
|
),
|
|
4672
5455
|
children: [
|
|
4673
|
-
/* @__PURE__ */
|
|
4674
|
-
item.icon && /* @__PURE__ */
|
|
4675
|
-
/* @__PURE__ */
|
|
5456
|
+
/* @__PURE__ */ jsx68("span", { "aria-hidden": true, className: "text-text-dim grid w-3 place-items-center text-[10px]", children: hasChildren ? isExpanded ? "\u25BE" : "\u25B8" : "" }),
|
|
5457
|
+
item.icon && /* @__PURE__ */ jsx68("span", { "aria-hidden": true, className: "text-[12px] opacity-80", children: item.icon }),
|
|
5458
|
+
/* @__PURE__ */ jsx68("span", { className: "flex-1 truncate", children: item.label }),
|
|
4676
5459
|
item.trailing
|
|
4677
5460
|
]
|
|
4678
5461
|
}
|
|
4679
5462
|
),
|
|
4680
|
-
hasChildren && isExpanded && /* @__PURE__ */
|
|
5463
|
+
hasChildren && isExpanded && /* @__PURE__ */ jsx68("ul", { role: "group", className: "flex flex-col gap-px", children: (item.children ?? []).map((child) => /* @__PURE__ */ jsx68(
|
|
4681
5464
|
TreeItemRow,
|
|
4682
5465
|
{
|
|
4683
5466
|
item: child,
|
|
@@ -4693,7 +5476,83 @@ function TreeItemRow({
|
|
|
4693
5476
|
)) })
|
|
4694
5477
|
] });
|
|
4695
5478
|
}
|
|
5479
|
+
|
|
5480
|
+
// src/patterns/WizardDialog/WizardDialog.tsx
|
|
5481
|
+
import * as RadixDialog5 from "@radix-ui/react-dialog";
|
|
5482
|
+
import { forwardRef as forwardRef67, useCallback as useCallback13, useMemo as useMemo7, useState as useState17 } from "react";
|
|
5483
|
+
import { jsx as jsx69, jsxs as jsxs59 } from "react/jsx-runtime";
|
|
5484
|
+
var WizardDialog = forwardRef67(function WizardDialog2({
|
|
5485
|
+
open,
|
|
5486
|
+
defaultOpen,
|
|
5487
|
+
onOpenChange,
|
|
5488
|
+
steps,
|
|
5489
|
+
initialStep = 0,
|
|
5490
|
+
onComplete,
|
|
5491
|
+
title,
|
|
5492
|
+
description,
|
|
5493
|
+
width = 560,
|
|
5494
|
+
nextLabel = "Next",
|
|
5495
|
+
completeLabel = "Done",
|
|
5496
|
+
backLabel = "Back",
|
|
5497
|
+
cancelLabel,
|
|
5498
|
+
onCancel
|
|
5499
|
+
}, ref) {
|
|
5500
|
+
const [current, setCurrent] = useState17(initialStep);
|
|
5501
|
+
const total = steps.length;
|
|
5502
|
+
const safeCurrent = Math.min(current, Math.max(0, total - 1));
|
|
5503
|
+
const step = steps[safeCurrent];
|
|
5504
|
+
const goTo = useCallback13(
|
|
5505
|
+
(index) => {
|
|
5506
|
+
setCurrent(Math.min(Math.max(0, index), Math.max(0, total - 1)));
|
|
5507
|
+
},
|
|
5508
|
+
[total]
|
|
5509
|
+
);
|
|
5510
|
+
const goNext = useCallback13(() => setCurrent((c) => Math.min(c + 1, total - 1)), [total]);
|
|
5511
|
+
const goBack = useCallback13(() => setCurrent((c) => Math.max(c - 1, 0)), []);
|
|
5512
|
+
const ctx = useMemo7(
|
|
5513
|
+
() => ({
|
|
5514
|
+
current: safeCurrent,
|
|
5515
|
+
total,
|
|
5516
|
+
goNext,
|
|
5517
|
+
goBack,
|
|
5518
|
+
goTo,
|
|
5519
|
+
isFirst: safeCurrent === 0,
|
|
5520
|
+
isLast: safeCurrent >= total - 1
|
|
5521
|
+
}),
|
|
5522
|
+
[safeCurrent, total, goNext, goBack, goTo]
|
|
5523
|
+
);
|
|
5524
|
+
const stepperSteps = useMemo7(() => steps.map((s) => ({ id: s.id, label: s.label })), [steps]);
|
|
5525
|
+
if (!step) return null;
|
|
5526
|
+
const canAdvance = step.canAdvance ? step.canAdvance(ctx) : true;
|
|
5527
|
+
const body = typeof step.content === "function" ? step.content(ctx) : step.content;
|
|
5528
|
+
const handlePrimary = () => {
|
|
5529
|
+
if (ctx.isLast) {
|
|
5530
|
+
onComplete?.();
|
|
5531
|
+
} else {
|
|
5532
|
+
goNext();
|
|
5533
|
+
}
|
|
5534
|
+
};
|
|
5535
|
+
return /* @__PURE__ */ jsx69(DialogRoot, { open, defaultOpen, onOpenChange, children: /* @__PURE__ */ jsxs59(DialogContent, { ref, width, children: [
|
|
5536
|
+
title && /* @__PURE__ */ jsx69(WizardTitle, { children: title }),
|
|
5537
|
+
description && /* @__PURE__ */ jsx69(WizardDescription, { children: description }),
|
|
5538
|
+
/* @__PURE__ */ jsx69("div", { className: "mb-5", children: /* @__PURE__ */ jsx69(Stepper, { steps: stepperSteps, current: safeCurrent }) }),
|
|
5539
|
+
/* @__PURE__ */ jsx69("div", { className: "mb-5", children: body }),
|
|
5540
|
+
/* @__PURE__ */ jsxs59("div", { className: "flex justify-end gap-2", children: [
|
|
5541
|
+
cancelLabel && /* @__PURE__ */ jsx69(Button, { type: "button", variant: "ghost", onClick: onCancel, children: cancelLabel }),
|
|
5542
|
+
/* @__PURE__ */ jsx69(Button, { type: "button", variant: "secondary", onClick: goBack, disabled: ctx.isFirst, children: backLabel }),
|
|
5543
|
+
/* @__PURE__ */ jsx69(Button, { type: "button", variant: "primary", onClick: handlePrimary, disabled: !canAdvance, children: ctx.isLast ? completeLabel : nextLabel })
|
|
5544
|
+
] })
|
|
5545
|
+
] }) });
|
|
5546
|
+
});
|
|
5547
|
+
function WizardTitle({ children }) {
|
|
5548
|
+
return /* @__PURE__ */ jsx69(RadixDialog5.Title, { className: "mb-2 text-[16px] font-medium", children });
|
|
5549
|
+
}
|
|
5550
|
+
function WizardDescription({ children }) {
|
|
5551
|
+
return /* @__PURE__ */ jsx69(RadixDialog5.Description, { className: "text-text-muted mb-4 text-[13px] leading-[1.55]", children });
|
|
5552
|
+
}
|
|
5553
|
+
WizardDialog.displayName = "WizardDialog";
|
|
4696
5554
|
export {
|
|
5555
|
+
ActivityTimeline,
|
|
4697
5556
|
Alert,
|
|
4698
5557
|
AlertDialog,
|
|
4699
5558
|
AlertDialogAction,
|
|
@@ -4746,6 +5605,8 @@ export {
|
|
|
4746
5605
|
FAB,
|
|
4747
5606
|
Field,
|
|
4748
5607
|
FileChip,
|
|
5608
|
+
FilterPanel,
|
|
5609
|
+
HealthScore,
|
|
4749
5610
|
HoverCard,
|
|
4750
5611
|
HoverCardContent,
|
|
4751
5612
|
HoverCardPortal,
|
|
@@ -4754,6 +5615,7 @@ export {
|
|
|
4754
5615
|
IconButton,
|
|
4755
5616
|
Input,
|
|
4756
5617
|
Kbd,
|
|
5618
|
+
LargeTitle,
|
|
4757
5619
|
MenuCheckboxItem,
|
|
4758
5620
|
MenuItem,
|
|
4759
5621
|
MenuSeparator,
|
|
@@ -4767,6 +5629,7 @@ export {
|
|
|
4767
5629
|
NavItem,
|
|
4768
5630
|
NavSection,
|
|
4769
5631
|
OTP,
|
|
5632
|
+
OnboardingChecklist,
|
|
4770
5633
|
Pagination,
|
|
4771
5634
|
Popover,
|
|
4772
5635
|
PopoverAnchor,
|
|
@@ -4777,9 +5640,11 @@ export {
|
|
|
4777
5640
|
PopoverRoot,
|
|
4778
5641
|
PopoverTrigger,
|
|
4779
5642
|
Progress,
|
|
5643
|
+
PullToRefresh,
|
|
4780
5644
|
RadialProgress,
|
|
4781
5645
|
Radio,
|
|
4782
5646
|
RadioGroup,
|
|
5647
|
+
ScrollArea,
|
|
4783
5648
|
SearchInput,
|
|
4784
5649
|
Select,
|
|
4785
5650
|
SelectContent,
|
|
@@ -4802,6 +5667,7 @@ export {
|
|
|
4802
5667
|
Stepper,
|
|
4803
5668
|
Switch,
|
|
4804
5669
|
Tab,
|
|
5670
|
+
TabBar,
|
|
4805
5671
|
Tabs,
|
|
4806
5672
|
TabsContent,
|
|
4807
5673
|
TabsList,
|
|
@@ -4820,11 +5686,13 @@ export {
|
|
|
4820
5686
|
TooltipTrigger,
|
|
4821
5687
|
Topbar,
|
|
4822
5688
|
Tree,
|
|
5689
|
+
WizardDialog,
|
|
4823
5690
|
badgeStyles,
|
|
4824
5691
|
buttonStyles,
|
|
4825
5692
|
cardStyles,
|
|
4826
5693
|
cn,
|
|
4827
5694
|
filterCommandItems,
|
|
5695
|
+
formatRelative,
|
|
4828
5696
|
iconButtonStyles,
|
|
4829
5697
|
useControllableState,
|
|
4830
5698
|
useDisclosure,
|