@syscore/ui-library 1.27.3 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.es.js CHANGED
@@ -1,9 +1,9 @@
1
- import { jsx, jsxs, Fragment } from "react/jsx-runtime";
1
+ import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
2
  import * as React from "react";
3
3
  import { useState, useEffect, useCallback, useRef, useLayoutEffect, createContext, Children, isValidElement, cloneElement, useContext, useMemo } from "react";
4
- import { motion, AnimatePresence, animate, useMotionValue } from "motion/react";
5
4
  import { clsx } from "clsx";
6
5
  import { twMerge } from "tailwind-merge";
6
+ import { motion, AnimatePresence, animate, useMotionValue } from "motion/react";
7
7
  import { cva } from "class-variance-authority";
8
8
  import * as AspectRatioPrimitive from "@radix-ui/react-aspect-ratio";
9
9
  import * as SeparatorPrimitive from "@radix-ui/react-separator";
@@ -38,6 +38,7 @@ import useEmblaCarousel from "embla-carousel-react";
38
38
  import * as CollapsiblePrimitive from "@radix-ui/react-collapsible";
39
39
  import * as ToastPrimitives from "@radix-ui/react-toast";
40
40
  import * as RechartsPrimitive from "recharts";
41
+ import { format } from "date-fns";
41
42
  import { useTheme } from "next-themes";
42
43
  import { Toaster as Toaster$2 } from "sonner";
