@tenerife.music/ui 1.0.13 → 1.0.16

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.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  import { Slot } from '@radix-ui/react-slot';
2
- import { cva } from 'class-variance-authority';
3
2
  import * as React49 from 'react';
4
3
  import { useState, useRef, useEffect, useLayoutEffect } from 'react';
4
+ import { cva } from 'class-variance-authority';
5
5
  import { clsx } from 'clsx';
6
6
  import { twMerge } from 'tailwind-merge';
7
7
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
@@ -22,13 +22,18 @@ var primaryColors = {
22
22
  100: "210 40% 96%",
23
23
  200: "217 32.6% 17.5%",
24
24
  300: "216 28% 26%",
25
- 400: "215 25% 27%",
26
- 500: "215 20% 35%",
27
- // Base primary
28
- 600: "215 16% 47%",
29
- 700: "216 12% 54%",
30
- 800: "217 10% 62%",
31
- 900: "222 47.4% 11.2%",
25
+ 400: "215 25% 30%",
26
+ // Adjusted for better progression
27
+ 500: "215 20% 38%",
28
+ // Adjusted for better progression
29
+ 600: "215 16% 45%",
30
+ // Adjusted for better progression
31
+ 700: "216 12% 35%",
32
+ // Rebalanced for semantic strength (L* ~35)
33
+ 800: "217 10% 28%",
34
+ // Adjusted for proper progression
35
+ 900: "222 47.4% 18%",
36
+ // Adjusted for better progression
32
37
  950: "222 84% 4.9%"
33
38
  // Darkest blue
34
39
  };
@@ -38,12 +43,15 @@ var accentColors = {
38
43
  200: "280 60% 85%",
39
44
  300: "280 55% 75%",
40
45
  400: "280 50% 65%",
41
- 500: "280 70% 67%",
42
- // Base accent (night mode primary)
43
- 600: "259 65% 58%",
44
- 700: "259 60% 50%",
45
- 800: "259 55% 45%",
46
- 900: "259 50% 40%",
46
+ 500: "280 65% 72%",
47
+ // Adjusted for WCAG AA contrast (4.5:1) with dark text in night mode
48
+ 600: "259 65% 59%",
49
+ // Default accent - lightened for better contrast vs secondary (L* ~59, was 52, 15 delta from secondary-600)
50
+ 700: "259 60% 44%",
51
+ // Active state - rebalanced for semantic strength (L* ~44, 12 delta from secondary-700)
52
+ 800: "259 55% 38%",
53
+ // Adjusted for proper progression
54
+ 900: "259 50% 32%",
47
55
  950: "259 45% 30%"
48
56
  };
