@warmio/design 1.5.1 → 1.6.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.
Files changed (45) hide show
  1. package/LICENSES/{inter-OFL-1.1.txt → source-serif-4-OFL-1.1.txt} +1 -1
  2. package/README.md +2 -2
  3. package/components.css +111 -82
  4. package/dist/logo.js +2 -2
  5. package/fonts/source-serif-4-cyrillic-ext-wght-italic.woff2 +0 -0
  6. package/fonts/source-serif-4-cyrillic-ext-wght-normal.woff2 +0 -0
  7. package/fonts/source-serif-4-cyrillic-wght-italic.woff2 +0 -0
  8. package/fonts/source-serif-4-cyrillic-wght-normal.woff2 +0 -0
  9. package/fonts/source-serif-4-greek-wght-italic.woff2 +0 -0
  10. package/fonts/source-serif-4-greek-wght-normal.woff2 +0 -0
  11. package/fonts/source-serif-4-latin-ext-wght-italic.woff2 +0 -0
  12. package/fonts/source-serif-4-latin-ext-wght-normal.woff2 +0 -0
  13. package/fonts/source-serif-4-latin-wght-italic.woff2 +0 -0
  14. package/fonts/source-serif-4-latin-wght-normal.woff2 +0 -0
  15. package/fonts/source-serif-4-vietnamese-wght-italic.woff2 +0 -0
  16. package/fonts/source-serif-4-vietnamese-wght-normal.woff2 +0 -0
  17. package/fonts.css +65 -195
  18. package/interfaces.css +4 -1
  19. package/package.json +1 -1
  20. package/theme.css +4 -4
  21. package/LICENSES/geist-OFL-1.1.txt +0 -93
  22. package/fonts/geist-cyrillic-ext-wght-italic.woff2 +0 -0
  23. package/fonts/geist-cyrillic-ext-wght-normal.woff2 +0 -0
  24. package/fonts/geist-cyrillic-wght-italic.woff2 +0 -0
  25. package/fonts/geist-cyrillic-wght-normal.woff2 +0 -0
  26. package/fonts/geist-latin-ext-wght-italic.woff2 +0 -0
  27. package/fonts/geist-latin-ext-wght-normal.woff2 +0 -0
  28. package/fonts/geist-latin-wght-italic.woff2 +0 -0
  29. package/fonts/geist-latin-wght-normal.woff2 +0 -0
  30. package/fonts/geist-vietnamese-wght-italic.woff2 +0 -0
  31. package/fonts/geist-vietnamese-wght-normal.woff2 +0 -0
  32. package/fonts/inter-cyrillic-ext-wght-italic.woff2 +0 -0
  33. package/fonts/inter-cyrillic-ext-wght-normal.woff2 +0 -0
  34. package/fonts/inter-cyrillic-wght-italic.woff2 +0 -0
  35. package/fonts/inter-cyrillic-wght-normal.woff2 +0 -0
  36. package/fonts/inter-greek-ext-wght-italic.woff2 +0 -0
  37. package/fonts/inter-greek-ext-wght-normal.woff2 +0 -0
  38. package/fonts/inter-greek-wght-italic.woff2 +0 -0
  39. package/fonts/inter-greek-wght-normal.woff2 +0 -0
  40. package/fonts/inter-latin-ext-wght-italic.woff2 +0 -0
  41. package/fonts/inter-latin-ext-wght-normal.woff2 +0 -0
  42. package/fonts/inter-latin-wght-italic.woff2 +0 -0
  43. package/fonts/inter-latin-wght-normal.woff2 +0 -0
  44. package/fonts/inter-vietnamese-wght-italic.woff2 +0 -0
  45. package/fonts/inter-vietnamese-wght-normal.woff2 +0 -0