43
44
  function cn(...inputs) {
@@ -47,6 +48,656 @@ function capitalize(str) {
47
48
  if (!str) return str;
48
49
  return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();
49
50
  }
51
+ const DENSITY_HEIGHT = {
52
+ default: 64,
53
+ comfortable: 56,
54
+ compact: 48,
55
+ prominent: 128
56
+ };
57
+ const AppBar = React.forwardRef(
58
+ ({
59
+ className,
60
+ children,
61
+ collapse = false,
62
+ rounded = false,
63
+ elevated = false,
64
+ flat = false,
65
+ position = "fixed",
66
+ color = "default",
67
+ density = "default",
68
+ image,
69
+ imageOverlay,
70
+ style,
71
+ ...props
72
+ }, ref) => {
73
+ const height = DENSITY_HEIGHT[density];
74
+ const isProminent = density === "prominent";
75
+ return /* @__PURE__ */ jsxs(
76
+ "header",
77
+ {
78
+ ref,
79
+ role: "banner",
80
+ style: {
81
+ height: collapse ? void 0 : height,
82
+ ...style
83
+ },
84
+ className: cn(
85
+ "app-bar",
86
+ // position
87
+ position === "fixed" && "app-bar--fixed",
88
+ position === "sticky" && "app-bar--sticky",
89
+ position === "relative" && "app-bar--relative",
90
+ position === "static" && "app-bar--static",
91
+ // color variants
92
+ color === "primary" && "app-bar--primary",
93
+ color === "transparent" && "app-bar--transparent",
94
+ // density
95
+ density === "comfortable" && "app-bar--comfortable",
96
+ density === "compact" && "app-bar--compact",
97
+ isProminent && "app-bar--prominent",
98
+ // modifiers
99
+ rounded && "app-bar--rounded",
100
+ elevated && "app-bar--elevated",
101
+ flat && "app-bar--flat",
102
+ collapse && "app-bar--collapse",
103
+ // image
104
+ image && "app-bar--image",
105
+ className
106
+ ),
107
+ ...props,
108
+ children: [
109
+ image && /* @__PURE__ */ jsx(
110
+ "span",
111
+ {
112
+ className: "app-bar-image-layer",
113
+ style: { backgroundImage: `url(${image})` },
114
+ "aria-hidden": "true",
115
+ children: imageOverlay && /* @__PURE__ */ jsx(
116
+ "span",
117
+ {
118
+ className: "app-bar-image-overlay",
119
+ style: {
120
+ background: `linear-gradient(${imageOverlay})`
121
+ }
122
+ }
123
+ )
124
+ }
125
+ ),
126
+ isProminent ? /* @__PURE__ */ jsx(ProminentLayout, { children }) : children
127
+ ]
128
+ }
129
+ );
130
+ }
131
+ );
132
+ AppBar.displayName = "AppBar";
133
+ const AppBarNavIcon = React.forwardRef(
134
+ ({ className, icon, children, ...props }, ref) => /* @__PURE__ */ jsx(
135
+ "button",
136
+ {
137
+ ref,
138
+ type: "button",
139
+ "aria-label": "Open navigation menu",
140
+ className: cn("app-bar-nav-icon", className),
141
+ ...props,
142
+ children: children ?? icon ?? /* @__PURE__ */ jsx(HamburgerIcon, {})
143
+ }
144
+ )
145
+ );
146
+ AppBarNavIcon.displayName = "AppBarNavIcon";
147
+ const AppBarTitle = React.forwardRef(
148
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx(
149
+ "div",
150
+ {
151
+ ref,
152
+ className: cn("app-bar-title", className),
153
+ ...props
154
+ }
155
+ )
156
+ );
157
+ AppBarTitle.displayName = "AppBarTitle";
158
+ const AppBarPrepend = React.forwardRef(
159
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx(
160
+ "div",
161
+ {
162
+ ref,
163
+ className: cn("app-bar-prepend", className),
164
+ ...props
165
+ }
166
+ )
167
+ );
168
+ AppBarPrepend.displayName = "AppBarPrepend";
169
+ const AppBarAppend = React.forwardRef(
170
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx(
171
+ "div",
172
+ {
173
+ ref,
174
+ className: cn("app-bar-append", className),
175
+ ...props
176
+ }
177
+ )
178
+ );
179
+ AppBarAppend.displayName = "AppBarAppend";
180
+ const AppBarContent = React.forwardRef(
181
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx(
182
+ "div",
183
+ {
184
+ ref,
185
+ className: cn("app-bar-content", className),
186
+ ...props
187
+ }
188
+ )
189
+ );
190
+ AppBarContent.displayName = "AppBarContent";
191
+ function ProminentLayout({ children }) {
192
+ const kids = React.Children.toArray(children);
193
+ const topKids = kids.filter((child) => {
194
+ if (!React.isValidElement(child)) return false;
195
+ const name = child.type.displayName ?? "";
196
+ return name === "AppBarPrepend" || name === "AppBarAppend";
197
+ });
198
+ const bottomKids = kids.filter((child) => {
199
+ if (!React.isValidElement(child)) return false;
200
+ const name = child.type.displayName ?? "";
201
+ return name === "AppBarTitle" || name === "AppBarContent";
202
+ });
203
+ const otherKids = kids.filter((child) => {
204
+ if (!React.isValidElement(child)) return true;
205
+ const name = child.type.displayName ?? "";
206
+ return ![
207
+ "AppBarPrepend",
208
+ "AppBarAppend",
209
+ "AppBarTitle",
210
+ "AppBarContent"
211
+ ].includes(name);
212
+ });
213
+ return /* @__PURE__ */ jsxs("span", { className: "app-bar-prominent-inner", children: [
214
+ /* @__PURE__ */ jsxs("span", { className: "app-bar-prominent-top", children: [
215
+ topKids,
216
+ otherKids
217
+ ] }),
218
+ /* @__PURE__ */ jsx("span", { className: "app-bar-prominent-bottom", children: bottomKids })
219
+ ] });
220
+ }
221
+ function HamburgerIcon() {
222
+ return /* @__PURE__ */ jsxs(
223
+ "svg",
224
+ {
225
+ xmlns: "http://www.w3.org/2000/svg",
226
+ width: "24",
227
+ height: "24",
228
+ viewBox: "0 0 24 24",
229
+ fill: "none",
230
+ stroke: "currentColor",
231
+ strokeWidth: "2",
232
+ strokeLinecap: "round",
233
+ strokeLinejoin: "round",
234
+ "aria-hidden": "true",
235
+ children: [
236
+ /* @__PURE__ */ jsx("line", { x1: "4", y1: "6", x2: "20", y2: "6" }),
237
+ /* @__PURE__ */ jsx("line", { x1: "4", y1: "12", x2: "20", y2: "12" }),
238
+ /* @__PURE__ */ jsx("line", { x1: "4", y1: "18", x2: "20", y2: "18" })
239
+ ]
240
+ }
241
+ );
242
+ }
243
+ const BottomNavContext = React.createContext({
244
+ value: null,
245
+ onChange: () => {
246
+ },
247
+ grow: false,
248
+ horizontal: false,
249
+ shift: false,
250
+ activeColor: void 0
251
+ });
252
+ const BottomNavigation = React.forwardRef(
253
+ ({
254
+ className,
255
+ children,
256
+ value: valueProp,
257
+ defaultValue,
258
+ onChange,
259
+ color,
260
+ grow = false,
261
+ horizontal = false,
262
+ shift = false,
263
+ active = true,
264
+ elevated = false,
265
+ ...props
266
+ }, ref) => {
267
+ const [internalValue, setInternalValue] = React.useState(defaultValue ?? null);
268
+ const isControlled = valueProp !== void 0;
269
+ const currentValue = isControlled ? valueProp : internalValue;
270
+ const handleChange = React.useCallback(
271
+ (val) => {
272
+ if (!isControlled) setInternalValue(val);
273
+ onChange == null ? void 0 : onChange(val);
274
+ },
275
+ [isControlled, onChange]
276
+ );
277
+ return /* @__PURE__ */ jsx(
278
+ BottomNavContext.Provider,
279
+ {
280
+ value: {
281
+ value: currentValue ?? null,
282
+ onChange: handleChange,
283
+ grow,
284
+ horizontal,
285
+ shift,
286
+ activeColor: color
287
+ },
288
+ children: /* @__PURE__ */ jsx(
289
+ "nav",
290
+ {
291
+ ref,
292
+ role: "navigation",
293
+ "aria-label": "Bottom navigation",
294
+ className: cn(
295
+ "bottom-nav",
296
+ grow && "bottom-nav--grow",
297
+ horizontal && "bottom-nav--horizontal",
298
+ shift && "bottom-nav--shift",
299
+ !active && "bottom-nav--hidden",
300
+ elevated && "bottom-nav--elevated",
301
+ className
302
+ ),
303
+ ...props,
304
+ children
305
+ }
306
+ )
307
+ }
308
+ );
309
+ }
310
+ );
311
+ BottomNavigation.displayName = "BottomNavigation";
312
+ const BottomNavigationItem = React.forwardRef(({ className, children, value: valueProp, _index, style, ...props }, ref) => {
313
+ const { value, onChange, grow, horizontal, shift, activeColor } = React.useContext(BottomNavContext);
314
+ const itemValue = valueProp ?? _index ?? 0;
315
+ const isActive = value === itemValue;
316
+ const activeStyle = isActive && activeColor ? { "--bottom-nav-active-color": activeColor } : {};
317
+ return /* @__PURE__ */ jsx(
318
+ "button",
319
+ {
320
+ ref,
321
+ type: "button",
322
+ role: "tab",
323
+ "aria-selected": isActive,
324
+ "aria-current": isActive ? "page" : void 0,
325
+ onClick: () => onChange(itemValue),
326
+ style: { ...activeStyle, ...style },
327
+ className: cn(
328
+ "bottom-nav-item",
329
+ isActive && "bottom-nav-item--active",
330
+ grow && "bottom-nav-item--grow",
331
+ horizontal && "bottom-nav-item--horizontal",
332
+ shift && "bottom-nav-item--shift",
333
+ className
334
+ ),
335
+ ...props,
336
+ children
337
+ }
338
+ );
339
+ });
340
+ BottomNavigationItem.displayName = "BottomNavigationItem";
341
+ const BottomNavigationGroup = React.forwardRef(({ children, className, ...props }, ref) => {
342
+ const indexedChildren = React.Children.map(children, (child, index) => {
343
+ if (!React.isValidElement(child)) return child;
344
+ const el = child;
345
+ if (el.type.displayName === "BottomNavigationItem") {
346
+ return React.cloneElement(el, { _index: index });
347
+ }
348
+ return child;
349
+ });
350
+ return /* @__PURE__ */ jsx(
351
+ "div",
352
+ {
353
+ ref,
354
+ role: "tablist",
355
+ className: cn("bottom-nav-group", className),
356
+ ...props,
357
+ children: indexedChildren
358
+ }
359
+ );
360
+ });
361
+ BottomNavigationGroup.displayName = "BottomNavigationGroup";
362
+ const Footer = React.forwardRef(
363
+ ({
364
+ className,
365
+ children,
366
+ bordered = false,
367
+ rounded = false,
368
+ elevated = false,
369
+ color,
370
+ style,
371
+ ...props
372
+ }, ref) => /* @__PURE__ */ jsx(
373
+ "footer",
374
+ {
375
+ ref,
376
+ style: { backgroundColor: color, ...style },
377
+ className: cn(
378
+ "footer",
379
+ bordered && "footer--bordered",
380
+ rounded && "footer--rounded",
381
+ elevated && "footer--elevated",
382
+ className
383
+ ),
384
+ ...props,
385
+ children
386
+ }
387
+ )
388
+ );
389
+ Footer.displayName = "Footer";
390
+ const FooterRow = React.forwardRef(
391
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx("div", { ref, className: cn("footer-row", className), ...props })
392
+ );
393
+ FooterRow.displayName = "FooterRow";
394
+ const FooterLinks = React.forwardRef(
395
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx("div", { ref, className: cn("footer-links", className), ...props })
396
+ );
397
+ FooterLinks.displayName = "FooterLinks";
398
+ const FooterLink = React.forwardRef(
399
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx("a", { ref, className: cn("footer-link", className), ...props })
400
+ );
401
+ FooterLink.displayName = "FooterLink";
402
+ const FooterIconButton = React.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsx(
403
+ "button",
404
+ {
405
+ ref,
406
+ type: "button",
407
+ className: cn("footer-icon-btn", className),
408
+ ...props,
409
+ children
410
+ }
411
+ ));
412
+ FooterIconButton.displayName = "FooterIconButton";
413
+ const FooterDivider = React.forwardRef(
414
+ ({ className, width, style, ...props }, ref) => /* @__PURE__ */ jsx(
415
+ "hr",
416
+ {
417
+ ref,
418
+ style: { width, ...style },
419
+ className: cn("footer-divider", className),
420
+ ...props
421
+ }
422
+ )
423
+ );
424
+ FooterDivider.displayName = "FooterDivider";
425
+ const FooterCopyright = React.forwardRef(
426
+ ({
427
+ className,
428
+ company = "International WELL Building Institute",
429
+ year,
430
+ ...props
431
+ }, ref) => /* @__PURE__ */ jsxs("div", { ref, className: cn("footer-copyright", className), ...props, children: [
432
+ year ?? (/* @__PURE__ */ new Date()).getFullYear(),
433
+ " —",
434
+ " ",
435
+ /* @__PURE__ */ jsxs("strong", { children: [
436
+ "© ",
437
+ company
438
+ ] })
439
+ ] })
440
+ );
441
+ FooterCopyright.displayName = "FooterCopyright";
442
+ const FooterBand = React.forwardRef(
443
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx("div", { ref, className: cn("footer-band", className), ...props })
444
+ );
445
+ FooterBand.displayName = "FooterBand";
446
+ const HeroSection = ({ backgroundSlot, contentSlot }) => {
447
+ return /* @__PURE__ */ jsxs("section", { className: "relative flex flex-col sm:pt-[169px] pt-24 items-center min-h-[454px] bg-cyan-900 overflow-hidden", children: [
448
+ backgroundSlot,
449
+ /* @__PURE__ */ jsxs("header", { className: "relative z-10 flex flex-col items-center text-center overflow-visible", children: [
450
+ /* @__PURE__ */ jsx(
451
+ motion.h2,
452
+ {
453
+ className: "heading-small mb-6",
454
+ initial: { opacity: 0, y: 20 },
455
+ animate: { opacity: 1, y: 0 },
456
+ transition: { duration: 0.6, delay: 0.3 },
457
+ children: /* @__PURE__ */ jsx(
458
+ "span",
459
+ {
460
+ style: {
461
+ background: "linear-gradient(90deg, #084654 0.08%, #2D718A 50.08%, #084654 100.08%)",
462
+ backgroundClip: "text",
463
+ WebkitBackgroundClip: "text",
464
+ WebkitTextFillColor: "transparent"
465
+ },
466
+ children: "One unified, harmonized standard"
467
+ }
468
+ )
469
+ }
470
+ ),
471
+ /* @__PURE__ */ jsx(
472
+ motion.h1,
473
+ {
474
+ className: "text-white heading-large mb-[70px]",
475
+ initial: { opacity: 0, y: 20 },
476
+ animate: { opacity: 1, y: 0 },
477
+ transition: { duration: 0.6, delay: 0.4 },
478
+ children: "One WELL"
479
+ }
480
+ ),
481
+ contentSlot
482
+ ] })
483
+ ] });
484
+ };
485
+ const SystemBar = React.forwardRef(
486
+ ({
487
+ className,
488
+ children,
489
+ color,
490
+ window: isWindow = false,
491
+ height,
492
+ style,
493
+ ...props
494
+ }, ref) => {
495
+ const barHeight = height ?? (isWindow ? 32 : 24);
496
+ return /* @__PURE__ */ jsx(
497
+ "header",
498
+ {
499
+ ref,
500
+ role: "banner",
501
+ style: {
502
+ height: barHeight,
503
+ backgroundColor: color,
504
+ ...style
505
+ },
506
+ className: cn(
507
+ "system-bar",
508
+ isWindow && "system-bar--window",
509
+ color && "system-bar--colored",
510
+ className
511
+ ),
512
+ ...props,
513
+ children
514
+ }
515
+ );
516
+ }
517
+ );
518
+ SystemBar.displayName = "SystemBar";
519
+ const SystemBarSpacer = React.forwardRef(
520
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx(
521
+ "span",
522
+ {
523
+ ref,
524
+ className: cn("system-bar-spacer", className),
525
+ ...props
526
+ }
527
+ )
528
+ );
529
+ SystemBarSpacer.displayName = "SystemBarSpacer";
530
+ const SystemBarIcon = React.forwardRef(
531
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx(
532
+ "span",
533
+ {
534
+ ref,
535
+ className: cn("system-bar-icon", className),
536
+ ...props
537
+ }
538
+ )
539
+ );
540
+ SystemBarIcon.displayName = "SystemBarIcon";
541
+ const SystemBarAction = React.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsx(
542
+ "button",
543
+ {
544
+ ref,
545
+ type: "button",
546
+ className: cn("system-bar-action", className),
547
+ ...props,
548
+ children
549
+ }
550
+ ));
551
+ SystemBarAction.displayName = "SystemBarAction";
552
+ const TimelineContext = React.createContext({
553
+ direction: "vertical",
554
+ side: "alternate",
555
+ align: "center",
556
+ density: "default"
557
+ });
558
+ const Timeline = React.forwardRef(
559
+ ({
560
+ className,
561
+ children,
562
+ direction = "vertical",
563
+ side = "alternate",
564
+ align = "center",
565
+ density = "default",
566
+ ...props
567
+ }, ref) => /* @__PURE__ */ jsx(TimelineContext.Provider, { value: { direction, side, align, density }, children: /* @__PURE__ */ jsx(
568
+ "div",
569
+ {
570
+ ref,
571
+ className: cn(
572
+ "timeline",
573
+ direction === "horizontal" && "timeline--horizontal",
574
+ `timeline--side-${side}`,
575
+ `timeline--align-${align}`,
576
+ density === "compact" && "timeline--compact",
577
+ className
578
+ ),
579
+ ...props,
580
+ children
581
+ }
582
+ ) })
583
+ );
584
+ Timeline.displayName = "Timeline";
585
+ const TimelineItem = React.forwardRef(
586
+ ({
587
+ className,
588
+ children,
589
+ dotColor,
590
+ size = "small",
591
+ fillDot = false,
592
+ hideDot = false,
593
+ icon,
594
+ opposite,
595
+ ...props
596
+ }, ref) => {
597
+ const { align } = React.useContext(TimelineContext);
598
+ return /* @__PURE__ */ jsxs(
599
+ "div",
600
+ {
601
+ ref,
602
+ className: cn(
603
+ "timeline-item",
604
+ `timeline-item--size-${size}`,
605
+ fillDot && "timeline-item--fill-dot",
606
+ hideDot && "timeline-item--hide-dot",
607
+ align === "start" && "timeline-item--align-start",
608
+ className
609
+ ),
610
+ ...props,
611
+ children: [
612
+ /* @__PURE__ */ jsx("div", { className: "timeline-item-opposite", children: opposite }),
613
+ /* @__PURE__ */ jsxs("div", { className: "timeline-item-stem", children: [
614
+ /* @__PURE__ */ jsx("div", { className: "timeline-item-stem-line timeline-item-stem-line--before" }),
615
+ !hideDot && /* @__PURE__ */ jsx(
616
+ "div",
617
+ {
618
+ className: "timeline-item-dot",
619
+ style: dotColor ? { backgroundColor: dotColor, borderColor: dotColor } : void 0,
620
+ children: icon && /* @__PURE__ */ jsx("span", { className: "timeline-item-dot-icon", children: icon })
621
+ }
622
+ ),
623
+ /* @__PURE__ */ jsx("div", { className: "timeline-item-stem-line timeline-item-stem-line--after" })
624
+ ] }),
625
+ /* @__PURE__ */ jsx("div", { className: "timeline-item-body", children })
626
+ ]
627
+ }
628
+ );
629
+ }
630
+ );
631
+ TimelineItem.displayName = "TimelineItem";
632
+ const EmptyState = React.forwardRef(
633
+ ({
634
+ className,
635
+ children,
636
+ headline,
637
+ title,
638
+ subtitle,
639
+ text,
640
+ image,
641
+ imageAlt = "",
642
+ icon,
643
+ actionText,
644
+ onClickAction,
645
+ mediaSlot,
646
+ headlineSlot,
647
+ titleSlot,
648
+ subtitleSlot,
649
+ textSlot,
650
+ actionsSlot,
651
+ ...props
652
+ }, ref) => {
653
+ const hasMedia = mediaSlot || image || icon;
654
+ const hasHeadline = headlineSlot || headline;
655
+ const hasTitle = titleSlot || title;
656
+ const hasSubtitle = subtitleSlot || subtitle;
657
+ const hasText = textSlot || text;
658
+ const hasActions = actionsSlot || actionText;
659
+ return /* @__PURE__ */ jsxs(
660
+ "div",
661
+ {
662
+ ref,
663
+ className: cn("empty-state", className),
664
+ ...props,
665
+ children: [
666
+ hasMedia && /* @__PURE__ */ jsx("div", { className: "empty-state-media", children: mediaSlot ?? (image ? /* @__PURE__ */ jsx(
667
+ "img",
668
+ {
669
+ src: image,
670
+ alt: imageAlt,
671
+ className: "empty-state-image"
672
+ }
673
+ ) : /* @__PURE__ */ jsx("span", { className: "empty-state-icon", children: icon })) }),
674
+ hasHeadline && /* @__PURE__ */ jsx("div", { className: "empty-state-headline", children: headlineSlot ?? headline }),
675
+ hasTitle && /* @__PURE__ */ jsx("div", { className: "empty-state-title", children: titleSlot ?? title }),
676
+ hasSubtitle && /* @__PURE__ */ jsx("div", { className: "empty-state-subtitle", children: subtitleSlot ?? subtitle }),
677
+ hasText && /* @__PURE__ */ jsx("div", { className: "empty-state-text", children: textSlot ?? text }),
678
+ children && /* @__PURE__ */ jsx("div", { className: "empty-state-default", children }),
679
+ hasActions && /* @__PURE__ */ jsx("div", { className: "empty-state-actions", children: actionsSlot ?? /* @__PURE__ */ jsx(EmptyStateAction, { onClick: onClickAction, children: actionText }) })
680
+ ]
681
+ }
682
+ );
683
+ }
684
+ );
685
+ EmptyState.displayName = "EmptyState";
686
+ const EmptyStateAction = React.forwardRef(({ className, variant = "default", ...props }, ref) => /* @__PURE__ */ jsx(
687
+ "button",
688
+ {
689
+ ref,
690
+ type: "button",
691
+ className: cn(
692
+ "empty-state-action-btn",
693
+ variant === "primary" && "empty-state-action-btn--primary",
694
+ variant === "outline" && "empty-state-action-btn--outline",
695
+ className
696
+ ),
697
+ ...props
698
+ }
699
+ ));
700
+ EmptyStateAction.displayName = "EmptyStateAction";
50
701
  const buttonVariants = cva(
51
702
  "button",
52
703
  {
@@ -536,14 +1187,30 @@ const ListItem = React.forwardRef(
536
1187
  }
537
1188
  );
538
1189
  ListItem.displayName = "ListItem";
539
- const Card = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
540
- "div",
541
- {
542
- ref,
543
- className: cn("card", className),
544
- ...props
1190
+ const cardVariants = cva("card", {
1191
+ variants: {
1192
+ variant: {
1193
+ default: "card--default",
1194
+ outlined: "card--outlined",
1195
+ elevated: "card--elevated",
1196
+ filled: "card--filled",
1197
+ interactive: "card--interactive"
1198
+ }
1199
+ },
1200
+ defaultVariants: {
1201
+ variant: "default"
545
1202
  }
546
- ));
1203
+ });
1204
+ const Card = React.forwardRef(
1205
+ ({ className, variant, ...props }, ref) => /* @__PURE__ */ jsx(
1206
+ "div",
1207
+ {
1208
+ ref,
1209
+ className: cn(cardVariants({ variant }), className),
1210
+ ...props
1211
+ }
1212
+ )
1213
+ );
547
1214
  Card.displayName = "Card";
