The Coline design system: accessible React components for Coline Apps, themed live by the host workspace, and for Coline Sites in light and dark. Tailwind v4 stylesheet included. MIT.
| 7 |
| * the sandbox bridge overwrites them with the host's live theme |
| 8 | * (ColineAppProvider.applyTheme), so components consume tokens only and |
| 9 | * the host owns appearance. |
| 10 | */ |
| 11 |
| 12 | @import "tailwindcss"; |
| 13 | @import "tw-animate-css"; |
| 14 | @import "./controls.css"; |
| 15 |
| 16 | @source "../components"; |
| 17 | @source "../provider.tsx"; |
| 18 | @source "../patterns"; |
| 19 | @source "../hooks"; |
| 20 | @source "../lib"; |
| 21 | /* App source is scanned per-app by the registration-time build (Phase 4 |
| 22 | ships first-party bundles; source-upload builds land in Phase 5+). */ |
| 23 |
| 24 | /* Ship the same Latin Geist face as Coline. The CLI inlines this local asset. */ |
| 25 | @font-face { |
| 26 | font-family: "Geist"; |
| 27 | font-style: normal; |
| 28 | font-weight: 100 900; |
| 29 | font-display: swap; |
| 30 | src: url("./fonts/geist-latin.woff2") format("woff2"); |
| 31 | } |
| 32 |
| 33 | @custom-variant dark (&:is(.dark *)); |
| 34 |
| 35 | @theme inline { |
| 36 | --font-sans: "Geist", ui-sans-serif, system-ui, sans-serif; |
| 37 | --color-background: var(--background); |
| 38 | --color-foreground: var(--foreground); |
| 39 | --color-card: var(--card); |
| 40 | --color-card-foreground: var(--card-foreground); |
| 41 | --color-popover: var(--popover); |
| 42 | --color-popover-foreground: var(--popover-foreground); |
| 43 | --color-primary: var(--primary); |
| 44 | --color-primary-foreground: var(--primary-foreground); |
| 45 | --color-secondary: var(--secondary); |
| 46 | --color-secondary-foreground: var(--secondary-foreground); |
| 47 | --color-muted: var(--muted); |
| 48 | --color-muted-foreground: var(--muted-foreground); |
| 49 | --color-accent: var(--accent); |
| 50 | --color-accent-foreground: var(--accent-foreground); |
| 51 | --color-destructive: var(--destructive); |
| 52 | --color-border: var(--border); |
| 53 | --color-input: var(--input); |
| 54 | --color-ring: var(--ring); |
| 55 | /* Status and data colors: the same semantic tokens as Coline itself. */ |
| 56 | --color-positive: var(--status-positive); |
| 57 | --color-positive-fg: var(--status-positive-fg); |
| 58 | --color-attention: var(--status-attention); |
| 59 | --color-attention-fg: var(--status-attention-fg); |
| 60 | --color-risk: var(--status-risk); |
| 61 | --color-risk-fg: var(--status-risk-fg); |
| 62 | --color-action: var(--action); |
| 63 | --color-chart-1: var(--chart-1); |
| 64 | --color-chart-2: var(--chart-2); |
| 65 | --color-chart-3: var(--chart-3); |
| 66 | --color-chart-4: var(--chart-4); |
| 67 | --color-chart-5: var(--chart-5); |
| 68 | --ease-out-quint: cubic-bezier(0.22, 1, 0.36, 1); |
| 69 | --ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1); |
| 70 | --radius-sm: calc(var(--radius) - 4px); |
| 71 | --radius-md: calc(var(--radius) - 2px); |
| 72 | --radius-lg: var(--radius); |
| 73 | --radius-xl: calc(var(--radius) + 4px); |
| 74 | --radius-2xl: calc(var(--radius) + 8px); |
| 75 | --radius-3xl: calc(var(--radius) + 12px); |
| 76 | --radius-4xl: calc(var(--radius) + 16px); |
| 77 | } |
| 78 |
| 79 | :root { |
| 80 | --background: oklch(1 0 0); |
| 81 | --foreground: oklch(0.141 0.005 285.823); |
| 82 | --card: oklch(1 0 0); |
| 83 | --card-foreground: oklch(0.141 0.005 285.823); |
| 84 | --popover: oklch(1 0 0); |
| 85 | --popover-foreground: oklch(0.141 0.005 285.823); |
| 86 | --primary: oklch(0.21 0.006 285.885); |
| 87 | --primary-foreground: oklch(0.985 0 0); |
| 88 | --secondary: oklch(0.967 0.001 286.375); |
| 89 | --secondary-foreground: oklch(0.21 0.006 285.885); |
| 90 | --muted: oklch(0.967 0.001 286.375); |
| 91 | --muted-foreground: oklch(0.552 0.016 285.938); |
| 92 | --accent: oklch(0.967 0.001 286.375); |
| 93 | --accent-foreground: oklch(0.21 0.006 285.885); |
| 94 | --destructive: oklch(0.577 0.245 27.325); |
| 95 | --border: oklch(0.92 0.004 286.32); |
| 96 | --input: oklch(0.92 0.004 286.32); |
| 97 | --ring: oklch(0.705 0.015 286.067); |
| 98 | --radius: 0.625rem; |
| 99 | --status-positive: #10b981; |
| 100 | --status-positive-fg: #059669; |
| 101 | --status-attention: #f59e0b; |
| 102 | --status-attention-fg: #d97706; |
| 103 | --status-risk: #f43f5e; |
| 104 | --status-risk-fg: #e11d48; |
| 105 | --action: oklch(0.6 0.19 255); |
| 106 | --chart-1: oklch(0.62 0.17 255); |
| 107 | --chart-2: oklch(0.66 0.15 155); |
| 108 | --chart-3: oklch(0.76 0.15 75); |
| 109 | --chart-4: oklch(0.64 0.2 300); |
| 110 | --chart-5: oklch(0.63 0.21 25); |
| 111 | } |
| 112 |
| 113 | .dark { |
| 114 | --background: oklch(0.141 0.005 285.823); |
| 115 | --foreground: oklch(0.985 0 0); |
| 116 | --card: oklch(0.21 0.006 285.885); |
| 117 | --card-foreground: oklch(0.985 0 0); |
| 118 | --popover: oklch(0.21 0.006 285.885); |
| 119 | --popover-foreground: oklch(0.985 0 0); |
| 120 | --primary: oklch(0.92 0.004 286.32); |
| 121 | --primary-foreground: oklch(0.21 0.006 285.885); |
| 122 | --secondary: oklch(0.274 0.006 286.033); |
| 123 | --secondary-foreground: oklch(0.985 0 0); |
| 124 | --muted: oklch(0.274 0.006 286.033); |
| 125 | --muted-foreground: oklch(0.705 0.015 286.067); |
| 126 | --accent: oklch(0.274 0.006 286.033); |
| 127 | --accent-foreground: oklch(0.985 0 0); |
| 128 | --destructive: oklch(0.704 0.191 22.216); |
| 129 | --border: oklch(1 0 0 / 10%); |
| 130 | --input: oklch(1 0 0 / 15%); |
| 131 | --ring: oklch(0.552 0.016 285.938); |
| 132 | --status-positive-fg: #34d399; |
| 133 | --status-attention-fg: #fbbf24; |
| 134 | --status-risk-fg: #fb7185; |
| 135 | --action: oklch(0.7 0.15 255); |
| 136 | } |
| 137 |
| 138 | @media (prefers-reduced-motion: reduce) { |
| 139 | *, |
| 140 | *::before, |
| 141 | *::after { |
| 142 | animation-duration: 0.01ms !important; |
| 143 | animation-iteration-count: 1 !important; |
| 144 | transition-duration: 0.01ms !important; |
| 145 | } |
| 146 | } |
| 147 |
| 148 | ::selection { |
| 149 | background: color-mix(in oklch, var(--action) 24%, transparent); |
| 150 | } |
| 151 |
| 152 | body { |
| 153 | margin: 0; |
| 154 | background: var(--background); |
| 155 | color: var(--foreground); |
| 156 | font-family: |
| 157 | "Geist", |
| 158 | ui-sans-serif, |
| 159 | system-ui, |
| 160 | -apple-system, |
| 161 | "Segoe UI", |
| 162 | sans-serif; |
| 163 | -webkit-font-smoothing: antialiased; |
| 164 | } |
| 165 |