@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.cjs CHANGED
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
3
  var reactSlot = require('@radix-ui/react-slot');
4
- var classVarianceAuthority = require('class-variance-authority');
5
4
  var React49 = require('react');
5
+ var classVarianceAuthority = require('class-variance-authority');
6
6
  var clsx = require('clsx');
7
7
  var tailwindMerge = require('tailwind-merge');
8
8
  var jsxRuntime = require('react/jsx-runtime');
@@ -49,13 +49,18 @@ var primaryColors = {
49
49
  100: "210 40% 96%",
50
50
  200: "217 32.6% 17.5%",
51
51
  300: "216 28% 26%",
52
- 400: "215 25% 27%",
53
- 500: "215 20% 35%",
54
- // Base primary
55
- 600: "215 16% 47%",
56
- 700: "216 12% 54%",
57
- 800: "217 10% 62%",
58
- 900: "222 47.4% 11.2%",
52
+ 400: "215 25% 30%",
53
+ // Adjusted for better progression
54
+ 500: "215 20% 38%",
55
+ // Adjusted for better progression
56
+ 600: "215 16% 45%",
57
+ // Adjusted for better progression
58
+ 700: "216 12% 35%",
59
+ // Rebalanced for semantic strength (L* ~35)
60
+ 800: "217 10% 28%",
61
+ // Adjusted for proper progression
62
+ 900: "222 47.4% 18%",
63
+ // Adjusted for better progression
59
64
  950: "222 84% 4.9%"
60
65
  // Darkest blue
61
66
  };
@@ -65,12 +70,15 @@ var accentColors = {
65
70
  200: "280 60% 85%",
66
71
  300: "280 55% 75%",
67
72
  400: "280 50% 65%",
68
- 500: "280 70% 67%",
69
- // Base accent (night mode primary)
70
- 600: "259 65% 58%",
71
- 700: "259 60% 50%",
72
- 800: "259 55% 45%",
73
- 900: "259 50% 40%",
73
+ 500: "280 65% 72%",
74
+ // Adjusted for WCAG AA contrast (4.5:1) with dark text in night mode
75
+ 600: "259 65% 59%",
76
+ // Default accent - lightened for better contrast vs secondary (L* ~59, was 52, 15 delta from secondary-600)
77
+ 700: "259 60% 44%",
78
+ // Active state - rebalanced for semantic strength (L* ~44, 12 delta from secondary-700)
79
+ 800: "259 55% 38%",
80
+ // Adjusted for proper progression
81
+ 900: "259 50% 32%",
74
82
  950: "259 45% 30%"
75
83
  };