548
1215
  const CardHeader = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx("div", { ref, className: cn("card-header", className), ...props }));
549
1216
  CardHeader.displayName = "CardHeader";
@@ -583,21 +1250,51 @@ const CardFooter = React.forwardRef(({ className, ...props }, ref) => /* @__PURE
583
1250
  }
584
1251
  ));
585
1252
  CardFooter.displayName = "CardFooter";
586
- const CardWithIcon = React.forwardRef(({ icon: Icon, title, description, onClick }, ref) => /* @__PURE__ */ jsxs(
587
- Card,
588
- {
589
- ref,
590
- className: "card-with-icon",
591
- onClick,
592
- children: [
593
- /* @__PURE__ */ jsxs("div", { className: "card-with-icon__header", children: [
594
- Icon && /* @__PURE__ */ jsx(Icon, { className: "card-with-icon__icon" }),
595
- /* @__PURE__ */ jsx(Text, { as: "h3", variant: "overline-large", children: title })
596
- ] }),
597
- /* @__PURE__ */ jsx(Text, { as: "p", variant: "body-base", children: description })
598
- ]
599
- }
600
- ));
1253
+ const CardMedia = React.forwardRef(({ className, src, alt = "", height = 200, children, ...props }, ref) => /* @__PURE__ */ jsx("div", { ref, className: cn("card-media", className), style: { height }, ...props, children: src ? /* @__PURE__ */ jsx("img", { src, alt, className: "card-media__img" }) : children }));
1254
+ CardMedia.displayName = "CardMedia";
1255
+ const CardBadge = React.forwardRef(
1256
+ ({ className, color = "default", ...props }, ref) => /* @__PURE__ */ jsx(
1257
+ "span",
1258
+ {
1259
+ ref,
1260
+ className: cn("card-badge", `card-badge--${color}`, className),
1261
+ ...props
1262
+ }
1263
+ )
1264
+ );
1265
+ CardBadge.displayName = "CardBadge";
1266
+ const CardActions = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx("div", { ref, className: cn("card-actions", className), ...props }));
1267
+ CardActions.displayName = "CardActions";
1268
+ const CardMetric = React.forwardRef(
1269
+ ({ className, value, label, trend, trendValue, ...props }, ref) => /* @__PURE__ */ jsxs("div", { ref, className: cn("card-metric", className), ...props, children: [
1270
+ /* @__PURE__ */ jsx("span", { className: "card-metric__value", children: value }),
1271
+ /* @__PURE__ */ jsx("span", { className: "card-metric__label", children: label }),
1272
+ trend && trendValue && /* @__PURE__ */ jsxs("span", { className: cn("card-metric__trend", `card-metric__trend--${trend}`), children: [
1273
+ trend === "up" ? "↑" : trend === "down" ? "↓" : "→",
1274
+ " ",
1275
+ trendValue
1276
+ ] })
1277
+ ] })
1278
+ );
1279
+ CardMetric.displayName = "CardMetric";
1280
+ const CardWithIcon = React.forwardRef(
1281
+ ({ icon: Icon, title, description, onClick }, ref) => /* @__PURE__ */ jsxs(
1282
+ Card,
1283
+ {
1284
+ ref,
1285
+ variant: "interactive",
1286
+ className: "card-with-icon",
1287
+ onClick,
1288
+ children: [
1289
+ /* @__PURE__ */ jsxs("div", { className: "card-with-icon__header", children: [
1290
+ Icon && /* @__PURE__ */ jsx(Icon, { className: "card-with-icon__icon" }),
1291
+ /* @__PURE__ */ jsx(Text, { as: "h3", variant: "overline-large", children: title })
1292
+ ] }),
1293
+ /* @__PURE__ */ jsx(Text, { as: "p", variant: "body-base", children: description })
1294
+ ]
1295
+ }
1296
+ )
1297
+ );
601
1298
  CardWithIcon.displayName = "CardWithIcon";
