@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.
@@ -7,13 +7,18 @@ var primaryColors = {
7
7
  100: "210 40% 96%",
8
8
  200: "217 32.6% 17.5%",
9
9
  300: "216 28% 26%",
10
- 400: "215 25% 27%",
11
- 500: "215 20% 35%",
12
- // Base primary
13
- 600: "215 16% 47%",
14
- 700: "216 12% 54%",
15
- 800: "217 10% 62%",
16
- 900: "222 47.4% 11.2%",
10
+ 400: "215 25% 30%",
11
+ // Adjusted for better progression
12
+ 500: "215 20% 38%",
13
+ // Adjusted for better progression
14
+ 600: "215 16% 45%",
15
+ // Adjusted for better progression
16
+ 700: "216 12% 35%",
17
+ // Rebalanced for semantic strength (L* ~35)
18
+ 800: "217 10% 28%",
19
+ // Adjusted for proper progression
20
+ 900: "222 47.4% 18%",
21
+ // Adjusted for better progression
17
22
  950: "222 84% 4.9%"
18
23
  // Darkest blue
19
24
  };
@@ -23,12 +28,15 @@ var accentColors = {
23
28
  200: "280 60% 85%",
24
29
  300: "280 55% 75%",
25
30
  400: "280 50% 65%",
26
- 500: "280 70% 67%",
27
- // Base accent (night mode primary)
28
- 600: "259 65% 58%",
29
- 700: "259 60% 50%",
30
- 800: "259 55% 45%",
31
- 900: "259 50% 40%",
31
+ 500: "280 65% 72%",
32
+ // Adjusted for WCAG AA contrast (4.5:1) with dark text in night mode
33
+ 600: "259 65% 59%",
34
+ // Default accent - lightened for better contrast vs secondary (L* ~59, was 52, 15 delta from secondary-600)
35
+ 700: "259 60% 44%",
36
+ // Active state - rebalanced for semantic strength (L* ~44, 12 delta from secondary-700)
37
+ 800: "259 55% 38%",
38
+ // Adjusted for proper progression
39
+ 900: "259 50% 32%",
32
40
  950: "259 45% 30%"
33
41
  };
