tailwind.config.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. /** @type {import('tailwindcss').Config} */
  2. module.exports = {
  3. content: [
  4. './app/**/*.{js,ts,jsx,tsx}',
  5. './components/**/*.{js,ts,jsx,tsx}',
  6. './lib/**/*.{js,ts,jsx,tsx}',
  7. '../packages/**/*.{js,ts,jsx,tsx}',
  8. ],
  9. darkMode: 'class',
  10. theme: {
  11. extend: {
  12. fontFamily: {
  13. sans: ['var(--font-inter)', '-apple-system', 'BlinkMacSystemFont', 'Segoe UI', 'Roboto', 'sans-serif'],
  14. mono: ['JetBrains Mono', 'Fira Code', 'monospace'],
  15. },
  16. colors: {
  17. // ── Semantic tokens (Tailwind references these) ──────────────────
  18. primary: {
  19. DEFAULT: '#2563EB',
  20. foreground: '#FFFFFF',
  21. },
  22. // ── Brand / Indigo palette ─────────────────────────────────────
  23. brand: {
  24. 50: '#EEF2FF',
  25. 100: '#E0E7FF',
  26. 200: '#C7D2FE',
  27. 300: '#A5B4FC',
  28. 400: '#818CF8',
  29. 500: '#6366F1',
  30. 600: '#4F46E5',
  31. 700: '#4338CA',
  32. 800: '#3730A3',
  33. 900: '#312E81',
  34. },
  35. // ── Surface / neutral slate palette ─────────────────────────────
  36. surface: {
  37. DEFAULT: '#0F1117',
  38. 50: '#F8FAFC',
  39. 100: '#F1F5F9',
  40. 200: '#E2E8F0',
  41. 300: '#CBD5E1',
  42. 400: '#94A3B8',
  43. 500: '#64748B',
  44. 600: '#475569',
  45. 700: '#334155',
  46. 800: '#1E293B',
  47. 900: '#0F172A',
  48. 950: '#0A0D14',
  49. },
  50. // ── Ink / text colors ─────────────────────────────────────────
  51. ink: {
  52. DEFAULT: '#F1F5F9',
  53. 50: '#F8FAFC',
  54. 100: '#F1F5F9',
  55. 200: '#E2E8F0',
  56. 300: '#CBD5E1',
  57. 400: '#94A3B8',
  58. 500: '#64748B',
  59. 600: '#475569',
  60. 700: '#334155',
  61. 800: '#1E293B',
  62. 900: '#0F172A',
  63. },
  64. // ── Status palette ─────────────────────────────────────────────
  65. success: '#22C55E',
  66. warning: '#F59E0B',
  67. danger: '#EF4444',
  68. info: '#3B82F6',
  69. },
  70. backgroundColor: {
  71. surface: '#0F1117',
  72. 'surface-50': '#F8FAFC',
  73. 'surface-100': '#F1F5F9',
  74. 'surface-200': '#E2E8F0',
  75. 'surface-300': '#CBD5E1',
  76. 'surface-400': '#94A3B8',
  77. 'surface-500': '#64748B',
  78. 'surface-600': '#475569',
  79. 'surface-700': '#334155',
  80. 'surface-800': '#1E293B',
  81. 'surface-900': '#0F172A',
  82. 'surface-950': '#0A0D14',
  83. },
  84. textColor: {
  85. ink: '#F1F5F9',
  86. 'ink-50': '#F8FAFC',
  87. 'ink-100': '#F1F5F9',
  88. 'ink-200': '#E2E8F0',
  89. 'ink-300': '#CBD5E1',
  90. 'ink-400': '#94A3B8',
  91. 'ink-500': '#64748B',
  92. 'ink-600': '#475569',
  93. 'ink-700': '#334155',
  94. 'ink-800': '#1E293B',
  95. 'ink-900': '#0F172A',
  96. },
  97. borderColor: {
  98. 'surface-DEFAULT': 'rgba(255,255,255,0.06)',
  99. 'surface-100': 'rgba(255,255,255,0.08)',
  100. 'surface-200': 'rgba(255,255,255,0.12)',
  101. 'surface-300': 'rgba(255,255,255,0.18)',
  102. 'surface-border': 'rgba(255,255,255,0.10)',
  103. },
  104. boxShadow: {
  105. 'card': '0 0 0 1px rgba(255,255,255,0.06), 0 2px 8px rgba(0,0,0,0.40)',
  106. 'card-hover':'0 0 0 1px rgba(99,102,241,0.40), 0 4px 16px rgba(0,0,0,0.50)',
  107. 'panel': '0 0 0 1px rgba(255,255,255,0.04), 0 8px 32px rgba(0,0,0,0.60)',
  108. 'btn-click': '0 1px 2px rgba(0,0,0,0.4) inset',
  109. 'glow-brand': '0 0 20px rgba(99,102,241,0.35)',
  110. 'glow-success': '0 0 16px rgba(34,197,94,0.40)',
  111. 'glow-danger': '0 0 16px rgba(239,68,68,0.40)',
  112. 'glow-warning': '0 0 16px rgba(245,158,11,0.40)',
  113. },
  114. animation: {
  115. 'fade-in': 'fadeIn 0.2s ease-out',
  116. 'slide-up': 'slideUp 0.3s ease-out',
  117. 'scale-in': 'scaleIn 0.15s ease-out',
  118. 'pulse-glow': 'pulseGlow 2s ease-in-out infinite',
  119. 'shimmer': 'shimmer 1.8s linear infinite',
  120. },
  121. keyframes: {
  122. fadeIn: {
  123. '0%': { opacity: '0' },
  124. '100%': { opacity: '1' },
  125. },
  126. slideUp: {
  127. '0%': { opacity: '0', transform: 'translateY(8px)' },
  128. '100%': { opacity: '1', transform: 'translateY(0)' },
  129. },
  130. scaleIn: {
  131. '0%': { opacity: '0', transform: 'scale(0.95)' },
  132. '100%': { opacity: '1', transform: 'scale(1)' },
  133. },
  134. pulseGlow: {
  135. '0%, 100%': { opacity: '0.4' },
  136. '50%': { opacity: '1' },
  137. },
  138. shimmer: {
  139. '0%': { backgroundPosition: '-200% 0' },
  140. '100%': { backgroundPosition: '200% 0' },
  141. },
  142. },
  143. borderRadius: {
  144. xl: '12px',
  145. '2xl': '16px',
  146. '3xl': '24px',
  147. '4xl': '32px',
  148. },
  149. spacing: {
  150. '18': '4.5rem',
  151. '88': '22rem',
  152. },
  153. backdropBlur: {
  154. xs: '2px',
  155. },
  156. transitionTimingFunction: {
  157. 'spring': 'cubic-bezier(0.16, 1, 0.3, 1)',
  158. },
  159. },
  160. },
  161. plugins: [],
  162. };