602
1299
  const Separator = React.forwardRef(
603
1300
  ({ className, orientation = "horizontal", decorative = true, ...props }, ref) => /* @__PURE__ */ jsx(
@@ -2142,6 +2839,68 @@ const AlertDescription = React.forwardRef(({ className, ...props }, ref) => /* @
2142
2839
  }
2143
2840
  ));
2144
2841
  AlertDescription.displayName = "AlertDescription";
2842
+ const bannerVariants = cva("banner", {
2843
+ variants: {
2844
+ variant: {
2845
+ default: "banner--default",
2846
+ info: "banner--info",
2847
+ success: "banner--success",
2848
+ warning: "banner--warning",
2849
+ destructive: "banner--destructive"
2850
+ }
2851
+ },
2852
+ defaultVariants: {
2853
+ variant: "default"
2854
+ }
2855
+ });
2856
+ const Banner = React.forwardRef(
2857
+ ({ className, variant, sticky = false, onClose, children, ...props }, ref) => /* @__PURE__ */ jsxs(
2858
+ "div",
2859
+ {
2860
+ ref,
2861
+ role: "banner",
2862
+ className: cn(bannerVariants({ variant }), sticky && "banner--sticky", className),
2863
+ ...props,
2864
+ children: [
2865
+ /* @__PURE__ */ jsx("div", { className: "banner-content", children }),
2866
+ onClose && /* @__PURE__ */ jsx(
2867
+ "button",
2868
+ {
2869
+ type: "button",
2870
+ className: "banner-close",
2871
+ "aria-label": "Dismiss banner",
2872
+ onClick: onClose,
2873
+ children: /* @__PURE__ */ jsxs("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: [
2874
+ /* @__PURE__ */ jsx("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
2875
+ /* @__PURE__ */ jsx("line", { x1: "6", y1: "6", x2: "18", y2: "18" })
2876
+ ] })
2877
+ }
2878
+ )
2879
+ ]
2880
+ }
2881
+ )
2882
+ );
2883
+ Banner.displayName = "Banner";
2884
+ const BannerIcon = React.forwardRef(
2885
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx("span", { ref, className: cn("banner-icon", className), "aria-hidden": "true", ...props })
2886
+ );
2887
+ BannerIcon.displayName = "BannerIcon";
2888
+ const BannerTitle = React.forwardRef(
2889
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx("p", { ref, className: cn("banner-title", className), ...props })
2890
+ );
2891
+ BannerTitle.displayName = "BannerTitle";
2892
+ const BannerDescription = React.forwardRef(
2893
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx("p", { ref, className: cn("banner-description", className), ...props })
2894
+ );
2895
+ BannerDescription.displayName = "BannerDescription";
2896
+ const BannerText = React.forwardRef(
2897
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx("div", { ref, className: cn("banner-text", className), ...props })
2898
+ );
2899
+ BannerText.displayName = "BannerText";
2900
+ const BannerAction = React.forwardRef(
2901
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx("button", { ref, type: "button", className: cn("banner-action", className), ...props })
2902
+ );
2903
+ BannerAction.displayName = "BannerAction";
2145
2904
  const AlertDialog = AlertDialogPrimitive.Root;
2146
2905
  const AlertDialogTrigger = AlertDialogPrimitive.Trigger;
2147
2906
  const AlertDialogPortal = AlertDialogPrimitive.Portal;
@@ -2800,6 +3559,204 @@ function HeightContainer({
2800
3559
  }, [stateKey]);
2801
3560
  return /* @__PURE__ */ jsx("div", { ref: containerRef, className: cn("overflow-clip", className), children: /* @__PURE__ */ jsx("div", { ref: innerRef, children }) });
2802
3561
  }