76
84
  var secondaryColors = {
@@ -79,12 +87,15 @@ var secondaryColors = {
79
87
  200: "173 100% 85%",
80
88
  300: "173 100% 70%",
81
89
  400: "173 100% 55%",
82
- 500: "173 100% 37%",
83
- // Base secondary (Tenerife #00bfa6)
84
- 600: "173 100% 32%",
85
- 700: "173 95% 27%",
90
+ 500: "173 100% 45%",
91
+ // Adjusted for better scale progression
92
+ 600: "173 100% 44%",
93
+ // Default secondary - rebalanced for better contrast vs primary (L* ~44, was 38)
94
+ 700: "173 95% 32%",
95
+ // Active state - rebalanced for semantic strength (L* ~32)
86
96
  800: "173 90% 22%",
87
- 900: "173 85% 17%",
97
+ // Primary variant - darkened for dominance (L* ~22, was 26)
98
+ 900: "173 85% 20%",
88
99
  950: "173 80% 12%"
89
100
  };
90
101
  var surfaceColors = {
@@ -177,13 +188,13 @@ var chartColors = {
177
188
  var textColors = {
178
189
  day: {
179
190
  primary: "0 0% 9%",
180
- // Almost black
191
+ // Almost black (neutral-900 equivalent)
181
192
  secondary: "0 0% 45%",
182
193
  // Medium gray
183
194
  tertiary: "0 0% 65%",
184
195
  // Light gray
185
- muted: "0 0% 38%",
186
- // Muted gray with stronger contrast
196
+ muted: "0 0% 42%",
197
+ // Muted gray - adjusted for WCAG AA contrast (4.5:1) on surface.elevated2
187
198
  inverse: "0 0% 100%"
188
199
  // White (for dark backgrounds)
189
200
  },
@@ -495,6 +506,139 @@ var ALERT_TOKENS = {
495
506
  }
496
507
  };
497
508
 
509
+ // src/tokens/components/motion.ts
510
+ var MOTION_TOKENS = {
511
+ /**
512
+ * Transition property tokens
513
+ * Maps to Tailwind transition utilities
514
+ */
515
+ transition: {
516
+ all: "transition-all",
517
+ // All properties
518
+ colors: "transition-colors",
519
+ // Color properties only
520
+ opacity: "transition-opacity",
521
+ // Opacity only
522
+ transform: "transition-transform",
523
+ // Transform only
524
+ shadow: "transition-shadow",
525
+ // Box shadow only
526
+ none: "transition-none"
527
+ // No transition
528
+ },
529
+ /**
530
+ * Duration tokens
531
+ * Maps to foundation motion duration tokens via Tailwind
532
+ */
533
+ duration: {
534
+ instant: "duration-0",
535
+ // 0ms
536
+ fast: "duration-fast",
537
+ // 150ms - maps to motion.durations.fast
538
+ normal: "duration-normal",
539
+ // 300ms - maps to motion.durations.normal
540
+ slow: "duration-slow",
541
+ // 500ms - maps to motion.durations.slow
542
+ slower: "duration-slower",
543
+ // 700ms - maps to motion.durations.slower
544
+ slowest: "duration-slowest",
545
+ // 1000ms - maps to motion.durations.slowest
546
+ // Granular durations
547
+ "75": "duration-75",
548
+ // 75ms
549
+ "100": "duration-100",
550
+ // 100ms
551
+ "200": "duration-200",
552
+ // 200ms
553
+ "250": "duration-250",
554
+ // 250ms
555
+ "300": "duration-300",
556
+ // 300ms
557
+ "400": "duration-400",
558
+ // 400ms
559
+ "500": "duration-500",
560
+ // 500ms
561
+ "600": "duration-600",
562
+ // 600ms
563
+ "700": "duration-700",
564
+ // 700ms
565
+ "800": "duration-800",
566
+ // 800ms
567
+ "1000": "duration-1000"
568
+ // 1000ms
569
+ },
570
+ /**
571
+ * Easing tokens
572
+ * Maps to foundation motion easing tokens via Tailwind
573
+ */
574
+ easing: {
575
+ linear: "ease-linear",
576
+ // Linear easing
577
+ in: "ease-in",
578
+ // Ease in
579
+ out: "ease-out",
580
+ // Ease out (recommended for most UI)
581
+ "in-out": "ease-in-out",
582
+ // Ease in-out
583
+ bounce: "ease-bounce",
584
+ // Bounce easing
585
+ elastic: "ease-elastic"
586
+ // Elastic easing
587
+ },
588
+ /**
589
+ * Pre-configured transition tokens
590
+ * Combines duration and easing for common use cases
591
+ */
592
+ transitionPreset: {
593
+ fast: "transition-all duration-fast ease-out",
594
+ // Fast transition
595
+ normal: "transition-all duration-normal ease-in-out",
596
+ // Normal transition (default)
597
+ slow: "transition-all duration-slow ease-in-out",
598
+ // Slow transition
599
+ colors: "transition-colors duration-normal ease-out",
600
+ // Color transitions (common)
601
+ transform: "transition-transform duration-normal ease-out",
602
+ // Transform transitions
603
+ opacity: "transition-opacity duration-fast ease-out"
604
+ // Opacity transitions
605
+ },
606
+ /**
607
+ * Animation tokens
608
+ * Maps to foundation motion animation tokens via Tailwind
609
+ */
610
+ animation: {
611
+ none: "animate-none",
612
+ // No animation
613
+ spin: "animate-spin",
614
+ // Spin animation
615
+ pulse: "animate-pulse",
616
+ // Pulse animation
617
+ bounce: "animate-bounce",
618
+ // Bounce animation
619
+ ping: "animate-ping",
620
+ // Ping animation
621
+ shake: "animate-shake",
622
+ // Shake animation
623
+ fadeIn: "animate-fadeIn",
624
+ // Fade in
625
+ fadeOut: "animate-fadeOut",
626
+ // Fade out
627
+ slideInUp: "animate-slideInUp",
628
+ // Slide in from bottom
629
+ slideInDown: "animate-slideInDown",
630
+ // Slide in from top
631
+ slideInLeft: "animate-slideInLeft",
632
+ // Slide in from right
633
+ slideInRight: "animate-slideInRight",
634
+ // Slide in from left
635
+ scaleIn: "animate-scaleIn",
636
+ // Scale in
637
+ scaleOut: "animate-scaleOut"
638
+ // Scale out
639
+ }
640
+ };
641
+
498
642
  // src/tokens/components/button.ts
499
643
  var BUTTON_TOKENS = {
500
644
  /**
@@ -527,25 +671,48 @@ var BUTTON_TOKENS = {
527
671
  vertical: {
528
672
  sm: "py-xs",
529
673
  // 4px (0.25rem) - maps to semanticSpacing.xs
530
- md: "py-sm"
674
+ md: "py-sm",
531
675
  // 8px (0.5rem) - maps to semanticSpacing.sm
676
+ lg: "py-md"
677
+ // 16px (1rem) - maps to semanticSpacing.md - standardized for visual distinction
532
678
  }
533
679
  },
534
680
  /**
535
- * Gap between icon and text
681
+ * Gap between icon and text by size
682
+ * Scales with button size for visual consistency
536
683
  */
537
- gap: "gap-sm",
538
- // 8px (0.5rem) - maps to semanticSpacing.sm
684
+ gap: {
685
+ sm: "gap-xs",
686
+ // 4px (0.25rem) - smaller gap for small buttons
687
+ md: "gap-sm",
688
+ // 8px (0.5rem) - medium gap for medium buttons
689
+ lg: "gap-md"
690
+ // 16px (1rem) - larger gap for large buttons
691
+ },
539
692
  /**
540
693
  * Border radius for all button sizes
694
+ * Consistent radius across sizes for visual harmony
695
+ *
696
+ * @enforcement TUNG_TOKEN_AUTHORITY_EXPANSION_PLAN
697
+ * @rule References componentRadius.button.md (6px / 0.375rem) from Radius Authority
698
+ * @see docs/architecture/RADIUS_AUTHORITY_CONTRACT.md
541
699
  */
542
700
  radius: "rounded-md",
543
- // 6px (0.375rem) - maps to borderRadius.md
701
+ // References componentRadius.button.md (6px / 0.375rem) - Radius Authority compliant
544
702
  /**
545
- * Icon size within buttons
703
+ * Icon size within buttons by button size
704
+ * Scales proportionally with button size for visual balance
546
705
  */
547
- iconSize: "size-4",
548
- // 16px (1rem) - maps to spacing[4]
706
+ iconSize: {
707
+ sm: "size-3.5",
708
+ // 14px (0.875rem) - smaller icon for small buttons
709
+ md: "size-4",
710
+ // 16px (1rem) - medium icon for medium buttons
711
+ lg: "size-5",
712
+ // 20px (1.25rem) - larger icon for large buttons
713
+ icon: "size-4"
714
+ // 16px (1rem) - medium icon for icon-only buttons
715
+ },
549
716
  /**
550
717
  * Width tokens
551
718
  */
@@ -555,15 +722,19 @@ var BUTTON_TOKENS = {
555
722
  },
556
723
  /**
557
724
  * Font sizes by button size
558
- * Maps to foundation typography fontSize tokens
725
+ * References foundation typography fontSize tokens from Typography Authority
726
+ *
727
+ * @enforcement TUNG_TOKEN_AUTHORITY_EXPANSION_PLAN
728
+ * @rule All fontSize values reference Typography Authority tokens
729
+ * @see docs/architecture/TYPOGRAPHY_AUTHORITY_CONTRACT.md
559
730
  */
560
731
  fontSize: {
561
732
  sm: "text-xs",
562
- // Maps to fontSize.xs[0]
733
+ // References fontSize.xs[0] from Typography Authority (~12px)
563
734
  md: "text-sm",
564
- // Maps to fontSize.sm[0]
565
- lg: "text-sm"
566
- // Maps to fontSize.sm[0]
735
+ // References fontSize.sm[0] from Typography Authority (~14px)
736
+ lg: "text-base"
737
+ // References fontSize.base[0] from Typography Authority (~16px)
567
738
  },
568
739
  /**
569
740
  * Shadow tokens by variant
@@ -578,50 +749,137 @@ var BUTTON_TOKENS = {
578
749
  /**
579
750
  * Color tokens for button variants
580
751
  * Uses semantic color tokens that map to CSS variables
752
+ *
753
+ * State tokens (hover, active, disabled) use CSS variables from State Matrix.
754
+ * All states are injected via updateStateMatrixFromTokens() and consumed via arbitrary values.
755
+ * States react to Color Authority changes automatically through State Matrix.
756
+ *
757
+ * Interaction Authority Rules:
758
+ * - Hover (Priority 4): hover: prefix - ONLY when !disabled && !loading && pointer-events:auto
759
+ * - Active (Priority 3): active: prefix - ONLY when !disabled && !loading && mousedown
760
+ * - Focus (Priority 5): focus-visible: prefix - ONLY when !disabled && keyboard navigation
761
+ * - Disabled (Priority 1): disabled: prefix - Blocks ALL interactions
762
+ * - Loading (Priority 2): loading: prefix - Blocks hover/active (when implemented)
763
+ * - Base (Priority 6): No prefix - Default state, pointer-events: auto
764
+ *
765
+ * @enforcement TUNG_STATE_AUTHORITY_FOUNDATION_LOCK
766
+ * @enforcement TUNG_INTERACTION_AUTHORITY_FOUNDATION
767
+ * @rule States use CSS variables, not Tailwind variants
768
+ * @rule All state variables follow pattern: --{component}-{variant}-{state}-{property}
769
+ * @rule Visual states (colors) are SEPARATE from interaction states (pointer-events)
770
+ * @rule Hover MUST work with real mouse cursor, NOT just DevTools force state
771
+ * @rule Active MUST activate only on mousedown, NOT on hover
772
+ * @rule Focus MUST activate only on keyboard navigation, NOT on mouse click
773
+ *
774
+ * @see docs/architecture/INTERACTION_AUTHORITY_CONTRACT.md
581
775
  */
582
776
  variant: {
583
777
  primary: {
584
- background: "bg-primary",
585
- // Primary background using CSS var
778
+ background: "bg-[hsl(var(--button-primary-base-bg))]",
779
+ // Primary base background - CSS variable from State Matrix
586
780
  text: "text-primary-foreground",
587
781
  // Primary text using CSS var
588
- hover: "hover:bg-primary/90"
589
- // Primary hover using CSS var
782
+ hover: "hover:bg-[hsl(var(--button-primary-hover-bg))]",
783
+ // Primary hover - CSS variable from State Matrix (Priority 4: blocked by disabled/loading)
784
+ active: "active:bg-[hsl(var(--button-primary-active-bg))]",
785
+ // Primary active - CSS variable from State Matrix (Priority 3: blocked by disabled/loading, priority over hover)
786
+ focus: "focus-visible:bg-[hsl(var(--button-primary-focus-bg))]",
787
+ // Primary focus - CSS variable from State Matrix (Priority 5: keyboard navigation only)
788
+ disabled: {
789
+ background: "disabled:bg-[hsl(var(--button-primary-disabled-bg))]",
790
+ // Disabled background - CSS variable from State Matrix (Priority 1: blocks all)
791
+ text: "disabled:text-[hsl(var(--button-primary-disabled-text))]"
792
+ // Disabled text - CSS variable from State Matrix
793
+ },
794
+ loading: "bg-[hsl(var(--button-primary-loading-bg))]"
795
+ // Primary loading - CSS variable from State Matrix (Priority 2: blocks hover/active, used with aria-busy/data-loading when implemented)
590
796
  },
591
797
  secondary: {
592
798
  background: "bg-secondary",
593
799
  // Secondary background using CSS var
594
800
  text: "text-secondary-foreground",
595
801
  // Secondary text using CSS var
596
- hover: "hover:bg-secondary/80"
597
- // Secondary hover using CSS var
802
+ hover: "hover:bg-[hsl(var(--button-secondary-hover-bg))]",
803
+ // Secondary hover - CSS variable from State Matrix
804
+ active: "active:bg-[hsl(var(--button-secondary-active-bg))]",
805
+ // Secondary active - CSS variable from State Matrix
806
+ disabled: {
807
+ background: "disabled:bg-[hsl(var(--button-secondary-disabled-bg))]",
808
+ // Disabled background - CSS variable from State Matrix
809
+ text: "disabled:text-[hsl(var(--button-secondary-disabled-text))]"
810
+ // Disabled text - CSS variable from State Matrix
811
+ }
598
812
  },
599
813
  accent: {
600
814
  background: "bg-accent",
601
815
  // Accent background using CSS var
602
816
  text: "text-accent-foreground",
603
817
  // Accent text using CSS var
604
- hover: "hover:bg-accent/90"
605
- // Accent hover using CSS var
818
+ hover: "hover:bg-[hsl(var(--button-accent-hover-bg))]",
819
+ // Accent hover - CSS variable from State Matrix
820
+ active: "active:bg-[hsl(var(--button-accent-active-bg))]",
821
+ // Accent active - CSS variable from State Matrix
822
+ disabled: {
823
+ background: "disabled:bg-[hsl(var(--button-accent-disabled-bg))]",
824
+ // Disabled background - CSS variable from State Matrix
825
+ text: "disabled:text-[hsl(var(--button-accent-disabled-text))]"
826
+ // Disabled text - CSS variable from State Matrix
827
+ }
606
828
  },
607
829
  outline: {
608
830
  border: "border border-input",
609
831
  // Input border using CSS var
610
832
  background: "bg-background",
611
833
  // Background using CSS var
834
+ text: "text-foreground",
835
+ // Foreground text using CSS var
612
836
  hover: {
613
- background: "hover:bg-accent",
614
- // Accent hover using CSS var
615
- text: "hover:text-accent-foreground"
616
- // Accent text using CSS var
837
+ background: "hover:bg-[hsl(var(--button-outline-hover-bg))]",
838
+ // Outline hover background - CSS variable from State Matrix
839
+ text: "hover:text-[hsl(var(--button-outline-hover-text))]",
840
+ // Outline hover text - CSS variable from State Matrix
841
+ border: "hover:border-[hsl(var(--button-outline-hover-border))]"
842
+ // Outline hover border - CSS variable from State Matrix
843
+ },
844
+ active: {
845
+ background: "active:bg-[hsl(var(--button-outline-active-bg))]",
846
+ // Outline active background - CSS variable from State Matrix
847
+ text: "active:text-[hsl(var(--button-outline-active-text))]",
848
+ // Outline active text - CSS variable from State Matrix
849
+ border: "active:border-[hsl(var(--button-outline-active-border))]"
850
+ // Outline active border - CSS variable from State Matrix
851
+ },
852
+ disabled: {
853
+ background: "disabled:bg-[hsl(var(--button-outline-disabled-bg))]",
854
+ // Disabled background - CSS variable from State Matrix
855
+ text: "disabled:text-[hsl(var(--button-outline-disabled-text))]",
856
+ // Disabled text - CSS variable from State Matrix
857
+ border: "disabled:border-[hsl(var(--button-outline-disabled-border))]"
858
+ // Disabled border - CSS variable from State Matrix
617
859
  }
618
860
  },
619
861
  ghost: {
862
+ background: "bg-transparent",
863
+ // Transparent background
864
+ text: "text-foreground",
865
+ // Foreground text using CSS var
620
866
  hover: {
621
- background: "hover:bg-accent",
622
- // Accent hover using CSS var
623
- text: "hover:text-accent-foreground"
624
- // Accent text using CSS var
867
+ background: "hover:bg-[hsl(var(--button-ghost-hover-bg))]",
868
+ // Ghost hover background - CSS variable from State Matrix
869
+ text: "hover:text-[hsl(var(--button-ghost-hover-text))]"
870
+ // Ghost hover text - CSS variable from State Matrix
871
+ },
872
+ active: {
873
+ background: "active:bg-[hsl(var(--button-ghost-active-bg))]",
874
+ // Ghost active background - CSS variable from State Matrix
875
+ text: "active:text-[hsl(var(--button-ghost-active-text))]"
876
+ // Ghost active text - CSS variable from State Matrix
877
+ },
878
+ disabled: {
879
+ background: "disabled:bg-[hsl(var(--button-ghost-disabled-bg))]",
880
+ // Disabled background - CSS variable from State Matrix
881
+ text: "disabled:text-[hsl(var(--button-ghost-disabled-text))]"
882
+ // Disabled text - CSS variable from State Matrix
625
883
  }
626
884
  },
627
885
  destructive: {
@@ -629,16 +887,94 @@ var BUTTON_TOKENS = {
629
887
  // Destructive background using CSS var
630
888
  text: "text-destructive-foreground",
631
889
  // Destructive text using CSS var
632
- hover: "hover:bg-destructive/90"
633
- // Destructive hover using CSS var
890
+ hover: "hover:bg-[hsl(var(--button-destructive-hover-bg))]",
891
+ // Destructive hover - CSS variable from State Matrix
892
+ active: "active:bg-[hsl(var(--button-destructive-active-bg))]",
893
+ // Destructive active - CSS variable from State Matrix
894
+ disabled: {
895
+ background: "disabled:bg-[hsl(var(--button-destructive-disabled-bg))]",
896
+ // Disabled background - CSS variable from State Matrix
897
+ text: "disabled:text-[hsl(var(--button-destructive-disabled-text))]"
898
+ // Disabled text - CSS variable from State Matrix
899
+ }
634
900
  }
635
901
  },
636
902
  /**
637
903
  * Transition tokens
904
+ * References Motion Authority tokens for consistent motion behavior
905
+ *
906
+ * @enforcement TUNG_TOKEN_AUTHORITY_EXPANSION_PLAN
907
+ * @rule Uses MOTION_TOKENS.transitionPreset.colors from Motion Authority
908
+ * @rule Motion transitions MUST use canonical motion tokens only
909
+ * @see docs/architecture/MOTION_AUTHORITY_CONTRACT.md
638
910
  */
639
911
  transition: {
640
- colors: "transition-colors"
641
- // Color transition using motion tokens
912
+ colors: MOTION_TOKENS.transitionPreset.colors
913
+ // "transition-colors duration-normal ease-out" - Motion Authority compliant
914
+ },
915
+ /**
916
+ * Global state tokens
917
+ * Shared state tokens that apply across all variants
918
+ * Variant-specific states are defined in variant.*.active and variant.*.disabled
919
+ *
920
+ * @enforcement TUNG_INTERACTION_AUTHORITY_FOUNDATION
921
+ * @rule All interaction states MUST follow Interaction Authority Contract
922
+ * @rule State priority: disabled > loading > active > hover > focus-visible > base
923
+ * @rule Visual states (colors) are SEPARATE from interaction states (pointer-events, cursor)
924
+ * @rule All states MUST be browser-native (CSS pseudo-classes), NOT JavaScript-managed
925
+ */
926
+ state: {
927
+ /**
928
+ * Disabled state tokens
929
+ * Global disabled state tokens (variant-specific overrides in variant.*.disabled)
930
+ *
931
+ * Interaction Authority Rules:
932
+ * - Priority: 1 (Highest) - Blocks ALL interactions
933
+ * - MUST block hover, active, and focus states
934
+ * - MUST use disabled: prefix (never in base state)
935
+ * - Base state MUST have pointer-events: auto (default) for hover to work
936
+ *
937
+ * @enforcement TUNG_INTERACTION_AUTHORITY_FOUNDATION
938
+ * @enforcement TUNG_BUTTON_INTERACTION_FIX
939
+ * @rule Interaction Authority: pointer-events is NOT a visual token
940
+ * @rule pointer-events-none MUST use disabled: prefix (never in base state)
941
+ * @rule Base state MUST have pointer-events: auto (default) for hover to work
942
+ * @rule These tokens are applied in base but only activate when element is disabled
943
+ * @rule Hover is FORBIDDEN when disabled={true}
944
+ * @rule Active is FORBIDDEN when disabled={true}
945
+ * @rule Focus is FORBIDDEN when disabled={true} (for interactions)
946
+ *
947
+ * @see docs/architecture/INTERACTION_AUTHORITY_CONTRACT.md
948
+ */
949
+ disabled: {
950
+ cursor: "disabled:cursor-not-allowed",
951
+ // Disabled cursor style (only applies when disabled)
952
+ pointerEvents: "disabled:pointer-events-none"
953
+ // Disable pointer events (only applies when disabled)
954
+ },
955
+ /**
956
+ * Focus state tokens
957
+ * Focus ring for keyboard navigation
958
+ *
959
+ * Interaction Authority Rules:
960
+ * - Priority: 5 - Lower than active and hover
961
+ * - MUST activate only on keyboard navigation (focus-visible: prefix)
962
+ * - MUST NOT activate on mouse click (use :focus-visible, not :focus)
963
+ * - MUST be blocked by disabled state
964
+ *
965
+ * @enforcement TUNG_INTERACTION_AUTHORITY_FOUNDATION
966
+ * @rule Focus MUST use focus-visible: prefix (keyboard navigation only)
967
+ * @rule Focus MUST be blocked when disabled={true}
968
+ * @rule Focus MUST NOT activate on mouse click
969
+ *
970
+ * @see docs/architecture/INTERACTION_AUTHORITY_CONTRACT.md
971
+ */
972
+ focus: {
973
+ ring: "focus-visible:ring-1 focus-visible:ring-ring",
974
+ // Focus ring using semantic ring color
975
+ outline: "focus-visible:outline-none"
976
+ // Remove default outline (replaced by ring)
977
+ }
642
978
  }
643
979
  };
644
980
 
@@ -726,6 +1062,68 @@ var CARD_TOKENS = {
726
1062
  }
727
1063
  };
728
1064
 
1065
+ // src/tokens/components/artist.ts
1066
+ var ARTIST_TOKENS = {
1067
+ /**
1068
+ * Image container tokens
1069
+ * Layout classes for image container wrapper
1070
+ */
1071
+ image: {
1072
+ /**
1073
+ * Container layout tokens
1074
+ * Positioning and sizing for image container
1075
+ */
1076
+ container: {
1077
+ /**
1078
+ * Base container layout
1079
+ * Relative positioning, full width, overflow hidden
1080
+ * Uses Tailwind layout utilities (allowed per architecture)
1081
+ */
1082
+ layout: "relative w-full overflow-hidden"
1083
+ },
1084
+ /**
1085
+ * Image sizing tokens
1086
+ * Full width and height for images
1087
+ */
1088
+ sizing: {
1089
+ /**
1090
+ * Full size image
1091
+ * Uses Tailwind sizing utilities (allowed per architecture)
1092
+ */
1093
+ full: "h-full w-full"
1094
+ },
1095
+ /**
1096
+ * Placeholder container tokens
1097
+ * Layout for placeholder icon container when no image is provided
1098
+ */
1099
+ placeholder: {
1100
+ /**
1101
+ * Placeholder container layout
1102
+ * Flex centering for placeholder icon
1103
+ * Uses Tailwind layout utilities (allowed per architecture)
1104
+ */
1105
+ container: "flex h-full w-full items-center justify-center"
1106
+ }
1107
+ },
1108
+ /**
1109
+ * Footer border tokens
1110
+ * Border styling for card footer separator
1111
+ */
1112
+ footer: {
1113
+ /**
1114
+ * Footer border tokens
1115
+ * Top border separator for footer section
1116
+ */
1117
+ border: {
1118
+ /**
1119
+ * Footer border top
1120
+ * Uses semantic border color token
1121
+ */
1122
+ top: "border-t border-border"
1123
+ }
1124
+ }
1125
+ };
1126
+
729
1127
  // src/tokens/spacing.ts
730
1128
  var spacing = {
731
1129
  // Zero spacing
@@ -989,139 +1387,44 @@ var tailwindSpacingConfig = {
989
1387
  // src/tokens/components/data.ts
990
1388
  var DATA_TOKENS = {
991
1389
  /**
992
- * Table Component Tokens
1390
+ * Skeleton Component Tokens
993
1391
  */
994
- table: {
1392
+ skeleton: {
995
1393
  /**
996
- * Table row heights by size
1394
+ * Skeleton heights by variant
997
1395
  * Maps to Tailwind height utilities
998
1396
  */
999
- rowHeight: {
1000
- sm: "h-8",
1001
- // 32px (2rem) - compact rows
1002
- md: "h-10",
1003
- // 40px (2.5rem) - default rows
1004
- lg: "h-12"
1005
- // 48px (3rem) - spacious rows
1006
- },
1007
- /**
1008
- * Table cell and header padding by size
1009
- * Maps to semantic spacing tokens
1010
- */
1011
- padding: {
1012
- cell: {
1013
- sm: "p-xs",
1014
- // 4px (0.25rem) - maps to semanticSpacing.xs
1015
- md: "p-sm",
1016
- // 8px (0.5rem) - maps to semanticSpacing.sm
1017
- lg: "p-md"
1018
- // 16px (1rem) - maps to semanticSpacing.md
1019
- },
1020
- header: {
1021
- sm: "px-xs py-sm",
1022
- // 4px horizontal, 8px vertical
1023
- md: "px-sm py-md",
1024
- // 8px horizontal, 16px vertical
1025
- lg: "px-md py-lg"
1026
- // 16px horizontal, 24px vertical
1027
- }
1028
- },
1029
- /**
1030
- * Gap between table cells (horizontal spacing)
1031
- */
1032
- gap: {
1033
- sm: "gap-xs",
1034
- // 4px (0.25rem) - maps to semanticSpacing.xs
1035
- md: "gap-sm"
1036
- // 8px (0.5rem) - maps to semanticSpacing.sm
1397
+ height: {
1398
+ text: "h-4",
1399
+ // 16px (1rem) - text line height
1400
+ circle: "h-10 w-10",
1401
+ // 40px × 40px (2.5rem) - circular skeleton
1402
+ block: "h-20",
1403
+ // 80px (5rem) - block skeleton
1404
+ card: "h-32",
1405
+ // 128px (8rem) - card skeleton
1406
+ inline: "h-4"
1407
+ // 16px (1rem) - inline text
1037
1408
  },
1038
1409
  /**
1039
- * Border radius for table
1410
+ * Border radius by variant
1411
+ * Maps to foundation borderRadius tokens
1040
1412
  */
1041
1413
  radius: {
1042
- default: "rounded-md"
1414
+ text: "rounded-sm",
1415
+ // 4px (0.25rem) - maps to borderRadius.sm
1416
+ circle: "rounded-full",
1417
+ // Full circle - maps to borderRadius.full
1418
+ block: "rounded-md",
1043
1419
  // 6px (0.375rem) - maps to borderRadius.md
1420
+ card: "rounded-xl",
1421
+ // 12px (0.75rem) - maps to borderRadius.xl
1422
+ inline: "rounded-sm"
1423
+ // 4px (0.25rem) - maps to borderRadius.sm
1044
1424
  },
1045
1425
  /**
1046
- * Shadow tokens for table
1047
- * Maps to foundation elevation shadow tokens
1048
- */
1049
- shadow: {
1050
- none: "shadow-none",
1051
- // No shadow
1052
- subtle: "shadow-sm"
1053
- // Maps to elevationShadows.sm
1054
- },
1055
- /**
1056
- * Typography tokens for table headers and cells
1057
- * Maps to foundation typography fontSize tokens
1058
- */
1059
- typography: {
1060
- header: {
1061
- fontSize: "text-sm",
1062
- // Maps to fontSize.sm[0]
1063
- fontWeight: "font-semibold"
1064
- // Maps to fontWeight.semibold
1065
- },
1066
- cell: {
1067
- fontSize: "text-sm",
1068
- // Maps to fontSize.sm[0]
1069
- fontWeight: "font-normal"
1070
- // Maps to fontWeight.normal
1071
- }
1072
- },
1073
- /**
1074
- * Color tokens for table states
1075
- * Uses semantic color tokens
1076
- */
1077
- colors: {
1078
- border: "border-border",
1079
- // Border color
1080
- rowHover: "hover:bg-muted/50",
1081
- // Row hover background
1082
- rowSelected: "bg-muted"
1083
- // Selected row background
1084
- }
1085
- },
1086
- /**
1087
- * Skeleton Component Tokens
1088
- */
1089
- skeleton: {
1090
- /**
1091
- * Skeleton heights by variant
1092
- * Maps to Tailwind height utilities
1093
- */
1094
- height: {
1095
- text: "h-4",
1096
- // 16px (1rem) - text line height
1097
- circle: "h-10 w-10",
1098
- // 40px × 40px (2.5rem) - circular skeleton
1099
- block: "h-20",
1100
- // 80px (5rem) - block skeleton
1101
- card: "h-32",
1102
- // 128px (8rem) - card skeleton
1103
- inline: "h-4"
1104
- // 16px (1rem) - inline text
1105
- },
1106
- /**
1107
- * Border radius by variant
1108
- * Maps to foundation borderRadius tokens
1109
- */
1110
- radius: {
1111
- text: "rounded-sm",
1112
- // 4px (0.25rem) - maps to borderRadius.sm
1113
- circle: "rounded-full",
1114
- // Full circle - maps to borderRadius.full
1115
- block: "rounded-md",
1116
- // 6px (0.375rem) - maps to borderRadius.md
1117
- card: "rounded-xl",
1118
- // 12px (0.75rem) - maps to borderRadius.xl
1119
- inline: "rounded-sm"
1120
- // 4px (0.25rem) - maps to borderRadius.sm
1121
- },
1122
- /**
1123
- * Animation tokens
1124
- * Uses motion tokens for animations
1426
+ * Animation tokens
1427
+ * Uses motion tokens for animations
1125
1428
  */
1126
1429
  animation: {
1127
1430
  pulse: "animate-pulse",
@@ -1148,97 +1451,6 @@ var DATA_TOKENS = {
1148
1451
  inline: "inline-block"
1149
1452
  // Inline block display
1150
1453
  }
1151
- },
1152
- /**
1153
- * EmptyState Component Tokens
1154
- */
1155
- emptyState: {
1156
- /**
1157
- * Spacing tokens for EmptyState
1158
- * Maps to semantic spacing tokens
1159
- */
1160
- spacing: {
1161
- gap: "gap-md",
1162
- // 16px (1rem) - gap between elements - maps to semanticSpacing.md
1163
- padding: "p-lg"
1164
- // 24px (1.5rem) - container padding - maps to semanticSpacing.lg
1165
- },
1166
- /**
1167
- * Border radius for EmptyState container
1168
- */
1169
- radius: {
1170
- default: "rounded-xl"
1171
- // 12px (0.75rem) - maps to borderRadius.xl
1172
- },
1173
- /**
1174
- * Icon sizes by variant
1175
- * Maps to Tailwind size utilities
1176
- */
1177
- iconSize: {
1178
- sm: "size-8",
1179
- // 32px (2rem)
1180
- md: "size-12",
1181
- // 48px (3rem)
1182
- lg: "size-16"
1183
- // 64px (4rem)
1184
- },
1185
- /**
1186
- * Typography tokens for EmptyState
1187
- * Maps to foundation typography tokens
1188
- */
1189
- typography: {
1190
- title: {
1191
- fontSize: "text-lg",
1192
- // Maps to fontSize.lg[0]
1193
- fontWeight: "font-semibold"
1194
- // Maps to fontWeight.semibold
1195
- },
1196
- description: {
1197
- fontSize: "text-sm",
1198
- // Maps to fontSize.sm[0]
1199
- fontWeight: "font-normal"
1200
- // Maps to fontWeight.normal
1201
- }
1202
- }
1203
- },
1204
- /**
1205
- * DataList Component Tokens
1206
- */
1207
- dataList: {
1208
- /**
1209
- * Spacing tokens for DataList
1210
- * Maps to semantic spacing tokens
1211
- */
1212
- spacing: {
1213
- gap: "gap-md",
1214
- // 16px (1rem) - gap between items - maps to semanticSpacing.md
1215
- padding: "p-md"
1216
- // 16px (1rem) - container padding - maps to semanticSpacing.md
1217
- },
1218
- /**
1219
- * Label width tokens (for desktop horizontal layout)
1220
- * Maps to Tailwind width utilities
1221
- */
1222
- labelWidth: {
1223
- sm: "w-24",
1224
- // 96px (6rem) - small label width
1225
- md: "w-32",
1226
- // 128px (8rem) - default label width
1227
- lg: "w-40"
1228
- // 160px (10rem) - large label width
1229
- },
1230
- /**
1231
- * Row padding tokens
1232
- * Maps to semantic spacing tokens
1233
- */
1234
- rowPadding: {
1235
- sm: "py-xs",
1236
- // 4px (0.25rem) - maps to semanticSpacing.xs
1237
- md: "py-sm",
1238
- // 8px (0.5rem) - maps to semanticSpacing.sm
1239
- lg: "py-md"
1240
- // 16px (1rem) - maps to semanticSpacing.md
1241
- }
1242
1454
  }
1243
1455
  };
1244
1456
 
@@ -1298,139 +1510,6 @@ var ICON_TOKENS = {
1298
1510
  }
1299
1511
  };
1300
1512
 
1301
- // src/tokens/components/motion.ts
1302
- var MOTION_TOKENS = {
1303
- /**
1304
- * Transition property tokens
1305
- * Maps to Tailwind transition utilities
1306
- */
1307
- transition: {
1308
- all: "transition-all",
1309
- // All properties
1310
- colors: "transition-colors",
1311
- // Color properties only
1312
- opacity: "transition-opacity",
1313
- // Opacity only
1314
- transform: "transition-transform",
1315
- // Transform only
1316
- shadow: "transition-shadow",
1317
- // Box shadow only
1318
- none: "transition-none"
1319
- // No transition
1320
- },
1321
- /**
1322
- * Duration tokens
1323
- * Maps to foundation motion duration tokens via Tailwind
1324
- */
1325
- duration: {
1326
- instant: "duration-0",
1327
- // 0ms
1328
- fast: "duration-fast",
1329
- // 150ms - maps to motion.durations.fast
1330
- normal: "duration-normal",
1331
- // 300ms - maps to motion.durations.normal
1332
- slow: "duration-slow",
1333
- // 500ms - maps to motion.durations.slow
1334
- slower: "duration-slower",
1335
- // 700ms - maps to motion.durations.slower
1336
- slowest: "duration-slowest",
1337
- // 1000ms - maps to motion.durations.slowest
1338
- // Granular durations
1339
- "75": "duration-75",
1340
- // 75ms
1341
- "100": "duration-100",
1342
- // 100ms
1343
- "200": "duration-200",
1344
- // 200ms
1345
- "250": "duration-250",
1346
- // 250ms
1347
- "300": "duration-300",
1348
- // 300ms
1349
- "400": "duration-400",
1350
- // 400ms
1351
- "500": "duration-500",
1352
- // 500ms
1353
- "600": "duration-600",
1354
- // 600ms
1355
- "700": "duration-700",
1356
- // 700ms
1357
- "800": "duration-800",
1358
- // 800ms
1359
- "1000": "duration-1000"
1360
- // 1000ms
1361
- },
1362
- /**
1363
- * Easing tokens
1364
- * Maps to foundation motion easing tokens via Tailwind
1365
- */
1366
- easing: {
1367
- linear: "ease-linear",
1368
- // Linear easing
1369
- in: "ease-in",
1370
- // Ease in
1371
- out: "ease-out",
1372
- // Ease out (recommended for most UI)
1373
- "in-out": "ease-in-out",
1374
- // Ease in-out
1375
- bounce: "ease-bounce",
1376
- // Bounce easing
1377
- elastic: "ease-elastic"
1378
- // Elastic easing
1379
- },
1380
- /**
1381
- * Pre-configured transition tokens
1382
- * Combines duration and easing for common use cases
1383
- */
1384
- transitionPreset: {
1385
- fast: "transition-all duration-fast ease-out",
1386
- // Fast transition
1387
- normal: "transition-all duration-normal ease-in-out",
1388
- // Normal transition (default)
1389
- slow: "transition-all duration-slow ease-in-out",
1390
- // Slow transition
1391
- colors: "transition-colors duration-normal ease-out",
1392
- // Color transitions (common)
1393
- transform: "transition-transform duration-normal ease-out",
1394
- // Transform transitions
1395
- opacity: "transition-opacity duration-fast ease-out"
1396
- // Opacity transitions
1397
- },
1398
- /**
1399
- * Animation tokens
1400
- * Maps to foundation motion animation tokens via Tailwind
1401
- */
1402
- animation: {
1403
- none: "animate-none",
1404
- // No animation
1405
- spin: "animate-spin",
1406
- // Spin animation
1407
- pulse: "animate-pulse",
1408
- // Pulse animation
1409
- bounce: "animate-bounce",
1410
- // Bounce animation
1411
- ping: "animate-ping",
1412
- // Ping animation
1413
- shake: "animate-shake",
1414
- // Shake animation
1415
- fadeIn: "animate-fadeIn",
1416
- // Fade in
1417
- fadeOut: "animate-fadeOut",
1418
- // Fade out
1419
- slideInUp: "animate-slideInUp",
1420
- // Slide in from bottom
1421
- slideInDown: "animate-slideInDown",
1422
- // Slide in from top
1423
- slideInLeft: "animate-slideInLeft",
1424
- // Slide in from right
1425
- slideInRight: "animate-slideInRight",
1426
- // Slide in from left
1427
- scaleIn: "animate-scaleIn",
1428
- // Scale in
1429
- scaleOut: "animate-scaleOut"
1430
- // Scale out
1431
- }
1432
- };
1433
-
1434
1513
  // src/tokens/components/domain.ts
1435
1514
  var DOMAIN_TOKENS = {
1436
1515
  /**
@@ -1583,7 +1662,7 @@ var DOMAIN_TOKENS = {
1583
1662
  },
1584
1663
  /**
1585
1664
  * Image tokens for card media
1586
- * Defines aspect ratio, radius, and overlay styles
1665
+ * Defines aspect ratio, radius, overlay styles, and placeholder gradients
1587
1666
  */
1588
1667
  image: {
1589
1668
  /**
@@ -1606,6 +1685,40 @@ var DOMAIN_TOKENS = {
1606
1685
  overlay: {
1607
1686
  gradient: "bg-gradient-to-t from-black/60 via-transparent to-transparent"
1608
1687
  // Gradient overlay for image hover states
1688
+ },
1689
+ /**
1690
+ * Placeholder gradient tokens for image placeholders
1691
+ * Used when no image URL is provided
1692
+ */
1693
+ placeholder: {
1694
+ gradient: "bg-gradient-to-br from-muted to-muted/50"
1695
+ // Placeholder gradient background
1696
+ }
1697
+ },
1698
+ /**
1699
+ * Text tokens for card text elements
1700
+ * Defines hover states and line clamping for titles and descriptions
1701
+ */
1702
+ text: {
1703
+ /**
1704
+ * Hover state tokens for text elements
1705
+ * Used for interactive text elements like titles
1706
+ */
1707
+ hover: {
1708
+ primary: "group-hover:text-primary"
1709
+ // Hover state for primary text color
1710
+ },
1711
+ /**
1712
+ * Line clamp tokens for text truncation
1713
+ * Used for limiting text to specific number of lines
1714
+ */
1715
+ lineClamp: {
1716
+ one: "line-clamp-1",
1717
+ // Single line clamp
1718
+ two: "line-clamp-2",
1719
+ // Two line clamp
1720
+ three: "line-clamp-3"
1721
+ // Three line clamp
1609
1722
  }
1610
1723
  },
1611
1724
  /**
@@ -1828,7 +1941,95 @@ var DOMAIN_TOKENS = {
1828
1941
  height: "h-6"
1829
1942
  // References spacing[6] (1.5rem / 24px) via Tailwind
1830
1943
  }
1831
- }
1944
+ },
1945
+ /**
1946
+ * CTA (Call-to-Action) button tokens for domain card components
1947
+ * Provides PromoCard-specific CTA button styling tokens
1948
+ * These tokens are semantically owned by domain card components, not by the Button component
1949
+ * References foundation tokens (spacing, typography, radius, shadows, motion) for consistency
1950
+ */
1951
+ cta: {
1952
+ /**
1953
+ * CTA button styling tokens
1954
+ * Used by PromoCard and other domain card components for CTA button elements
1955
+ */
1956
+ button: {
1957
+ /**
1958
+ * Button heights by size
1959
+ * Maps to Tailwind height utilities: h-8, h-9
1960
+ */
1961
+ height: {
1962
+ sm: "h-8",
1963
+ // 32px (2rem) - compact size
1964
+ md: "h-9"
1965
+ // 36px (2.25rem) - default size
1966
+ },
1967
+ /**
1968
+ * Button padding by size
1969
+ * Horizontal and vertical padding values
1970
+ * References semanticSpacing tokens
1971
+ */
1972
+ padding: {
1973
+ horizontal: {
1974
+ sm: "px-sm",
1975
+ // 8px (0.5rem) - maps to semanticSpacing.sm
1976
+ md: "px-md"
1977
+ // 16px (1rem) - maps to semanticSpacing.md
1978
+ },
1979
+ vertical: {
1980
+ sm: "py-xs"
1981
+ // 4px (0.25rem) - maps to semanticSpacing.xs
1982
+ }
1983
+ },
1984
+ /**
1985
+ * Border radius for CTA buttons
1986
+ * References borderRadius.md (6px / 0.375rem)
1987
+ * Using Tailwind class "rounded-md" which maps to borderRadius.md
1988
+ */
1989
+ radius: "rounded-md",
1990
+ // References borderRadius.md via Tailwind
1991
+ /**
1992
+ * Font sizes by button size
1993
+ * Maps to foundation typography fontSize tokens
1994
+ */
1995
+ fontSize: {
1996
+ sm: "text-xs",
1997
+ // Maps to fontSize.xs[0]
1998
+ md: "text-sm"
1999
+ // Maps to fontSize.sm[0]
2000
+ },
2001
+ /**
2002
+ * Shadow tokens for CTA buttons
2003
+ * Maps to foundation elevation shadow tokens
2004
+ */
2005
+ shadow: {
2006
+ primary: "shadow"
2007
+ // Maps to elevationShadows.xs (primary variant uses shadow)
2008
+ },
2009
+ /**
2010
+ * Color tokens for CTA button variants
2011
+ * Uses semantic color tokens that map to CSS variables
2012
+ */
2013
+ variant: {
2014
+ primary: {
2015
+ background: "bg-primary",
2016
+ // Primary background using CSS var
2017
+ text: "text-primary-foreground",
2018
+ // Primary text using CSS var
2019
+ hover: "hover:bg-primary/90"
2020
+ // Primary hover using CSS var
2021
+ }
2022
+ },
2023
+ /**
2024
+ * Transition tokens for CTA buttons
2025
+ * References MOTION_TOKENS for transitions
2026
+ */
2027
+ transition: {
2028
+ colors: "transition-colors"
2029
+ // Color transition using motion tokens
2030
+ }
2031
+ }
2032
+ }
1832
2033
  };
1833
2034
 
1834
2035
  // src/tokens/components/input.ts
@@ -1931,40 +2132,6 @@ var INPUT_TOKENS = {
1931
2132
  text: "text-[hsl(var(--foreground))]"
1932
2133
  // File input text color using CSS var
1933
2134
  },
1934
- /**
1935
- * Select listbox tokens
1936
- * Styling for select dropdown container
1937
- */
1938
- selectListbox: {
1939
- border: "border border-[hsl(var(--border))]",
1940
- // Border color using CSS var
1941
- background: "bg-[hsl(var(--popover))]",
1942
- // Background using CSS var
1943
- text: "text-[hsl(var(--popover-foreground))]",
1944
- // Text color using CSS var
1945
- radius: "rounded-md",
1946
- // Radius token (6px)
1947
- shadow: "shadow-md"
1948
- // Shadow token
1949
- },
1950
- /**
1951
- * Select option tokens
1952
- * Styling for select option items
1953
- */
1954
- selectOption: {
1955
- focus: {
1956
- background: "focus:bg-[hsl(var(--accent))]",
1957
- // Focus background using CSS var
1958
- text: "focus:text-[hsl(var(--accent-foreground))]"
1959
- // Focus text using CSS var
1960
- },
1961
- selected: {
1962
- background: "bg-[hsl(var(--accent))]",
1963
- // Selected background using CSS var
1964
- text: "text-[hsl(var(--accent-foreground))]"
1965
- // Selected text using CSS var
1966
- }
1967
- },
1968
2135
  /**
1969
2136
  * Variant-based tokens
1970
2137
  * Border, background, and text colors for different variants
@@ -2178,6 +2345,188 @@ var INPUT_TOKENS = {
2178
2345
  }
2179
2346
  };
2180
2347
 
2348
+ // src/tokens/components/textarea.ts
2349
+ var TEXTAREA_TOKENS = {
2350
+ /**
2351
+ * Shadow token
2352
+ * Maps to foundation elevation shadow tokens
2353
+ */
2354
+ shadow: "shadow-sm",
2355
+ // Maps to elevationShadows.sm
2356
+ /**
2357
+ * Variant-based tokens
2358
+ * Border, background, and text colors for different variants
2359
+ * All use CSS variable references for theme support
2360
+ */
2361
+ variant: {
2362
+ primary: {
2363
+ border: "border-[hsl(var(--tm-primary))]",
2364
+ // Primary border color
2365
+ background: "bg-[hsl(var(--tm-primary))]",
2366
+ // Primary background
2367
+ text: "text-[hsl(var(--tm-primary-foreground))]",
2368
+ // Primary text color
2369
+ focus: "focus-visible:shadow-[var(--focus-ring-primary)]"
2370
+ // Primary focus ring
2371
+ },
2372
+ secondary: {
2373
+ border: "border-[hsl(var(--tm-secondary))]",
2374
+ // Secondary border color
2375
+ background: "bg-[hsl(var(--tm-secondary))]",
2376
+ // Secondary background
2377
+ text: "text-[hsl(var(--tm-secondary-foreground))]",
2378
+ // Secondary text color
2379
+ focus: "focus-visible:shadow-[var(--focus-ring-default)]"
2380
+ // Default focus ring
2381
+ },
2382
+ outline: {
2383
+ border: "border-[hsl(var(--input))]",
2384
+ // Input border color
2385
+ background: "bg-transparent",
2386
+ // Transparent background
2387
+ text: "text-[hsl(var(--foreground))]",
2388
+ // Foreground text color
2389
+ focus: "focus-visible:shadow-[var(--focus-ring-default)]"
2390
+ // Default focus ring
2391
+ },
2392
+ ghost: {
2393
+ border: "border-transparent",
2394
+ // Transparent border
2395
+ background: "bg-transparent",
2396
+ // Transparent background
2397
+ text: "text-[hsl(var(--foreground))]",
2398
+ // Foreground text color
2399
+ focus: "focus-visible:shadow-[var(--focus-ring-default)]"
2400
+ // Default focus ring
2401
+ },
2402
+ destructive: {
2403
+ border: "border-[hsl(var(--destructive))]",
2404
+ // Destructive border color
2405
+ background: "bg-[hsl(var(--destructive))]",
2406
+ // Destructive background
2407
+ text: "text-[hsl(var(--destructive-foreground))]",
2408
+ // Destructive text color
2409
+ focus: "focus-visible:shadow-[var(--focus-ring-default)]"
2410
+ // Default focus ring
2411
+ }
2412
+ },
2413
+ /**
2414
+ * State-based tokens
2415
+ * Border, background, and text colors for different states
2416
+ * All use CSS variable references for theme support
2417
+ */
2418
+ state: {
2419
+ border: {
2420
+ default: "border-[hsl(var(--input))]",
2421
+ // Default border color using CSS var
2422
+ focus: "focus-visible:shadow-[var(--focus-ring-default)]",
2423
+ // Focus ring using CSS var
2424
+ error: "border-[hsl(var(--destructive))]",
2425
+ // Error state border using CSS var
2426
+ success: "border-[hsl(var(--semantic-success))]",
2427
+ // Success state border using CSS var
2428
+ disabled: "border-[hsl(var(--input))]"
2429
+ // Disabled state border (same as default)
2430
+ },
2431
+ background: {
2432
+ default: "bg-transparent",
2433
+ // Default background
2434
+ disabled: "bg-transparent"
2435
+ // Disabled background (same as default)
2436
+ },
2437
+ text: {
2438
+ default: "text-[hsl(var(--foreground))]",
2439
+ // Default text color using CSS var
2440
+ placeholder: "placeholder:text-[hsl(var(--muted-foreground))]",
2441
+ // Placeholder text color using CSS var
2442
+ disabled: "disabled:opacity-50"
2443
+ // Disabled text opacity
2444
+ }
2445
+ },
2446
+ /**
2447
+ * Width tokens
2448
+ * Common width utilities
2449
+ */
2450
+ width: {
2451
+ full: "w-full"
2452
+ // Full width (100%)
2453
+ },
2454
+ /**
2455
+ * Message tokens
2456
+ * Spacing, positioning, and styling for helper text and error messages
2457
+ */
2458
+ message: {
2459
+ // 8px (0.5rem) - spacing between control and message
2460
+ position: {
2461
+ bottom: "bottom-sm",
2462
+ // 8px (0.5rem) - bottom position for character counter
2463
+ right: "right-sm"
2464
+ // 8px (0.5rem) - right position for character counter
2465
+ },
2466
+ color: {
2467
+ default: "text-[hsl(var(--muted-foreground))]",
2468
+ // Default message color
2469
+ error: "text-[hsl(var(--destructive))]"}
2470
+ },
2471
+ /**
2472
+ * Size-based token structure
2473
+ * Organized by size for easy access
2474
+ */
2475
+ size: {
2476
+ xs: {
2477
+ padding: {
2478
+ horizontal: "px-xs",
2479
+ vertical: "py-xs"
2480
+ },
2481
+ radius: "rounded-sm",
2482
+ fontSize: "text-xs"},
2483
+ sm: {
2484
+ padding: {
2485
+ horizontal: "px-sm",
2486
+ vertical: "py-xs"
2487
+ },
2488
+ radius: "rounded-md",
2489
+ fontSize: "text-sm"},
2490
+ md: {
2491
+ padding: {
2492
+ horizontal: "px-sm",
2493
+ vertical: "py-xs"
2494
+ },
2495
+ radius: "rounded-md",
2496
+ fontSize: "text-base",
2497
+ fontSizeResponsive: "md:text-sm"},
2498
+ lg: {
2499
+ padding: {
2500
+ horizontal: "px-md",
2501
+ vertical: "py-sm"
2502
+ },
2503
+ radius: "rounded-md",
2504
+ fontSize: "text-base"},
2505
+ xl: {
2506
+ padding: {
2507
+ horizontal: "px-lg",
2508
+ vertical: "py-md"
2509
+ },
2510
+ radius: "rounded-lg",
2511
+ fontSize: "text-lg"}
2512
+ }
2513
+ };
2514
+
2515
+ // src/tokens/components/form.ts
2516
+ var FORM_TOKENS = {
2517
+ /**
2518
+ * Label tokens
2519
+ * Spacing and styling for labels
2520
+ */
2521
+ label: {
2522
+ // 8px (0.5rem) - spacing between label and control
2523
+ /**
2524
+ * Color for required asterisk mark
2525
+ */
2526
+ requiredMark: "text-destructive"
2527
+ // Color for required asterisk
2528
+ }};
2529
+
2181
2530
  // src/tokens/components/checkbox.ts
2182
2531
  var CHECKBOX_TOKENS = {
2183
2532
  /**
@@ -2952,8 +3301,16 @@ var TEXT_TOKENS = {
2952
3301
  // Maps to fontSize.base[0]
2953
3302
  lg: "text-lg",
2954
3303
  // Maps to fontSize.lg[0]
2955
- xl: "text-xl"
3304
+ xl: "text-xl",
2956
3305
  // Maps to fontSize.xl[0]
3306
+ "2xl": "text-2xl",
3307
+ // Maps to fontSize.2xl[0]
3308
+ "3xl": "text-3xl",
3309
+ // Maps to fontSize.3xl[0]
3310
+ "4xl": "text-4xl",
3311
+ // Maps to fontSize.4xl[0]
3312
+ "5xl": "text-5xl"
3313
+ // Maps to fontSize.5xl[0]
2957
3314
  },
2958
3315
  /**
2959
3316
  * Font weights by weight variant
@@ -2978,6 +3335,8 @@ var TEXT_TOKENS = {
2978
3335
  // Maps to lineHeight.none
2979
3336
  tight: "leading-tight",
2980
3337
  // Maps to lineHeight.tight
3338
+ snug: "leading-snug",
3339
+ // Maps to lineHeight.snug
2981
3340
  normal: "leading-normal",
2982
3341
  // Maps to lineHeight.normal
2983
3342
  relaxed: "leading-relaxed",
@@ -3501,9 +3860,9 @@ var TOAST_TOKENS = {
3501
3860
  // Default opacity (hidden)
3502
3861
  groupHover: "group-hover:opacity-100",
3503
3862
  // Visible on group hover
3504
- focus: "focus:opacity-100",
3863
+ focus: "focus-visible:opacity-100",
3505
3864
  // Visible on focus
3506
- focusRing: "focus:outline-none focus:ring-1"
3865
+ focusRing: "focus-visible:outline-none focus-visible:ring-1"
3507
3866
  // Focus ring styling
3508
3867
  }
3509
3868
  }
@@ -4245,19 +4604,27 @@ var DROPDOWN_TOKENS = {
4245
4604
  // 256px
4246
4605
  }
4247
4606
  },
4607
+ /**
4608
+ * Width tokens
4609
+ * Common width utilities
4610
+ */
4611
+ width: {
4612
+ full: "w-full"
4613
+ // Full width (100%)
4614
+ },
4248
4615
  /**
4249
4616
  * Item tokens by size
4250
4617
  * Individual menu item
4251
4618
  */
4252
4619
  item: {
4253
4620
  background: {
4254
- focus: "focus:bg-[hsl(var(--accent))]",
4621
+ focus: "focus-visible:bg-[hsl(var(--accent))]",
4255
4622
  // Focus background using CSS var
4256
4623
  selected: "bg-[hsl(var(--accent))]"
4257
4624
  // Selected background using CSS var
4258
4625
  },
4259
4626
  text: {
4260
- focus: "focus:text-[hsl(var(--accent-foreground))]",
4627
+ focus: "focus-visible:text-[hsl(var(--accent-foreground))]",
4261
4628
  // Focus text using CSS var
4262
4629
  selected: "text-[hsl(var(--accent-foreground))]"
4263
4630
  // Selected text using CSS var
@@ -4509,9 +4876,9 @@ var SELECT_TOKENS = {
4509
4876
  indicator: {
4510
4877
  size: "size-4"},
4511
4878
  focus: {
4512
- background: "focus:bg-[hsl(var(--accent))]",
4879
+ background: "focus-visible:bg-[hsl(var(--accent))]",
4513
4880
  // Focus background using CSS var
4514
- text: "focus:text-[hsl(var(--accent-foreground))]"
4881
+ text: "focus-visible:text-[hsl(var(--accent-foreground))]"
4515
4882
  // Focus text using CSS var
4516
4883
  },
4517
4884
  disabled: {
@@ -5054,26 +5421,314 @@ var MODAL_TOKENS = {
5054
5421
  }
5055
5422
  };
5056
5423
 
5057
- // src/tokens/motion/v2.ts
5058
- var motionV2Durations = {
5059
- fast: "150ms",
5060
- // Quick interactions
5061
- normal: "250ms",
5062
- // Default transitions
5063
- slow: "350ms",
5064
- // Emphasized animations
5065
- reduced: "0ms"
5066
- // For prefers-reduced-motion
5067
- };
5068
- var motionV2Easings = {
5069
- soft: "cubic-bezier(0.22, 1, 0.36, 1)",
5070
- // Gentle, smooth
5071
- standard: "cubic-bezier(0.4, 0, 0.2, 1)",
5072
- // Material Design standard
5073
- emphasized: "cubic-bezier(0.2, 0, 0, 1)"
5074
- // Strong, decisive
5075
- };
5076
- var motionV2Transitions = {
5424
+ // src/tokens/components/table.ts
5425
+ var TABLE_TOKENS = {
5426
+ /**
5427
+ * Table cell and header padding by size
5428
+ * Maps to semantic spacing tokens
5429
+ */
5430
+ padding: {
5431
+ cell: {
5432
+ sm: "p-xs",
5433
+ // 4px (0.25rem) - maps to semanticSpacing.xs
5434
+ md: "p-sm",
5435
+ // 8px (0.5rem) - maps to semanticSpacing.sm
5436
+ lg: "p-md"
5437
+ // 16px (1rem) - maps to semanticSpacing.md
5438
+ },
5439
+ header: {
5440
+ sm: "px-xs py-sm",
5441
+ // 4px horizontal, 8px vertical
5442
+ md: "px-sm py-md",
5443
+ // 8px horizontal, 16px vertical
5444
+ lg: "px-md py-lg"
5445
+ // 16px horizontal, 24px vertical
5446
+ }
5447
+ },
5448
+ /**
5449
+ * Border radius for table
5450
+ */
5451
+ radius: {
5452
+ default: "rounded-md"
5453
+ // 6px (0.375rem) - maps to borderRadius.md
5454
+ },
5455
+ /**
5456
+ * Shadow tokens for table
5457
+ * Maps to foundation elevation shadow tokens
5458
+ */
5459
+ shadow: {
5460
+ // No shadow
5461
+ subtle: "shadow-sm"
5462
+ // Maps to elevationShadows.sm
5463
+ },
5464
+ /**
5465
+ * Typography tokens for table headers and cells
5466
+ * Maps to foundation typography fontSize tokens
5467
+ */
5468
+ typography: {
5469
+ header: {
5470
+ fontSize: "text-sm",
5471
+ // Maps to fontSize.sm[0]
5472
+ fontWeight: "font-semibold"
5473
+ // Maps to fontWeight.semibold
5474
+ },
5475
+ cell: {
5476
+ fontSize: "text-sm",
5477
+ // Maps to fontSize.sm[0]
5478
+ fontWeight: "font-normal"
5479
+ // Maps to fontWeight.normal
5480
+ }
5481
+ },
5482
+ /**
5483
+ * Color tokens for table states
5484
+ * Uses semantic color tokens
5485
+ */
5486
+ colors: {
5487
+ border: "border-border",
5488
+ // Border color
5489
+ rowHover: "hover:bg-muted/50",
5490
+ // Row hover background
5491
+ rowSelected: "bg-muted"
5492
+ // Selected row background
5493
+ },
5494
+ /**
5495
+ * Border tokens for table
5496
+ */
5497
+ border: {
5498
+ bottom: "border-b"
5499
+ // Border bottom for rows and headers
5500
+ },
5501
+ /**
5502
+ * Layout tokens for table container and base styles
5503
+ */
5504
+ layout: {
5505
+ overflow: "overflow-x-auto",
5506
+ // Table container overflow
5507
+ table: "w-full border-collapse"
5508
+ // Table base styles
5509
+ },
5510
+ /**
5511
+ * Sticky header tokens
5512
+ * For sticky header positioning and styling
5513
+ */
5514
+ sticky: {
5515
+ header: "sticky top-0 z-10 bg-background"
5516
+ // Sticky header styles
5517
+ },
5518
+ /**
5519
+ * Expandable row tokens
5520
+ * For expandable content styling
5521
+ */
5522
+ expandable: {
5523
+ padding: "p-md",
5524
+ // Expandable content padding - maps to semanticSpacing.md
5525
+ container: "p-0",
5526
+ // Expandable container padding
5527
+ transition: "overflow-hidden transition-all duration-normal ease-in-out",
5528
+ // Transition styles
5529
+ expanded: "max-h-[100vh] opacity-100",
5530
+ // Expanded state
5531
+ collapsed: "max-h-0 opacity-0",
5532
+ // Collapsed state
5533
+ cursor: "cursor-pointer",
5534
+ // Cursor for expandable rows
5535
+ content: {
5536
+ expanded: "block",
5537
+ // Expanded content display
5538
+ collapsed: "hidden"
5539
+ // Collapsed content display
5540
+ }
5541
+ },
5542
+ /**
5543
+ * Loading state tokens
5544
+ * For loading state cell styling
5545
+ */
5546
+ loading: {
5547
+ cellPadding: "p-sm",
5548
+ // Loading state cell padding - maps to semanticSpacing.sm
5549
+ skeletonWidth: "w-full"
5550
+ // Skeleton width
5551
+ },
5552
+ /**
5553
+ * Empty state tokens
5554
+ * For empty state cell styling
5555
+ */
5556
+ empty: {
5557
+ padding: "p-8"
5558
+ // Empty state padding - maps to semanticSpacing.2xl
5559
+ },
5560
+ /**
5561
+ * Sortable header tokens
5562
+ * For sortable header styling and interactions
5563
+ */
5564
+ sortable: {
5565
+ hover: "hover:bg-muted/50",
5566
+ // Sortable header hover
5567
+ gap: "gap-2",
5568
+ // Sort icon gap - maps to semanticSpacing.sm
5569
+ cursor: "cursor-pointer select-none",
5570
+ // Sortable cursor
5571
+ container: "flex items-center",
5572
+ // Sortable header container
5573
+ icon: {
5574
+ base: "inline-flex size-4 items-center text-muted-foreground transition-transform",
5575
+ // Sort icon base styles
5576
+ rotated: "rotate-180",
5577
+ // Rotated state (descending)
5578
+ inactive: "opacity-30"
5579
+ // Inactive state (no sort)
5580
+ }
5581
+ }
5582
+ };
5583
+
5584
+ // src/tokens/components/data-list.ts
5585
+ var DATA_LIST_TOKENS = {
5586
+ /**
5587
+ * Spacing tokens for DataList
5588
+ * Maps to semantic spacing tokens
5589
+ */
5590
+ spacing: {
5591
+ gap: "gap-md"},
5592
+ /**
5593
+ * Label width tokens (for desktop horizontal layout)
5594
+ * Maps to Tailwind width utilities
5595
+ */
5596
+ labelWidth: {
5597
+ // 96px (6rem) - small label width
5598
+ md: "w-32"},
5599
+ /**
5600
+ * Row padding tokens
5601
+ * Maps to semantic spacing tokens
5602
+ */
5603
+ rowPadding: {
5604
+ sm: "py-xs",
5605
+ // 4px (0.25rem) - maps to semanticSpacing.xs
5606
+ md: "py-sm",
5607
+ // 8px (0.5rem) - maps to semanticSpacing.sm
5608
+ lg: "py-md"
5609
+ // 16px (1rem) - maps to semanticSpacing.md
5610
+ },
5611
+ /**
5612
+ * Item tokens
5613
+ * For individual DataList item styling
5614
+ */
5615
+ item: {
5616
+ /**
5617
+ * Border tokens for items
5618
+ */
5619
+ border: "border-b border-border last:border-0",
5620
+ // Item borders
5621
+ /**
5622
+ * Responsive layout tokens
5623
+ */
5624
+ layout: {
5625
+ mobile: "flex flex-col",
5626
+ // Mobile layout - vertical
5627
+ desktop: "md:flex-row md:items-center"
5628
+ // Desktop layout - horizontal
5629
+ }
5630
+ },
5631
+ /**
5632
+ * Label tokens
5633
+ * For DataList label styling
5634
+ */
5635
+ label: {
5636
+ mobile: "mb-1 font-semibold text-foreground",
5637
+ // Mobile label styles
5638
+ desktop: "md:mb-0"
5639
+ // Desktop label margin override
5640
+ },
5641
+ /**
5642
+ * Value tokens
5643
+ * For DataList value styling
5644
+ */
5645
+ value: {
5646
+ color: "text-muted-foreground",
5647
+ // Value text color
5648
+ flex: "flex-1"
5649
+ // Value flex grow
5650
+ }
5651
+ };
5652
+
5653
+ // src/tokens/components/empty-state.ts
5654
+ var EMPTY_STATE_TOKENS = {
5655
+ /**
5656
+ * Spacing tokens for EmptyState
5657
+ * Maps to semantic spacing tokens
5658
+ */
5659
+ spacing: {
5660
+ // 24px (1.5rem) - container padding - maps to semanticSpacing.lg
5661
+ action: "mt-2"
5662
+ // Action button margin top - maps to semanticSpacing.xs
5663
+ },
5664
+ /**
5665
+ * Icon sizes by variant
5666
+ * Maps to Tailwind size utilities
5667
+ */
5668
+ icon: {
5669
+ size: {
5670
+ sm: "size-8",
5671
+ // 32px (2rem)
5672
+ md: "size-12",
5673
+ // 48px (3rem)
5674
+ lg: "size-16"
5675
+ // 64px (4rem)
5676
+ },
5677
+ container: "flex items-center justify-center text-muted-foreground"
5678
+ // Icon container styles
5679
+ },
5680
+ /**
5681
+ * Typography tokens for EmptyState
5682
+ * Maps to foundation typography tokens
5683
+ */
5684
+ typography: {
5685
+ title: {
5686
+ fontSize: "text-lg",
5687
+ // Maps to fontSize.lg[0]
5688
+ fontWeight: "font-semibold",
5689
+ // Maps to fontWeight.semibold
5690
+ color: "text-foreground"
5691
+ // Title text color
5692
+ },
5693
+ description: {
5694
+ fontSize: "text-sm",
5695
+ // Maps to fontSize.sm[0]
5696
+ fontWeight: "font-normal",
5697
+ // Maps to fontWeight.normal
5698
+ color: "text-muted-foreground",
5699
+ // Description text color
5700
+ maxWidth: "max-w-md"
5701
+ // Maximum width for description
5702
+ }
5703
+ },
5704
+ /**
5705
+ * Alignment tokens
5706
+ * For text alignment in EmptyState
5707
+ */
5708
+ alignment: {
5709
+ center: "text-center"}
5710
+ };
5711
+
5712
+ // src/tokens/motion/v2.ts
5713
+ var motionV2Durations = {
5714
+ fast: "150ms",
5715
+ // Quick interactions
5716
+ normal: "250ms",
5717
+ // Default transitions
5718
+ slow: "350ms",
5719
+ // Emphasized animations
5720
+ reduced: "0ms"
5721
+ // For prefers-reduced-motion
5722
+ };
5723
+ var motionV2Easings = {
5724
+ soft: "cubic-bezier(0.22, 1, 0.36, 1)",
5725
+ // Gentle, smooth
5726
+ standard: "cubic-bezier(0.4, 0, 0.2, 1)",
5727
+ // Material Design standard
5728
+ emphasized: "cubic-bezier(0.2, 0, 0, 1)"
5729
+ // Strong, decisive
5730
+ };
5731
+ var motionV2Transitions = {
5077
5732
  fast: `${motionV2Durations.fast} ${motionV2Easings.standard}`,
5078
5733
  normal: `${motionV2Durations.normal} ${motionV2Easings.standard}`,
5079
5734
  slow: `${motionV2Durations.slow} ${motionV2Easings.emphasized}`,
@@ -5321,54 +5976,54 @@ var transitions = {
5321
5976
  var keyframes = {
5322
5977
  // Fade animations
5323
5978
  fadeIn: {
5324
- from: { opacity: 0 },
5325
- to: { opacity: 1 }
5979
+ from: { opacity: "0" },
5980
+ to: { opacity: "1" }
5326
5981
  },
5327
5982
  fadeOut: {
5328
- from: { opacity: 1 },
5329
- to: { opacity: 0 }
5983
+ from: { opacity: "1" },
5984
+ to: { opacity: "0" }
5330
5985
  },
5331
5986
  // Slide animations
5332
5987
  slideInUp: {
5333
- from: { transform: "translateY(100%)", opacity: 0 },
5334
- to: { transform: "translateY(0)", opacity: 1 }
5988
+ from: { transform: "translateY(100%)", opacity: "0" },
5989
+ to: { transform: "translateY(0)", opacity: "1" }
5335
5990
  },
5336
5991
  slideInDown: {
5337
- from: { transform: "translateY(-100%)", opacity: 0 },
5338
- to: { transform: "translateY(0)", opacity: 1 }
5992
+ from: { transform: "translateY(-100%)", opacity: "0" },
5993
+ to: { transform: "translateY(0)", opacity: "1" }
5339
5994
  },
5340
5995
  slideInLeft: {
5341
- from: { transform: "translateX(-100%)", opacity: 0 },
5342
- to: { transform: "translateX(0)", opacity: 1 }
5996
+ from: { transform: "translateX(-100%)", opacity: "0" },
5997
+ to: { transform: "translateX(0)", opacity: "1" }
5343
5998
  },
5344
5999
  slideInRight: {
5345
- from: { transform: "translateX(100%)", opacity: 0 },
5346
- to: { transform: "translateX(0)", opacity: 1 }
6000
+ from: { transform: "translateX(100%)", opacity: "0" },
6001
+ to: { transform: "translateX(0)", opacity: "1" }
5347
6002
  },
5348
6003
  slideOutUp: {
5349
- from: { transform: "translateY(0)", opacity: 1 },
5350
- to: { transform: "translateY(-100%)", opacity: 0 }
6004
+ from: { transform: "translateY(0)", opacity: "1" },
6005
+ to: { transform: "translateY(-100%)", opacity: "0" }
5351
6006
  },
5352
6007
  slideOutDown: {
5353
- from: { transform: "translateY(0)", opacity: 1 },
5354
- to: { transform: "translateY(100%)", opacity: 0 }
6008
+ from: { transform: "translateY(0)", opacity: "1" },
6009
+ to: { transform: "translateY(100%)", opacity: "0" }
5355
6010
  },
5356
6011
  slideOutLeft: {
5357
- from: { transform: "translateX(0)", opacity: 1 },
5358
- to: { transform: "translateX(-100%)", opacity: 0 }
6012
+ from: { transform: "translateX(0)", opacity: "1" },
6013
+ to: { transform: "translateX(-100%)", opacity: "0" }
5359
6014
  },
5360
6015
  slideOutRight: {
5361
- from: { transform: "translateX(0)", opacity: 1 },
5362
- to: { transform: "translateX(100%)", opacity: 0 }
6016
+ from: { transform: "translateX(0)", opacity: "1" },
6017
+ to: { transform: "translateX(100%)", opacity: "0" }
5363
6018
  },
5364
6019
  // Scale animations
5365
6020
  scaleIn: {
5366
- from: { transform: "scale(0.95)", opacity: 0 },
5367
- to: { transform: "scale(1)", opacity: 1 }
6021
+ from: { transform: "scale(0.95)", opacity: "0" },
6022
+ to: { transform: "scale(1)", opacity: "1" }
5368
6023
  },
5369
6024
  scaleOut: {
5370
- from: { transform: "scale(1)", opacity: 1 },
5371
- to: { transform: "scale(0.95)", opacity: 0 }
6025
+ from: { transform: "scale(1)", opacity: "1" },
6026
+ to: { transform: "scale(0.95)", opacity: "0" }
5372
6027
  },
5373
6028
  scaleUp: {
5374
6029
  from: { transform: "scale(1)" },
@@ -5389,8 +6044,8 @@ var keyframes = {
5389
6044
  },
5390
6045
  // Pulse and bounce
5391
6046
  pulse: {
5392
- "0%, 100%": { opacity: 1 },
5393
- "50%": { opacity: 0.5 }
6047
+ "0%, 100%": { opacity: "1" },
6048
+ "50%": { opacity: "0.5" }
5394
6049
  },
5395
6050
  bounce: {
5396
6051
  "0%, 100%": {
@@ -5412,7 +6067,7 @@ var keyframes = {
5412
6067
  ping: {
5413
6068
  "75%, 100%": {
5414
6069
  transform: "scale(2)",
5415
- opacity: 0
6070
+ opacity: "0"
5416
6071
  }
5417
6072
  },
5418
6073
  // Accordion animations (for Radix UI)
@@ -6371,41 +7026,179 @@ var tokenSystemSummary = {
6371
7026
 
6372
7027
  // src/tokens/theme.ts
6373
7028
  var UI_COLORS = tailwindThemeColors;
7029
+ var FORBIDDEN_PATTERNS = [
7030
+ // Raw color utilities (bg-red-500, text-blue-600, etc.)
7031
+ // These are always forbidden as they bypass the color token system
7032
+ /\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+/,
7033
+ // Raw spacing utilities with arbitrary numbers (p-4, m-2, gap-3, etc.)
7034
+ // Allow semantic spacing tokens (px-sm, py-md, etc.) which use token names
7035
+ /\b(p|m|px|py|pt|pb|pl|pr|mx|my|mt|mb|ml|mr|gap|space-[xy])-(\d+|\[)/,
7036
+ // Raw size utilities with arbitrary numbers (w-4, h-6, etc.)
7037
+ // Allow semantic size tokens (h-8, w-9, etc.) which are standard design system values
7038
+ // Only flag arbitrary values like w-[123px] or h-[calc(...)]
7039
+ /\b(w|h|min-w|min-h|max-w|max-h)-\[/
7040
+ ];
7041
+ function validateTokenUsage(classes, context) {
7042
+ if (process.env.NODE_ENV === "production") {
7043
+ return;
7044
+ }
7045
+ for (const pattern of FORBIDDEN_PATTERNS) {
7046
+ if (pattern.test(classes)) {
7047
+ console.warn(
7048
+ `[tokenCVA] Potential hardcoded Tailwind utility detected in ${context}:
7049
+ "${classes}"
7050
+ Pattern: ${pattern}
7051
+ Please use token-based utilities instead (e.g., from component tokens).`
7052
+ );
7053
+ }
7054
+ }
7055
+ }
7056
+ function validateVariantConfig(value, path, visited = /* @__PURE__ */ new Set()) {
7057
+ if (value === void 0 || value === null) {
7058
+ return;
7059
+ }
7060
+ const key = `${path}-${String(value)}`;
7061
+ if (visited.has(key)) {
7062
+ return;
7063
+ }
7064
+ visited.add(key);
7065
+ if (typeof value === "string") {
7066
+ validateTokenUsage(value, path);
7067
+ } else if (Array.isArray(value)) {
7068
+ value.forEach((item, index2) => {
7069
+ validateVariantConfig(item, `${path}[${index2}]`, visited);
7070
+ });
7071
+ } else if (typeof value === "object") {
7072
+ Object.entries(value).forEach(([key2, val]) => {
7073
+ validateVariantConfig(val, `${path}.${key2}`, visited);
7074
+ });
7075
+ }
7076
+ }
7077
+ function tokenCVA(config) {
7078
+ if (process.env.NODE_ENV !== "production") {
7079
+ if (config.base) {
7080
+ validateVariantConfig(config.base, "base");
7081
+ }
7082
+ if (config.variants) {
7083
+ Object.entries(config.variants).forEach(([variantKey, variantValues]) => {
7084
+ Object.entries(variantValues).forEach(([valueKey, value]) => {
7085
+ validateVariantConfig(value, `variants.${variantKey}.${valueKey}`);
7086
+ });
7087
+ });
7088
+ }
7089
+ if (config.compoundVariants) {
7090
+ config.compoundVariants.forEach((compound, index2) => {
7091
+ if (compound.class) {
7092
+ validateVariantConfig(compound.class, `compoundVariants[${index2}].class`);
7093
+ }
7094
+ if (compound.className) {
7095
+ validateVariantConfig(compound.className, `compoundVariants[${index2}].className`);
7096
+ }
7097
+ });
7098
+ }
7099
+ }
7100
+ return classVarianceAuthority.cva(config.base, {
7101
+ variants: config.variants,
7102
+ compoundVariants: config.compoundVariants,
7103
+ defaultVariants: config.defaultVariants
7104
+ });
7105
+ }
6374
7106
  function cn(...inputs) {
6375
7107
  return tailwindMerge.twMerge(clsx.clsx(inputs));
6376
7108
  }
6377
- var buttonVariants = classVarianceAuthority.cva(
6378
- `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`,
6379
- {
6380
- variants: {
6381
- variant: {
6382
- primary: `${BUTTON_TOKENS.variant.primary.background} ${BUTTON_TOKENS.variant.primary.text} ${BUTTON_TOKENS.shadow.primary} ${BUTTON_TOKENS.variant.primary.hover}`,
6383
- secondary: `${BUTTON_TOKENS.variant.secondary.background} ${BUTTON_TOKENS.variant.secondary.text} ${BUTTON_TOKENS.shadow.default} ${BUTTON_TOKENS.variant.secondary.hover}`,
6384
- accent: `${BUTTON_TOKENS.variant.accent.background} ${BUTTON_TOKENS.variant.accent.text} ${BUTTON_TOKENS.shadow.default} ${BUTTON_TOKENS.variant.accent.hover}`,
6385
- 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}`,
6386
- ghost: `${BUTTON_TOKENS.variant.ghost.hover.background} ${BUTTON_TOKENS.variant.ghost.hover.text}`,
6387
- destructive: `${BUTTON_TOKENS.variant.destructive.background} ${BUTTON_TOKENS.variant.destructive.text} ${BUTTON_TOKENS.shadow.default} ${BUTTON_TOKENS.variant.destructive.hover}`
6388
- },
6389
- size: {
6390
- sm: `${BUTTON_TOKENS.height.sm} ${BUTTON_TOKENS.radius} ${BUTTON_TOKENS.padding.horizontal.sm} ${BUTTON_TOKENS.padding.vertical.sm} ${BUTTON_TOKENS.fontSize.sm}`,
6391
- md: `${BUTTON_TOKENS.height.md} ${BUTTON_TOKENS.radius} ${BUTTON_TOKENS.padding.horizontal.md} ${BUTTON_TOKENS.padding.vertical.md} ${BUTTON_TOKENS.fontSize.md}`,
6392
- lg: `${BUTTON_TOKENS.height.lg} ${BUTTON_TOKENS.radius} ${BUTTON_TOKENS.padding.horizontal.lg} ${BUTTON_TOKENS.padding.vertical.md} ${BUTTON_TOKENS.fontSize.lg}`,
6393
- icon: `${BUTTON_TOKENS.height.icon} ${BUTTON_TOKENS.width.icon}`
6394
- }
7109
+ function formatDate(date) {
7110
+ return new Intl.DateTimeFormat("en-US", {
7111
+ month: "long",
7112
+ day: "numeric",
7113
+ year: "numeric"
7114
+ }).format(new Date(date));
7115
+ }
7116
+ var buttonVariants = tokenCVA({
7117
+ 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`,
7118
+ variants: {
7119
+ variant: {
7120
+ 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}`,
7121
+ 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}`,
7122
+ 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}`,
7123
+ 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}`,
7124
+ 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}`,
7125
+ 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}`
6395
7126
  },
6396
- defaultVariants: {
6397
- variant: "primary",
6398
- size: "md"
7127
+ size: {
7128
+ 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}`,
7129
+ 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}`,
7130
+ 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}`,
7131
+ icon: `${BUTTON_TOKENS.height.icon} ${BUTTON_TOKENS.width.icon} [&_svg]:${BUTTON_TOKENS.iconSize.icon}`
6399
7132
  }
7133
+ },
7134
+ defaultVariants: {
7135
+ variant: "primary",
7136
+ size: "md"
6400
7137
  }
6401
- );
7138
+ });
6402
7139
  var Button = React49__namespace.forwardRef(
6403
7140
  ({ className, variant, size: size3, asChild = false, leftIcon, rightIcon, children, ...props }, ref) => {
6404
7141
  const Comp = asChild ? reactSlot.Slot : "button";
6405
- return /* @__PURE__ */ jsxRuntime.jsxs(Comp, { className: cn(buttonVariants({ variant, size: size3, className })), ref, ...props, children: [
6406
- leftIcon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex items-center", children: leftIcon }),
7142
+ const finalClassName = cn(buttonVariants({ variant, size: size3, className }));
7143
+ const iconSizeMap = {
7144
+ "size-3.5": "[&_svg]:w-3.5 [&_svg]:h-3.5",
7145
+ "size-4": "[&_svg]:w-4 [&_svg]:h-4",
7146
+ "size-5": "[&_svg]:w-5 [&_svg]:h-5"
7147
+ };
7148
+ const iconSizeToken = size3 ? BUTTON_TOKENS.iconSize[size3] : BUTTON_TOKENS.iconSize.md;
7149
+ const iconSizeClass = iconSizeMap[iconSizeToken] || "[&_svg]:w-4 [&_svg]:h-4";
7150
+ if (typeof window !== "undefined" && variant === "primary") {
7151
+ const hasHoverClass = finalClassName.includes(
7152
+ "hover:bg-[hsl(var(--button-primary-hover-bg))]"
7153
+ );
7154
+ const hasActiveClass = finalClassName.includes(
7155
+ "active:bg-[hsl(var(--button-primary-active-bg))]"
7156
+ );
7157
+ fetch("http://127.0.0.1:7243/ingest/ff5d1e20-0815-4ca0-af82-fcbd3cfa35b1", {
7158
+ method: "POST",
7159
+ headers: { "Content-Type": "application/json" },
7160
+ body: JSON.stringify({
7161
+ location: "button.tsx:137",
7162
+ message: "Button className check (State Authority Contract)",
7163
+ data: {
7164
+ variant,
7165
+ size: size3,
7166
+ className: finalClassName,
7167
+ hasHoverClass,
7168
+ hasActiveClass,
7169
+ hoverClassInString: finalClassName.includes("hover"),
7170
+ allClasses: finalClassName.split(" ").filter((c) => c.includes("hover") || c.includes("active") || c.includes("disabled"))
7171
+ },
7172
+ timestamp: Date.now(),
7173
+ sessionId: "debug-session",
7174
+ runId: "state-authority-contract",
7175
+ hypothesisId: "A"
7176
+ })
7177
+ }).catch(() => {
7178
+ });
7179
+ }
7180
+ return /* @__PURE__ */ jsxRuntime.jsxs(Comp, { className: finalClassName, ref, ...props, children: [
7181
+ leftIcon && /* @__PURE__ */ jsxRuntime.jsx(
7182
+ "span",
7183
+ {
7184
+ className: cn(
7185
+ "pointer-events-none relative z-10 inline-flex items-center [&_svg]:text-current",
7186
+ iconSizeClass
7187
+ ),
7188
+ children: leftIcon
7189
+ }
7190
+ ),
6407
7191
  children,
6408
- rightIcon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex items-center", children: rightIcon })
7192
+ rightIcon && /* @__PURE__ */ jsxRuntime.jsx(
7193
+ "span",
7194
+ {
7195
+ className: cn(
7196
+ "pointer-events-none relative z-10 inline-flex items-center [&_svg]:text-current",
7197
+ iconSizeClass
7198
+ ),
7199
+ children: rightIcon
7200
+ }
7201
+ )
6409
7202
  ] });
6410
7203
  }
6411
7204
  );
@@ -6500,14 +7293,14 @@ Alert.displayName = "Alert";
6500
7293
  var bodyVariants = classVarianceAuthority.cva("font-sans text-foreground", {
6501
7294
  variants: {
6502
7295
  size: {
6503
- md: "text-md leading-relaxed tracking-normal",
6504
- lg: "text-lg leading-relaxed tracking-normal"
7296
+ md: `${TEXT_TOKENS.fontSize.md} ${TEXT_TOKENS.lineHeight.relaxed} ${TEXT_TOKENS.letterSpacing.normal}`,
7297
+ lg: `${TEXT_TOKENS.fontSize.lg} ${TEXT_TOKENS.lineHeight.relaxed} ${TEXT_TOKENS.letterSpacing.normal}`
6505
7298
  },
6506
7299
  weight: {
6507
- normal: "font-normal",
6508
- medium: "font-medium",
6509
- semibold: "font-semibold",
6510
- bold: "font-bold"
7300
+ normal: TEXT_TOKENS.fontWeight.normal,
7301
+ medium: TEXT_TOKENS.fontWeight.medium,
7302
+ semibold: TEXT_TOKENS.fontWeight.semibold,
7303
+ bold: TEXT_TOKENS.fontWeight.bold
6511
7304
  },
6512
7305
  muted: {
6513
7306
  true: "text-muted-foreground",
@@ -6535,22 +7328,31 @@ var Body = React49__namespace.forwardRef(
6535
7328
  }
6536
7329
  );
6537
7330
  Body.displayName = "Body";
6538
- var captionVariants = classVarianceAuthority.cva("font-sans text-foreground", {
6539
- variants: {
6540
- weight: {
6541
- normal: "font-normal",
6542
- medium: "font-medium"
7331
+ var captionVariants = classVarianceAuthority.cva(
7332
+ [
7333
+ "font-sans",
7334
+ "text-foreground",
7335
+ TEXT_TOKENS.fontSize.xs,
7336
+ TEXT_TOKENS.lineHeight.tight,
7337
+ TEXT_TOKENS.letterSpacing.wide
7338
+ ].filter(Boolean).join(" "),
7339
+ {
7340
+ variants: {
7341
+ weight: {
7342
+ normal: TEXT_TOKENS.fontWeight.normal,
7343
+ medium: TEXT_TOKENS.fontWeight.medium
7344
+ },
7345
+ muted: {
7346
+ true: "text-muted-foreground",
7347
+ false: ""
7348
+ }
6543
7349
  },
6544
- muted: {
6545
- true: "text-muted-foreground",
6546
- false: ""
7350
+ defaultVariants: {
7351
+ weight: "normal",
7352
+ muted: true
6547
7353
  }
6548
- },
6549
- defaultVariants: {
6550
- weight: "normal",
6551
- muted: true
6552
7354
  }
6553
- });
7355
+ );
6554
7356
  var Caption = React49__namespace.forwardRef(
6555
7357
  ({ className, weight, muted, as = "span", children, ...props }, ref) => {
6556
7358
  const Component = as;
@@ -6558,11 +7360,7 @@ var Caption = React49__namespace.forwardRef(
6558
7360
  Component,
6559
7361
  {
6560
7362
  ref,
6561
- className: cn(
6562
- "text-xs leading-tight tracking-wide",
6563
- captionVariants({ weight, muted }),
6564
- className
6565
- ),
7363
+ className: cn(captionVariants({ weight, muted }), className),
6566
7364
  ...props,
6567
7365
  children
6568
7366
  }
@@ -6570,11 +7368,43 @@ var Caption = React49__namespace.forwardRef(
6570
7368
  }
6571
7369
  );
6572
7370
  Caption.displayName = "Caption";
7371
+
7372
+ // src/tokens/components/code.ts
7373
+ var CODE_TOKENS = {
7374
+ /**
7375
+ * Background color tokens
7376
+ * Uses semantic color tokens
7377
+ */
7378
+ background: {
7379
+ muted: "bg-muted"
7380
+ // Muted background for code blocks
7381
+ },
7382
+ /**
7383
+ * Border radius tokens
7384
+ * Maps to foundation borderRadius tokens
7385
+ */
7386
+ radius: {
7387
+ inline: "rounded",
7388
+ // Small radius for inline code
7389
+ block: "rounded-md"
7390
+ // Medium radius for code blocks
7391
+ },
7392
+ /**
7393
+ * Padding tokens
7394
+ * Maps to foundation spacing tokens
7395
+ */
7396
+ padding: {
7397
+ inline: "px-xs py-0.5",
7398
+ // 4px horizontal, 4px vertical for inline code
7399
+ block: "p-md"
7400
+ // 16px padding for code blocks
7401
+ }
7402
+ };
6573
7403
  var codeVariants = classVarianceAuthority.cva("font-mono text-foreground", {
6574
7404
  variants: {
6575
7405
  variant: {
6576
- inline: "rounded bg-muted px-xs py-0.5 text-sm font-semibold",
6577
- block: "block rounded-md bg-muted p-md text-sm font-semibold"
7406
+ inline: `${CODE_TOKENS.radius.inline} ${CODE_TOKENS.background.muted} ${CODE_TOKENS.padding.inline} ${TEXT_TOKENS.fontSize.sm} ${TEXT_TOKENS.fontWeight.semibold}`,
7407
+ block: `block ${CODE_TOKENS.radius.block} ${CODE_TOKENS.background.muted} ${CODE_TOKENS.padding.block} ${TEXT_TOKENS.fontSize.sm} ${TEXT_TOKENS.fontWeight.semibold}`
6578
7408
  },
6579
7409
  muted: {
6580
7410
  true: "text-muted-foreground",
@@ -6604,19 +7434,19 @@ Code.displayName = "Code";
6604
7434
  var displayVariants = classVarianceAuthority.cva("font-display text-foreground", {
6605
7435
  variants: {
6606
7436
  size: {
6607
- xl: "text-xl leading-normal tracking-normal",
6608
- "2xl": "text-2xl leading-tight tracking-tight",
6609
- "3xl": "text-3xl leading-tight tracking-tight",
6610
- "4xl": "text-4xl leading-none tracking-tight"
7437
+ xl: `${TEXT_TOKENS.fontSize.xl} ${TEXT_TOKENS.lineHeight.normal} ${TEXT_TOKENS.letterSpacing.normal}`,
7438
+ "2xl": `${TEXT_TOKENS.fontSize["2xl"]} ${TEXT_TOKENS.lineHeight.tight} ${TEXT_TOKENS.letterSpacing.tight}`,
7439
+ "3xl": `${TEXT_TOKENS.fontSize["3xl"]} ${TEXT_TOKENS.lineHeight.tight} ${TEXT_TOKENS.letterSpacing.tight}`,
7440
+ "4xl": `${TEXT_TOKENS.fontSize["4xl"]} ${TEXT_TOKENS.lineHeight.none} ${TEXT_TOKENS.letterSpacing.tight}`
6611
7441
  },
6612
7442
  weight: {
6613
- normal: "font-normal",
6614
- medium: "font-medium",
6615
- semibold: "font-semibold",
6616
- bold: "font-bold"
6617
- },
6618
- muted: {
6619
- true: "text-muted-foreground",
7443
+ normal: TEXT_TOKENS.fontWeight.normal,
7444
+ medium: TEXT_TOKENS.fontWeight.medium,
7445
+ semibold: TEXT_TOKENS.fontWeight.semibold,
7446
+ bold: TEXT_TOKENS.fontWeight.bold
7447
+ },
7448
+ muted: {
7449
+ true: "text-muted-foreground",
6620
7450
  false: ""
6621
7451
  }
6622
7452
  },
@@ -6645,149 +7475,87 @@ var Display = React49__namespace.forwardRef(
6645
7475
  }
6646
7476
  );
6647
7477
  Display.displayName = "Display";
7478
+ var levelConfig = {
7479
+ 1: [
7480
+ TEXT_TOKENS.fontSize["5xl"],
7481
+ TEXT_TOKENS.fontWeight.bold,
7482
+ TEXT_TOKENS.lineHeight.tight,
7483
+ TEXT_TOKENS.letterSpacing.tight
7484
+ ],
7485
+ 2: [
7486
+ TEXT_TOKENS.fontSize["4xl"],
7487
+ TEXT_TOKENS.fontWeight.bold,
7488
+ TEXT_TOKENS.lineHeight.tight,
7489
+ TEXT_TOKENS.letterSpacing.tight
7490
+ ],
7491
+ 3: [
7492
+ TEXT_TOKENS.fontSize["3xl"],
7493
+ TEXT_TOKENS.fontWeight.semibold,
7494
+ TEXT_TOKENS.lineHeight.snug,
7495
+ TEXT_TOKENS.letterSpacing.normal
7496
+ ],
7497
+ 4: [
7498
+ TEXT_TOKENS.fontSize["2xl"],
7499
+ TEXT_TOKENS.fontWeight.semibold,
7500
+ TEXT_TOKENS.lineHeight.snug,
7501
+ TEXT_TOKENS.letterSpacing.normal
7502
+ ],
7503
+ 5: [
7504
+ TEXT_TOKENS.fontSize.xl,
7505
+ TEXT_TOKENS.fontWeight.medium,
7506
+ TEXT_TOKENS.lineHeight.normal,
7507
+ TEXT_TOKENS.letterSpacing.normal
7508
+ ],
7509
+ 6: [
7510
+ TEXT_TOKENS.fontSize.lg,
7511
+ TEXT_TOKENS.fontWeight.medium,
7512
+ TEXT_TOKENS.lineHeight.normal,
7513
+ TEXT_TOKENS.letterSpacing.normal
7514
+ ]
7515
+ };
7516
+ var levelVariants = Object.entries(levelConfig).reduce(
7517
+ (acc, [level, [fontSize2, defaultWeight, lineHeight2, letterSpacing2]]) => {
7518
+ acc[Number(level)] = `${fontSize2} ${defaultWeight} ${lineHeight2} ${letterSpacing2}`;
7519
+ return acc;
7520
+ },
7521
+ {}
7522
+ );
7523
+ var generateWeightVariants = () => {
7524
+ const weights = [
7525
+ "normal",
7526
+ "medium",
7527
+ "semibold",
7528
+ "bold"
7529
+ ];
7530
+ const levels = [1, 2, 3, 4, 5, 6];
7531
+ const variants = [];
7532
+ for (const level of levels) {
7533
+ const [fontSize2, , lineHeight2, letterSpacing2] = levelConfig[level];
7534
+ for (const weight of weights) {
7535
+ variants.push({
7536
+ level,
7537
+ weight,
7538
+ class: `${fontSize2} ${TEXT_TOKENS.fontWeight[weight]} ${lineHeight2} ${letterSpacing2}`
7539
+ });
7540
+ }
7541
+ }
7542
+ return variants;
7543
+ };
6648
7544
  var headingVariants = classVarianceAuthority.cva("font-display text-foreground", {
6649
7545
  variants: {
6650
- level: {
6651
- 1: "text-5xl font-bold leading-tight tracking-tight",
6652
- 2: "text-4xl font-bold leading-tight tracking-tight",
6653
- 3: "text-3xl font-semibold leading-snug tracking-normal",
6654
- 4: "text-2xl font-semibold leading-snug tracking-normal",
6655
- 5: "text-xl font-medium leading-normal tracking-normal",
6656
- 6: "text-lg font-medium leading-normal tracking-normal"
6657
- },
7546
+ level: levelVariants,
6658
7547
  weight: {
6659
- normal: "font-normal",
6660
- medium: "font-medium",
6661
- semibold: "font-semibold",
6662
- bold: "font-bold"
7548
+ normal: TEXT_TOKENS.fontWeight.normal,
7549
+ medium: TEXT_TOKENS.fontWeight.medium,
7550
+ semibold: TEXT_TOKENS.fontWeight.semibold,
7551
+ bold: TEXT_TOKENS.fontWeight.bold
6663
7552
  },
6664
7553
  muted: {
6665
7554
  true: "text-muted-foreground",
6666
7555
  false: ""
6667
7556
  }
6668
7557
  },
6669
- compoundVariants: [
6670
- {
6671
- level: 1,
6672
- weight: "normal",
6673
- class: "text-5xl font-normal"
6674
- },
6675
- {
6676
- level: 1,
6677
- weight: "medium",
6678
- class: "text-5xl font-medium"
6679
- },
6680
- {
6681
- level: 1,
6682
- weight: "semibold",
6683
- class: "text-5xl font-semibold"
6684
- },
6685
- {
6686
- level: 1,
6687
- weight: "bold",
6688
- class: "text-5xl font-bold"
6689
- },
6690
- {
6691
- level: 2,
6692
- weight: "normal",
6693
- class: "text-4xl font-normal"
6694
- },
6695
- {
6696
- level: 2,
6697
- weight: "medium",
6698
- class: "text-4xl font-medium"
6699
- },
6700
- {
6701
- level: 2,
6702
- weight: "semibold",
6703
- class: "text-4xl font-semibold"
6704
- },
6705
- {
6706
- level: 2,
6707
- weight: "bold",
6708
- class: "text-4xl font-bold"
6709
- },
6710
- {
6711
- level: 3,
6712
- weight: "normal",
6713
- class: "text-3xl font-normal"
6714
- },
6715
- {
6716
- level: 3,
6717
- weight: "medium",
6718
- class: "text-3xl font-medium"
6719
- },
6720
- {
6721
- level: 3,
6722
- weight: "semibold",
6723
- class: "text-3xl font-semibold"
6724
- },
6725
- {
6726
- level: 3,
6727
- weight: "bold",
6728
- class: "text-3xl font-bold"
6729
- },
6730
- {
6731
- level: 4,
6732
- weight: "normal",
6733
- class: "text-2xl font-normal"
6734
- },
6735
- {
6736
- level: 4,
6737
- weight: "medium",
6738
- class: "text-2xl font-medium"
6739
- },
6740
- {
6741
- level: 4,
6742
- weight: "semibold",
6743
- class: "text-2xl font-semibold"
6744
- },
6745
- {
6746
- level: 4,
6747
- weight: "bold",
6748
- class: "text-2xl font-bold"
6749
- },
6750
- {
6751
- level: 5,
6752
- weight: "normal",
6753
- class: "text-xl font-normal"
6754
- },
6755
- {
6756
- level: 5,
6757
- weight: "medium",
6758
- class: "text-xl font-medium"
6759
- },
6760
- {
6761
- level: 5,
6762
- weight: "semibold",
6763
- class: "text-xl font-semibold"
6764
- },
6765
- {
6766
- level: 5,
6767
- weight: "bold",
6768
- class: "text-xl font-bold"
6769
- },
6770
- {
6771
- level: 6,
6772
- weight: "normal",
6773
- class: "text-lg font-normal"
6774
- },
6775
- {
6776
- level: 6,
6777
- weight: "medium",
6778
- class: "text-lg font-medium"
6779
- },
6780
- {
6781
- level: 6,
6782
- weight: "semibold",
6783
- class: "text-lg font-semibold"
6784
- },
6785
- {
6786
- level: 6,
6787
- weight: "bold",
6788
- class: "text-lg font-bold"
6789
- }
6790
- ],
7558
+ compoundVariants: generateWeightVariants(),
6791
7559
  defaultVariants: {
6792
7560
  level: 1,
6793
7561
  muted: false
@@ -6811,8 +7579,8 @@ Heading.displayName = "Heading";
6811
7579
  var leadVariants = classVarianceAuthority.cva("font-sans text-foreground", {
6812
7580
  variants: {
6813
7581
  size: {
6814
- lg: "text-lg leading-normal tracking-normal",
6815
- xl: "text-xl leading-normal tracking-normal"
7582
+ lg: `${TEXT_TOKENS.fontSize.lg} ${TEXT_TOKENS.lineHeight.normal} ${TEXT_TOKENS.letterSpacing.normal}`,
7583
+ xl: `${TEXT_TOKENS.fontSize.xl} ${TEXT_TOKENS.lineHeight.normal} ${TEXT_TOKENS.letterSpacing.normal}`
6816
7584
  },
6817
7585
  muted: {
6818
7586
  true: "text-muted-foreground",
@@ -6949,7 +7717,7 @@ function getSpacingPx(token) {
6949
7717
  return 4;
6950
7718
  }
6951
7719
  var selectTriggerVariants = classVarianceAuthority.cva(
6952
- `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`,
7720
+ `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`,
6953
7721
  {
6954
7722
  variants: {
6955
7723
  size: {
@@ -7408,7 +8176,7 @@ var ModalClose = React49__namespace.forwardRef(
7408
8176
  MODAL_TOKENS.close.radius,
7409
8177
  MODAL_TOKENS.close.opacity.default,
7410
8178
  MODAL_TOKENS.close.opacity.hover,
7411
- "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",
8179
+ "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",
7412
8180
  className
7413
8181
  ),
7414
8182
  ...props,
@@ -8000,8 +8768,10 @@ var Input = React49__namespace.forwardRef(
8000
8768
  }
8001
8769
  return void 0;
8002
8770
  });
8771
+ const baseVariant = getBaseValue(variant);
8772
+ const baseSize = getBaseValue(size3);
8003
8773
  const inputClasses = cn(
8004
- inputVariants({ variant, size: size3, state, fullWidth }),
8774
+ inputVariants({ variant: baseVariant, size: baseSize, state, fullWidth }),
8005
8775
  // Add padding for icons if present
8006
8776
  iconLeft && INPUT_TOKENS.icon.paddingLeft,
8007
8777
  iconRight && INPUT_TOKENS.icon.paddingRight,
@@ -8339,31 +9109,31 @@ var Radio = React49__namespace.forwardRef(
8339
9109
  );
8340
9110
  Radio.displayName = "Radio";
8341
9111
  var textareaVariants = classVarianceAuthority.cva(
8342
- `flex min-h-[80px] ${INPUT_TOKENS.shadow} ${MOTION_TOKENS.transition.colors} disabled:cursor-not-allowed focus-visible:outline-none resize-y`,
9112
+ `flex min-h-[80px] ${TEXTAREA_TOKENS.shadow} ${MOTION_TOKENS.transition.colors} disabled:cursor-not-allowed focus-visible:outline-none resize-y`,
8343
9113
  {
8344
9114
  variants: {
8345
9115
  variant: {
8346
- 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}`,
8347
- 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}`,
8348
- 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}`,
8349
- 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}`,
8350
- 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}`
9116
+ 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}`,
9117
+ 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}`,
9118
+ 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}`,
9119
+ 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}`,
9120
+ 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}`
8351
9121
  },
8352
9122
  size: {
8353
- xs: `${INPUT_TOKENS.size.xs.padding.horizontal} ${INPUT_TOKENS.size.xs.padding.vertical} ${INPUT_TOKENS.size.xs.radius} ${INPUT_TOKENS.size.xs.fontSize}`,
8354
- sm: `${INPUT_TOKENS.size.sm.padding.horizontal} ${INPUT_TOKENS.size.sm.padding.vertical} ${INPUT_TOKENS.size.sm.radius} ${INPUT_TOKENS.size.sm.fontSize}`,
8355
- 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}`,
8356
- lg: `${INPUT_TOKENS.size.lg.padding.horizontal} ${INPUT_TOKENS.size.lg.padding.vertical} ${INPUT_TOKENS.size.lg.radius} ${INPUT_TOKENS.size.lg.fontSize}`,
8357
- xl: `${INPUT_TOKENS.size.xl.padding.horizontal} ${INPUT_TOKENS.size.xl.padding.vertical} ${INPUT_TOKENS.size.xl.radius} ${INPUT_TOKENS.size.xl.fontSize}`
9123
+ xs: `${TEXTAREA_TOKENS.size.xs.padding.horizontal} ${TEXTAREA_TOKENS.size.xs.padding.vertical} ${TEXTAREA_TOKENS.size.xs.radius} ${TEXTAREA_TOKENS.size.xs.fontSize}`,
9124
+ sm: `${TEXTAREA_TOKENS.size.sm.padding.horizontal} ${TEXTAREA_TOKENS.size.sm.padding.vertical} ${TEXTAREA_TOKENS.size.sm.radius} ${TEXTAREA_TOKENS.size.sm.fontSize}`,
9125
+ 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}`,
9126
+ lg: `${TEXTAREA_TOKENS.size.lg.padding.horizontal} ${TEXTAREA_TOKENS.size.lg.padding.vertical} ${TEXTAREA_TOKENS.size.lg.radius} ${TEXTAREA_TOKENS.size.lg.fontSize}`,
9127
+ xl: `${TEXTAREA_TOKENS.size.xl.padding.horizontal} ${TEXTAREA_TOKENS.size.xl.padding.vertical} ${TEXTAREA_TOKENS.size.xl.radius} ${TEXTAREA_TOKENS.size.xl.fontSize}`
8358
9128
  },
8359
9129
  state: {
8360
- 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}`,
8361
- 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}`,
8362
- 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}`,
8363
- 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}`
9130
+ 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}`,
9131
+ 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}`,
9132
+ 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}`,
9133
+ 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}`
8364
9134
  },
8365
9135
  fullWidth: {
8366
- true: INPUT_TOKENS.width.full,
9136
+ true: TEXTAREA_TOKENS.width.full,
8367
9137
  false: ""
8368
9138
  }
8369
9139
  },
@@ -8407,7 +9177,7 @@ var Textarea = React49__namespace.forwardRef(
8407
9177
  const currentLength = typeof currentValue === "string" ? currentValue.length : 0;
8408
9178
  const shouldShowCounter = showCharacterCount && maxLength !== void 0;
8409
9179
  if (shouldShowCounter) {
8410
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("relative", fullWidth !== false && INPUT_TOKENS.width.full), children: [
9180
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("relative", fullWidth !== false && TEXTAREA_TOKENS.width.full), children: [
8411
9181
  /* @__PURE__ */ jsxRuntime.jsx(
8412
9182
  "textarea",
8413
9183
  {
@@ -8427,11 +9197,11 @@ var Textarea = React49__namespace.forwardRef(
8427
9197
  {
8428
9198
  className: cn(
8429
9199
  "absolute",
8430
- INPUT_TOKENS.message.position.bottom,
8431
- INPUT_TOKENS.message.position.right,
9200
+ TEXTAREA_TOKENS.message.position.bottom,
9201
+ TEXTAREA_TOKENS.message.position.right,
8432
9202
  TEXT_TOKENS.fontSize.xs,
8433
- INPUT_TOKENS.message.color.default,
8434
- currentLength > maxLength && INPUT_TOKENS.message.color.error
9203
+ TEXTAREA_TOKENS.message.color.default,
9204
+ currentLength > maxLength && TEXTAREA_TOKENS.message.color.error
8435
9205
  ),
8436
9206
  children: [
8437
9207
  currentLength,
@@ -8466,45 +9236,6 @@ function shadowToClass(value) {
8466
9236
  if (!value || value === "none") return void 0;
8467
9237
  return `shadow-${value}`;
8468
9238
  }
8469
- function displayToClass(value) {
8470
- if (!value) return void 0;
8471
- if (value === "inline") return "inline";
8472
- if (value === "inline-block") return "inline-block";
8473
- if (value === "flex") return "flex";
8474
- if (value === "inline-flex") return "inline-flex";
8475
- if (value === "grid") return "grid";
8476
- if (value === "inline-grid") return "inline-grid";
8477
- if (value === "block") return "block";
8478
- if (value === "none") return "hidden";
8479
- return void 0;
8480
- }
8481
- function flexDirectionToClass(value) {
8482
- if (!value) return void 0;
8483
- if (value === "row") return "flex-row";
8484
- if (value === "column") return "flex-col";
8485
- if (value === "row-reverse") return "flex-row-reverse";
8486
- if (value === "column-reverse") return "flex-col-reverse";
8487
- return void 0;
8488
- }
8489
- function alignToClass(value) {
8490
- if (!value) return void 0;
8491
- if (value === "start") return "items-start";
8492
- if (value === "end") return "items-end";
8493
- if (value === "center") return "items-center";
8494
- if (value === "baseline") return "items-baseline";
8495
- if (value === "stretch") return "items-stretch";
8496
- return void 0;
8497
- }
8498
- function justifyToClass(value) {
8499
- if (!value) return void 0;
8500
- if (value === "start") return "justify-start";
8501
- if (value === "end") return "justify-end";
8502
- if (value === "center") return "justify-center";
8503
- if (value === "between") return "justify-between";
8504
- if (value === "around") return "justify-around";
8505
- if (value === "evenly") return "justify-evenly";
8506
- return void 0;
8507
- }
8508
9239
  var Box = React49__namespace.forwardRef(
8509
9240
  ({
8510
9241
  as: Component = "div",
@@ -8522,14 +9253,9 @@ var Box = React49__namespace.forwardRef(
8522
9253
  mr,
8523
9254
  mb,
8524
9255
  ml,
8525
- display,
8526
- flexDirection,
8527
9256
  radius,
8528
9257
  shadow,
8529
9258
  bg,
8530
- gap,
8531
- align,
8532
- justify,
8533
9259
  className,
8534
9260
  style,
8535
9261
  ...props
@@ -8550,7 +9276,6 @@ var Box = React49__namespace.forwardRef(
8550
9276
  const mlValue = getBaseValue2(ml);
8551
9277
  const radiusValue = getBaseValue2(radius);
8552
9278
  const bgValue = getBaseValue2(bg);
8553
- const gapValue = getBaseValue2(gap);
8554
9279
  const inlineStyles = {
8555
9280
  ...pValue !== void 0 && { padding: getSpacingCSSVar(String(pValue)) },
8556
9281
  ...!p && pxValue !== void 0 && {
@@ -8580,18 +9305,9 @@ var Box = React49__namespace.forwardRef(
8580
9305
  ...!m && !mx && mlValue !== void 0 && { marginLeft: getSpacingCSSVar(String(mlValue)) },
8581
9306
  ...radiusValue !== void 0 && { borderRadius: getRadiusCSSVar(radiusValue) },
8582
9307
  ...bgValue !== void 0 && { backgroundColor: getColorCSSVar(bgValue) },
8583
- ...gapValue !== void 0 && { gap: getSpacingCSSVar(String(gapValue)) },
8584
9308
  ...style
8585
9309
  };
8586
9310
  const classes = cn(
8587
- // Display
8588
- displayToClass(display),
8589
- // Flex direction
8590
- flexDirectionToClass(flexDirection),
8591
- // Align
8592
- alignToClass(align),
8593
- // Justify
8594
- justifyToClass(justify),
8595
9311
  // Shadow
8596
9312
  shadowToClass(shadow),
8597
9313
  className
@@ -8602,18 +9318,46 @@ var Box = React49__namespace.forwardRef(
8602
9318
  }
8603
9319
  );
8604
9320
  Box.displayName = "Box";
9321
+ function alignToClass(value) {
9322
+ if (!value) return void 0;
9323
+ if (value === "start") return "items-start";
9324
+ if (value === "end") return "items-end";
9325
+ if (value === "center") return "items-center";
9326
+ if (value === "baseline") return "items-baseline";
9327
+ if (value === "stretch") return "items-stretch";
9328
+ return void 0;
9329
+ }
9330
+ function justifyToClass(value) {
9331
+ if (!value) return void 0;
9332
+ if (value === "start") return "justify-start";
9333
+ if (value === "end") return "justify-end";
9334
+ if (value === "center") return "justify-center";
9335
+ if (value === "between") return "justify-between";
9336
+ if (value === "around") return "justify-around";
9337
+ if (value === "evenly") return "justify-evenly";
9338
+ return void 0;
9339
+ }
8605
9340
  var Stack = React49__namespace.forwardRef(
8606
- ({ direction = "vertical", spacing: spacing2, gap, align, justify, ...props }, ref) => {
9341
+ ({ direction = "vertical", spacing: spacing2, gap, align, justify, className, style, ...props }, ref) => {
8607
9342
  const gapValue = spacing2 ?? gap;
9343
+ const gapBaseValue = getBaseValue(gapValue);
9344
+ const flexClasses = cn(
9345
+ "flex",
9346
+ direction === "horizontal" ? "flex-row" : "flex-col",
9347
+ alignToClass(align),
9348
+ justifyToClass(justify),
9349
+ className
9350
+ );
9351
+ const inlineStyles = {
9352
+ ...gapBaseValue !== void 0 && { gap: getSpacingCSSVar(String(gapBaseValue)) },
9353
+ ...style
9354
+ };
8608
9355
  return /* @__PURE__ */ jsxRuntime.jsx(
8609
9356
  Box,
8610
9357
  {
8611
9358
  ref,
8612
- display: "flex",
8613
- flexDirection: direction === "horizontal" ? "row" : "column",
8614
- gap: gapValue,
8615
- align,
8616
- justify,
9359
+ className: flexClasses,
9360
+ style: Object.keys(inlineStyles).length > 0 ? inlineStyles : void 0,
8617
9361
  ...props
8618
9362
  }
8619
9363
  );
@@ -8724,7 +9468,7 @@ function getFlexBaseValue(value) {
8724
9468
  }
8725
9469
  return value;
8726
9470
  }
8727
- function flexDirectionToClass2(value) {
9471
+ function flexDirectionToClass(value) {
8728
9472
  if (!value) return void 0;
8729
9473
  if (value === "row") return "flex-row";
8730
9474
  if (value === "column") return "flex-col";
@@ -8777,8 +9521,10 @@ var Flex = React49__namespace.forwardRef(
8777
9521
  const alignValue = getFlexBaseValue(align);
8778
9522
  const justifyValue = getFlexBaseValue(justify);
8779
9523
  const basisValue = getFlexBaseValue(basis);
9524
+ const gapBaseValue = getBaseValue(gap);
8780
9525
  const flexClasses = cn(
8781
- flexDirectionToClass2(directionValue),
9526
+ "flex",
9527
+ flexDirectionToClass(directionValue),
8782
9528
  flexWrapToClass(wrapValue),
8783
9529
  growToClass(grow),
8784
9530
  shrinkToClass(shrink),
@@ -8797,15 +9543,13 @@ var Flex = React49__namespace.forwardRef(
8797
9543
  })();
8798
9544
  const flexStyle = {
8799
9545
  ...flexBasisCSS ? { flexBasis: flexBasisCSS } : {},
9546
+ ...gapBaseValue !== void 0 && { gap: getSpacingCSSVar(String(gapBaseValue)) },
8800
9547
  ...style
8801
9548
  };
8802
9549
  return /* @__PURE__ */ jsxRuntime.jsx(
8803
9550
  Box,
8804
9551
  {
8805
9552
  ref,
8806
- display: "flex",
8807
- flexDirection: directionValue,
8808
- gap,
8809
9553
  className: flexClasses,
8810
9554
  style: Object.keys(flexStyle).length > 0 ? flexStyle : void 0,
8811
9555
  ...props
@@ -8872,7 +9616,22 @@ function justifyToClass3(value) {
8872
9616
  return void 0;
8873
9617
  }
8874
9618
  var Grid = React49__namespace.forwardRef(
8875
- ({ cols, sm, md, lg, xl, "2xl": xl2, rows, gap, flow, align, justify, className, ...props }, ref) => {
9619
+ ({
9620
+ cols,
9621
+ sm,
9622
+ md,
9623
+ lg,
9624
+ xl,
9625
+ "2xl": xl2,
9626
+ rows,
9627
+ gap,
9628
+ flow,
9629
+ align,
9630
+ justify,
9631
+ className,
9632
+ style,
9633
+ ...props
9634
+ }, ref) => {
8876
9635
  let colsValue = cols;
8877
9636
  if (sm || md || lg || xl || xl2) {
8878
9637
  if (cols !== void 0 && typeof cols !== "object") {
@@ -8941,23 +9700,25 @@ var Grid = React49__namespace.forwardRef(
8941
9700
  justifyToClass3(justifyValue),
8942
9701
  className
8943
9702
  );
8944
- return /* @__PURE__ */ jsxRuntime.jsx(Box, { ref, display: "grid", gap, className: gridClasses, ...props });
9703
+ const gapBaseValue = gap ? getBaseValue(gap) : void 0;
9704
+ const gridStyle = {
9705
+ ...gapBaseValue !== void 0 && { gap: getSpacingCSSVar(String(gapBaseValue)) },
9706
+ ...style
9707
+ };
9708
+ return /* @__PURE__ */ jsxRuntime.jsx(
9709
+ Box,
9710
+ {
9711
+ ref,
9712
+ className: cn("grid", gridClasses),
9713
+ style: Object.keys(gridStyle).length > 0 ? gridStyle : void 0,
9714
+ ...props
9715
+ }
9716
+ );
8945
9717
  }
8946
9718
  );
8947
9719
  Grid.displayName = "Grid";
8948
- var Row = React49__namespace.forwardRef(({ gap, align, justify, ...props }, ref) => {
8949
- return /* @__PURE__ */ jsxRuntime.jsx(
8950
- Box,
8951
- {
8952
- ref,
8953
- display: "flex",
8954
- flexDirection: "row",
8955
- gap,
8956
- align,
8957
- justify,
8958
- ...props
8959
- }
8960
- );
9720
+ var Row = React49__namespace.forwardRef((props, ref) => {
9721
+ return /* @__PURE__ */ jsxRuntime.jsx(Stack, { ref, direction: "horizontal", ...props });
8961
9722
  });
8962
9723
  Row.displayName = "Row";
8963
9724
  var surfaceVariants = classVarianceAuthority.cva("", {
@@ -8992,7 +9753,7 @@ var labelVariants = classVarianceAuthority.cva(
8992
9753
  var Label2 = React49__namespace.forwardRef(
8993
9754
  ({ className, required, children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(LabelPrimitive__namespace.Root, { ref, className: cn(labelVariants(), className), ...props, children: [
8994
9755
  children,
8995
- required && /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn(INPUT_TOKENS.label.requiredMark, "ml-xs"), children: "*" })
9756
+ required && /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn(FORM_TOKENS.label.requiredMark, "ml-xs"), children: "*" })
8996
9757
  ] })
8997
9758
  );
8998
9759
  Label2.displayName = LabelPrimitive__namespace.Root.displayName;
@@ -9339,7 +10100,7 @@ var ToastRoot = React49__namespace.forwardRef(
9339
10100
  altText: toast.action.label,
9340
10101
  onClick: toast.action.onClick,
9341
10102
  className: cn(
9342
- "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",
10103
+ "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",
9343
10104
  TOAST_TOKENS.action.height,
9344
10105
  TOAST_TOKENS.action.padding,
9345
10106
  TOAST_TOKENS.action.fontSize
@@ -9397,7 +10158,7 @@ var ToastAction = React49__namespace.forwardRef(({ className, ...props }, ref) =
9397
10158
  {
9398
10159
  ref,
9399
10160
  className: cn(
9400
- "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",
10161
+ "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",
9401
10162
  TOAST_TOKENS.action.height,
9402
10163
  TOAST_TOKENS.action.padding,
9403
10164
  TOAST_TOKENS.action.fontSize,
@@ -9837,7 +10598,7 @@ var NotificationCenterItem = React49__namespace.forwardRef(
9837
10598
  size: "icon",
9838
10599
  onClick: handleDismiss,
9839
10600
  "aria-label": "Dismiss notification",
9840
- 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",
10601
+ 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",
9841
10602
  children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "h-4 w-4" })
9842
10603
  }
9843
10604
  )
@@ -10398,7 +11159,7 @@ var PopoverArrow = React49__namespace.forwardRef(
10398
11159
  );
10399
11160
  PopoverArrow.displayName = "PopoverArrow";
10400
11161
 
10401
- // node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs
11162
+ // node_modules/.pnpm/@floating-ui+utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs
10402
11163
  var min = Math.min;
10403
11164
  var max = Math.max;
10404
11165
  var round = Math.round;
@@ -10529,7 +11290,7 @@ function rectToClientRect(rect) {
10529
11290
  };
10530
11291
  }
10531
11292
 
10532
- // node_modules/@floating-ui/core/dist/floating-ui.core.mjs
11293
+ // node_modules/.pnpm/@floating-ui+core@1.7.3/node_modules/@floating-ui/core/dist/floating-ui.core.mjs
10533
11294
  function computeCoordsFromPlacement(_ref, placement, rtl) {
10534
11295
  let {
10535
11296
  reference,
@@ -10974,7 +11735,7 @@ var shift = function(options) {
10974
11735
  };
10975
11736
  };
10976
11737
 
10977
- // node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs
11738
+ // node_modules/.pnpm/@floating-ui+utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs
10978
11739
  function hasWindow() {
10979
11740
  return typeof window !== "undefined";
10980
11741
  }
@@ -11127,7 +11888,7 @@ function getFrameElement(win) {
11127
11888
  return win.parent && Object.getPrototypeOf(win.parent) ? win.frameElement : null;
11128
11889
  }
11129
11890
 
11130
- // node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs
11891
+ // node_modules/.pnpm/@floating-ui+dom@1.7.4/node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs
11131
11892
  function getCssDimensions(element) {
11132
11893
  const css = getComputedStyle2(element);
11133
11894
  let width = parseFloat(css.width) || 0;
@@ -11981,7 +12742,7 @@ function usePositioning({
11981
12742
  return offsetValue;
11982
12743
  }
11983
12744
  const baseOffset = getBaseValue(offsetValue);
11984
- return baseOffset ? getSpacingPx(baseOffset) : 4;
12745
+ return baseOffset ? getSpacingPx(baseOffset) : getSpacingPx(1);
11985
12746
  }, [offsetValue]);
11986
12747
  React49__namespace.useEffect(() => {
11987
12748
  setMounted(true);
@@ -11992,7 +12753,7 @@ function usePositioning({
11992
12753
  middlewareArray.push(flip3());
11993
12754
  }
11994
12755
  if (enableShift) {
11995
- middlewareArray.push(shift3({ padding: 8 }));
12756
+ middlewareArray.push(shift3({ padding: getSpacingPx(2) }));
11996
12757
  }
11997
12758
  return middlewareArray;
11998
12759
  }, [offsetPx, enableFlip, enableShift]);
@@ -12351,7 +13112,7 @@ var DropdownMenuItem = React49__namespace.forwardRef(
12351
13112
  MENU_TOKENS.item.padding.md,
12352
13113
  MENU_TOKENS.item.radius.md,
12353
13114
  inset && "pl-8",
12354
- !disabled && "focus:bg-accent focus:text-accent-foreground",
13115
+ !disabled && "focus-visible:bg-accent focus-visible:text-accent-foreground",
12355
13116
  selected && "bg-accent/50",
12356
13117
  disabled && "pointer-events-none opacity-50",
12357
13118
  className
@@ -12834,9 +13595,9 @@ var CONTEXT_MENU_TOKENS = {
12834
13595
  radius: "rounded-sm",
12835
13596
  // 4px (0.25rem)
12836
13597
  focus: {
12837
- background: "focus:bg-[hsl(var(--accent))]",
13598
+ background: "focus-visible:bg-[hsl(var(--accent))]",
12838
13599
  // Focus background using CSS var
12839
- text: "focus:text-[hsl(var(--accent-foreground))]"
13600
+ text: "focus-visible:text-[hsl(var(--accent-foreground))]"
12840
13601
  // Focus text using CSS var
12841
13602
  },
12842
13603
  disabled: {
@@ -13224,7 +13985,7 @@ var Skeleton = React49__namespace.forwardRef(
13224
13985
  Skeleton.displayName = "Skeleton";
13225
13986
  var EmptyStateAction = React49__namespace.forwardRef(
13226
13987
  ({ className, children, ...props }, ref) => {
13227
- return /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: cn("mt-2", className), ...props, children });
13988
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: cn(EMPTY_STATE_TOKENS.spacing.action, className), ...props, children });
13228
13989
  }
13229
13990
  );
13230
13991
  EmptyStateAction.displayName = "EmptyStateAction";
@@ -13235,9 +13996,10 @@ var EmptyStateDescription = React49__namespace.forwardRef(
13235
13996
  {
13236
13997
  ref,
13237
13998
  className: cn(
13238
- DATA_TOKENS.emptyState.typography.description.fontSize,
13239
- DATA_TOKENS.emptyState.typography.description.fontWeight,
13240
- "max-w-md text-muted-foreground",
13999
+ EMPTY_STATE_TOKENS.typography.description.fontSize,
14000
+ EMPTY_STATE_TOKENS.typography.description.fontWeight,
14001
+ EMPTY_STATE_TOKENS.typography.description.color,
14002
+ EMPTY_STATE_TOKENS.typography.description.maxWidth,
13241
14003
  className
13242
14004
  ),
13243
14005
  ...props,
@@ -13249,16 +14011,12 @@ var EmptyStateDescription = React49__namespace.forwardRef(
13249
14011
  EmptyStateDescription.displayName = "EmptyStateDescription";
13250
14012
  var EmptyStateIcon = React49__namespace.forwardRef(
13251
14013
  ({ children, size: size3 = "md", className, ...props }, ref) => {
13252
- const iconSizeClass = DATA_TOKENS.emptyState.iconSize[size3];
14014
+ const iconSizeClass = EMPTY_STATE_TOKENS.icon.size[size3];
13253
14015
  return /* @__PURE__ */ jsxRuntime.jsx(
13254
14016
  "div",
13255
14017
  {
13256
14018
  ref,
13257
- className: cn(
13258
- "flex items-center justify-center text-muted-foreground",
13259
- iconSizeClass,
13260
- className
13261
- ),
14019
+ className: cn(EMPTY_STATE_TOKENS.icon.container, iconSizeClass, className),
13262
14020
  ...props,
13263
14021
  children
13264
14022
  }
@@ -13273,9 +14031,9 @@ var EmptyStateTitle = React49__namespace.forwardRef(
13273
14031
  {
13274
14032
  ref,
13275
14033
  className: cn(
13276
- DATA_TOKENS.emptyState.typography.title.fontSize,
13277
- DATA_TOKENS.emptyState.typography.title.fontWeight,
13278
- "text-foreground",
14034
+ EMPTY_STATE_TOKENS.typography.title.fontSize,
14035
+ EMPTY_STATE_TOKENS.typography.title.fontWeight,
14036
+ EMPTY_STATE_TOKENS.typography.title.color,
13279
14037
  className
13280
14038
  ),
13281
14039
  ...props,
@@ -13296,7 +14054,7 @@ var EmptyState = React49__namespace.forwardRef(
13296
14054
  variant: "flat",
13297
14055
  radius: "xl",
13298
14056
  p: "lg",
13299
- className: cn("text-center", className),
14057
+ className: cn(EMPTY_STATE_TOKENS.alignment.center, className),
13300
14058
  id: emptyStateId,
13301
14059
  ...props,
13302
14060
  children: /* @__PURE__ */ jsxRuntime.jsx(Stack, { gap: "md", align: "center", justify: "center", children })
@@ -13313,14 +14071,16 @@ var DataListItem = React49__namespace.forwardRef(
13313
14071
  ({ padding = "md", className, children, ...props }, ref) => {
13314
14072
  const paddingValue = getBaseValue(padding);
13315
14073
  const paddingKey = paddingValue && ["sm", "md", "lg"].includes(String(paddingValue)) ? String(paddingValue) : "md";
13316
- const paddingClass = DATA_TOKENS.dataList.rowPadding[paddingKey];
14074
+ const paddingClass = DATA_LIST_TOKENS.rowPadding[paddingKey];
13317
14075
  return /* @__PURE__ */ jsxRuntime.jsx(
13318
14076
  "div",
13319
14077
  {
13320
14078
  ref,
13321
14079
  className: cn(
13322
14080
  paddingClass,
13323
- "flex flex-col border-b border-border last:border-0 md:flex-row md:items-center",
14081
+ DATA_LIST_TOKENS.item.layout.mobile,
14082
+ DATA_LIST_TOKENS.item.layout.desktop,
14083
+ DATA_LIST_TOKENS.item.border,
13324
14084
  className
13325
14085
  ),
13326
14086
  ...props,
@@ -13337,9 +14097,9 @@ var DataListLabel = React49__namespace.forwardRef(
13337
14097
  {
13338
14098
  ref,
13339
14099
  className: cn(
13340
- "mb-1 font-semibold text-foreground md:mb-0",
13341
- "md:w-32",
13342
- // Default md width from tokens
14100
+ DATA_LIST_TOKENS.label.mobile,
14101
+ DATA_LIST_TOKENS.label.desktop,
14102
+ DATA_LIST_TOKENS.labelWidth.md,
13343
14103
  className
13344
14104
  ),
13345
14105
  ...props,
@@ -13351,13 +14111,21 @@ var DataListLabel = React49__namespace.forwardRef(
13351
14111
  DataListLabel.displayName = "DataListLabel";
13352
14112
  var DataListValue = React49__namespace.forwardRef(
13353
14113
  ({ className, children, ...props }, ref) => {
13354
- return /* @__PURE__ */ jsxRuntime.jsx("dd", { ref, className: cn("flex-1 text-muted-foreground", className), ...props, children });
14114
+ return /* @__PURE__ */ jsxRuntime.jsx(
14115
+ "dd",
14116
+ {
14117
+ ref,
14118
+ className: cn(DATA_LIST_TOKENS.value.flex, DATA_LIST_TOKENS.value.color, className),
14119
+ ...props,
14120
+ children
14121
+ }
14122
+ );
13355
14123
  }
13356
14124
  );
13357
14125
  DataListValue.displayName = "DataListValue";
13358
14126
  var DataListRoot = React49__namespace.forwardRef(
13359
14127
  ({ labelWidth: _labelWidth = "md", className, children, ...props }, ref) => {
13360
- return /* @__PURE__ */ jsxRuntime.jsx("dl", { ref, className: cn(DATA_TOKENS.dataList.spacing.gap, className), ...props, children });
14128
+ return /* @__PURE__ */ jsxRuntime.jsx("dl", { ref, className: cn(DATA_LIST_TOKENS.spacing.gap, className), ...props, children });
13361
14129
  }
13362
14130
  );
13363
14131
  DataListRoot.displayName = "DataListRoot";
@@ -13372,9 +14140,9 @@ var TableBody = React49__namespace.forwardRef(
13372
14140
  TableBody.displayName = "TableBody";
13373
14141
  var TableCell = React49__namespace.forwardRef(
13374
14142
  ({ align = "left", size: size3 = "md", className, ...props }, ref) => {
13375
- const paddingClass = DATA_TOKENS.table.padding.cell[size3];
13376
- const typographyClass = DATA_TOKENS.table.typography.cell.fontSize;
13377
- const fontWeightClass = DATA_TOKENS.table.typography.cell.fontWeight;
14143
+ const paddingClass = TABLE_TOKENS.padding.cell[size3];
14144
+ const typographyClass = TABLE_TOKENS.typography.cell.fontSize;
14145
+ const fontWeightClass = TABLE_TOKENS.typography.cell.fontWeight;
13378
14146
  const alignmentClasses = {
13379
14147
  left: "text-left",
13380
14148
  center: "text-center",
@@ -13400,7 +14168,7 @@ var TableCell = React49__namespace.forwardRef(
13400
14168
  TableCell.displayName = "TableCell";
13401
14169
  var TableEmpty = React49__namespace.forwardRef(
13402
14170
  ({ colSpan, message = "No data available", className, ...props }, ref) => {
13403
- return /* @__PURE__ */ jsxRuntime.jsx("tr", { ref, className: cn(className), ...props, children: /* @__PURE__ */ jsxRuntime.jsx("td", { colSpan, className: "p-8", children: /* @__PURE__ */ jsxRuntime.jsxs(EmptyState, { children: [
14171
+ return /* @__PURE__ */ jsxRuntime.jsx("tr", { ref, className: cn(className), ...props, children: /* @__PURE__ */ jsxRuntime.jsx("td", { colSpan, className: TABLE_TOKENS.empty.padding, children: /* @__PURE__ */ jsxRuntime.jsxs(EmptyState, { children: [
13404
14172
  /* @__PURE__ */ jsxRuntime.jsx(EmptyStateIcon, { children: "\u{1F4ED}" }),
13405
14173
  /* @__PURE__ */ jsxRuntime.jsx(EmptyStateTitle, { children: message })
13406
14174
  ] }) }) });
@@ -13415,13 +14183,22 @@ var TableExpandableContent = React49__namespace.forwardRef(
13415
14183
  ref,
13416
14184
  colSpan,
13417
14185
  className: cn(
13418
- "p-0",
13419
- "overflow-hidden transition-all duration-normal ease-in-out",
13420
- expanded ? "max-h-[100vh] opacity-100" : "max-h-0 opacity-0",
14186
+ TABLE_TOKENS.expandable.container,
14187
+ TABLE_TOKENS.expandable.transition,
14188
+ expanded ? TABLE_TOKENS.expandable.expanded : TABLE_TOKENS.expandable.collapsed,
13421
14189
  className
13422
14190
  ),
13423
14191
  ...props,
13424
- children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("p-md", expanded ? "block" : "hidden"), children })
14192
+ children: /* @__PURE__ */ jsxRuntime.jsx(
14193
+ "div",
14194
+ {
14195
+ className: cn(
14196
+ TABLE_TOKENS.expandable.padding,
14197
+ expanded ? TABLE_TOKENS.expandable.content.expanded : TABLE_TOKENS.expandable.content.collapsed
14198
+ ),
14199
+ children
14200
+ }
14201
+ )
13425
14202
  }
13426
14203
  );
13427
14204
  }
@@ -13434,9 +14211,9 @@ var TableSortIcon = React49__namespace.forwardRef(
13434
14211
  {
13435
14212
  ref,
13436
14213
  className: cn(
13437
- "inline-flex size-4 items-center text-muted-foreground transition-transform",
13438
- direction === "desc" && "rotate-180",
13439
- !direction && "opacity-30",
14214
+ TABLE_TOKENS.sortable.icon.base,
14215
+ direction === "desc" && TABLE_TOKENS.sortable.icon.rotated,
14216
+ !direction && TABLE_TOKENS.sortable.icon.inactive,
13440
14217
  className
13441
14218
  ),
13442
14219
  "aria-hidden": "true",
@@ -13483,9 +14260,9 @@ var TableHead = React49__namespace.forwardRef(
13483
14260
  direction: nextDirection
13484
14261
  });
13485
14262
  }, [sortable, columnKey, sortState, setSortState]);
13486
- const paddingClass = DATA_TOKENS.table.padding.header[size3];
13487
- const typographyClass = DATA_TOKENS.table.typography.header.fontSize;
13488
- const fontWeightClass = DATA_TOKENS.table.typography.header.fontWeight;
14263
+ const paddingClass = TABLE_TOKENS.padding.header[size3];
14264
+ const typographyClass = TABLE_TOKENS.typography.header.fontSize;
14265
+ const fontWeightClass = TABLE_TOKENS.typography.header.fontWeight;
13489
14266
  const alignmentClasses = {
13490
14267
  left: "text-left",
13491
14268
  center: "text-center",
@@ -13502,9 +14279,10 @@ var TableHead = React49__namespace.forwardRef(
13502
14279
  typographyClass,
13503
14280
  fontWeightClass,
13504
14281
  alignmentClasses[align],
13505
- DATA_TOKENS.table.colors.border,
13506
- "border-b",
13507
- sortable && "cursor-pointer select-none hover:bg-muted/50",
14282
+ TABLE_TOKENS.colors.border,
14283
+ TABLE_TOKENS.border.bottom,
14284
+ sortable && TABLE_TOKENS.sortable.cursor,
14285
+ sortable && TABLE_TOKENS.sortable.hover,
13508
14286
  className
13509
14287
  ),
13510
14288
  onClick: handleSort,
@@ -13516,7 +14294,7 @@ var TableHead = React49__namespace.forwardRef(
13516
14294
  })(),
13517
14295
  role: "columnheader",
13518
14296
  ...props,
13519
- children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
14297
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn(TABLE_TOKENS.sortable.container, TABLE_TOKENS.sortable.gap), children: [
13520
14298
  children,
13521
14299
  sortable && /* @__PURE__ */ jsxRuntime.jsx(TableSortIcon, { direction: sortDirection })
13522
14300
  ] })
@@ -13531,7 +14309,7 @@ var TableHeader = React49__namespace.forwardRef(
13531
14309
  "thead",
13532
14310
  {
13533
14311
  ref,
13534
- className: cn(sticky && "sticky top-0 z-10 bg-background", className),
14312
+ className: cn(sticky && TABLE_TOKENS.sticky.header, className),
13535
14313
  role: "rowgroup",
13536
14314
  ...props
13537
14315
  }
@@ -13541,7 +14319,7 @@ var TableHeader = React49__namespace.forwardRef(
13541
14319
  TableHeader.displayName = "TableHeader";
13542
14320
  var TableLoadingState = React49__namespace.forwardRef(
13543
14321
  ({ colSpan, rows = 5, className, ...props }, ref) => {
13544
- return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: Array.from({ length: rows }).map((_, index2) => /* @__PURE__ */ jsxRuntime.jsx("tr", { ref: index2 === 0 ? ref : void 0, className: cn(className), ...props, children: Array.from({ length: colSpan }).map((_2, cellIndex) => /* @__PURE__ */ jsxRuntime.jsx("td", { className: "p-sm", children: /* @__PURE__ */ jsxRuntime.jsx(Skeleton, { variant: "text", className: "w-full" }) }, cellIndex)) }, index2)) });
14322
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: Array.from({ length: rows }).map((_, index2) => /* @__PURE__ */ jsxRuntime.jsx("tr", { ref: index2 === 0 ? ref : void 0, className: cn(className), ...props, children: Array.from({ length: colSpan }).map((_2, cellIndex) => /* @__PURE__ */ jsxRuntime.jsx("td", { className: TABLE_TOKENS.loading.cellPadding, children: /* @__PURE__ */ jsxRuntime.jsx(Skeleton, { variant: "text", className: TABLE_TOKENS.loading.skeletonWidth }) }, cellIndex)) }, index2)) });
13545
14323
  }
13546
14324
  );
13547
14325
  TableLoadingState.displayName = "TableLoadingState";
@@ -13559,11 +14337,11 @@ var TableRow = React49__namespace.forwardRef(
13559
14337
  {
13560
14338
  ref,
13561
14339
  className: cn(
13562
- DATA_TOKENS.table.colors.border,
13563
- "border-b",
13564
- DATA_TOKENS.table.colors.rowHover,
13565
- selected && DATA_TOKENS.table.colors.rowSelected,
13566
- expandable && "cursor-pointer",
14340
+ TABLE_TOKENS.colors.border,
14341
+ TABLE_TOKENS.border.bottom,
14342
+ TABLE_TOKENS.colors.rowHover,
14343
+ selected && TABLE_TOKENS.colors.rowSelected,
14344
+ expandable && TABLE_TOKENS.expandable.cursor,
13567
14345
  className
13568
14346
  ),
13569
14347
  "aria-expanded": expandable ? expanded : void 0,
@@ -13624,13 +14402,13 @@ function TableRoot({
13624
14402
  }),
13625
14403
  [sortState, expandedRows, toggleRow, expandable, renderExpandableContent]
13626
14404
  );
13627
- return /* @__PURE__ */ jsxRuntime.jsx(TableContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "overflow-x-auto", children: /* @__PURE__ */ jsxRuntime.jsx(
14405
+ return /* @__PURE__ */ jsxRuntime.jsx(TableContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: TABLE_TOKENS.layout.overflow, children: /* @__PURE__ */ jsxRuntime.jsx(
13628
14406
  "table",
13629
14407
  {
13630
14408
  className: cn(
13631
- "w-full border-collapse",
13632
- DATA_TOKENS.table.radius.default,
13633
- DATA_TOKENS.table.shadow.subtle,
14409
+ TABLE_TOKENS.layout.table,
14410
+ TABLE_TOKENS.radius.default,
14411
+ TABLE_TOKENS.shadow.subtle,
13634
14412
  className
13635
14413
  ),
13636
14414
  role: "table",
@@ -15197,8 +15975,8 @@ var artistCardGenresVariants = classVarianceAuthority.cva(
15197
15975
  }
15198
15976
  );
15199
15977
  var artistCardFooterBorderVariants = classVarianceAuthority.cva(
15200
- // Base classes - border top, spacing
15201
- "border-t border-border",
15978
+ // Base classes - border top from ARTIST_TOKENS, spacing from DOMAIN_TOKENS
15979
+ ARTIST_TOKENS.footer.border.top,
15202
15980
  {
15203
15981
  variants: {
15204
15982
  size: {
@@ -15258,37 +16036,49 @@ var ArtistCard = React49__namespace.forwardRef(
15258
16036
  ...props,
15259
16037
  children: [
15260
16038
  featured && popularBadgeText && /* @__PURE__ */ jsxRuntime.jsx("div", { className: artistCardBadgeVariants({ size: size3 }), children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: artistCardBadgeSurfaceVariants({ size: size3, variant: "featured" }), children: popularBadgeText }) }),
15261
- showImage && /* @__PURE__ */ jsxRuntime.jsx(CardBaseImageWrapper, { size: size3, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative w-full overflow-hidden bg-gradient-to-br from-muted to-muted/50", children: [
15262
- imageUrl ? /* @__PURE__ */ jsxRuntime.jsx(
15263
- "img",
15264
- {
15265
- src: imageUrl,
15266
- alt: name,
15267
- className: cn("h-full w-full", artistCardImageTransformVariants({ size: size3 }))
15268
- }
15269
- ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-full w-full items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(
15270
- Icon2,
15271
- {
15272
- name: "info",
15273
- size: "xl",
15274
- color: "muted",
15275
- className: ICON_TOKENS.sizes["4xl"],
15276
- "aria-hidden": "true"
15277
- }
15278
- ) }),
15279
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: artistCardImageOverlayVariants({ size: size3 }) })
15280
- ] }) }),
16039
+ showImage && /* @__PURE__ */ jsxRuntime.jsx(CardBaseImageWrapper, { size: size3, children: /* @__PURE__ */ jsxRuntime.jsxs(
16040
+ "div",
16041
+ {
16042
+ className: cn(
16043
+ ARTIST_TOKENS.image.container.layout,
16044
+ DOMAIN_TOKENS.image.placeholder.gradient
16045
+ ),
16046
+ children: [
16047
+ imageUrl ? /* @__PURE__ */ jsxRuntime.jsx(
16048
+ "img",
16049
+ {
16050
+ src: imageUrl,
16051
+ alt: name,
16052
+ className: cn(
16053
+ ARTIST_TOKENS.image.sizing.full,
16054
+ artistCardImageTransformVariants({ size: size3 })
16055
+ )
16056
+ }
16057
+ ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: ARTIST_TOKENS.image.placeholder.container, children: /* @__PURE__ */ jsxRuntime.jsx(
16058
+ Icon2,
16059
+ {
16060
+ name: "info",
16061
+ size: "xl",
16062
+ color: "muted",
16063
+ className: ICON_TOKENS.sizes["4xl"],
16064
+ "aria-hidden": "true"
16065
+ }
16066
+ ) }),
16067
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: artistCardImageOverlayVariants({ size: size3 }) })
16068
+ ]
16069
+ }
16070
+ ) }),
15281
16071
  /* @__PURE__ */ jsxRuntime.jsxs(CardBaseContentWrapper, { size: size3, children: [
15282
16072
  /* @__PURE__ */ jsxRuntime.jsx(
15283
16073
  Heading,
15284
16074
  {
15285
16075
  level: 3,
15286
16076
  className: cn(
15287
- "line-clamp-2",
16077
+ DOMAIN_TOKENS.text.lineClamp.two,
15288
16078
  TEXT_TOKENS.fontSize.lg,
15289
16079
  TEXT_TOKENS.fontWeight.bold,
15290
16080
  MOTION_TOKENS.transition.colors,
15291
- "group-hover:text-primary",
16081
+ DOMAIN_TOKENS.text.hover.primary,
15292
16082
  size3 === "compact" ? DOMAIN_TOKENS.spacing.section.titleToSubtitle : DOMAIN_TOKENS.spacing.section.subtitleToMetadata
15293
16083
  ),
15294
16084
  children: href ? /* @__PURE__ */ jsxRuntime.jsx(Link, { href, variant: "ghost", children: name }) : name
@@ -15300,7 +16090,7 @@ var ArtistCard = React49__namespace.forwardRef(
15300
16090
  size: "sm",
15301
16091
  variant: "muted",
15302
16092
  className: cn(
15303
- "line-clamp-2",
16093
+ DOMAIN_TOKENS.text.lineClamp.two,
15304
16094
  size3 === "compact" ? DOMAIN_TOKENS.spacing.section.titleToSubtitle : DOMAIN_TOKENS.spacing.section.subtitleToMetadata
15305
16095
  ),
15306
16096
  children: description
@@ -15362,16 +16152,16 @@ var ArtistCard = React49__namespace.forwardRef(
15362
16152
  }
15363
16153
  );
15364
16154
  ArtistCard.displayName = "ArtistCard";
15365
- var eventCardBadgeVariants = classVarianceAuthority.cva(
16155
+ var categoryCardBadgeVariants = classVarianceAuthority.cva(
15366
16156
  // Base classes - absolute positioning, z-index
15367
16157
  "absolute z-10",
15368
16158
  {
15369
16159
  variants: {
15370
16160
  size: {
15371
16161
  default: DOMAIN_TOKENS.badges.position.default,
15372
- // Default positioning - maps to semanticSpacing.md (12px)
16162
+ // Default positioning - references semanticSpacing.md (16px)
15373
16163
  compact: DOMAIN_TOKENS.badges.position.compact
15374
- // Compact positioning - maps to semanticSpacing.sm (8px)
16164
+ // Compact positioning - references semanticSpacing.sm (8px)
15375
16165
  }
15376
16166
  },
15377
16167
  defaultVariants: {
@@ -15379,9 +16169,10 @@ var eventCardBadgeVariants = classVarianceAuthority.cva(
15379
16169
  }
15380
16170
  }
15381
16171
  );
15382
- var eventCardBadgeSurfaceVariants = classVarianceAuthority.cva(
16172
+ var categoryCardBadgeSurfaceVariants = classVarianceAuthority.cva(
15383
16173
  // Base classes - flex layout, items center, badge styling
15384
- `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`,
16174
+ // Uses DOMAIN_TOKENS for badge-specific styles, TEXT_TOKENS for typography
16175
+ `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}`,
15385
16176
  {
15386
16177
  variants: {
15387
16178
  variant: {
@@ -15394,130 +16185,14 @@ var eventCardBadgeSurfaceVariants = classVarianceAuthority.cva(
15394
16185
  }
15395
16186
  }
15396
16187
  );
15397
- var eventCardMetadataVariants = classVarianceAuthority.cva(
15398
- // Base classes - flex column, metadata spacing
15399
- `flex flex-col ${DOMAIN_TOKENS.metadata.spacing.vertical}`,
15400
- {
15401
- variants: {
15402
- size: {
15403
- default: "",
15404
- compact: ""
15405
- }
15406
- },
15407
- defaultVariants: {
15408
- size: "default"
15409
- }
15410
- }
15411
- );
15412
- var eventCardMetadataItemVariants = classVarianceAuthority.cva(
15413
- // Base classes - flex items center, metadata spacing and text
15414
- `flex items-center ${DOMAIN_TOKENS.metadata.spacing.horizontal} ${DOMAIN_TOKENS.metadata.text.secondary} ${TEXT_TOKENS.fontSize.xs}`,
15415
- {
15416
- variants: {
15417
- size: {
15418
- default: "",
15419
- compact: ""
15420
- }
15421
- },
15422
- defaultVariants: {
15423
- size: "default"
15424
- }
15425
- }
15426
- );
15427
- var eventCardMetadataIconVariants = classVarianceAuthority.cva(
15428
- // Base classes - icon size and color
15429
- `${ICON_TOKENS.sizes.md} ${ICON_TOKENS.colors.muted}`,
15430
- {
15431
- variants: {
15432
- size: {
15433
- default: "",
15434
- compact: ""
15435
- }
15436
- },
15437
- defaultVariants: {
15438
- size: "default"
15439
- }
15440
- }
15441
- );
15442
- var eventCardFooterVariants = classVarianceAuthority.cva(
15443
- // Base classes - border top, spacing
15444
- "border-t border-border",
15445
- {
15446
- variants: {
15447
- size: {
15448
- default: DOMAIN_TOKENS.spacing.footer.paddingTopDefault,
15449
- // Default padding top - references semanticSpacing.sm (8px) via Tailwind
15450
- compact: DOMAIN_TOKENS.spacing.footer.paddingTopCompact
15451
- // Compact padding top - references semanticSpacing.xs (4px) via Tailwind
15452
- }
15453
- },
15454
- defaultVariants: {
15455
- size: "default"
15456
- }
15457
- }
15458
- );
15459
- var eventCardTicketButtonVariants = classVarianceAuthority.cva(
15460
- // Base classes - flex layout, badge gradient, motion
15461
- `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`,
15462
- {
15463
- variants: {
15464
- size: {
15465
- default: DOMAIN_TOKENS.spacing.button.paddingDefault,
15466
- // Default padding - references semanticSpacing.md (16px) horizontal, xs (4px) vertical via Tailwind
15467
- compact: DOMAIN_TOKENS.spacing.button.paddingCompact
15468
- // Compact padding - references semanticSpacing.sm (8px) horizontal, xs (4px) vertical via Tailwind
15469
- }
15470
- },
15471
- defaultVariants: {
15472
- size: "default"
15473
- }
15474
- }
15475
- );
15476
- var eventCardTicketButtonIconVariants = classVarianceAuthority.cva(
15477
- // Base classes - icon size and spacing
15478
- `${ICON_TOKENS.sizes.md} ${DOMAIN_TOKENS.spacing.button.iconMarginLeft}`,
15479
- {
15480
- variants: {
15481
- size: {
15482
- default: "",
15483
- compact: ""
15484
- }
15485
- },
15486
- defaultVariants: {
15487
- size: "default"
15488
- }
15489
- }
15490
- );
15491
- var eventCardPriceVariants = classVarianceAuthority.cva(
15492
- // Base classes - price gradient text
15493
- `bg-gradient-to-r from-accent-500 to-primary-600 bg-clip-text text-transparent`,
15494
- {
15495
- variants: {
15496
- size: {
15497
- default: TEXT_TOKENS.fontSize.lg,
15498
- // Default size
15499
- compact: TEXT_TOKENS.fontSize.md
15500
- // Compact size
15501
- }
15502
- },
15503
- defaultVariants: {
15504
- size: "default"
15505
- }
15506
- }
15507
- );
15508
- var EventCard = React49__namespace.forwardRef(
16188
+ var CategoryCard = React49__namespace.forwardRef(
15509
16189
  ({
15510
16190
  title,
15511
16191
  description,
15512
- date,
15513
- venueName,
15514
- price,
15515
16192
  imageUrl,
15516
16193
  href,
15517
- ticketUrl,
15518
16194
  featured = false,
15519
16195
  showImage = true,
15520
- getTicketsLabel,
15521
16196
  featuredBadgeText,
15522
16197
  size: size3 = "default",
15523
16198
  variant,
@@ -15540,46 +16215,57 @@ var EventCard = React49__namespace.forwardRef(
15540
16215
  className: cn("group relative", className),
15541
16216
  ...props,
15542
16217
  children: [
15543
- featured && featuredBadgeText && /* @__PURE__ */ jsxRuntime.jsx("div", { className: eventCardBadgeVariants({ size: size3 }), children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: eventCardBadgeSurfaceVariants({ variant: "featured" }), children: featuredBadgeText }) }),
15544
- showImage && /* @__PURE__ */ jsxRuntime.jsx(CardBaseImageWrapper, { size: size3, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative w-full overflow-hidden bg-gradient-to-br from-surface-elevated1 to-surface-elevated2", children: [
15545
- imageUrl ? /* @__PURE__ */ jsxRuntime.jsx(
15546
- "img",
15547
- {
15548
- src: imageUrl,
15549
- alt: title,
15550
- className: cn(
15551
- "h-full w-full object-cover",
15552
- DOMAIN_TOKENS.motion.hover.transition,
15553
- DOMAIN_TOKENS.motion.hover.scale
15554
- )
15555
- }
15556
- ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-full w-full items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(
15557
- Icon2,
15558
- {
15559
- name: "info",
15560
- size: "xl",
15561
- color: "muted",
15562
- className: ICON_TOKENS.sizes["4xl"],
15563
- "aria-hidden": "true"
15564
- }
15565
- ) }),
15566
- /* @__PURE__ */ jsxRuntime.jsx(
15567
- "div",
15568
- {
15569
- className: cn(
15570
- "absolute inset-0 opacity-0 transition-opacity duration-normal group-hover:opacity-100",
15571
- DOMAIN_TOKENS.image.overlay.gradient
16218
+ featured && featuredBadgeText && /* @__PURE__ */ jsxRuntime.jsx("div", { className: categoryCardBadgeVariants({ size: size3 }), children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: categoryCardBadgeSurfaceVariants({ variant: "featured" }), children: featuredBadgeText }) }),
16219
+ showImage && /* @__PURE__ */ jsxRuntime.jsx(CardBaseImageWrapper, { size: size3, children: /* @__PURE__ */ jsxRuntime.jsxs(
16220
+ "div",
16221
+ {
16222
+ className: cn(
16223
+ "relative w-full overflow-hidden",
16224
+ DOMAIN_TOKENS.image.placeholder.gradient
16225
+ ),
16226
+ children: [
16227
+ imageUrl ? /* @__PURE__ */ jsxRuntime.jsx(
16228
+ "img",
16229
+ {
16230
+ src: imageUrl,
16231
+ alt: title,
16232
+ className: cn(
16233
+ "h-full w-full object-cover",
16234
+ DOMAIN_TOKENS.motion.hover.transition,
16235
+ DOMAIN_TOKENS.motion.hover.scale
16236
+ )
16237
+ }
16238
+ ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-full w-full items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(
16239
+ Icon2,
16240
+ {
16241
+ name: "info",
16242
+ className: cn(ICON_TOKENS.sizes["4xl"], ICON_TOKENS.colors.muted),
16243
+ "aria-hidden": "true"
16244
+ }
16245
+ ) }),
16246
+ /* @__PURE__ */ jsxRuntime.jsx(
16247
+ "div",
16248
+ {
16249
+ className: cn(
16250
+ "absolute inset-0 opacity-0 group-hover:opacity-100",
16251
+ MOTION_TOKENS.transition.opacity,
16252
+ MOTION_TOKENS.duration.normal,
16253
+ DOMAIN_TOKENS.image.overlay.gradient
16254
+ )
16255
+ }
15572
16256
  )
15573
- }
15574
- )
15575
- ] }) }),
16257
+ ]
16258
+ }
16259
+ ) }),
15576
16260
  /* @__PURE__ */ jsxRuntime.jsxs(CardBaseContentWrapper, { size: size3, children: [
15577
16261
  /* @__PURE__ */ jsxRuntime.jsx(
15578
16262
  Heading,
15579
16263
  {
15580
16264
  level: 3,
15581
16265
  className: cn(
15582
- "line-clamp-2 transition-colors group-hover:text-primary",
16266
+ DOMAIN_TOKENS.text.lineClamp.two,
16267
+ MOTION_TOKENS.transition.colors,
16268
+ DOMAIN_TOKENS.text.hover.primary,
15583
16269
  TEXT_TOKENS.fontSize.lg,
15584
16270
  TEXT_TOKENS.fontWeight.bold,
15585
16271
  DOMAIN_TOKENS.spacing.section.titleToSubtitle
@@ -15591,47 +16277,21 @@ var EventCard = React49__namespace.forwardRef(
15591
16277
  Text,
15592
16278
  {
15593
16279
  size: "sm",
15594
- muted: true,
16280
+ variant: "muted",
15595
16281
  className: cn(
15596
- "line-clamp-2",
16282
+ DOMAIN_TOKENS.text.lineClamp.two,
15597
16283
  size3 === "compact" ? DOMAIN_TOKENS.spacing.section.titleToSubtitle : DOMAIN_TOKENS.spacing.section.subtitleToMetadata
15598
16284
  ),
15599
16285
  children: description
15600
16286
  }
15601
- ),
15602
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: eventCardMetadataVariants({ size: size3 }), children: [
15603
- date && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: eventCardMetadataItemVariants({ size: size3 }), children: [
15604
- /* @__PURE__ */ jsxRuntime.jsx(IconCalendar, { className: eventCardMetadataIconVariants({ size: size3 }) }),
15605
- /* @__PURE__ */ jsxRuntime.jsx(Text, { size: "xs", muted: true, children: date })
15606
- ] }),
15607
- venueName && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: eventCardMetadataItemVariants({ size: size3 }), children: [
15608
- /* @__PURE__ */ jsxRuntime.jsx(IconLocation, { className: eventCardMetadataIconVariants({ size: size3 }) }),
15609
- /* @__PURE__ */ jsxRuntime.jsx(Text, { size: "xs", muted: true, className: "line-clamp-1", children: venueName })
15610
- ] })
15611
- ] })
15612
- ] }),
15613
- /* @__PURE__ */ jsxRuntime.jsx(CardBaseFooterWrapper, { size: size3, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("w-full", eventCardFooterVariants({ size: size3 })), children: [
15614
- ticketUrl && /* @__PURE__ */ jsxRuntime.jsxs(
15615
- Link,
15616
- {
15617
- href: ticketUrl,
15618
- className: cn("w-full", eventCardTicketButtonVariants({ size: size3 })),
15619
- target: "_blank",
15620
- rel: "noopener noreferrer",
15621
- children: [
15622
- getTicketsLabel,
15623
- /* @__PURE__ */ jsxRuntime.jsx(IconArrowRight, { className: eventCardTicketButtonIconVariants({ size: size3 }) })
15624
- ]
15625
- }
15626
- ),
15627
- !ticketUrl && price && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-right", children: /* @__PURE__ */ jsxRuntime.jsx(Text, { size: size3 === "compact" ? "md" : "lg", weight: "bold", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: eventCardPriceVariants({ size: size3 }), children: price }) }) })
15628
- ] }) })
16287
+ )
16288
+ ] })
15629
16289
  ]
15630
16290
  }
15631
16291
  ) });
15632
16292
  }
15633
16293
  );
15634
- EventCard.displayName = "EventCard";
16294
+ CategoryCard.displayName = "CategoryCard";
15635
16295
  var promoCardBadgeVariants = classVarianceAuthority.cva(
15636
16296
  // Base classes - absolute positioning, z-index
15637
16297
  "absolute z-10",
@@ -15665,14 +16325,14 @@ var promoCardBadgeSurfaceVariants = classVarianceAuthority.cva(
15665
16325
  }
15666
16326
  );
15667
16327
  var promoCardCtaButtonVariants = classVarianceAuthority.cva(
15668
- // Base classes - flex layout, button tokens, motion
15669
- `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`,
16328
+ // Base classes - flex layout, CTA button tokens, motion
16329
+ `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`,
15670
16330
  {
15671
16331
  variants: {
15672
16332
  size: {
15673
- default: `${BUTTON_TOKENS.height.md} ${BUTTON_TOKENS.padding.horizontal.md} ${BUTTON_TOKENS.padding.vertical.sm} ${BUTTON_TOKENS.fontSize.md}`,
16333
+ 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}`,
15674
16334
  // Default size - uses md height and padding
15675
- compact: `${BUTTON_TOKENS.height.sm} ${BUTTON_TOKENS.padding.horizontal.sm} ${BUTTON_TOKENS.padding.vertical.sm} ${BUTTON_TOKENS.fontSize.sm}`
16335
+ 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}`
15676
16336
  // Compact size - uses sm height and padding
15677
16337
  }
15678
16338
  },
@@ -15804,6 +16464,22 @@ var PromoCard = React49__namespace.forwardRef(
15804
16464
  }
15805
16465
  );
15806
16466
  PromoCard.displayName = "PromoCard";
16467
+ var ticketCardVariants = classVarianceAuthority.cva("group relative", {
16468
+ variants: {
16469
+ size: {
16470
+ default: "",
16471
+ compact: ""
16472
+ },
16473
+ variant: {
16474
+ default: "",
16475
+ featured: ""
16476
+ }
16477
+ },
16478
+ defaultVariants: {
16479
+ size: "default",
16480
+ variant: "default"
16481
+ }
16482
+ });
15807
16483
  var ticketCardBadgeVariants = classVarianceAuthority.cva(
15808
16484
  // Base classes - absolute positioning, z-index
15809
16485
  "absolute z-10",
@@ -15811,7 +16487,7 @@ var ticketCardBadgeVariants = classVarianceAuthority.cva(
15811
16487
  variants: {
15812
16488
  size: {
15813
16489
  default: DOMAIN_TOKENS.badges.position.default,
15814
- // Default positioning - maps to semanticSpacing.md (12px)
16490
+ // Default positioning - maps to semanticSpacing.md (16px)
15815
16491
  compact: DOMAIN_TOKENS.badges.position.compact
15816
16492
  // Compact positioning - maps to semanticSpacing.sm (8px)
15817
16493
  }
@@ -15823,7 +16499,7 @@ var ticketCardBadgeVariants = classVarianceAuthority.cva(
15823
16499
  );
15824
16500
  var ticketCardBadgeSurfaceVariants = classVarianceAuthority.cva(
15825
16501
  // Base classes - flex layout, items center, badge styling
15826
- `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`,
16502
+ `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}`,
15827
16503
  {
15828
16504
  variants: {
15829
16505
  variant: {
@@ -15840,6 +16516,45 @@ var ticketCardBadgeSurfaceVariants = classVarianceAuthority.cva(
15840
16516
  }
15841
16517
  }
15842
16518
  );
16519
+ var ticketCardTitleVariants = classVarianceAuthority.cva(
16520
+ `${TEXT_TOKENS.fontSize.lg} ${TEXT_TOKENS.fontWeight.bold} ${MOTION_TOKENS.transition.colors} ${DOMAIN_TOKENS.text.hover.primary} ${DOMAIN_TOKENS.text.lineClamp.two}`,
16521
+ {
16522
+ variants: {
16523
+ size: {
16524
+ default: DOMAIN_TOKENS.spacing.section.subtitleToMetadata,
16525
+ compact: DOMAIN_TOKENS.spacing.section.titleToSubtitle
16526
+ }
16527
+ },
16528
+ defaultVariants: {
16529
+ size: "default"
16530
+ }
16531
+ }
16532
+ );
16533
+ var ticketCardDateVariants = classVarianceAuthority.cva(
16534
+ `${DOMAIN_TOKENS.metadata.text.secondary} ${TEXT_TOKENS.fontSize.sm} ${MOTION_TOKENS.transition.colors}`,
16535
+ {
16536
+ variants: {
16537
+ size: {
16538
+ default: DOMAIN_TOKENS.spacing.section.titleToSubtitle,
16539
+ compact: `${DOMAIN_TOKENS.spacing.section.titleToSubtitle} ${TEXT_TOKENS.fontSize.xs}`
16540
+ }
16541
+ },
16542
+ defaultVariants: {
16543
+ size: "default"
16544
+ }
16545
+ }
16546
+ );
16547
+ var ticketCardDescriptionVariants = classVarianceAuthority.cva(`${DOMAIN_TOKENS.text.lineClamp.two}`, {
16548
+ variants: {
16549
+ size: {
16550
+ default: DOMAIN_TOKENS.spacing.section.subtitleToMetadata,
16551
+ compact: DOMAIN_TOKENS.spacing.section.titleToSubtitle
16552
+ }
16553
+ },
16554
+ defaultVariants: {
16555
+ size: "default"
16556
+ }
16557
+ });
15843
16558
  var ticketCardPriceCapacityContainerVariants = classVarianceAuthority.cva(
15844
16559
  // Base classes - flex layout, price/capacity spacing
15845
16560
  `flex items-center ${DOMAIN_TOKENS.priceCapacity.spacing}`,
@@ -15857,7 +16572,7 @@ var ticketCardPriceCapacityContainerVariants = classVarianceAuthority.cva(
15857
16572
  );
15858
16573
  var ticketCardPriceVariants = classVarianceAuthority.cva(
15859
16574
  // Base classes - price text color
15860
- `${DOMAIN_TOKENS.priceCapacity.text.primary} font-bold`,
16575
+ `${DOMAIN_TOKENS.priceCapacity.text.primary} ${TEXT_TOKENS.fontWeight.bold}`,
15861
16576
  {
15862
16577
  variants: {
15863
16578
  size: {
@@ -15891,7 +16606,7 @@ var ticketCardCapacityVariants = classVarianceAuthority.cva(
15891
16606
  );
15892
16607
  var ticketCardAvailabilityVariants = classVarianceAuthority.cva(
15893
16608
  // Base classes - availability indicator styling
15894
- `inline-flex items-center ${DOMAIN_TOKENS.metadata.spacing.horizontal} ${TEXT_TOKENS.fontSize.xs} font-medium`,
16609
+ `inline-flex items-center ${DOMAIN_TOKENS.metadata.spacing.horizontal} ${TEXT_TOKENS.fontSize.xs} ${TEXT_TOKENS.fontWeight.medium}`,
15895
16610
  {
15896
16611
  variants: {
15897
16612
  availability: {
@@ -15924,7 +16639,7 @@ var ticketCardFooterVariants = classVarianceAuthority.cva(
15924
16639
  );
15925
16640
  var ticketCardPurchaseButtonVariants = classVarianceAuthority.cva(
15926
16641
  // Base classes - flex layout, badge gradient, motion
15927
- `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`,
16642
+ `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`,
15928
16643
  {
15929
16644
  variants: {
15930
16645
  size: {
@@ -15959,9 +16674,38 @@ var ticketCardPurchaseButtonIconVariants = classVarianceAuthority.cva(
15959
16674
  }
15960
16675
  }
15961
16676
  );
16677
+ var ticketCardImageOverlayVariants = classVarianceAuthority.cva(
16678
+ `absolute inset-0 ${DOMAIN_TOKENS.image.overlay.gradient} opacity-0 ${MOTION_TOKENS.transition.opacity} ${MOTION_TOKENS.duration.normal} group-hover:opacity-100`,
16679
+ {
16680
+ variants: {
16681
+ size: {
16682
+ default: "",
16683
+ compact: ""
16684
+ }
16685
+ },
16686
+ defaultVariants: {
16687
+ size: "default"
16688
+ }
16689
+ }
16690
+ );
16691
+ var ticketCardImageTransformVariants = classVarianceAuthority.cva(
16692
+ `object-cover ${MOTION_TOKENS.transition.transform} ${MOTION_TOKENS.duration.slow} ${DOMAIN_TOKENS.motion.hover.scale}`,
16693
+ {
16694
+ variants: {
16695
+ size: {
16696
+ default: "",
16697
+ compact: ""
16698
+ }
16699
+ },
16700
+ defaultVariants: {
16701
+ size: "default"
16702
+ }
16703
+ }
16704
+ );
15962
16705
  var TicketCard = React49__namespace.forwardRef(
15963
16706
  ({
15964
16707
  title,
16708
+ date,
15965
16709
  description,
15966
16710
  price,
15967
16711
  capacity,
@@ -16008,57 +16752,368 @@ var TicketCard = React49__namespace.forwardRef(
16008
16752
  }
16009
16753
  };
16010
16754
  const availabilityLabel = getAvailabilityLabel();
16755
+ const formattedDate = date ? formatDate(date) : null;
16756
+ const dateTimeValue = (() => {
16757
+ if (!date) return null;
16758
+ if (typeof date === "string") {
16759
+ return new Date(date).toISOString();
16760
+ }
16761
+ if (date instanceof Date) {
16762
+ return date.toISOString();
16763
+ }
16764
+ return new Date(date).toISOString();
16765
+ })();
16011
16766
  return /* @__PURE__ */ jsxRuntime.jsx(Box, { ...animationProps, children: /* @__PURE__ */ jsxRuntime.jsxs(
16012
16767
  CardBase,
16013
16768
  {
16014
16769
  ref,
16015
16770
  size: size3,
16016
16771
  variant: cardVariant,
16017
- className: cn("group relative", className),
16772
+ className: cn(ticketCardVariants({ size: size3, variant: cardVariant }), className),
16018
16773
  ...props,
16019
16774
  children: [
16020
16775
  featured && featuredBadgeText && /* @__PURE__ */ jsxRuntime.jsx("div", { className: ticketCardBadgeVariants({ size: size3 }), children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: ticketCardBadgeSurfaceVariants({ variant: "featured" }), children: featuredBadgeText }) }),
16021
16776
  vipBadgeText && /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn(ticketCardBadgeVariants({ size: size3 }), getVipBadgePosition()), children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: ticketCardBadgeSurfaceVariants({ variant: "vip" }), children: vipBadgeText }) }),
16022
16777
  discountBadgeText && /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn(ticketCardBadgeVariants({ size: size3 }), getDiscountBadgePosition()), children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: ticketCardBadgeSurfaceVariants({ variant: "discount" }), children: discountBadgeText }) }),
16023
- showImage && /* @__PURE__ */ jsxRuntime.jsx(CardBaseImageWrapper, { size: size3, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative w-full overflow-hidden bg-gradient-to-br from-surface-elevated1 to-surface-elevated2", children: [
16024
- imageUrl ? /* @__PURE__ */ jsxRuntime.jsx(
16025
- "img",
16026
- {
16027
- src: imageUrl,
16028
- alt: title,
16029
- className: cn(
16030
- "h-full w-full object-cover",
16031
- DOMAIN_TOKENS.motion.hover.transition,
16032
- DOMAIN_TOKENS.motion.hover.scale
16033
- )
16034
- }
16035
- ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-full w-full items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(
16036
- Icon2,
16778
+ showImage && /* @__PURE__ */ jsxRuntime.jsx(CardBaseImageWrapper, { size: size3, children: /* @__PURE__ */ jsxRuntime.jsxs(
16779
+ "div",
16780
+ {
16781
+ className: cn(
16782
+ "relative w-full overflow-hidden",
16783
+ DOMAIN_TOKENS.image.placeholder.gradient
16784
+ ),
16785
+ children: [
16786
+ imageUrl ? /* @__PURE__ */ jsxRuntime.jsx(
16787
+ "img",
16788
+ {
16789
+ src: imageUrl,
16790
+ alt: title,
16791
+ className: cn("h-full w-full", ticketCardImageTransformVariants({ size: size3 }))
16792
+ }
16793
+ ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-full w-full items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(
16794
+ Icon2,
16795
+ {
16796
+ name: "info",
16797
+ size: "xl",
16798
+ color: "muted",
16799
+ className: ICON_TOKENS.sizes["4xl"],
16800
+ "aria-hidden": "true"
16801
+ }
16802
+ ) }),
16803
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: ticketCardImageOverlayVariants({ size: size3 }) })
16804
+ ]
16805
+ }
16806
+ ) }),
16807
+ /* @__PURE__ */ jsxRuntime.jsxs(CardBaseContentWrapper, { size: size3, children: [
16808
+ /* @__PURE__ */ jsxRuntime.jsx(Heading, { level: 3, className: ticketCardTitleVariants({ size: size3 }), children: href ? /* @__PURE__ */ jsxRuntime.jsx(Link, { href, variant: "ghost", children: title }) : title }),
16809
+ formattedDate && dateTimeValue && /* @__PURE__ */ jsxRuntime.jsx("time", { dateTime: dateTimeValue, className: ticketCardDateVariants({ size: size3 }), children: formattedDate }),
16810
+ description && /* @__PURE__ */ jsxRuntime.jsx(Text, { size: "sm", variant: "muted", className: ticketCardDescriptionVariants({ size: size3 }), children: description }),
16811
+ (price || capacity) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: ticketCardPriceCapacityContainerVariants({ size: size3 }), children: [
16812
+ price && /* @__PURE__ */ jsxRuntime.jsx(
16813
+ Text,
16814
+ {
16815
+ size: size3 === "compact" ? "md" : "lg",
16816
+ weight: "bold",
16817
+ className: ticketCardPriceVariants({ size: size3 }),
16818
+ children: price
16819
+ }
16820
+ ),
16821
+ capacity && /* @__PURE__ */ jsxRuntime.jsx(
16822
+ Text,
16823
+ {
16824
+ size: size3 === "compact" ? "xs" : "sm",
16825
+ variant: "muted",
16826
+ className: ticketCardCapacityVariants({ size: size3 }),
16827
+ children: capacity
16828
+ }
16829
+ )
16830
+ ] }),
16831
+ availabilityLabel && /* @__PURE__ */ jsxRuntime.jsx("div", { className: ticketCardAvailabilityVariants({ availability }), children: /* @__PURE__ */ jsxRuntime.jsx(Text, { size: "xs", variant: availability === "sold_out" ? "muted" : "primary", children: availabilityLabel }) })
16832
+ ] }),
16833
+ /* @__PURE__ */ jsxRuntime.jsx(CardBaseFooterWrapper, { size: size3, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("w-full", ticketCardFooterVariants({ size: size3 })), children: [
16834
+ purchaseUrl && !isPurchaseDisabled && /* @__PURE__ */ jsxRuntime.jsxs(
16835
+ Link,
16037
16836
  {
16038
- name: "info",
16039
- size: "xl",
16040
- color: "muted",
16041
- className: ICON_TOKENS.sizes["4xl"],
16042
- "aria-hidden": "true"
16837
+ href: purchaseUrl,
16838
+ className: cn(
16839
+ "w-full",
16840
+ ticketCardPurchaseButtonVariants({ size: size3, disabled: false })
16841
+ ),
16842
+ target: "_blank",
16843
+ rel: "noopener noreferrer",
16844
+ children: [
16845
+ purchaseLabel,
16846
+ /* @__PURE__ */ jsxRuntime.jsx(IconArrowRight, { className: ticketCardPurchaseButtonIconVariants({ size: size3 }) })
16847
+ ]
16043
16848
  }
16044
- ) }),
16045
- /* @__PURE__ */ jsxRuntime.jsx(
16849
+ ),
16850
+ (!purchaseUrl || isPurchaseDisabled) && /* @__PURE__ */ jsxRuntime.jsxs(
16046
16851
  "div",
16047
16852
  {
16048
16853
  className: cn(
16049
- "absolute inset-0 opacity-0 transition-opacity duration-normal group-hover:opacity-100",
16050
- DOMAIN_TOKENS.image.overlay.gradient
16051
- )
16854
+ "w-full",
16855
+ ticketCardPurchaseButtonVariants({ size: size3, disabled: isPurchaseDisabled })
16856
+ ),
16857
+ children: [
16858
+ purchaseLabel,
16859
+ /* @__PURE__ */ jsxRuntime.jsx(IconArrowRight, { className: ticketCardPurchaseButtonIconVariants({ size: size3 }) })
16860
+ ]
16052
16861
  }
16053
16862
  )
16054
- ] }) }),
16863
+ ] }) })
16864
+ ]
16865
+ }
16866
+ ) });
16867
+ }
16868
+ );
16869
+ TicketCard.displayName = "TicketCard";
16870
+ var eventCardVariants = classVarianceAuthority.cva(
16871
+ // Base classes - surface, border, radius, shadow, motion from tokens
16872
+ `${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`,
16873
+ {
16874
+ variants: {
16875
+ size: {
16876
+ default: `${CARD_TOKENS.size.md.padding} ${DOMAIN_TOKENS.layout.gap.default}`,
16877
+ compact: `${CARD_TOKENS.size.sm.padding} ${DOMAIN_TOKENS.layout.gap.compact}`
16878
+ },
16879
+ layout: {
16880
+ vertical: "flex flex-col"
16881
+ },
16882
+ variant: {
16883
+ default: "",
16884
+ featured: `${DOMAIN_TOKENS.badges.surface.featured}`
16885
+ }
16886
+ },
16887
+ defaultVariants: {
16888
+ size: "default",
16889
+ layout: "vertical",
16890
+ variant: "default"
16891
+ }
16892
+ }
16893
+ );
16894
+ var eventCardBadgeVariants = classVarianceAuthority.cva(
16895
+ // Base classes - absolute positioning, z-index
16896
+ "absolute z-10",
16897
+ {
16898
+ variants: {
16899
+ size: {
16900
+ default: DOMAIN_TOKENS.badges.position.default,
16901
+ compact: DOMAIN_TOKENS.badges.position.compact
16902
+ }
16903
+ },
16904
+ defaultVariants: {
16905
+ size: "default"
16906
+ }
16907
+ }
16908
+ );
16909
+ var eventCardBadgeSurfaceVariants = classVarianceAuthority.cva(
16910
+ // Base classes - flex layout, items center, badge styling from tokens
16911
+ `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}`,
16912
+ {
16913
+ variants: {
16914
+ variant: {
16915
+ default: DOMAIN_TOKENS.badges.surface.default,
16916
+ featured: DOMAIN_TOKENS.badges.surface.featured
16917
+ }
16918
+ },
16919
+ defaultVariants: {
16920
+ variant: "featured"
16921
+ }
16922
+ }
16923
+ );
16924
+ var eventCardMetadataVariants = classVarianceAuthority.cva(
16925
+ // Base classes - flex column, metadata spacing from tokens
16926
+ `flex flex-col ${DOMAIN_TOKENS.metadata.spacing.vertical}`,
16927
+ {
16928
+ variants: {
16929
+ size: {
16930
+ default: "",
16931
+ compact: ""
16932
+ }
16933
+ },
16934
+ defaultVariants: {
16935
+ size: "default"
16936
+ }
16937
+ }
16938
+ );
16939
+ var eventCardMetadataItemVariants = classVarianceAuthority.cva(
16940
+ // Base classes - flex items center, metadata spacing and text from tokens
16941
+ `flex items-center ${DOMAIN_TOKENS.metadata.spacing.horizontal} ${DOMAIN_TOKENS.metadata.text.secondary} ${TEXT_TOKENS.fontSize.xs}`,
16942
+ {
16943
+ variants: {
16944
+ size: {
16945
+ default: "",
16946
+ compact: ""
16947
+ }
16948
+ },
16949
+ defaultVariants: {
16950
+ size: "default"
16951
+ }
16952
+ }
16953
+ );
16954
+ var eventCardMetadataIconVariants = classVarianceAuthority.cva(
16955
+ // Base classes - icon size and color from tokens
16956
+ `${DOMAIN_TOKENS.metadata.icon.sizeSm} ${DOMAIN_TOKENS.metadata.icon.default}`,
16957
+ {
16958
+ variants: {
16959
+ size: {
16960
+ default: "",
16961
+ compact: ""
16962
+ }
16963
+ },
16964
+ defaultVariants: {
16965
+ size: "default"
16966
+ }
16967
+ }
16968
+ );
16969
+ var eventCardFooterVariants = classVarianceAuthority.cva(
16970
+ // Base classes - border top, spacing from tokens
16971
+ "border-t border-border",
16972
+ {
16973
+ variants: {
16974
+ size: {
16975
+ default: DOMAIN_TOKENS.spacing.footer.paddingTopDefault,
16976
+ compact: DOMAIN_TOKENS.spacing.footer.paddingTopCompact
16977
+ }
16978
+ },
16979
+ defaultVariants: {
16980
+ size: "default"
16981
+ }
16982
+ }
16983
+ );
16984
+ var eventCardTicketButtonVariants = classVarianceAuthority.cva(
16985
+ // Base classes - flex layout, badge gradient, motion from tokens
16986
+ `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`,
16987
+ {
16988
+ variants: {
16989
+ size: {
16990
+ default: DOMAIN_TOKENS.spacing.button.paddingDefault,
16991
+ compact: DOMAIN_TOKENS.spacing.button.paddingCompact
16992
+ }
16993
+ },
16994
+ defaultVariants: {
16995
+ size: "default"
16996
+ }
16997
+ }
16998
+ );
16999
+ var eventCardTicketButtonIconVariants = classVarianceAuthority.cva(
17000
+ // Base classes - icon size and spacing from tokens
17001
+ `${DOMAIN_TOKENS.metadata.icon.sizeSm} ${DOMAIN_TOKENS.spacing.button.iconMarginLeft}`,
17002
+ {
17003
+ variants: {
17004
+ size: {
17005
+ default: "",
17006
+ compact: ""
17007
+ }
17008
+ },
17009
+ defaultVariants: {
17010
+ size: "default"
17011
+ }
17012
+ }
17013
+ );
17014
+ var eventCardPriceVariants = classVarianceAuthority.cva(
17015
+ // Base classes - price gradient text from tokens
17016
+ `bg-gradient-to-r from-accent-500 to-primary-600 bg-clip-text text-transparent`,
17017
+ {
17018
+ variants: {
17019
+ size: {
17020
+ default: TEXT_TOKENS.fontSize.lg,
17021
+ compact: TEXT_TOKENS.fontSize.md
17022
+ }
17023
+ },
17024
+ defaultVariants: {
17025
+ size: "default"
17026
+ }
17027
+ }
17028
+ );
17029
+ var EventCard = React49__namespace.forwardRef(
17030
+ ({
17031
+ title,
17032
+ description,
17033
+ date,
17034
+ venueName,
17035
+ price,
17036
+ imageUrl,
17037
+ href,
17038
+ ticketUrl,
17039
+ featured = false,
17040
+ showImage = true,
17041
+ getTicketsLabel,
17042
+ featuredBadgeText,
17043
+ size: size3 = "default",
17044
+ layout = "vertical",
17045
+ variant,
17046
+ className,
17047
+ animation,
17048
+ ...props
17049
+ }, ref) => {
17050
+ const animationProps = resolveComponentAnimations({
17051
+ animation: animation?.animation || "fadeInUp",
17052
+ hoverAnimation: animation?.hoverAnimation || "hoverLift",
17053
+ animationProps: animation?.animationProps
17054
+ });
17055
+ const cardVariant = variant || (featured ? "featured" : "default");
17056
+ return /* @__PURE__ */ jsxRuntime.jsx(Box, { ...animationProps, children: /* @__PURE__ */ jsxRuntime.jsxs(
17057
+ CardBase,
17058
+ {
17059
+ ref,
17060
+ size: size3,
17061
+ variant: cardVariant,
17062
+ className: cn(
17063
+ eventCardVariants({ size: size3, layout, variant: cardVariant }),
17064
+ "group relative",
17065
+ className
17066
+ ),
17067
+ ...props,
17068
+ children: [
17069
+ featured && featuredBadgeText && /* @__PURE__ */ jsxRuntime.jsx("div", { className: eventCardBadgeVariants({ size: size3 }), children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: eventCardBadgeSurfaceVariants({ variant: "featured" }), children: featuredBadgeText }) }),
17070
+ showImage && /* @__PURE__ */ jsxRuntime.jsx(CardBaseImageWrapper, { size: size3, children: /* @__PURE__ */ jsxRuntime.jsxs(
17071
+ "div",
17072
+ {
17073
+ className: cn("relative w-full overflow-hidden", DOMAIN_TOKENS.surface.bg.default),
17074
+ children: [
17075
+ imageUrl ? /* @__PURE__ */ jsxRuntime.jsx(
17076
+ "img",
17077
+ {
17078
+ src: imageUrl,
17079
+ alt: title,
17080
+ className: cn(
17081
+ "h-full w-full object-cover",
17082
+ DOMAIN_TOKENS.motion.hover.transition,
17083
+ DOMAIN_TOKENS.motion.hover.scale
17084
+ )
17085
+ }
17086
+ ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-full w-full items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(
17087
+ Icon2,
17088
+ {
17089
+ name: "info",
17090
+ size: "xl",
17091
+ color: "muted",
17092
+ className: ICON_TOKENS.sizes["4xl"],
17093
+ "aria-hidden": "true"
17094
+ }
17095
+ ) }),
17096
+ /* @__PURE__ */ jsxRuntime.jsx(
17097
+ "div",
17098
+ {
17099
+ className: cn(
17100
+ "absolute inset-0 opacity-0 group-hover:opacity-100",
17101
+ DOMAIN_TOKENS.motion.hover.transition,
17102
+ DOMAIN_TOKENS.image.overlay.gradient
17103
+ )
17104
+ }
17105
+ )
17106
+ ]
17107
+ }
17108
+ ) }),
16055
17109
  /* @__PURE__ */ jsxRuntime.jsxs(CardBaseContentWrapper, { size: size3, children: [
16056
17110
  /* @__PURE__ */ jsxRuntime.jsx(
16057
17111
  Heading,
16058
17112
  {
16059
17113
  level: 3,
16060
17114
  className: cn(
16061
- "line-clamp-2 transition-colors group-hover:text-primary",
17115
+ "line-clamp-2 group-hover:text-primary",
17116
+ DOMAIN_TOKENS.motion.hover.transition,
16062
17117
  TEXT_TOKENS.fontSize.lg,
16063
17118
  TEXT_TOKENS.fontWeight.bold,
16064
17119
  DOMAIN_TOKENS.spacing.section.titleToSubtitle
@@ -16070,7 +17125,7 @@ var TicketCard = React49__namespace.forwardRef(
16070
17125
  Text,
16071
17126
  {
16072
17127
  size: "sm",
16073
- variant: "muted",
17128
+ muted: true,
16074
17129
  className: cn(
16075
17130
  "line-clamp-2",
16076
17131
  size3 === "compact" ? DOMAIN_TOKENS.spacing.section.titleToSubtitle : DOMAIN_TOKENS.spacing.section.subtitleToMetadata
@@ -16078,49 +17133,57 @@ var TicketCard = React49__namespace.forwardRef(
16078
17133
  children: description
16079
17134
  }
16080
17135
  ),
16081
- (price || capacity) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: ticketCardPriceCapacityContainerVariants({ size: size3 }), children: [
16082
- price && /* @__PURE__ */ jsxRuntime.jsx(Text, { size: size3 === "compact" ? "md" : "lg", weight: "bold", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: ticketCardPriceVariants({ size: size3 }), children: price }) }),
16083
- capacity && /* @__PURE__ */ jsxRuntime.jsx(Text, { size: size3 === "compact" ? "xs" : "sm", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: ticketCardCapacityVariants({ size: size3 }), children: capacity }) })
16084
- ] }),
16085
- availabilityLabel && /* @__PURE__ */ jsxRuntime.jsx("div", { className: ticketCardAvailabilityVariants({ availability }), children: /* @__PURE__ */ jsxRuntime.jsx(Text, { size: "xs", variant: availability === "sold_out" ? "muted" : "primary", children: availabilityLabel }) })
17136
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: eventCardMetadataVariants({ size: size3 }), children: [
17137
+ date && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: eventCardMetadataItemVariants({ size: size3 }), role: "text", children: [
17138
+ /* @__PURE__ */ jsxRuntime.jsx(
17139
+ IconCalendar,
17140
+ {
17141
+ className: eventCardMetadataIconVariants({ size: size3 }),
17142
+ "aria-hidden": true
17143
+ }
17144
+ ),
17145
+ /* @__PURE__ */ jsxRuntime.jsx(Text, { size: "xs", muted: true, children: /* @__PURE__ */ jsxRuntime.jsx("time", { dateTime: date, children: date }) })
17146
+ ] }),
17147
+ venueName && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: eventCardMetadataItemVariants({ size: size3 }), role: "text", children: [
17148
+ /* @__PURE__ */ jsxRuntime.jsx(
17149
+ IconLocation,
17150
+ {
17151
+ className: eventCardMetadataIconVariants({ size: size3 }),
17152
+ "aria-hidden": true
17153
+ }
17154
+ ),
17155
+ /* @__PURE__ */ jsxRuntime.jsx(Text, { size: "xs", muted: true, className: "line-clamp-1", children: /* @__PURE__ */ jsxRuntime.jsx("address", { children: venueName }) })
17156
+ ] })
17157
+ ] })
16086
17158
  ] }),
16087
- /* @__PURE__ */ jsxRuntime.jsx(CardBaseFooterWrapper, { size: size3, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("w-full", ticketCardFooterVariants({ size: size3 })), children: [
16088
- purchaseUrl && !isPurchaseDisabled && /* @__PURE__ */ jsxRuntime.jsxs(
17159
+ /* @__PURE__ */ jsxRuntime.jsx(CardBaseFooterWrapper, { size: size3, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("w-full", eventCardFooterVariants({ size: size3 })), children: [
17160
+ ticketUrl && /* @__PURE__ */ jsxRuntime.jsxs(
16089
17161
  Link,
16090
17162
  {
16091
- href: purchaseUrl,
16092
- className: cn(
16093
- "w-full",
16094
- ticketCardPurchaseButtonVariants({ size: size3, disabled: false })
16095
- ),
17163
+ href: ticketUrl,
17164
+ className: cn("w-full", eventCardTicketButtonVariants({ size: size3 })),
16096
17165
  target: "_blank",
16097
17166
  rel: "noopener noreferrer",
16098
17167
  children: [
16099
- purchaseLabel,
16100
- /* @__PURE__ */ jsxRuntime.jsx(IconArrowRight, { className: ticketCardPurchaseButtonIconVariants({ size: size3 }) })
17168
+ getTicketsLabel,
17169
+ /* @__PURE__ */ jsxRuntime.jsx(
17170
+ IconArrowRight,
17171
+ {
17172
+ className: eventCardTicketButtonIconVariants({ size: size3 }),
17173
+ "aria-hidden": true
17174
+ }
17175
+ )
16101
17176
  ]
16102
17177
  }
16103
17178
  ),
16104
- (!purchaseUrl || isPurchaseDisabled) && /* @__PURE__ */ jsxRuntime.jsxs(
16105
- "div",
16106
- {
16107
- className: cn(
16108
- "w-full",
16109
- ticketCardPurchaseButtonVariants({ size: size3, disabled: isPurchaseDisabled })
16110
- ),
16111
- children: [
16112
- purchaseLabel,
16113
- /* @__PURE__ */ jsxRuntime.jsx(IconArrowRight, { className: ticketCardPurchaseButtonIconVariants({ size: size3 }) })
16114
- ]
16115
- }
16116
- )
17179
+ !ticketUrl && price && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-right", children: /* @__PURE__ */ jsxRuntime.jsx(Text, { size: size3 === "compact" ? "md" : "lg", weight: "bold", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: eventCardPriceVariants({ size: size3 }), children: price }) }) })
16117
17180
  ] }) })
16118
17181
  ]
16119
17182
  }
16120
17183
  ) });
16121
17184
  }
16122
17185
  );
16123
- TicketCard.displayName = "TicketCard";
17186
+ EventCard.displayName = "EventCard";
16124
17187
 
16125
17188
  exports.ALERT_TOKENS = ALERT_TOKENS;
16126
17189
  exports.Alert = Alert;
@@ -16138,6 +17201,7 @@ exports.Card = Card;
16138
17201
  exports.CardBody = CardBody;
16139
17202
  exports.CardFooter = CardFooter;
16140
17203
  exports.CardHeader = CardHeader;
17204
+ exports.CategoryCard = CategoryCard;
16141
17205
  exports.Checkbox = Checkbox;
16142
17206
  exports.Code = Code;
16143
17207
  exports.Column = Column;