/ src / styles / design-tokens.css
design-tokens.css
  1  /**
  2   * ACDC Design System - Design Tokens
  3   *
  4   * Core tokens are auto-generated from JSON. Additional patterns and utilities
  5   * are defined here.
  6   */
  7  
  8  /* Google Fonts Import - MUST be first */
  9  @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap');
 10  
 11  /* Import generated tokens (colors, spacing), then feel cascade */
 12  @import './generated-tokens.css';
 13  @import '../tokens/feel.css';
 14  
 15  /* =============================================================================
 16     TYPOGRAPHY ADDITIONS
 17     ============================================================================= */
 18  
 19  :root {
 20    /* Font Families */
 21    --font-display: "Inter", -apple-system, BlinkMacSystemFont, sans-serif;
 22    --font-body: "Inter", -apple-system, BlinkMacSystemFont, sans-serif;
 23    --font-mono: "JetBrains Mono", ui-monospace, "Cascadia Code", monospace;
 24  
 25    /* Type Scale */
 26    --text-display: 56px;
 27    --text-h1: 40px;
 28    --text-h2: 32px;
 29    --text-h3: 24px;
 30    --text-h4: 20px;
 31    --text-body-lg: 18px;
 32    --text-body: 16px;
 33    --text-body-sm: 14px;
 34    --text-caption: 12px;
 35    --text-mono: 14px;
 36    --text-mono-sm: 12px;
 37  
 38    /* Line Heights */
 39    --leading-display: 1.1;
 40    --leading-heading: 1.2;
 41    --leading-snug: 1.3;
 42    --leading-normal: 1.5;
 43    --leading-relaxed: 1.6;
 44  
 45    /* Font Weights */
 46    --font-regular: 400;
 47    --font-medium: 500;
 48    --font-semibold: 600;
 49    --font-bold: 700;
 50  
 51    /* Letter Spacing */
 52    --tracking-tighter: -0.02em;
 53    --tracking-tight: -0.01em;
 54    --tracking-normal: 0;
 55    --tracking-wide: 0.02em;
 56    --tracking-wider: 0.04em;
 57  }
 58  
 59  /* =============================================================================
 60     COMPONENT SPACING PATTERNS
 61     ============================================================================= */
 62  
 63  :root {
 64    /* Semantic Spacing Tokens */
 65    --space-xs: 4px;
 66    --space-sm: 8px;
 67    --space-md: 16px;
 68    --space-lg: 24px;
 69    --space-xl: 32px;
 70    --space-2xl: 48px;
 71    --space-3xl: 64px;
 72    --space-4xl: 96px;
 73    --space-5xl: 128px;
 74  
 75    /* Component Spacing Patterns */
 76    --card-padding: var(--space-lg);
 77    --card-padding-sm: var(--space-md);
 78    --card-padding-lg: var(--space-xl);
 79    --card-gap: var(--space-lg);
 80  
 81    --section-gap: var(--space-2xl);
 82    --page-padding: var(--space-xl);
 83    --page-padding-mobile: var(--space-md);
 84  
 85    --input-padding-y: var(--space-3);
 86    --input-padding-x: var(--space-md);
 87    --input-padding-y-sm: var(--space-2);
 88    --input-padding-y-lg: var(--space-md);
 89  
 90    --button-padding-y: var(--space-3);
 91    --button-padding-x: var(--space-md);
 92    --button-padding-y-sm: var(--space-1-5);
 93    --button-padding-x-sm: var(--space-3);
 94    --button-padding-y-lg: var(--space-4);
 95    --button-padding-x-lg: var(--space-lg);
 96  
 97    --label-gap: var(--space-sm);
 98    --form-field-gap: var(--space-xl);
 99    --inline-gap: var(--space-sm);
100    --stack-gap: var(--space-md);
101  
102    /* Breakpoints */
103    --screen-mobile: 375px;
104    --screen-tablet: 768px;
105    --screen-desktop: 1280px;
106    --screen-wide: 1536px;
107  
108    /* Container Max-Widths */
109    --container-mobile: 343px;
110    --container-tablet: 720px;
111    --container-desktop: 1200px;
112    --container-wide: 1440px;
113  }
114  
115  /* =============================================================================
116     COMPONENT RADIUS TOKENS
117     ============================================================================= */
118  
119  :root {
120    --radius-button: var(--radius-md);
121    --radius-button-sm: var(--radius-sm);
122    --radius-button-lg: var(--radius-lg);
123  
124    --radius-input: var(--radius-md);
125    --radius-input-lg: var(--radius-lg);
126  
127    --radius-card: var(--radius-xl);
128    --radius-card-sm: var(--radius-lg);
129    --radius-card-lg: var(--radius-2xl);
130  
131    --radius-badge: var(--radius-sm);
132    --radius-badge-pill: var(--radius-full);
133  
134    --radius-avatar: var(--radius-lg);
135    --radius-avatar-sm: var(--radius-md);
136    --radius-avatar-circle: var(--radius-full);
137  
138    --radius-modal: var(--radius-xl);
139    --radius-tooltip: var(--radius-md);
140    --radius-dropdown: var(--radius-lg);
141  }
142  
143  /* =============================================================================
144     FOCUS RINGS & SEMANTIC SHADOWS
145     ============================================================================= */
146  
147  :root {
148    /* Focus Rings */
149    --focus-ring-alpha: 0 0 0 2px var(--bg-primary), 0 0 0 4px var(--alpha-500);
150    --focus-ring-delta: 0 0 0 2px var(--bg-primary), 0 0 0 4px var(--delta-500);
151    --focus-ring-error: 0 0 0 2px var(--bg-primary), 0 0 0 4px var(--error);
152    --focus-ring-success: 0 0 0 2px var(--bg-primary), 0 0 0 4px var(--success);
153  
154    /* Semantic Shadow Tokens */
155    --shadow-card: var(--shadow-1);
156    --shadow-card-hover: var(--shadow-2);
157    --shadow-dropdown: var(--shadow-2);
158    --shadow-popover: var(--shadow-3);
159    --shadow-modal: var(--shadow-4);
160    --shadow-tooltip: var(--shadow-4);
161    --shadow-overlay: var(--shadow-5);
162  }
163  
164  /* =============================================================================
165     BUTTON COMPONENT TOKENS
166     ============================================================================= */
167  
168  :root {
169    /* Button Base */
170    --btn-font-weight: var(--font-medium);
171    --btn-transition: all 0.15s ease;
172  
173    /* Sizes */
174    --btn-height-sm: 32px;
175    --btn-height-md: 40px;
176    --btn-height-lg: 48px;
177  
178    --btn-font-size-sm: var(--text-caption);
179    --btn-font-size-md: var(--text-body-sm);
180    --btn-font-size-lg: var(--text-body);
181  
182    --btn-padding-x-sm: var(--space-3);
183    --btn-padding-x-md: var(--space-md);
184    --btn-padding-x-lg: var(--space-lg);
185  
186    --btn-radius-sm: var(--radius-sm);
187    --btn-radius-md: var(--radius-md);
188    --btn-radius-lg: var(--radius-lg);
189  
190    /* Primary Button Text */
191    --btn-primary-text: #FFFFFF;
192    --btn-primary-shadow-hover: var(--glow-alpha);
193  
194    /* Secondary */
195    --btn-secondary-bg: transparent;
196    --btn-secondary-border: var(--border-default);
197    --btn-secondary-text: var(--text-primary);
198  
199    /* Ghost */
200    --btn-ghost-bg: transparent;
201    --btn-ghost-bg-hover: var(--bg-tertiary);
202    --btn-ghost-text: var(--text-secondary);
203    --btn-ghost-text-hover: var(--text-primary);
204  
205    /* Destructive */
206    --btn-destructive-bg: var(--error);
207    --btn-destructive-bg-hover: var(--error-hover);
208    --btn-destructive-bg-active: var(--error-active);
209    --btn-destructive-text: #FFFFFF;
210    --btn-destructive-shadow-hover: 0 4px 16px rgba(239,68,68,0.2);
211  
212    /* Success */
213    --btn-success-bg: var(--success);
214    --btn-success-bg-hover: var(--success-hover);
215    --btn-success-bg-active: var(--success-active);
216    --btn-success-text: #FFFFFF;
217    --btn-success-shadow-hover: 0 4px 16px rgba(34,197,94,0.2);
218  }
219  
220  /* Delta Chain Button Context Override */
221  [data-chain="delta"] {
222    --btn-primary-shadow-hover: var(--glow-delta);
223  }
224  
225  /* =============================================================================
226     INPUT COMPONENT TOKENS
227     ============================================================================= */
228  
229  :root {
230    /* Input Base */
231    --input-bg: var(--bg-tertiary);
232    --input-border: var(--border-default);
233    --input-border-hover: var(--border-strong);
234    --input-text: var(--text-primary);
235    --input-placeholder: var(--text-tertiary);
236    --input-transition: all 0.15s ease;
237  
238    /* Sizes */
239    --input-height-sm: 36px;
240    --input-height-md: 44px;
241    --input-height-lg: 52px;
242  
243    --input-font-size-sm: var(--text-body-sm);
244    --input-font-size-md: var(--text-body-sm);
245    --input-font-size-lg: var(--text-body);
246  
247    /* States */
248    --input-border-error: var(--error);
249    --input-border-success: var(--success);
250    --input-focus-ring: var(--focus-ring-alpha);
251    --input-focus-ring-error: var(--focus-ring-error);
252    --input-focus-ring-success: var(--focus-ring-success);
253  
254    /* Disabled */
255    --input-disabled-opacity: 0.5;
256  }
257  
258  /* Delta Chain Input Context Override */
259  [data-chain="delta"] {
260    --input-focus-ring: var(--focus-ring-delta);
261  }
262  
263  /* =============================================================================
264     ANIMATION & TRANSITIONS
265     ============================================================================= */
266  
267  :root {
268    /* Durations */
269    --duration-instant: 0ms;
270    --duration-fast: 100ms;
271    --duration-normal: 150ms;
272    --duration-slow: 300ms;
273    --duration-slower: 500ms;
274  
275    /* Easings */
276    --ease-default: ease;
277    --ease-in: ease-in;
278    --ease-out: ease-out;
279    --ease-in-out: ease-in-out;
280    --ease-bounce: cubic-bezier(0.68, -0.55, 0.265, 1.55);
281  
282    /* Common Transitions */
283    --transition-colors: color var(--duration-normal) var(--ease-default),
284                         background-color var(--duration-normal) var(--ease-default),
285                         border-color var(--duration-normal) var(--ease-default);
286    --transition-shadow: box-shadow var(--duration-normal) var(--ease-default);
287    --transition-transform: transform var(--duration-normal) var(--ease-default);
288    --transition-all: all var(--duration-normal) var(--ease-default);
289  
290    /* Interactive States */
291    --hover-lift: translateY(-1px);
292    --hover-lift-sm: translateY(-2px);
293    --active-press: scale(0.98);
294    --active-press-sm: scale(0.96);
295  }
296  
297  /* =============================================================================
298     UTILITY CLASSES
299     ============================================================================= */
300  
301  /* Chain Context */
302  .chain-alpha { --chain-primary: var(--alpha-500); --chain-glow: var(--glow-alpha); }
303  .chain-delta { --chain-primary: var(--delta-500); --chain-glow: var(--glow-delta); }
304  
305  /* Text Utilities */
306  .text-display { font-size: var(--text-display); line-height: var(--leading-display); font-weight: var(--font-bold); letter-spacing: var(--tracking-tighter); }
307  .text-h1 { font-size: var(--text-h1); line-height: var(--leading-heading); font-weight: var(--font-bold); letter-spacing: var(--tracking-tighter); }
308  .text-h2 { font-size: var(--text-h2); line-height: var(--leading-heading); font-weight: var(--font-bold); letter-spacing: var(--tracking-tight); }
309  .text-h3 { font-size: var(--text-h3); line-height: var(--leading-snug); font-weight: var(--font-semibold); letter-spacing: var(--tracking-tight); }
310  .text-h4 { font-size: var(--text-h4); line-height: var(--leading-snug); font-weight: var(--font-semibold); }
311  .text-body-lg { font-size: var(--text-body-lg); line-height: var(--leading-relaxed); }
312  .text-body { font-size: var(--text-body); line-height: var(--leading-relaxed); }
313  .text-body-sm { font-size: var(--text-body-sm); line-height: var(--leading-normal); }
314  .text-caption { font-size: var(--text-caption); line-height: var(--leading-normal); font-weight: var(--font-medium); letter-spacing: var(--tracking-wide); }
315  .text-mono { font-family: var(--font-mono); font-size: var(--text-mono); }
316  .text-mono-sm { font-family: var(--font-mono); font-size: var(--text-mono-sm); }
317  
318  /* Color Utilities */
319  .text-primary { color: var(--text-primary); }
320  .text-secondary { color: var(--text-secondary); }
321  .text-tertiary { color: var(--text-tertiary); }
322  .text-alpha { color: var(--alpha-500); }
323  .text-delta { color: var(--delta-500); }
324  .text-success { color: var(--success); }
325  .text-error { color: var(--error); }
326  
327  .bg-primary { background-color: var(--bg-primary); }
328  .bg-secondary { background-color: var(--bg-secondary); }
329  .bg-tertiary { background-color: var(--bg-tertiary); }
330  .bg-elevated { background-color: var(--bg-elevated); }
331  
332  /* Border Utilities */
333  .border-subtle { border-color: var(--border-subtle); }
334  .border-default { border-color: var(--border-default); }
335  .border-strong { border-color: var(--border-strong); }
336  
337  /* Shadow Utilities */
338  .shadow-card { box-shadow: var(--shadow-1); }
339  .shadow-card-hover { box-shadow: var(--shadow-2); }
340  .glow-alpha { box-shadow: var(--glow-alpha); }
341  .glow-delta { box-shadow: var(--glow-delta); }
342  
343  /* Radius Utilities */
344  .rounded-card { border-radius: var(--radius-card); }
345  .rounded-card-sm { border-radius: var(--radius-card-sm); }
346  .rounded-card-lg { border-radius: var(--radius-card-lg); }
347  
348  /* =============================================================================
349     CARD SYSTEM
350     ============================================================================= */
351  
352  /* Card Base */
353  .card {
354    background: var(--bg-elevated);
355    border: 1px solid var(--border-subtle);
356    border-radius: var(--radius-card);
357    padding: var(--card-padding);
358    box-shadow: var(--shadow-card);
359    transition: var(--transition-all);
360  }
361  
362  .card-sm { padding: var(--card-padding-sm); }
363  .card-lg { padding: var(--card-padding-lg); }
364  
365  /* Interactive Card */
366  .card-interactive {
367    cursor: pointer;
368  }
369  .card-interactive:hover {
370    box-shadow: var(--shadow-card-hover);
371    transform: var(--hover-lift-sm);
372  }
373  
374  /* Featured Card - with chain glow */
375  .card-featured[data-chain="alpha"] {
376    border-color: rgba(43, 135, 255, 0.4);
377  }
378  .card-featured[data-chain="alpha"]:hover {
379    box-shadow: var(--glow-alpha);
380  }
381  .card-featured[data-chain="delta"] {
382    border-color: rgba(245, 158, 11, 0.4);
383  }
384  .card-featured[data-chain="delta"]:hover {
385    box-shadow: var(--glow-delta);
386  }
387  
388  /* Selected Card */
389  .card-selected[data-chain="alpha"] {
390    border-color: var(--alpha-500);
391    box-shadow: var(--glow-alpha);
392  }
393  .card-selected[data-chain="delta"] {
394    border-color: var(--delta-500);
395    box-shadow: var(--glow-delta);
396  }
397  
398  /* Disabled Card */
399  .card-disabled {
400    opacity: 0.5;
401    pointer-events: none;
402  }
403  
404  /* Card Anatomy */
405  .card-header {
406    padding: var(--card-padding);
407    border-bottom: 1px solid var(--border-subtle);
408    display: flex;
409    align-items: center;
410    justify-content: space-between;
411  }
412  
413  .card-body {
414    padding: var(--card-padding);
415  }
416  
417  .card-footer {
418    padding: var(--card-padding);
419    border-top: 1px solid var(--border-subtle);
420    background: var(--bg-secondary);
421  }
422  
423  /* Stat Card */
424  .stat-card-label {
425    font-size: var(--text-caption);
426    text-transform: uppercase;
427    letter-spacing: var(--tracking-wide);
428    color: var(--text-tertiary);
429    margin-bottom: var(--space-sm);
430  }
431  .stat-card-value {
432    font-size: var(--text-h2);
433    font-weight: var(--font-bold);
434    font-family: var(--font-mono);
435  }
436  .stat-card-change {
437    font-size: var(--text-body-sm);
438    font-family: var(--font-mono);
439  }
440  .stat-card-change.positive { color: var(--success); }
441  .stat-card-change.negative { color: var(--error); }
442  
443  /* List Item Card */
444  .list-item-card {
445    padding: var(--space-md);
446    border-radius: var(--radius-lg);
447  }
448  
449  /* Transaction Card Icon */
450  .tx-icon {
451    width: 40px;
452    height: 40px;
453    border-radius: var(--radius-lg);
454    display: flex;
455    align-items: center;
456    justify-content: center;
457  }
458  .tx-icon[data-chain="alpha"] {
459    background: rgba(43, 135, 255, 0.1);
460    color: var(--alpha-500);
461  }
462  .tx-icon[data-chain="delta"] {
463    background: rgba(245, 158, 11, 0.1);
464    color: var(--delta-500);
465  }
466  
467  /* =============================================================================
468     CONTAINER PATTERNS
469     ============================================================================= */
470  
471  /* Page Container */
472  .page-container {
473    max-width: var(--container-desktop);
474    margin: 0 auto;
475    padding: var(--page-padding);
476  }
477  @media (max-width: 768px) {
478    .page-container { padding: var(--page-padding-mobile); }
479  }
480  
481  /* Section */
482  .section {
483    margin-bottom: var(--section-gap);
484  }
485  .section-header {
486    display: flex;
487    align-items: center;
488    justify-content: space-between;
489    margin-bottom: var(--space-lg);
490  }
491  .section-title {
492    font-size: var(--text-h4);
493    font-weight: var(--font-semibold);
494  }
495  
496  /* Sidebar */
497  .sidebar {
498    width: 280px;
499    background: var(--bg-secondary);
500    border-right: 1px solid var(--border-subtle);
501    padding: var(--space-lg);
502  }
503  
504  /* Modal */
505  .modal-backdrop {
506    position: fixed;
507    inset: 0;
508    background: rgba(0, 0, 0, 0.6);
509    z-index: var(--z-modal-backdrop);
510  }
511  .modal {
512    position: fixed;
513    top: 50%;
514    left: 50%;
515    transform: translate(-50%, -50%);
516    width: 100%;
517    max-width: 448px;
518    background: var(--bg-elevated);
519    border-radius: var(--radius-modal);
520    border: 1px solid var(--border-subtle);
521    box-shadow: var(--shadow-modal);
522    padding: var(--space-xl);
523    z-index: var(--z-modal);
524  }
525  
526  /* Dropdown */
527  .dropdown {
528    min-width: 192px;
529    background: var(--bg-elevated);
530    border: 1px solid var(--border-subtle);
531    border-radius: var(--radius-dropdown);
532    box-shadow: var(--shadow-dropdown);
533    padding: var(--space-sm) 0;
534    z-index: var(--z-dropdown);
535  }
536  .dropdown-item {
537    padding: var(--space-sm) var(--space-md);
538    font-size: var(--text-body-sm);
539    color: var(--text-secondary);
540    cursor: pointer;
541    transition: var(--transition-colors);
542  }
543  .dropdown-item:hover {
544    background: var(--bg-tertiary);
545  }
546  .dropdown-item.danger {
547    color: var(--error);
548  }
549  
550  /* =============================================================================
551     LOADING & EMPTY STATES
552     ============================================================================= */
553  
554  /* Skeleton */
555  .skeleton {
556    background: var(--bg-tertiary);
557    border-radius: var(--radius-md);
558    animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
559  }
560  @keyframes pulse {
561    0%, 100% { opacity: 1; }
562    50% { opacity: 0.5; }
563  }
564  
565  /* Empty State */
566  .empty-state {
567    text-align: center;
568    padding: var(--space-2xl) var(--space-lg);
569  }
570  .empty-state-icon {
571    width: 64px;
572    height: 64px;
573    margin: 0 auto var(--space-md);
574    background: var(--bg-tertiary);
575    border-radius: var(--radius-2xl);
576    display: flex;
577    align-items: center;
578    justify-content: center;
579    font-size: 24px;
580  }