3562
+ const spacing = (n) => `${n * 0.25}rem`;
3563
+ const Stack = React.forwardRef(
3564
+ ({ as: Component = "div", direction = "vertical", gap = 4, align, justify, wrap = false, className, style, ...props }, ref) => /* @__PURE__ */ jsx(
3565
+ Component,
3566
+ {
3567
+ ref,
3568
+ className: cn(
3569
+ "stack",
3570
+ direction === "horizontal" && "stack--horizontal",
3571
+ align && `stack--align-${align}`,
3572
+ justify && `stack--justify-${justify}`,
3573
+ wrap && "stack--wrap",
3574
+ className
3575
+ ),
3576
+ style: { gap: spacing(gap), ...style },
3577
+ ...props
3578
+ }
3579
+ )
3580
+ );
3581
+ Stack.displayName = "Stack";
3582
+ const Grid = React.forwardRef(
3583
+ ({ as: Component = "div", cols = 1, colsSm, colsMd, colsLg, gap = 4, rowGap, colGap, className, style, ...props }, ref) => /* @__PURE__ */ jsx(
3584
+ Component,
3585
+ {
3586
+ ref,
3587
+ className: cn(
3588
+ "grid-layout",
3589
+ `grid-layout--cols-${cols}`,
3590
+ colsSm && `grid-layout--sm-cols-${colsSm}`,
3591
+ colsMd && `grid-layout--md-cols-${colsMd}`,
3592
+ colsLg && `grid-layout--lg-cols-${colsLg}`,
3593
+ className
3594
+ ),
3595
+ style: {
3596
+ gap: rowGap === void 0 && colGap === void 0 ? spacing(gap) : void 0,
3597
+ rowGap: rowGap !== void 0 ? spacing(rowGap) : void 0,
3598
+ columnGap: colGap !== void 0 ? spacing(colGap) : void 0,
3599
+ ...style
3600
+ },
3601
+ ...props
3602
+ }
3603
+ )
3604
+ );
3605
+ Grid.displayName = "Grid";
3606
+ const ColumnsPresetMap = {
3607
+ "sidebar": "280px 1fr",
3608
+ "sidebar-right": "1fr 280px",
3609
+ "wide-sidebar": "360px 1fr",
3610
+ "narrow-sidebar": "200px 1fr",
3611
+ "split": "1fr 1fr",
3612
+ "1-2": "1fr 2fr",
3613
+ "2-1": "2fr 1fr",
3614
+ "1-3": "1fr 3fr",
3615
+ "3-1": "3fr 1fr"
3616
+ };
3617
+ const Columns = React.forwardRef(
3618
+ ({ as: Component = "div", preset = "split", template, gap = 6, colGap, rowGap, collapse, className, style, ...props }, ref) => /* @__PURE__ */ jsx(
3619
+ Component,
3620
+ {
3621
+ ref,
3622
+ className: cn(
3623
+ "columns-layout",
3624
+ collapse && `columns-layout--collapse-${collapse}`,
3625
+ className
3626
+ ),
3627
+ style: {
3628
+ gridTemplateColumns: template ?? ColumnsPresetMap[preset],
3629
+ gap: rowGap === void 0 && colGap === void 0 ? spacing(gap) : void 0,
3630
+ rowGap: rowGap !== void 0 ? spacing(rowGap) : void 0,
3631
+ columnGap: colGap !== void 0 ? spacing(colGap) : void 0,
3632
+ ...style
3633
+ },
3634
+ ...props
3635
+ }
3636
+ )
3637
+ );
3638
+ Columns.displayName = "Columns";
3639
+ const Container = React.forwardRef(
3640
+ ({ as: Component = "div", size = "xl", center = true, padded = true, className, ...props }, ref) => /* @__PURE__ */ jsx(
3641
+ Component,
3642
+ {
3643
+ ref,
3644
+ className: cn(
3645
+ "container-layout",
3646
+ `container-layout--${size}`,
3647
+ center && "container-layout--center",
3648
+ padded && "container-layout--padded",
3649
+ className
3650
+ ),
3651
+ ...props
3652
+ }
3653
+ )
3654
+ );
3655
+ Container.displayName = "Container";
3656
+ const Section = React.forwardRef(
3657
+ ({ as: Component = "section", padding = "lg", className, ...props }, ref) => /* @__PURE__ */ jsx(
3658
+ Component,
3659
+ {
3660
+ ref,
3661
+ className: cn("section-layout", padding !== "none" && `section-layout--${padding}`, className),
3662
+ ...props
3663
+ }
3664
+ )
3665
+ );
3666
+ Section.displayName = "Section";
3667
+ const AppShell = React.forwardRef(
3668
+ ({ sidebarWidth = "17.5rem", headerHeight = "4rem", className, style, ...props }, ref) => /* @__PURE__ */ jsx(
3669
+ "div",
3670
+ {
3671
+ ref,
3672
+ className: cn("app-shell", className),
3673
+ style: {
3674
+ "--app-shell-header-height": typeof headerHeight === "number" ? `${headerHeight}px` : headerHeight,
3675
+ "--app-shell-sidebar-width": typeof sidebarWidth === "number" ? `${sidebarWidth}px` : sidebarWidth,
3676
+ ...style
3677
+ },
3678
+ ...props
3679
+ }
3680
+ )
3681
+ );
3682
+ AppShell.displayName = "AppShell";
3683
+ const AppShellHeader = React.forwardRef(
3684
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx("header", { ref, className: cn("app-shell-header", className), ...props })
3685
+ );
3686
+ AppShellHeader.displayName = "AppShellHeader";
3687
+ const AppShellSidebar = React.forwardRef(
3688
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx("aside", { ref, className: cn("app-shell-sidebar", className), ...props })
3689
+ );
3690
+ AppShellSidebar.displayName = "AppShellSidebar";
3691
+ const AppShellMain = React.forwardRef(
3692
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx("main", { ref, className: cn("app-shell-main", className), ...props })
3693
+ );
3694
+ AppShellMain.displayName = "AppShellMain";
3695
+ const AppShellFooter = React.forwardRef(
3696
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx("footer", { ref, className: cn("app-shell-footer", className), ...props })
3697
+ );
3698
+ AppShellFooter.displayName = "AppShellFooter";
3699
+ const Show = React.forwardRef(
3700
+ ({ above, below, as: Component = "div", className, ...props }, ref) => /* @__PURE__ */ jsx(
3701
+ Component,
3702
+ {
3703
+ ref,
3704
+ className: cn(
3705
+ above && `show-above-${above}`,
3706
+ below && `show-below-${below}`,
3707
+ className
3708
+ ),
3709
+ ...props
3710
+ }
3711
+ )
3712
+ );
3713
+ Show.displayName = "Show";
3714
+ const Hide = React.forwardRef(
3715
+ ({ above, below, as: Component = "div", className, ...props }, ref) => /* @__PURE__ */ jsx(
3716
+ Component,
3717
+ {
3718
+ ref,
3719
+ className: cn(
3720
+ above && `hide-above-${above}`,
3721
+ below && `hide-below-${below}`,
3722
+ className
3723
+ ),
3724
+ ...props
3725
+ }
3726
+ )
3727
+ );
3728
+ Hide.displayName = "Hide";
3729
+ const Positioned = React.forwardRef(
3730
+ ({ as: Component = "div", position = "relative", top, right, bottom, left, inset, zIndex, fill = false, className, style, ...props }, ref) => {
3731
+ const resolveValue = (v) => v === void 0 ? void 0 : typeof v === "number" ? spacing(v) : v;
3732
+ return /* @__PURE__ */ jsx(
3733
+ Component,
3734
+ {
3735
+ ref,
3736
+ className: cn(`positioned--${position}`, className),
3737
+ style: {
3738
+ top: resolveValue(top),
3739
+ right: resolveValue(right),
3740
+ bottom: resolveValue(bottom),
3741
+ left: resolveValue(left),
3742
+ inset: fill ? 0 : resolveValue(inset),
3743
+ zIndex,
3744
+ ...style
3745
+ },
3746
+ ...props
3747
+ }
3748
+ );
3749
+ }
3750
+ );
3751
+ Positioned.displayName = "Positioned";
3752
+ const Spacer = ({ size = 4, axis = "vertical" }) => /* @__PURE__ */ jsx(
3753
+ "div",
3754
+ {
3755
+ "aria-hidden": "true",
3756
+ style: axis === "vertical" ? { height: spacing(size), minHeight: spacing(size) } : { width: spacing(size), minWidth: spacing(size) }
3757
+ }
3758
+ );
3759
+ Spacer.displayName = "Spacer";
2803
3760
  const TabsContext = createContext(null);