49
57
  var secondaryColors = {
@@ -52,12 +60,15 @@ var secondaryColors = {
52
60
  200: "173 100% 85%",
53
61
  300: "173 100% 70%",
54
62
  400: "173 100% 55%",
55
- 500: "173 100% 37%",
56
- // Base secondary (Tenerife #00bfa6)
57
- 600: "173 100% 32%",
58
- 700: "173 95% 27%",
63
+ 500: "173 100% 45%",
64
+ // Adjusted for better scale progression
65
+ 600: "173 100% 44%",
66
+ // Default secondary - rebalanced for better contrast vs primary (L* ~44, was 38)
67
+ 700: "173 95% 32%",
68
+ // Active state - rebalanced for semantic strength (L* ~32)
59
69
  800: "173 90% 22%",
60
- 900: "173 85% 17%",
70
+ // Primary variant - darkened for dominance (L* ~22, was 26)
71
+ 900: "173 85% 20%",
61
72
  950: "173 80% 12%"
62
73
  };
63
74
  var surfaceColors = {
@@ -150,13 +161,13 @@ var chartColors = {
150
161
  var textColors = {
151
162
  day: {
152
163
  primary: "0 0% 9%",
153
- // Almost black
164
+ // Almost black (neutral-900 equivalent)
154
165
  secondary: "0 0% 45%",
155
166
  // Medium gray
156
167
  tertiary: "0 0% 65%",
157
168
  // Light gray
158
- muted: "0 0% 38%",
159
- // Muted gray with stronger contrast
169
+ muted: "0 0% 42%",
170
+ // Muted gray - adjusted for WCAG AA contrast (4.5:1) on surface.elevated2
160
171
  inverse: "0 0% 100%"
161
172
  // White (for dark backgrounds)
162
173
  },
@@ -468,6 +479,139 @@ var ALERT_TOKENS = {
468
479
  }
469
480
  };
470
481
 
482
+ // src/tokens/components/motion.ts
483
+ var MOTION_TOKENS = {
484
+ /**
485
+ * Transition property tokens
486
+ * Maps to Tailwind transition utilities
487
+ */
488
+ transition: {
489
+ all: "transition-all",
490
+ // All properties
491
+ colors: "transition-colors",
492
+ // Color properties only
493
+ opacity: "transition-opacity",
494
+ // Opacity only
495
+ transform: "transition-transform",
496
+ // Transform only
497
+ shadow: "transition-shadow",
498
+ // Box shadow only
499
+ none: "transition-none"
500
+ // No transition
501
+ },
502
+ /**
503
+ * Duration tokens
504
+ * Maps to foundation motion duration tokens via Tailwind
505
+ */
506
+ duration: {
507
+ instant: "duration-0",
508
+ // 0ms
509
+ fast: "duration-fast",
510
+ // 150ms - maps to motion.durations.fast
511
+ normal: "duration-normal",
512
+ // 300ms - maps to motion.durations.normal
513
+ slow: "duration-slow",
514
+ // 500ms - maps to motion.durations.slow
515
+ slower: "duration-slower",
516
+ // 700ms - maps to motion.durations.slower
517
+ slowest: "duration-slowest",
518
+ // 1000ms - maps to motion.durations.slowest
519
+ // Granular durations
520
+ "75": "duration-75",
521
+ // 75ms
522
+ "100": "duration-100",
523
+ // 100ms
524
+ "200": "duration-200",
525
+ // 200ms
526
+ "250": "duration-250",
527
+ // 250ms
528
+ "300": "duration-300",
529
+ // 300ms
530
+ "400": "duration-400",
531
+ // 400ms
532
+ "500": "duration-500",
533
+ // 500ms
534
+ "600": "duration-600",
535
+ // 600ms
536
+ "700": "duration-700",
537
+ // 700ms
538
+ "800": "duration-800",
539
+ // 800ms
540
+ "1000": "duration-1000"
541
+ // 1000ms
542
+ },
543
+ /**
544
+ * Easing tokens
545
+ * Maps to foundation motion easing tokens via Tailwind
546
+ */
547
+ easing: {
548
+ linear: "ease-linear",
549
+ // Linear easing
550
+ in: "ease-in",
551
+ // Ease in
552
+ out: "ease-out",
553
+ // Ease out (recommended for most UI)
554
+ "in-out": "ease-in-out",
555
+ // Ease in-out
556
+ bounce: "ease-bounce",
557
+ // Bounce easing
558
+ elastic: "ease-elastic"
559
+ // Elastic easing
560
+ },
561
+ /**
562
+ * Pre-configured transition tokens
563
+ * Combines duration and easing for common use cases
564
+ */
565
+ transitionPreset: {
566
+ fast: "transition-all duration-fast ease-out",
567
+ // Fast transition
568
+ normal: "transition-all duration-normal ease-in-out",
569
+ // Normal transition (default)
570
+ slow: "transition-all duration-slow ease-in-out",
571
+ // Slow transition
572
+ colors: "transition-colors duration-normal ease-out",
573
+ // Color transitions (common)
574
+ transform: "transition-transform duration-normal ease-out",
575
+ // Transform transitions
576
+ opacity: "transition-opacity duration-fast ease-out"
577
+ // Opacity transitions
578
+ },
579
+ /**
580
+ * Animation tokens
581
+ * Maps to foundation motion animation tokens via Tailwind
582
+ */
583
+ animation: {
584
+ none: "animate-none",
585
+ // No animation
586
+ spin: "animate-spin",
587
+ // Spin animation
588
+ pulse: "animate-pulse",
589
+ // Pulse animation
590
+ bounce: "animate-bounce",
591
+ // Bounce animation
592
+ ping: "animate-ping",
593
+ // Ping animation
594
+ shake: "animate-shake",
595
+ // Shake animation
596
+ fadeIn: "animate-fadeIn",
597
+ // Fade in
598
+ fadeOut: "animate-fadeOut",
599
+ // Fade out
600
+ slideInUp: "animate-slideInUp",
601
+ // Slide in from bottom
602
+ slideInDown: "animate-slideInDown",
603
+ // Slide in from top
604
+ slideInLeft: "animate-slideInLeft",
605
+ // Slide in from right
606
+ slideInRight: "animate-slideInRight",
607
+ // Slide in from left
608
+ scaleIn: "animate-scaleIn",
609
+ // Scale in
610
+ scaleOut: "animate-scaleOut"
611
+ // Scale out
612
+ }
613
+ };
614
+
471
615
  // src/tokens/components/button.ts
472
616
  var BUTTON_TOKENS = {
473
617
  /**
@@ -500,25 +644,48 @@ var BUTTON_TOKENS = {
500
644
  vertical: {
501
645
  sm: "py-xs",
502
646
  // 4px (0.25rem) - maps to semanticSpacing.xs
503
- md: "py-sm"
647
+ md: "py-sm",
504
648
  // 8px (0.5rem) - maps to semanticSpacing.sm
649
+ lg: "py-md"
650
+ // 16px (1rem) - maps to semanticSpacing.md - standardized for visual distinction
505
651
  }
506
652
  },
507
653
  /**
508
- * Gap between icon and text
654
+ * Gap between icon and text by size
655
+ * Scales with button size for visual consistency
509
656
  */
510
- gap: "gap-sm",
511
- // 8px (0.5rem) - maps to semanticSpacing.sm
657
+ gap: {
658
+ sm: "gap-xs",
659
+ // 4px (0.25rem) - smaller gap for small buttons
660
+ md: "gap-sm",
661
+ // 8px (0.5rem) - medium gap for medium buttons
662
+ lg: "gap-md"
663
+ // 16px (1rem) - larger gap for large buttons
664
+ },
512
665
  /**
513
666
  * Border radius for all button sizes
667
+ * Consistent radius across sizes for visual harmony
668
+ *
669
+ * @enforcement TUNG_TOKEN_AUTHORITY_EXPANSION_PLAN
670
+ * @rule References componentRadius.button.md (6px / 0.375rem) from Radius Authority
671
+ * @see docs/architecture/RADIUS_AUTHORITY_CONTRACT.md
514
672
  */
515
673
  radius: "rounded-md",
516
- // 6px (0.375rem) - maps to borderRadius.md
674
+ // References componentRadius.button.md (6px / 0.375rem) - Radius Authority compliant
517
675
  /**
518
- * Icon size within buttons
676
+ * Icon size within buttons by button size
677
+ * Scales proportionally with button size for visual balance
519
678
  */
520
- iconSize: "size-4",
521
- // 16px (1rem) - maps to spacing[4]
679
+ iconSize: {
680
+ sm: "size-3.5",
681
+ // 14px (0.875rem) - smaller icon for small buttons
682
+ md: "size-4",
683
+ // 16px (1rem) - medium icon for medium buttons
684
+ lg: "size-5",
685
+ // 20px (1.25rem) - larger icon for large buttons
686
+ icon: "size-4"
687
+ // 16px (1rem) - medium icon for icon-only buttons
688
+ },
522
689
  /**
523
690
  * Width tokens
524
691
  */
@@ -528,15 +695,19 @@ var BUTTON_TOKENS = {
528
695
  },
529
696
  /**
530
697
  * Font sizes by button size
531
- * Maps to foundation typography fontSize tokens
698
+ * References foundation typography fontSize tokens from Typography Authority
699
+ *
700
+ * @enforcement TUNG_TOKEN_AUTHORITY_EXPANSION_PLAN
701
+ * @rule All fontSize values reference Typography Authority tokens
702
+ * @see docs/architecture/TYPOGRAPHY_AUTHORITY_CONTRACT.md
532
703
  */
533
704
  fontSize: {
534
705
  sm: "text-xs",
535
- // Maps to fontSize.xs[0]
706
+ // References fontSize.xs[0] from Typography Authority (~12px)
536
707
  md: "text-sm",
537
- // Maps to fontSize.sm[0]
538
- lg: "text-sm"
539
- // Maps to fontSize.sm[0]
708
+ // References fontSize.sm[0] from Typography Authority (~14px)
709
+ lg: "text-base"
710
+ // References fontSize.base[0] from Typography Authority (~16px)
540
711
  },
541
712
  /**
542
713
  * Shadow tokens by variant
@@ -551,50 +722,137 @@ var BUTTON_TOKENS = {
551
722
  /**
552
723
  * Color tokens for button variants
553
724
  * Uses semantic color tokens that map to CSS variables
725
+ *
726
+ * State tokens (hover, active, disabled) use CSS variables from State Matrix.
727
+ * All states are injected via updateStateMatrixFromTokens() and consumed via arbitrary values.
728
+ * States react to Color Authority changes automatically through State Matrix.
729
+ *
730
+ * Interaction Authority Rules:
731
+ * - Hover (Priority 4): hover: prefix - ONLY when !disabled && !loading && pointer-events:auto
732
+ * - Active (Priority 3): active: prefix - ONLY when !disabled && !loading && mousedown
733
+ * - Focus (Priority 5): focus-visible: prefix - ONLY when !disabled && keyboard navigation
734
+ * - Disabled (Priority 1): disabled: prefix - Blocks ALL interactions
735
+ * - Loading (Priority 2): loading: prefix - Blocks hover/active (when implemented)
736
+ * - Base (Priority 6): No prefix - Default state, pointer-events: auto
737
+ *
738
+ * @enforcement TUNG_STATE_AUTHORITY_FOUNDATION_LOCK
739
+ * @enforcement TUNG_INTERACTION_AUTHORITY_FOUNDATION
740
+ * @rule States use CSS variables, not Tailwind variants
741
+ * @rule All state variables follow pattern: --{component}-{variant}-{state}-{property}
742
+ * @rule Visual states (colors) are SEPARATE from interaction states (pointer-events)
743
+ * @rule Hover MUST work with real mouse cursor, NOT just DevTools force state
744
+ * @rule Active MUST activate only on mousedown, NOT on hover
745
+ * @rule Focus MUST activate only on keyboard navigation, NOT on mouse click
746
+ *
747
+ * @see docs/architecture/INTERACTION_AUTHORITY_CONTRACT.md
554
748
  */
555
749
  variant: {
556
750
  primary: {
557
- background: "bg-primary",
558
- // Primary background using CSS var
751
+ background: "bg-[hsl(var(--button-primary-base-bg))]",
752
+ // Primary base background - CSS variable from State Matrix
559
753
  text: "text-primary-foreground",
560
754
  // Primary text using CSS var
561
- hover: "hover:bg-primary/90"
562
- // Primary hover using CSS var
755
+ hover: "hover:bg-[hsl(var(--button-primary-hover-bg))]",
756
+ // Primary hover - CSS variable from State Matrix (Priority 4: blocked by disabled/loading)
757
+ active: "active:bg-[hsl(var(--button-primary-active-bg))]",
758
+ // Primary active - CSS variable from State Matrix (Priority 3: blocked by disabled/loading, priority over hover)
759
+ focus: "focus-visible:bg-[hsl(var(--button-primary-focus-bg))]",
760
+ // Primary focus - CSS variable from State Matrix (Priority 5: keyboard navigation only)
761
+ disabled: {
762
+ background: "disabled:bg-[hsl(var(--button-primary-disabled-bg))]",
763
+ // Disabled background - CSS variable from State Matrix (Priority 1: blocks all)
764
+ text: "disabled:text-[hsl(var(--button-primary-disabled-text))]"
765
+ // Disabled text - CSS variable from State Matrix
766
+ },
767
+ loading: "bg-[hsl(var(--button-primary-loading-bg))]"
768
+ // Primary loading - CSS variable from State Matrix (Priority 2: blocks hover/active, used with aria-busy/data-loading when implemented)
563
769
  },
564
770
  secondary: {
565
771
  background: "bg-secondary",
566
772
  // Secondary background using CSS var
567
773
  text: "text-secondary-foreground",
568
774
  // Secondary text using CSS var
569
- hover: "hover:bg-secondary/80"
570
- // Secondary hover using CSS var
775
+ hover: "hover:bg-[hsl(var(--button-secondary-hover-bg))]",
776
+ // Secondary hover - CSS variable from State Matrix
777
+ active: "active:bg-[hsl(var(--button-secondary-active-bg))]",
778
+ // Secondary active - CSS variable from State Matrix
779
+ disabled: {
780
+ background: "disabled:bg-[hsl(var(--button-secondary-disabled-bg))]",
781
+ // Disabled background - CSS variable from State Matrix
782
+ text: "disabled:text-[hsl(var(--button-secondary-disabled-text))]"
783
+ // Disabled text - CSS variable from State Matrix
784
+ }
571
785
  },
572
786
  accent: {
573
787
  background: "bg-accent",
574
788
  // Accent background using CSS var
575
789
  text: "text-accent-foreground",
576
790
  // Accent text using CSS var
577
- hover: "hover:bg-accent/90"
578
- // Accent hover using CSS var
791
+ hover: "hover:bg-[hsl(var(--button-accent-hover-bg))]",
792
+ // Accent hover - CSS variable from State Matrix
793
+ active: "active:bg-[hsl(var(--button-accent-active-bg))]",
794
+ // Accent active - CSS variable from State Matrix
795
+ disabled: {
796
+ background: "disabled:bg-[hsl(var(--button-accent-disabled-bg))]",
797
+ // Disabled background - CSS variable from State Matrix
798
+ text: "disabled:text-[hsl(var(--button-accent-disabled-text))]"
799
+ // Disabled text - CSS variable from State Matrix
800
+ }
579
801
  },
580
802
  outline: {
581
803
  border: "border border-input",
582
804
  // Input border using CSS var
583
805
  background: "bg-background",
584
806
  // Background using CSS var
807
+ text: "text-foreground",
808
+ // Foreground text using CSS var
585
809
  hover: {
586
- background: "hover:bg-accent",
587
- // Accent hover using CSS var
588
- text: "hover:text-accent-foreground"
589
- // Accent text using CSS var
810
+ background: "hover:bg-[hsl(var(--button-outline-hover-bg))]",
811
+ // Outline hover background - CSS variable from State Matrix
812
+ text: "hover:text-[hsl(var(--button-outline-hover-text))]",
813
+ // Outline hover text - CSS variable from State Matrix
814
+ border: "hover:border-[hsl(var(--button-outline-hover-border))]"
815
+ // Outline hover border - CSS variable from State Matrix
816
+ },
817
+ active: {
818
+ background: "active:bg-[hsl(var(--button-outline-active-bg))]",
819
+ // Outline active background - CSS variable from State Matrix
820
+ text: "active:text-[hsl(var(--button-outline-active-text))]",
821
+ // Outline active text - CSS variable from State Matrix
822
+ border: "active:border-[hsl(var(--button-outline-active-border))]"
823
+ // Outline active border - CSS variable from State Matrix
824
+ },
825
+ disabled: {
826
+ background: "disabled:bg-[hsl(var(--button-outline-disabled-bg))]",
827
+ // Disabled background - CSS variable from State Matrix
828
+ text: "disabled:text-[hsl(var(--button-outline-disabled-text))]",
829
+ // Disabled text - CSS variable from State Matrix
830
+ border: "disabled:border-[hsl(var(--button-outline-disabled-border))]"
831
+ // Disabled border - CSS variable from State Matrix
590
832
  }
591
833
  },
592
834
  ghost: {
835
+ background: "bg-transparent",
836
+ // Transparent background
837
+ text: "text-foreground",
838
+ // Foreground text using CSS var
593
839
  hover: {
594
- background: "hover:bg-accent",
595
- // Accent hover using CSS var
596
- text: "hover:text-accent-foreground"
597
- // Accent text using CSS var
840
+ background: "hover:bg-[hsl(var(--button-ghost-hover-bg))]",
841
+ // Ghost hover background - CSS variable from State Matrix
842
+ text: "hover:text-[hsl(var(--button-ghost-hover-text))]"
843
+ // Ghost hover text - CSS variable from State Matrix
844
+ },
845
+ active: {
846
+ background: "active:bg-[hsl(var(--button-ghost-active-bg))]",
847
+ // Ghost active background - CSS variable from State Matrix
848
+ text: "active:text-[hsl(var(--button-ghost-active-text))]"
849
+ // Ghost active text - CSS variable from State Matrix
850
+ },
851
+ disabled: {
852
+ background: "disabled:bg-[hsl(var(--button-ghost-disabled-bg))]",
853
+ // Disabled background - CSS variable from State Matrix
854
+ text: "disabled:text-[hsl(var(--button-ghost-disabled-text))]"
855
+ // Disabled text - CSS variable from State Matrix
598
856
  }
599
857
  },
600
858
  destructive: {
@@ -602,16 +860,94 @@ var BUTTON_TOKENS = {
602
860
  // Destructive background using CSS var
603
861
  text: "text-destructive-foreground",
604
862
  // Destructive text using CSS var
605
- hover: "hover:bg-destructive/90"
606
- // Destructive hover using CSS var
863
+ hover: "hover:bg-[hsl(var(--button-destructive-hover-bg))]",
864
+ // Destructive hover - CSS variable from State Matrix
865
+ active: "active:bg-[hsl(var(--button-destructive-active-bg))]",
866
+ // Destructive active - CSS variable from State Matrix
867
+ disabled: {
868
+ background: "disabled:bg-[hsl(var(--button-destructive-disabled-bg))]",
869
+ // Disabled background - CSS variable from State Matrix
870
+ text: "disabled:text-[hsl(var(--button-destructive-disabled-text))]"
871
+ // Disabled text - CSS variable from State Matrix
872
+ }
607
873
  }
608
874
  },
609
875
  /**
610
876
  * Transition tokens
877
+ * References Motion Authority tokens for consistent motion behavior
878
+ *
879
+ * @enforcement TUNG_TOKEN_AUTHORITY_EXPANSION_PLAN
880
+ * @rule Uses MOTION_TOKENS.transitionPreset.colors from Motion Authority
881
+ * @rule Motion transitions MUST use canonical motion tokens only
882
+ * @see docs/architecture/MOTION_AUTHORITY_CONTRACT.md
611
883
  */
612
884
  transition: {
613
- colors: "transition-colors"
614
- // Color transition using motion tokens
885
+ colors: MOTION_TOKENS.transitionPreset.colors
886
+ // "transition-colors duration-normal ease-out" - Motion Authority compliant
887
+ },
888
+ /**
889
+ * Global state tokens
890
+ * Shared state tokens that apply across all variants
891
+ * Variant-specific states are defined in variant.*.active and variant.*.disabled
892
+ *
893
+ * @enforcement TUNG_INTERACTION_AUTHORITY_FOUNDATION
894
+ * @rule All interaction states MUST follow Interaction Authority Contract
895
+ * @rule State priority: disabled > loading > active > hover > focus-visible > base
896
+ * @rule Visual states (colors) are SEPARATE from interaction states (pointer-events, cursor)
897
+ * @rule All states MUST be browser-native (CSS pseudo-classes), NOT JavaScript-managed
898
+ */
899
+ state: {
900
+ /**
901
+ * Disabled state tokens
902
+ * Global disabled state tokens (variant-specific overrides in variant.*.disabled)
903
+ *
904
+ * Interaction Authority Rules:
905
+ * - Priority: 1 (Highest) - Blocks ALL interactions
906
+ * - MUST block hover, active, and focus states
907
+ * - MUST use disabled: prefix (never in base state)
908
+ * - Base state MUST have pointer-events: auto (default) for hover to work
909
+ *
910
+ * @enforcement TUNG_INTERACTION_AUTHORITY_FOUNDATION
911
+ * @enforcement TUNG_BUTTON_INTERACTION_FIX
912
+ * @rule Interaction Authority: pointer-events is NOT a visual token
913
+ * @rule pointer-events-none MUST use disabled: prefix (never in base state)
914
+ * @rule Base state MUST have pointer-events: auto (default) for hover to work
915
+ * @rule These tokens are applied in base but only activate when element is disabled
916
+ * @rule Hover is FORBIDDEN when disabled={true}
917
+ * @rule Active is FORBIDDEN when disabled={true}
918
+ * @rule Focus is FORBIDDEN when disabled={true} (for interactions)
919
+ *
920
+ * @see docs/architecture/INTERACTION_AUTHORITY_CONTRACT.md
921
+ */
922
+ disabled: {
923
+ cursor: "disabled:cursor-not-allowed",
924
+ // Disabled cursor style (only applies when disabled)
925
+ pointerEvents: "disabled:pointer-events-none"
926
+ // Disable pointer events (only applies when disabled)
927
+ },
928
+ /**
929
+ * Focus state tokens
930
+ * Focus ring for keyboard navigation
931
+ *
932
+ * Interaction Authority Rules:
933
+ * - Priority: 5 - Lower than active and hover
934
+ * - MUST activate only on keyboard navigation (focus-visible: prefix)
935
+ * - MUST NOT activate on mouse click (use :focus-visible, not :focus)
936
+ * - MUST be blocked by disabled state
937
+ *
938
+ * @enforcement TUNG_INTERACTION_AUTHORITY_FOUNDATION
939
+ * @rule Focus MUST use focus-visible: prefix (keyboard navigation only)
940
+ * @rule Focus MUST be blocked when disabled={true}
941
+ * @rule Focus MUST NOT activate on mouse click
942
+ *
943
+ * @see docs/architecture/INTERACTION_AUTHORITY_CONTRACT.md
944
+ */
945
+ focus: {
946
+ ring: "focus-visible:ring-1 focus-visible:ring-ring",
947
+ // Focus ring using semantic ring color
948
+ outline: "focus-visible:outline-none"
949
+ // Remove default outline (replaced by ring)
950
+ }
615
951
  }
616
952
  };
617
953
 
@@ -699,6 +1035,68 @@ var CARD_TOKENS = {
699
1035
  }
700
1036
  };
701
1037
 
1038
+ // src/tokens/components/artist.ts
1039
+ var ARTIST_TOKENS = {
1040
+ /**
1041
+ * Image container tokens
1042
+ * Layout classes for image container wrapper
1043
+ */
1044
+ image: {
1045
+ /**
1046
+ * Container layout tokens
1047
+ * Positioning and sizing for image container
1048
+ */
1049
+ container: {
1050
+ /**
1051
+ * Base container layout
1052
+ * Relative positioning, full width, overflow hidden
1053
+ * Uses Tailwind layout utilities (allowed per architecture)
1054
+ */
1055
+ layout: "relative w-full overflow-hidden"
1056
+ },
1057
+ /**
1058
+ * Image sizing tokens
1059
+ * Full width and height for images
1060
+ */
1061
+ sizing: {
1062
+ /**
1063
+ * Full size image
1064
+ * Uses Tailwind sizing utilities (allowed per architecture)
1065
+ */
1066
+ full: "h-full w-full"
1067
+ },
1068
+ /**
1069
+ * Placeholder container tokens
1070
+ * Layout for placeholder icon container when no image is provided
1071
+ */
1072
+ placeholder: {
1073
+ /**
1074
+ * Placeholder container layout
1075
+ * Flex centering for placeholder icon
1076
+ * Uses Tailwind layout utilities (allowed per architecture)
1077
+ */
1078
+ container: "flex h-full w-full items-center justify-center"
1079
+ }
1080
+ },
1081
+ /**
1082
+ * Footer border tokens
1083
+ * Border styling for card footer separator
1084
+ */
1085
+ footer: {
1086
+ /**
1087
+ * Footer border tokens
1088
+ * Top border separator for footer section
1089
+ */
1090
+ border: {
1091
+ /**
1092
+ * Footer border top
1093
+ * Uses semantic border color token
1094
+ */
1095
+ top: "border-t border-border"
1096
+ }
1097
+ }
1098
+ };
1099
+
702
1100
  // src/tokens/spacing.ts
703
1101
  var spacing = {
704
1102
  // Zero spacing
@@ -962,139 +1360,44 @@ var tailwindSpacingConfig = {
962
1360
  // src/tokens/components/data.ts
963
1361
  var DATA_TOKENS = {
964
1362
  /**
965
- * Table Component Tokens
1363
+ * Skeleton Component Tokens
966
1364
  */
967
- table: {
1365
+ skeleton: {
968
1366
  /**
969
- * Table row heights by size
1367
+ * Skeleton heights by variant
970
1368
  * Maps to Tailwind height utilities
971
1369
  */
972
- rowHeight: {
973
- sm: "h-8",
974
- // 32px (2rem) - compact rows
975
- md: "h-10",
976
- // 40px (2.5rem) - default rows
977
- lg: "h-12"
978
- // 48px (3rem) - spacious rows
979
- },
980
- /**
981
- * Table cell and header padding by size
982
- * Maps to semantic spacing tokens
983
- */
984
- padding: {
985
- cell: {
986
- sm: "p-xs",
987
- // 4px (0.25rem) - maps to semanticSpacing.xs
988
- md: "p-sm",
989
- // 8px (0.5rem) - maps to semanticSpacing.sm
990
- lg: "p-md"
991
- // 16px (1rem) - maps to semanticSpacing.md
992
- },
993
- header: {
994
- sm: "px-xs py-sm",
995
- // 4px horizontal, 8px vertical
996
- md: "px-sm py-md",
997
- // 8px horizontal, 16px vertical
998
- lg: "px-md py-lg"
999
- // 16px horizontal, 24px vertical
1000
- }
1001
- },
1002
- /**
1003
- * Gap between table cells (horizontal spacing)
1004
- */
1005
- gap: {
1006
- sm: "gap-xs",
1007
- // 4px (0.25rem) - maps to semanticSpacing.xs
1008
- md: "gap-sm"
1009
- // 8px (0.5rem) - maps to semanticSpacing.sm
1370
+ height: {
1371
+ text: "h-4",
1372
+ // 16px (1rem) - text line height
1373
+ circle: "h-10 w-10",
1374
+ // 40px × 40px (2.5rem) - circular skeleton
1375
+ block: "h-20",
1376
+ // 80px (5rem) - block skeleton
1377
+ card: "h-32",
1378
+ // 128px (8rem) - card skeleton
1379
+ inline: "h-4"
1380
+ // 16px (1rem) - inline text
1010
1381
  },
1011
1382
  /**
1012
- * Border radius for table
1383
+ * Border radius by variant
1384
+ * Maps to foundation borderRadius tokens
1013
1385
  */
1014
1386
  radius: {
1015
- default: "rounded-md"
1387
+ text: "rounded-sm",
1388
+ // 4px (0.25rem) - maps to borderRadius.sm
1389
+ circle: "rounded-full",
1390
+ // Full circle - maps to borderRadius.full
1391
+ block: "rounded-md",
1016
1392
  // 6px (0.375rem) - maps to borderRadius.md
1393
+ card: "rounded-xl",
1394
+ // 12px (0.75rem) - maps to borderRadius.xl
1395
+ inline: "rounded-sm"
1396
+ // 4px (0.25rem) - maps to borderRadius.sm
1017
1397
  },
1018
1398
  /**
1019
- * Shadow tokens for table
1020
- * Maps to foundation elevation shadow tokens
1021
- */
1022
- shadow: {
1023
- none: "shadow-none",
1024
- // No shadow
1025
- subtle: "shadow-sm"
1026
- // Maps to elevationShadows.sm
1027
- },
1028
- /**
1029
- * Typography tokens for table headers and cells
1030
- * Maps to foundation typography fontSize tokens
1031
- */
1032
- typography: {
1033
- header: {
1034
- fontSize: "text-sm",
1035
- // Maps to fontSize.sm[0]
1036
- fontWeight: "font-semibold"
1037
- // Maps to fontWeight.semibold
1038
- },
1039
- cell: {
1040
- fontSize: "text-sm",
1041
- // Maps to fontSize.sm[0]
1042
- fontWeight: "font-normal"
1043
- // Maps to fontWeight.normal
1044
- }
1045
- },
1046
- /**
1047
- * Color tokens for table states
1048
- * Uses semantic color tokens
1049
- */
1050
- colors: {
1051
- border: "border-border",
1052
- // Border color
1053
- rowHover: "hover:bg-muted/50",
1054
- // Row hover background
1055
- rowSelected: "bg-muted"
1056
- // Selected row background
1057
- }
1058
- },
1059
- /**
1060
- * Skeleton Component Tokens
1061
- */
1062
- skeleton: {
1063
- /**
1064
- * Skeleton heights by variant
1065
- * Maps to Tailwind height utilities
1066
- */
1067
- height: {
1068
- text: "h-4",
1069
- // 16px (1rem) - text line height
1070
- circle: "h-10 w-10",
1071
- // 40px × 40px (2.5rem) - circular skeleton
1072
- block: "h-20",
1073
- // 80px (5rem) - block skeleton
1074
- card: "h-32",
1075
- // 128px (8rem) - card skeleton
1076
- inline: "h-4"
1077
- // 16px (1rem) - inline text
1078
- },
1079
- /**
1080
- * Border radius by variant
1081
- * Maps to foundation borderRadius tokens
1082
- */
1083
- radius: {
1084
- text: "rounded-sm",
1085
- // 4px (0.25rem) - maps to borderRadius.sm
1086
- circle: "rounded-full",
1087
- // Full circle - maps to borderRadius.full
1088
- block: "rounded-md",
1089
- // 6px (0.375rem) - maps to borderRadius.md
1090
- card: "rounded-xl",
1091
- // 12px (0.75rem) - maps to borderRadius.xl
1092
- inline: "rounded-sm"
1093
- // 4px (0.25rem) - maps to borderRadius.sm
1094
- },
1095
- /**
1096
- * Animation tokens
1097
- * Uses motion tokens for animations
1399
+ * Animation tokens
1400
+ * Uses motion tokens for animations
1098
1401
  */
1099
1402
  animation: {
1100
1403
  pulse: "animate-pulse",
@@ -1121,97 +1424,6 @@ var DATA_TOKENS = {
1121
1424
  inline: "inline-block"
1122
1425
  // Inline block display
1123
1426
  }
1124
- },
1125
- /**
1126
- * EmptyState Component Tokens
1127
- */
1128
- emptyState: {
1129
- /**
1130
- * Spacing tokens for EmptyState
1131
- * Maps to semantic spacing tokens
1132
- */
1133
- spacing: {
1134
- gap: "gap-md",
1135
- // 16px (1rem) - gap between elements - maps to semanticSpacing.md
1136
- padding: "p-lg"
1137
- // 24px (1.5rem) - container padding - maps to semanticSpacing.lg
1138
- },
1139
- /**
1140
- * Border radius for EmptyState container
1141
- */
1142
- radius: {
1143
- default: "rounded-xl"
1144
- // 12px (0.75rem) - maps to borderRadius.xl
1145
- },
1146
- /**
1147
- * Icon sizes by variant
1148
- * Maps to Tailwind size utilities
1149
- */
1150
- iconSize: {
1151
- sm: "size-8",
1152
- // 32px (2rem)
1153
- md: "size-12",
1154
- // 48px (3rem)
1155
- lg: "size-16"
1156
- // 64px (4rem)
1157
- },
1158
- /**
1159
- * Typography tokens for EmptyState
1160
- * Maps to foundation typography tokens
1161
- */
1162
- typography: {
1163
- title: {
1164
- fontSize: "text-lg",
1165
- // Maps to fontSize.lg[0]
1166
- fontWeight: "font-semibold"
1167
- // Maps to fontWeight.semibold
1168
- },
1169
- description: {
1170
- fontSize: "text-sm",
1171
- // Maps to fontSize.sm[0]
1172
- fontWeight: "font-normal"
1173
- // Maps to fontWeight.normal
1174
- }
1175
- }
1176
- },
1177
- /**
1178
- * DataList Component Tokens
1179
- */
1180
- dataList: {
1181
- /**
1182
- * Spacing tokens for DataList
1183
- * Maps to semantic spacing tokens
1184
- */
1185
- spacing: {
1186
- gap: "gap-md",
1187
- // 16px (1rem) - gap between items - maps to semanticSpacing.md
1188
- padding: "p-md"
1189
- // 16px (1rem) - container padding - maps to semanticSpacing.md
1190
- },
1191
- /**
1192
- * Label width tokens (for desktop horizontal layout)
1193
- * Maps to Tailwind width utilities
1194
- */
1195
- labelWidth: {
1196
- sm: "w-24",
1197
- // 96px (6rem) - small label width
1198
- md: "w-32",
1199
- // 128px (8rem) - default label width
1200
- lg: "w-40"
1201
- // 160px (10rem) - large label width
1202
- },
1203
- /**
1204
- * Row padding tokens
1205
- * Maps to semantic spacing tokens
1206
- */
1207
- rowPadding: {
1208
- sm: "py-xs",
1209
- // 4px (0.25rem) - maps to semanticSpacing.xs
1210
- md: "py-sm",
1211
- // 8px (0.5rem) - maps to semanticSpacing.sm
1212
- lg: "py-md"
1213
- // 16px (1rem) - maps to semanticSpacing.md
1214
- }
1215
1427
  }
1216
1428
  };
1217
1429
 
@@ -1271,139 +1483,6 @@ var ICON_TOKENS = {
1271
1483
  }
1272
1484
  };
1273
1485
 
1274
- // src/tokens/components/motion.ts
1275
- var MOTION_TOKENS = {
1276
- /**
1277
- * Transition property tokens
1278
- * Maps to Tailwind transition utilities
1279
- */
1280
- transition: {
1281
- all: "transition-all",
1282
- // All properties
1283
- colors: "transition-colors",
1284
- // Color properties only
1285
- opacity: "transition-opacity",
1286
- // Opacity only
1287
- transform: "transition-transform",
1288
- // Transform only
1289
- shadow: "transition-shadow",
1290
- // Box shadow only
1291
- none: "transition-none"
1292
- // No transition
1293
- },
1294
- /**
1295
- * Duration tokens
1296
- * Maps to foundation motion duration tokens via Tailwind
1297
- */
1298
- duration: {
1299
- instant: "duration-0",
1300
- // 0ms
1301
- fast: "duration-fast",
1302
- // 150ms - maps to motion.durations.fast
1303
- normal: "duration-normal",
1304
- // 300ms - maps to motion.durations.normal
1305
- slow: "duration-slow",
1306
- // 500ms - maps to motion.durations.slow
1307
- slower: "duration-slower",
1308
- // 700ms - maps to motion.durations.slower
1309
- slowest: "duration-slowest",
1310
- // 1000ms - maps to motion.durations.slowest
1311
- // Granular durations
1312
- "75": "duration-75",
1313
- // 75ms
1314
- "100": "duration-100",
1315
- // 100ms
1316
- "200": "duration-200",
1317
- // 200ms
1318
- "250": "duration-250",
1319
- // 250ms
1320
- "300": "duration-300",
1321
- // 300ms
1322
- "400": "duration-400",
1323
- // 400ms
1324
- "500": "duration-500",
1325
- // 500ms
1326
- "600": "duration-600",
1327
- // 600ms
1328
- "700": "duration-700",
1329
- // 700ms
1330
- "800": "duration-800",
1331
- // 800ms
1332
- "1000": "duration-1000"
1333
- // 1000ms
1334
- },
1335
- /**
1336
- * Easing tokens
1337
- * Maps to foundation motion easing tokens via Tailwind
1338
- */
1339
- easing: {
1340
- linear: "ease-linear",
1341
- // Linear easing
1342
- in: "ease-in",
1343
- // Ease in
1344
- out: "ease-out",
1345
- // Ease out (recommended for most UI)
1346
- "in-out": "ease-in-out",
1347
- // Ease in-out
1348
- bounce: "ease-bounce",
1349
- // Bounce easing
1350
- elastic: "ease-elastic"
1351
- // Elastic easing
1352
- },
1353
- /**
1354
- * Pre-configured transition tokens
1355
- * Combines duration and easing for common use cases
1356
- */
1357
- transitionPreset: {
1358
- fast: "transition-all duration-fast ease-out",
1359
- // Fast transition
1360
- normal: "transition-all duration-normal ease-in-out",
1361
- // Normal transition (default)
1362
- slow: "transition-all duration-slow ease-in-out",
1363
- // Slow transition
1364
- colors: "transition-colors duration-normal ease-out",
1365
- // Color transitions (common)
1366
- transform: "transition-transform duration-normal ease-out",
1367
- // Transform transitions
1368
- opacity: "transition-opacity duration-fast ease-out"
1369
- // Opacity transitions
1370
- },
1371
- /**
1372
- * Animation tokens
1373
- * Maps to foundation motion animation tokens via Tailwind
1374
- */
1375
- animation: {
1376
- none: "animate-none",
1377
- // No animation
1378
- spin: "animate-spin",
1379
- // Spin animation
1380
- pulse: "animate-pulse",
1381
- // Pulse animation
1382
- bounce: "animate-bounce",
1383
- // Bounce animation
1384
- ping: "animate-ping",
1385
- // Ping animation
1386
- shake: "animate-shake",
1387
- // Shake animation
1388
- fadeIn: "animate-fadeIn",
1389
- // Fade in
1390
- fadeOut: "animate-fadeOut",
1391
- // Fade out
1392
- slideInUp: "animate-slideInUp",
1393
- // Slide in from bottom
1394
- slideInDown: "animate-slideInDown",
1395
- // Slide in from top
1396
- slideInLeft: "animate-slideInLeft",
1397
- // Slide in from right
1398
- slideInRight: "animate-slideInRight",
1399
- // Slide in from left
1400
- scaleIn: "animate-scaleIn",
1401
- // Scale in
1402
- scaleOut: "animate-scaleOut"
1403
- // Scale out
1404
- }
1405
- };
1406
-
1407
1486
  // src/tokens/components/domain.ts
1408
1487
  var DOMAIN_TOKENS = {
1409
1488
  /**
@@ -1556,7 +1635,7 @@ var DOMAIN_TOKENS = {
1556
1635
  },
1557
1636
  /**
1558
1637
  * Image tokens for card media
1559
- * Defines aspect ratio, radius, and overlay styles
1638
+ * Defines aspect ratio, radius, overlay styles, and placeholder gradients
1560
1639
  */
1561
1640
  image: {
1562
1641
  /**
@@ -1579,6 +1658,40 @@ var DOMAIN_TOKENS = {
1579
1658
  overlay: {
1580
1659
  gradient: "bg-gradient-to-t from-black/60 via-transparent to-transparent"
1581
1660
  // Gradient overlay for image hover states
1661
+ },
1662
+ /**
1663
+ * Placeholder gradient tokens for image placeholders
1664
+ * Used when no image URL is provided
1665
+ */
1666
+ placeholder: {
1667
+ gradient: "bg-gradient-to-br from-muted to-muted/50"
1668
+ // Placeholder gradient background
1669
+ }
1670
+ },
1671
+ /**
1672
+ * Text tokens for card text elements
1673
+ * Defines hover states and line clamping for titles and descriptions
1674
+ */
1675
+ text: {
1676
+ /**
1677
+ * Hover state tokens for text elements
1678
+ * Used for interactive text elements like titles
1679
+ */
1680
+ hover: {
1681
+ primary: "group-hover:text-primary"
1682
+ // Hover state for primary text color
1683
+ },
1684
+ /**
1685
+ * Line clamp tokens for text truncation
1686
+ * Used for limiting text to specific number of lines
1687
+ */
1688
+ lineClamp: {
1689
+ one: "line-clamp-1",
1690
+ // Single line clamp
1691
+ two: "line-clamp-2",
1692
+ // Two line clamp
1693
+ three: "line-clamp-3"
1694
+ // Three line clamp
1582
1695
  }
1583
1696
  },
1584
1697
  /**
@@ -1801,7 +1914,95 @@ var DOMAIN_TOKENS = {
1801
1914
  height: "h-6"
1802
1915
  // References spacing[6] (1.5rem / 24px) via Tailwind
1803
1916
  }
1804
- }
1917
+ },
1918
+ /**
1919
+ * CTA (Call-to-Action) button tokens for domain card components
1920
+ * Provides PromoCard-specific CTA button styling tokens
1921
+ * These tokens are semantically owned by domain card components, not by the Button component
1922
+ * References foundation tokens (spacing, typography, radius, shadows, motion) for consistency
1923
+ */
1924
+ cta: {
1925
+ /**
1926
+ * CTA button styling tokens
1927
+ * Used by PromoCard and other domain card components for CTA button elements
1928
+ */
1929
+ button: {
1930
+ /**
1931
+ * Button heights by size
1932
+ * Maps to Tailwind height utilities: h-8, h-9
1933
+ */
1934
+ height: {
1935
+ sm: "h-8",
1936
+ // 32px (2rem) - compact size
1937
+ md: "h-9"
1938
+ // 36px (2.25rem) - default size
1939
+ },
1940
+ /**
1941
+ * Button padding by size
1942
+ * Horizontal and vertical padding values
1943
+ * References semanticSpacing tokens
1944
+ */
1945
+ padding: {
1946
+ horizontal: {
1947
+ sm: "px-sm",
1948
+ // 8px (0.5rem) - maps to semanticSpacing.sm
1949
+ md: "px-md"
1950
+ // 16px (1rem) - maps to semanticSpacing.md
1951
+ },
1952
+ vertical: {
1953
+ sm: "py-xs"
1954
+ // 4px (0.25rem) - maps to semanticSpacing.xs
1955
+ }
1956
+ },
1957
+ /**
1958
+ * Border radius for CTA buttons
1959
+ * References borderRadius.md (6px / 0.375rem)
1960
+ * Using Tailwind class "rounded-md" which maps to borderRadius.md
1961
+ */
1962
+ radius: "rounded-md",
1963
+ // References borderRadius.md via Tailwind
1964
+ /**
1965
+ * Font sizes by button size
1966
+ * Maps to foundation typography fontSize tokens
1967
+ */
1968
+ fontSize: {
1969
+ sm: "text-xs",
1970
+ // Maps to fontSize.xs[0]
1971
+ md: "text-sm"
1972
+ // Maps to fontSize.sm[0]
1973
+ },
1974
+ /**
1975
+ * Shadow tokens for CTA buttons
1976
+ * Maps to foundation elevation shadow tokens
1977
+ */
1978
+ shadow: {
1979
+ primary: "shadow"
1980
+ // Maps to elevationShadows.xs (primary variant uses shadow)
1981
+ },
1982
+ /**
1983
+ * Color tokens for CTA button variants
1984
+ * Uses semantic color tokens that map to CSS variables
1985
+ */
1986
+ variant: {
1987
+ primary: {
1988
+ background: "bg-primary",
1989
+ // Primary background using CSS var
1990
+ text: "text-primary-foreground",
1991
+ // Primary text using CSS var
1992
+ hover: "hover:bg-primary/90"
1993
+ // Primary hover using CSS var
1994
+ }
1995
+ },
1996
+ /**
1997
+ * Transition tokens for CTA buttons
1998
+ * References MOTION_TOKENS for transitions
1999
+ */
2000
+ transition: {
2001
+ colors: "transition-colors"
2002
+ // Color transition using motion tokens
2003
+ }
2004
+ }
2005
+ }
1805
2006
  };
1806
2007
 
1807
2008
  // src/tokens/components/input.ts
@@ -1904,40 +2105,6 @@ var INPUT_TOKENS = {
1904
2105
  text: "text-[hsl(var(--foreground))]"
1905
2106
  // File input text color using CSS var
1906
2107
  },
1907
- /**
1908
- * Select listbox tokens
1909
- * Styling for select dropdown container
1910
- */
1911
- selectListbox: {
1912
- border: "border border-[hsl(var(--border))]",
1913
- // Border color using CSS var
1914
- background: "bg-[hsl(var(--popover))]",
1915
- // Background using CSS var
1916
- text: "text-[hsl(var(--popover-foreground))]",
1917
- // Text color using CSS var
1918
- radius: "rounded-md",
1919
- // Radius token (6px)
1920
- shadow: "shadow-md"
1921
- // Shadow token
1922
- },
1923
- /**
1924
- * Select option tokens
1925
- * Styling for select option items
1926
- */
1927
- selectOption: {
1928
- focus: {
1929
- background: "focus:bg-[hsl(var(--accent))]",
1930
- // Focus background using CSS var
1931
- text: "focus:text-[hsl(var(--accent-foreground))]"
1932
- // Focus text using CSS var
1933
- },
1934
- selected: {
1935
- background: "bg-[hsl(var(--accent))]",
1936
- // Selected background using CSS var
1937
- text: "text-[hsl(var(--accent-foreground))]"
1938
- // Selected text using CSS var
1939
- }
1940
- },
1941
2108
  /**
1942
2109
  * Variant-based tokens
1943
2110
  * Border, background, and text colors for different variants
@@ -2151,6 +2318,188 @@ var INPUT_TOKENS = {
2151
2318
  }
2152
2319
  };
2153
2320
 
2321
+ // src/tokens/components/textarea.ts
2322
+ var TEXTAREA_TOKENS = {
2323
+ /**
2324
+ * Shadow token
2325
+ * Maps to foundation elevation shadow tokens
2326
+ */
2327
+ shadow: "shadow-sm",
2328
+ // Maps to elevationShadows.sm
2329
+ /**
2330
+ * Variant-based tokens
2331
+ * Border, background, and text colors for different variants
2332
+ * All use CSS variable references for theme support
2333
+ */
2334
+ variant: {
2335
+ primary: {
2336
+ border: "border-[hsl(var(--tm-primary))]",
2337
+ // Primary border color
2338
+ background: "bg-[hsl(var(--tm-primary))]",
2339
+ // Primary background
2340
+ text: "text-[hsl(var(--tm-primary-foreground))]",
2341
+ // Primary text color
2342
+ focus: "focus-visible:shadow-[var(--focus-ring-primary)]"
2343
+ // Primary focus ring
2344
+ },
2345
+ secondary: {
2346
+ border: "border-[hsl(var(--tm-secondary))]",
2347
+ // Secondary border color
2348
+ background: "bg-[hsl(var(--tm-secondary))]",
2349
+ // Secondary background
2350
+ text: "text-[hsl(var(--tm-secondary-foreground))]",
2351
+ // Secondary text color
2352
+ focus: "focus-visible:shadow-[var(--focus-ring-default)]"
2353
+ // Default focus ring
2354
+ },
2355
+ outline: {
2356
+ border: "border-[hsl(var(--input))]",
2357
+ // Input border color
2358
+ background: "bg-transparent",
2359
+ // Transparent background
2360
+ text: "text-[hsl(var(--foreground))]",
2361
+ // Foreground text color
2362
+ focus: "focus-visible:shadow-[var(--focus-ring-default)]"
2363
+ // Default focus ring
2364
+ },
2365
+ ghost: {
2366
+ border: "border-transparent",
2367
+ // Transparent border
2368
+ background: "bg-transparent",
2369
+ // Transparent background
2370
+ text: "text-[hsl(var(--foreground))]",
2371
+ // Foreground text color
2372
+ focus: "focus-visible:shadow-[var(--focus-ring-default)]"
2373
+ // Default focus ring
2374
+ },
2375
+ destructive: {
2376
+ border: "border-[hsl(var(--destructive))]",
2377
+ // Destructive border color
2378
+ background: "bg-[hsl(var(--destructive))]",
2379
+ // Destructive background
2380
+ text: "text-[hsl(var(--destructive-foreground))]",
2381
+ // Destructive text color
2382
+ focus: "focus-visible:shadow-[var(--focus-ring-default)]"
2383
+ // Default focus ring
2384
+ }
2385
+ },
2386
+ /**
2387
+ * State-based tokens
2388
+ * Border, background, and text colors for different states
2389
+ * All use CSS variable references for theme support
2390
+ */
2391
+ state: {
2392
+ border: {
2393
+ default: "border-[hsl(var(--input))]",
2394
+ // Default border color using CSS var
2395
+ focus: "focus-visible:shadow-[var(--focus-ring-default)]",
2396
+ // Focus ring using CSS var
2397
+ error: "border-[hsl(var(--destructive))]",
2398
+ // Error state border using CSS var
2399
+ success: "border-[hsl(var(--semantic-success))]",
2400
+ // Success state border using CSS var
2401
+ disabled: "border-[hsl(var(--input))]"
2402
+ // Disabled state border (same as default)
2403
+ },
2404
+ background: {
2405
+ default: "bg-transparent",
2406
+ // Default background
2407
+ disabled: "bg-transparent"
2408
+ // Disabled background (same as default)
2409
+ },
2410
+ text: {
2411
+ default: "text-[hsl(var(--foreground))]",
2412
+ // Default text color using CSS var
2413
+ placeholder: "placeholder:text-[hsl(var(--muted-foreground))]",
2414
+ // Placeholder text color using CSS var
2415
+ disabled: "disabled:opacity-50"
2416
+ // Disabled text opacity
2417
+ }
2418
+ },
2419
+ /**
2420
+ * Width tokens
2421
+ * Common width utilities
2422
+ */
2423
+ width: {
2424
+ full: "w-full"
2425
+ // Full width (100%)
2426
+ },
2427
+ /**
2428
+ * Message tokens
2429
+ * Spacing, positioning, and styling for helper text and error messages
2430
+ */
2431
+ message: {
2432
+ // 8px (0.5rem) - spacing between control and message
2433
+ position: {
2434
+ bottom: "bottom-sm",
2435
+ // 8px (0.5rem) - bottom position for character counter
2436
+ right: "right-sm"
2437
+ // 8px (0.5rem) - right position for character counter
2438
+ },
2439
+ color: {
2440
+ default: "text-[hsl(var(--muted-foreground))]",
2441
+ // Default message color
2442
+ error: "text-[hsl(var(--destructive))]"}
2443
+ },
2444
+ /**
2445
+ * Size-based token structure
2446
+ * Organized by size for easy access
2447
+ */
2448
+ size: {
2449
+ xs: {
2450
+ padding: {
2451
+ horizontal: "px-xs",
2452
+ vertical: "py-xs"
2453
+ },
2454
+ radius: "rounded-sm",
2455
+ fontSize: "text-xs"},
2456
+ sm: {
2457
+ padding: {
2458
+ horizontal: "px-sm",
2459
+ vertical: "py-xs"
2460
+ },
2461
+ radius: "rounded-md",
2462
+ fontSize: "text-sm"},
2463
+ md: {
2464
+ padding: {
2465
+ horizontal: "px-sm",
2466
+ vertical: "py-xs"
2467
+ },
2468
+ radius: "rounded-md",
2469
+ fontSize: "text-base",
2470
+ fontSizeResponsive: "md:text-sm"},
2471
+ lg: {
2472
+ padding: {
2473
+ horizontal: "px-md",
2474
+ vertical: "py-sm"
2475
+ },
2476
+ radius: "rounded-md",
2477
+ fontSize: "text-base"},
2478
+ xl: {
2479
+ padding: {
2480
+ horizontal: "px-lg",
2481
+ vertical: "py-md"
2482
+ },
2483
+ radius: "rounded-lg",
2484
+ fontSize: "text-lg"}
2485
+ }
2486
+ };
2487
+
2488
+ // src/tokens/components/form.ts
2489
+ var FORM_TOKENS = {
2490
+ /**
2491
+ * Label tokens
2492
+ * Spacing and styling for labels
2493
+ */
2494
+ label: {
2495
+ // 8px (0.5rem) - spacing between label and control
2496
+ /**
2497
+ * Color for required asterisk mark
2498
+ */
2499
+ requiredMark: "text-destructive"
2500
+ // Color for required asterisk
2501
+ }};
2502
+
2154
2503
  // src/tokens/components/checkbox.ts
2155
2504
  var CHECKBOX_TOKENS = {
2156
2505
  /**
@@ -2925,8 +3274,16 @@ var TEXT_TOKENS = {
2925
3274
  // Maps to fontSize.base[0]
2926
3275
  lg: "text-lg",
2927
3276
  // Maps to fontSize.lg[0]
2928
- xl: "text-xl"
3277
+ xl: "text-xl",
2929
3278
  // Maps to fontSize.xl[0]
3279
+ "2xl": "text-2xl",
3280
+ // Maps to fontSize.2xl[0]
3281
+ "3xl": "text-3xl",
3282
+ // Maps to fontSize.3xl[0]
3283
+ "4xl": "text-4xl",
3284
+ // Maps to fontSize.4xl[0]
3285
+ "5xl": "text-5xl"
3286
+ // Maps to fontSize.5xl[0]
2930
3287
  },
2931
3288
  /**
2932
3289
  * Font weights by weight variant
@@ -2951,6 +3308,8 @@ var TEXT_TOKENS = {
2951
3308
  // Maps to lineHeight.none
2952
3309
  tight: "leading-tight",
2953
3310
  // Maps to lineHeight.tight
3311
+ snug: "leading-snug",
3312
+ // Maps to lineHeight.snug
2954
3313
  normal: "leading-normal",
2955
3314
  // Maps to lineHeight.normal
2956
3315
  relaxed: "leading-relaxed",
@@ -3474,9 +3833,9 @@ var TOAST_TOKENS = {
3474
3833
  // Default opacity (hidden)
3475
3834
  groupHover: "group-hover:opacity-100",
3476
3835
  // Visible on group hover
3477
- focus: "focus:opacity-100",
3836
+ focus: "focus-visible:opacity-100",
3478
3837
  // Visible on focus
3479
- focusRing: "focus:outline-none focus:ring-1"
3838
+ focusRing: "focus-visible:outline-none focus-visible:ring-1"
3480
3839
  // Focus ring styling
3481
3840
  }
3482
3841
  }
@@ -4218,19 +4577,27 @@ var DROPDOWN_TOKENS = {
4218
4577
  // 256px
4219
4578
  }
4220
4579
  },
4580
+ /**
4581
+ * Width tokens
4582
+ * Common width utilities
4583
+ */
4584
+ width: {
4585
+ full: "w-full"
4586
+ // Full width (100%)
4587
+ },
4221
4588
  /**
4222
4589
  * Item tokens by size
4223
4590
  * Individual menu item
4224
4591
  */
4225
4592
  item: {
4226
4593
  background: {
4227
- focus: "focus:bg-[hsl(var(--accent))]",
4594
+ focus: "focus-visible:bg-[hsl(var(--accent))]",
4228
4595
  // Focus background using CSS var
4229
4596
  selected: "bg-[hsl(var(--accent))]"
4230
4597
  // Selected background using CSS var
4231
4598
  },
4232
4599
  text: {
4233
- focus: "focus:text-[hsl(var(--accent-foreground))]",
4600
+ focus: "focus-visible:text-[hsl(var(--accent-foreground))]",
4234
4601
  // Focus text using CSS var
4235
4602
  selected: "text-[hsl(var(--accent-foreground))]"
4236
4603
  // Selected text using CSS var
@@ -4482,9 +4849,9 @@ var SELECT_TOKENS = {
4482
4849
  indicator: {
4483
4850
  size: "size-4"},
4484
4851
  focus: {
4485
- background: "focus:bg-[hsl(var(--accent))]",
4852
+ background: "focus-visible:bg-[hsl(var(--accent))]",
4486
4853
  // Focus background using CSS var
4487
- text: "focus:text-[hsl(var(--accent-foreground))]"
4854
+ text: "focus-visible:text-[hsl(var(--accent-foreground))]"
4488
4855
  // Focus text using CSS var
4489
4856
  },
4490
4857
  disabled: {
@@ -5027,26 +5394,314 @@ var MODAL_TOKENS = {
5027
5394
  }
5028
5395
  };
5029
5396
 
5030
- // src/tokens/motion/v2.ts
5031
- var motionV2Durations = {
5032
- fast: "150ms",
5033
- // Quick interactions
5034
- normal: "250ms",
5035
- // Default transitions
5036
- slow: "350ms",
5037
- // Emphasized animations
5038
- reduced: "0ms"
5039
- // For prefers-reduced-motion
5040
- };
5041
- var motionV2Easings = {
5042
- soft: "cubic-bezier(0.22, 1, 0.36, 1)",
5043
- // Gentle, smooth
5044
- standard: "cubic-bezier(0.4, 0, 0.2, 1)",
5045
- // Material Design standard
5046
- emphasized: "cubic-bezier(0.2, 0, 0, 1)"
5047
- // Strong, decisive
5048
- };
5049
- var motionV2Transitions = {
5397
+ // src/tokens/components/table.ts
5398
+ var TABLE_TOKENS = {
5399
+ /**
5400
+ * Table cell and header padding by size
5401
+ * Maps to semantic spacing tokens
5402
+ */
5403
+ padding: {
5404
+ cell: {
5405
+ sm: "p-xs",
5406
+ // 4px (0.25rem) - maps to semanticSpacing.xs
5407
+ md: "p-sm",
5408
+ // 8px (0.5rem) - maps to semanticSpacing.sm
5409
+ lg: "p-md"
5410
+ // 16px (1rem) - maps to semanticSpacing.md
5411
+ },
5412
+ header: {
5413
+ sm: "px-xs py-sm",
5414
+ // 4px horizontal, 8px vertical
5415
+ md: "px-sm py-md",
5416
+ // 8px horizontal, 16px vertical
5417
+ lg: "px-md py-lg"
5418
+ // 16px horizontal, 24px vertical
5419
+ }
5420
+ },
5421
+ /**
5422
+ * Border radius for table
5423
+ */
5424
+ radius: {
5425
+ default: "rounded-md"
5426
+ // 6px (0.375rem) - maps to borderRadius.md
5427
+ },
5428
+ /**
5429
+ * Shadow tokens for table
5430
+ * Maps to foundation elevation shadow tokens
5431
+ */
5432
+ shadow: {
5433
+ // No shadow
5434
+ subtle: "shadow-sm"
5435
+ // Maps to elevationShadows.sm
5436
+ },
5437
+ /**
5438
+ * Typography tokens for table headers and cells
5439
+ * Maps to foundation typography fontSize tokens
5440
+ */
5441
+ typography: {
5442
+ header: {
5443
+ fontSize: "text-sm",
5444
+ // Maps to fontSize.sm[0]
5445
+ fontWeight: "font-semibold"
5446
+ // Maps to fontWeight.semibold
5447
+ },
5448
+ cell: {
5449
+ fontSize: "text-sm",
5450
+ // Maps to fontSize.sm[0]
5451
+ fontWeight: "font-normal"
5452
+ // Maps to fontWeight.normal
5453
+ }
5454
+ },
5455
+ /**
5456
+ * Color tokens for table states
5457
+ * Uses semantic color tokens
5458
+ */
5459
+ colors: {
5460
+ border: "border-border",
5461
+ // Border color
5462
+ rowHover: "hover:bg-muted/50",
5463
+ // Row hover background
5464
+ rowSelected: "bg-muted"
5465
+ // Selected row background
5466
+ },
5467
+ /**
5468
+ * Border tokens for table
5469
+ */
5470
+ border: {
5471
+ bottom: "border-b"
5472
+ // Border bottom for rows and headers
5473
+ },
5474
+ /**
5475
+ * Layout tokens for table container and base styles
5476
+ */
5477
+ layout: {
5478
+ overflow: "overflow-x-auto",
5479
+ // Table container overflow
5480
+ table: "w-full border-collapse"
5481
+ // Table base styles
5482
+ },
5483
+ /**
5484
+ * Sticky header tokens
5485
+ * For sticky header positioning and styling
5486
+ */
5487
+ sticky: {
5488
+ header: "sticky top-0 z-10 bg-background"
5489
+ // Sticky header styles
5490
+ },
5491
+ /**
5492
+ * Expandable row tokens
5493
+ * For expandable content styling
5494
+ */
5495
+ expandable: {
5496
+ padding: "p-md",
5497
+ // Expandable content padding - maps to semanticSpacing.md
5498
+ container: "p-0",
5499
+ // Expandable container padding
5500
+ transition: "overflow-hidden transition-all duration-normal ease-in-out",
5501
+ // Transition styles
5502
+ expanded: "max-h-[100vh] opacity-100",
5503
+ // Expanded state
5504
+ collapsed: "max-h-0 opacity-0",
5505
+ // Collapsed state
5506
+ cursor: "cursor-pointer",
5507
+ // Cursor for expandable rows
5508
+ content: {
5509
+ expanded: "block",
5510
+ // Expanded content display
5511
+ collapsed: "hidden"
5512
+ // Collapsed content display
5513
+ }
5514
+ },
5515
+ /**
5516
+ * Loading state tokens
5517
+ * For loading state cell styling
5518
+ */
5519
+ loading: {
5520
+ cellPadding: "p-sm",
5521
+ // Loading state cell padding - maps to semanticSpacing.sm
5522
+ skeletonWidth: "w-full"
5523
+ // Skeleton width
5524
+ },
5525
+ /**
5526
+ * Empty state tokens
5527
+ * For empty state cell styling
5528
+ */
5529
+ empty: {
5530
+ padding: "p-8"
5531
+ // Empty state padding - maps to semanticSpacing.2xl
5532
+ },
5533
+ /**
5534
+ * Sortable header tokens
5535
+ * For sortable header styling and interactions
5536
+ */
5537
+ sortable: {
5538
+ hover: "hover:bg-muted/50",
5539
+ // Sortable header hover
5540
+ gap: "gap-2",
5541
+ // Sort icon gap - maps to semanticSpacing.sm
5542
+ cursor: "cursor-pointer select-none",
5543
+ // Sortable cursor
5544
+ container: "flex items-center",
5545
+ // Sortable header container
5546
+ icon: {
5547
+ base: "inline-flex size-4 items-center text-muted-foreground transition-transform",
5548
+ // Sort icon base styles
5549
+ rotated: "rotate-180",
5550
+ // Rotated state (descending)
5551
+ inactive: "opacity-30"
5552
+ // Inactive state (no sort)
5553
+ }
5554
+ }
5555
+ };
5556
+
5557
+ // src/tokens/components/data-list.ts
5558
+ var DATA_LIST_TOKENS = {
5559
+ /**
5560
+ * Spacing tokens for DataList
5561
+ * Maps to semantic spacing tokens
5562
+ */
5563
+ spacing: {
5564
+ gap: "gap-md"},
5565
+ /**
5566
+ * Label width tokens (for desktop horizontal layout)
5567
+ * Maps to Tailwind width utilities
5568
+ */
5569
+ labelWidth: {
5570
+ // 96px (6rem) - small label width
5571
+ md: "w-32"},
5572
+ /**
5573
+ * Row padding tokens
5574
+ * Maps to semantic spacing tokens
5575
+ */
5576
+ rowPadding: {
5577
+ sm: "py-xs",
5578
+ // 4px (0.25rem) - maps to semanticSpacing.xs
5579
+ md: "py-sm",
5580
+ // 8px (0.5rem) - maps to semanticSpacing.sm
5581
+ lg: "py-md"
5582
+ // 16px (1rem) - maps to semanticSpacing.md
5583
+ },
5584
+ /**
5585
+ * Item tokens
5586
+ * For individual DataList item styling
5587
+ */
5588
+ item: {
5589
+ /**
5590
+ * Border tokens for items
5591
+ */
5592
+ border: "border-b border-border last:border-0",
5593
+ // Item borders
5594
+ /**
5595
+ * Responsive layout tokens
5596
+ */
5597
+ layout: {
5598
+ mobile: "flex flex-col",
5599
+ // Mobile layout - vertical
5600
+ desktop: "md:flex-row md:items-center"
5601
+ // Desktop layout - horizontal
5602
+ }
5603
+ },
5604
+ /**
5605
+ * Label tokens
5606
+ * For DataList label styling
5607
+ */
5608
+ label: {
5609
+ mobile: "mb-1 font-semibold text-foreground",
5610
+ // Mobile label styles
5611
+ desktop: "md:mb-0"
5612
+ // Desktop label margin override
5613
+ },
5614
+ /**
5615
+ * Value tokens
5616
+ * For DataList value styling
5617
+ */
5618
+ value: {
5619
+ color: "text-muted-foreground",
5620
+ // Value text color
5621
+ flex: "flex-1"
5622
+ // Value flex grow
5623
+ }
5624
+ };
5625
+
5626
+ // src/tokens/components/empty-state.ts
5627
+ var EMPTY_STATE_TOKENS = {
5628
+ /**
5629
+ * Spacing tokens for EmptyState
5630
+ * Maps to semantic spacing tokens
5631
+ */
5632
+ spacing: {
5633
+ // 24px (1.5rem) - container padding - maps to semanticSpacing.lg
5634
+ action: "mt-2"
5635
+ // Action button margin top - maps to semanticSpacing.xs
5636
+ },
5637
+ /**
5638
+ * Icon sizes by variant
5639
+ * Maps to Tailwind size utilities
5640
+ */
5641
+ icon: {
5642
+ size: {
5643
+ sm: "size-8",
5644
+ // 32px (2rem)
5645
+ md: "size-12",
5646
+ // 48px (3rem)
5647
+ lg: "size-16"
5648
+ // 64px (4rem)
5649
+ },
5650
+ container: "flex items-center justify-center text-muted-foreground"
5651
+ // Icon container styles
5652
+ },
5653
+ /**
5654
+ * Typography tokens for EmptyState
5655
+ * Maps to foundation typography tokens
5656
+ */
5657
+ typography: {
5658
+ title: {
5659
+ fontSize: "text-lg",
5660
+ // Maps to fontSize.lg[0]
5661
+ fontWeight: "font-semibold",
5662
+ // Maps to fontWeight.semibold
5663
+ color: "text-foreground"
5664
+ // Title text color
5665
+ },
5666
+ description: {
5667
+ fontSize: "text-sm",
5668
+ // Maps to fontSize.sm[0]
5669
+ fontWeight: "font-normal",
5670
+ // Maps to fontWeight.normal
5671
+ color: "text-muted-foreground",
5672
+ // Description text color
5673
+ maxWidth: "max-w-md"
5674
+ // Maximum width for description
5675
+ }
5676
+ },
5677
+ /**
5678
+ * Alignment tokens
5679
+ * For text alignment in EmptyState
5680
+ */
5681
+ alignment: {
5682
+ center: "text-center"}
5683
+ };
5684
+
5685
+ // src/tokens/motion/v2.ts
5686
+ var motionV2Durations = {
5687
+ fast: "150ms",
5688
+ // Quick interactions
5689
+ normal: "250ms",
5690
+ // Default transitions
5691
+ slow: "350ms",
5692
+ // Emphasized animations
5693
+ reduced: "0ms"
5694
+ // For prefers-reduced-motion
5695
+ };
5696
+ var motionV2Easings = {
5697
+ soft: "cubic-bezier(0.22, 1, 0.36, 1)",
5698
+ // Gentle, smooth
5699
+ standard: "cubic-bezier(0.4, 0, 0.2, 1)",
5700
+ // Material Design standard
5701
+ emphasized: "cubic-bezier(0.2, 0, 0, 1)"
5702
+ // Strong, decisive
5703
+ };
5704
+ var motionV2Transitions = {
5050
5705
  fast: `${motionV2Durations.fast} ${motionV2Easings.standard}`,
5051
5706
  normal: `${motionV2Durations.normal} ${motionV2Easings.standard}`,
5052
5707
  slow: `${motionV2Durations.slow} ${motionV2Easings.emphasized}`,
@@ -5294,54 +5949,54 @@ var transitions = {
5294
5949
  var keyframes = {
5295
5950
  // Fade animations
5296
5951
  fadeIn: {
5297
- from: { opacity: 0 },
5298
- to: { opacity: 1 }
5952
+ from: { opacity: "0" },
5953
+ to: { opacity: "1" }
5299
5954
  },
5300
5955
  fadeOut: {
5301
- from: { opacity: 1 },
5302
- to: { opacity: 0 }
5956
+ from: { opacity: "1" },
5957
+ to: { opacity: "0" }
5303
5958
  },
5304
5959
  // Slide animations
5305
5960
  slideInUp: {
5306
- from: { transform: "translateY(100%)", opacity: 0 },
5307
- to: { transform: "translateY(0)", opacity: 1 }
5961
+ from: { transform: "translateY(100%)", opacity: "0" },
5962
+ to: { transform: "translateY(0)", opacity: "1" }
5308
5963
  },
5309
5964
  slideInDown: {
5310
- from: { transform: "translateY(-100%)", opacity: 0 },
5311
- to: { transform: "translateY(0)", opacity: 1 }
5965
+ from: { transform: "translateY(-100%)", opacity: "0" },
5966
+ to: { transform: "translateY(0)", opacity: "1" }
5312
5967
  },
5313
5968
  slideInLeft: {
5314
- from: { transform: "translateX(-100%)", opacity: 0 },
5315
- to: { transform: "translateX(0)", opacity: 1 }
5969
+ from: { transform: "translateX(-100%)", opacity: "0" },
5970
+ to: { transform: "translateX(0)", opacity: "1" }
5316
5971
  },
5317
5972
  slideInRight: {
5318
- from: { transform: "translateX(100%)", opacity: 0 },
5319
- to: { transform: "translateX(0)", opacity: 1 }
5973
+ from: { transform: "translateX(100%)", opacity: "0" },
5974
+ to: { transform: "translateX(0)", opacity: "1" }
5320
5975
  },
5321
5976
  slideOutUp: {
5322
- from: { transform: "translateY(0)", opacity: 1 },
5323
- to: { transform: "translateY(-100%)", opacity: 0 }
5977
+ from: { transform: "translateY(0)", opacity: "1" },
5978
+ to: { transform: "translateY(-100%)", opacity: "0" }
5324
5979
  },
5325
5980
  slideOutDown: {
5326
- from: { transform: "translateY(0)", opacity: 1 },
5327
- to: { transform: "translateY(100%)", opacity: 0 }
5981
+ from: { transform: "translateY(0)", opacity: "1" },
5982
+ to: { transform: "translateY(100%)", opacity: "0" }
5328
5983
  },
5329
5984
  slideOutLeft: {
5330
- from: { transform: "translateX(0)", opacity: 1 },
5331
- to: { transform: "translateX(-100%)", opacity: 0 }
5985
+ from: { transform: "translateX(0)", opacity: "1" },
5986
+ to: { transform: "translateX(-100%)", opacity: "0" }
5332
5987
  },
5333
5988
  slideOutRight: {
5334
- from: { transform: "translateX(0)", opacity: 1 },
5335
- to: { transform: "translateX(100%)", opacity: 0 }
5989
+ from: { transform: "translateX(0)", opacity: "1" },
5990
+ to: { transform: "translateX(100%)", opacity: "0" }
5336
5991
  },
5337
5992
  // Scale animations
5338
5993
  scaleIn: {
5339
- from: { transform: "scale(0.95)", opacity: 0 },
5340
- to: { transform: "scale(1)", opacity: 1 }
5994
+ from: { transform: "scale(0.95)", opacity: "0" },
5995
+ to: { transform: "scale(1)", opacity: "1" }
5341
5996
  },
5342
5997
  scaleOut: {
5343
- from: { transform: "scale(1)", opacity: 1 },
5344
- to: { transform: "scale(0.95)", opacity: 0 }
5998
+ from: { transform: "scale(1)", opacity: "1" },
5999
+ to: { transform: "scale(0.95)", opacity: "0" }
5345
6000
  },
5346
6001
  scaleUp: {
5347
6002
  from: { transform: "scale(1)" },
@@ -5362,8 +6017,8 @@ var keyframes = {
5362
6017
  },
5363
6018
  // Pulse and bounce
5364
6019
  pulse: {
5365
- "0%, 100%": { opacity: 1 },
5366
- "50%": { opacity: 0.5 }
6020
+ "0%, 100%": { opacity: "1" },
6021
+ "50%": { opacity: "0.5" }
5367
6022
  },
5368
6023
  bounce: {
5369
6024
  "0%, 100%": {
@@ -5385,7 +6040,7 @@ var keyframes = {
5385
6040
  ping: {
5386
6041
  "75%, 100%": {
5387
6042
  transform: "scale(2)",
5388
- opacity: 0
6043
+ opacity: "0"
5389
6044
  }
5390
6045
  },
5391
6046
  // Accordion animations (for Radix UI)
@@ -6344,41 +6999,179 @@ var tokenSystemSummary = {
6344
6999
 
6345
7000
  // src/tokens/theme.ts
6346
7001
  var UI_COLORS = tailwindThemeColors;
7002
+ var FORBIDDEN_PATTERNS = [
7003
+ // Raw color utilities (bg-red-500, text-blue-600, etc.)
7004
+ // These are always forbidden as they bypass the color token system
7005
+ /\b(bg|text|border|ring|outline)-(red|blue|green|yellow|purple|pink|indigo|gray|slate|zinc|neutral|stone|orange|amber|emerald|teal|cyan|sky|violet|fuchsia|rose)-\d+/,
7006
+ // Raw spacing utilities with arbitrary numbers (p-4, m-2, gap-3, etc.)
7007
+ // Allow semantic spacing tokens (px-sm, py-md, etc.) which use token names
7008
+ /\b(p|m|px|py|pt|pb|pl|pr|mx|my|mt|mb|ml|mr|gap|space-[xy])-(\d+|\[)/,
7009
+ // Raw size utilities with arbitrary numbers (w-4, h-6, etc.)
7010
+ // Allow semantic size tokens (h-8, w-9, etc.) which are standard design system values
7011
+ // Only flag arbitrary values like w-[123px] or h-[calc(...)]
7012
+ /\b(w|h|min-w|min-h|max-w|max-h)-\[/
7013
+ ];
7014
+ function validateTokenUsage(classes, context) {
7015
+ if (process.env.NODE_ENV === "production") {
7016
+ return;
7017
+ }
7018
+ for (const pattern of FORBIDDEN_PATTERNS) {
7019
+ if (pattern.test(classes)) {
7020
+ console.warn(
7021
+ `[tokenCVA] Potential hardcoded Tailwind utility detected in ${context}:
7022
+ "${classes}"
7023
+ Pattern: ${pattern}
7024
+ Please use token-based utilities instead (e.g., from component tokens).`
7025
+ );
7026
+ }
7027
+ }
7028
+ }
7029
+ function validateVariantConfig(value, path, visited = /* @__PURE__ */ new Set()) {
7030
+ if (value === void 0 || value === null) {
7031
+ return;
7032
+ }
7033
+ const key = `${path}-${String(value)}`;
7034
+ if (visited.has(key)) {
7035
+ return;
7036
+ }
7037
+ visited.add(key);
7038
+ if (typeof value === "string") {
7039
+ validateTokenUsage(value, path);
7040
+ } else if (Array.isArray(value)) {
7041
+ value.forEach((item, index2) => {
7042
+ validateVariantConfig(item, `${path}[${index2}]`, visited);
7043
+ });
7044
+ } else if (typeof value === "object") {
7045
+ Object.entries(value).forEach(([key2, val]) => {
7046
+ validateVariantConfig(val, `${path}.${key2}`, visited);
7047
+ });
7048
+ }
7049
+ }
7050
+ function tokenCVA(config) {
7051
+ if (process.env.NODE_ENV !== "production") {
7052
+ if (config.base) {
7053
+ validateVariantConfig(config.base, "base");
7054
+ }
7055
+ if (config.variants) {
7056
+ Object.entries(config.variants).forEach(([variantKey, variantValues]) => {
7057
+ Object.entries(variantValues).forEach(([valueKey, value]) => {
7058
+ validateVariantConfig(value, `variants.${variantKey}.${valueKey}`);
7059
+ });
7060
+ });
7061
+ }
7062
+ if (config.compoundVariants) {
7063
+ config.compoundVariants.forEach((compound, index2) => {
7064
+ if (compound.class) {
7065
+ validateVariantConfig(compound.class, `compoundVariants[${index2}].class`);
7066
+ }
7067
+ if (compound.className) {
7068
+ validateVariantConfig(compound.className, `compoundVariants[${index2}].className`);
7069
+ }
7070
+ });
7071
+ }
7072
+ }
7073
+ return cva(config.base, {
7074
+ variants: config.variants,
7075
+ compoundVariants: config.compoundVariants,
7076
+ defaultVariants: config.defaultVariants
7077
+ });
7078
+ }
6347
7079
  function cn(...inputs) {
6348
7080
  return twMerge(clsx(inputs));
6349
7081
  }
6350
- var buttonVariants = cva(
6351
- `inline-flex items-center justify-center ${BUTTON_TOKENS.gap} whitespace-nowrap ${BUTTON_TOKENS.radius} ${BUTTON_TOKENS.fontSize.md} font-medium ${BUTTON_TOKENS.transition.colors} focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:${BUTTON_TOKENS.iconSize} [&_svg]:shrink-0`,
6352
- {
6353
- variants: {
6354
- variant: {
6355
- primary: `${BUTTON_TOKENS.variant.primary.background} ${BUTTON_TOKENS.variant.primary.text} ${BUTTON_TOKENS.shadow.primary} ${BUTTON_TOKENS.variant.primary.hover}`,
6356
- secondary: `${BUTTON_TOKENS.variant.secondary.background} ${BUTTON_TOKENS.variant.secondary.text} ${BUTTON_TOKENS.shadow.default} ${BUTTON_TOKENS.variant.secondary.hover}`,
6357
- accent: `${BUTTON_TOKENS.variant.accent.background} ${BUTTON_TOKENS.variant.accent.text} ${BUTTON_TOKENS.shadow.default} ${BUTTON_TOKENS.variant.accent.hover}`,
6358
- outline: `${BUTTON_TOKENS.variant.outline.border} ${BUTTON_TOKENS.variant.outline.background} ${BUTTON_TOKENS.shadow.default} ${BUTTON_TOKENS.variant.outline.hover.background} ${BUTTON_TOKENS.variant.outline.hover.text}`,
6359
- ghost: `${BUTTON_TOKENS.variant.ghost.hover.background} ${BUTTON_TOKENS.variant.ghost.hover.text}`,
6360
- destructive: `${BUTTON_TOKENS.variant.destructive.background} ${BUTTON_TOKENS.variant.destructive.text} ${BUTTON_TOKENS.shadow.default} ${BUTTON_TOKENS.variant.destructive.hover}`
6361
- },
6362
- size: {
6363
- sm: `${BUTTON_TOKENS.height.sm} ${BUTTON_TOKENS.radius} ${BUTTON_TOKENS.padding.horizontal.sm} ${BUTTON_TOKENS.padding.vertical.sm} ${BUTTON_TOKENS.fontSize.sm}`,
6364
- md: `${BUTTON_TOKENS.height.md} ${BUTTON_TOKENS.radius} ${BUTTON_TOKENS.padding.horizontal.md} ${BUTTON_TOKENS.padding.vertical.md} ${BUTTON_TOKENS.fontSize.md}`,
6365
- lg: `${BUTTON_TOKENS.height.lg} ${BUTTON_TOKENS.radius} ${BUTTON_TOKENS.padding.horizontal.lg} ${BUTTON_TOKENS.padding.vertical.md} ${BUTTON_TOKENS.fontSize.lg}`,
6366
- icon: `${BUTTON_TOKENS.height.icon} ${BUTTON_TOKENS.width.icon}`
6367
- }
7082
+ function formatDate(date) {
7083
+ return new Intl.DateTimeFormat("en-US", {
7084
+ month: "long",
7085
+ day: "numeric",
7086
+ year: "numeric"
7087
+ }).format(new Date(date));
7088
+ }
7089
+ var buttonVariants = tokenCVA({
7090
+ base: `inline-flex items-center justify-center whitespace-nowrap ${BUTTON_TOKENS.radius} font-medium ${BUTTON_TOKENS.transition.colors} ${BUTTON_TOKENS.state.focus.outline} ${BUTTON_TOKENS.state.focus.ring} ${BUTTON_TOKENS.state.disabled.cursor} ${BUTTON_TOKENS.state.disabled.pointerEvents} [&_svg]:pointer-events-none [&_svg]:shrink-0`,
7091
+ variants: {
7092
+ variant: {
7093
+ primary: `${BUTTON_TOKENS.variant.primary.background} ${BUTTON_TOKENS.variant.primary.text} ${BUTTON_TOKENS.shadow.primary} ${BUTTON_TOKENS.variant.primary.hover} ${BUTTON_TOKENS.variant.primary.active} ${BUTTON_TOKENS.variant.primary.focus} ${BUTTON_TOKENS.variant.primary.disabled.background} ${BUTTON_TOKENS.variant.primary.disabled.text}`,
7094
+ secondary: `${BUTTON_TOKENS.variant.secondary.background} ${BUTTON_TOKENS.variant.secondary.text} ${BUTTON_TOKENS.shadow.default} ${BUTTON_TOKENS.variant.secondary.hover} ${BUTTON_TOKENS.variant.secondary.active} ${BUTTON_TOKENS.variant.secondary.disabled.background} ${BUTTON_TOKENS.variant.secondary.disabled.text}`,
7095
+ accent: `${BUTTON_TOKENS.variant.accent.background} ${BUTTON_TOKENS.variant.accent.text} ${BUTTON_TOKENS.shadow.default} ${BUTTON_TOKENS.variant.accent.hover} ${BUTTON_TOKENS.variant.accent.active} ${BUTTON_TOKENS.variant.accent.disabled.background} ${BUTTON_TOKENS.variant.accent.disabled.text}`,
7096
+ outline: `${BUTTON_TOKENS.variant.outline.border} ${BUTTON_TOKENS.variant.outline.background} ${BUTTON_TOKENS.variant.outline.text} ${BUTTON_TOKENS.shadow.default} ${BUTTON_TOKENS.variant.outline.hover.background} ${BUTTON_TOKENS.variant.outline.hover.text} ${BUTTON_TOKENS.variant.outline.hover.border} ${BUTTON_TOKENS.variant.outline.active.background} ${BUTTON_TOKENS.variant.outline.active.text} ${BUTTON_TOKENS.variant.outline.active.border} ${BUTTON_TOKENS.variant.outline.disabled.background} ${BUTTON_TOKENS.variant.outline.disabled.text} ${BUTTON_TOKENS.variant.outline.disabled.border}`,
7097
+ ghost: `${BUTTON_TOKENS.variant.ghost.background} ${BUTTON_TOKENS.variant.ghost.text} ${BUTTON_TOKENS.variant.ghost.hover.background} ${BUTTON_TOKENS.variant.ghost.hover.text} ${BUTTON_TOKENS.variant.ghost.active.background} ${BUTTON_TOKENS.variant.ghost.active.text} ${BUTTON_TOKENS.variant.ghost.disabled.background} ${BUTTON_TOKENS.variant.ghost.disabled.text}`,
7098
+ destructive: `${BUTTON_TOKENS.variant.destructive.background} ${BUTTON_TOKENS.variant.destructive.text} ${BUTTON_TOKENS.shadow.default} ${BUTTON_TOKENS.variant.destructive.hover} ${BUTTON_TOKENS.variant.destructive.active} ${BUTTON_TOKENS.variant.destructive.disabled.background} ${BUTTON_TOKENS.variant.destructive.disabled.text}`
6368
7099
  },
6369
- defaultVariants: {
6370
- variant: "primary",
6371
- size: "md"
7100
+ size: {
7101
+ sm: `${BUTTON_TOKENS.height.sm} ${BUTTON_TOKENS.radius} ${BUTTON_TOKENS.padding.horizontal.sm} ${BUTTON_TOKENS.padding.vertical.sm} ${BUTTON_TOKENS.fontSize.sm} ${BUTTON_TOKENS.gap.sm} [&_svg]:${BUTTON_TOKENS.iconSize.sm}`,
7102
+ md: `${BUTTON_TOKENS.height.md} ${BUTTON_TOKENS.radius} ${BUTTON_TOKENS.padding.horizontal.md} ${BUTTON_TOKENS.padding.vertical.md} ${BUTTON_TOKENS.fontSize.md} ${BUTTON_TOKENS.gap.md} [&_svg]:${BUTTON_TOKENS.iconSize.md}`,
7103
+ lg: `${BUTTON_TOKENS.height.lg} ${BUTTON_TOKENS.radius} ${BUTTON_TOKENS.padding.horizontal.lg} ${BUTTON_TOKENS.padding.vertical.md} ${BUTTON_TOKENS.fontSize.lg} ${BUTTON_TOKENS.gap.lg} [&_svg]:${BUTTON_TOKENS.iconSize.lg}`,
7104
+ icon: `${BUTTON_TOKENS.height.icon} ${BUTTON_TOKENS.width.icon} [&_svg]:${BUTTON_TOKENS.iconSize.icon}`
6372
7105
  }
7106
+ },
7107
+ defaultVariants: {
7108
+ variant: "primary",
7109
+ size: "md"
6373
7110
  }
6374
- );
7111
+ });
6375
7112
  var Button = React49.forwardRef(
6376
7113
  ({ className, variant, size: size3, asChild = false, leftIcon, rightIcon, children, ...props }, ref) => {
6377
7114
  const Comp = asChild ? Slot : "button";
6378
- return /* @__PURE__ */ jsxs(Comp, { className: cn(buttonVariants({ variant, size: size3, className })), ref, ...props, children: [
6379
- leftIcon && /* @__PURE__ */ jsx("span", { className: "inline-flex items-center", children: leftIcon }),
7115
+ const finalClassName = cn(buttonVariants({ variant, size: size3, className }));
7116
+ const iconSizeMap = {
7117
+ "size-3.5": "[&_svg]:w-3.5 [&_svg]:h-3.5",
7118
+ "size-4": "[&_svg]:w-4 [&_svg]:h-4",
7119
+ "size-5": "[&_svg]:w-5 [&_svg]:h-5"
7120
+ };
7121
+ const iconSizeToken = size3 ? BUTTON_TOKENS.iconSize[size3] : BUTTON_TOKENS.iconSize.md;
7122
+ const iconSizeClass = iconSizeMap[iconSizeToken] || "[&_svg]:w-4 [&_svg]:h-4";
7123
+ if (typeof window !== "undefined" && variant === "primary") {
7124
+ const hasHoverClass = finalClassName.includes(
7125
+ "hover:bg-[hsl(var(--button-primary-hover-bg))]"
7126
+ );
7127
+ const hasActiveClass = finalClassName.includes(
7128
+ "active:bg-[hsl(var(--button-primary-active-bg))]"
7129
+ );
7130
+ fetch("http://127.0.0.1:7243/ingest/ff5d1e20-0815-4ca0-af82-fcbd3cfa35b1", {
7131
+ method: "POST",
7132
+ headers: { "Content-Type": "application/json" },
7133
+ body: JSON.stringify({
7134
+ location: "button.tsx:137",
7135
+ message: "Button className check (State Authority Contract)",
7136
+ data: {
7137
+ variant,
7138
+ size: size3,
7139
+ className: finalClassName,
7140
+ hasHoverClass,
7141
+ hasActiveClass,
7142
+ hoverClassInString: finalClassName.includes("hover"),
7143
+ allClasses: finalClassName.split(" ").filter((c) => c.includes("hover") || c.includes("active") || c.includes("disabled"))
7144
+ },
7145
+ timestamp: Date.now(),
7146
+ sessionId: "debug-session",
7147
+ runId: "state-authority-contract",
7148
+ hypothesisId: "A"
7149
+ })
7150
+ }).catch(() => {
7151
+ });
7152
+ }
7153
+ return /* @__PURE__ */ jsxs(Comp, { className: finalClassName, ref, ...props, children: [
7154
+ leftIcon && /* @__PURE__ */ jsx(
7155
+ "span",
7156
+ {
7157
+ className: cn(
7158
+ "pointer-events-none relative z-10 inline-flex items-center [&_svg]:text-current",
7159
+ iconSizeClass
7160
+ ),
7161
+ children: leftIcon
7162
+ }
7163
+ ),
6380
7164
  children,
6381
- rightIcon && /* @__PURE__ */ jsx("span", { className: "inline-flex items-center", children: rightIcon })
7165
+ rightIcon && /* @__PURE__ */ jsx(
7166
+ "span",
7167
+ {
7168
+ className: cn(
7169
+ "pointer-events-none relative z-10 inline-flex items-center [&_svg]:text-current",
7170
+ iconSizeClass
7171
+ ),
7172
+ children: rightIcon
7173
+ }
7174
+ )
6382
7175
  ] });
6383
7176
  }
6384
7177
  );
@@ -6473,14 +7266,14 @@ Alert.displayName = "Alert";
6473
7266
  var bodyVariants = cva("font-sans text-foreground", {
6474
7267
  variants: {
6475
7268
  size: {
6476
- md: "text-md leading-relaxed tracking-normal",
6477
- lg: "text-lg leading-relaxed tracking-normal"
7269
+ md: `${TEXT_TOKENS.fontSize.md} ${TEXT_TOKENS.lineHeight.relaxed} ${TEXT_TOKENS.letterSpacing.normal}`,
7270
+ lg: `${TEXT_TOKENS.fontSize.lg} ${TEXT_TOKENS.lineHeight.relaxed} ${TEXT_TOKENS.letterSpacing.normal}`
6478
7271
  },
6479
7272
  weight: {
6480
- normal: "font-normal",
6481
- medium: "font-medium",
6482
- semibold: "font-semibold",
6483
- bold: "font-bold"
7273
+ normal: TEXT_TOKENS.fontWeight.normal,
7274
+ medium: TEXT_TOKENS.fontWeight.medium,
7275
+ semibold: TEXT_TOKENS.fontWeight.semibold,
7276
+ bold: TEXT_TOKENS.fontWeight.bold
6484
7277
  },
6485
7278
  muted: {
6486
7279
  true: "text-muted-foreground",
@@ -6508,22 +7301,31 @@ var Body = React49.forwardRef(
6508
7301
  }
6509
7302
  );
6510
7303
  Body.displayName = "Body";
6511
- var captionVariants = cva("font-sans text-foreground", {
6512
- variants: {
6513
- weight: {
6514
- normal: "font-normal",
6515
- medium: "font-medium"
7304
+ var captionVariants = cva(
7305
+ [
7306
+ "font-sans",
7307
+ "text-foreground",
7308
+ TEXT_TOKENS.fontSize.xs,
7309
+ TEXT_TOKENS.lineHeight.tight,
7310
+ TEXT_TOKENS.letterSpacing.wide
7311
+ ].filter(Boolean).join(" "),
7312
+ {
7313
+ variants: {
7314
+ weight: {
7315
+ normal: TEXT_TOKENS.fontWeight.normal,
7316
+ medium: TEXT_TOKENS.fontWeight.medium
7317
+ },
7318
+ muted: {
7319
+ true: "text-muted-foreground",
7320
+ false: ""
7321
+ }
6516
7322
  },
6517
- muted: {
6518
- true: "text-muted-foreground",
6519
- false: ""
7323
+ defaultVariants: {
7324
+ weight: "normal",
7325
+ muted: true
6520
7326
  }
6521
- },
6522
- defaultVariants: {
6523
- weight: "normal",
6524
- muted: true
6525
7327
  }
6526
- });
7328
+ );
6527
7329
  var Caption = React49.forwardRef(
6528
7330
  ({ className, weight, muted, as = "span", children, ...props }, ref) => {
6529
7331
  const Component = as;
@@ -6531,11 +7333,7 @@ var Caption = React49.forwardRef(
6531
7333
  Component,
6532
7334
  {
6533
7335
  ref,
6534
- className: cn(
6535
- "text-xs leading-tight tracking-wide",
6536
- captionVariants({ weight, muted }),
6537
- className
6538
- ),
7336
+ className: cn(captionVariants({ weight, muted }), className),
6539
7337
  ...props,
6540
7338
  children
6541
7339
  }
@@ -6543,11 +7341,43 @@ var Caption = React49.forwardRef(
6543
7341
  }
6544
7342
  );
6545
7343
  Caption.displayName = "Caption";
7344
+
7345
+ // src/tokens/components/code.ts
7346
+ var CODE_TOKENS = {
7347
+ /**
7348
+ * Background color tokens
7349
+ * Uses semantic color tokens
7350
+ */
7351
+ background: {
7352
+ muted: "bg-muted"
7353
+ // Muted background for code blocks
7354
+ },
7355
+ /**
7356
+ * Border radius tokens
7357
+ * Maps to foundation borderRadius tokens
7358
+ */
7359
+ radius: {
7360
+ inline: "rounded",
7361
+ // Small radius for inline code
7362
+ block: "rounded-md"
7363
+ // Medium radius for code blocks
7364
+ },
7365
+ /**
7366
+ * Padding tokens
7367
+ * Maps to foundation spacing tokens
7368
+ */
7369
+ padding: {
7370
+ inline: "px-xs py-0.5",
7371
+ // 4px horizontal, 4px vertical for inline code
7372
+ block: "p-md"
7373
+ // 16px padding for code blocks
7374
+ }
7375
+ };
6546
7376
  var codeVariants = cva("font-mono text-foreground", {
6547
7377
  variants: {
6548
7378
  variant: {
6549
- inline: "rounded bg-muted px-xs py-0.5 text-sm font-semibold",
6550
- block: "block rounded-md bg-muted p-md text-sm font-semibold"
7379
+ inline: `${CODE_TOKENS.radius.inline} ${CODE_TOKENS.background.muted} ${CODE_TOKENS.padding.inline} ${TEXT_TOKENS.fontSize.sm} ${TEXT_TOKENS.fontWeight.semibold}`,
7380
+ block: `block ${CODE_TOKENS.radius.block} ${CODE_TOKENS.background.muted} ${CODE_TOKENS.padding.block} ${TEXT_TOKENS.fontSize.sm} ${TEXT_TOKENS.fontWeight.semibold}`
6551
7381
  },
6552
7382
  muted: {
6553
7383
  true: "text-muted-foreground",
@@ -6577,19 +7407,19 @@ Code.displayName = "Code";
6577
7407
  var displayVariants = cva("font-display text-foreground", {
6578
7408
  variants: {
6579
7409
  size: {
6580
- xl: "text-xl leading-normal tracking-normal",
6581
- "2xl": "text-2xl leading-tight tracking-tight",
6582
- "3xl": "text-3xl leading-tight tracking-tight",
6583
- "4xl": "text-4xl leading-none tracking-tight"
7410
+ xl: `${TEXT_TOKENS.fontSize.xl} ${TEXT_TOKENS.lineHeight.normal} ${TEXT_TOKENS.letterSpacing.normal}`,
7411
+ "2xl": `${TEXT_TOKENS.fontSize["2xl"]} ${TEXT_TOKENS.lineHeight.tight} ${TEXT_TOKENS.letterSpacing.tight}`,
7412
+ "3xl": `${TEXT_TOKENS.fontSize["3xl"]} ${TEXT_TOKENS.lineHeight.tight} ${TEXT_TOKENS.letterSpacing.tight}`,
7413
+ "4xl": `${TEXT_TOKENS.fontSize["4xl"]} ${TEXT_TOKENS.lineHeight.none} ${TEXT_TOKENS.letterSpacing.tight}`
6584
7414
  },
6585
7415
  weight: {
6586
- normal: "font-normal",
6587
- medium: "font-medium",
6588
- semibold: "font-semibold",
6589
- bold: "font-bold"
6590
- },
6591
- muted: {
6592
- true: "text-muted-foreground",
7416
+ normal: TEXT_TOKENS.fontWeight.normal,
7417
+ medium: TEXT_TOKENS.fontWeight.medium,
7418
+ semibold: TEXT_TOKENS.fontWeight.semibold,
7419
+ bold: TEXT_TOKENS.fontWeight.bold
7420
+ },
7421
+ muted: {
7422
+ true: "text-muted-foreground",
6593
7423
  false: ""
6594
7424
  }
6595
7425
  },
@@ -6618,149 +7448,87 @@ var Display = React49.forwardRef(
6618
7448
  }
6619
7449
  );
6620
7450
  Display.displayName = "Display";
7451
+ var levelConfig = {
7452
+ 1: [
7453
+ TEXT_TOKENS.fontSize["5xl"],
7454
+ TEXT_TOKENS.fontWeight.bold,
7455
+ TEXT_TOKENS.lineHeight.tight,
7456
+ TEXT_TOKENS.letterSpacing.tight
7457
+ ],
7458
+ 2: [
7459
+ TEXT_TOKENS.fontSize["4xl"],
7460
+ TEXT_TOKENS.fontWeight.bold,
7461
+ TEXT_TOKENS.lineHeight.tight,
7462
+ TEXT_TOKENS.letterSpacing.tight
7463
+ ],
7464
+ 3: [
7465
+ TEXT_TOKENS.fontSize["3xl"],
7466
+ TEXT_TOKENS.fontWeight.semibold,
7467
+ TEXT_TOKENS.lineHeight.snug,
7468
+ TEXT_TOKENS.letterSpacing.normal
7469
+ ],
7470
+ 4: [
7471
+ TEXT_TOKENS.fontSize["2xl"],
7472
+ TEXT_TOKENS.fontWeight.semibold,
7473
+ TEXT_TOKENS.lineHeight.snug,
7474
+ TEXT_TOKENS.letterSpacing.normal
7475
+ ],
7476
+ 5: [
7477
+ TEXT_TOKENS.fontSize.xl,
7478
+ TEXT_TOKENS.fontWeight.medium,
7479
+ TEXT_TOKENS.lineHeight.normal,
7480
+ TEXT_TOKENS.letterSpacing.normal
7481
+ ],
7482
+ 6: [
7483
+ TEXT_TOKENS.fontSize.lg,
7484
+ TEXT_TOKENS.fontWeight.medium,
7485
+ TEXT_TOKENS.lineHeight.normal,
7486
+ TEXT_TOKENS.letterSpacing.normal
7487
+ ]
7488
+ };
7489
+ var levelVariants = Object.entries(levelConfig).reduce(
7490
+ (acc, [level, [fontSize2, defaultWeight, lineHeight2, letterSpacing2]]) => {
7491
+ acc[Number(level)] = `${fontSize2} ${defaultWeight} ${lineHeight2} ${letterSpacing2}`;
7492
+ return acc;
7493
+ },
7494
+ {}
7495
+ );
7496
+ var generateWeightVariants = () => {
7497
+ const weights = [
7498
+ "normal",
7499
+ "medium",
7500
+ "semibold",
7501
+ "bold"
7502
+ ];
7503
+ const levels = [1, 2, 3, 4, 5, 6];
7504
+ const variants = [];
7505
+ for (const level of levels) {
7506
+ const [fontSize2, , lineHeight2, letterSpacing2] = levelConfig[level];
7507
+ for (const weight of weights) {
7508
+ variants.push({
7509
+ level,
7510
+ weight,
7511
+ class: `${fontSize2} ${TEXT_TOKENS.fontWeight[weight]} ${lineHeight2} ${letterSpacing2}`
7512
+ });
7513
+ }
7514
+ }
7515
+ return variants;
7516
+ };
6621
7517
  var headingVariants = cva("font-display text-foreground", {
6622
7518
  variants: {
6623
- level: {
6624
- 1: "text-5xl font-bold leading-tight tracking-tight",
6625
- 2: "text-4xl font-bold leading-tight tracking-tight",
6626
- 3: "text-3xl font-semibold leading-snug tracking-normal",
6627
- 4: "text-2xl font-semibold leading-snug tracking-normal",
6628
- 5: "text-xl font-medium leading-normal tracking-normal",
6629
- 6: "text-lg font-medium leading-normal tracking-normal"
6630
- },
7519
+ level: levelVariants,
6631
7520
  weight: {
6632
- normal: "font-normal",
6633
- medium: "font-medium",
6634
- semibold: "font-semibold",
6635
- bold: "font-bold"
7521
+ normal: TEXT_TOKENS.fontWeight.normal,
7522
+ medium: TEXT_TOKENS.fontWeight.medium,
7523
+ semibold: TEXT_TOKENS.fontWeight.semibold,
7524
+ bold: TEXT_TOKENS.fontWeight.bold
6636
7525
  },
6637
7526
  muted: {
6638
7527
  true: "text-muted-foreground",
6639
7528
  false: ""
6640
7529
  }
6641
7530
  },
6642
- compoundVariants: [
6643
- {
6644
- level: 1,
6645
- weight: "normal",
6646
- class: "text-5xl font-normal"
6647
- },
6648
- {
6649
- level: 1,
6650
- weight: "medium",
6651
- class: "text-5xl font-medium"
6652
- },
6653
- {
6654
- level: 1,
6655
- weight: "semibold",
6656
- class: "text-5xl font-semibold"
6657
- },
6658
- {
6659
- level: 1,
6660
- weight: "bold",
6661
- class: "text-5xl font-bold"
6662
- },
6663
- {
6664
- level: 2,
6665
- weight: "normal",
6666
- class: "text-4xl font-normal"
6667
- },
6668
- {
6669
- level: 2,
6670
- weight: "medium",
6671
- class: "text-4xl font-medium"
6672
- },
6673
- {
6674
- level: 2,
6675
- weight: "semibold",
6676
- class: "text-4xl font-semibold"
6677
- },
6678
- {
6679
- level: 2,
6680
- weight: "bold",
6681
- class: "text-4xl font-bold"
6682
- },
6683
- {
6684
- level: 3,
6685
- weight: "normal",
6686
- class: "text-3xl font-normal"
6687
- },
6688
- {
6689
- level: 3,
6690
- weight: "medium",
6691
- class: "text-3xl font-medium"
6692
- },
6693
- {
6694
- level: 3,
6695
- weight: "semibold",
6696
- class: "text-3xl font-semibold"
6697
- },
6698
- {
6699
- level: 3,
6700
- weight: "bold",
6701
- class: "text-3xl font-bold"
6702
- },
6703
- {
6704
- level: 4,
6705
- weight: "normal",
6706
- class: "text-2xl font-normal"
6707
- },
6708
- {
6709
- level: 4,
6710
- weight: "medium",
6711
- class: "text-2xl font-medium"
6712
- },
6713
- {
6714
- level: 4,
6715
- weight: "semibold",
6716
- class: "text-2xl font-semibold"
6717
- },
6718
- {
6719
- level: 4,
6720
- weight: "bold",
6721
- class: "text-2xl font-bold"
6722
- },
6723
- {
6724
- level: 5,
6725
- weight: "normal",
6726
- class: "text-xl font-normal"
6727
- },
6728
- {
6729
- level: 5,
6730
- weight: "medium",
6731
- class: "text-xl font-medium"
6732
- },
6733
- {
6734
- level: 5,
6735
- weight: "semibold",
6736
- class: "text-xl font-semibold"
6737
- },
6738
- {
6739
- level: 5,
6740
- weight: "bold",
6741
- class: "text-xl font-bold"
6742
- },
6743
- {
6744
- level: 6,
6745
- weight: "normal",
6746
- class: "text-lg font-normal"
6747
- },
6748
- {
6749
- level: 6,
6750
- weight: "medium",
6751
- class: "text-lg font-medium"
6752
- },
6753
- {
6754
- level: 6,
6755
- weight: "semibold",
6756
- class: "text-lg font-semibold"
6757
- },
6758
- {
6759
- level: 6,
6760
- weight: "bold",
6761
- class: "text-lg font-bold"
6762
- }
6763
- ],
7531
+ compoundVariants: generateWeightVariants(),
6764
7532
  defaultVariants: {
6765
7533
  level: 1,
6766
7534
  muted: false
@@ -6784,8 +7552,8 @@ Heading.displayName = "Heading";
6784
7552
  var leadVariants = cva("font-sans text-foreground", {
6785
7553
  variants: {
6786
7554
  size: {
6787
- lg: "text-lg leading-normal tracking-normal",
6788
- xl: "text-xl leading-normal tracking-normal"
7555
+ lg: `${TEXT_TOKENS.fontSize.lg} ${TEXT_TOKENS.lineHeight.normal} ${TEXT_TOKENS.letterSpacing.normal}`,
7556
+ xl: `${TEXT_TOKENS.fontSize.xl} ${TEXT_TOKENS.lineHeight.normal} ${TEXT_TOKENS.letterSpacing.normal}`
6789
7557
  },
6790
7558
  muted: {
6791
7559
  true: "text-muted-foreground",
@@ -6922,7 +7690,7 @@ function getSpacingPx(token) {
6922
7690
  return 4;
6923
7691
  }
6924
7692
  var selectTriggerVariants = cva(
6925
- `flex items-center justify-between outline-none ring-offset-background focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed [&>span]:line-clamp-1`,
7693
+ `flex items-center justify-between outline-none ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed [&>span]:line-clamp-1`,
6926
7694
  {
6927
7695
  variants: {
6928
7696
  size: {
@@ -7381,7 +8149,7 @@ var ModalClose = React49.forwardRef(
7381
8149
  MODAL_TOKENS.close.radius,
7382
8150
  MODAL_TOKENS.close.opacity.default,
7383
8151
  MODAL_TOKENS.close.opacity.hover,
7384
- "ring-offset-background transition-opacity focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground",
8152
+ "ring-offset-background transition-opacity focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground",
7385
8153
  className
7386
8154
  ),
7387
8155
  ...props,
@@ -7973,8 +8741,10 @@ var Input = React49.forwardRef(
7973
8741
  }
7974
8742
  return void 0;
7975
8743
  });
8744
+ const baseVariant = getBaseValue(variant);
8745
+ const baseSize = getBaseValue(size3);
7976
8746
  const inputClasses = cn(
7977
- inputVariants({ variant, size: size3, state, fullWidth }),
8747
+ inputVariants({ variant: baseVariant, size: baseSize, state, fullWidth }),
7978
8748
  // Add padding for icons if present
7979
8749
  iconLeft && INPUT_TOKENS.icon.paddingLeft,
7980
8750
  iconRight && INPUT_TOKENS.icon.paddingRight,
@@ -8312,31 +9082,31 @@ var Radio = React49.forwardRef(
8312
9082
  );
8313
9083
  Radio.displayName = "Radio";
8314
9084
  var textareaVariants = cva(
8315
- `flex min-h-[80px] ${INPUT_TOKENS.shadow} ${MOTION_TOKENS.transition.colors} disabled:cursor-not-allowed focus-visible:outline-none resize-y`,
9085
+ `flex min-h-[80px] ${TEXTAREA_TOKENS.shadow} ${MOTION_TOKENS.transition.colors} disabled:cursor-not-allowed focus-visible:outline-none resize-y`,
8316
9086
  {
8317
9087
  variants: {
8318
9088
  variant: {
8319
- primary: `${INPUT_TOKENS.variant.primary.border} ${INPUT_TOKENS.variant.primary.background} ${INPUT_TOKENS.variant.primary.text} ${INPUT_TOKENS.state.text.placeholder} ${INPUT_TOKENS.variant.primary.focus}`,
8320
- secondary: `${INPUT_TOKENS.variant.secondary.border} ${INPUT_TOKENS.variant.secondary.background} ${INPUT_TOKENS.variant.secondary.text} ${INPUT_TOKENS.state.text.placeholder} ${INPUT_TOKENS.variant.secondary.focus}`,
8321
- outline: `${INPUT_TOKENS.variant.outline.border} ${INPUT_TOKENS.variant.outline.background} ${INPUT_TOKENS.variant.outline.text} ${INPUT_TOKENS.state.text.placeholder} ${INPUT_TOKENS.variant.outline.focus}`,
8322
- ghost: `${INPUT_TOKENS.variant.ghost.border} ${INPUT_TOKENS.variant.ghost.background} ${INPUT_TOKENS.variant.ghost.text} ${INPUT_TOKENS.state.text.placeholder} ${INPUT_TOKENS.variant.ghost.focus}`,
8323
- destructive: `${INPUT_TOKENS.variant.destructive.border} ${INPUT_TOKENS.variant.destructive.background} ${INPUT_TOKENS.variant.destructive.text} ${INPUT_TOKENS.state.text.placeholder} ${INPUT_TOKENS.variant.destructive.focus}`
9089
+ primary: `${TEXTAREA_TOKENS.variant.primary.border} ${TEXTAREA_TOKENS.variant.primary.background} ${TEXTAREA_TOKENS.variant.primary.text} ${TEXTAREA_TOKENS.state.text.placeholder} ${TEXTAREA_TOKENS.variant.primary.focus}`,
9090
+ secondary: `${TEXTAREA_TOKENS.variant.secondary.border} ${TEXTAREA_TOKENS.variant.secondary.background} ${TEXTAREA_TOKENS.variant.secondary.text} ${TEXTAREA_TOKENS.state.text.placeholder} ${TEXTAREA_TOKENS.variant.secondary.focus}`,
9091
+ outline: `${TEXTAREA_TOKENS.variant.outline.border} ${TEXTAREA_TOKENS.variant.outline.background} ${TEXTAREA_TOKENS.variant.outline.text} ${TEXTAREA_TOKENS.state.text.placeholder} ${TEXTAREA_TOKENS.variant.outline.focus}`,
9092
+ ghost: `${TEXTAREA_TOKENS.variant.ghost.border} ${TEXTAREA_TOKENS.variant.ghost.background} ${TEXTAREA_TOKENS.variant.ghost.text} ${TEXTAREA_TOKENS.state.text.placeholder} ${TEXTAREA_TOKENS.variant.ghost.focus}`,
9093
+ destructive: `${TEXTAREA_TOKENS.variant.destructive.border} ${TEXTAREA_TOKENS.variant.destructive.background} ${TEXTAREA_TOKENS.variant.destructive.text} ${TEXTAREA_TOKENS.state.text.placeholder} ${TEXTAREA_TOKENS.variant.destructive.focus}`
8324
9094
  },
8325
9095
  size: {
8326
- xs: `${INPUT_TOKENS.size.xs.padding.horizontal} ${INPUT_TOKENS.size.xs.padding.vertical} ${INPUT_TOKENS.size.xs.radius} ${INPUT_TOKENS.size.xs.fontSize}`,
8327
- sm: `${INPUT_TOKENS.size.sm.padding.horizontal} ${INPUT_TOKENS.size.sm.padding.vertical} ${INPUT_TOKENS.size.sm.radius} ${INPUT_TOKENS.size.sm.fontSize}`,
8328
- md: `${INPUT_TOKENS.size.md.padding.horizontal} ${INPUT_TOKENS.size.md.padding.vertical} ${INPUT_TOKENS.size.md.radius} ${INPUT_TOKENS.size.md.fontSize} ${INPUT_TOKENS.size.md.fontSizeResponsive}`,
8329
- lg: `${INPUT_TOKENS.size.lg.padding.horizontal} ${INPUT_TOKENS.size.lg.padding.vertical} ${INPUT_TOKENS.size.lg.radius} ${INPUT_TOKENS.size.lg.fontSize}`,
8330
- xl: `${INPUT_TOKENS.size.xl.padding.horizontal} ${INPUT_TOKENS.size.xl.padding.vertical} ${INPUT_TOKENS.size.xl.radius} ${INPUT_TOKENS.size.xl.fontSize}`
9096
+ xs: `${TEXTAREA_TOKENS.size.xs.padding.horizontal} ${TEXTAREA_TOKENS.size.xs.padding.vertical} ${TEXTAREA_TOKENS.size.xs.radius} ${TEXTAREA_TOKENS.size.xs.fontSize}`,
9097
+ sm: `${TEXTAREA_TOKENS.size.sm.padding.horizontal} ${TEXTAREA_TOKENS.size.sm.padding.vertical} ${TEXTAREA_TOKENS.size.sm.radius} ${TEXTAREA_TOKENS.size.sm.fontSize}`,
9098
+ md: `${TEXTAREA_TOKENS.size.md.padding.horizontal} ${TEXTAREA_TOKENS.size.md.padding.vertical} ${TEXTAREA_TOKENS.size.md.radius} ${TEXTAREA_TOKENS.size.md.fontSize} ${TEXTAREA_TOKENS.size.md.fontSizeResponsive}`,
9099
+ lg: `${TEXTAREA_TOKENS.size.lg.padding.horizontal} ${TEXTAREA_TOKENS.size.lg.padding.vertical} ${TEXTAREA_TOKENS.size.lg.radius} ${TEXTAREA_TOKENS.size.lg.fontSize}`,
9100
+ xl: `${TEXTAREA_TOKENS.size.xl.padding.horizontal} ${TEXTAREA_TOKENS.size.xl.padding.vertical} ${TEXTAREA_TOKENS.size.xl.radius} ${TEXTAREA_TOKENS.size.xl.fontSize}`
8331
9101
  },
8332
9102
  state: {
8333
- default: `${INPUT_TOKENS.state.border.default} ${INPUT_TOKENS.state.background.default} ${INPUT_TOKENS.state.text.default} ${INPUT_TOKENS.state.text.placeholder} ${INPUT_TOKENS.state.border.focus}`,
8334
- error: `${INPUT_TOKENS.state.border.error} ${INPUT_TOKENS.state.background.default} ${INPUT_TOKENS.state.text.default} ${INPUT_TOKENS.state.text.placeholder} ${INPUT_TOKENS.state.border.focus}`,
8335
- success: `${INPUT_TOKENS.state.border.success} ${INPUT_TOKENS.state.background.default} ${INPUT_TOKENS.state.text.default} ${INPUT_TOKENS.state.text.placeholder} ${INPUT_TOKENS.state.border.focus}`,
8336
- disabled: `${INPUT_TOKENS.state.border.disabled} ${INPUT_TOKENS.state.background.disabled} ${INPUT_TOKENS.state.text.default} ${INPUT_TOKENS.state.text.placeholder} ${INPUT_TOKENS.state.text.disabled}`
9103
+ default: `${TEXTAREA_TOKENS.state.border.default} ${TEXTAREA_TOKENS.state.background.default} ${TEXTAREA_TOKENS.state.text.default} ${TEXTAREA_TOKENS.state.text.placeholder} ${TEXTAREA_TOKENS.state.border.focus}`,
9104
+ error: `${TEXTAREA_TOKENS.state.border.error} ${TEXTAREA_TOKENS.state.background.default} ${TEXTAREA_TOKENS.state.text.default} ${TEXTAREA_TOKENS.state.text.placeholder} ${TEXTAREA_TOKENS.state.border.focus}`,
9105
+ success: `${TEXTAREA_TOKENS.state.border.success} ${TEXTAREA_TOKENS.state.background.default} ${TEXTAREA_TOKENS.state.text.default} ${TEXTAREA_TOKENS.state.text.placeholder} ${TEXTAREA_TOKENS.state.border.focus}`,
9106
+ disabled: `${TEXTAREA_TOKENS.state.border.disabled} ${TEXTAREA_TOKENS.state.background.disabled} ${TEXTAREA_TOKENS.state.text.default} ${TEXTAREA_TOKENS.state.text.placeholder} ${TEXTAREA_TOKENS.state.text.disabled}`
8337
9107
  },
8338
9108
  fullWidth: {
8339
- true: INPUT_TOKENS.width.full,
9109
+ true: TEXTAREA_TOKENS.width.full,
8340
9110
  false: ""
8341
9111
  }
8342
9112
  },
@@ -8380,7 +9150,7 @@ var Textarea = React49.forwardRef(
8380
9150
  const currentLength = typeof currentValue === "string" ? currentValue.length : 0;
8381
9151
  const shouldShowCounter = showCharacterCount && maxLength !== void 0;
8382
9152
  if (shouldShowCounter) {
8383
- return /* @__PURE__ */ jsxs("div", { className: cn("relative", fullWidth !== false && INPUT_TOKENS.width.full), children: [
9153
+ return /* @__PURE__ */ jsxs("div", { className: cn("relative", fullWidth !== false && TEXTAREA_TOKENS.width.full), children: [
8384
9154
  /* @__PURE__ */ jsx(
8385
9155
  "textarea",
8386
9156
  {
@@ -8400,11 +9170,11 @@ var Textarea = React49.forwardRef(
8400
9170
  {
8401
9171
  className: cn(
8402
9172
  "absolute",
8403
- INPUT_TOKENS.message.position.bottom,
8404
- INPUT_TOKENS.message.position.right,
9173
+ TEXTAREA_TOKENS.message.position.bottom,
9174
+ TEXTAREA_TOKENS.message.position.right,
8405
9175
  TEXT_TOKENS.fontSize.xs,
8406
- INPUT_TOKENS.message.color.default,
8407
- currentLength > maxLength && INPUT_TOKENS.message.color.error
9176
+ TEXTAREA_TOKENS.message.color.default,
9177
+ currentLength > maxLength && TEXTAREA_TOKENS.message.color.error
8408
9178
  ),
8409
9179
  children: [
8410
9180
  currentLength,
@@ -8439,45 +9209,6 @@ function shadowToClass(value) {
8439
9209
  if (!value || value === "none") return void 0;
8440
9210
  return `shadow-${value}`;
8441
9211
  }
8442
- function displayToClass(value) {
8443
- if (!value) return void 0;
8444
- if (value === "inline") return "inline";
8445
- if (value === "inline-block") return "inline-block";
8446
- if (value === "flex") return "flex";
8447
- if (value === "inline-flex") return "inline-flex";
8448
- if (value === "grid") return "grid";
8449
- if (value === "inline-grid") return "inline-grid";
8450
- if (value === "block") return "block";
8451
- if (value === "none") return "hidden";
8452
- return void 0;
8453
- }
8454
- function flexDirectionToClass(value) {
8455
- if (!value) return void 0;
8456
- if (value === "row") return "flex-row";
8457
- if (value === "column") return "flex-col";
8458
- if (value === "row-reverse") return "flex-row-reverse";
8459
- if (value === "column-reverse") return "flex-col-reverse";
8460
- return void 0;
8461
- }
8462
- function alignToClass(value) {
8463
- if (!value) return void 0;
8464
- if (value === "start") return "items-start";
8465
- if (value === "end") return "items-end";
8466
- if (value === "center") return "items-center";
8467
- if (value === "baseline") return "items-baseline";
8468
- if (value === "stretch") return "items-stretch";
8469
- return void 0;
8470
- }
8471
- function justifyToClass(value) {
8472
- if (!value) return void 0;
8473
- if (value === "start") return "justify-start";
8474
- if (value === "end") return "justify-end";
8475
- if (value === "center") return "justify-center";
8476
- if (value === "between") return "justify-between";
8477
- if (value === "around") return "justify-around";
8478
- if (value === "evenly") return "justify-evenly";
8479
- return void 0;
8480
- }
8481
9212
  var Box = React49.forwardRef(
8482
9213
  ({
8483
9214
  as: Component = "div",
@@ -8495,14 +9226,9 @@ var Box = React49.forwardRef(
8495
9226
  mr,
8496
9227
  mb,
8497
9228
  ml,
8498
- display,
8499
- flexDirection,
8500
9229
  radius,
8501
9230
  shadow,
8502
9231
  bg,
8503
- gap,
8504
- align,
8505
- justify,
8506
9232
  className,
8507
9233
  style,
8508
9234
  ...props
@@ -8523,7 +9249,6 @@ var Box = React49.forwardRef(
8523
9249
  const mlValue = getBaseValue2(ml);
8524
9250
  const radiusValue = getBaseValue2(radius);
8525
9251
  const bgValue = getBaseValue2(bg);
8526
- const gapValue = getBaseValue2(gap);
8527
9252
  const inlineStyles = {
8528
9253
  ...pValue !== void 0 && { padding: getSpacingCSSVar(String(pValue)) },
8529
9254
  ...!p && pxValue !== void 0 && {
@@ -8553,18 +9278,9 @@ var Box = React49.forwardRef(
8553
9278
  ...!m && !mx && mlValue !== void 0 && { marginLeft: getSpacingCSSVar(String(mlValue)) },
8554
9279
  ...radiusValue !== void 0 && { borderRadius: getRadiusCSSVar(radiusValue) },
8555
9280
  ...bgValue !== void 0 && { backgroundColor: getColorCSSVar(bgValue) },
8556
- ...gapValue !== void 0 && { gap: getSpacingCSSVar(String(gapValue)) },
8557
9281
  ...style
8558
9282
  };
8559
9283
  const classes = cn(
8560
- // Display
8561
- displayToClass(display),
8562
- // Flex direction
8563
- flexDirectionToClass(flexDirection),
8564
- // Align
8565
- alignToClass(align),
8566
- // Justify
8567
- justifyToClass(justify),
8568
9284
  // Shadow
8569
9285
  shadowToClass(shadow),
8570
9286
  className
@@ -8575,18 +9291,46 @@ var Box = React49.forwardRef(
8575
9291
  }
8576
9292
  );
8577
9293
  Box.displayName = "Box";
9294
+ function alignToClass(value) {
9295
+ if (!value) return void 0;
9296
+ if (value === "start") return "items-start";
9297
+ if (value === "end") return "items-end";
9298
+ if (value === "center") return "items-center";
9299
+ if (value === "baseline") return "items-baseline";
9300
+ if (value === "stretch") return "items-stretch";
9301
+ return void 0;
9302
+ }
9303
+ function justifyToClass(value) {
9304
+ if (!value) return void 0;
9305
+ if (value === "start") return "justify-start";
9306
+ if (value === "end") return "justify-end";
9307
+ if (value === "center") return "justify-center";
9308
+ if (value === "between") return "justify-between";
9309
+ if (value === "around") return "justify-around";
9310
+ if (value === "evenly") return "justify-evenly";
9311
+ return void 0;
9312
+ }
8578
9313
  var Stack = React49.forwardRef(
8579
- ({ direction = "vertical", spacing: spacing2, gap, align, justify, ...props }, ref) => {
9314
+ ({ direction = "vertical", spacing: spacing2, gap, align, justify, className, style, ...props }, ref) => {
8580
9315
  const gapValue = spacing2 ?? gap;
9316
+ const gapBaseValue = getBaseValue(gapValue);
9317
+ const flexClasses = cn(
9318
+ "flex",
9319
+ direction === "horizontal" ? "flex-row" : "flex-col",
9320
+ alignToClass(align),
9321
+ justifyToClass(justify),
9322
+ className
9323
+ );
9324
+ const inlineStyles = {
9325
+ ...gapBaseValue !== void 0 && { gap: getSpacingCSSVar(String(gapBaseValue)) },
9326
+ ...style
9327
+ };
8581
9328
  return /* @__PURE__ */ jsx(
8582
9329
  Box,
8583
9330
  {
8584
9331
  ref,
8585
- display: "flex",
8586
- flexDirection: direction === "horizontal" ? "row" : "column",
8587
- gap: gapValue,
8588
- align,
8589
- justify,
9332
+ className: flexClasses,
9333
+ style: Object.keys(inlineStyles).length > 0 ? inlineStyles : void 0,
8590
9334
  ...props
8591
9335
  }
8592
9336
  );
@@ -8697,7 +9441,7 @@ function getFlexBaseValue(value) {
8697
9441
  }
8698
9442
  return value;
8699
9443
  }
8700
- function flexDirectionToClass2(value) {
9444
+ function flexDirectionToClass(value) {
8701
9445
  if (!value) return void 0;
8702
9446
  if (value === "row") return "flex-row";
8703
9447
  if (value === "column") return "flex-col";
@@ -8750,8 +9494,10 @@ var Flex = React49.forwardRef(
8750
9494
  const alignValue = getFlexBaseValue(align);
8751
9495
  const justifyValue = getFlexBaseValue(justify);
8752
9496
  const basisValue = getFlexBaseValue(basis);
9497
+ const gapBaseValue = getBaseValue(gap);
8753
9498
  const flexClasses = cn(
8754
- flexDirectionToClass2(directionValue),
9499
+ "flex",
9500
+ flexDirectionToClass(directionValue),
8755
9501
  flexWrapToClass(wrapValue),
8756
9502
  growToClass(grow),
8757
9503
  shrinkToClass(shrink),
@@ -8770,15 +9516,13 @@ var Flex = React49.forwardRef(
8770
9516
  })();
8771
9517
  const flexStyle = {
8772
9518
  ...flexBasisCSS ? { flexBasis: flexBasisCSS } : {},
9519
+ ...gapBaseValue !== void 0 && { gap: getSpacingCSSVar(String(gapBaseValue)) },
8773
9520
  ...style
8774
9521
  };
8775
9522
  return /* @__PURE__ */ jsx(
8776
9523
  Box,
8777
9524
  {
8778
9525
  ref,
8779
- display: "flex",
8780
- flexDirection: directionValue,
8781
- gap,
8782
9526
  className: flexClasses,
8783
9527
  style: Object.keys(flexStyle).length > 0 ? flexStyle : void 0,
8784
9528
  ...props
@@ -8845,7 +9589,22 @@ function justifyToClass3(value) {
8845
9589
  return void 0;
8846
9590
  }
8847
9591
  var Grid = React49.forwardRef(
8848
- ({ cols, sm, md, lg, xl, "2xl": xl2, rows, gap, flow, align, justify, className, ...props }, ref) => {
9592
+ ({
9593
+ cols,
9594
+ sm,
9595
+ md,
9596
+ lg,
9597
+ xl,
9598
+ "2xl": xl2,
9599
+ rows,
9600
+ gap,
9601
+ flow,
9602
+ align,
9603
+ justify,
9604
+ className,
9605
+ style,
9606
+ ...props
9607
+ }, ref) => {
8849
9608
  let colsValue = cols;
8850
9609
  if (sm || md || lg || xl || xl2) {
8851
9610
  if (cols !== void 0 && typeof cols !== "object") {
@@ -8914,23 +9673,25 @@ var Grid = React49.forwardRef(
8914
9673
  justifyToClass3(justifyValue),
8915
9674
  className
8916
9675
  );
8917
- return /* @__PURE__ */ jsx(Box, { ref, display: "grid", gap, className: gridClasses, ...props });
9676
+ const gapBaseValue = gap ? getBaseValue(gap) : void 0;
9677
+ const gridStyle = {
9678
+ ...gapBaseValue !== void 0 && { gap: getSpacingCSSVar(String(gapBaseValue)) },
9679
+ ...style
9680
+ };
9681
+ return /* @__PURE__ */ jsx(
9682
+ Box,
9683
+ {
9684
+ ref,
9685
+ className: cn("grid", gridClasses),
9686
+ style: Object.keys(gridStyle).length > 0 ? gridStyle : void 0,
9687
+ ...props
9688
+ }
9689
+ );
8918
9690
  }
8919
9691
  );
8920
9692
  Grid.displayName = "Grid";
8921
- var Row = React49.forwardRef(({ gap, align, justify, ...props }, ref) => {
8922
- return /* @__PURE__ */ jsx(
8923
- Box,
8924
- {
8925
- ref,
8926
- display: "flex",
8927
- flexDirection: "row",
8928
- gap,
8929
- align,
8930
- justify,
8931
- ...props
8932
- }
8933
- );
9693
+ var Row = React49.forwardRef((props, ref) => {
9694
+ return /* @__PURE__ */ jsx(Stack, { ref, direction: "horizontal", ...props });
8934
9695
  });
8935
9696
  Row.displayName = "Row";
8936
9697
  var surfaceVariants = cva("", {
@@ -8965,7 +9726,7 @@ var labelVariants = cva(
8965
9726
  var Label2 = React49.forwardRef(
8966
9727
  ({ className, required, children, ...props }, ref) => /* @__PURE__ */ jsxs(LabelPrimitive.Root, { ref, className: cn(labelVariants(), className), ...props, children: [
8967
9728
  children,
8968
- required && /* @__PURE__ */ jsx("span", { className: cn(INPUT_TOKENS.label.requiredMark, "ml-xs"), children: "*" })
9729
+ required && /* @__PURE__ */ jsx("span", { className: cn(FORM_TOKENS.label.requiredMark, "ml-xs"), children: "*" })
8969
9730
  ] })
8970
9731
  );
8971
9732
  Label2.displayName = LabelPrimitive.Root.displayName;
@@ -9312,7 +10073,7 @@ var ToastRoot = React49.forwardRef(
9312
10073
  altText: toast.action.label,
9313
10074
  onClick: toast.action.onClick,
9314
10075
  className: cn(
9315
- "inline-flex shrink-0 items-center justify-center rounded-md border bg-transparent font-medium transition-colors hover:bg-secondary focus:outline-none focus:ring-1 focus:ring-ring disabled:pointer-events-none disabled:opacity-50",
10076
+ "inline-flex shrink-0 items-center justify-center rounded-md border bg-transparent font-medium transition-colors hover:bg-secondary focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50",
9316
10077
  TOAST_TOKENS.action.height,
9317
10078
  TOAST_TOKENS.action.padding,
9318
10079
  TOAST_TOKENS.action.fontSize
@@ -9370,7 +10131,7 @@ var ToastAction = React49.forwardRef(({ className, ...props }, ref) => /* @__PUR
9370
10131
  {
9371
10132
  ref,
9372
10133
  className: cn(
9373
- "inline-flex shrink-0 items-center justify-center rounded-md border bg-transparent font-medium transition-colors hover:bg-secondary focus:outline-none focus:ring-1 focus:ring-ring disabled:pointer-events-none disabled:opacity-50",
10134
+ "inline-flex shrink-0 items-center justify-center rounded-md border bg-transparent font-medium transition-colors hover:bg-secondary focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50",
9374
10135
  TOAST_TOKENS.action.height,
9375
10136
  TOAST_TOKENS.action.padding,
9376
10137
  TOAST_TOKENS.action.fontSize,
@@ -9810,7 +10571,7 @@ var NotificationCenterItem = React49.forwardRef(
9810
10571
  size: "icon",
9811
10572
  onClick: handleDismiss,
9812
10573
  "aria-label": "Dismiss notification",
9813
- className: "absolute right-xs top-xs h-6 w-6 opacity-0 transition-opacity hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-1 group-hover:opacity-100",
10574
+ className: "absolute right-xs top-xs h-6 w-6 opacity-0 transition-opacity hover:text-foreground focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-1 group-hover:opacity-100",
9814
10575
  children: /* @__PURE__ */ jsx(X, { className: "h-4 w-4" })
9815
10576
  }
9816
10577
  )
@@ -10371,7 +11132,7 @@ var PopoverArrow = React49.forwardRef(
10371
11132
  );
10372
11133
  PopoverArrow.displayName = "PopoverArrow";
10373
11134
 
10374
- // node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs
11135
+ // node_modules/.pnpm/@floating-ui+utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs
10375
11136
  var min = Math.min;
10376
11137
  var max = Math.max;
10377
11138
  var round = Math.round;
@@ -10502,7 +11263,7 @@ function rectToClientRect(rect) {
10502
11263
  };
10503
11264
  }
10504
11265
 
10505
- // node_modules/@floating-ui/core/dist/floating-ui.core.mjs
11266
+ // node_modules/.pnpm/@floating-ui+core@1.7.3/node_modules/@floating-ui/core/dist/floating-ui.core.mjs
10506
11267
  function computeCoordsFromPlacement(_ref, placement, rtl) {
10507
11268
  let {
10508
11269
  reference,
@@ -10947,7 +11708,7 @@ var shift = function(options) {
10947
11708
  };
10948
11709
  };
10949
11710
 
10950
- // node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs
11711
+ // node_modules/.pnpm/@floating-ui+utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs
10951
11712
  function hasWindow() {
10952
11713
  return typeof window !== "undefined";
10953
11714
  }
@@ -11100,7 +11861,7 @@ function getFrameElement(win) {
11100
11861
  return win.parent && Object.getPrototypeOf(win.parent) ? win.frameElement : null;
11101
11862
  }
11102
11863
 
11103
- // node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs
11864
+ // node_modules/.pnpm/@floating-ui+dom@1.7.4/node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs
11104
11865
  function getCssDimensions(element) {
11105
11866
  const css = getComputedStyle2(element);
11106
11867
  let width = parseFloat(css.width) || 0;
@@ -11954,7 +12715,7 @@ function usePositioning({
11954
12715
  return offsetValue;
11955
12716
  }
11956
12717
  const baseOffset = getBaseValue(offsetValue);
11957
- return baseOffset ? getSpacingPx(baseOffset) : 4;
12718
+ return baseOffset ? getSpacingPx(baseOffset) : getSpacingPx(1);
11958
12719
  }, [offsetValue]);
11959
12720
  React49.useEffect(() => {
11960
12721
  setMounted(true);
@@ -11965,7 +12726,7 @@ function usePositioning({
11965
12726
  middlewareArray.push(flip3());
11966
12727
  }
11967
12728
  if (enableShift) {
11968
- middlewareArray.push(shift3({ padding: 8 }));
12729
+ middlewareArray.push(shift3({ padding: getSpacingPx(2) }));
11969
12730
  }
11970
12731
  return middlewareArray;
11971
12732
  }, [offsetPx, enableFlip, enableShift]);
@@ -12324,7 +13085,7 @@ var DropdownMenuItem = React49.forwardRef(
12324
13085
  MENU_TOKENS.item.padding.md,
12325
13086
  MENU_TOKENS.item.radius.md,
12326
13087
  inset && "pl-8",
12327
- !disabled && "focus:bg-accent focus:text-accent-foreground",
13088
+ !disabled && "focus-visible:bg-accent focus-visible:text-accent-foreground",
12328
13089
  selected && "bg-accent/50",
12329
13090
  disabled && "pointer-events-none opacity-50",
12330
13091
  className
@@ -12807,9 +13568,9 @@ var CONTEXT_MENU_TOKENS = {
12807
13568
  radius: "rounded-sm",
12808
13569
  // 4px (0.25rem)
12809
13570
  focus: {
12810
- background: "focus:bg-[hsl(var(--accent))]",
13571
+ background: "focus-visible:bg-[hsl(var(--accent))]",
12811
13572
  // Focus background using CSS var
12812
- text: "focus:text-[hsl(var(--accent-foreground))]"
13573
+ text: "focus-visible:text-[hsl(var(--accent-foreground))]"
12813
13574
  // Focus text using CSS var
12814
13575
  },
12815
13576
  disabled: {
@@ -13197,7 +13958,7 @@ var Skeleton = React49.forwardRef(
13197
13958
  Skeleton.displayName = "Skeleton";
13198
13959
  var EmptyStateAction = React49.forwardRef(
13199
13960
  ({ className, children, ...props }, ref) => {
13200
- return /* @__PURE__ */ jsx("div", { ref, className: cn("mt-2", className), ...props, children });
13961
+ return /* @__PURE__ */ jsx("div", { ref, className: cn(EMPTY_STATE_TOKENS.spacing.action, className), ...props, children });
13201
13962
  }
13202
13963
  );
13203
13964
  EmptyStateAction.displayName = "EmptyStateAction";
@@ -13208,9 +13969,10 @@ var EmptyStateDescription = React49.forwardRef(
13208
13969
  {
13209
13970
  ref,
13210
13971
  className: cn(
13211
- DATA_TOKENS.emptyState.typography.description.fontSize,
13212
- DATA_TOKENS.emptyState.typography.description.fontWeight,
13213
- "max-w-md text-muted-foreground",
13972
+ EMPTY_STATE_TOKENS.typography.description.fontSize,
13973
+ EMPTY_STATE_TOKENS.typography.description.fontWeight,
13974
+ EMPTY_STATE_TOKENS.typography.description.color,
13975
+ EMPTY_STATE_TOKENS.typography.description.maxWidth,
13214
13976
  className
13215
13977
  ),
13216
13978
  ...props,
@@ -13222,16 +13984,12 @@ var EmptyStateDescription = React49.forwardRef(
13222
13984
  EmptyStateDescription.displayName = "EmptyStateDescription";
13223
13985
  var EmptyStateIcon = React49.forwardRef(
13224
13986
  ({ children, size: size3 = "md", className, ...props }, ref) => {
13225
- const iconSizeClass = DATA_TOKENS.emptyState.iconSize[size3];
13987
+ const iconSizeClass = EMPTY_STATE_TOKENS.icon.size[size3];
13226
13988
  return /* @__PURE__ */ jsx(
13227
13989
  "div",
13228
13990
  {
13229
13991
  ref,
13230
- className: cn(
13231
- "flex items-center justify-center text-muted-foreground",
13232
- iconSizeClass,
13233
- className
13234
- ),
13992
+ className: cn(EMPTY_STATE_TOKENS.icon.container, iconSizeClass, className),
13235
13993
  ...props,
13236
13994
  children
13237
13995
  }
@@ -13246,9 +14004,9 @@ var EmptyStateTitle = React49.forwardRef(
13246
14004
  {
13247
14005
  ref,
13248
14006
  className: cn(
13249
- DATA_TOKENS.emptyState.typography.title.fontSize,
13250
- DATA_TOKENS.emptyState.typography.title.fontWeight,
13251
- "text-foreground",
14007
+ EMPTY_STATE_TOKENS.typography.title.fontSize,
14008
+ EMPTY_STATE_TOKENS.typography.title.fontWeight,
14009
+ EMPTY_STATE_TOKENS.typography.title.color,
13252
14010
  className
13253
14011
  ),
13254
14012
  ...props,
@@ -13269,7 +14027,7 @@ var EmptyState = React49.forwardRef(
13269
14027
  variant: "flat",
13270
14028
  radius: "xl",
13271
14029
  p: "lg",
13272
- className: cn("text-center", className),
14030
+ className: cn(EMPTY_STATE_TOKENS.alignment.center, className),
13273
14031
  id: emptyStateId,
13274
14032
  ...props,
13275
14033
  children: /* @__PURE__ */ jsx(Stack, { gap: "md", align: "center", justify: "center", children })
@@ -13286,14 +14044,16 @@ var DataListItem = React49.forwardRef(
13286
14044
  ({ padding = "md", className, children, ...props }, ref) => {
13287
14045
  const paddingValue = getBaseValue(padding);
13288
14046
  const paddingKey = paddingValue && ["sm", "md", "lg"].includes(String(paddingValue)) ? String(paddingValue) : "md";
13289
- const paddingClass = DATA_TOKENS.dataList.rowPadding[paddingKey];
14047
+ const paddingClass = DATA_LIST_TOKENS.rowPadding[paddingKey];
13290
14048
  return /* @__PURE__ */ jsx(
13291
14049
  "div",
13292
14050
  {
13293
14051
  ref,
13294
14052
  className: cn(
13295
14053
  paddingClass,
13296
- "flex flex-col border-b border-border last:border-0 md:flex-row md:items-center",
14054
+ DATA_LIST_TOKENS.item.layout.mobile,
14055
+ DATA_LIST_TOKENS.item.layout.desktop,
14056
+ DATA_LIST_TOKENS.item.border,
13297
14057
  className
13298
14058
  ),
13299
14059
  ...props,
@@ -13310,9 +14070,9 @@ var DataListLabel = React49.forwardRef(
13310
14070
  {
13311
14071
  ref,
13312
14072
  className: cn(
13313
- "mb-1 font-semibold text-foreground md:mb-0",
13314
- "md:w-32",
13315
- // Default md width from tokens
14073
+ DATA_LIST_TOKENS.label.mobile,
14074
+ DATA_LIST_TOKENS.label.desktop,
14075
+ DATA_LIST_TOKENS.labelWidth.md,
13316
14076
  className
13317
14077
  ),
13318
14078
  ...props,
@@ -13324,13 +14084,21 @@ var DataListLabel = React49.forwardRef(
13324
14084
  DataListLabel.displayName = "DataListLabel";
13325
14085
  var DataListValue = React49.forwardRef(
13326
14086
  ({ className, children, ...props }, ref) => {
13327
- return /* @__PURE__ */ jsx("dd", { ref, className: cn("flex-1 text-muted-foreground", className), ...props, children });
14087
+ return /* @__PURE__ */ jsx(
14088
+ "dd",
14089
+ {
14090
+ ref,
14091
+ className: cn(DATA_LIST_TOKENS.value.flex, DATA_LIST_TOKENS.value.color, className),
14092
+ ...props,
14093
+ children
14094
+ }
14095
+ );
13328
14096
  }
13329
14097
  );
13330
14098
  DataListValue.displayName = "DataListValue";
13331
14099
  var DataListRoot = React49.forwardRef(
13332
14100
  ({ labelWidth: _labelWidth = "md", className, children, ...props }, ref) => {
13333
- return /* @__PURE__ */ jsx("dl", { ref, className: cn(DATA_TOKENS.dataList.spacing.gap, className), ...props, children });
14101
+ return /* @__PURE__ */ jsx("dl", { ref, className: cn(DATA_LIST_TOKENS.spacing.gap, className), ...props, children });
13334
14102
  }
13335
14103
  );
13336
14104
  DataListRoot.displayName = "DataListRoot";
@@ -13345,9 +14113,9 @@ var TableBody = React49.forwardRef(
13345
14113
  TableBody.displayName = "TableBody";
13346
14114
  var TableCell = React49.forwardRef(
13347
14115
  ({ align = "left", size: size3 = "md", className, ...props }, ref) => {
13348
- const paddingClass = DATA_TOKENS.table.padding.cell[size3];
13349
- const typographyClass = DATA_TOKENS.table.typography.cell.fontSize;
13350
- const fontWeightClass = DATA_TOKENS.table.typography.cell.fontWeight;
14116
+ const paddingClass = TABLE_TOKENS.padding.cell[size3];
14117
+ const typographyClass = TABLE_TOKENS.typography.cell.fontSize;
14118
+ const fontWeightClass = TABLE_TOKENS.typography.cell.fontWeight;
13351
14119
  const alignmentClasses = {
13352
14120
  left: "text-left",
13353
14121
  center: "text-center",
@@ -13373,7 +14141,7 @@ var TableCell = React49.forwardRef(
13373
14141
  TableCell.displayName = "TableCell";
13374
14142
  var TableEmpty = React49.forwardRef(
13375
14143
  ({ colSpan, message = "No data available", className, ...props }, ref) => {
13376
- return /* @__PURE__ */ jsx("tr", { ref, className: cn(className), ...props, children: /* @__PURE__ */ jsx("td", { colSpan, className: "p-8", children: /* @__PURE__ */ jsxs(EmptyState, { children: [
14144
+ return /* @__PURE__ */ jsx("tr", { ref, className: cn(className), ...props, children: /* @__PURE__ */ jsx("td", { colSpan, className: TABLE_TOKENS.empty.padding, children: /* @__PURE__ */ jsxs(EmptyState, { children: [
13377
14145
  /* @__PURE__ */ jsx(EmptyStateIcon, { children: "\u{1F4ED}" }),
13378
14146
  /* @__PURE__ */ jsx(EmptyStateTitle, { children: message })
13379
14147
  ] }) }) });
@@ -13388,13 +14156,22 @@ var TableExpandableContent = React49.forwardRef(
13388
14156
  ref,
13389
14157
  colSpan,
13390
14158
  className: cn(
13391
- "p-0",
13392
- "overflow-hidden transition-all duration-normal ease-in-out",
13393
- expanded ? "max-h-[100vh] opacity-100" : "max-h-0 opacity-0",
14159
+ TABLE_TOKENS.expandable.container,
14160
+ TABLE_TOKENS.expandable.transition,
14161
+ expanded ? TABLE_TOKENS.expandable.expanded : TABLE_TOKENS.expandable.collapsed,
13394
14162
  className
13395
14163
  ),
13396
14164
  ...props,
13397
- children: /* @__PURE__ */ jsx("div", { className: cn("p-md", expanded ? "block" : "hidden"), children })
14165
+ children: /* @__PURE__ */ jsx(
14166
+ "div",
14167
+ {
14168
+ className: cn(
14169
+ TABLE_TOKENS.expandable.padding,
14170
+ expanded ? TABLE_TOKENS.expandable.content.expanded : TABLE_TOKENS.expandable.content.collapsed
14171
+ ),
14172
+ children
14173
+ }
14174
+ )
13398
14175
  }
13399
14176
  );
13400
14177
  }
@@ -13407,9 +14184,9 @@ var TableSortIcon = React49.forwardRef(
13407
14184
  {
13408
14185
  ref,
13409
14186
  className: cn(
13410
- "inline-flex size-4 items-center text-muted-foreground transition-transform",
13411
- direction === "desc" && "rotate-180",
13412
- !direction && "opacity-30",
14187
+ TABLE_TOKENS.sortable.icon.base,
14188
+ direction === "desc" && TABLE_TOKENS.sortable.icon.rotated,
14189
+ !direction && TABLE_TOKENS.sortable.icon.inactive,
13413
14190
  className
13414
14191
  ),
13415
14192
  "aria-hidden": "true",
@@ -13456,9 +14233,9 @@ var TableHead = React49.forwardRef(
13456
14233
  direction: nextDirection
13457
14234
  });
13458
14235
  }, [sortable, columnKey, sortState, setSortState]);
13459
- const paddingClass = DATA_TOKENS.table.padding.header[size3];
13460
- const typographyClass = DATA_TOKENS.table.typography.header.fontSize;
13461
- const fontWeightClass = DATA_TOKENS.table.typography.header.fontWeight;
14236
+ const paddingClass = TABLE_TOKENS.padding.header[size3];
14237
+ const typographyClass = TABLE_TOKENS.typography.header.fontSize;
14238
+ const fontWeightClass = TABLE_TOKENS.typography.header.fontWeight;
13462
14239
  const alignmentClasses = {
13463
14240
  left: "text-left",
13464
14241
  center: "text-center",
@@ -13475,9 +14252,10 @@ var TableHead = React49.forwardRef(
13475
14252
  typographyClass,
13476
14253
  fontWeightClass,
13477
14254
  alignmentClasses[align],
13478
- DATA_TOKENS.table.colors.border,
13479
- "border-b",
13480
- sortable && "cursor-pointer select-none hover:bg-muted/50",
14255
+ TABLE_TOKENS.colors.border,
14256
+ TABLE_TOKENS.border.bottom,
14257
+ sortable && TABLE_TOKENS.sortable.cursor,
14258
+ sortable && TABLE_TOKENS.sortable.hover,
13481
14259
  className
13482
14260
  ),
13483
14261
  onClick: handleSort,
@@ -13489,7 +14267,7 @@ var TableHead = React49.forwardRef(
13489
14267
  })(),
13490
14268
  role: "columnheader",
13491
14269
  ...props,
13492
- children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
14270
+ children: /* @__PURE__ */ jsxs("div", { className: cn(TABLE_TOKENS.sortable.container, TABLE_TOKENS.sortable.gap), children: [
13493
14271
  children,
13494
14272
  sortable && /* @__PURE__ */ jsx(TableSortIcon, { direction: sortDirection })
13495
14273
  ] })
@@ -13504,7 +14282,7 @@ var TableHeader = React49.forwardRef(
13504
14282
  "thead",
13505
14283
  {
13506
14284
  ref,
13507
- className: cn(sticky && "sticky top-0 z-10 bg-background", className),
14285
+ className: cn(sticky && TABLE_TOKENS.sticky.header, className),
13508
14286
  role: "rowgroup",
13509
14287
  ...props
13510
14288
  }
@@ -13514,7 +14292,7 @@ var TableHeader = React49.forwardRef(
13514
14292
  TableHeader.displayName = "TableHeader";
13515
14293
  var TableLoadingState = React49.forwardRef(
13516
14294
  ({ colSpan, rows = 5, className, ...props }, ref) => {
13517
- return /* @__PURE__ */ jsx(Fragment, { children: Array.from({ length: rows }).map((_, index2) => /* @__PURE__ */ jsx("tr", { ref: index2 === 0 ? ref : void 0, className: cn(className), ...props, children: Array.from({ length: colSpan }).map((_2, cellIndex) => /* @__PURE__ */ jsx("td", { className: "p-sm", children: /* @__PURE__ */ jsx(Skeleton, { variant: "text", className: "w-full" }) }, cellIndex)) }, index2)) });
14295
+ return /* @__PURE__ */ jsx(Fragment, { children: Array.from({ length: rows }).map((_, index2) => /* @__PURE__ */ jsx("tr", { ref: index2 === 0 ? ref : void 0, className: cn(className), ...props, children: Array.from({ length: colSpan }).map((_2, cellIndex) => /* @__PURE__ */ jsx("td", { className: TABLE_TOKENS.loading.cellPadding, children: /* @__PURE__ */ jsx(Skeleton, { variant: "text", className: TABLE_TOKENS.loading.skeletonWidth }) }, cellIndex)) }, index2)) });
13518
14296
  }
13519
14297
  );
13520
14298
  TableLoadingState.displayName = "TableLoadingState";
@@ -13532,11 +14310,11 @@ var TableRow = React49.forwardRef(
13532
14310
  {
13533
14311
  ref,
13534
14312
  className: cn(
13535
- DATA_TOKENS.table.colors.border,
13536
- "border-b",
13537
- DATA_TOKENS.table.colors.rowHover,
13538
- selected && DATA_TOKENS.table.colors.rowSelected,
13539
- expandable && "cursor-pointer",
14313
+ TABLE_TOKENS.colors.border,
14314
+ TABLE_TOKENS.border.bottom,
14315
+ TABLE_TOKENS.colors.rowHover,
14316
+ selected && TABLE_TOKENS.colors.rowSelected,
14317
+ expandable && TABLE_TOKENS.expandable.cursor,
13540
14318
  className
13541
14319
  ),
13542
14320
  "aria-expanded": expandable ? expanded : void 0,
@@ -13597,13 +14375,13 @@ function TableRoot({
13597
14375
  }),
13598
14376
  [sortState, expandedRows, toggleRow, expandable, renderExpandableContent]
13599
14377
  );
13600
- return /* @__PURE__ */ jsx(TableContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx("div", { className: "overflow-x-auto", children: /* @__PURE__ */ jsx(
14378
+ return /* @__PURE__ */ jsx(TableContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx("div", { className: TABLE_TOKENS.layout.overflow, children: /* @__PURE__ */ jsx(
13601
14379
  "table",
13602
14380
  {
13603
14381
  className: cn(
13604
- "w-full border-collapse",
13605
- DATA_TOKENS.table.radius.default,
13606
- DATA_TOKENS.table.shadow.subtle,
14382
+ TABLE_TOKENS.layout.table,
14383
+ TABLE_TOKENS.radius.default,
14384
+ TABLE_TOKENS.shadow.subtle,
13607
14385
  className
13608
14386
  ),
13609
14387
  role: "table",
@@ -15170,8 +15948,8 @@ var artistCardGenresVariants = cva(
15170
15948
  }
15171
15949
  );
15172
15950
  var artistCardFooterBorderVariants = cva(
15173
- // Base classes - border top, spacing
15174
- "border-t border-border",
15951
+ // Base classes - border top from ARTIST_TOKENS, spacing from DOMAIN_TOKENS
15952
+ ARTIST_TOKENS.footer.border.top,
15175
15953
  {
15176
15954
  variants: {
15177
15955
  size: {
@@ -15231,37 +16009,49 @@ var ArtistCard = React49.forwardRef(
15231
16009
  ...props,
15232
16010
  children: [
15233
16011
  featured && popularBadgeText && /* @__PURE__ */ jsx("div", { className: artistCardBadgeVariants({ size: size3 }), children: /* @__PURE__ */ jsx("span", { className: artistCardBadgeSurfaceVariants({ size: size3, variant: "featured" }), children: popularBadgeText }) }),
15234
- showImage && /* @__PURE__ */ jsx(CardBaseImageWrapper, { size: size3, children: /* @__PURE__ */ jsxs("div", { className: "relative w-full overflow-hidden bg-gradient-to-br from-muted to-muted/50", children: [
15235
- imageUrl ? /* @__PURE__ */ jsx(
15236
- "img",
15237
- {
15238
- src: imageUrl,
15239
- alt: name,
15240
- className: cn("h-full w-full", artistCardImageTransformVariants({ size: size3 }))
15241
- }
15242
- ) : /* @__PURE__ */ jsx("div", { className: "flex h-full w-full items-center justify-center", children: /* @__PURE__ */ jsx(
15243
- Icon2,
15244
- {
15245
- name: "info",
15246
- size: "xl",
15247
- color: "muted",
15248
- className: ICON_TOKENS.sizes["4xl"],
15249
- "aria-hidden": "true"
15250
- }
15251
- ) }),
15252
- /* @__PURE__ */ jsx("div", { className: artistCardImageOverlayVariants({ size: size3 }) })
15253
- ] }) }),
16012
+ showImage && /* @__PURE__ */ jsx(CardBaseImageWrapper, { size: size3, children: /* @__PURE__ */ jsxs(
16013
+ "div",
16014
+ {
16015
+ className: cn(
16016
+ ARTIST_TOKENS.image.container.layout,
16017
+ DOMAIN_TOKENS.image.placeholder.gradient
16018
+ ),
16019
+ children: [
16020
+ imageUrl ? /* @__PURE__ */ jsx(
16021
+ "img",
16022
+ {
16023
+ src: imageUrl,
16024
+ alt: name,
16025
+ className: cn(
16026
+ ARTIST_TOKENS.image.sizing.full,
16027
+ artistCardImageTransformVariants({ size: size3 })
16028
+ )
16029
+ }
16030
+ ) : /* @__PURE__ */ jsx("div", { className: ARTIST_TOKENS.image.placeholder.container, children: /* @__PURE__ */ jsx(
16031
+ Icon2,
16032
+ {
16033
+ name: "info",
16034
+ size: "xl",
16035
+ color: "muted",
16036
+ className: ICON_TOKENS.sizes["4xl"],
16037
+ "aria-hidden": "true"
16038
+ }
16039
+ ) }),
16040
+ /* @__PURE__ */ jsx("div", { className: artistCardImageOverlayVariants({ size: size3 }) })
16041
+ ]
16042
+ }
16043
+ ) }),
15254
16044
  /* @__PURE__ */ jsxs(CardBaseContentWrapper, { size: size3, children: [
15255
16045
  /* @__PURE__ */ jsx(
15256
16046
  Heading,
15257
16047
  {
15258
16048
  level: 3,
15259
16049
  className: cn(
15260
- "line-clamp-2",
16050
+ DOMAIN_TOKENS.text.lineClamp.two,
15261
16051
  TEXT_TOKENS.fontSize.lg,
15262
16052
  TEXT_TOKENS.fontWeight.bold,
15263
16053
  MOTION_TOKENS.transition.colors,
15264
- "group-hover:text-primary",
16054
+ DOMAIN_TOKENS.text.hover.primary,
15265
16055
  size3 === "compact" ? DOMAIN_TOKENS.spacing.section.titleToSubtitle : DOMAIN_TOKENS.spacing.section.subtitleToMetadata
15266
16056
  ),
15267
16057
  children: href ? /* @__PURE__ */ jsx(Link, { href, variant: "ghost", children: name }) : name
@@ -15273,7 +16063,7 @@ var ArtistCard = React49.forwardRef(
15273
16063
  size: "sm",
15274
16064
  variant: "muted",
15275
16065
  className: cn(
15276
- "line-clamp-2",
16066
+ DOMAIN_TOKENS.text.lineClamp.two,
15277
16067
  size3 === "compact" ? DOMAIN_TOKENS.spacing.section.titleToSubtitle : DOMAIN_TOKENS.spacing.section.subtitleToMetadata
15278
16068
  ),
15279
16069
  children: description
@@ -15335,16 +16125,16 @@ var ArtistCard = React49.forwardRef(
15335
16125
  }
15336
16126
  );
15337
16127
  ArtistCard.displayName = "ArtistCard";
15338
- var eventCardBadgeVariants = cva(
16128
+ var categoryCardBadgeVariants = cva(
15339
16129
  // Base classes - absolute positioning, z-index
15340
16130
  "absolute z-10",
15341
16131
  {
15342
16132
  variants: {
15343
16133
  size: {
15344
16134
  default: DOMAIN_TOKENS.badges.position.default,
15345
- // Default positioning - maps to semanticSpacing.md (12px)
16135
+ // Default positioning - references semanticSpacing.md (16px)
15346
16136
  compact: DOMAIN_TOKENS.badges.position.compact
15347
- // Compact positioning - maps to semanticSpacing.sm (8px)
16137
+ // Compact positioning - references semanticSpacing.sm (8px)
15348
16138
  }
15349
16139
  },
15350
16140
  defaultVariants: {
@@ -15352,9 +16142,10 @@ var eventCardBadgeVariants = cva(
15352
16142
  }
15353
16143
  }
15354
16144
  );
15355
- var eventCardBadgeSurfaceVariants = cva(
16145
+ var categoryCardBadgeSurfaceVariants = cva(
15356
16146
  // Base classes - flex layout, items center, badge styling
15357
- `inline-flex items-center ${DOMAIN_TOKENS.badges.radius} ${DOMAIN_TOKENS.badges.shadow} ${DOMAIN_TOKENS.badges.size.sm} ${DOMAIN_TOKENS.badges.text.color} ${TEXT_TOKENS.fontSize.xs} font-semibold`,
16147
+ // Uses DOMAIN_TOKENS for badge-specific styles, TEXT_TOKENS for typography
16148
+ `inline-flex items-center ${DOMAIN_TOKENS.badges.radius} ${DOMAIN_TOKENS.badges.shadow} ${DOMAIN_TOKENS.badges.size.sm} ${DOMAIN_TOKENS.badges.text.color} ${TEXT_TOKENS.fontSize.xs} ${TEXT_TOKENS.fontWeight.semibold}`,
15358
16149
  {
15359
16150
  variants: {
15360
16151
  variant: {
@@ -15367,130 +16158,14 @@ var eventCardBadgeSurfaceVariants = cva(
15367
16158
  }
15368
16159
  }
15369
16160
  );
15370
- var eventCardMetadataVariants = cva(
15371
- // Base classes - flex column, metadata spacing
15372
- `flex flex-col ${DOMAIN_TOKENS.metadata.spacing.vertical}`,
15373
- {
15374
- variants: {
15375
- size: {
15376
- default: "",
15377
- compact: ""
15378
- }
15379
- },
15380
- defaultVariants: {
15381
- size: "default"
15382
- }
15383
- }
15384
- );
15385
- var eventCardMetadataItemVariants = cva(
15386
- // Base classes - flex items center, metadata spacing and text
15387
- `flex items-center ${DOMAIN_TOKENS.metadata.spacing.horizontal} ${DOMAIN_TOKENS.metadata.text.secondary} ${TEXT_TOKENS.fontSize.xs}`,
15388
- {
15389
- variants: {
15390
- size: {
15391
- default: "",
15392
- compact: ""
15393
- }
15394
- },
15395
- defaultVariants: {
15396
- size: "default"
15397
- }
15398
- }
15399
- );
15400
- var eventCardMetadataIconVariants = cva(
15401
- // Base classes - icon size and color
15402
- `${ICON_TOKENS.sizes.md} ${ICON_TOKENS.colors.muted}`,
15403
- {
15404
- variants: {
15405
- size: {
15406
- default: "",
15407
- compact: ""
15408
- }
15409
- },
15410
- defaultVariants: {
15411
- size: "default"
15412
- }
15413
- }
15414
- );
15415
- var eventCardFooterVariants = cva(
15416
- // Base classes - border top, spacing
15417
- "border-t border-border",
15418
- {
15419
- variants: {
15420
- size: {
15421
- default: DOMAIN_TOKENS.spacing.footer.paddingTopDefault,
15422
- // Default padding top - references semanticSpacing.sm (8px) via Tailwind
15423
- compact: DOMAIN_TOKENS.spacing.footer.paddingTopCompact
15424
- // Compact padding top - references semanticSpacing.xs (4px) via Tailwind
15425
- }
15426
- },
15427
- defaultVariants: {
15428
- size: "default"
15429
- }
15430
- }
15431
- );
15432
- var eventCardTicketButtonVariants = cva(
15433
- // Base classes - flex layout, badge gradient, motion
15434
- `inline-flex items-center justify-center ${DOMAIN_TOKENS.badges.surface.featured} ${DOMAIN_TOKENS.badges.text.color} ${DOMAIN_TOKENS.badges.shadow} ${DOMAIN_TOKENS.motion.hover.transition} font-semibold transform`,
15435
- {
15436
- variants: {
15437
- size: {
15438
- default: DOMAIN_TOKENS.spacing.button.paddingDefault,
15439
- // Default padding - references semanticSpacing.md (16px) horizontal, xs (4px) vertical via Tailwind
15440
- compact: DOMAIN_TOKENS.spacing.button.paddingCompact
15441
- // Compact padding - references semanticSpacing.sm (8px) horizontal, xs (4px) vertical via Tailwind
15442
- }
15443
- },
15444
- defaultVariants: {
15445
- size: "default"
15446
- }
15447
- }
15448
- );
15449
- var eventCardTicketButtonIconVariants = cva(
15450
- // Base classes - icon size and spacing
15451
- `${ICON_TOKENS.sizes.md} ${DOMAIN_TOKENS.spacing.button.iconMarginLeft}`,
15452
- {
15453
- variants: {
15454
- size: {
15455
- default: "",
15456
- compact: ""
15457
- }
15458
- },
15459
- defaultVariants: {
15460
- size: "default"
15461
- }
15462
- }
15463
- );
15464
- var eventCardPriceVariants = cva(
15465
- // Base classes - price gradient text
15466
- `bg-gradient-to-r from-accent-500 to-primary-600 bg-clip-text text-transparent`,
15467
- {
15468
- variants: {
15469
- size: {
15470
- default: TEXT_TOKENS.fontSize.lg,
15471
- // Default size
15472
- compact: TEXT_TOKENS.fontSize.md
15473
- // Compact size
15474
- }
15475
- },
15476
- defaultVariants: {
15477
- size: "default"
15478
- }
15479
- }
15480
- );
15481
- var EventCard = React49.forwardRef(
16161
+ var CategoryCard = React49.forwardRef(
15482
16162
  ({
15483
16163
  title,
15484
16164
  description,
15485
- date,
15486
- venueName,
15487
- price,
15488
16165
  imageUrl,
15489
16166
  href,
15490
- ticketUrl,
15491
16167
  featured = false,
15492
16168
  showImage = true,
15493
- getTicketsLabel,
15494
16169
  featuredBadgeText,
15495
16170
  size: size3 = "default",
15496
16171
  variant,
@@ -15513,46 +16188,57 @@ var EventCard = React49.forwardRef(
15513
16188
  className: cn("group relative", className),
15514
16189
  ...props,
15515
16190
  children: [
15516
- featured && featuredBadgeText && /* @__PURE__ */ jsx("div", { className: eventCardBadgeVariants({ size: size3 }), children: /* @__PURE__ */ jsx("span", { className: eventCardBadgeSurfaceVariants({ variant: "featured" }), children: featuredBadgeText }) }),
15517
- showImage && /* @__PURE__ */ jsx(CardBaseImageWrapper, { size: size3, children: /* @__PURE__ */ jsxs("div", { className: "relative w-full overflow-hidden bg-gradient-to-br from-surface-elevated1 to-surface-elevated2", children: [
15518
- imageUrl ? /* @__PURE__ */ jsx(
15519
- "img",
15520
- {
15521
- src: imageUrl,
15522
- alt: title,
15523
- className: cn(
15524
- "h-full w-full object-cover",
15525
- DOMAIN_TOKENS.motion.hover.transition,
15526
- DOMAIN_TOKENS.motion.hover.scale
15527
- )
15528
- }
15529
- ) : /* @__PURE__ */ jsx("div", { className: "flex h-full w-full items-center justify-center", children: /* @__PURE__ */ jsx(
15530
- Icon2,
15531
- {
15532
- name: "info",
15533
- size: "xl",
15534
- color: "muted",
15535
- className: ICON_TOKENS.sizes["4xl"],
15536
- "aria-hidden": "true"
15537
- }
15538
- ) }),
15539
- /* @__PURE__ */ jsx(
15540
- "div",
15541
- {
15542
- className: cn(
15543
- "absolute inset-0 opacity-0 transition-opacity duration-normal group-hover:opacity-100",
15544
- DOMAIN_TOKENS.image.overlay.gradient
16191
+ featured && featuredBadgeText && /* @__PURE__ */ jsx("div", { className: categoryCardBadgeVariants({ size: size3 }), children: /* @__PURE__ */ jsx("span", { className: categoryCardBadgeSurfaceVariants({ variant: "featured" }), children: featuredBadgeText }) }),
16192
+ showImage && /* @__PURE__ */ jsx(CardBaseImageWrapper, { size: size3, children: /* @__PURE__ */ jsxs(
16193
+ "div",
16194
+ {
16195
+ className: cn(
16196
+ "relative w-full overflow-hidden",
16197
+ DOMAIN_TOKENS.image.placeholder.gradient
16198
+ ),
16199
+ children: [
16200
+ imageUrl ? /* @__PURE__ */ jsx(
16201
+ "img",
16202
+ {
16203
+ src: imageUrl,
16204
+ alt: title,
16205
+ className: cn(
16206
+ "h-full w-full object-cover",
16207
+ DOMAIN_TOKENS.motion.hover.transition,
16208
+ DOMAIN_TOKENS.motion.hover.scale
16209
+ )
16210
+ }
16211
+ ) : /* @__PURE__ */ jsx("div", { className: "flex h-full w-full items-center justify-center", children: /* @__PURE__ */ jsx(
16212
+ Icon2,
16213
+ {
16214
+ name: "info",
16215
+ className: cn(ICON_TOKENS.sizes["4xl"], ICON_TOKENS.colors.muted),
16216
+ "aria-hidden": "true"
16217
+ }
16218
+ ) }),
16219
+ /* @__PURE__ */ jsx(
16220
+ "div",
16221
+ {
16222
+ className: cn(
16223
+ "absolute inset-0 opacity-0 group-hover:opacity-100",
16224
+ MOTION_TOKENS.transition.opacity,
16225
+ MOTION_TOKENS.duration.normal,
16226
+ DOMAIN_TOKENS.image.overlay.gradient
16227
+ )
16228
+ }
15545
16229
  )
15546
- }
15547
- )
15548
- ] }) }),
16230
+ ]
16231
+ }
16232
+ ) }),
15549
16233
  /* @__PURE__ */ jsxs(CardBaseContentWrapper, { size: size3, children: [
15550
16234
  /* @__PURE__ */ jsx(
15551
16235
  Heading,
15552
16236
  {
15553
16237
  level: 3,
15554
16238
  className: cn(
15555
- "line-clamp-2 transition-colors group-hover:text-primary",
16239
+ DOMAIN_TOKENS.text.lineClamp.two,
16240
+ MOTION_TOKENS.transition.colors,
16241
+ DOMAIN_TOKENS.text.hover.primary,
15556
16242
  TEXT_TOKENS.fontSize.lg,
15557
16243
  TEXT_TOKENS.fontWeight.bold,
15558
16244
  DOMAIN_TOKENS.spacing.section.titleToSubtitle
@@ -15564,47 +16250,21 @@ var EventCard = React49.forwardRef(
15564
16250
  Text,
15565
16251
  {
15566
16252
  size: "sm",
15567
- muted: true,
16253
+ variant: "muted",
15568
16254
  className: cn(
15569
- "line-clamp-2",
16255
+ DOMAIN_TOKENS.text.lineClamp.two,
15570
16256
  size3 === "compact" ? DOMAIN_TOKENS.spacing.section.titleToSubtitle : DOMAIN_TOKENS.spacing.section.subtitleToMetadata
15571
16257
  ),
15572
16258
  children: description
15573
16259
  }
15574
- ),
15575
- /* @__PURE__ */ jsxs("div", { className: eventCardMetadataVariants({ size: size3 }), children: [
15576
- date && /* @__PURE__ */ jsxs("div", { className: eventCardMetadataItemVariants({ size: size3 }), children: [
15577
- /* @__PURE__ */ jsx(IconCalendar, { className: eventCardMetadataIconVariants({ size: size3 }) }),
15578
- /* @__PURE__ */ jsx(Text, { size: "xs", muted: true, children: date })
15579
- ] }),
15580
- venueName && /* @__PURE__ */ jsxs("div", { className: eventCardMetadataItemVariants({ size: size3 }), children: [
15581
- /* @__PURE__ */ jsx(IconLocation, { className: eventCardMetadataIconVariants({ size: size3 }) }),
15582
- /* @__PURE__ */ jsx(Text, { size: "xs", muted: true, className: "line-clamp-1", children: venueName })
15583
- ] })
15584
- ] })
15585
- ] }),
15586
- /* @__PURE__ */ jsx(CardBaseFooterWrapper, { size: size3, children: /* @__PURE__ */ jsxs("div", { className: cn("w-full", eventCardFooterVariants({ size: size3 })), children: [
15587
- ticketUrl && /* @__PURE__ */ jsxs(
15588
- Link,
15589
- {
15590
- href: ticketUrl,
15591
- className: cn("w-full", eventCardTicketButtonVariants({ size: size3 })),
15592
- target: "_blank",
15593
- rel: "noopener noreferrer",
15594
- children: [
15595
- getTicketsLabel,
15596
- /* @__PURE__ */ jsx(IconArrowRight, { className: eventCardTicketButtonIconVariants({ size: size3 }) })
15597
- ]
15598
- }
15599
- ),
15600
- !ticketUrl && price && /* @__PURE__ */ jsx("div", { className: "text-right", children: /* @__PURE__ */ jsx(Text, { size: size3 === "compact" ? "md" : "lg", weight: "bold", children: /* @__PURE__ */ jsx("span", { className: eventCardPriceVariants({ size: size3 }), children: price }) }) })
15601
- ] }) })
16260
+ )
16261
+ ] })
15602
16262
  ]
15603
16263
  }
15604
16264
  ) });
15605
16265
  }
15606
16266
  );
15607
- EventCard.displayName = "EventCard";
16267
+ CategoryCard.displayName = "CategoryCard";
15608
16268
  var promoCardBadgeVariants = cva(
15609
16269
  // Base classes - absolute positioning, z-index
15610
16270
  "absolute z-10",
@@ -15638,14 +16298,14 @@ var promoCardBadgeSurfaceVariants = cva(
15638
16298
  }
15639
16299
  );
15640
16300
  var promoCardCtaButtonVariants = cva(
15641
- // Base classes - flex layout, button tokens, motion
15642
- `inline-flex items-center justify-center ${BUTTON_TOKENS.radius} ${BUTTON_TOKENS.variant.primary.background} ${BUTTON_TOKENS.variant.primary.text} ${BUTTON_TOKENS.shadow.primary} ${BUTTON_TOKENS.variant.primary.hover} ${BUTTON_TOKENS.transition.colors} font-semibold`,
16301
+ // Base classes - flex layout, CTA button tokens, motion
16302
+ `inline-flex items-center justify-center ${DOMAIN_TOKENS.cta.button.radius} ${DOMAIN_TOKENS.cta.button.variant.primary.background} ${DOMAIN_TOKENS.cta.button.variant.primary.text} ${DOMAIN_TOKENS.cta.button.shadow.primary} ${DOMAIN_TOKENS.cta.button.variant.primary.hover} ${DOMAIN_TOKENS.cta.button.transition.colors} font-semibold`,
15643
16303
  {
15644
16304
  variants: {
15645
16305
  size: {
15646
- default: `${BUTTON_TOKENS.height.md} ${BUTTON_TOKENS.padding.horizontal.md} ${BUTTON_TOKENS.padding.vertical.sm} ${BUTTON_TOKENS.fontSize.md}`,
16306
+ default: `${DOMAIN_TOKENS.cta.button.height.md} ${DOMAIN_TOKENS.cta.button.padding.horizontal.md} ${DOMAIN_TOKENS.cta.button.padding.vertical.sm} ${DOMAIN_TOKENS.cta.button.fontSize.md}`,
15647
16307
  // Default size - uses md height and padding
15648
- compact: `${BUTTON_TOKENS.height.sm} ${BUTTON_TOKENS.padding.horizontal.sm} ${BUTTON_TOKENS.padding.vertical.sm} ${BUTTON_TOKENS.fontSize.sm}`
16308
+ compact: `${DOMAIN_TOKENS.cta.button.height.sm} ${DOMAIN_TOKENS.cta.button.padding.horizontal.sm} ${DOMAIN_TOKENS.cta.button.padding.vertical.sm} ${DOMAIN_TOKENS.cta.button.fontSize.sm}`
15649
16309
  // Compact size - uses sm height and padding
15650
16310
  }
15651
16311
  },
@@ -15777,6 +16437,22 @@ var PromoCard = React49.forwardRef(
15777
16437
  }
15778
16438
  );
15779
16439
  PromoCard.displayName = "PromoCard";
16440
+ var ticketCardVariants = cva("group relative", {
16441
+ variants: {
16442
+ size: {
16443
+ default: "",
16444
+ compact: ""
16445
+ },
16446
+ variant: {
16447
+ default: "",
16448
+ featured: ""
16449
+ }
16450
+ },
16451
+ defaultVariants: {
16452
+ size: "default",
16453
+ variant: "default"
16454
+ }
16455
+ });
15780
16456
  var ticketCardBadgeVariants = cva(
15781
16457
  // Base classes - absolute positioning, z-index
15782
16458
  "absolute z-10",
@@ -15784,7 +16460,7 @@ var ticketCardBadgeVariants = cva(
15784
16460
  variants: {
15785
16461
  size: {
15786
16462
  default: DOMAIN_TOKENS.badges.position.default,
15787
- // Default positioning - maps to semanticSpacing.md (12px)
16463
+ // Default positioning - maps to semanticSpacing.md (16px)
15788
16464
  compact: DOMAIN_TOKENS.badges.position.compact
15789
16465
  // Compact positioning - maps to semanticSpacing.sm (8px)
15790
16466
  }
@@ -15796,7 +16472,7 @@ var ticketCardBadgeVariants = cva(
15796
16472
  );
15797
16473
  var ticketCardBadgeSurfaceVariants = cva(
15798
16474
  // Base classes - flex layout, items center, badge styling
15799
- `inline-flex items-center ${DOMAIN_TOKENS.badges.radius} ${DOMAIN_TOKENS.badges.shadow} ${DOMAIN_TOKENS.badges.size.sm} ${DOMAIN_TOKENS.badges.text.color} ${TEXT_TOKENS.fontSize.xs} font-semibold`,
16475
+ `inline-flex items-center ${DOMAIN_TOKENS.badges.radius} ${DOMAIN_TOKENS.badges.shadow} ${DOMAIN_TOKENS.badges.size.sm} ${DOMAIN_TOKENS.badges.text.color} ${TEXT_TOKENS.fontSize.xs} ${TEXT_TOKENS.fontWeight.semibold}`,
15800
16476
  {
15801
16477
  variants: {
15802
16478
  variant: {
@@ -15813,6 +16489,45 @@ var ticketCardBadgeSurfaceVariants = cva(
15813
16489
  }
15814
16490
  }
15815
16491
  );
16492
+ var ticketCardTitleVariants = cva(
16493
+ `${TEXT_TOKENS.fontSize.lg} ${TEXT_TOKENS.fontWeight.bold} ${MOTION_TOKENS.transition.colors} ${DOMAIN_TOKENS.text.hover.primary} ${DOMAIN_TOKENS.text.lineClamp.two}`,
16494
+ {
16495
+ variants: {
16496
+ size: {
16497
+ default: DOMAIN_TOKENS.spacing.section.subtitleToMetadata,
16498
+ compact: DOMAIN_TOKENS.spacing.section.titleToSubtitle
16499
+ }
16500
+ },
16501
+ defaultVariants: {
16502
+ size: "default"
16503
+ }
16504
+ }
16505
+ );
16506
+ var ticketCardDateVariants = cva(
16507
+ `${DOMAIN_TOKENS.metadata.text.secondary} ${TEXT_TOKENS.fontSize.sm} ${MOTION_TOKENS.transition.colors}`,
16508
+ {
16509
+ variants: {
16510
+ size: {
16511
+ default: DOMAIN_TOKENS.spacing.section.titleToSubtitle,
16512
+ compact: `${DOMAIN_TOKENS.spacing.section.titleToSubtitle} ${TEXT_TOKENS.fontSize.xs}`
16513
+ }
16514
+ },
16515
+ defaultVariants: {
16516
+ size: "default"
16517
+ }
16518
+ }
16519
+ );
16520
+ var ticketCardDescriptionVariants = cva(`${DOMAIN_TOKENS.text.lineClamp.two}`, {
16521
+ variants: {
16522
+ size: {
16523
+ default: DOMAIN_TOKENS.spacing.section.subtitleToMetadata,
16524
+ compact: DOMAIN_TOKENS.spacing.section.titleToSubtitle
16525
+ }
16526
+ },
16527
+ defaultVariants: {
16528
+ size: "default"
16529
+ }
16530
+ });
15816
16531
  var ticketCardPriceCapacityContainerVariants = cva(
15817
16532
  // Base classes - flex layout, price/capacity spacing
15818
16533
  `flex items-center ${DOMAIN_TOKENS.priceCapacity.spacing}`,
@@ -15830,7 +16545,7 @@ var ticketCardPriceCapacityContainerVariants = cva(
15830
16545
  );
15831
16546
  var ticketCardPriceVariants = cva(
15832
16547
  // Base classes - price text color
15833
- `${DOMAIN_TOKENS.priceCapacity.text.primary} font-bold`,
16548
+ `${DOMAIN_TOKENS.priceCapacity.text.primary} ${TEXT_TOKENS.fontWeight.bold}`,
15834
16549
  {
15835
16550
  variants: {
15836
16551
  size: {
@@ -15864,7 +16579,7 @@ var ticketCardCapacityVariants = cva(
15864
16579
  );
15865
16580
  var ticketCardAvailabilityVariants = cva(
15866
16581
  // Base classes - availability indicator styling
15867
- `inline-flex items-center ${DOMAIN_TOKENS.metadata.spacing.horizontal} ${TEXT_TOKENS.fontSize.xs} font-medium`,
16582
+ `inline-flex items-center ${DOMAIN_TOKENS.metadata.spacing.horizontal} ${TEXT_TOKENS.fontSize.xs} ${TEXT_TOKENS.fontWeight.medium}`,
15868
16583
  {
15869
16584
  variants: {
15870
16585
  availability: {
@@ -15897,7 +16612,7 @@ var ticketCardFooterVariants = cva(
15897
16612
  );
15898
16613
  var ticketCardPurchaseButtonVariants = cva(
15899
16614
  // Base classes - flex layout, badge gradient, motion
15900
- `inline-flex items-center justify-center ${DOMAIN_TOKENS.badges.surface.featured} ${DOMAIN_TOKENS.badges.text.color} ${DOMAIN_TOKENS.badges.shadow} ${DOMAIN_TOKENS.motion.hover.transition} font-semibold transform`,
16615
+ `inline-flex items-center justify-center ${DOMAIN_TOKENS.badges.surface.featured} ${DOMAIN_TOKENS.badges.text.color} ${DOMAIN_TOKENS.badges.shadow} ${DOMAIN_TOKENS.motion.hover.transition} ${TEXT_TOKENS.fontWeight.semibold} transform`,
15901
16616
  {
15902
16617
  variants: {
15903
16618
  size: {
@@ -15932,9 +16647,38 @@ var ticketCardPurchaseButtonIconVariants = cva(
15932
16647
  }
15933
16648
  }
15934
16649
  );
16650
+ var ticketCardImageOverlayVariants = cva(
16651
+ `absolute inset-0 ${DOMAIN_TOKENS.image.overlay.gradient} opacity-0 ${MOTION_TOKENS.transition.opacity} ${MOTION_TOKENS.duration.normal} group-hover:opacity-100`,
16652
+ {
16653
+ variants: {
16654
+ size: {
16655
+ default: "",
16656
+ compact: ""
16657
+ }
16658
+ },
16659
+ defaultVariants: {
16660
+ size: "default"
16661
+ }
16662
+ }
16663
+ );
16664
+ var ticketCardImageTransformVariants = cva(
16665
+ `object-cover ${MOTION_TOKENS.transition.transform} ${MOTION_TOKENS.duration.slow} ${DOMAIN_TOKENS.motion.hover.scale}`,
16666
+ {
16667
+ variants: {
16668
+ size: {
16669
+ default: "",
16670
+ compact: ""
16671
+ }
16672
+ },
16673
+ defaultVariants: {
16674
+ size: "default"
16675
+ }
16676
+ }
16677
+ );
15935
16678
  var TicketCard = React49.forwardRef(
15936
16679
  ({
15937
16680
  title,
16681
+ date,
15938
16682
  description,
15939
16683
  price,
15940
16684
  capacity,
@@ -15981,57 +16725,368 @@ var TicketCard = React49.forwardRef(
15981
16725
  }
15982
16726
  };
15983
16727
  const availabilityLabel = getAvailabilityLabel();
16728
+ const formattedDate = date ? formatDate(date) : null;
16729
+ const dateTimeValue = (() => {
16730
+ if (!date) return null;
16731
+ if (typeof date === "string") {
16732
+ return new Date(date).toISOString();
16733
+ }
16734
+ if (date instanceof Date) {
16735
+ return date.toISOString();
16736
+ }
16737
+ return new Date(date).toISOString();
16738
+ })();
15984
16739
  return /* @__PURE__ */ jsx(Box, { ...animationProps, children: /* @__PURE__ */ jsxs(
15985
16740
  CardBase,
15986
16741
  {
15987
16742
  ref,
15988
16743
  size: size3,
15989
16744
  variant: cardVariant,
15990
- className: cn("group relative", className),
16745
+ className: cn(ticketCardVariants({ size: size3, variant: cardVariant }), className),
15991
16746
  ...props,
15992
16747
  children: [
15993
16748
  featured && featuredBadgeText && /* @__PURE__ */ jsx("div", { className: ticketCardBadgeVariants({ size: size3 }), children: /* @__PURE__ */ jsx("span", { className: ticketCardBadgeSurfaceVariants({ variant: "featured" }), children: featuredBadgeText }) }),
15994
16749
  vipBadgeText && /* @__PURE__ */ jsx("div", { className: cn(ticketCardBadgeVariants({ size: size3 }), getVipBadgePosition()), children: /* @__PURE__ */ jsx("span", { className: ticketCardBadgeSurfaceVariants({ variant: "vip" }), children: vipBadgeText }) }),
15995
16750
  discountBadgeText && /* @__PURE__ */ jsx("div", { className: cn(ticketCardBadgeVariants({ size: size3 }), getDiscountBadgePosition()), children: /* @__PURE__ */ jsx("span", { className: ticketCardBadgeSurfaceVariants({ variant: "discount" }), children: discountBadgeText }) }),
15996
- showImage && /* @__PURE__ */ jsx(CardBaseImageWrapper, { size: size3, children: /* @__PURE__ */ jsxs("div", { className: "relative w-full overflow-hidden bg-gradient-to-br from-surface-elevated1 to-surface-elevated2", children: [
15997
- imageUrl ? /* @__PURE__ */ jsx(
15998
- "img",
15999
- {
16000
- src: imageUrl,
16001
- alt: title,
16002
- className: cn(
16003
- "h-full w-full object-cover",
16004
- DOMAIN_TOKENS.motion.hover.transition,
16005
- DOMAIN_TOKENS.motion.hover.scale
16006
- )
16007
- }
16008
- ) : /* @__PURE__ */ jsx("div", { className: "flex h-full w-full items-center justify-center", children: /* @__PURE__ */ jsx(
16009
- Icon2,
16751
+ showImage && /* @__PURE__ */ jsx(CardBaseImageWrapper, { size: size3, children: /* @__PURE__ */ jsxs(
16752
+ "div",
16753
+ {
16754
+ className: cn(
16755
+ "relative w-full overflow-hidden",
16756
+ DOMAIN_TOKENS.image.placeholder.gradient
16757
+ ),
16758
+ children: [
16759
+ imageUrl ? /* @__PURE__ */ jsx(
16760
+ "img",
16761
+ {
16762
+ src: imageUrl,
16763
+ alt: title,
16764
+ className: cn("h-full w-full", ticketCardImageTransformVariants({ size: size3 }))
16765
+ }
16766
+ ) : /* @__PURE__ */ jsx("div", { className: "flex h-full w-full items-center justify-center", children: /* @__PURE__ */ jsx(
16767
+ Icon2,
16768
+ {
16769
+ name: "info",
16770
+ size: "xl",
16771
+ color: "muted",
16772
+ className: ICON_TOKENS.sizes["4xl"],
16773
+ "aria-hidden": "true"
16774
+ }
16775
+ ) }),
16776
+ /* @__PURE__ */ jsx("div", { className: ticketCardImageOverlayVariants({ size: size3 }) })
16777
+ ]
16778
+ }
16779
+ ) }),
16780
+ /* @__PURE__ */ jsxs(CardBaseContentWrapper, { size: size3, children: [
16781
+ /* @__PURE__ */ jsx(Heading, { level: 3, className: ticketCardTitleVariants({ size: size3 }), children: href ? /* @__PURE__ */ jsx(Link, { href, variant: "ghost", children: title }) : title }),
16782
+ formattedDate && dateTimeValue && /* @__PURE__ */ jsx("time", { dateTime: dateTimeValue, className: ticketCardDateVariants({ size: size3 }), children: formattedDate }),
16783
+ description && /* @__PURE__ */ jsx(Text, { size: "sm", variant: "muted", className: ticketCardDescriptionVariants({ size: size3 }), children: description }),
16784
+ (price || capacity) && /* @__PURE__ */ jsxs("div", { className: ticketCardPriceCapacityContainerVariants({ size: size3 }), children: [
16785
+ price && /* @__PURE__ */ jsx(
16786
+ Text,
16787
+ {
16788
+ size: size3 === "compact" ? "md" : "lg",
16789
+ weight: "bold",
16790
+ className: ticketCardPriceVariants({ size: size3 }),
16791
+ children: price
16792
+ }
16793
+ ),
16794
+ capacity && /* @__PURE__ */ jsx(
16795
+ Text,
16796
+ {
16797
+ size: size3 === "compact" ? "xs" : "sm",
16798
+ variant: "muted",
16799
+ className: ticketCardCapacityVariants({ size: size3 }),
16800
+ children: capacity
16801
+ }
16802
+ )
16803
+ ] }),
16804
+ availabilityLabel && /* @__PURE__ */ jsx("div", { className: ticketCardAvailabilityVariants({ availability }), children: /* @__PURE__ */ jsx(Text, { size: "xs", variant: availability === "sold_out" ? "muted" : "primary", children: availabilityLabel }) })
16805
+ ] }),
16806
+ /* @__PURE__ */ jsx(CardBaseFooterWrapper, { size: size3, children: /* @__PURE__ */ jsxs("div", { className: cn("w-full", ticketCardFooterVariants({ size: size3 })), children: [
16807
+ purchaseUrl && !isPurchaseDisabled && /* @__PURE__ */ jsxs(
16808
+ Link,
16010
16809
  {
16011
- name: "info",
16012
- size: "xl",
16013
- color: "muted",
16014
- className: ICON_TOKENS.sizes["4xl"],
16015
- "aria-hidden": "true"
16810
+ href: purchaseUrl,
16811
+ className: cn(
16812
+ "w-full",
16813
+ ticketCardPurchaseButtonVariants({ size: size3, disabled: false })
16814
+ ),
16815
+ target: "_blank",
16816
+ rel: "noopener noreferrer",
16817
+ children: [
16818
+ purchaseLabel,
16819
+ /* @__PURE__ */ jsx(IconArrowRight, { className: ticketCardPurchaseButtonIconVariants({ size: size3 }) })
16820
+ ]
16016
16821
  }
16017
- ) }),
16018
- /* @__PURE__ */ jsx(
16822
+ ),
16823
+ (!purchaseUrl || isPurchaseDisabled) && /* @__PURE__ */ jsxs(
16019
16824
  "div",
16020
16825
  {
16021
16826
  className: cn(
16022
- "absolute inset-0 opacity-0 transition-opacity duration-normal group-hover:opacity-100",
16023
- DOMAIN_TOKENS.image.overlay.gradient
16024
- )
16827
+ "w-full",
16828
+ ticketCardPurchaseButtonVariants({ size: size3, disabled: isPurchaseDisabled })
16829
+ ),
16830
+ children: [
16831
+ purchaseLabel,
16832
+ /* @__PURE__ */ jsx(IconArrowRight, { className: ticketCardPurchaseButtonIconVariants({ size: size3 }) })
16833
+ ]
16025
16834
  }
16026
16835
  )
16027
- ] }) }),
16836
+ ] }) })
16837
+ ]
16838
+ }
16839
+ ) });
16840
+ }
16841
+ );
16842
+ TicketCard.displayName = "TicketCard";
16843
+ var eventCardVariants = cva(
16844
+ // Base classes - surface, border, radius, shadow, motion from tokens
16845
+ `${DOMAIN_TOKENS.surface.bg.default} ${DOMAIN_TOKENS.surface.border.default} ${DOMAIN_TOKENS.surface.radius.default} ${DOMAIN_TOKENS.surface.shadow.default} ${DOMAIN_TOKENS.surface.bg.hover} ${DOMAIN_TOKENS.surface.border.hover} ${DOMAIN_TOKENS.surface.elevation.hover} ${DOMAIN_TOKENS.motion.hover.transition} overflow-hidden`,
16846
+ {
16847
+ variants: {
16848
+ size: {
16849
+ default: `${CARD_TOKENS.size.md.padding} ${DOMAIN_TOKENS.layout.gap.default}`,
16850
+ compact: `${CARD_TOKENS.size.sm.padding} ${DOMAIN_TOKENS.layout.gap.compact}`
16851
+ },
16852
+ layout: {
16853
+ vertical: "flex flex-col"
16854
+ },
16855
+ variant: {
16856
+ default: "",
16857
+ featured: `${DOMAIN_TOKENS.badges.surface.featured}`
16858
+ }
16859
+ },
16860
+ defaultVariants: {
16861
+ size: "default",
16862
+ layout: "vertical",
16863
+ variant: "default"
16864
+ }
16865
+ }
16866
+ );
16867
+ var eventCardBadgeVariants = cva(
16868
+ // Base classes - absolute positioning, z-index
16869
+ "absolute z-10",
16870
+ {
16871
+ variants: {
16872
+ size: {
16873
+ default: DOMAIN_TOKENS.badges.position.default,
16874
+ compact: DOMAIN_TOKENS.badges.position.compact
16875
+ }
16876
+ },
16877
+ defaultVariants: {
16878
+ size: "default"
16879
+ }
16880
+ }
16881
+ );
16882
+ var eventCardBadgeSurfaceVariants = cva(
16883
+ // Base classes - flex layout, items center, badge styling from tokens
16884
+ `inline-flex items-center ${DOMAIN_TOKENS.badges.radius} ${DOMAIN_TOKENS.badges.shadow} ${DOMAIN_TOKENS.badges.size.sm} ${DOMAIN_TOKENS.badges.text.color} ${TEXT_TOKENS.fontSize.xs} ${TEXT_TOKENS.fontWeight.semibold}`,
16885
+ {
16886
+ variants: {
16887
+ variant: {
16888
+ default: DOMAIN_TOKENS.badges.surface.default,
16889
+ featured: DOMAIN_TOKENS.badges.surface.featured
16890
+ }
16891
+ },
16892
+ defaultVariants: {
16893
+ variant: "featured"
16894
+ }
16895
+ }
16896
+ );
16897
+ var eventCardMetadataVariants = cva(
16898
+ // Base classes - flex column, metadata spacing from tokens
16899
+ `flex flex-col ${DOMAIN_TOKENS.metadata.spacing.vertical}`,
16900
+ {
16901
+ variants: {
16902
+ size: {
16903
+ default: "",
16904
+ compact: ""
16905
+ }
16906
+ },
16907
+ defaultVariants: {
16908
+ size: "default"
16909
+ }
16910
+ }
16911
+ );
16912
+ var eventCardMetadataItemVariants = cva(
16913
+ // Base classes - flex items center, metadata spacing and text from tokens
16914
+ `flex items-center ${DOMAIN_TOKENS.metadata.spacing.horizontal} ${DOMAIN_TOKENS.metadata.text.secondary} ${TEXT_TOKENS.fontSize.xs}`,
16915
+ {
16916
+ variants: {
16917
+ size: {
16918
+ default: "",
16919
+ compact: ""
16920
+ }
16921
+ },
16922
+ defaultVariants: {
16923
+ size: "default"
16924
+ }
16925
+ }
16926
+ );
16927
+ var eventCardMetadataIconVariants = cva(
16928
+ // Base classes - icon size and color from tokens
16929
+ `${DOMAIN_TOKENS.metadata.icon.sizeSm} ${DOMAIN_TOKENS.metadata.icon.default}`,
16930
+ {
16931
+ variants: {
16932
+ size: {
16933
+ default: "",
16934
+ compact: ""
16935
+ }
16936
+ },
16937
+ defaultVariants: {
16938
+ size: "default"
16939
+ }
16940
+ }
16941
+ );
16942
+ var eventCardFooterVariants = cva(
16943
+ // Base classes - border top, spacing from tokens
16944
+ "border-t border-border",
16945
+ {
16946
+ variants: {
16947
+ size: {
16948
+ default: DOMAIN_TOKENS.spacing.footer.paddingTopDefault,
16949
+ compact: DOMAIN_TOKENS.spacing.footer.paddingTopCompact
16950
+ }
16951
+ },
16952
+ defaultVariants: {
16953
+ size: "default"
16954
+ }
16955
+ }
16956
+ );
16957
+ var eventCardTicketButtonVariants = cva(
16958
+ // Base classes - flex layout, badge gradient, motion from tokens
16959
+ `inline-flex items-center justify-center ${DOMAIN_TOKENS.badges.surface.featured} ${DOMAIN_TOKENS.badges.text.color} ${DOMAIN_TOKENS.badges.shadow} ${DOMAIN_TOKENS.motion.hover.transition} ${TEXT_TOKENS.fontWeight.semibold} transform`,
16960
+ {
16961
+ variants: {
16962
+ size: {
16963
+ default: DOMAIN_TOKENS.spacing.button.paddingDefault,
16964
+ compact: DOMAIN_TOKENS.spacing.button.paddingCompact
16965
+ }
16966
+ },
16967
+ defaultVariants: {
16968
+ size: "default"
16969
+ }
16970
+ }
16971
+ );
16972
+ var eventCardTicketButtonIconVariants = cva(
16973
+ // Base classes - icon size and spacing from tokens
16974
+ `${DOMAIN_TOKENS.metadata.icon.sizeSm} ${DOMAIN_TOKENS.spacing.button.iconMarginLeft}`,
16975
+ {
16976
+ variants: {
16977
+ size: {
16978
+ default: "",
16979
+ compact: ""
16980
+ }
16981
+ },
16982
+ defaultVariants: {
16983
+ size: "default"
16984
+ }
16985
+ }
16986
+ );
16987
+ var eventCardPriceVariants = cva(
16988
+ // Base classes - price gradient text from tokens
16989
+ `bg-gradient-to-r from-accent-500 to-primary-600 bg-clip-text text-transparent`,
16990
+ {
16991
+ variants: {
16992
+ size: {
16993
+ default: TEXT_TOKENS.fontSize.lg,
16994
+ compact: TEXT_TOKENS.fontSize.md
16995
+ }
16996
+ },
16997
+ defaultVariants: {
16998
+ size: "default"
16999
+ }
17000
+ }
17001
+ );
17002
+ var EventCard = React49.forwardRef(
17003
+ ({
17004
+ title,
17005
+ description,
17006
+ date,
17007
+ venueName,
17008
+ price,
17009
+ imageUrl,
17010
+ href,
17011
+ ticketUrl,
17012
+ featured = false,
17013
+ showImage = true,
17014
+ getTicketsLabel,
17015
+ featuredBadgeText,
17016
+ size: size3 = "default",
17017
+ layout = "vertical",
17018
+ variant,
17019
+ className,
17020
+ animation,
17021
+ ...props
17022
+ }, ref) => {
17023
+ const animationProps = resolveComponentAnimations({
17024
+ animation: animation?.animation || "fadeInUp",
17025
+ hoverAnimation: animation?.hoverAnimation || "hoverLift",
17026
+ animationProps: animation?.animationProps
17027
+ });
17028
+ const cardVariant = variant || (featured ? "featured" : "default");
17029
+ return /* @__PURE__ */ jsx(Box, { ...animationProps, children: /* @__PURE__ */ jsxs(
17030
+ CardBase,
17031
+ {
17032
+ ref,
17033
+ size: size3,
17034
+ variant: cardVariant,
17035
+ className: cn(
17036
+ eventCardVariants({ size: size3, layout, variant: cardVariant }),
17037
+ "group relative",
17038
+ className
17039
+ ),
17040
+ ...props,
17041
+ children: [
17042
+ featured && featuredBadgeText && /* @__PURE__ */ jsx("div", { className: eventCardBadgeVariants({ size: size3 }), children: /* @__PURE__ */ jsx("span", { className: eventCardBadgeSurfaceVariants({ variant: "featured" }), children: featuredBadgeText }) }),
17043
+ showImage && /* @__PURE__ */ jsx(CardBaseImageWrapper, { size: size3, children: /* @__PURE__ */ jsxs(
17044
+ "div",
17045
+ {
17046
+ className: cn("relative w-full overflow-hidden", DOMAIN_TOKENS.surface.bg.default),
17047
+ children: [
17048
+ imageUrl ? /* @__PURE__ */ jsx(
17049
+ "img",
17050
+ {
17051
+ src: imageUrl,
17052
+ alt: title,
17053
+ className: cn(
17054
+ "h-full w-full object-cover",
17055
+ DOMAIN_TOKENS.motion.hover.transition,
17056
+ DOMAIN_TOKENS.motion.hover.scale
17057
+ )
17058
+ }
17059
+ ) : /* @__PURE__ */ jsx("div", { className: "flex h-full w-full items-center justify-center", children: /* @__PURE__ */ jsx(
17060
+ Icon2,
17061
+ {
17062
+ name: "info",
17063
+ size: "xl",
17064
+ color: "muted",
17065
+ className: ICON_TOKENS.sizes["4xl"],
17066
+ "aria-hidden": "true"
17067
+ }
17068
+ ) }),
17069
+ /* @__PURE__ */ jsx(
17070
+ "div",
17071
+ {
17072
+ className: cn(
17073
+ "absolute inset-0 opacity-0 group-hover:opacity-100",
17074
+ DOMAIN_TOKENS.motion.hover.transition,
17075
+ DOMAIN_TOKENS.image.overlay.gradient
17076
+ )
17077
+ }
17078
+ )
17079
+ ]
17080
+ }
17081
+ ) }),
16028
17082
  /* @__PURE__ */ jsxs(CardBaseContentWrapper, { size: size3, children: [
16029
17083
  /* @__PURE__ */ jsx(
16030
17084
  Heading,
16031
17085
  {
16032
17086
  level: 3,
16033
17087
  className: cn(
16034
- "line-clamp-2 transition-colors group-hover:text-primary",
17088
+ "line-clamp-2 group-hover:text-primary",
17089
+ DOMAIN_TOKENS.motion.hover.transition,
16035
17090
  TEXT_TOKENS.fontSize.lg,
16036
17091
  TEXT_TOKENS.fontWeight.bold,
16037
17092
  DOMAIN_TOKENS.spacing.section.titleToSubtitle
@@ -16043,7 +17098,7 @@ var TicketCard = React49.forwardRef(
16043
17098
  Text,
16044
17099
  {
16045
17100
  size: "sm",
16046
- variant: "muted",
17101
+ muted: true,
16047
17102
  className: cn(
16048
17103
  "line-clamp-2",
16049
17104
  size3 === "compact" ? DOMAIN_TOKENS.spacing.section.titleToSubtitle : DOMAIN_TOKENS.spacing.section.subtitleToMetadata
@@ -16051,48 +17106,56 @@ var TicketCard = React49.forwardRef(
16051
17106
  children: description
16052
17107
  }
16053
17108
  ),
16054
- (price || capacity) && /* @__PURE__ */ jsxs("div", { className: ticketCardPriceCapacityContainerVariants({ size: size3 }), children: [
16055
- price && /* @__PURE__ */ jsx(Text, { size: size3 === "compact" ? "md" : "lg", weight: "bold", children: /* @__PURE__ */ jsx("span", { className: ticketCardPriceVariants({ size: size3 }), children: price }) }),
16056
- capacity && /* @__PURE__ */ jsx(Text, { size: size3 === "compact" ? "xs" : "sm", children: /* @__PURE__ */ jsx("span", { className: ticketCardCapacityVariants({ size: size3 }), children: capacity }) })
16057
- ] }),
16058
- availabilityLabel && /* @__PURE__ */ jsx("div", { className: ticketCardAvailabilityVariants({ availability }), children: /* @__PURE__ */ jsx(Text, { size: "xs", variant: availability === "sold_out" ? "muted" : "primary", children: availabilityLabel }) })
17109
+ /* @__PURE__ */ jsxs("div", { className: eventCardMetadataVariants({ size: size3 }), children: [
17110
+ date && /* @__PURE__ */ jsxs("div", { className: eventCardMetadataItemVariants({ size: size3 }), role: "text", children: [
17111
+ /* @__PURE__ */ jsx(
17112
+ IconCalendar,
17113
+ {
17114
+ className: eventCardMetadataIconVariants({ size: size3 }),
17115
+ "aria-hidden": true
17116
+ }
17117
+ ),
17118
+ /* @__PURE__ */ jsx(Text, { size: "xs", muted: true, children: /* @__PURE__ */ jsx("time", { dateTime: date, children: date }) })
17119
+ ] }),
17120
+ venueName && /* @__PURE__ */ jsxs("div", { className: eventCardMetadataItemVariants({ size: size3 }), role: "text", children: [
17121
+ /* @__PURE__ */ jsx(
17122
+ IconLocation,
17123
+ {
17124
+ className: eventCardMetadataIconVariants({ size: size3 }),
17125
+ "aria-hidden": true
17126
+ }
17127
+ ),
17128
+ /* @__PURE__ */ jsx(Text, { size: "xs", muted: true, className: "line-clamp-1", children: /* @__PURE__ */ jsx("address", { children: venueName }) })
17129
+ ] })
17130
+ ] })
16059
17131
  ] }),
16060
- /* @__PURE__ */ jsx(CardBaseFooterWrapper, { size: size3, children: /* @__PURE__ */ jsxs("div", { className: cn("w-full", ticketCardFooterVariants({ size: size3 })), children: [
16061
- purchaseUrl && !isPurchaseDisabled && /* @__PURE__ */ jsxs(
17132
+ /* @__PURE__ */ jsx(CardBaseFooterWrapper, { size: size3, children: /* @__PURE__ */ jsxs("div", { className: cn("w-full", eventCardFooterVariants({ size: size3 })), children: [
17133
+ ticketUrl && /* @__PURE__ */ jsxs(
16062
17134
  Link,
16063
17135
  {
16064
- href: purchaseUrl,
16065
- className: cn(
16066
- "w-full",
16067
- ticketCardPurchaseButtonVariants({ size: size3, disabled: false })
16068
- ),
17136
+ href: ticketUrl,
17137
+ className: cn("w-full", eventCardTicketButtonVariants({ size: size3 })),
16069
17138
  target: "_blank",
16070
17139
  rel: "noopener noreferrer",
16071
17140
  children: [
16072
- purchaseLabel,
16073
- /* @__PURE__ */ jsx(IconArrowRight, { className: ticketCardPurchaseButtonIconVariants({ size: size3 }) })
17141
+ getTicketsLabel,
17142
+ /* @__PURE__ */ jsx(
17143
+ IconArrowRight,
17144
+ {
17145
+ className: eventCardTicketButtonIconVariants({ size: size3 }),
17146
+ "aria-hidden": true
17147
+ }
17148
+ )
16074
17149
  ]
16075
17150
  }
16076
17151
  ),
16077
- (!purchaseUrl || isPurchaseDisabled) && /* @__PURE__ */ jsxs(
16078
- "div",
16079
- {
16080
- className: cn(
16081
- "w-full",
16082
- ticketCardPurchaseButtonVariants({ size: size3, disabled: isPurchaseDisabled })
16083
- ),
16084
- children: [
16085
- purchaseLabel,
16086
- /* @__PURE__ */ jsx(IconArrowRight, { className: ticketCardPurchaseButtonIconVariants({ size: size3 }) })
16087
- ]
16088
- }
16089
- )
17152
+ !ticketUrl && price && /* @__PURE__ */ jsx("div", { className: "text-right", children: /* @__PURE__ */ jsx(Text, { size: size3 === "compact" ? "md" : "lg", weight: "bold", children: /* @__PURE__ */ jsx("span", { className: eventCardPriceVariants({ size: size3 }), children: price }) }) })
16090
17153
  ] }) })
16091
17154
  ]
16092
17155
  }
16093
17156
  ) });
16094
17157
  }
16095
17158
  );
16096
- TicketCard.displayName = "TicketCard";
17159
+ EventCard.displayName = "EventCard";
16097
17160
 
16098
- export { ALERT_TOKENS, Alert, ArtistCard, BUTTON_TOKENS, Backdrop, Body, Box, Breadcrumbs, Button, CARD_TOKENS, CHECKBOX_TOKENS, Caption, Card, CardBody, CardFooter, CardHeader, Checkbox, Code, Column, Container, Surface2 as ContainerSurface, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuItem, ContextMenuLabel, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuRoot, ContextMenuSeparator, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, DATA_TOKENS, DOMAIN_TOKENS, DROPDOWN_TOKENS, DataListRoot as DataList, DataListItem, DataListLabel, DataListRoot, DataListValue, Dialog, DialogBody, DialogDescription, DialogFooter, DialogHeader, DialogRoot, DialogTitle, Display, DropdownMenuCheckItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuRoot, DropdownMenuSeparator, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, EmptyStateAction, EmptyStateDescription, EmptyStateIcon, EmptyStateTitle, EventCard, FieldRoot as Field, Flex, Grid, Heading, HoverCardContent, HoverCardRoot, HoverCardTrigger, ICONS_MAP, ICON_TOKENS, INPUT_TOKENS, Icon2 as Icon, IconArrowRight, IconCalendar, IconCheck, IconChevronDown, IconChevronRight, IconClose, IconError, IconInfo, IconLocation, IconMenu, IconSearch, IconSuccess, IconWarning, Input, Label2 as Label, Lead, MENU_TOKENS, MOTION_TOKENS, Modal, ModalClose, ModalContent, ModalDescription, ModalFooter, ModalHeader, ModalOverlay, ModalRoot, ModalTitle, ModalTrigger, NAVIGATION_TOKENS, NOTIFICATION_TOKENS, NotificationCenter, NotificationCenterDismissAll, NotificationCenterGroupHeader, NotificationCenterItem, NotificationCenterList, NotificationCenterPanel, NotificationCenterProvider, NotificationCenterTrigger, OVERLAY_TOKENS, POPOVER_TOKENS, Pagination, PopoverArrow, PopoverContent, PopoverRoot, PopoverTrigger, Portal3 as Portal, PromoCard, RADIO_TOKENS, Radio, RadioGroup, Row, SECTION_TOKENS, SURFACE_TOKENS, SWITCH_TOKENS, Section, SegmentedControl, Select, SelectContent, SelectGroup, SelectIcon, SelectItem, SelectItemIndicator, SelectItemText, SelectLabel, SelectRoot, SelectSeparator, SelectTrigger, SelectValue, SelectViewport, Skeleton, Stack, Stepper, Surface, TEXT_TOKENS, TOAST_TOKENS, TOOLTIP_TOKENS, TableRoot as Table, TableBody, TableCell, TableEmpty, TableExpandableContent, TableHead, TableHeader, TableLoadingState, TableRoot, TableRow, TableSortIcon, Tabs, Text, Textarea, TicketCard, Toast, ToastProvider, ToastViewport, UI_COLORS, accentColoredShadows, accentColors, alertVariants, allCSSVariables, allCSSVariablesCSS, animations, baseColors, bodyVariants, borderRadius, buttonVariants, captionVariants, chartColors, checkboxVariants, codeVariants, colorCSSVariables, componentRadius, componentShadowMapping, surfaceVariants2 as containerSurfaceVariants, cssVariableColorTokens, displayVariants, durations, easings, elevationShadows, focusRings, fontFamily, fontSize, fontSizeWithMd, fontWeight, generateCSSVariablesCSS, glowEffects, headingVariants, iconVariants, inputVariants, keyframes, labelVariants, layoutSpacing, leadVariants, letterSpacing, lineHeight, motionCSSVariables, motionV2CSSVariables, motionV2Combined, motionV2Durations, motionV2Easings, motionV2Fade, motionV2Scale, motionV2Slide, motionV2TailwindConfig, motionV2Transitions, popoverContentVariants, primaryColoredShadows, primaryColors, radioVariants, radiusCSSVariables, reducedMotion, secondaryColors, segmentedControlItemVariants, segmentedControlRootVariants, semanticColors, semanticSpacing, shadowBase, shadowCSSVariables, shadowOpacity, skeletonVariants, spacing, spacingCSSVariables, springs, surfaceColors, surfaceVariants, tailwindMotionConfig, tailwindRadiusConfig, tailwindShadowConfig, tailwindSpacingConfig, tailwindThemeColors, tailwindTypographyConfig, textColors, textStyles, textVariants, textareaVariants, tokenSystemSummary, transitions, typographyCSSVariables, useNotificationCenter, useNotificationCenterContext, useTableContext, useToast };
17161
+ export { ALERT_TOKENS, Alert, ArtistCard, BUTTON_TOKENS, Backdrop, Body, Box, Breadcrumbs, Button, CARD_TOKENS, CHECKBOX_TOKENS, Caption, Card, CardBody, CardFooter, CardHeader, CategoryCard, Checkbox, Code, Column, Container, Surface2 as ContainerSurface, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuItem, ContextMenuLabel, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuRoot, ContextMenuSeparator, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, DATA_TOKENS, DOMAIN_TOKENS, DROPDOWN_TOKENS, DataListRoot as DataList, DataListItem, DataListLabel, DataListRoot, DataListValue, Dialog, DialogBody, DialogDescription, DialogFooter, DialogHeader, DialogRoot, DialogTitle, Display, DropdownMenuCheckItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuRoot, DropdownMenuSeparator, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, EmptyStateAction, EmptyStateDescription, EmptyStateIcon, EmptyStateTitle, EventCard, FieldRoot as Field, Flex, Grid, Heading, HoverCardContent, HoverCardRoot, HoverCardTrigger, ICONS_MAP, ICON_TOKENS, INPUT_TOKENS, Icon2 as Icon, IconArrowRight, IconCalendar, IconCheck, IconChevronDown, IconChevronRight, IconClose, IconError, IconInfo, IconLocation, IconMenu, IconSearch, IconSuccess, IconWarning, Input, Label2 as Label, Lead, MENU_TOKENS, MOTION_TOKENS, Modal, ModalClose, ModalContent, ModalDescription, ModalFooter, ModalHeader, ModalOverlay, ModalRoot, ModalTitle, ModalTrigger, NAVIGATION_TOKENS, NOTIFICATION_TOKENS, NotificationCenter, NotificationCenterDismissAll, NotificationCenterGroupHeader, NotificationCenterItem, NotificationCenterList, NotificationCenterPanel, NotificationCenterProvider, NotificationCenterTrigger, OVERLAY_TOKENS, POPOVER_TOKENS, Pagination, PopoverArrow, PopoverContent, PopoverRoot, PopoverTrigger, Portal3 as Portal, PromoCard, RADIO_TOKENS, Radio, RadioGroup, Row, SECTION_TOKENS, SURFACE_TOKENS, SWITCH_TOKENS, Section, SegmentedControl, Select, SelectContent, SelectGroup, SelectIcon, SelectItem, SelectItemIndicator, SelectItemText, SelectLabel, SelectRoot, SelectSeparator, SelectTrigger, SelectValue, SelectViewport, Skeleton, Stack, Stepper, Surface, TEXT_TOKENS, TOAST_TOKENS, TOOLTIP_TOKENS, TableRoot as Table, TableBody, TableCell, TableEmpty, TableExpandableContent, TableHead, TableHeader, TableLoadingState, TableRoot, TableRow, TableSortIcon, Tabs, Text, Textarea, TicketCard, Toast, ToastProvider, ToastViewport, UI_COLORS, accentColoredShadows, accentColors, alertVariants, allCSSVariables, allCSSVariablesCSS, animations, baseColors, bodyVariants, borderRadius, buttonVariants, captionVariants, chartColors, checkboxVariants, codeVariants, colorCSSVariables, componentRadius, componentShadowMapping, surfaceVariants2 as containerSurfaceVariants, cssVariableColorTokens, displayVariants, durations, easings, elevationShadows, focusRings, fontFamily, fontSize, fontSizeWithMd, fontWeight, generateCSSVariablesCSS, glowEffects, headingVariants, iconVariants, inputVariants, keyframes, labelVariants, layoutSpacing, leadVariants, letterSpacing, lineHeight, motionCSSVariables, motionV2CSSVariables, motionV2Combined, motionV2Durations, motionV2Easings, motionV2Fade, motionV2Scale, motionV2Slide, motionV2TailwindConfig, motionV2Transitions, popoverContentVariants, primaryColoredShadows, primaryColors, radioVariants, radiusCSSVariables, reducedMotion, secondaryColors, segmentedControlItemVariants, segmentedControlRootVariants, semanticColors, semanticSpacing, shadowBase, shadowCSSVariables, shadowOpacity, skeletonVariants, spacing, spacingCSSVariables, springs, surfaceColors, surfaceVariants, tailwindMotionConfig, tailwindRadiusConfig, tailwindShadowConfig, tailwindSpacingConfig, tailwindThemeColors, tailwindTypographyConfig, textColors, textStyles, textVariants, textareaVariants, tokenSystemSummary, transitions, typographyCSSVariables, useNotificationCenter, useNotificationCenterContext, useTableContext, useToast };