@@ -1,4 +1,4 @@
1
- Copyright 2016 The Inter Project Authors (https://github.com/rsms/inter) Inter-Italic[opsz,wght].ttf: Copyright 2016 The Inter Project Authors (https://github.com/rsms/inter)
1
+ Google Inc.
2
2
 
3
3
  This Font Software is licensed under the SIL Open Font License, Version 1.1.
4
4
  This license is copied below, and is also available with a FAQ at:
package/README.md CHANGED
@@ -14,8 +14,8 @@ import { Button, ButtonLink } from '@warmio/design/button';
14
14
  import { Logo, WarmLogoIcon } from '@warmio/design/logo';
15
15
  ```
16
16
 
17
- The default product typefaces are Geist and Geist Mono. The `font-editorial`
18
- utility uses Inter and should be reserved for deliberate editorial accents.
17
+ The product typefaces are Geist Mono for default UI and Source Serif 4 for
18
+ headings (`h1`–`h6`). Do not add a third family.
19
19
 
20
20
  `--accent-solid` / `--accent-solid-text` are the chromatic accent for links,
21
21
  badges, and highlights. They derive from `--brand-accent-solid` in `themes.css`.
package/components.css CHANGED
@@ -41,12 +41,12 @@
41
41
  /* border handled by variant shadows/tokens; no default regression border */
42
42
  }
43
43
 
44
-
45
44
  [data-warm-button]:focus-visible {
46
- box-shadow: 0 0 0 var(--button-focus-ring) color-mix(in oklab, var(--ring) var(--button-mix-50), transparent);
45
+ box-shadow: 0 0 0 var(--button-focus-ring)
46
+ color-mix(in oklab, var(--ring) var(--button-mix-50), transparent);
47
47
  }
48
48
 
49
- [data-warm-button][data-width="full"] {
49
+ [data-warm-button][data-width='full'] {
50
50
  width: var(--button-width-full);
51
51
  }
52
52
 
@@ -65,78 +65,78 @@
65
65
  }
66
66
 
67
67
  /* Variants (from cva + overrides + edge; tokens for color/shadow/radius) */
68
- [data-warm-button][data-variant="default"] {
68
+ [data-warm-button][data-variant='default'] {
69
69
  background-color: var(--button-primary-bg);
70
70
  background-image: var(--button-primary-gradient);
71
71
  color: var(--button-primary-foreground);
72
72
  box-shadow: var(--button-primary-shadow);
73
73
  /* no explicit border to avoid regression; shadow provides chrome */
74
74
  }
75
- [data-warm-button][data-variant="default"]:hover {
75
+ [data-warm-button][data-variant='default']:hover {
76
76
  background-color: var(--button-primary-hover);
77
77
  background-image: var(--button-primary-gradient-hover);
78
78
  }
79
- [data-warm-button][data-variant="default"]:active {
79
+ [data-warm-button][data-variant='default']:active {
80
80
  background-color: var(--button-primary-active);
81
81
  }
82
82
 
83
- [data-warm-button][data-variant="outline"] {
83
+ [data-warm-button][data-variant='outline'] {
84
84
  background-color: var(--background);
85
85
  box-shadow: var(--button-outline-shadow);
86
86
  border-style: none;
87
87
  }
88
- [data-warm-button][data-variant="outline"]:hover {
88
+ [data-warm-button][data-variant='outline']:hover {
89
89
  background-color: var(--muted);
90
90
  color: var(--foreground);
91
91
  }
92
- .dark [data-warm-button][data-variant="outline"] {
92
+ .dark [data-warm-button][data-variant='outline'] {
93
93
  background-color: var(--warm-surface-raised-dark, var(--input));
94
94
  box-shadow: var(--button-outline-shadow-inset);
95
95
  }
96
- .dark [data-warm-button][data-variant="outline"]:hover {
96
+ .dark [data-warm-button][data-variant='outline']:hover {
97
97
  background-color: var(--warm-surface-raised-hover-dark, var(--muted));
98
98
  }
99
- [data-warm-button][data-variant="outline"]:disabled {
99
+ [data-warm-button][data-variant='outline']:disabled {
100
100
  opacity: 1;
101
101
  background-color: var(--muted);
102
102
  color: var(--muted-foreground);
103
103
  box-shadow: var(--button-outline-shadow);
104
104
  }
105
- .dark [data-warm-button][data-variant="outline"]:disabled {
105
+ .dark [data-warm-button][data-variant='outline']:disabled {
106
106
  background-color: color-mix(in oklab, var(--input) var(--button-mix-20), transparent);
107
107
  box-shadow: var(--button-outline-shadow-inset);
108
108
  }
109
109
 
110
- [data-warm-button][data-variant="ghost"] {
110
+ [data-warm-button][data-variant='ghost'] {
111
111
  /* `background-color` (not the `background` shorthand): the shorthand
112
112
  implicitly resets `background-clip` to its initial `border-box`,
113
113
  diverging from the base recipe's `padding-box` (origin: `bg-clip-padding`
114
114
  with no resting-state Tailwind `bg-*` utility on ghost). */
115
115
  background-color: transparent;
116
116
  }
117
- [data-warm-button][data-variant="ghost"]:hover {
117
+ [data-warm-button][data-variant='ghost']:hover {
118
118
  background-color: var(--muted);
119
119
  color: var(--foreground);
120
120
  }
121
- .dark [data-warm-button][data-variant="ghost"]:hover {
121
+ .dark [data-warm-button][data-variant='ghost']:hover {
122
122
  background-color: color-mix(in oklab, var(--muted) var(--button-mix-50), transparent);
123
123
  }
124
124
 
125
- [data-warm-button][data-variant="destructive"] {
125
+ [data-warm-button][data-variant='destructive'] {
126
126
  background-color: color-mix(in oklab, var(--destructive) var(--button-mix-10), transparent);
127
127
  color: var(--destructive);
128
128
  }
129
- [data-warm-button][data-variant="destructive"]:hover {
129
+ [data-warm-button][data-variant='destructive']:hover {
130
130
  background-color: color-mix(in oklab, var(--destructive) var(--button-mix-20), transparent);
131
131
  }
132
- .dark [data-warm-button][data-variant="destructive"] {
132
+ .dark [data-warm-button][data-variant='destructive'] {
133
133
  background-color: color-mix(in oklab, var(--destructive) var(--button-mix-20), transparent);
134
134
  }
135
- .dark [data-warm-button][data-variant="destructive"]:hover {
135
+ .dark [data-warm-button][data-variant='destructive']:hover {
136
136
  background-color: color-mix(in oklab, var(--destructive) var(--button-mix-30), transparent);
137
137
  }
138
138
 
139
- [data-warm-button][data-variant="apple"] {
139
+ [data-warm-button][data-variant='apple'] {
140
140
  /* `!important` on color/background: legacy's `buttonVariantClasses.apple`
141
141
  overlay always applies after any presentation overlay in `cn()` order
142
142
  (e.g. promptCategory's own `bg-background`/`text-foreground`,
@@ -152,51 +152,58 @@
152
152
  color: var(--apple-button-foreground) !important;
153
153
  box-shadow: var(--button-outline-shadow);
154
154
  }
155
- button[data-warm-button][data-variant="apple"] {
155
+ button[data-warm-button][data-variant='apple'] {
156
156
  appearance: button;
157
157
  background-clip: padding-box;
158
158
  }
159
- [data-warm-button][data-variant="apple"]:hover {
160
- background-color: color-mix(in oklab, var(--apple-button-hover) var(--button-mix-90), transparent);
159
+ [data-warm-button][data-variant='apple']:hover {
160
+ background-color: color-mix(
161
+ in oklab,
162
+ var(--apple-button-hover) var(--button-mix-90),
163
+ transparent
164
+ );
161
165
  color: var(--apple-button-foreground);
162
166
  }
163
- [data-warm-button][data-variant="arrow"] {
167
+ [data-warm-button][data-variant='arrow'] {
164
168
  border-width: 0;
165
169
  text-decoration: underline;
166
170
  text-underline-offset: var(--button-underline-offset);
167
171
  }
168
- [data-warm-button][data-variant="arrow"] svg {
172
+ [data-warm-button][data-variant='arrow'] svg {
169
173
  width: var(--button-icon-size);
170
174
  height: var(--button-icon-size);
171
175
  transition: transform calc(var(--motion-duration-fast) * 2);
172
176
  }
173
- [data-warm-button][data-variant="arrow"]:hover svg {
174
- transform: translate(calc(var(--motion-distance-sm) / 2), calc(-1 * var(--motion-distance-sm) / 2));
177
+ [data-warm-button][data-variant='arrow']:hover svg {
178
+ transform: translate(
179
+ calc(var(--motion-distance-sm) / 2),
180
+ calc(-1 * var(--motion-distance-sm) / 2)
181
+ );
175
182
  }
176
183
  @media (prefers-reduced-motion: reduce) {
177
- [data-warm-button][data-variant="arrow"]:hover svg {
184
+ [data-warm-button][data-variant='arrow']:hover svg {
178
185
  transform: none;
179
186
  transition: none;
180
187
  }
181
188
  }
182
189
 
183
190
  /* Sizes (public only; presentation overrides suppressed by explicit size via data attr, matches old resolveButton) */
184
- [data-warm-button][data-size="default"] {
191
+ [data-warm-button][data-size='default'] {
185
192
  height: var(--button-height-default);
186
193
  padding-left: var(--button-padding-x);
187
194
  padding-right: var(--button-padding-x);
188
195
  gap: var(--button-gap);
189
196
  }
190
- [data-warm-button][data-size="jumbo"] {
197
+ [data-warm-button][data-size='jumbo'] {
191
198
  height: var(--button-height-jumbo);
192
- padding-left: var(--button-padding-x);
193
- padding-right: var(--button-padding-x);
199
+ padding-left: var(--button-padding-x-lg);
200
+ padding-right: var(--button-padding-x-lg);
194
201
  font-size: var(--button-font-size-jumbo);
195
202
  font-weight: 700;
196
203
  line-height: var(--button-line-height-jumbo);
197
204
  gap: var(--button-gap);
198
205
  }
199
- [data-warm-button][data-size="icon"] {
206
+ [data-warm-button][data-size='icon'] {
200
207
  width: var(--button-height-icon);
201
208
  height: var(--button-height-icon);
202
209
  }
@@ -204,45 +211,47 @@ button[data-warm-button][data-variant="apple"] {
204
211
  buttonInputAlignmentClasses.default = 'bg-clip-border py-2'); this only
205
212
  applies when the caller passes size="default" explicitly, never when
206
213
  'default' is reached through presentation-driven implicit sizing. */
207
- [data-warm-button][data-size="default"][data-explicit-size] {
214
+ [data-warm-button][data-size='default'][data-explicit-size] {
208
215
  padding-top: var(--button-padding-y-md);
209
216
  padding-bottom: var(--button-padding-y-md);
210
217
  background-clip: border-box;
211
218
  }
212
219
 
213
220
  /* Presentations: private legacy maps drive resolve to public data-size; geometry only when !data-explicit-size. Exact from old buttonPresentationClasses + primitive sizes (icon-round=36px etc) + edge + variants. */
214
- [data-warm-button][data-presentation="assistantIcon"]:not([data-explicit-size]) {
221
+ [data-warm-button][data-presentation='assistantIcon']:not([data-explicit-size]) {
215
222
  width: var(--button-size-xs);
216
223
  height: var(--button-size-xs);
217
224
  padding: var(--button-padding-y-md);
218
225
  }
219
- [data-warm-button][data-presentation="assistantIcon"]:not([data-explicit-size]):active:not([aria-haspopup]) {
226
+ [data-warm-button][data-presentation='assistantIcon']:not([data-explicit-size]):active:not(
227
+ [aria-haspopup]
228
+ ) {
220
229
  transform: scale(0.9);
221
230
  }
222
231
  @media (prefers-reduced-motion: reduce) {
223
- [data-warm-button][data-presentation="assistantIcon"]:not([data-explicit-size]):active:not(
224
- [aria-haspopup]
225
- ) {
232
+ [data-warm-button][data-presentation='assistantIcon']:not([data-explicit-size]):active:not(
233
+ [aria-haspopup]
234
+ ) {
226
235
  transform: none;
227
236
  }
228
237
  }
229
- [data-warm-button][data-presentation="assistantRoundIcon"]:not([data-explicit-size]) {
238
+ [data-warm-button][data-presentation='assistantRoundIcon']:not([data-explicit-size]) {
230
239
  /* old icon-round 36px */
231
240
  width: var(--button-height-icon);
232
241
  height: var(--button-height-icon);
233
242
  }
234
- [data-warm-button][data-presentation="composerIcon"]:not([data-explicit-size]) {
243
+ [data-warm-button][data-presentation='composerIcon']:not([data-explicit-size]) {
235
244
  width: var(--button-size-sm);
236
245
  height: var(--button-size-sm);
237
246
  padding: var(--button-padding-y-md);
238
247
  }
239
- [data-warm-button][data-presentation="editPill"]:not([data-explicit-size]) {
248
+ [data-warm-button][data-presentation='editPill']:not([data-explicit-size]) {
240
249
  /* old sm 32px */
241
250
  height: var(--button-size-md);
242
251
  padding-left: var(--button-padding-x);
243
252
  padding-right: var(--button-padding-x);
244
253
  }
245
- [data-warm-button][data-presentation="hero"]:not([data-explicit-size]) {
254
+ [data-warm-button][data-presentation='hero']:not([data-explicit-size]) {
246
255
  height: var(--button-size-lg);
247
256
  padding-left: var(--button-padding-x);
248
257
  padding-right: var(--button-padding-x);
@@ -253,7 +262,7 @@ button[data-warm-button][data-variant="apple"] {
253
262
  line-height: var(--button-line-height-base);
254
263
  background-clip: border-box;
255
264
  }
256
- [data-warm-button][data-presentation="promptCategory"]:not([data-explicit-size]) {
265
+ [data-warm-button][data-presentation='promptCategory']:not([data-explicit-size]) {
257
266
  height: var(--button-height-default);
258
267
  gap: var(--button-gap);
259
268
  background-color: var(--background);
@@ -268,7 +277,7 @@ button[data-warm-button][data-variant="apple"] {
268
277
  important modifier) to every `default`-variant promptCategory button
269
278
  regardless of explicit/implicit sizing, overriding the default variant's
270
279
  own gradient shadow unconditionally; mirror that with `!important` here. */
271
- [data-warm-button][data-presentation="promptCategory"][data-variant="default"] {
280
+ [data-warm-button][data-presentation='promptCategory'][data-variant='default'] {
272
281
  box-shadow: var(--shadow-xs) !important;
273
282
  }
274
283
  /* buttonPresentationClasses.promptCategory's own (non-!important) `shadow-xs`
@@ -276,13 +285,15 @@ button[data-warm-button][data-variant="apple"] {
276
285
  branch), and only survives the cascade for variants without their own
277
286
  later shadow override — arrow forces `shadow-none` and must keep winning;
278
287
  default is already covered, unconditionally, by the rule above. */
279
- [data-warm-button][data-presentation="promptCategory"]:not([data-explicit-size]):not([data-variant="arrow"]) {
288
+ [data-warm-button][data-presentation='promptCategory']:not([data-explicit-size]):not(
289
+ [data-variant='arrow']
290
+ ) {
280
291
  box-shadow: var(--shadow-xs) !important;
281
292
  }
282
- [data-warm-button][data-presentation="promptCategory"]:hover {
293
+ [data-warm-button][data-presentation='promptCategory']:hover {
283
294
  background-color: var(--muted);
284
295
  }
285
- [data-warm-button][data-presentation="promptOption"]:not([data-explicit-size]) {
296
+ [data-warm-button][data-presentation='promptOption']:not([data-explicit-size]) {
286
297
  height: auto;
287
298
  min-height: var(--button-min-height-option);
288
299
  align-items: flex-start;
@@ -291,15 +302,15 @@ button[data-warm-button][data-variant="apple"] {
291
302
  padding: var(--button-padding-x);
292
303
  font-size: var(--button-font-size);
293
304
  }
294
- [data-warm-button][data-presentation="sidebarIcon"]:not([data-explicit-size]) {
305
+ [data-warm-button][data-presentation='sidebarIcon']:not([data-explicit-size]) {
295
306
  color: var(--sidebar-foreground);
296
307
  background-clip: border-box;
297
308
  }
298
- [data-warm-button][data-presentation="sidebarIcon"]:hover {
309
+ [data-warm-button][data-presentation='sidebarIcon']:hover {
299
310
  background-color: var(--sidebar-accent);
300
311
  color: var(--sidebar-accent-foreground);
301
312
  }
302
- [data-warm-button][data-presentation="tableHeader"]:not([data-explicit-size]) {
313
+ [data-warm-button][data-presentation='tableHeader']:not([data-explicit-size]) {
303
314
  height: auto;
304
315
  min-height: 0;
305
316
  width: var(--button-width-full);
@@ -314,19 +325,19 @@ button[data-warm-button][data-variant="apple"] {
314
325
  line-height: var(--button-line-height);
315
326
  color: var(--muted-foreground);
316
327
  }
317
- [data-warm-button][data-presentation="tableHeader"]:hover {
328
+ [data-warm-button][data-presentation='tableHeader']:hover {
318
329
  background-color: transparent;
319
330
  color: var(--foreground);
320
331
  }
321
- [data-warm-button][data-presentation="touch"]:not([data-explicit-size]) {
332
+ [data-warm-button][data-presentation='touch']:not([data-explicit-size]) {
322
333
  min-height: var(--button-min-height-touch);
323
334
  }
324
- [data-warm-button][data-presentation="threadMore"]:not([data-explicit-size]) {
335
+ [data-warm-button][data-presentation='threadMore']:not([data-explicit-size]) {
325
336
  width: var(--button-size-xs);
326
337
  height: var(--button-size-xs);
327
338
  padding: 0;
328
339
  }
329
- [data-warm-button][data-presentation="threadNew"]:not([data-explicit-size]) {
340
+ [data-warm-button][data-presentation='threadNew']:not([data-explicit-size]) {
330
341
  height: var(--button-size-md);
331
342
  justify-content: flex-start;
332
343
  gap: var(--button-gap);
@@ -335,10 +346,10 @@ button[data-warm-button][data-variant="apple"] {
335
346
  font-size: var(--button-font-size);
336
347
  font-weight: 400;
337
348
  }
338
- [data-warm-button][data-presentation="threadNew"]:hover {
349
+ [data-warm-button][data-presentation='threadNew']:hover {
339
350
  background-color: var(--muted);
340
351
  }
341
- [data-warm-button][data-presentation="compact"]:not([data-explicit-size]) {
352
+ [data-warm-button][data-presentation='compact']:not([data-explicit-size]) {
342
353
  height: var(--button-size-md);
343
354
  padding-left: var(--button-padding-x-sm);
344
355
  padding-right: var(--button-padding-x-sm);
@@ -350,13 +361,13 @@ button[data-warm-button][data-variant="apple"] {
350
361
  `[data-size="default"][data-explicit-size]` rule below only fires once a
351
362
  caller passes size="default" explicitly, so implicit 'default'/'controlPeer'
352
363
  need their own copy of the same two properties). */
353
- [data-warm-button][data-presentation="default"]:not([data-explicit-size]),
354
- [data-warm-button][data-presentation="controlPeer"]:not([data-explicit-size]) {
364
+ [data-warm-button][data-presentation='default']:not([data-explicit-size]),
365
+ [data-warm-button][data-presentation='controlPeer']:not([data-explicit-size]) {
355
366
  padding-top: var(--button-padding-y-md);
356
367
  padding-bottom: var(--button-padding-y-md);
357
368
  background-clip: border-box;
358
369
  }
359
- [data-warm-button][data-presentation="menuOption"]:not([data-explicit-size]) {
370
+ [data-warm-button][data-presentation='menuOption']:not([data-explicit-size]) {
360
371
  /* old option min-height/auto 64px */
361
372
  height: auto;
362
373
  min-height: var(--button-min-height-option);
@@ -379,7 +390,7 @@ button[data-warm-button][data-variant="apple"] {
379
390
  specificity of the `:not([data-explicit-size])` presentation rules and the
380
391
  `[data-size][data-explicit-size]` size rule above, so this later rule wins
381
392
  the cascade instead of losing on specificity. */
382
- [data-warm-button][data-variant="arrow"][data-variant="arrow"] {
393
+ [data-warm-button][data-variant='arrow'][data-variant='arrow'] {
383
394
  height: auto;
384
395
  padding: 0;
385
396
  gap: var(--button-gap);
@@ -405,11 +416,11 @@ button[data-warm-button][data-variant="apple"] {
405
416
  pointer-events: none;
406
417
  flex-shrink: 0;
407
418
  }
408
- [data-warm-button] svg:not([class*="size-"]) {
419
+ [data-warm-button] svg:not([class*='size-']) {
409
420
  width: var(--button-icon-size);
410
421
  height: var(--button-icon-size);
411
422
  }
412
- [data-warm-button][data-size="jumbo"] svg:not([class*="size-"]) {
423
+ [data-warm-button][data-size='jumbo'] svg:not([class*='size-']) {
413
424
  width: var(--button-icon-size-jumbo);
414
425
  height: var(--button-icon-size-jumbo);
415
426
  }
@@ -424,7 +435,7 @@ button[data-warm-button][data-variant="apple"] {
424
435
  private `lg` behavior. `:not([data-explicit-size])` also raises this rule's
425
436
  specificity above the plain jumbo rule above, so it wins unconditionally
426
437
  whenever it matches. */
427
- [data-warm-button][data-presentation="hero"]:not([data-explicit-size]) svg:not([class*="size-"]) {
438
+ [data-warm-button][data-presentation='hero']:not([data-explicit-size]) svg:not([class*='size-']) {
428
439
  width: var(--button-icon-size);
429
440
  height: var(--button-icon-size);
430
441
  }
@@ -434,26 +445,30 @@ button[data-warm-button][data-variant="apple"] {
434
445
  (`[&_svg:not([class*='size-'])]:size-5`) carries one more selector
435
446
  component than arrow's (`[&_svg]:size-4`), so jumbo's larger glyph size
436
447
  wins whenever both apply (verified against the real compiled recipe). */
437
- [data-warm-button][data-variant="arrow"] svg {
448
+ [data-warm-button][data-variant='arrow'] svg {
438
449
  width: var(--button-icon-size);
439
450
  height: var(--button-icon-size);
440
451
  }
441
452
  /* icon-xs primitive size (assistantIcon, threadMore) shrinks the icon glyph;
442
453
  suppressed when the caller passes an explicit public size. */
443
- [data-warm-button][data-presentation="assistantIcon"]:not([data-explicit-size]) svg:not([class*="size-"]),
444
- [data-warm-button][data-presentation="threadMore"]:not([data-explicit-size]) svg:not([class*="size-"]) {
454
+ [data-warm-button][data-presentation='assistantIcon']:not([data-explicit-size])
455
+ svg:not([class*='size-']),
456
+ [data-warm-button][data-presentation='threadMore']:not([data-explicit-size])
457
+ svg:not([class*='size-']) {
445
458
  width: var(--button-icon-size-xs);
446
459
  height: var(--button-icon-size-xs);
447
460
  }
448
461
  /* Aria states (from cva aria-invalid + aria-expanded + dark) */
449
462
  [data-warm-button][aria-invalid] {
450
- box-shadow: 0 0 0 var(--button-focus-ring) color-mix(in oklab, var(--destructive) var(--button-mix-20), transparent);
463
+ box-shadow: 0 0 0 var(--button-focus-ring)
464
+ color-mix(in oklab, var(--destructive) var(--button-mix-20), transparent);
451
465
  }
452
466
  .dark [data-warm-button][aria-invalid] {
453
- box-shadow: 0 0 0 var(--button-focus-ring) color-mix(in oklab, var(--destructive) var(--button-mix-40), transparent);
467
+ box-shadow: 0 0 0 var(--button-focus-ring)
468
+ color-mix(in oklab, var(--destructive) var(--button-mix-40), transparent);
454
469
  }
455
- [data-warm-button][data-variant="ghost"][aria-expanded="true"],
456
- [data-warm-button][data-variant="outline"][aria-expanded="true"] {
470
+ [data-warm-button][data-variant='ghost'][aria-expanded='true'],
471
+ [data-warm-button][data-variant='outline'][aria-expanded='true'] {
457
472
  background-color: var(--muted);
458
473
  color: var(--foreground);
459
474
  }
@@ -463,8 +478,8 @@ button[data-warm-button][data-variant="apple"] {
463
478
  pointer-events: none;
464
479
  opacity: 0.5;
465
480
  }
466
- [data-warm-button][data-variant="apple"]:disabled,
467
- [data-warm-button][data-variant="outline"]:disabled {
481
+ [data-warm-button][data-variant='apple']:disabled,
482
+ [data-warm-button][data-variant='outline']:disabled {
468
483
  opacity: 1;
469
484
  }
470
485
 
@@ -480,16 +495,30 @@ button[data-warm-button][data-variant="apple"] {
480
495
  letter-spacing: var(--logo-letter-spacing);
481
496
  }
482
497
  svg[data-warm-logo] {
483
- display: inline-block;
484
- vertical-align: middle;
498
+ display: block;
485
499
  fill: currentColor;
486
500
  flex-shrink: 0;
487
501
  }
488
- [data-warm-logo][data-size="badge"] svg[data-warm-logo] { width: var(--logo-size-badge); height: var(--logo-size-badge); }
489
- [data-warm-logo][data-size="default"] svg[data-warm-logo] { width: var(--logo-size-default); height: var(--logo-size-default); }
490
- [data-warm-logo][data-size="feature"] svg[data-warm-logo] { width: var(--logo-size-feature); height: var(--logo-size-feature); }
491
- [data-warm-logo][data-size="hero"] svg[data-warm-logo] { width: var(--logo-size-hero); height: var(--logo-size-hero); }
492
-
493
- [data-warm-logo][data-tone="foreground"] { color: var(--foreground); }
494
- [data-warm-logo][data-tone="sidebar"] { color: var(--sidebar-foreground); }
502
+ [data-warm-logo][data-size='badge'] svg[data-warm-logo] {
503
+ width: var(--logo-size-badge);
504
+ height: var(--logo-size-badge);
505
+ }
506
+ [data-warm-logo][data-size='default'] svg[data-warm-logo] {
507
+ width: var(--logo-size-default);
508
+ height: var(--logo-size-default);
509
+ }
510
+ [data-warm-logo][data-size='feature'] svg[data-warm-logo] {
511
+ width: var(--logo-size-feature);
512
+ height: var(--logo-size-feature);
513
+ }
514
+ [data-warm-logo][data-size='hero'] svg[data-warm-logo] {
515
+ width: var(--logo-size-hero);
516
+ height: var(--logo-size-hero);
517
+ }
495
518
 
519
+ [data-warm-logo][data-tone='foreground'] {
520
+ color: var(--foreground);
521
+ }
522
+ [data-warm-logo][data-tone='sidebar'] {
523
+ color: var(--sidebar-foreground);
524
+ }
package/dist/logo.js CHANGED
@@ -1,9 +1,9 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import * as React from 'react';
3
- const WShape = (_jsxs("g", { fill: "currentColor", children: [_jsx("path", { d: "M 33.500 40.660 C 20.206 42.744, 0 48.560, -0 50.302 C -0 51.759, 123.955 348.889, 127.738 356.500 C 142.182 385.561, 169.450 410.275, 198.946 421.040 C 218.922 428.330, 243.683 430.825, 264.526 427.648 C 277.151 425.724, 294.628 420.011, 294.194 417.952 C 293.790 416.040, 172.732 124.599, 168.522 115.405 C 161.779 100.679, 149.168 84.171, 135.093 71.646 C 119.358 57.644, 98.880 47.362, 77 42.478 C 69.645 40.836, 40.220 39.606, 33.500 40.660" }), _jsx("path", { d: "M 229.651 41.597 C 217.916 43.718, 202.443 49.144, 202.744 51.035 C 203.418 55.268, 329.689 356.584, 333.687 363.500 C 340.525 375.327, 345.293 381.483, 355.408 391.538 C 374.603 410.619, 398.878 423.014, 425.907 427.533 C 439.649 429.831, 463.594 429.132, 476 426.072 C 489.892 422.645, 497.188 419.815, 496.703 418.043 C 495.416 413.331, 371.058 116.094, 367.406 109 C 349.467 74.149, 313.008 47.875, 273.752 41.509 C 262.281 39.648, 240.195 39.693, 229.651 41.597" }), _jsx("path", { d: "M 463 40.593 C 451.670 42.545, 447.288 43.569, 439 46.203 C 433.775 47.864, 429.338 49.372, 429.140 49.555 C 428.942 49.737, 434.670 64.021, 441.868 81.297 C 455.574 114.190, 462.215 131.660, 468.447 151.208 C 475.360 172.892, 486.124 186.213, 503.834 194.997 C 530.956 208.450, 564.982 201.679, 583.654 179.112 C 604.399 154.041, 605.407 121.944, 586.291 95.155 C 567.827 69.280, 539.107 50.114, 508 42.907 C 500.680 41.212, 494.713 40.644, 482 40.434 C 472.925 40.284, 464.375 40.356, 463 40.593" })] }));
3
+ const WShape = (_jsxs("g", { fill: "currentColor", transform: "translate(0 108)", children: [_jsx("path", { d: "M 33.500 40.660 C 20.206 42.744, 0 48.560, -0 50.302 C -0 51.759, 123.955 348.889, 127.738 356.500 C 142.182 385.561, 169.450 410.275, 198.946 421.040 C 218.922 428.330, 243.683 430.825, 264.526 427.648 C 277.151 425.724, 294.628 420.011, 294.194 417.952 C 293.790 416.040, 172.732 124.599, 168.522 115.405 C 161.779 100.679, 149.168 84.171, 135.093 71.646 C 119.358 57.644, 98.880 47.362, 77 42.478 C 69.645 40.836, 40.220 39.606, 33.500 40.660" }), _jsx("path", { d: "M 229.651 41.597 C 217.916 43.718, 202.443 49.144, 202.744 51.035 C 203.418 55.268, 329.689 356.584, 333.687 363.500 C 340.525 375.327, 345.293 381.483, 355.408 391.538 C 374.603 410.619, 398.878 423.014, 425.907 427.533 C 439.649 429.831, 463.594 429.132, 476 426.072 C 489.892 422.645, 497.188 419.815, 496.703 418.043 C 495.416 413.331, 371.058 116.094, 367.406 109 C 349.467 74.149, 313.008 47.875, 273.752 41.509 C 262.281 39.648, 240.195 39.693, 229.651 41.597" }), _jsx("path", { d: "M 463 40.593 C 451.670 42.545, 447.288 43.569, 439 46.203 C 433.775 47.864, 429.338 49.372, 429.140 49.555 C 428.942 49.737, 434.670 64.021, 441.868 81.297 C 455.574 114.190, 462.215 131.660, 468.447 151.208 C 475.360 172.892, 486.124 186.213, 503.834 194.997 C 530.956 208.450, 564.982 201.679, 583.654 179.112 C 604.399 154.041, 605.407 121.944, 586.291 95.155 C 567.827 69.280, 539.107 50.114, 508 42.907 C 500.680 41.212, 494.713 40.644, 482 40.434 C 472.925 40.284, 464.375 40.356, 463 40.593" })] }));
4
4
  export function WarmLogoIcon({ size = 'default', tone = 'default', decorative = false, className: _className, style: _style, asChild: _asChild, render: _render, ...props }) {
5
5
  const label = decorative ? undefined : 'Warm logo';
6
- return (_jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 600 469", "data-warm-logo": true, "data-size": size, "data-tone": tone, width: size === 'hero' ? 56 : size === 'feature' ? 32 : size === 'default' ? 28 : 12, height: size === 'hero' ? 56 : size === 'feature' ? 32 : size === 'default' ? 28 : 12, "aria-hidden": decorative ? true : undefined, "aria-label": label, ...props, children: WShape }));
6
+ return (_jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 600 600", "data-warm-logo": true, "data-size": size, "data-tone": tone, width: size === 'hero' ? 56 : size === 'feature' ? 32 : size === 'default' ? 28 : 12, height: size === 'hero' ? 56 : size === 'feature' ? 32 : size === 'default' ? 28 : 12, "aria-hidden": decorative ? true : undefined, "aria-label": label, ...props, children: WShape }));
7
7
  }
8
8
  export const Logo = React.forwardRef(function Logo({ size = 'default', tone = 'default', showText = true, className: _className, style: _style, textClass: _textClass, asChild: _asChild, render: _render, ...props }, ref) {
9
9
  return (_jsxs("div", { ref: ref, "data-warm-logo": true, "data-size": size, "data-tone": tone, ...props, children: [_jsx(WarmLogoIcon, { size: size, tone: tone, decorative: showText }), showText ? _jsx("span", { children: "Warm" }) : null] }));
package/fonts.css CHANGED
@@ -1,121 +1,10 @@
1
1
  /*
2
2
  * Self-hosted variable fonts vendored from these exact OFL-1.1 releases:
3
- * @fontsource-variable/geist@5.2.9,
4
- * @fontsource-variable/geist-mono@5.2.8, and
5
- * @fontsource-variable/inter@5.2.8.
3
+ * @fontsource-variable/geist-mono@5.2.8 and
4
+ * @fontsource-variable/source-serif-4@5.3.0.
6
5
  */
7
6
 
8
- /* geist-cyrillic-ext-wght-normal */
9
- @font-face {
10
- font-family: 'Geist';
11
- font-style: normal;
12
- font-display: swap;
13
- font-weight: 100 900;
14
- src: url('./fonts/geist-cyrillic-ext-wght-normal.woff2') format('woff2');
15
- unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
16
- }
17
-
18
- /* geist-cyrillic-wght-normal */
19
- @font-face {
20
- font-family: 'Geist';
21
- font-style: normal;
22
- font-display: swap;
23
- font-weight: 100 900;
24
- src: url('./fonts/geist-cyrillic-wght-normal.woff2') format('woff2');
25
- unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
26
- }
27
-
28
- /* geist-vietnamese-wght-normal */
29
- @font-face {
30
- font-family: 'Geist';
31
- font-style: normal;
32
- font-display: swap;
33
- font-weight: 100 900;
34
- src: url('./fonts/geist-vietnamese-wght-normal.woff2') format('woff2');
35
- unicode-range:
36
- U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301,
37
- U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
38
- }
39
-
40
- /* geist-latin-ext-wght-normal */
41
- @font-face {
42
- font-family: 'Geist';
43
- font-style: normal;
44
- font-display: swap;
45
- font-weight: 100 900;
46
- src: url('./fonts/geist-latin-ext-wght-normal.woff2') format('woff2');
47
- unicode-range:
48
- U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329,
49
- U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F,
50
- U+A720-A7FF;
51
- }
52
-
53
- /* geist-latin-wght-normal */
54
- @font-face {
55
- font-family: 'Geist';
56
- font-style: normal;
57
- font-display: swap;
58
- font-weight: 100 900;
59
- src: url('./fonts/geist-latin-wght-normal.woff2') format('woff2');
60
- unicode-range:
61
- U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329,
62
- U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
63
- } /* geist-cyrillic-ext-wght-italic */
64
- @font-face {
65
- font-family: 'Geist';
66
- font-style: italic;
67
- font-display: swap;
68
- font-weight: 100 900;
69
- src: url('./fonts/geist-cyrillic-ext-wght-italic.woff2') format('woff2');
70
- unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
71
- }
72
-
73
- /* geist-cyrillic-wght-italic */
74
- @font-face {
75
- font-family: 'Geist';
76
- font-style: italic;
77
- font-display: swap;
78
- font-weight: 100 900;
79
- src: url('./fonts/geist-cyrillic-wght-italic.woff2') format('woff2');
80
- unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
81
- }
82
-
83
- /* geist-vietnamese-wght-italic */
84
- @font-face {
85
- font-family: 'Geist';
86
- font-style: italic;
87
- font-display: swap;
88
- font-weight: 100 900;
89
- src: url('./fonts/geist-vietnamese-wght-italic.woff2') format('woff2');
90
- unicode-range:
91
- U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301,
92
- U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
93
- }
94
-
95
- /* geist-latin-ext-wght-italic */
96
- @font-face {
97
- font-family: 'Geist';
98
- font-style: italic;
99
- font-display: swap;
100
- font-weight: 100 900;
101
- src: url('./fonts/geist-latin-ext-wght-italic.woff2') format('woff2');
102
- unicode-range:
103
- U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329,
104
- U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F,
105
- U+A720-A7FF;
106
- }
107
-
108
- /* geist-latin-wght-italic */
109
- @font-face {
110
- font-family: 'Geist';
111
- font-style: italic;
112
- font-display: swap;
113
- font-weight: 100 900;
114
- src: url('./fonts/geist-latin-wght-italic.woff2') format('woff2');
115
- unicode-range:
116
- U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329,
117
- U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
118
- } /* geist-mono-cyrillic-ext-wght-normal */
7
+ /* geist-mono-cyrillic-ext-wght-normal */
119
8
  @font-face {
120
9
  font-family: 'Geist Mono';
121
10
  font-style: normal;
@@ -180,7 +69,9 @@
180
69
  unicode-range:
181
70
  U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329,
182
71
  U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
183
- } /* geist-mono-cyrillic-ext-wght-italic */
72
+ }
73
+
74
+ /* geist-mono-cyrillic-ext-wght-italic */
184
75
  @font-face {
185
76
  font-family: 'Geist Mono';
186
77
  font-style: italic;
@@ -245,170 +136,149 @@
245
136
  unicode-range:
246
137
  U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329,
247
138
  U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
248
- } /* inter-cyrillic-ext-wght-normal */
249
- @font-face {
250
- font-family: 'Inter';
251
- font-style: normal;
252
- font-display: swap;
253
- font-weight: 100 900;
254
- src: url('./fonts/inter-cyrillic-ext-wght-normal.woff2') format('woff2');
255
- unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
256
139
  }
257
140
 
258
- /* inter-cyrillic-wght-normal */
141
+ /* source-serif-4-cyrillic-ext-wght-normal */
259
142
  @font-face {
260
- font-family: 'Inter';
143
+ font-family: 'Source Serif 4';
261
144
  font-style: normal;
262
145
  font-display: swap;
263
- font-weight: 100 900;
264
- src: url('./fonts/inter-cyrillic-wght-normal.woff2') format('woff2');
265
- unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
146
+ font-weight: 200 900;
147
+ src: url('./fonts/source-serif-4-cyrillic-ext-wght-normal.woff2') format('woff2');
148
+ unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
266
149
  }
267
150
 
268
- /* inter-greek-ext-wght-normal */
151
+ /* source-serif-4-cyrillic-wght-normal */
269
152
  @font-face {
270
- font-family: 'Inter';
153
+ font-family: 'Source Serif 4';
271
154
  font-style: normal;
272
155
  font-display: swap;
273
- font-weight: 100 900;
274
- src: url('./fonts/inter-greek-ext-wght-normal.woff2') format('woff2');
275
- unicode-range: U+1F00-1FFF;
156
+ font-weight: 200 900;
157
+ src: url('./fonts/source-serif-4-cyrillic-wght-normal.woff2') format('woff2');
158
+ unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
276
159
  }
277
160
 
278
- /* inter-greek-wght-normal */
161
+ /* source-serif-4-greek-wght-normal */
279
162
  @font-face {
280
- font-family: 'Inter';
163
+ font-family: 'Source Serif 4';
281
164
  font-style: normal;
282
165
  font-display: swap;
283
- font-weight: 100 900;
284
- src: url('./fonts/inter-greek-wght-normal.woff2') format('woff2');
166
+ font-weight: 200 900;
167
+ src: url('./fonts/source-serif-4-greek-wght-normal.woff2') format('woff2');
285
168
  unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
286
169
  }
287
170
 
288
- /* inter-vietnamese-wght-normal */
171
+ /* source-serif-4-vietnamese-wght-normal */
289
172
  @font-face {
290
- font-family: 'Inter';
173
+ font-family: 'Source Serif 4';
291
174
  font-style: normal;
292
175
  font-display: swap;
293
- font-weight: 100 900;
294
- src: url('./fonts/inter-vietnamese-wght-normal.woff2') format('woff2');
176
+ font-weight: 200 900;
177
+ src: url('./fonts/source-serif-4-vietnamese-wght-normal.woff2') format('woff2');
295
178
  unicode-range:
296
179
  U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301,
297
180
  U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
298
181
  }
299
182
 
300
- /* inter-latin-ext-wght-normal */
183
+ /* source-serif-4-latin-ext-wght-normal */
301
184
  @font-face {
302
- font-family: 'Inter';
185
+ font-family: 'Source Serif 4';
303
186
  font-style: normal;
304
187
  font-display: swap;
305
- font-weight: 100 900;
306
- src: url('./fonts/inter-latin-ext-wght-normal.woff2') format('woff2');
188
+ font-weight: 200 900;
189
+ src: url('./fonts/source-serif-4-latin-ext-wght-normal.woff2') format('woff2');
307
190
  unicode-range:
308
191
  U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329,
309
192
  U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F,
310
193
  U+A720-A7FF;
311
194
  }
312
195
 
313
- /* inter-latin-wght-normal */
196
+ /* source-serif-4-latin-wght-normal */
314
197
  @font-face {
315
- font-family: 'Inter';
198
+ font-family: 'Source Serif 4';
316
199
  font-style: normal;
317
200
  font-display: swap;
318
- font-weight: 100 900;
319
- src: url('./fonts/inter-latin-wght-normal.woff2') format('woff2');
201
+ font-weight: 200 900;
202
+ src: url('./fonts/source-serif-4-latin-wght-normal.woff2') format('woff2');
320
203
  unicode-range:
321
204
  U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329,
322
205
  U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
323
- } /* inter-cyrillic-ext-wght-italic */
324
- @font-face {
325
- font-family: 'Inter';
326
- font-style: italic;
327
- font-display: swap;
328
- font-weight: 100 900;
329
- src: url('./fonts/inter-cyrillic-ext-wght-italic.woff2') format('woff2');
330
- unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
331
206
  }
332
207
 
333
- /* inter-cyrillic-wght-italic */
208
+ /* source-serif-4-cyrillic-ext-wght-italic */
334
209
  @font-face {
335
- font-family: 'Inter';
210
+ font-family: 'Source Serif 4';
336
211
  font-style: italic;
337
212
  font-display: swap;
338
- font-weight: 100 900;
339
- src: url('./fonts/inter-cyrillic-wght-italic.woff2') format('woff2');
340
- unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
213
+ font-weight: 200 900;
214
+ src: url('./fonts/source-serif-4-cyrillic-ext-wght-italic.woff2') format('woff2');
215
+ unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
341
216
  }
342
217
 
343
- /* inter-greek-ext-wght-italic */
218
+ /* source-serif-4-cyrillic-wght-italic */
344
219
  @font-face {
345
- font-family: 'Inter';
220
+ font-family: 'Source Serif 4';
346
221
  font-style: italic;
347
222
  font-display: swap;
348
- font-weight: 100 900;
349
- src: url('./fonts/inter-greek-ext-wght-italic.woff2') format('woff2');
350
- unicode-range: U+1F00-1FFF;
223
+ font-weight: 200 900;
224
+ src: url('./fonts/source-serif-4-cyrillic-wght-italic.woff2') format('woff2');
225
+ unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
351
226
  }
352
227
 
353
- /* inter-greek-wght-italic */
228
+ /* source-serif-4-greek-wght-italic */
354
229
  @font-face {
355
- font-family: 'Inter';
230
+ font-family: 'Source Serif 4';
356
231
  font-style: italic;
357
232
  font-display: swap;
358
- font-weight: 100 900;
359
- src: url('./fonts/inter-greek-wght-italic.woff2') format('woff2');
233
+ font-weight: 200 900;
234
+ src: url('./fonts/source-serif-4-greek-wght-italic.woff2') format('woff2');
360
235
  unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
361
236
  }
362
237
 
363
- /* inter-vietnamese-wght-italic */
238
+ /* source-serif-4-vietnamese-wght-italic */
364
239
  @font-face {
365
- font-family: 'Inter';
240
+ font-family: 'Source Serif 4';
366
241
  font-style: italic;
367
242
  font-display: swap;
368
- font-weight: 100 900;
369
- src: url('./fonts/inter-vietnamese-wght-italic.woff2') format('woff2');
243
+ font-weight: 200 900;
244
+ src: url('./fonts/source-serif-4-vietnamese-wght-italic.woff2') format('woff2');
370
245
  unicode-range:
371
246
  U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301,
372
247
  U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
373
248
  }
374
249
 
375
- /* inter-latin-ext-wght-italic */
250
+ /* source-serif-4-latin-ext-wght-italic */
376
251
  @font-face {
377
- font-family: 'Inter';
252
+ font-family: 'Source Serif 4';
378
253
  font-style: italic;
379
254
  font-display: swap;
380
- font-weight: 100 900;
381
- src: url('./fonts/inter-latin-ext-wght-italic.woff2') format('woff2');
255
+ font-weight: 200 900;
256
+ src: url('./fonts/source-serif-4-latin-ext-wght-italic.woff2') format('woff2');
382
257
  unicode-range:
383
258
  U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329,
384
259
  U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F,
385
260
  U+A720-A7FF;
386
261
  }
387
262
 
388
- /* inter-latin-wght-italic */
263
+ /* source-serif-4-latin-wght-italic */
389
264
  @font-face {
390
- font-family: 'Inter';
265
+ font-family: 'Source Serif 4';
391
266
  font-style: italic;
392
267
  font-display: swap;
393
- font-weight: 100 900;
394
- src: url('./fonts/inter-latin-wght-italic.woff2') format('woff2');
268
+ font-weight: 200 900;
269
+ src: url('./fonts/source-serif-4-latin-wght-italic.woff2') format('woff2');
395
270
  unicode-range:
396
271
  U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329,
397
272
  U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
398
273
  }
399
274
 
400
275
  :root {
401
- --font-geist: 'Geist', ui-sans-serif, system-ui, sans-serif;
402
- --font-heading: var(--font-geist);
403
- --font-sans: var(--font-geist);
404
- --font-serif: var(--font-geist);
405
- --font-display: var(--font-geist);
406
276
  --font-mono: 'Geist Mono', ui-monospace, monospace;
407
- --font-editorial-sans: 'Inter', ui-sans-serif, system-ui, sans-serif;
408
- --font-marketing-sans: var(--font-editorial-sans);
409
- }
410
-
411
- /* The only shared Inter entry point. Product use is checked against an allowlist. */
412
- @utility font-editorial {
413
- font-family: var(--font-editorial-sans);
277
+ --font-sans: var(--font-mono);
278
+ --font-geist: var(--font-mono);
279
+ --font-display: var(--font-mono);
280
+ --font-editorial-sans: var(--font-mono);
281
+ --font-marketing-sans: var(--font-mono);
282
+ --font-serif: 'Source Serif 4', ui-serif, Georgia, 'Times New Roman', serif;
283
+ --font-heading: var(--font-serif);
414
284
  }
package/interfaces.css CHANGED
@@ -52,7 +52,10 @@ html.theme-switching *::after {
52
52
  }
53
53
 
54
54
  .interface-concentric {
55
- border-radius: max(0px, calc(var(--interface-outer-radius, var(--radius-xl)) - var(--interface-inset, 0px)));
55
+ border-radius: max(
56
+ 0px,
57
+ calc(var(--interface-outer-radius, var(--radius-xl)) - var(--interface-inset, 0px))
58
+ );
56
59
  }
57
60
 
58
61
  .interface-icon-crossfade {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@warmio/design",
3
- "version": "1.5.1",
3
+ "version": "1.6.0",
4
4
  "description": "Warm's public design contract: CSS tokens and Button/Logo primitives.",
5
5
  "license": "MIT",
6
6
  "type": "module",
package/theme.css CHANGED
@@ -194,8 +194,8 @@
194
194
  NON-COLOR TOKENS (shared across all themes)
195
195
  ══════════════════════════════════════════════════════════════════════════ */
196
196
 
197
- /* Typography — CSS variables (--font-sans, --font-serif, --font-mono, --font-display)
198
- are defined in the shared font styles and consumed across the app runtime. */
197
+ /* Typography — two families in fonts.css: Geist Mono default, Source Serif 4 headings.
198
+ Role aliases (--font-sans, --font-display, --font-editorial-sans) resolve to those two. */
199
199
  --tracking-normal: 0em;
200
200
 
201
201
  /* Spacing Scale */
@@ -228,7 +228,7 @@
228
228
  --button-padding-y-sm: 0.25rem;
229
229
  --button-padding-x-md: 0.75rem;
230
230
  --button-padding-y-md: 0.5rem;
231
- --button-padding-x-lg: 1rem;
231
+ --button-padding-x-lg: 1.75rem;
232
232
  --button-padding-y-lg: 0.75rem;
233
233
  --button-font-size: 0.875rem;
234
234
  --button-gap: 0.5rem;
@@ -271,7 +271,7 @@
271
271
  --button-height-icon: 2.25rem;
272
272
  --button-min-height-touch: 2.75rem;
273
273
  --button-min-height-option: 4rem;
274
- --button-padding-x: 1rem;
274
+ --button-padding-x: 1.25rem;
275
275
  --button-font-size-base: 1rem;
276
276
  --button-font-size-jumbo: 1.125rem;
277
277
  --button-line-height-base: 1.5rem;
@@ -1,93 +0,0 @@
1
- Copyright 2024 The Geist Project Authors (https://github.com/vercel/geist-font) Geist-Italic[wght].ttf: Copyright 2024 The Geist Project Authors (https://github.com/vercel/geist-font)
2
-
3
- This Font Software is licensed under the SIL Open Font License, Version 1.1.
4
- This license is copied below, and is also available with a FAQ at:
5
- http://scripts.sil.org/OFL
6
-
7
-
8
- -----------------------------------------------------------
9
- SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
10
- -----------------------------------------------------------
11
-
12
- PREAMBLE
13
- The goals of the Open Font License (OFL) are to stimulate worldwide
14
- development of collaborative font projects, to support the font creation
15
- efforts of academic and linguistic communities, and to provide a free and
16
- open framework in which fonts may be shared and improved in partnership
17
- with others.
18
-
19
- The OFL allows the licensed fonts to be used, studied, modified and
20
- redistributed freely as long as they are not sold by themselves. The
21
- fonts, including any derivative works, can be bundled, embedded,
22
- redistributed and/or sold with any software provided that any reserved
23
- names are not used by derivative works. The fonts and derivatives,
24
- however, cannot be released under any other type of license. The
25
- requirement for fonts to remain under this license does not apply
26
- to any document created using the fonts or their derivatives.
27
-
28
- DEFINITIONS
29
- "Font Software" refers to the set of files released by the Copyright
30
- Holder(s) under this license and clearly marked as such. This may
31
- include source files, build scripts and documentation.
32
-
33
- "Reserved Font Name" refers to any names specified as such after the
34
- copyright statement(s).
35
-
36
- "Original Version" refers to the collection of Font Software components as
37
- distributed by the Copyright Holder(s).
38
-
39
- "Modified Version" refers to any derivative made by adding to, deleting,
40
- or substituting -- in part or in whole -- any of the components of the
41
- Original Version, by changing formats or by porting the Font Software to a
42
- new environment.
43
-
44
- "Author" refers to any designer, engineer, programmer, technical
45
- writer or other person who contributed to the Font Software.
46
-
47
- PERMISSION & CONDITIONS
48
- Permission is hereby granted, free of charge, to any person obtaining
49
- a copy of the Font Software, to use, study, copy, merge, embed, modify,
50
- redistribute, and sell modified and unmodified copies of the Font
51
- Software, subject to the following conditions:
52
-
53
- 1) Neither the Font Software nor any of its individual components,
54
- in Original or Modified Versions, may be sold by itself.
55
-
56
- 2) Original or Modified Versions of the Font Software may be bundled,
57
- redistributed and/or sold with any software, provided that each copy
58
- contains the above copyright notice and this license. These can be
59
- included either as stand-alone text files, human-readable headers or
60
- in the appropriate machine-readable metadata fields within text or
61
- binary files as long as those fields can be easily viewed by the user.
62
-
63
- 3) No Modified Version of the Font Software may use the Reserved Font
64
- Name(s) unless explicit written permission is granted by the corresponding
65
- Copyright Holder. This restriction only applies to the primary font name as
66
- presented to the users.
67
-
68
- 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
69
- Software shall not be used to promote, endorse or advertise any
70
- Modified Version, except to acknowledge the contribution(s) of the
71
- Copyright Holder(s) and the Author(s) or with their explicit written
72
- permission.
73
-
74
- 5) The Font Software, modified or unmodified, in part or in whole,
75
- must be distributed entirely under this license, and must not be
76
- distributed under any other license. The requirement for fonts to
77
- remain under this license does not apply to any document created
78
- using the Font Software.
79
-
80
- TERMINATION
81
- This license becomes null and void if any of the above conditions are
82
- not met.
83
-
84
- DISCLAIMER
85
- THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
86
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
87
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
88
- OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
89
- COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
90
- INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
91
- DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
92
- FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
93
- OTHER DEALINGS IN THE FONT SOFTWARE.
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file