2804
3761
  function useTabsContext() {
2805
3762
  const ctx = useContext(TabsContext);
@@ -4914,6 +5871,398 @@ const NavigationAccount = React.forwardRef(({ className, asChild, children, ...p
4914
5871
  );
4915
5872
  });
4916
5873
  NavigationAccount.displayName = "NavigationAccount";
5874
+ function formatBytes(bytes) {
5875
+ if (bytes < 1024) return `${bytes} B`;
5876
+ if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;
5877
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
5878
+ }
5879
+ function getFileIcon(type) {
5880
+ if (type.startsWith("image/")) return "🖼";
5881
+ if (type === "application/pdf") return "📄";
5882
+ if (type.includes("spreadsheet") || type.includes("excel") || type.includes("csv")) return "📊";
5883
+ if (type.includes("word") || type.includes("document")) return "📝";
5884
+ if (type.includes("zip") || type.includes("compressed")) return "🗜";
5885
+ return "📎";
5886
+ }
5887
+ const FileUpload = React.forwardRef(
5888
+ ({
5889
+ accept,
5890
+ multiple = false,
5891
+ maxSize,
5892
+ maxFiles,
5893
+ disabled = false,
5894
+ variant = "default",
5895
+ onFilesChange,
5896
+ className
5897
+ }, ref) => {
5898
+ const [files, setFiles] = React.useState([]);
5899
+ const [isDragging, setIsDragging] = React.useState(false);
5900
+ const inputRef = React.useRef(null);
5901
+ const validateFile = (file) => {
5902
+ if (maxSize && file.size > maxSize) {
5903
+ return `File exceeds ${formatBytes(maxSize)} limit`;
5904
+ }
5905
+ return void 0;
5906
+ };
5907
+ const addFiles = (incoming) => {
5908
+ const incomingArray = Array.from(incoming);
5909
+ const next = multiple ? [...files] : [];
5910
+ for (const file of incomingArray) {
5911
+ if (maxFiles && next.filter((f) => !f.error).length >= maxFiles) break;
5912
+ const error = validateFile(file);
5913
+ next.push({ file, id: `${file.name}-${Date.now()}-${Math.random()}`, error });
5914
+ }
5915
+ setFiles(next);
5916
+ onFilesChange == null ? void 0 : onFilesChange(next.filter((f) => !f.error).map((f) => f.file));
5917
+ };
5918
+ const removeFile = (id) => {
5919
+ const next = files.filter((f) => f.id !== id);
5920
+ setFiles(next);
5921
+ onFilesChange == null ? void 0 : onFilesChange(next.filter((f) => !f.error).map((f) => f.file));
5922
+ };
5923
+ const onDragOver = (e) => {
5924
+ e.preventDefault();
5925
+ if (!disabled) setIsDragging(true);
5926
+ };
5927
+ const onDragLeave = (e) => {
5928
+ e.preventDefault();
5929
+ setIsDragging(false);
5930
+ };
5931
+ const onDrop = (e) => {
5932
+ e.preventDefault();
5933
+ setIsDragging(false);
5934
+ if (disabled) return;
5935
+ if (e.dataTransfer.files.length > 0) addFiles(e.dataTransfer.files);
5936
+ };
5937
+ const onInputChange = (e) => {
5938
+ if (e.target.files && e.target.files.length > 0) {
5939
+ addFiles(e.target.files);
5940
+ e.target.value = "";
5941
+ }
5942
+ };
5943
+ const openPicker = () => {
5944
+ var _a;
5945
+ if (!disabled) (_a = inputRef.current) == null ? void 0 : _a.click();
5946
+ };
5947
+ return /* @__PURE__ */ jsxs("div", { ref, className: cn("file-upload", className), children: [
5948
+ /* @__PURE__ */ jsxs(
5949
+ "div",
5950
+ {
5951
+ role: "button",
5952
+ tabIndex: disabled ? -1 : 0,
5953
+ "aria-label": "Upload files",
5954
+ onClick: openPicker,
5955
+ onKeyDown: (e) => e.key === "Enter" && openPicker(),
5956
+ onDragOver,
5957
+ onDragLeave,
5958
+ onDrop,
5959
+ className: cn(
5960
+ "file-upload-zone",
5961
+ variant === "compact" && "file-upload-zone--compact",
5962
+ isDragging && "file-upload-zone--dragging",
5963
+ disabled && "file-upload-zone--disabled"
5964
+ ),
5965
+ children: [
5966
+ /* @__PURE__ */ jsx(
5967
+ "input",
5968
+ {
5969
+ ref: inputRef,
5970
+ type: "file",
5971
+ accept,
5972
+ multiple,
5973
+ disabled,
5974
+ onChange: onInputChange,
5975
+ className: "file-upload-input",
5976
+ tabIndex: -1
5977
+ }
5978
+ ),
5979
+ variant === "compact" ? /* @__PURE__ */ jsxs("div", { className: "file-upload-compact-inner", children: [
5980
+ /* @__PURE__ */ jsx("span", { className: "file-upload-icon", children: "↑" }),
5981
+ /* @__PURE__ */ jsxs("span", { className: "file-upload-zone-text", children: [
5982
+ /* @__PURE__ */ jsx("span", { className: "file-upload-zone-link", children: "Click to upload" }),
5983
+ " ",
5984
+ "or drag and drop"
5985
+ ] }),
5986
+ accept && /* @__PURE__ */ jsx("span", { className: "file-upload-hint", children: accept.split(",").join(", ") }),
5987
+ maxSize && /* @__PURE__ */ jsxs("span", { className: "file-upload-hint", children: [
5988
+ "Max ",
5989
+ formatBytes(maxSize)
5990
+ ] })
5991
+ ] }) : /* @__PURE__ */ jsxs("div", { className: "file-upload-default-inner", children: [
5992
+ /* @__PURE__ */ jsx("div", { className: "file-upload-icon-circle", children: /* @__PURE__ */ jsx("span", { className: "file-upload-icon", children: "↑" }) }),
5993
+ /* @__PURE__ */ jsxs("div", { className: "file-upload-zone-body", children: [
5994
+ /* @__PURE__ */ jsxs("span", { className: "file-upload-zone-text", children: [
5995
+ /* @__PURE__ */ jsx("span", { className: "file-upload-zone-link", children: "Click to upload" }),
5996
+ " ",
5997
+ "or drag and drop"
5998
+ ] }),
5999
+ (accept || maxSize) && /* @__PURE__ */ jsx("span", { className: "file-upload-hint", children: [
6000
+ accept && accept.split(",").join(", "),
6001
+ maxSize && `Max ${formatBytes(maxSize)}`
6002
+ ].filter(Boolean).join(" · ") })
6003
+ ] })
6004
+ ] })
6005
+ ]
6006
+ }
6007
+ ),
6008
+ files.length > 0 && /* @__PURE__ */ jsx("ul", { className: "file-upload-list", children: files.map(({ file, id, error }) => /* @__PURE__ */ jsxs(
6009
+ "li",
6010
+ {
6011
+ className: cn("file-upload-item", error && "file-upload-item--error"),
6012
+ children: [
6013
+ /* @__PURE__ */ jsx("span", { className: "file-upload-item-icon", children: getFileIcon(file.type) }),
6014
+ /* @__PURE__ */ jsxs("div", { className: "file-upload-item-info", children: [
6015
+ /* @__PURE__ */ jsx("span", { className: "file-upload-item-name", children: file.name }),
6016
+ error ? /* @__PURE__ */ jsx("span", { className: "file-upload-item-error", children: error }) : /* @__PURE__ */ jsx("span", { className: "file-upload-item-size", children: formatBytes(file.size) })
6017
+ ] }),
6018
+ /* @__PURE__ */ jsx(
6019
+ "button",
6020
+ {
6021
+ type: "button",
6022
+ "aria-label": `Remove ${file.name}`,
6023
+ onClick: (e) => {
6024
+ e.stopPropagation();
6025
+ removeFile(id);
6026
+ },
6027
+ className: "file-upload-item-remove",
6028
+ children: "✕"
6029
+ }
6030
+ )
6031
+ ]
6032
+ },
6033
+ id
6034
+ )) })
6035
+ ] });
6036
+ }
6037
+ );
6038
+ FileUpload.displayName = "FileUpload";
6039
+ function getStatus(index, currentStep) {
6040
+ if (index < currentStep) return "complete";
6041
+ if (index === currentStep) return "current";
6042
+ return "upcoming";
6043
+ }
6044
+ const CheckIcon = () => /* @__PURE__ */ jsx("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx(
6045
+ "path",
6046
+ {
6047
+ d: "M2.5 7L5.5 10L11.5 4",
6048
+ stroke: "currentColor",
6049
+ strokeWidth: "2",
6050
+ strokeLinecap: "round",
6051
+ strokeLinejoin: "round"
6052
+ }
6053
+ ) });
6054
+ const Stepper = React.forwardRef(
6055
+ ({
6056
+ steps,
6057
+ currentStep,
6058
+ orientation = "horizontal",
6059
+ variant = "default",
6060
+ size = "md",
6061
+ onStepClick,
6062
+ className
6063
+ }, ref) => {
6064
+ return /* @__PURE__ */ jsx(
6065
+ "div",
6066
+ {
6067
+ ref,
6068
+ role: "list",
6069
+ "aria-label": "Progress steps",
6070
+ className: cn(
6071
+ "stepper",
6072
+ `stepper--${orientation}`,
6073
+ `stepper--${size}`,
6074
+ className
6075
+ ),
6076
+ children: steps.map((step, index) => {
6077
+ const status = getStatus(index, currentStep);
6078
+ const isClickable = !!onStepClick && status === "complete";
6079
+ const isLast = index === steps.length - 1;
6080
+ return /* @__PURE__ */ jsxs(
6081
+ "div",
6082
+ {
6083
+ role: "listitem",
6084
+ "aria-current": status === "current" ? "step" : void 0,
6085
+ className: cn(
6086
+ "stepper-item",
6087
+ `stepper-item--${status}`,
6088
+ orientation === "horizontal" && !isLast && "stepper-item--with-connector"
6089
+ ),
6090
+ children: [
6091
+ /* @__PURE__ */ jsxs("div", { className: "stepper-indicator-row", children: [
6092
+ /* @__PURE__ */ jsx(
6093
+ "button",
6094
+ {
6095
+ type: "button",
6096
+ disabled: !isClickable,
6097
+ onClick: () => isClickable && onStepClick(index),
6098
+ className: cn(
6099
+ "stepper-indicator",
6100
+ `stepper-indicator--${status}`,
6101
+ `stepper-indicator--${variant}`,
6102
+ isClickable && "stepper-indicator--clickable"
6103
+ ),
6104
+ "aria-label": `Step ${index + 1}: ${step.title} (${status})`,
6105
+ children: status === "complete" ? /* @__PURE__ */ jsx(CheckIcon, {}) : /* @__PURE__ */ jsx("span", { className: "stepper-indicator-number", children: index + 1 })
6106
+ }
6107
+ ),
6108
+ !isLast && /* @__PURE__ */ jsx(
6109
+ "div",
6110
+ {
6111
+ className: cn(
6112
+ "stepper-connector",
6113
+ `stepper-connector--${orientation}`,
6114
+ index < currentStep && "stepper-connector--complete"
6115
+ ),
6116
+ "aria-hidden": "true"
6117
+ }
6118
+ )
6119
+ ] }),
6120
+ /* @__PURE__ */ jsxs("div", { className: "stepper-label", children: [
6121
+ /* @__PURE__ */ jsx("span", { className: cn("stepper-title", `stepper-title--${status}`), children: step.title }),
6122
+ step.description && /* @__PURE__ */ jsx("span", { className: cn("stepper-description", `stepper-description--${status}`), children: step.description })
6123
+ ] })
6124
+ ]
6125
+ },
6126
+ index
6127
+ );
6128
+ })
6129
+ }
6130
+ );
6131
+ }
6132
+ );
6133
+ Stepper.displayName = "Stepper";
6134
+ const DatePicker = React.forwardRef(
6135
+ ({
6136
+ value,
6137
+ onChange,
6138
+ placeholder = "Select date",
6139
+ disabled = false,
6140
+ disabledDates,
6141
+ fromDate,
6142
+ toDate,
6143
+ dateFormat = "MMM d, yyyy",
6144
+ className,
6145
+ align = "start"
6146
+ }, ref) => {
6147
+ const [open, setOpen] = React.useState(false);
6148
+ const handleSelect = (date) => {
6149
+ onChange == null ? void 0 : onChange(date);
6150
+ setOpen(false);
6151
+ };
6152
+ return /* @__PURE__ */ jsxs(Popover, { open, onOpenChange: setOpen, children: [
6153
+ /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
6154
+ "button",
6155
+ {
6156
+ ref,
6157
+ type: "button",
6158
+ disabled,
6159
+ "aria-haspopup": "dialog",
6160
+ "aria-expanded": open,
6161
+ className: cn(
6162
+ "date-picker-trigger",
6163
+ !value && "date-picker-trigger--placeholder",
6164
+ disabled && "date-picker-trigger--disabled",
6165
+ className
6166
+ ),
6167
+ children: [
6168
+ /* @__PURE__ */ jsx("span", { className: "date-picker-icon", "aria-hidden": "true", children: /* @__PURE__ */ jsxs("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", children: [
6169
+ /* @__PURE__ */ jsx("rect", { x: "1", y: "3", width: "14", height: "12", rx: "2", stroke: "currentColor", strokeWidth: "1.5" }),
6170
+ /* @__PURE__ */ jsx("path", { d: "M1 7h14", stroke: "currentColor", strokeWidth: "1.5" }),
6171
+ /* @__PURE__ */ jsx("path", { d: "M5 1v4M11 1v4", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round" })
6172
+ ] }) }),
6173
+ /* @__PURE__ */ jsx("span", { className: "date-picker-value", children: value ? format(value, dateFormat) : placeholder }),
6174
+ /* @__PURE__ */ jsx("span", { className: "date-picker-chevron", "aria-hidden": "true", children: /* @__PURE__ */ jsx("svg", { width: "12", height: "12", viewBox: "0 0 12 12", fill: "none", children: /* @__PURE__ */ jsx("path", { d: "M2 4l4 4 4-4", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) }) })
6175
+ ]
6176
+ }
6177
+ ) }),
6178
+ /* @__PURE__ */ jsx(
6179
+ PopoverContent,
6180
+ {
6181
+ className: "date-picker-popover",
6182
+ align,
6183
+ sideOffset: 6,
6184
+ children: /* @__PURE__ */ jsx(
6185
+ Calendar,
6186
+ {
6187
+ mode: "single",
6188
+ selected: value,
6189
+ onSelect: handleSelect,
6190
+ disabled: disabledDates,
6191
+ fromDate,
6192
+ toDate,
6193
+ initialFocus: true
6194
+ }
6195
+ )
6196
+ }
6197
+ )
6198
+ ] });
6199
+ }
6200
+ );
6201
+ DatePicker.displayName = "DatePicker";
6202
+ const DateRangePicker = React.forwardRef(
6203
+ ({
6204
+ value,
6205
+ onChange,
6206
+ placeholder = "Select date range",
6207
+ disabled = false,
6208
+ dateFormat = "MMM d, yyyy",
6209
+ className,
6210
+ align = "start"
6211
+ }, ref) => {
6212
+ const [open, setOpen] = React.useState(false);
6213
+ const label = React.useMemo(() => {
6214
+ if (!(value == null ? void 0 : value.from)) return null;
6215
+ if (!value.to) return format(value.from, dateFormat);
6216
+ return `${format(value.from, dateFormat)} — ${format(value.to, dateFormat)}`;
6217
+ }, [value, dateFormat]);
6218
+ return /* @__PURE__ */ jsxs(Popover, { open, onOpenChange: setOpen, children: [
6219
+ /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
6220
+ "button",
6221
+ {
6222
+ ref,
6223
+ type: "button",
6224
+ disabled,
6225
+ "aria-haspopup": "dialog",
6226
+ "aria-expanded": open,
6227
+ className: cn(
6228
+ "date-picker-trigger",
6229
+ !label && "date-picker-trigger--placeholder",
6230
+ disabled && "date-picker-trigger--disabled",
6231
+ className
6232
+ ),
6233
+ children: [
6234
+ /* @__PURE__ */ jsx("span", { className: "date-picker-icon", "aria-hidden": "true", children: /* @__PURE__ */ jsxs("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", children: [
6235
+ /* @__PURE__ */ jsx("rect", { x: "1", y: "3", width: "14", height: "12", rx: "2", stroke: "currentColor", strokeWidth: "1.5" }),
6236
+ /* @__PURE__ */ jsx("path", { d: "M1 7h14", stroke: "currentColor", strokeWidth: "1.5" }),
6237
+ /* @__PURE__ */ jsx("path", { d: "M5 1v4M11 1v4", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round" })
6238
+ ] }) }),
6239
+ /* @__PURE__ */ jsx("span", { className: "date-picker-value", children: label ?? placeholder }),
6240
+ /* @__PURE__ */ jsx("span", { className: "date-picker-chevron", "aria-hidden": "true", children: /* @__PURE__ */ jsx("svg", { width: "12", height: "12", viewBox: "0 0 12 12", fill: "none", children: /* @__PURE__ */ jsx("path", { d: "M2 4l4 4 4-4", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) }) })
6241
+ ]
6242
+ }
6243
+ ) }),
6244
+ /* @__PURE__ */ jsx(
6245
+ PopoverContent,
6246
+ {
6247
+ className: "date-picker-popover",
6248
+ align,
6249
+ sideOffset: 6,
6250
+ children: /* @__PURE__ */ jsx(
6251
+ Calendar,
6252
+ {
6253
+ mode: "range",
6254
+ selected: value,
6255
+ onSelect: onChange,
6256
+ numberOfMonths: 2,
6257
+ initialFocus: true
6258
+ }
6259
+ )
6260
+ }
6261
+ )
6262
+ ] });
6263
+ }
6264
+ );
6265
+ DateRangePicker.displayName = "DateRangePicker";
4917
6266
  const Toaster = ({ ...props }) => {
4918
6267
  const { theme = "system" } = useTheme();
4919
6268
  return /* @__PURE__ */ jsx(
@@ -13510,6 +14859,17 @@ export {
13510
14859
  AlertDialogTrigger,
13511
14860
  AlertTitle,
13512
14861
  AlphaIcon,
14862
+ AppBar,
14863
+ AppBarAppend,
14864
+ AppBarContent,
14865
+ AppBarNavIcon,
14866
+ AppBarPrepend,
14867
+ AppBarTitle,
14868
+ AppShell,
14869
+ AppShellFooter,
14870
+ AppShellHeader,
14871
+ AppShellMain,
14872
+ AppShellSidebar,
13513
14873
  AspectRatio,
13514
14874
  Avatar,
13515
14875
  AvatarFallback,
@@ -13534,6 +14894,15 @@ export {
13534
14894
  BadgeRatingResidential,
13535
14895
  BadgeRatingWorkforce,
13536
14896
  BadgeSurveyProvider,
14897
+ Banner,
14898
+ BannerAction,
14899
+ BannerDescription,
14900
+ BannerIcon,
14901
+ BannerText,
14902
+ BannerTitle,
14903
+ BottomNavigation,
14904
+ BottomNavigationGroup,
14905
+ BottomNavigationItem,
13537
14906
  Breadcrumb,
13538
14907
  BreadcrumbItem,
13539
14908
  BreadcrumbLink,
@@ -13544,10 +14913,14 @@ export {
13544
14913
  CONCEPT_ICONS,
13545
14914
  Calendar,
13546
14915
  Card,
14916
+ CardActions,
14917
+ CardBadge,
13547
14918
  CardContent,
13548
14919
  CardDescription,
13549
14920
  CardFooter,
13550
14921
  CardHeader,
14922
+ CardMedia,
14923
+ CardMetric,
13551
14924
  CardTitle,
13552
14925
  CardWithIcon,
13553
14926
  Carousel,
@@ -13564,6 +14937,7 @@ export {
13564
14937
  Collapsible,
13565
14938
  CollapsibleContent,
13566
14939
  CollapsibleTrigger,
14940
+ Columns,
13567
14941
  Command,
13568
14942
  CommandDialog,
13569
14943
  CommandEmpty,
@@ -13573,6 +14947,7 @@ export {
13573
14947
  CommandList,
13574
14948
  CommandSeparator,
13575
14949
  CommandShortcut,
14950
+ Container,
13576
14951
  ContextMenu,
13577
14952
  ContextMenuCheckboxItem,
13578
14953
  ContextMenuContent,
@@ -13588,6 +14963,8 @@ export {
13588
14963
  ContextMenuSubContent,
13589
14964
  ContextMenuSubTrigger,
13590
14965
  ContextMenuTrigger,
14966
+ DatePicker,
14967
+ DateRangePicker,
13591
14968
  Dialog,
13592
14969
  DialogClose,
13593
14970
  DialogContent,
@@ -13621,6 +14998,17 @@ export {
13621
14998
  DropdownMenuSubContent,
13622
14999
  DropdownMenuSubTrigger,
13623
15000
  DropdownMenuTrigger,
15001
+ EmptyState,
15002
+ EmptyStateAction,
15003
+ FileUpload,
15004
+ Footer,
15005
+ FooterBand,
15006
+ FooterCopyright,
15007
+ FooterDivider,
15008
+ FooterIconButton,
15009
+ FooterLink,
15010
+ FooterLinks,
15011
+ FooterRow,
13624
15012
  Form,
13625
15013
  FormControl,
13626
15014
  FormDescription,
@@ -13628,7 +15016,10 @@ export {
13628
15016
  FormItem,
13629
15017
  FormLabel,
13630
15018
  FormMessage,
15019
+ Grid,
13631
15020
  HeightContainer,
15021
+ HeroSection,
15022
+ Hide,
13632
15023
  HoverCard,
13633
15024
  HoverCardContent,
13634
15025
  HoverCardTrigger,
@@ -13650,6 +15041,8 @@ export {
13650
15041
  InputOTPSeparator,
13651
15042
  InputOTPSlot,
13652
15043
  Label,
15044
+ List,
15045
+ ListItem,
13653
15046
  Menubar,
13654
15047
  MenubarCheckboxItem,
13655
15048
  MenubarContent,
@@ -13703,6 +15096,7 @@ export {
13703
15096
  Popover,
13704
15097
  PopoverContent,
13705
15098
  PopoverTrigger,
15099
+ Positioned,
13706
15100
  Progress,
13707
15101
  RadioGroup,
13708
15102
  RadioGroupItem,
@@ -13737,6 +15131,7 @@ export {
13737
15131
  SealWellResidence,
13738
15132
  SealWorksWithWell,
13739
15133
  SearchField,
15134
+ Section,
13740
15135
  SectionBadge,
13741
15136
  Select,
13742
15137
  SelectContent,
@@ -13757,6 +15152,7 @@ export {
13757
15152
  SheetHeader,
13758
15153
  SheetTitle,
13759
15154
  SheetTrigger,
15155
+ Show,
13760
15156
  Sidebar,
13761
15157
  SidebarContent,
13762
15158
  SidebarFooter,
@@ -13773,9 +15169,16 @@ export {
13773
15169
  Skeleton,
13774
15170
  Slider,
13775
15171
  Toaster as Sonner,
15172
+ Spacer,
15173
+ Stack,
13776
15174
  StandardLogo,
13777
15175
  StandardNavigation,
15176
+ Stepper,
13778
15177
  Switch,
15178
+ SystemBar,
15179
+ SystemBarAction,
15180
+ SystemBarIcon,
15181
+ SystemBarSpacer,
13779
15182
  Table,
13780
15183
  TableBody,
13781
15184
  TableCaption,
@@ -13791,6 +15194,8 @@ export {
13791
15194
  Tag,
13792
15195
  Text,
13793
15196
  Textarea,
15197
+ Timeline,
15198
+ TimelineItem,
13794
15199
  Toast,
13795
15200
  ToastAction,
13796
15201
  ToastClose,
@@ -13838,6 +15243,7 @@ export {
13838
15243
  WatermarkMemberOrg,
13839
15244
  X,
13840
15245
  badgeVariants,
15246
+ bannerVariants,
13841
15247
  buttonVariants,
13842
15248
  capitalize,
13843
15249
  cn,