Sitemas menggunakan CSS Custom Properties (variables) untuk theming yang konsisten. Artikel ini adalah referensi lengkap semua tokens yang tersedia.
Lokasi File
| File | Fungsi |
|---|---|
src/styles/m3-tokens.css | M3 color, shape, motion tokens |
src/styles/global.css | Typography, spacing, layout |
src/styles/fonts.css | Font definitions |
Color Tokens
Primary Colors
:root {
--md-sys-color-primary: #7438D2;
--md-sys-color-on-primary: #FFFFFF;
--md-sys-color-primary-container: #EADDFF;
--md-sys-color-on-primary-container: #21005E;
--md-sys-color-inverse-primary: #CFBCFF;
}
[data-theme="dark"] {
--md-sys-color-primary: #CFBCFF;
--md-sys-color-on-primary: #381E72;
--md-sys-color-primary-container: #4F378B;
--md-sys-color-on-primary-container: #EADDFF;
} Secondary Colors
:root {
--md-sys-color-secondary: #625B71;
--md-sys-color-on-secondary: #FFFFFF;
--md-sys-color-secondary-container: #E8DEF8;
--md-sys-color-on-secondary-container: #1E192B;
} Tertiary Colors
:root {
--md-sys-color-tertiary: #7D5260;
--md-sys-color-on-tertiary: #FFFFFF;
--md-sys-color-tertiary-container: #FFD8E4;
--md-sys-color-on-tertiary-container: #370B1E;
} Surface Colors
:root {
--md-sys-color-surface: #FFFBFE;
--md-sys-color-surface-dim: #DED8E1;
--md-sys-color-surface-bright: #FFFBFE;
--md-sys-color-surface-container-lowest: #FFFFFF;
--md-sys-color-surface-container-low: #F7F2FA;
--md-sys-color-surface-container: #F3EDF7;
--md-sys-color-surface-container-high: #ECE6F0;
--md-sys-color-surface-container-highest: #E6E0E9;
--md-sys-color-on-surface: #1C1B1F;
--md-sys-color-on-surface-variant: #49454F;
} Error Colors
:root {
--md-sys-color-error: #B3261E;
--md-sys-color-on-error: #FFFFFF;
--md-sys-color-error-container: #F9DEDC;
--md-sys-color-on-error-container: #410E0B;
} Outline Colors
:root {
--md-sys-color-outline: #79747E;
--md-sys-color-outline-variant: #CAC4D0;
} Category Colors
:root {
--md-ext-color-dokumentasi: #8b5cf6;
--md-ext-color-tutorial: #3b82f6;
--md-ext-color-insight: #f59e0b;
--md-ext-color-tips: #10b981;
} Shape Tokens
Shape tokens mengontrol border-radius komponen.
:root {
/* Corner radius */
--md-sys-shape-corner-none: 0;
--md-sys-shape-corner-extra-small: 4px;
--md-sys-shape-corner-small: 8px;
--md-sys-shape-corner-medium: 12px;
--md-sys-shape-corner-large: 16px;
--md-sys-shape-corner-extra-large: 28px;
--md-sys-shape-corner-full: 9999px;
} Penggunaan:
.card {
border-radius: var(--md-sys-shape-corner-large);
}
.button {
border-radius: var(--md-sys-shape-corner-full);
}
Motion Tokens
Motion tokens mengontrol animasi dan transisi.
:root {
/* Duration */
--md-sys-motion-duration-short1: 50ms;
--md-sys-motion-duration-short2: 100ms;
--md-sys-motion-duration-short3: 150ms;
--md-sys-motion-duration-short4: 200ms;
--md-sys-motion-duration-medium1: 250ms;
--md-sys-motion-duration-medium2: 300ms;
--md-sys-motion-duration-medium3: 350ms;
--md-sys-motion-duration-medium4: 400ms;
--md-sys-motion-duration-long1: 450ms;
--md-sys-motion-duration-long2: 500ms;
/* Easing */
--md-sys-motion-easing-standard: cubic-bezier(0.2, 0, 0, 1);
--md-sys-motion-easing-standard-decelerate: cubic-bezier(0, 0, 0, 1);
--md-sys-motion-easing-standard-accelerate: cubic-bezier(0.3, 0, 1, 1);
--md-sys-motion-easing-emphasized: cubic-bezier(0.2, 0, 0, 1);
--md-sys-motion-easing-emphasized-decelerate: cubic-bezier(0.05, 0.7, 0.1, 1);
--md-sys-motion-easing-emphasized-accelerate: cubic-bezier(0.3, 0, 0.8, 0.15);
} Penggunaan:
.element {
transition: transform var(--md-sys-motion-duration-medium2)
var(--md-sys-motion-easing-emphasized);
}
Typography Tokens
:root {
/* Font Family */
--font-sans: 'Google Sans', system-ui, -apple-system, sans-serif;
--font-mono: 'JetBrains Mono', Consolas, monospace;
/* Font Sizes */
--font-size-xs: 0.75rem; /* 12px */
--font-size-sm: 0.875rem; /* 14px */
--font-size-base: 1rem; /* 16px */
--font-size-lg: 1.125rem; /* 18px */
--font-size-xl: 1.25rem; /* 20px */
--font-size-2xl: 1.5rem; /* 24px */
--font-size-3xl: 1.875rem; /* 30px */
--font-size-4xl: 2.25rem; /* 36px */
/* Font Weights */
--font-weight-normal: 400;
--font-weight-medium: 500;
--font-weight-semibold: 600;
--font-weight-bold: 700;
/* Line Heights */
--line-height-tight: 1.25;
--line-height-snug: 1.375;
--line-height-normal: 1.5;
--line-height-relaxed: 1.625;
--line-height-loose: 2;
/* Letter Spacing */
--letter-spacing-tight: -0.025em;
--letter-spacing-normal: 0;
--letter-spacing-wide: 0.025em;
} Spacing Tokens
:root {
--spacing-0: 0;
--spacing-1: 0.25rem; /* 4px */
--spacing-2: 0.5rem; /* 8px */
--spacing-3: 0.75rem; /* 12px */
--spacing-4: 1rem; /* 16px */
--spacing-5: 1.25rem; /* 20px */
--spacing-6: 1.5rem; /* 24px */
--spacing-8: 2rem; /* 32px */
--spacing-10: 2.5rem; /* 40px */
--spacing-12: 3rem; /* 48px */
--spacing-16: 4rem; /* 64px */
} Penggunaan:
.container {
padding: var(--spacing-4);
margin-bottom: var(--spacing-8);
gap: var(--spacing-2);
}
Layout Tokens
:root {
/* Navbar */
--navbar-height: 64px;
/* Sidebar */
--sidebar-width: 280px;
--sidebar-width-collapsed: 24px;
/* Content */
--content-max-width: 720px;
--article-max-width: 800px;
/* Z-index layers */
--z-dropdown: 100;
--z-sticky: 150;
--z-fixed: 200;
--z-modal-backdrop: 250;
--z-modal: 300;
--z-popover: 400;
--z-tooltip: 500;
} Legacy/Semantic Tokens
Untuk backward compatibility dan readability:
:root {
/* Colors */
--color-accent: var(--md-sys-color-primary);
--color-accent-subtle: var(--md-sys-color-primary-container);
--color-bg-primary: var(--md-sys-color-surface);
--color-bg-secondary: var(--md-sys-color-surface-container);
--color-bg-tertiary: var(--md-sys-color-surface-container-high);
--color-text-primary: var(--md-sys-color-on-surface);
--color-text-secondary: var(--md-sys-color-on-surface-variant);
--color-text-muted: var(--md-sys-color-outline);
--color-border: var(--md-sys-color-outline-variant);
/* Status colors */
--color-success: #10b981;
--color-warning: #f59e0b;
--color-error: var(--md-sys-color-error);
--color-info: #3b82f6;
/* Transitions */
--transition-fast: 150ms ease;
--transition-normal: 250ms ease;
--transition-slow: 400ms ease;
} Menggunakan Tokens
Dalam Komponen Astro
<style>
.my-button {
background: var(--md-sys-color-primary);
color: var(--md-sys-color-on-primary);
padding: var(--spacing-2) var(--spacing-4);
border-radius: var(--md-sys-shape-corner-full);
transition: all var(--md-sys-motion-duration-short4)
var(--md-sys-motion-easing-standard);
}
.my-button:hover {
background: var(--md-sys-color-primary-container);
color: var(--md-sys-color-on-primary-container);
}
</style>
Dalam Global CSS
/* src/styles/global.css */
body {
font-family: var(--font-sans);
background: var(--color-bg-primary);
color: var(--color-text-primary);
}
Dark Mode
Semua M3 tokens otomatis berubah di dark mode:
[data-theme="dark"] {
--md-sys-color-primary: #CFBCFF; /* Lighter in dark */
--md-sys-color-surface: #1C1B1F; /* Dark background */
--md-sys-color-on-surface: #E6E0E9; /* Light text */
/* ... dan seterusnya */
}
Anda tidak perlu menulis CSS terpisah untuk dark mode. Cukup gunakan tokens, dan warna akan menyesuaikan otomatis saat user toggle theme.
Menambahkan Token Baru
Untuk konsistensi, tambahkan custom tokens di m3-tokens.css:
:root {
/* Custom brand colors */
--brand-primary: #FF6B6B;
--brand-secondary: #4ECDC4;
/* Custom spacing */
--spacing-header: 80px;
}
[data-theme="dark"] {
--brand-primary: #FF8E8E;
--brand-secondary: #6EE7DE;
} Changelog
Lihat changelog dan roadmap pengembangan Sitemas.
Kesimpulan
CSS tokens memberikan konsistensi dan maintainability:
- Konsistensi — Semua komponen menggunakan nilai yang sama
- Theming — Ubah satu token, berubah di mana-mana
- Dark mode — Otomatis tanpa CSS terpisah
- Readability — Nama semantic lebih mudah dipahami
Gunakan tokens untuk semua nilai yang mungkin berulang. Hindari hardcode warna, ukuran, atau timing di komponen individual.