34
42
  var secondaryColors = {
@@ -37,12 +45,15 @@ var secondaryColors = {
37
45
  200: "173 100% 85%",
38
46
  300: "173 100% 70%",
39
47
  400: "173 100% 55%",
40
- 500: "173 100% 37%",
41
- // Base secondary (Tenerife #00bfa6)
42
- 600: "173 100% 32%",
43
- 700: "173 95% 27%",
48
+ 500: "173 100% 45%",
49
+ // Adjusted for better scale progression
50
+ 600: "173 100% 44%",
51
+ // Default secondary - rebalanced for better contrast vs primary (L* ~44, was 38)
52
+ 700: "173 95% 32%",
53
+ // Active state - rebalanced for semantic strength (L* ~32)
44
54
  800: "173 90% 22%",
45
- 900: "173 85% 17%",
55
+ // Primary variant - darkened for dominance (L* ~22, was 26)
56
+ 900: "173 85% 20%",
46
57
  950: "173 80% 12%"
47
58
  };
48
59
  var surfaceColors = {
@@ -135,13 +146,13 @@ var chartColors = {
135
146
  var textColors = {
136
147
  day: {
137
148
  primary: "0 0% 9%",
138
- // Almost black
149
+ // Almost black (neutral-900 equivalent)
139
150
  secondary: "0 0% 45%",
140
151
  // Medium gray
141
152
  tertiary: "0 0% 65%",
142
153
  // Light gray
143
- muted: "0 0% 38%",
144
- // Muted gray with stronger contrast
154
+ muted: "0 0% 42%",
155
+ // Muted gray - adjusted for WCAG AA contrast (4.5:1) on surface.elevated2
145
156
  inverse: "0 0% 100%"
146
157
  // White (for dark backgrounds)
147
158
  },
@@ -453,6 +464,139 @@ var ALERT_TOKENS = {
453
464
  }
454
465
  };
455
466
 
467
+ // src/tokens/components/motion.ts
468
+ var MOTION_TOKENS = {
469
+ /**
470
+ * Transition property tokens
471
+ * Maps to Tailwind transition utilities
472
+ */
473
+ transition: {
474
+ all: "transition-all",
475
+ // All properties
476
+ colors: "transition-colors",
477
+ // Color properties only
478
+ opacity: "transition-opacity",
479
+ // Opacity only
480
+ transform: "transition-transform",
481
+ // Transform only
482
+ shadow: "transition-shadow",
483
+ // Box shadow only
484
+ none: "transition-none"
485
+ // No transition
486
+ },
487
+ /**
488
+ * Duration tokens
489
+ * Maps to foundation motion duration tokens via Tailwind
490
+ */
491
+ duration: {
492
+ instant: "duration-0",
493
+ // 0ms
494
+ fast: "duration-fast",
495
+ // 150ms - maps to motion.durations.fast
496
+ normal: "duration-normal",
497
+ // 300ms - maps to motion.durations.normal
498
+ slow: "duration-slow",
499
+ // 500ms - maps to motion.durations.slow
500
+ slower: "duration-slower",
501
+ // 700ms - maps to motion.durations.slower
502
+ slowest: "duration-slowest",
503
+ // 1000ms - maps to motion.durations.slowest
504
+ // Granular durations
505
+ "75": "duration-75",
506
+ // 75ms
507
+ "100": "duration-100",
508
+ // 100ms
509
+ "200": "duration-200",
510
+ // 200ms
511
+ "250": "duration-250",
512
+ // 250ms
513
+ "300": "duration-300",
514
+ // 300ms
515
+ "400": "duration-400",
516
+ // 400ms
517
+ "500": "duration-500",
518
+ // 500ms
519
+ "600": "duration-600",
520
+ // 600ms
521
+ "700": "duration-700",
522
+ // 700ms
523
+ "800": "duration-800",
524
+ // 800ms
525
+ "1000": "duration-1000"
526
+ // 1000ms
527
+ },
528
+ /**
529
+ * Easing tokens
530
+ * Maps to foundation motion easing tokens via Tailwind
531
+ */
532
+ easing: {
533
+ linear: "ease-linear",
534
+ // Linear easing
535
+ in: "ease-in",
536
+ // Ease in
537
+ out: "ease-out",
538
+ // Ease out (recommended for most UI)
539
+ "in-out": "ease-in-out",
540
+ // Ease in-out
541
+ bounce: "ease-bounce",
542
+ // Bounce easing
543
+ elastic: "ease-elastic"
544
+ // Elastic easing
545
+ },
546
+ /**
547
+ * Pre-configured transition tokens
548
+ * Combines duration and easing for common use cases
549
+ */
550
+ transitionPreset: {
551
+ fast: "transition-all duration-fast ease-out",
552
+ // Fast transition
553
+ normal: "transition-all duration-normal ease-in-out",
554
+ // Normal transition (default)
555
+ slow: "transition-all duration-slow ease-in-out",
556
+ // Slow transition
557
+ colors: "transition-colors duration-normal ease-out",
558
+ // Color transitions (common)
559
+ transform: "transition-transform duration-normal ease-out",
560
+ // Transform transitions
561
+ opacity: "transition-opacity duration-fast ease-out"
562
+ // Opacity transitions
563
+ },
564
+ /**
565
+ * Animation tokens
566
+ * Maps to foundation motion animation tokens via Tailwind
567
+ */
568
+ animation: {
569
+ none: "animate-none",
570
+ // No animation
571
+ spin: "animate-spin",
572
+ // Spin animation
573
+ pulse: "animate-pulse",
574
+ // Pulse animation
575
+ bounce: "animate-bounce",
576
+ // Bounce animation
577
+ ping: "animate-ping",
578
+ // Ping animation
579
+ shake: "animate-shake",
580
+ // Shake animation
581
+ fadeIn: "animate-fadeIn",
582
+ // Fade in
583
+ fadeOut: "animate-fadeOut",
584
+ // Fade out
585
+ slideInUp: "animate-slideInUp",
586
+ // Slide in from bottom
587
+ slideInDown: "animate-slideInDown",
588
+ // Slide in from top
589
+ slideInLeft: "animate-slideInLeft",
590
+ // Slide in from right
591
+ slideInRight: "animate-slideInRight",
592
+ // Slide in from left
593
+ scaleIn: "animate-scaleIn",
594
+ // Scale in
595
+ scaleOut: "animate-scaleOut"
596
+ // Scale out
597
+ }
598
+ };
599
+
456
600
  // src/tokens/components/button.ts
457
601
  var BUTTON_TOKENS = {
458
602
  /**
@@ -485,25 +629,48 @@ var BUTTON_TOKENS = {
485
629
  vertical: {
486
630
  sm: "py-xs",
487
631
  // 4px (0.25rem) - maps to semanticSpacing.xs
488
- md: "py-sm"
632
+ md: "py-sm",
489
633
  // 8px (0.5rem) - maps to semanticSpacing.sm
634
+ lg: "py-md"
635
+ // 16px (1rem) - maps to semanticSpacing.md - standardized for visual distinction
490
636
  }
491
637
  },
492
638
  /**
493
- * Gap between icon and text
639
+ * Gap between icon and text by size
640
+ * Scales with button size for visual consistency
494
641
  */
495
- gap: "gap-sm",
496
- // 8px (0.5rem) - maps to semanticSpacing.sm
642
+ gap: {
643
+ sm: "gap-xs",
644
+ // 4px (0.25rem) - smaller gap for small buttons
645
+ md: "gap-sm",
646
+ // 8px (0.5rem) - medium gap for medium buttons
647
+ lg: "gap-md"
648
+ // 16px (1rem) - larger gap for large buttons
649
+ },
497
650
  /**
498
651
  * Border radius for all button sizes
652
+ * Consistent radius across sizes for visual harmony
653
+ *
654
+ * @enforcement TUNG_TOKEN_AUTHORITY_EXPANSION_PLAN
655
+ * @rule References componentRadius.button.md (6px / 0.375rem) from Radius Authority
656
+ * @see docs/architecture/RADIUS_AUTHORITY_CONTRACT.md
499
657
  */
500
658
  radius: "rounded-md",
501
- // 6px (0.375rem) - maps to borderRadius.md
659
+ // References componentRadius.button.md (6px / 0.375rem) - Radius Authority compliant
502
660
  /**
503
- * Icon size within buttons
661
+ * Icon size within buttons by button size
662
+ * Scales proportionally with button size for visual balance
504
663
  */
505
- iconSize: "size-4",
506
- // 16px (1rem) - maps to spacing[4]
664
+ iconSize: {
665
+ sm: "size-3.5",
666
+ // 14px (0.875rem) - smaller icon for small buttons
667
+ md: "size-4",
668
+ // 16px (1rem) - medium icon for medium buttons
669
+ lg: "size-5",
670
+ // 20px (1.25rem) - larger icon for large buttons
671
+ icon: "size-4"
672
+ // 16px (1rem) - medium icon for icon-only buttons
673
+ },
507
674
  /**
508
675
  * Width tokens
509
676
  */
@@ -513,15 +680,19 @@ var BUTTON_TOKENS = {
513
680
  },
514
681
  /**
515
682
  * Font sizes by button size
516
- * Maps to foundation typography fontSize tokens
683
+ * References foundation typography fontSize tokens from Typography Authority
684
+ *
685
+ * @enforcement TUNG_TOKEN_AUTHORITY_EXPANSION_PLAN
686
+ * @rule All fontSize values reference Typography Authority tokens
687
+ * @see docs/architecture/TYPOGRAPHY_AUTHORITY_CONTRACT.md
517
688
  */
518
689
  fontSize: {
519
690
  sm: "text-xs",
520
- // Maps to fontSize.xs[0]
691
+ // References fontSize.xs[0] from Typography Authority (~12px)
521
692
  md: "text-sm",
522
- // Maps to fontSize.sm[0]
523
- lg: "text-sm"
524
- // Maps to fontSize.sm[0]
693
+ // References fontSize.sm[0] from Typography Authority (~14px)
694
+ lg: "text-base"
695
+ // References fontSize.base[0] from Typography Authority (~16px)
525
696
  },
526
697
  /**
527
698
  * Shadow tokens by variant
@@ -536,50 +707,137 @@ var BUTTON_TOKENS = {
536
707
  /**
537
708
  * Color tokens for button variants
538
709
  * Uses semantic color tokens that map to CSS variables
710
+ *
711
+ * State tokens (hover, active, disabled) use CSS variables from State Matrix.
712
+ * All states are injected via updateStateMatrixFromTokens() and consumed via arbitrary values.
713
+ * States react to Color Authority changes automatically through State Matrix.
714
+ *
715
+ * Interaction Authority Rules:
716
+ * - Hover (Priority 4): hover: prefix - ONLY when !disabled && !loading && pointer-events:auto
717
+ * - Active (Priority 3): active: prefix - ONLY when !disabled && !loading && mousedown
718
+ * - Focus (Priority 5): focus-visible: prefix - ONLY when !disabled && keyboard navigation
719
+ * - Disabled (Priority 1): disabled: prefix - Blocks ALL interactions
720
+ * - Loading (Priority 2): loading: prefix - Blocks hover/active (when implemented)
721
+ * - Base (Priority 6): No prefix - Default state, pointer-events: auto
722
+ *
723
+ * @enforcement TUNG_STATE_AUTHORITY_FOUNDATION_LOCK
724
+ * @enforcement TUNG_INTERACTION_AUTHORITY_FOUNDATION
725
+ * @rule States use CSS variables, not Tailwind variants
726
+ * @rule All state variables follow pattern: --{component}-{variant}-{state}-{property}
727
+ * @rule Visual states (colors) are SEPARATE from interaction states (pointer-events)
728
+ * @rule Hover MUST work with real mouse cursor, NOT just DevTools force state
729
+ * @rule Active MUST activate only on mousedown, NOT on hover
730
+ * @rule Focus MUST activate only on keyboard navigation, NOT on mouse click
731
+ *
732
+ * @see docs/architecture/INTERACTION_AUTHORITY_CONTRACT.md
539
733
  */
540
734
  variant: {
541
735
  primary: {
542
- background: "bg-primary",
543
- // Primary background using CSS var
736
+ background: "bg-[hsl(var(--button-primary-base-bg))]",
737
+ // Primary base background - CSS variable from State Matrix
544
738
  text: "text-primary-foreground",
545
739
  // Primary text using CSS var
546
- hover: "hover:bg-primary/90"
547
- // Primary hover using CSS var
740
+ hover: "hover:bg-[hsl(var(--button-primary-hover-bg))]",
741
+ // Primary hover - CSS variable from State Matrix (Priority 4: blocked by disabled/loading)
742
+ active: "active:bg-[hsl(var(--button-primary-active-bg))]",
743
+ // Primary active - CSS variable from State Matrix (Priority 3: blocked by disabled/loading, priority over hover)
744
+ focus: "focus-visible:bg-[hsl(var(--button-primary-focus-bg))]",
745
+ // Primary focus - CSS variable from State Matrix (Priority 5: keyboard navigation only)
746
+ disabled: {
747
+ background: "disabled:bg-[hsl(var(--button-primary-disabled-bg))]",
748
+ // Disabled background - CSS variable from State Matrix (Priority 1: blocks all)
749
+ text: "disabled:text-[hsl(var(--button-primary-disabled-text))]"
750
+ // Disabled text - CSS variable from State Matrix
751
+ },
752
+ loading: "bg-[hsl(var(--button-primary-loading-bg))]"
753
+ // Primary loading - CSS variable from State Matrix (Priority 2: blocks hover/active, used with aria-busy/data-loading when implemented)
548
754
  },
549
755
  secondary: {
550
756
  background: "bg-secondary",
551
757
  // Secondary background using CSS var
552
758
  text: "text-secondary-foreground",
553
759
  // Secondary text using CSS var
554
- hover: "hover:bg-secondary/80"
555
- // Secondary hover using CSS var
760
+ hover: "hover:bg-[hsl(var(--button-secondary-hover-bg))]",
761
+ // Secondary hover - CSS variable from State Matrix
762
+ active: "active:bg-[hsl(var(--button-secondary-active-bg))]",
763
+ // Secondary active - CSS variable from State Matrix
764
+ disabled: {
765
+ background: "disabled:bg-[hsl(var(--button-secondary-disabled-bg))]",
766
+ // Disabled background - CSS variable from State Matrix
767
+ text: "disabled:text-[hsl(var(--button-secondary-disabled-text))]"
768
+ // Disabled text - CSS variable from State Matrix
769
+ }
556
770
  },
557
771
  accent: {
558
772
  background: "bg-accent",
559
773
  // Accent background using CSS var
560
774
  text: "text-accent-foreground",
561
775
  // Accent text using CSS var
562
- hover: "hover:bg-accent/90"
563
- // Accent hover using CSS var
776
+ hover: "hover:bg-[hsl(var(--button-accent-hover-bg))]",
777
+ // Accent hover - CSS variable from State Matrix
778
+ active: "active:bg-[hsl(var(--button-accent-active-bg))]",
779
+ // Accent active - CSS variable from State Matrix
780
+ disabled: {
781
+ background: "disabled:bg-[hsl(var(--button-accent-disabled-bg))]",
782
+ // Disabled background - CSS variable from State Matrix
783
+ text: "disabled:text-[hsl(var(--button-accent-disabled-text))]"
784
+ // Disabled text - CSS variable from State Matrix
785
+ }
564
786
  },
565
787
  outline: {
566
788
  border: "border border-input",
567
789
  // Input border using CSS var
568
790
  background: "bg-background",
569
791
  // Background using CSS var
792
+ text: "text-foreground",
793
+ // Foreground text using CSS var
570
794
  hover: {
571
- background: "hover:bg-accent",
572
- // Accent hover using CSS var
573
- text: "hover:text-accent-foreground"
574
- // Accent text using CSS var
795
+ background: "hover:bg-[hsl(var(--button-outline-hover-bg))]",
796
+ // Outline hover background - CSS variable from State Matrix
797
+ text: "hover:text-[hsl(var(--button-outline-hover-text))]",
798
+ // Outline hover text - CSS variable from State Matrix
799
+ border: "hover:border-[hsl(var(--button-outline-hover-border))]"
800
+ // Outline hover border - CSS variable from State Matrix
801
+ },
802
+ active: {
803
+ background: "active:bg-[hsl(var(--button-outline-active-bg))]",
804
+ // Outline active background - CSS variable from State Matrix
805
+ text: "active:text-[hsl(var(--button-outline-active-text))]",
806
+ // Outline active text - CSS variable from State Matrix
807
+ border: "active:border-[hsl(var(--button-outline-active-border))]"
808
+ // Outline active border - CSS variable from State Matrix
809
+ },
810
+ disabled: {
811
+ background: "disabled:bg-[hsl(var(--button-outline-disabled-bg))]",
812
+ // Disabled background - CSS variable from State Matrix
813
+ text: "disabled:text-[hsl(var(--button-outline-disabled-text))]",
814
+ // Disabled text - CSS variable from State Matrix
815
+ border: "disabled:border-[hsl(var(--button-outline-disabled-border))]"
816
+ // Disabled border - CSS variable from State Matrix
575
817
  }
576
818
  },
577
819
  ghost: {
820
+ background: "bg-transparent",
821
+ // Transparent background
822
+ text: "text-foreground",
823
+ // Foreground text using CSS var
578
824
  hover: {
579
- background: "hover:bg-accent",
580
- // Accent hover using CSS var
581
- text: "hover:text-accent-foreground"
582
- // Accent text using CSS var
825
+ background: "hover:bg-[hsl(var(--button-ghost-hover-bg))]",
826
+ // Ghost hover background - CSS variable from State Matrix
827
+ text: "hover:text-[hsl(var(--button-ghost-hover-text))]"
828
+ // Ghost hover text - CSS variable from State Matrix
829
+ },
830
+ active: {
831
+ background: "active:bg-[hsl(var(--button-ghost-active-bg))]",
832
+ // Ghost active background - CSS variable from State Matrix
833
+ text: "active:text-[hsl(var(--button-ghost-active-text))]"
834
+ // Ghost active text - CSS variable from State Matrix
835
+ },
836
+ disabled: {
837
+ background: "disabled:bg-[hsl(var(--button-ghost-disabled-bg))]",
838
+ // Disabled background - CSS variable from State Matrix
839
+ text: "disabled:text-[hsl(var(--button-ghost-disabled-text))]"
840
+ // Disabled text - CSS variable from State Matrix
583
841
  }
584
842
  },
585
843
  destructive: {
@@ -587,16 +845,94 @@ var BUTTON_TOKENS = {
587
845
  // Destructive background using CSS var
588
846
  text: "text-destructive-foreground",
589
847
  // Destructive text using CSS var
590
- hover: "hover:bg-destructive/90"
591
- // Destructive hover using CSS var
848
+ hover: "hover:bg-[hsl(var(--button-destructive-hover-bg))]",
849
+ // Destructive hover - CSS variable from State Matrix
850
+ active: "active:bg-[hsl(var(--button-destructive-active-bg))]",
851
+ // Destructive active - CSS variable from State Matrix
852
+ disabled: {
853
+ background: "disabled:bg-[hsl(var(--button-destructive-disabled-bg))]",
854
+ // Disabled background - CSS variable from State Matrix
855
+ text: "disabled:text-[hsl(var(--button-destructive-disabled-text))]"
856
+ // Disabled text - CSS variable from State Matrix
857
+ }
592
858
  }
593
859
  },
594
860
  /**
595
861
  * Transition tokens
862
+ * References Motion Authority tokens for consistent motion behavior
863
+ *
864
+ * @enforcement TUNG_TOKEN_AUTHORITY_EXPANSION_PLAN
865
+ * @rule Uses MOTION_TOKENS.transitionPreset.colors from Motion Authority
866
+ * @rule Motion transitions MUST use canonical motion tokens only
867
+ * @see docs/architecture/MOTION_AUTHORITY_CONTRACT.md
596
868
  */
597
869
  transition: {
598
- colors: "transition-colors"
599
- // Color transition using motion tokens
870
+ colors: MOTION_TOKENS.transitionPreset.colors
871
+ // "transition-colors duration-normal ease-out" - Motion Authority compliant
872
+ },
873
+ /**
874
+ * Global state tokens
875
+ * Shared state tokens that apply across all variants
876
+ * Variant-specific states are defined in variant.*.active and variant.*.disabled
877
+ *
878
+ * @enforcement TUNG_INTERACTION_AUTHORITY_FOUNDATION
879
+ * @rule All interaction states MUST follow Interaction Authority Contract
880
+ * @rule State priority: disabled > loading > active > hover > focus-visible > base
881
+ * @rule Visual states (colors) are SEPARATE from interaction states (pointer-events, cursor)
882
+ * @rule All states MUST be browser-native (CSS pseudo-classes), NOT JavaScript-managed
883
+ */
884
+ state: {
885
+ /**
886
+ * Disabled state tokens
887
+ * Global disabled state tokens (variant-specific overrides in variant.*.disabled)
888
+ *
889
+ * Interaction Authority Rules:
890
+ * - Priority: 1 (Highest) - Blocks ALL interactions
891
+ * - MUST block hover, active, and focus states
892
+ * - MUST use disabled: prefix (never in base state)
893
+ * - Base state MUST have pointer-events: auto (default) for hover to work
894
+ *
895
+ * @enforcement TUNG_INTERACTION_AUTHORITY_FOUNDATION
896
+ * @enforcement TUNG_BUTTON_INTERACTION_FIX
897
+ * @rule Interaction Authority: pointer-events is NOT a visual token
898
+ * @rule pointer-events-none MUST use disabled: prefix (never in base state)
899
+ * @rule Base state MUST have pointer-events: auto (default) for hover to work
900
+ * @rule These tokens are applied in base but only activate when element is disabled
901
+ * @rule Hover is FORBIDDEN when disabled={true}
902
+ * @rule Active is FORBIDDEN when disabled={true}
903
+ * @rule Focus is FORBIDDEN when disabled={true} (for interactions)
904
+ *
905
+ * @see docs/architecture/INTERACTION_AUTHORITY_CONTRACT.md
906
+ */
907
+ disabled: {
908
+ cursor: "disabled:cursor-not-allowed",
909
+ // Disabled cursor style (only applies when disabled)
910
+ pointerEvents: "disabled:pointer-events-none"
911
+ // Disable pointer events (only applies when disabled)
912
+ },
913
+ /**
914
+ * Focus state tokens
915
+ * Focus ring for keyboard navigation
916
+ *
917
+ * Interaction Authority Rules:
918
+ * - Priority: 5 - Lower than active and hover
919
+ * - MUST activate only on keyboard navigation (focus-visible: prefix)
920
+ * - MUST NOT activate on mouse click (use :focus-visible, not :focus)
921
+ * - MUST be blocked by disabled state
922
+ *
923
+ * @enforcement TUNG_INTERACTION_AUTHORITY_FOUNDATION
924
+ * @rule Focus MUST use focus-visible: prefix (keyboard navigation only)
925
+ * @rule Focus MUST be blocked when disabled={true}
926
+ * @rule Focus MUST NOT activate on mouse click
927
+ *
928
+ * @see docs/architecture/INTERACTION_AUTHORITY_CONTRACT.md
929
+ */
930
+ focus: {
931
+ ring: "focus-visible:ring-1 focus-visible:ring-ring",
932
+ // Focus ring using semantic ring color
933
+ outline: "focus-visible:outline-none"
934
+ // Remove default outline (replaced by ring)
935
+ }
600
936
  }
601
937
  };
602
938
 
@@ -684,6 +1020,68 @@ var CARD_TOKENS = {
684
1020
  }
685
1021
  };
686
1022
 
1023
+ // src/tokens/components/artist.ts
1024
+ var ARTIST_TOKENS = {
1025
+ /**
1026
+ * Image container tokens
1027
+ * Layout classes for image container wrapper
1028
+ */
1029
+ image: {
1030
+ /**
1031
+ * Container layout tokens
1032
+ * Positioning and sizing for image container
1033
+ */
1034
+ container: {
1035
+ /**
1036
+ * Base container layout
1037
+ * Relative positioning, full width, overflow hidden
1038
+ * Uses Tailwind layout utilities (allowed per architecture)
1039
+ */
1040
+ layout: "relative w-full overflow-hidden"
1041
+ },
1042
+ /**
1043
+ * Image sizing tokens
1044
+ * Full width and height for images
1045
+ */
1046
+ sizing: {
1047
+ /**
1048
+ * Full size image
1049
+ * Uses Tailwind sizing utilities (allowed per architecture)
1050
+ */
1051
+ full: "h-full w-full"
1052
+ },
1053
+ /**
1054
+ * Placeholder container tokens
1055
+ * Layout for placeholder icon container when no image is provided
1056
+ */
1057
+ placeholder: {
1058
+ /**
1059
+ * Placeholder container layout
1060
+ * Flex centering for placeholder icon
1061
+ * Uses Tailwind layout utilities (allowed per architecture)
1062
+ */
1063
+ container: "flex h-full w-full items-center justify-center"
1064
+ }
1065
+ },
1066
+ /**
1067
+ * Footer border tokens
1068
+ * Border styling for card footer separator
1069
+ */
1070
+ footer: {
1071
+ /**
1072
+ * Footer border tokens
1073
+ * Top border separator for footer section
1074
+ */
1075
+ border: {
1076
+ /**
1077
+ * Footer border top
1078
+ * Uses semantic border color token
1079
+ */
1080
+ top: "border-t border-border"
1081
+ }
1082
+ }
1083
+ };
1084
+
687
1085
  // src/tokens/spacing.ts
688
1086
  var spacing = {
689
1087
  // Zero spacing
@@ -946,101 +1344,6 @@ var tailwindSpacingConfig = {
946
1344
 
947
1345
  // src/tokens/components/data.ts
948
1346
  var DATA_TOKENS = {
949
- /**
950
- * Table Component Tokens
951
- */
952
- table: {
953
- /**
954
- * Table row heights by size
955
- * Maps to Tailwind height utilities
956
- */
957
- rowHeight: {
958
- sm: "h-8",
959
- // 32px (2rem) - compact rows
960
- md: "h-10",
961
- // 40px (2.5rem) - default rows
962
- lg: "h-12"
963
- // 48px (3rem) - spacious rows
964
- },
965
- /**
966
- * Table cell and header padding by size
967
- * Maps to semantic spacing tokens
968
- */
969
- padding: {
970
- cell: {
971
- sm: "p-xs",
972
- // 4px (0.25rem) - maps to semanticSpacing.xs
973
- md: "p-sm",
974
- // 8px (0.5rem) - maps to semanticSpacing.sm
975
- lg: "p-md"
976
- // 16px (1rem) - maps to semanticSpacing.md
977
- },
978
- header: {
979
- sm: "px-xs py-sm",
980
- // 4px horizontal, 8px vertical
981
- md: "px-sm py-md",
982
- // 8px horizontal, 16px vertical
983
- lg: "px-md py-lg"
984
- // 16px horizontal, 24px vertical
985
- }
986
- },
987
- /**
988
- * Gap between table cells (horizontal spacing)
989
- */
990
- gap: {
991
- sm: "gap-xs",
992
- // 4px (0.25rem) - maps to semanticSpacing.xs
993
- md: "gap-sm"
994
- // 8px (0.5rem) - maps to semanticSpacing.sm
995
- },
996
- /**
997
- * Border radius for table
998
- */
999
- radius: {
1000
- default: "rounded-md"
1001
- // 6px (0.375rem) - maps to borderRadius.md
1002
- },
1003
- /**
1004
- * Shadow tokens for table
1005
- * Maps to foundation elevation shadow tokens
1006
- */
1007
- shadow: {
1008
- none: "shadow-none",
1009
- // No shadow
1010
- subtle: "shadow-sm"
1011
- // Maps to elevationShadows.sm
1012
- },
1013
- /**
1014
- * Typography tokens for table headers and cells
1015
- * Maps to foundation typography fontSize tokens
1016
- */
1017
- typography: {
1018
- header: {
1019
- fontSize: "text-sm",
1020
- // Maps to fontSize.sm[0]
1021
- fontWeight: "font-semibold"
1022
- // Maps to fontWeight.semibold
1023
- },
1024
- cell: {
1025
- fontSize: "text-sm",
1026
- // Maps to fontSize.sm[0]
1027
- fontWeight: "font-normal"
1028
- // Maps to fontWeight.normal
1029
- }
1030
- },
1031
- /**
1032
- * Color tokens for table states
1033
- * Uses semantic color tokens
1034
- */
1035
- colors: {
1036
- border: "border-border",
1037
- // Border color
1038
- rowHover: "hover:bg-muted/50",
1039
- // Row hover background
1040
- rowSelected: "bg-muted"
1041
- // Selected row background
1042
- }
1043
- },
1044
1347
  /**
1045
1348
  * Skeleton Component Tokens
1046
1349
  */
@@ -1106,97 +1409,6 @@ var DATA_TOKENS = {
1106
1409
  inline: "inline-block"
1107
1410
  // Inline block display
1108
1411
  }
1109
- },
1110
- /**
1111
- * EmptyState Component Tokens
1112
- */
1113
- emptyState: {
1114
- /**
1115
- * Spacing tokens for EmptyState
1116
- * Maps to semantic spacing tokens
1117
- */
1118
- spacing: {
1119
- gap: "gap-md",
1120
- // 16px (1rem) - gap between elements - maps to semanticSpacing.md
1121
- padding: "p-lg"
1122
- // 24px (1.5rem) - container padding - maps to semanticSpacing.lg
1123
- },
1124
- /**
1125
- * Border radius for EmptyState container
1126
- */
1127
- radius: {
1128
- default: "rounded-xl"
1129
- // 12px (0.75rem) - maps to borderRadius.xl
1130
- },
1131
- /**
1132
- * Icon sizes by variant
1133
- * Maps to Tailwind size utilities
1134
- */
1135
- iconSize: {
1136
- sm: "size-8",
1137
- // 32px (2rem)
1138
- md: "size-12",
1139
- // 48px (3rem)
1140
- lg: "size-16"
1141
- // 64px (4rem)
1142
- },
1143
- /**
1144
- * Typography tokens for EmptyState
1145
- * Maps to foundation typography tokens
1146
- */
1147
- typography: {
1148
- title: {
1149
- fontSize: "text-lg",
1150
- // Maps to fontSize.lg[0]
1151
- fontWeight: "font-semibold"
1152
- // Maps to fontWeight.semibold
1153
- },
1154
- description: {
1155
- fontSize: "text-sm",
1156
- // Maps to fontSize.sm[0]
1157
- fontWeight: "font-normal"
1158
- // Maps to fontWeight.normal
1159
- }
1160
- }
1161
- },
1162
- /**
1163
- * DataList Component Tokens
1164
- */
1165
- dataList: {
1166
- /**
1167
- * Spacing tokens for DataList
1168
- * Maps to semantic spacing tokens
1169
- */
1170
- spacing: {
1171
- gap: "gap-md",
1172
- // 16px (1rem) - gap between items - maps to semanticSpacing.md
1173
- padding: "p-md"
1174
- // 16px (1rem) - container padding - maps to semanticSpacing.md
1175
- },
1176
- /**
1177
- * Label width tokens (for desktop horizontal layout)
1178
- * Maps to Tailwind width utilities
1179
- */
1180
- labelWidth: {
1181
- sm: "w-24",
1182
- // 96px (6rem) - small label width
1183
- md: "w-32",
1184
- // 128px (8rem) - default label width
1185
- lg: "w-40"
1186
- // 160px (10rem) - large label width
1187
- },
1188
- /**
1189
- * Row padding tokens
1190
- * Maps to semantic spacing tokens
1191
- */
1192
- rowPadding: {
1193
- sm: "py-xs",
1194
- // 4px (0.25rem) - maps to semanticSpacing.xs
1195
- md: "py-sm",
1196
- // 8px (0.5rem) - maps to semanticSpacing.sm
1197
- lg: "py-md"
1198
- // 16px (1rem) - maps to semanticSpacing.md
1199
- }
1200
1412
  }
1201
1413
  };
1202
1414
 
@@ -1256,139 +1468,6 @@ var ICON_TOKENS = {
1256
1468
  }
1257
1469
  };
1258
1470
 
1259
- // src/tokens/components/motion.ts
1260
- var MOTION_TOKENS = {
1261
- /**
1262
- * Transition property tokens
1263
- * Maps to Tailwind transition utilities
1264
- */
1265
- transition: {
1266
- all: "transition-all",
1267
- // All properties
1268
- colors: "transition-colors",
1269
- // Color properties only
1270
- opacity: "transition-opacity",
1271
- // Opacity only
1272
- transform: "transition-transform",
1273
- // Transform only
1274
- shadow: "transition-shadow",
1275
- // Box shadow only
1276
- none: "transition-none"
1277
- // No transition
1278
- },
1279
- /**
1280
- * Duration tokens
1281
- * Maps to foundation motion duration tokens via Tailwind
1282
- */
1283
- duration: {
1284
- instant: "duration-0",
1285
- // 0ms
1286
- fast: "duration-fast",
1287
- // 150ms - maps to motion.durations.fast
1288
- normal: "duration-normal",
1289
- // 300ms - maps to motion.durations.normal
1290
- slow: "duration-slow",
1291
- // 500ms - maps to motion.durations.slow
1292
- slower: "duration-slower",
1293
- // 700ms - maps to motion.durations.slower
1294
- slowest: "duration-slowest",
1295
- // 1000ms - maps to motion.durations.slowest
1296
- // Granular durations
1297
- "75": "duration-75",
1298
- // 75ms
1299
- "100": "duration-100",
1300
- // 100ms
1301
- "200": "duration-200",
1302
- // 200ms
1303
- "250": "duration-250",
1304
- // 250ms
1305
- "300": "duration-300",
1306
- // 300ms
1307
- "400": "duration-400",
1308
- // 400ms
1309
- "500": "duration-500",
1310
- // 500ms
1311
- "600": "duration-600",
1312
- // 600ms
1313
- "700": "duration-700",
1314
- // 700ms
1315
- "800": "duration-800",
1316
- // 800ms
1317
- "1000": "duration-1000"
1318
- // 1000ms
1319
- },
1320
- /**
1321
- * Easing tokens
1322
- * Maps to foundation motion easing tokens via Tailwind
1323
- */
1324
- easing: {
1325
- linear: "ease-linear",
1326
- // Linear easing
1327
- in: "ease-in",
1328
- // Ease in
1329
- out: "ease-out",
1330
- // Ease out (recommended for most UI)
1331
- "in-out": "ease-in-out",
1332
- // Ease in-out
1333
- bounce: "ease-bounce",
1334
- // Bounce easing
1335
- elastic: "ease-elastic"
1336
- // Elastic easing
1337
- },
1338
- /**
1339
- * Pre-configured transition tokens
1340
- * Combines duration and easing for common use cases
1341
- */
1342
- transitionPreset: {
1343
- fast: "transition-all duration-fast ease-out",
1344
- // Fast transition
1345
- normal: "transition-all duration-normal ease-in-out",
1346
- // Normal transition (default)
1347
- slow: "transition-all duration-slow ease-in-out",
1348
- // Slow transition
1349
- colors: "transition-colors duration-normal ease-out",
1350
- // Color transitions (common)
1351
- transform: "transition-transform duration-normal ease-out",
1352
- // Transform transitions
1353
- opacity: "transition-opacity duration-fast ease-out"
1354
- // Opacity transitions
1355
- },
1356
- /**
1357
- * Animation tokens
1358
- * Maps to foundation motion animation tokens via Tailwind
1359
- */
1360
- animation: {
1361
- none: "animate-none",
1362
- // No animation
1363
- spin: "animate-spin",
1364
- // Spin animation
1365
- pulse: "animate-pulse",
1366
- // Pulse animation
1367
- bounce: "animate-bounce",
1368
- // Bounce animation
1369
- ping: "animate-ping",
1370
- // Ping animation
1371
- shake: "animate-shake",
1372
- // Shake animation
1373
- fadeIn: "animate-fadeIn",
1374
- // Fade in
1375
- fadeOut: "animate-fadeOut",
1376
- // Fade out
1377
- slideInUp: "animate-slideInUp",
1378
- // Slide in from bottom
1379
- slideInDown: "animate-slideInDown",
1380
- // Slide in from top
1381
- slideInLeft: "animate-slideInLeft",
1382
- // Slide in from right
1383
- slideInRight: "animate-slideInRight",
1384
- // Slide in from left
1385
- scaleIn: "animate-scaleIn",
1386
- // Scale in
1387
- scaleOut: "animate-scaleOut"
1388
- // Scale out
1389
- }
1390
- };
1391
-
1392
1471
  // src/tokens/components/domain.ts
1393
1472
  var DOMAIN_TOKENS = {
1394
1473
  /**
@@ -1541,7 +1620,7 @@ var DOMAIN_TOKENS = {
1541
1620
  },
1542
1621
  /**
1543
1622
  * Image tokens for card media
1544
- * Defines aspect ratio, radius, and overlay styles
1623
+ * Defines aspect ratio, radius, overlay styles, and placeholder gradients
1545
1624
  */
1546
1625
  image: {
1547
1626
  /**
@@ -1564,6 +1643,40 @@ var DOMAIN_TOKENS = {
1564
1643
  overlay: {
1565
1644
  gradient: "bg-gradient-to-t from-black/60 via-transparent to-transparent"
1566
1645
  // Gradient overlay for image hover states
1646
+ },
1647
+ /**
1648
+ * Placeholder gradient tokens for image placeholders
1649
+ * Used when no image URL is provided
1650
+ */
1651
+ placeholder: {
1652
+ gradient: "bg-gradient-to-br from-muted to-muted/50"
1653
+ // Placeholder gradient background
1654
+ }
1655
+ },
1656
+ /**
1657
+ * Text tokens for card text elements
1658
+ * Defines hover states and line clamping for titles and descriptions
1659
+ */
1660
+ text: {
1661
+ /**
1662
+ * Hover state tokens for text elements
1663
+ * Used for interactive text elements like titles
1664
+ */
1665
+ hover: {
1666
+ primary: "group-hover:text-primary"
1667
+ // Hover state for primary text color
1668
+ },
1669
+ /**
1670
+ * Line clamp tokens for text truncation
1671
+ * Used for limiting text to specific number of lines
1672
+ */
1673
+ lineClamp: {
1674
+ one: "line-clamp-1",
1675
+ // Single line clamp
1676
+ two: "line-clamp-2",
1677
+ // Two line clamp
1678
+ three: "line-clamp-3"
1679
+ // Three line clamp
1567
1680
  }
1568
1681
  },
1569
1682
  /**
@@ -1786,6 +1899,94 @@ var DOMAIN_TOKENS = {
1786
1899
  height: "h-6"
1787
1900
  // References spacing[6] (1.5rem / 24px) via Tailwind
1788
1901
  }
1902
+ },
1903
+ /**
1904
+ * CTA (Call-to-Action) button tokens for domain card components
1905
+ * Provides PromoCard-specific CTA button styling tokens
1906
+ * These tokens are semantically owned by domain card components, not by the Button component
1907
+ * References foundation tokens (spacing, typography, radius, shadows, motion) for consistency
1908
+ */
1909
+ cta: {
1910
+ /**
1911
+ * CTA button styling tokens
1912
+ * Used by PromoCard and other domain card components for CTA button elements
1913
+ */
1914
+ button: {
1915
+ /**
1916
+ * Button heights by size
1917
+ * Maps to Tailwind height utilities: h-8, h-9
1918
+ */
1919
+ height: {
1920
+ sm: "h-8",
1921
+ // 32px (2rem) - compact size
1922
+ md: "h-9"
1923
+ // 36px (2.25rem) - default size
1924
+ },
1925
+ /**
1926
+ * Button padding by size
1927
+ * Horizontal and vertical padding values
1928
+ * References semanticSpacing tokens
1929
+ */
1930
+ padding: {
1931
+ horizontal: {
1932
+ sm: "px-sm",
1933
+ // 8px (0.5rem) - maps to semanticSpacing.sm
1934
+ md: "px-md"
1935
+ // 16px (1rem) - maps to semanticSpacing.md
1936
+ },
1937
+ vertical: {
1938
+ sm: "py-xs"
1939
+ // 4px (0.25rem) - maps to semanticSpacing.xs
1940
+ }
1941
+ },
1942
+ /**
1943
+ * Border radius for CTA buttons
1944
+ * References borderRadius.md (6px / 0.375rem)
1945
+ * Using Tailwind class "rounded-md" which maps to borderRadius.md
1946
+ */
1947
+ radius: "rounded-md",
1948
+ // References borderRadius.md via Tailwind
1949
+ /**
1950
+ * Font sizes by button size
1951
+ * Maps to foundation typography fontSize tokens
1952
+ */
1953
+ fontSize: {
1954
+ sm: "text-xs",
1955
+ // Maps to fontSize.xs[0]
1956
+ md: "text-sm"
1957
+ // Maps to fontSize.sm[0]
1958
+ },
1959
+ /**
1960
+ * Shadow tokens for CTA buttons
1961
+ * Maps to foundation elevation shadow tokens
1962
+ */
1963
+ shadow: {
1964
+ primary: "shadow"
1965
+ // Maps to elevationShadows.xs (primary variant uses shadow)
1966
+ },
1967
+ /**
1968
+ * Color tokens for CTA button variants
1969
+ * Uses semantic color tokens that map to CSS variables
1970
+ */
1971
+ variant: {
1972
+ primary: {
1973
+ background: "bg-primary",
1974
+ // Primary background using CSS var
1975
+ text: "text-primary-foreground",
1976
+ // Primary text using CSS var
1977
+ hover: "hover:bg-primary/90"
1978
+ // Primary hover using CSS var
1979
+ }
1980
+ },
1981
+ /**
1982
+ * Transition tokens for CTA buttons
1983
+ * References MOTION_TOKENS for transitions
1984
+ */
1985
+ transition: {
1986
+ colors: "transition-colors"
1987
+ // Color transition using motion tokens
1988
+ }
1989
+ }
1789
1990
  }
1790
1991
  };
1791
1992
 
@@ -1889,40 +2090,6 @@ var INPUT_TOKENS = {
1889
2090
  text: "text-[hsl(var(--foreground))]"
1890
2091
  // File input text color using CSS var
1891
2092
  },
1892
- /**
1893
- * Select listbox tokens
1894
- * Styling for select dropdown container
1895
- */
1896
- selectListbox: {
1897
- border: "border border-[hsl(var(--border))]",
1898
- // Border color using CSS var
1899
- background: "bg-[hsl(var(--popover))]",
1900
- // Background using CSS var
1901
- text: "text-[hsl(var(--popover-foreground))]",
1902
- // Text color using CSS var
1903
- radius: "rounded-md",
1904
- // Radius token (6px)
1905
- shadow: "shadow-md"
1906
- // Shadow token
1907
- },
1908
- /**
1909
- * Select option tokens
1910
- * Styling for select option items
1911
- */
1912
- selectOption: {
1913
- focus: {
1914
- background: "focus:bg-[hsl(var(--accent))]",
1915
- // Focus background using CSS var
1916
- text: "focus:text-[hsl(var(--accent-foreground))]"
1917
- // Focus text using CSS var
1918
- },
1919
- selected: {
1920
- background: "bg-[hsl(var(--accent))]",
1921
- // Selected background using CSS var
1922
- text: "text-[hsl(var(--accent-foreground))]"
1923
- // Selected text using CSS var
1924
- }
1925
- },
1926
2093
  /**
1927
2094
  * Variant-based tokens
1928
2095
  * Border, background, and text colors for different variants
@@ -2910,8 +3077,16 @@ var TEXT_TOKENS = {
2910
3077
  // Maps to fontSize.base[0]
2911
3078
  lg: "text-lg",
2912
3079
  // Maps to fontSize.lg[0]
2913
- xl: "text-xl"
3080
+ xl: "text-xl",
2914
3081
  // Maps to fontSize.xl[0]
3082
+ "2xl": "text-2xl",
3083
+ // Maps to fontSize.2xl[0]
3084
+ "3xl": "text-3xl",
3085
+ // Maps to fontSize.3xl[0]
3086
+ "4xl": "text-4xl",
3087
+ // Maps to fontSize.4xl[0]
3088
+ "5xl": "text-5xl"
3089
+ // Maps to fontSize.5xl[0]
2915
3090
  },
2916
3091
  /**
2917
3092
  * Font weights by weight variant
@@ -2936,6 +3111,8 @@ var TEXT_TOKENS = {
2936
3111
  // Maps to lineHeight.none
2937
3112
  tight: "leading-tight",
2938
3113
  // Maps to lineHeight.tight
3114
+ snug: "leading-snug",
3115
+ // Maps to lineHeight.snug
2939
3116
  normal: "leading-normal",
2940
3117
  // Maps to lineHeight.normal
2941
3118
  relaxed: "leading-relaxed",
@@ -3459,9 +3636,9 @@ var TOAST_TOKENS = {
3459
3636
  // Default opacity (hidden)
3460
3637
  groupHover: "group-hover:opacity-100",
3461
3638
  // Visible on group hover
3462
- focus: "focus:opacity-100",
3639
+ focus: "focus-visible:opacity-100",
3463
3640
  // Visible on focus
3464
- focusRing: "focus:outline-none focus:ring-1"
3641
+ focusRing: "focus-visible:outline-none focus-visible:ring-1"
3465
3642
  // Focus ring styling
3466
3643
  }
3467
3644
  }
@@ -4203,19 +4380,27 @@ var DROPDOWN_TOKENS = {
4203
4380
  // 256px
4204
4381
  }
4205
4382
  },
4383
+ /**
4384
+ * Width tokens
4385
+ * Common width utilities
4386
+ */
4387
+ width: {
4388
+ full: "w-full"
4389
+ // Full width (100%)
4390
+ },
4206
4391
  /**
4207
4392
  * Item tokens by size
4208
4393
  * Individual menu item
4209
4394
  */
4210
4395
  item: {
4211
4396
  background: {
4212
- focus: "focus:bg-[hsl(var(--accent))]",
4397
+ focus: "focus-visible:bg-[hsl(var(--accent))]",
4213
4398
  // Focus background using CSS var
4214
4399
  selected: "bg-[hsl(var(--accent))]"
4215
4400
  // Selected background using CSS var
4216
4401
  },
4217
4402
  text: {
4218
- focus: "focus:text-[hsl(var(--accent-foreground))]",
4403
+ focus: "focus-visible:text-[hsl(var(--accent-foreground))]",
4219
4404
  // Focus text using CSS var
4220
4405
  selected: "text-[hsl(var(--accent-foreground))]"
4221
4406
  // Selected text using CSS var
@@ -4473,9 +4658,9 @@ var SELECT_TOKENS = {
4473
4658
  // 8px (0.5rem) from left
4474
4659
  },
4475
4660
  focus: {
4476
- background: "focus:bg-[hsl(var(--accent))]",
4661
+ background: "focus-visible:bg-[hsl(var(--accent))]",
4477
4662
  // Focus background using CSS var
4478
- text: "focus:text-[hsl(var(--accent-foreground))]"
4663
+ text: "focus-visible:text-[hsl(var(--accent-foreground))]"
4479
4664
  // Focus text using CSS var
4480
4665
  },
4481
4666
  selected: {
@@ -5065,54 +5250,54 @@ var transitions = {
5065
5250
  var keyframes = {
5066
5251
  // Fade animations
5067
5252
  fadeIn: {
5068
- from: { opacity: 0 },
5069
- to: { opacity: 1 }
5253
+ from: { opacity: "0" },
5254
+ to: { opacity: "1" }
5070
5255
  },
5071
5256
  fadeOut: {
5072
- from: { opacity: 1 },
5073
- to: { opacity: 0 }
5257
+ from: { opacity: "1" },
5258
+ to: { opacity: "0" }
5074
5259
  },
5075
5260
  // Slide animations
5076
5261
  slideInUp: {
5077
- from: { transform: "translateY(100%)", opacity: 0 },
5078
- to: { transform: "translateY(0)", opacity: 1 }
5262
+ from: { transform: "translateY(100%)", opacity: "0" },
5263
+ to: { transform: "translateY(0)", opacity: "1" }
5079
5264
  },
5080
5265
  slideInDown: {
5081
- from: { transform: "translateY(-100%)", opacity: 0 },
5082
- to: { transform: "translateY(0)", opacity: 1 }
5266
+ from: { transform: "translateY(-100%)", opacity: "0" },
5267
+ to: { transform: "translateY(0)", opacity: "1" }
5083
5268
  },
5084
5269
  slideInLeft: {
5085
- from: { transform: "translateX(-100%)", opacity: 0 },
5086
- to: { transform: "translateX(0)", opacity: 1 }
5270
+ from: { transform: "translateX(-100%)", opacity: "0" },
5271
+ to: { transform: "translateX(0)", opacity: "1" }
5087
5272
  },
5088
5273
  slideInRight: {
5089
- from: { transform: "translateX(100%)", opacity: 0 },
5090
- to: { transform: "translateX(0)", opacity: 1 }
5274
+ from: { transform: "translateX(100%)", opacity: "0" },
5275
+ to: { transform: "translateX(0)", opacity: "1" }
5091
5276
  },
5092
5277
  slideOutUp: {
5093
- from: { transform: "translateY(0)", opacity: 1 },
5094
- to: { transform: "translateY(-100%)", opacity: 0 }
5278
+ from: { transform: "translateY(0)", opacity: "1" },
5279
+ to: { transform: "translateY(-100%)", opacity: "0" }
5095
5280
  },
5096
5281
  slideOutDown: {
5097
- from: { transform: "translateY(0)", opacity: 1 },
5098
- to: { transform: "translateY(100%)", opacity: 0 }
5282
+ from: { transform: "translateY(0)", opacity: "1" },
5283
+ to: { transform: "translateY(100%)", opacity: "0" }
5099
5284
  },
5100
5285
  slideOutLeft: {
5101
- from: { transform: "translateX(0)", opacity: 1 },
5102
- to: { transform: "translateX(-100%)", opacity: 0 }
5286
+ from: { transform: "translateX(0)", opacity: "1" },
5287
+ to: { transform: "translateX(-100%)", opacity: "0" }
5103
5288
  },
5104
5289
  slideOutRight: {
5105
- from: { transform: "translateX(0)", opacity: 1 },
5106
- to: { transform: "translateX(100%)", opacity: 0 }
5290
+ from: { transform: "translateX(0)", opacity: "1" },
5291
+ to: { transform: "translateX(100%)", opacity: "0" }
5107
5292
  },
5108
5293
  // Scale animations
5109
5294
  scaleIn: {
5110
- from: { transform: "scale(0.95)", opacity: 0 },
5111
- to: { transform: "scale(1)", opacity: 1 }
5295
+ from: { transform: "scale(0.95)", opacity: "0" },
5296
+ to: { transform: "scale(1)", opacity: "1" }
5112
5297
  },
5113
5298
  scaleOut: {
5114
- from: { transform: "scale(1)", opacity: 1 },
5115
- to: { transform: "scale(0.95)", opacity: 0 }
5299
+ from: { transform: "scale(1)", opacity: "1" },
5300
+ to: { transform: "scale(0.95)", opacity: "0" }
5116
5301
  },
5117
5302
  scaleUp: {
5118
5303
  from: { transform: "scale(1)" },
@@ -5133,8 +5318,8 @@ var keyframes = {
5133
5318
  },
5134
5319
  // Pulse and bounce
5135
5320
  pulse: {
5136
- "0%, 100%": { opacity: 1 },
5137
- "50%": { opacity: 0.5 }
5321
+ "0%, 100%": { opacity: "1" },
5322
+ "50%": { opacity: "0.5" }
5138
5323
  },
5139
5324
  bounce: {
5140
5325
  "0%, 100%": {
@@ -5156,7 +5341,7 @@ var keyframes = {
5156
5341
  ping: {
5157
5342
  "75%, 100%": {
5158
5343
  transform: "scale(2)",
5159
- opacity: 0
5344
+ opacity: "0"
5160
5345
  }
5161
5346
  },
5162
5347
  // Accordion animations (for Radix UI)
@@ -6117,6 +6302,7 @@ var tokenSystemSummary = {
6117
6302
  var UI_COLORS = tailwindThemeColors;
6118
6303
 
6119
6304
  exports.ALERT_TOKENS = ALERT_TOKENS;
6305
+ exports.ARTIST_TOKENS = ARTIST_TOKENS;
6120
6306
  exports.BUTTON_TOKENS = BUTTON_TOKENS;
6121
6307
  exports.CARD_TOKENS = CARD_TOKENS;
6122
6308
  exports.CHECKBOX_TOKENS = CHECKBOX_TOKENS;