@usetheo/ui 0.35.3 → 0.36.0

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.
@@ -0,0 +1,88 @@
1
+ @import "./fonts.css";
2
+ @import "./tokens.css";
3
+
4
+ @tailwind base;
5
+ @tailwind components;
6
+ @tailwind utilities;
7
+
8
+ @layer base {
9
+ * {
10
+ border-color: hsl(var(--border));
11
+ }
12
+
13
+ html {
14
+ font-family: var(--font-body);
15
+ -webkit-font-smoothing: antialiased;
16
+ -moz-osx-font-smoothing: grayscale;
17
+ text-rendering: optimizeLegibility;
18
+ }
19
+
20
+ body {
21
+ background-color: hsl(var(--background));
22
+ color: hsl(var(--foreground));
23
+ /* OpenType ligatures globally — Geist's "liga" feature is structural
24
+ * and gives the Vercel-tight glyph combinations. */
25
+ font-feature-settings: "liga" 1, "ss01" 1;
26
+ }
27
+
28
+ /* Display headings inherit theme display font (Geist by default).
29
+ * Per-size tracking is set in tailwind.config.ts; this is the safety net. */
30
+ h1,
31
+ h2,
32
+ h3,
33
+ h4 {
34
+ font-family: var(--font-display);
35
+ font-weight: 600;
36
+ }
37
+
38
+ /* Code surfaces: use the mono token + tabular numerals so columns of
39
+ * numbers line up in tables/logs/metrics. */
40
+ code,
41
+ pre,
42
+ kbd,
43
+ samp {
44
+ font-family: var(--font-mono);
45
+ font-feature-settings: "tnum" 1, "liga" 1;
46
+ }
47
+
48
+ /* Focus ring — violet (signature) */
49
+ :focus-visible {
50
+ outline: 2px solid hsl(var(--ring));
51
+ outline-offset: 2px;
52
+ }
53
+
54
+ /* Selection — soft violet */
55
+ ::selection {
56
+ background-color: hsl(var(--primary) / 0.25);
57
+ color: hsl(var(--foreground));
58
+ }
59
+
60
+ /* Native scrollbar fallback (Violet Forge).
61
+ * Used for native browser scroll on elements that don't wrap in <ScrollArea>.
62
+ * Components that DO use <ScrollArea> hide the native scrollbar via Radix.
63
+ */
64
+ *::-webkit-scrollbar {
65
+ width: 10px;
66
+ height: 10px;
67
+ }
68
+ *::-webkit-scrollbar-track {
69
+ background: transparent;
70
+ }
71
+ *::-webkit-scrollbar-thumb {
72
+ background-color: hsl(var(--primary) / 0.25);
73
+ border: 2px solid transparent;
74
+ background-clip: content-box;
75
+ border-radius: 9999px;
76
+ transition: background-color var(--duration-fast) var(--ease-out-soft);
77
+ }
78
+ *::-webkit-scrollbar-thumb:hover {
79
+ background-color: hsl(var(--primary) / 0.5);
80
+ }
81
+ *::-webkit-scrollbar-thumb:active {
82
+ background-color: hsl(var(--primary) / 0.75);
83
+ }
84
+ * {
85
+ scrollbar-width: thin;
86
+ scrollbar-color: hsl(var(--primary) / 0.3) transparent;
87
+ }
88
+ }
@@ -0,0 +1,137 @@
1
+ /* Theo UI — Tailwind v4 prebuilt entry stylesheet.
2
+ *
3
+ * What ships at `@theokit/ui/styles.css` since RFC 0008 follow-up
4
+ * (`0.5.1-next.0`). Consumer imports this once and the framework's
5
+ * Tailwind v4 build picks up:
6
+ * - `@import "tailwindcss"` — Tailwind v4 core (preflight + utilities)
7
+ * - `@import "./fonts.css"` — self-hosted Geist + Geist Mono @font-face
8
+ * - `@import "./tokens.css"` — runtime `--*` vars (theme cascade target)
9
+ * - `@import "./tokens-v4.css"` — `@theme { --color-*, --text-*, … }`
10
+ * namespace Tailwind v4 reads to emit utilities
11
+ * - `@layer base` — `border-color`, body font, focus ring, scrollbar
12
+ * styling that depend on the runtime vars
13
+ *
14
+ * v3-only consumers (Tailwind 3.x + the shadcn registry preset) should
15
+ * load `@theokit/ui/styles-v3-legacy.css` instead — that file is the
16
+ * unchanged `@tailwind base; @tailwind components; @tailwind utilities`
17
+ * variant. See RFC 0008 follow-up.
18
+ */
19
+
20
+ @import "tailwindcss";
21
+ @import "./fonts.css";
22
+ @import "./tokens.css";
23
+ @import "./tokens-v4.css";
24
+
25
+ @layer base {
26
+ * {
27
+ border-color: hsl(var(--border));
28
+ }
29
+
30
+ /* Tailwind v4 preflight regression compensation —
31
+ * v4 intentionally dropped the `button { cursor: pointer }` rule
32
+ * (https://tailwindcss.com/docs/upgrade-guide#default-button-cursor)
33
+ * so every native <button> renders with the default arrow cursor.
34
+ *
35
+ * Library authors are expected to opt in explicitly per button. The
36
+ * Violet Forge `<Button>` primitive does so (see its CVA). For the
37
+ * dozens of native <button> elements composites render directly,
38
+ * we restore the v3 behavior here — scoped to *interactive* buttons:
39
+ *
40
+ * - `:not(:disabled)` skips the HTML `disabled` attribute path
41
+ * (browser already shows `cursor: default` for disabled, but the
42
+ * rule below stays explicit for clarity).
43
+ * - `:not([aria-disabled="true"])` skips the ARIA-disabled path
44
+ * (where the button stays focusable but acts as no-op).
45
+ *
46
+ * This is an EXPLICIT opt-in by the library author for consumers who
47
+ * imported `@theokit/ui/styles.css` — it does NOT alter Tailwind's
48
+ * global preflight, only this stylesheet's @layer base.
49
+ */
50
+ button:not(:disabled):not([aria-disabled="true"]),
51
+ [role="button"]:not([aria-disabled="true"]) {
52
+ cursor: pointer;
53
+ }
54
+
55
+ html {
56
+ font-family: var(--font-body);
57
+ -webkit-font-smoothing: antialiased;
58
+ -moz-osx-font-smoothing: grayscale;
59
+ text-rendering: optimizeLegibility;
60
+ }
61
+
62
+ body {
63
+ background-color: hsl(var(--background));
64
+ color: hsl(var(--foreground));
65
+ /* OpenType ligatures globally — Geist's "liga" feature is structural
66
+ * and gives the Vercel-tight glyph combinations. */
67
+ font-feature-settings: "liga" 1, "ss01" 1;
68
+ }
69
+
70
+ /* Display headings inherit theme display font (Geist by default).
71
+ * Per-size tracking is set in tokens-v4.css; this is the safety net. */
72
+ h1,
73
+ h2,
74
+ h3,
75
+ h4 {
76
+ font-family: var(--font-display);
77
+ font-weight: 600;
78
+ }
79
+
80
+ /* Code surfaces: use the mono token + tabular numerals so columns of
81
+ * numbers line up in tables/logs/metrics. */
82
+ code,
83
+ pre,
84
+ kbd,
85
+ samp {
86
+ font-family: var(--font-mono);
87
+ font-feature-settings: "tnum" 1, "liga" 1;
88
+ }
89
+
90
+ /* Focus ring — violet (signature) */
91
+ :focus-visible {
92
+ outline: 2px solid hsl(var(--ring));
93
+ outline-offset: 2px;
94
+ }
95
+
96
+ /* Selection — soft violet */
97
+ ::selection {
98
+ background-color: hsl(var(--primary) / 0.25);
99
+ color: hsl(var(--foreground));
100
+ }
101
+
102
+ /* Native scrollbar fallback (Violet Forge).
103
+ * Used for native browser scroll on elements that don't wrap in <ScrollArea>.
104
+ * Components that DO use <ScrollArea> hide the native scrollbar via Radix.
105
+ */
106
+ *::-webkit-scrollbar {
107
+ width: 10px;
108
+ height: 10px;
109
+ }
110
+ *::-webkit-scrollbar-track {
111
+ background: transparent;
112
+ }
113
+ *::-webkit-scrollbar-thumb {
114
+ background-color: hsl(var(--primary) / 0.25);
115
+ border: 2px solid transparent;
116
+ background-clip: content-box;
117
+ border-radius: 9999px;
118
+ transition: background-color var(--duration-fast) var(--ease-out-soft);
119
+ }
120
+ *::-webkit-scrollbar-thumb:hover {
121
+ background-color: hsl(var(--primary) / 0.5);
122
+ }
123
+ *::-webkit-scrollbar-thumb:active {
124
+ background-color: hsl(var(--primary) / 0.75);
125
+ }
126
+ * {
127
+ scrollbar-width: thin;
128
+ scrollbar-color: hsl(var(--primary) / 0.3) transparent;
129
+ }
130
+ }
131
+
132
+ /* RFC 0008 follow-up #2 — pre-compiled utility rules. The bytes here
133
+ * are emitted at build time by `scripts/build-precompiled-css.ts` so
134
+ * consumers do not depend on Tailwind v4 `@source` scanning the
135
+ * library's node_modules tree (which breaks under pnpm symlinks).
136
+ */
137
+ @import "./components.css";
@@ -0,0 +1,223 @@
1
+ /* Theo UI — Tailwind v4 theme aliases.
2
+ *
3
+ * Companion to `tokens.css`. The base file declares the v3-style runtime
4
+ * variables (`--primary`, `--background`, …) that `<ThemeProvider>` and
5
+ * `[data-theme]` cascades mutate at runtime. This file declares the
6
+ * Tailwind v4 `@theme` namespace (`--color-primary`, `--color-background`,
7
+ * …) by aliasing back to those runtime vars via `hsl(var(--*))`.
8
+ *
9
+ * Why two layers:
10
+ * - `<ThemeProvider>` (and the 10 built-in themes) sets `--primary`
11
+ * etc. at runtime — that's the theme switch surface.
12
+ * - Tailwind v4 resolves color utilities exclusively through
13
+ * `--color-*` tokens declared in `@theme`. Without these aliases
14
+ * `bg-primary`, `text-muted-foreground`, `border-border`, etc. emit
15
+ * a className with no matching CSS rule.
16
+ *
17
+ * The indirection (`--color-primary: var(--primary)`) preserves the
18
+ * runtime theme cascade — browsers resolve `var(--color-primary)` →
19
+ * `var(--primary)` → current `[data-theme]` value at paint time.
20
+ *
21
+ * See RFC 0008 follow-up.
22
+ */
23
+
24
+ /* `@theme inline` (Tailwind v4 keyword) preserves the var() reference at
25
+ * runtime instead of inlining the value at build time. Without `inline`,
26
+ * `--color-primary: var(--primary)` would resolve to whatever `--primary`
27
+ * was when Tailwind compiled the CSS — breaking the theme cascade.
28
+ * See https://tailwindcss.com/docs/theme#using-your-theme-variables-in-arbitrary-values
29
+ */
30
+ @theme inline {
31
+ /* Color tokens ------------------------------------------------------ */
32
+ --color-background: var(--background);
33
+ --color-foreground: var(--foreground);
34
+
35
+ --color-card: var(--card);
36
+ --color-card-foreground: var(--card-foreground);
37
+
38
+ --color-popover: var(--popover);
39
+ --color-popover-foreground: var(--popover-foreground);
40
+
41
+ --color-primary: var(--primary);
42
+ --color-primary-deep: var(--primary-deep);
43
+ --color-primary-glow: var(--primary-glow);
44
+ --color-primary-foreground: var(--primary-foreground);
45
+
46
+ --color-secondary: var(--secondary);
47
+ --color-secondary-foreground: var(--secondary-foreground);
48
+
49
+ --color-accent: var(--accent);
50
+ --color-accent-deep: var(--accent-deep);
51
+ --color-accent-foreground: var(--accent-foreground);
52
+
53
+ --color-muted: var(--muted);
54
+ --color-muted-foreground: var(--muted-foreground);
55
+
56
+ --color-border: var(--border);
57
+ --color-input: var(--input);
58
+ --color-ring: var(--ring);
59
+
60
+ --color-success: var(--success);
61
+ --color-success-foreground: var(--success-foreground);
62
+ --color-warning: var(--warning);
63
+ --color-warning-foreground: var(--warning-foreground);
64
+ --color-destructive: var(--destructive);
65
+ --color-destructive-foreground: var(--destructive-foreground);
66
+ --color-info: var(--info);
67
+ --color-info-foreground: var(--info-foreground);
68
+
69
+ /* Status group (D4) ------------------------------------------------- */
70
+ --color-status-online: var(--status-online);
71
+ --color-status-online-foreground: var(--status-online-foreground);
72
+ --color-status-offline: var(--status-offline);
73
+ --color-status-offline-foreground: var(--status-offline-foreground);
74
+ --color-status-degraded: var(--status-degraded);
75
+ --color-status-degraded-foreground: var(--status-degraded-foreground);
76
+ --color-status-info: var(--status-info);
77
+ --color-status-info-foreground: var(--status-info-foreground);
78
+
79
+ /* Fonts ------------------------------------------------------------- */
80
+ --font-display: var(--font-display);
81
+ --font-sans: var(--font-body);
82
+ --font-mono: var(--font-mono);
83
+
84
+ /* Violet Forge typescale -------------------------------------------- *
85
+ * Compound text utilities: each `--text-{name}` declares the size,
86
+ * with companion `--*--line-height`, `--*--letter-spacing`, and
87
+ * `--*--font-weight` properties Tailwind v4 picks up automatically.
88
+ */
89
+ --text-display-2xl: 64px;
90
+ --text-display-2xl--line-height: 1;
91
+ --text-display-2xl--letter-spacing: -0.0464em;
92
+ --text-display-2xl--font-weight: 600;
93
+
94
+ --text-display-xl: 48px;
95
+ --text-display-xl--line-height: 1.05;
96
+ --text-display-xl--letter-spacing: -0.05em;
97
+ --text-display-xl--font-weight: 600;
98
+
99
+ --text-display-lg: 40px;
100
+ --text-display-lg--line-height: 1.1;
101
+ --text-display-lg--letter-spacing: -0.05em;
102
+ --text-display-lg--font-weight: 600;
103
+
104
+ --text-display-md: 32px;
105
+ --text-display-md--line-height: 1.2;
106
+ --text-display-md--letter-spacing: -0.04em;
107
+ --text-display-md--font-weight: 600;
108
+
109
+ --text-headline: 28px;
110
+ --text-headline--line-height: 1.25;
111
+ --text-headline--letter-spacing: -0.035em;
112
+ --text-headline--font-weight: 600;
113
+
114
+ --text-title-lg: 24px;
115
+ --text-title-lg--line-height: 1.33;
116
+ --text-title-lg--letter-spacing: -0.04em;
117
+ --text-title-lg--font-weight: 600;
118
+
119
+ --text-title-md: 20px;
120
+ --text-title-md--line-height: 1.4;
121
+ --text-title-md--letter-spacing: -0.03em;
122
+ --text-title-md--font-weight: 600;
123
+
124
+ --text-body-lg: 18px;
125
+ --text-body-lg--line-height: 1.56;
126
+ --text-body-lg--letter-spacing: -0.01em;
127
+ --text-body-lg--font-weight: 400;
128
+
129
+ --text-body-md: 14px;
130
+ --text-body-md--line-height: 1.43;
131
+ --text-body-md--letter-spacing: 0;
132
+ --text-body-md--font-weight: 400;
133
+
134
+ --text-body-sm: 13px;
135
+ --text-body-sm--line-height: 1.46;
136
+ --text-body-sm--font-weight: 400;
137
+
138
+ --text-label: 14px;
139
+ --text-label--line-height: 1.43;
140
+ --text-label--font-weight: 500;
141
+
142
+ --text-label-caps: 12px;
143
+ --text-label-caps--line-height: 1.33;
144
+ --text-label-caps--letter-spacing: 0.04em;
145
+ --text-label-caps--font-weight: 500;
146
+
147
+ --text-code-md: 14px;
148
+ --text-code-md--line-height: 1.5;
149
+ --text-code-md--font-weight: 400;
150
+
151
+ --text-code-sm: 13px;
152
+ --text-code-sm--line-height: 1.54;
153
+ --text-code-sm--font-weight: 500;
154
+
155
+ /* Radii — Tailwind v4 reads the value directly (no var indirection). */
156
+ --radius-none: 0px;
157
+ --radius-sm: 4px;
158
+ --radius-md: 6px;
159
+ --radius-lg: 10px;
160
+ --radius-xl: 14px;
161
+ --radius-2xl: 20px;
162
+ --radius-full: 9999px;
163
+
164
+ /* Shadows — alias to tokens.css computed values (which already use
165
+ * `hsl(var(--foreground) / …)` so theme-switch keeps them in step). */
166
+ --shadow-sm: var(--shadow-sm);
167
+ --shadow-md: var(--shadow-md);
168
+ --shadow-lg: var(--shadow-lg);
169
+ --shadow-glow: var(--shadow-glow);
170
+ --shadow-glow-strong: var(--shadow-glow-strong);
171
+
172
+ /* Motion ------------------------------------------------------------ */
173
+ --ease-out-soft: var(--ease-out-soft);
174
+ --ease-snap: var(--ease-snap);
175
+
176
+ /* Container queries (T5.5) — Tailwind v4 native @container support.
177
+ * Sizes drive `@<size>:<utility>` variants for container-relative responsive
178
+ * design (components that adapt to their parent's width, not the viewport).
179
+ * Default sizes mirror Tailwind v4 defaults; declared explicitly so the
180
+ * preset ships consistent values.
181
+ */
182
+ --container-3xs: 16rem;
183
+ --container-2xs: 18rem;
184
+ --container-xs: 20rem;
185
+ --container-sm: 24rem;
186
+ --container-md: 28rem;
187
+ --container-lg: 32rem;
188
+ --container-xl: 36rem;
189
+ --container-2xl: 42rem;
190
+ --container-3xl: 48rem;
191
+ --container-4xl: 56rem;
192
+ --container-5xl: 64rem;
193
+ --container-6xl: 72rem;
194
+ --container-7xl: 80rem;
195
+
196
+ /* Animations — declare so `animate-fade-in-up` and `animate-pulse-glow`
197
+ * resolve. Keyframes are declared below (outside @theme — Tailwind v4
198
+ * picks them up via the @keyframes namespace).
199
+ */
200
+ --animate-fade-in-up: fade-in-up var(--duration-base) var(--ease-out-soft) both;
201
+ --animate-pulse-glow: pulse-glow 1.5s var(--ease-in-out) infinite;
202
+ }
203
+
204
+ @keyframes fade-in-up {
205
+ 0% {
206
+ opacity: 0;
207
+ transform: translateY(8px);
208
+ }
209
+ 100% {
210
+ opacity: 1;
211
+ transform: translateY(0);
212
+ }
213
+ }
214
+
215
+ @keyframes pulse-glow {
216
+ 0%,
217
+ 100% {
218
+ box-shadow: 0 0 0 0 color-mix(in oklch, var(--primary) 50%, transparent);
219
+ }
220
+ 50% {
221
+ box-shadow: 0 0 0 8px transparent;
222
+ }
223
+ }