@rokkit/themes 1.0.5 → 1.1.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 (155) hide show
  1. package/build.mjs +4 -2
  2. package/package.json +3 -2
  3. package/src/base/carousel.css +2 -1
  4. package/src/base/code-block.css +76 -0
  5. package/src/base/display.css +16 -8
  6. package/src/base/frame.css +36 -0
  7. package/src/base/index.css +2 -0
  8. package/src/base/input.css +49 -10
  9. package/src/base/nav-content.css +3 -3
  10. package/src/base/stepper.css +14 -7
  11. package/src/base/tabs.css +15 -2
  12. package/src/base/typography.css +32 -13
  13. package/src/frosted/button.css +27 -27
  14. package/src/frosted/card.css +8 -8
  15. package/src/frosted/chart.css +6 -6
  16. package/src/frosted/code-block.css +33 -0
  17. package/src/frosted/dropdown.css +9 -9
  18. package/src/frosted/floating-action.css +10 -10
  19. package/src/frosted/floating-navigation.css +13 -13
  20. package/src/frosted/frame.css +17 -0
  21. package/src/frosted/index.css +2 -0
  22. package/src/frosted/input.css +16 -16
  23. package/src/frosted/list.css +25 -25
  24. package/src/frosted/menu.css +13 -13
  25. package/src/frosted/message.css +8 -8
  26. package/src/frosted/range.css +8 -8
  27. package/src/frosted/search-filter.css +8 -8
  28. package/src/frosted/select.css +31 -31
  29. package/src/frosted/status-list.css +17 -17
  30. package/src/frosted/step-indicator.css +8 -8
  31. package/src/frosted/swatch.css +3 -3
  32. package/src/frosted/switch.css +3 -3
  33. package/src/frosted/table.css +16 -16
  34. package/src/frosted/tabs.css +8 -8
  35. package/src/frosted/timeline.css +5 -5
  36. package/src/frosted/toc.css +4 -4
  37. package/src/frosted/toggle.css +7 -7
  38. package/src/frosted/toolbar.css +15 -15
  39. package/src/frosted/tree.css +19 -19
  40. package/src/material/button.css +29 -29
  41. package/src/material/card.css +12 -12
  42. package/src/material/chart.css +6 -6
  43. package/src/material/code-block.css +33 -0
  44. package/src/material/dropdown.css +11 -11
  45. package/src/material/floating-action.css +10 -10
  46. package/src/material/floating-navigation.css +13 -13
  47. package/src/material/frame.css +17 -0
  48. package/src/material/index.css +2 -0
  49. package/src/material/input.css +21 -21
  50. package/src/material/list.css +23 -23
  51. package/src/material/menu.css +16 -16
  52. package/src/material/message.css +8 -8
  53. package/src/material/range.css +8 -8
  54. package/src/material/search-filter.css +8 -8
  55. package/src/material/select.css +31 -31
  56. package/src/material/status-list.css +17 -17
  57. package/src/material/step-indicator.css +8 -8
  58. package/src/material/swatch.css +3 -3
  59. package/src/material/switch.css +6 -6
  60. package/src/material/table.css +16 -16
  61. package/src/material/tabs.css +7 -7
  62. package/src/material/timeline.css +5 -5
  63. package/src/material/toc.css +4 -4
  64. package/src/material/toggle.css +6 -6
  65. package/src/material/toolbar.css +11 -11
  66. package/src/material/tree.css +17 -17
  67. package/src/minimal/button.css +30 -30
  68. package/src/minimal/card.css +13 -13
  69. package/src/minimal/chart.css +6 -6
  70. package/src/minimal/code-block.css +33 -0
  71. package/src/minimal/dropdown.css +11 -11
  72. package/src/minimal/floating-action.css +10 -10
  73. package/src/minimal/floating-navigation.css +12 -12
  74. package/src/minimal/frame.css +17 -0
  75. package/src/minimal/index.css +2 -0
  76. package/src/minimal/input.css +24 -24
  77. package/src/minimal/list.css +52 -26
  78. package/src/minimal/menu.css +15 -15
  79. package/src/minimal/message.css +8 -8
  80. package/src/minimal/range.css +7 -7
  81. package/src/minimal/search-filter.css +8 -8
  82. package/src/minimal/select.css +27 -27
  83. package/src/minimal/status-list.css +17 -17
  84. package/src/minimal/step-indicator.css +8 -8
  85. package/src/minimal/swatch.css +3 -3
  86. package/src/minimal/switch.css +6 -6
  87. package/src/minimal/table.css +16 -16
  88. package/src/minimal/tabs.css +14 -14
  89. package/src/minimal/timeline.css +4 -4
  90. package/src/minimal/toc.css +4 -4
  91. package/src/minimal/toggle.css +7 -7
  92. package/src/minimal/toolbar.css +14 -14
  93. package/src/minimal/tree.css +24 -18
  94. package/src/rokkit/avatar.css +6 -6
  95. package/src/rokkit/badge.css +5 -5
  96. package/src/rokkit/button.css +55 -37
  97. package/src/rokkit/card.css +11 -11
  98. package/src/rokkit/chart.css +6 -6
  99. package/src/rokkit/code-block.css +33 -0
  100. package/src/rokkit/connector.css +1 -1
  101. package/src/rokkit/divider.css +5 -5
  102. package/src/rokkit/dropdown.css +11 -11
  103. package/src/rokkit/floating-action.css +11 -11
  104. package/src/rokkit/floating-navigation.css +15 -15
  105. package/src/rokkit/frame.css +17 -0
  106. package/src/rokkit/grid.css +8 -8
  107. package/src/rokkit/index.css +2 -0
  108. package/src/rokkit/input.css +17 -17
  109. package/src/rokkit/list.css +24 -24
  110. package/src/rokkit/menu.css +14 -14
  111. package/src/rokkit/message.css +12 -12
  112. package/src/rokkit/range.css +10 -10
  113. package/src/rokkit/search-filter.css +8 -8
  114. package/src/rokkit/select.css +34 -34
  115. package/src/rokkit/status-list.css +17 -17
  116. package/src/rokkit/step-indicator.css +8 -8
  117. package/src/rokkit/swatch.css +3 -3
  118. package/src/rokkit/switch.css +6 -6
  119. package/src/rokkit/table.css +16 -16
  120. package/src/rokkit/tabs.css +31 -28
  121. package/src/rokkit/timeline.css +5 -5
  122. package/src/rokkit/toc.css +4 -4
  123. package/src/rokkit/toggle.css +21 -10
  124. package/src/rokkit/toolbar.css +15 -15
  125. package/src/rokkit/tooltip.css +1 -1
  126. package/src/rokkit/tree.css +23 -23
  127. package/src/rokkit/upload-progress.css +18 -18
  128. package/src/rokkit/upload-target.css +8 -8
  129. package/src/zen-sumi/button.css +29 -29
  130. package/src/zen-sumi/card.css +12 -12
  131. package/src/zen-sumi/chart.css +6 -6
  132. package/src/zen-sumi/code-block.css +35 -0
  133. package/src/zen-sumi/dropdown.css +10 -10
  134. package/src/zen-sumi/floating-action.css +7 -7
  135. package/src/zen-sumi/floating-navigation.css +11 -11
  136. package/src/zen-sumi/frame.css +20 -0
  137. package/src/zen-sumi/index.css +2 -0
  138. package/src/zen-sumi/input.css +49 -23
  139. package/src/zen-sumi/list.css +20 -20
  140. package/src/zen-sumi/menu.css +14 -14
  141. package/src/zen-sumi/message.css +8 -8
  142. package/src/zen-sumi/range.css +7 -7
  143. package/src/zen-sumi/search-filter.css +8 -8
  144. package/src/zen-sumi/select.css +26 -26
  145. package/src/zen-sumi/status-list.css +17 -17
  146. package/src/zen-sumi/step-indicator.css +8 -8
  147. package/src/zen-sumi/swatch.css +3 -3
  148. package/src/zen-sumi/switch.css +5 -5
  149. package/src/zen-sumi/table.css +16 -16
  150. package/src/zen-sumi/tabs.css +8 -8
  151. package/src/zen-sumi/timeline.css +4 -4
  152. package/src/zen-sumi/toc.css +4 -4
  153. package/src/zen-sumi/toggle.css +18 -10
  154. package/src/zen-sumi/toolbar.css +14 -14
  155. package/src/zen-sumi/tree.css +16 -16
package/build.mjs CHANGED
@@ -19,6 +19,7 @@
19
19
 
20
20
  import { createGenerator, presetWind3, transformerDirectives } from 'unocss'
21
21
  import { Theme } from '@rokkit/core'
22
+ import { buildNamedShortcuts } from '@rokkit/unocss'
22
23
  import { readFileSync, writeFileSync, mkdirSync } from 'fs'
23
24
  import { resolve, dirname, join } from 'path'
24
25
  import { fileURLToPath } from 'url'
@@ -40,7 +41,7 @@ const uno = await createGenerator({
40
41
  })
41
42
  ],
42
43
  shortcuts: [
43
- ['skin-default', theme.getPalette()],
44
+ ['skin-default', { ...theme.getPalette(), ...theme.getNamedTokens() }],
44
45
  ...theme.getShortcuts('surface'),
45
46
  ...theme.getShortcuts('primary'),
46
47
  ...theme.getShortcuts('secondary'),
@@ -49,7 +50,8 @@ const uno = await createGenerator({
49
50
  ...theme.getShortcuts('warning'),
50
51
  ...theme.getShortcuts('danger'),
51
52
  ...theme.getShortcuts('error'),
52
- ...theme.getShortcuts('info')
53
+ ...theme.getShortcuts('info'),
54
+ ...buildNamedShortcuts()
53
55
  ],
54
56
  theme: {
55
57
  colors: theme.getColorRules()
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rokkit/themes",
3
- "version": "1.0.5",
3
+ "version": "1.1.0",
4
4
  "description": "Theme styles for @rokkit/ui components",
5
5
  "repository": {
6
6
  "type": "git",
@@ -103,9 +103,10 @@
103
103
  "build": "bun run build.mjs"
104
104
  },
105
105
  "dependencies": {
106
- "@rokkit/core": "1.0.5"
106
+ "@rokkit/core": "1.1.0"
107
107
  },
108
108
  "devDependencies": {
109
+ "@rokkit/unocss": "1.1.0",
109
110
  "magic-string": "^0.30.21",
110
111
  "unocss": "^66.5.1"
111
112
  },
@@ -71,7 +71,8 @@
71
71
  border: none;
72
72
  border-radius: 9999px;
73
73
  cursor: pointer;
74
- @apply bg-surface-z10/30 text-surface-z0;
74
+ background-color: color-mix(in srgb, var(--ink) 30%, transparent);
75
+ color: var(--paper);
75
76
  font-size: 1.25rem;
76
77
  z-index: 1;
77
78
  opacity: 0.7;
@@ -0,0 +1,76 @@
1
+ /**
2
+ * CodeBlock — base structural styles for the internals.
3
+ *
4
+ * The outer chrome (border, radius, header divider) is Frame's job.
5
+ * This file just lays out what CodeBlock puts INSIDE the frame header
6
+ * (icon, filename, lang chip, action buttons) and body (<pre>/<code>).
7
+ * Per-theme files add colour and typography accents.
8
+ */
9
+
10
+ [data-code-block-header] {
11
+ display: flex;
12
+ align-items: center;
13
+ justify-content: space-between;
14
+ gap: var(--density-spacing-sm);
15
+ }
16
+
17
+ [data-code-block-title] {
18
+ display: inline-flex;
19
+ align-items: center;
20
+ gap: var(--density-spacing-sm);
21
+ }
22
+
23
+ [data-code-block-icon] {
24
+ display: inline-block;
25
+ width: 13px;
26
+ height: 13px;
27
+ }
28
+
29
+ [data-code-block-lang] {
30
+ padding: 2px 6px;
31
+ border-radius: 3px;
32
+ letter-spacing: 0.12em;
33
+ text-transform: uppercase;
34
+ }
35
+
36
+ [data-code-block-actions] {
37
+ display: inline-flex;
38
+ gap: 2px;
39
+ }
40
+
41
+ [data-code-block-actions] button {
42
+ display: inline-flex;
43
+ align-items: center;
44
+ gap: 5px;
45
+ height: 22px;
46
+ padding: 0 8px;
47
+ border: 0;
48
+ background: transparent;
49
+ cursor: pointer;
50
+ border-radius: 3px;
51
+ letter-spacing: 0.02em;
52
+ }
53
+
54
+ [data-code-block-actions] button > span:first-child {
55
+ display: inline-block;
56
+ width: 12px;
57
+ height: 12px;
58
+ }
59
+
60
+ [data-code-block-body] {
61
+ overflow: auto;
62
+ }
63
+
64
+ [data-code-block-body] pre {
65
+ margin: 0;
66
+ padding: 10px 12px;
67
+ overflow-x: auto;
68
+ background: transparent;
69
+ }
70
+
71
+ [data-code-block-body] code {
72
+ font: inherit;
73
+ background: transparent;
74
+ border: 0;
75
+ padding: 0;
76
+ }
@@ -6,7 +6,8 @@
6
6
  }
7
7
 
8
8
  [data-display-title] {
9
- @apply text-on-surface text-sm font-semibold;
9
+ color: var(--ink);
10
+ @apply text-sm font-semibold;
10
11
  }
11
12
 
12
13
  [data-display-field] {
@@ -14,16 +15,19 @@
14
15
  }
15
16
 
16
17
  [data-display-label] {
17
- @apply text-on-surface/70 shrink-0 text-sm;
18
+ color: color-mix(in srgb, var(--ink) 70%, transparent);
19
+ @apply shrink-0 text-sm;
18
20
  }
19
21
 
20
22
  [data-display-value] {
21
- @apply text-on-surface text-right text-sm;
23
+ color: var(--ink);
24
+ @apply text-right text-sm;
22
25
  }
23
26
 
24
27
  /* Badge format: pill style */
25
28
  [data-display-value][data-format='badge'] {
26
- @apply bg-surface-z2 rounded-full px-2 py-0.5 text-xs font-medium;
29
+ background-color: var(--paper-mute);
30
+ @apply rounded-full px-2 py-0.5 text-xs font-medium;
27
31
  }
28
32
 
29
33
  /* Boolean format */
@@ -58,11 +62,14 @@
58
62
  }
59
63
 
60
64
  [data-display-card] {
61
- @apply border-surface-z2 bg-surface flex flex-col gap-1 rounded border p-3;
65
+ border-color: var(--paper-mute);
66
+ background-color: var(--paper-edge);
67
+ @apply flex flex-col gap-1 rounded border p-3;
62
68
  }
63
69
 
64
70
  [data-display-card][data-selected] {
65
- @apply border-primary ring-primary ring-1;
71
+ border-color: var(--primary);
72
+ @apply ring-primary ring-1;
66
73
  }
67
74
 
68
75
  [data-selectable] [data-display-card] {
@@ -70,7 +77,7 @@
70
77
  }
71
78
 
72
79
  [data-selectable] [data-display-card]:hover {
73
- @apply bg-surface-z1;
80
+ background-color: var(--paper-soft);
74
81
  }
75
82
 
76
83
  /* Display list */
@@ -83,7 +90,8 @@
83
90
  }
84
91
 
85
92
  [data-display-list-item] {
86
- @apply border-surface-z2 flex items-baseline gap-4 border-b py-1 last:border-0;
93
+ border-color: var(--paper-mute);
94
+ @apply flex items-baseline gap-4 border-b py-1 last:border-0;
87
95
  }
88
96
 
89
97
  [data-display-list-item] [data-display-field] {
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Frame — base structural styles.
3
+ *
4
+ * Layout / spacing only. Per-theme files (zen-sumi/frame.css,
5
+ * material/frame.css, …) add the visual decoration (border, background,
6
+ * shadow) using the same `[data-frame-*]` hooks.
7
+ */
8
+
9
+ [data-frame] {
10
+ display: flex;
11
+ flex-direction: column;
12
+ border-radius: var(--density-radius-base);
13
+ overflow: hidden;
14
+ }
15
+
16
+ [data-frame-header] {
17
+ padding-block: var(--density-spacing-sm);
18
+ padding-inline: var(--density-spacing-md);
19
+ }
20
+
21
+ [data-frame-body] {
22
+ padding: var(--density-spacing-md);
23
+ flex: 1;
24
+ min-height: 0;
25
+ }
26
+
27
+ /* Artifacts that own their padding (charts, <pre> blocks, tables) opt
28
+ * out of the body padding via `flush`. */
29
+ [data-frame-body][data-flush] {
30
+ padding: 0;
31
+ }
32
+
33
+ [data-frame-footer] {
34
+ padding-block: var(--density-spacing-sm);
35
+ padding-inline: var(--density-spacing-md);
36
+ }
@@ -28,6 +28,8 @@
28
28
  @import './shine.css';
29
29
  @import './breadcrumbs.css';
30
30
  @import './card.css';
31
+ @import './frame.css';
32
+ @import './code-block.css';
31
33
  @import './progress.css';
32
34
  @import './carousel.css';
33
35
  @import './pill.css';
@@ -12,12 +12,14 @@
12
12
 
13
13
  /* Separator between form fields */
14
14
  [data-form-separator] {
15
- @apply border-surface-z2 my-1 border-t;
15
+ border-top-color: var(--paper-mute);
16
+ @apply my-1 border-t;
16
17
  }
17
18
 
18
19
  /* Form group (fieldset for nested objects) */
19
20
  [data-form-group] {
20
- @apply border-surface-z2 m-0 flex flex-col gap-3 border-l border-none p-0 pl-3;
21
+ border-left-color: var(--paper-mute);
22
+ @apply m-0 flex flex-col gap-3 border-l border-none p-0 pl-3;
21
23
  }
22
24
 
23
25
  [data-form-group-label] {
@@ -46,7 +48,8 @@
46
48
  }
47
49
 
48
50
  [data-severity='error'] [data-validation-count] {
49
- @apply bg-error-z1 text-error-z7;
51
+ background-color: var(--error-soft);
52
+ color: var(--error);
50
53
  }
51
54
 
52
55
  [data-severity='warning'] > [data-validation-group-header] {
@@ -54,7 +57,8 @@
54
57
  }
55
58
 
56
59
  [data-severity='warning'] [data-validation-count] {
57
- @apply bg-warning-z1 text-warning-z7;
60
+ background-color: var(--warning-soft);
61
+ color: var(--warning);
58
62
  }
59
63
 
60
64
  [data-severity='info'] > [data-validation-group-header] {
@@ -62,7 +66,8 @@
62
66
  }
63
67
 
64
68
  [data-severity='info'] [data-validation-count] {
65
- @apply bg-info-z1 text-info-z7;
69
+ background-color: var(--info-soft);
70
+ color: var(--info);
66
71
  }
67
72
 
68
73
  [data-severity='success'] > [data-validation-group-header] {
@@ -70,7 +75,8 @@
70
75
  }
71
76
 
72
77
  [data-severity='success'] [data-validation-count] {
73
- @apply bg-success-z1 text-success-z7;
78
+ background-color: var(--success-soft);
79
+ color: var(--success);
74
80
  }
75
81
 
76
82
  [data-validation-item] {
@@ -78,7 +84,11 @@
78
84
  }
79
85
 
80
86
  button[data-validation-item] {
81
- @apply hover:bg-surface-z1 cursor-pointer border-none bg-transparent;
87
+ @apply cursor-pointer border-none bg-transparent;
88
+ }
89
+
90
+ button[data-validation-item]:hover {
91
+ background-color: var(--paper-soft);
82
92
  }
83
93
 
84
94
  /* Form actions (submit/reset buttons) */
@@ -88,11 +98,21 @@ button[data-validation-item] {
88
98
 
89
99
  button[data-form-submit],
90
100
  button[data-form-reset] {
91
- @apply border-surface-z3 bg-surface-z1 hover:bg-surface-z2 cursor-pointer rounded border px-4 py-1.5 text-sm transition-colors;
101
+ border-color: var(--paper-mute);
102
+ background-color: var(--paper-soft);
103
+ @apply cursor-pointer rounded border px-4 py-1.5 text-sm transition-colors;
104
+ }
105
+
106
+ button[data-form-submit]:hover,
107
+ button[data-form-reset]:hover {
108
+ background-color: var(--paper-mute);
92
109
  }
93
110
 
94
111
  button[data-form-submit] {
95
- @apply bg-primary text-on-primary border-primary hover:opacity-90;
112
+ background-color: var(--primary);
113
+ color: var(--on-primary);
114
+ border-color: var(--primary);
115
+ @apply hover:opacity-90;
96
116
  }
97
117
 
98
118
  button[data-form-submit]:disabled,
@@ -122,6 +142,24 @@ button[data-form-reset]:disabled {
122
142
  @apply flex-row items-center justify-between gap-2;
123
143
  }
124
144
 
145
+ /* Inline layout variant — opt in per field via the `variant='inline'`
146
+ prop on InputField (or the equivalent `variant` field on a
147
+ FormRenderer layout element). Label sits in a fixed leading column,
148
+ the input takes the remaining row. Useful for control-panel
149
+ contexts (playground knobs, settings dialogs, tweak editors) where
150
+ the form-page rhythm reads as overkill. */
151
+ [data-field-root][data-field-layout='inline'] > [data-field] {
152
+ @apply flex-row items-center gap-3;
153
+ }
154
+
155
+ [data-field-root][data-field-layout='inline'] > [data-field] > label {
156
+ @apply flex-none w-32 text-xs;
157
+ }
158
+
159
+ [data-field-root][data-field-layout='inline'] > [data-field] > :not(label) {
160
+ @apply flex-1 min-w-0;
161
+ }
162
+
125
163
  /* Select: stretch to fill input wrapper — display:flex eliminates inline-block gap */
126
164
  [data-input-root] [data-select] {
127
165
  @apply flex-1 self-stretch;
@@ -250,7 +288,8 @@ input[type='radio'] {
250
288
  }
251
289
 
252
290
  input[type='radio']:checked {
253
- @apply border-primary-z5 text-primary-z5;
291
+ border-color: var(--primary);
292
+ color: var(--primary);
254
293
  }
255
294
 
256
295
  input[type='radio']:checked::before {
@@ -21,11 +21,11 @@
21
21
 
22
22
  [data-nav-content][data-orientation='horizontal'] [data-nav-content-nav] {
23
23
  width: var(--nav-size, 280px);
24
- @apply border-r border-surface-z3;
24
+ border-right: 1px solid var(--paper-mute);
25
25
  }
26
26
 
27
27
  [data-nav-content][data-orientation='vertical'] [data-nav-content-nav] {
28
- @apply border-b border-surface-z3;
28
+ border-bottom: 1px solid var(--paper-mute);
29
29
  }
30
30
 
31
31
  [data-nav-content-main] {
@@ -43,6 +43,6 @@
43
43
  [data-nav-content][data-collapsible][data-orientation='horizontal'] [data-nav-content-nav] {
44
44
  width: 100%;
45
45
  border-right: none;
46
- @apply border-b border-surface-z3;
46
+ border-bottom: 1px solid var(--paper-mute);
47
47
  }
48
48
  }
@@ -47,17 +47,21 @@
47
47
  }
48
48
 
49
49
  [data-stepper-step][data-completed] [data-stepper-circle] {
50
- @apply bg-primary-z5 border-primary-z5 text-surface-z0;
50
+ background-color: var(--primary);
51
+ border-color: var(--primary);
52
+ color: var(--paper);
51
53
  }
52
54
 
53
55
  [data-stepper-step][data-active] [data-stepper-circle] {
54
- @apply border-primary-z5 text-primary-z5 ring-primary-z5/20 ring-3;
56
+ border-color: var(--primary);
57
+ color: var(--primary);
58
+ @apply ring-primary/20 ring-3;
55
59
  }
56
60
 
57
61
  /* ─── Connector line ─── */
58
62
 
59
63
  [data-stepper-connector] {
60
- @apply bg-surface-z3;
64
+ background-color: var(--paper-mute);
61
65
  flex: 1;
62
66
  height: 2px;
63
67
  min-width: 2rem;
@@ -68,7 +72,7 @@
68
72
  }
69
73
 
70
74
  [data-stepper-connector][data-completed] {
71
- @apply bg-primary-z5;
75
+ background-color: var(--primary);
72
76
  }
73
77
 
74
78
  /* Vertical orientation connectors */
@@ -100,7 +104,7 @@
100
104
  }
101
105
 
102
106
  [data-stepper-dot] {
103
- @apply border-surface-z4;
107
+ border-color: var(--paper-edge);
104
108
  width: 0.5rem;
105
109
  height: 0.5rem;
106
110
  border-radius: 9999px;
@@ -120,11 +124,14 @@
120
124
  }
121
125
 
122
126
  [data-stepper-dot][data-completed] {
123
- @apply bg-primary-z5 border-primary-z5;
127
+ background-color: var(--primary);
128
+ border-color: var(--primary);
124
129
  }
125
130
 
126
131
  [data-stepper-dot][data-active] {
127
- @apply bg-primary-z5 border-primary-z5 ring-primary-z5/25 ring-2;
132
+ background-color: var(--primary);
133
+ border-color: var(--primary);
134
+ @apply ring-primary/25 ring-2;
128
135
  }
129
136
 
130
137
  /* ─── Content area ─── */
package/src/base/tabs.css CHANGED
@@ -45,9 +45,15 @@
45
45
 
46
46
  [data-tabs][data-orientation='vertical'] [data-tabs-list] {
47
47
  flex-direction: column;
48
+ /* In vertical mode the list is a flex item perpendicular to the
49
+ * row-direction parent. Stretching it gives `justify-content` a
50
+ * height to distribute — without this the column collapses to
51
+ * fit-content and `align=center / end` have no spare space to
52
+ * move the tabs into. */
53
+ align-self: stretch;
48
54
  }
49
55
 
50
- /* Alignment */
56
+ /* Alignment — main-axis distribution within the list */
51
57
  [data-tabs][data-align='center'] [data-tabs-list] {
52
58
  justify-content: center;
53
59
  }
@@ -66,7 +72,14 @@
66
72
  gap: 0.375rem;
67
73
  padding: 0.5rem 0.75rem;
68
74
  cursor: pointer;
69
- border: none;
75
+ /* `border: none` expands to `border-width: medium` (= 3px) which leaks
76
+ * a 3px ring on every side as soon as a theme sets `border-style: solid`.
77
+ * Spell the safe baseline out: zero width on all sides, solid style so
78
+ * any `border-{side}-[Npx]` from a theme renders without needing to
79
+ * re-declare the style. */
80
+ border-width: 0;
81
+ border-style: solid;
82
+ border-color: currentcolor;
70
83
  background: transparent;
71
84
  font-weight: 500;
72
85
  font-size: 0.875rem;
@@ -2,25 +2,37 @@
2
2
  * Typography & Shape Tokens
3
3
  *
4
4
  * CSS custom properties for font families and border-radius scale.
5
- * Override these in your application stylesheet to customize typography and shape.
5
+ *
6
+ * Canonical names match the named-token vocabulary's semantic intent:
7
+ * --font-display — heading / display typeface
8
+ * --font-ui — body / UI typeface
9
+ * --font-mono — code, eyebrows, kbd shortcuts
10
+ *
11
+ * Legacy aliases `--font-heading` and `--font-sans` are emitted as
12
+ * `var(--font-display)` and `var(--font-ui)` for backward compatibility
13
+ * with any consumer that still reads the old names. Both stay in sync.
14
+ *
15
+ * Override these in your application stylesheet or via the preset's
16
+ * `typography: { display, ui, mono }` config to customize.
6
17
  *
7
18
  * @example
8
19
  * :root {
9
- * --font-sans: 'Inter', system-ui, sans-serif;
10
- * --font-mono: 'JetBrains Mono', monospace;
11
- * --font-heading: 'Cal Sans', 'Inter', sans-serif;
12
- *
13
- * --radius-sm: 0; --* sharp corners *--
14
- * --radius-md: 0;
15
- * --radius-lg: 0;
20
+ * --font-display: 'Fraunces', serif;
21
+ * --font-ui: 'Inter', system-ui, sans-serif;
22
+ * --font-mono: 'JetBrains Mono', monospace;
16
23
  * }
17
24
  */
18
25
 
19
- :root {
20
- /* Font families */
21
- --font-sans: 'Open Sans', -apple-system, system-ui, 'Segoe UI', ui-serif, sans-serif;
22
- --font-mono: 'Victor Mono', ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace;
23
- --font-heading: 'Open Sans', sans-serif;
26
+ /* Defaults wrapped in :where() so specificity is 0 — any explicit :root
27
+ declaration (from the preset emit, an app stylesheet, or another theme)
28
+ wins without needing extra weight. Without :where(), this file would
29
+ override later preset emissions since both are :root, same specificity,
30
+ and the source order has this CSS loading after the preset preflight. */
31
+ :where(:root) {
32
+ /* Font families — canonical names */
33
+ --font-display: 'Open Sans', sans-serif;
34
+ --font-ui: 'Open Sans', -apple-system, system-ui, 'Segoe UI', ui-serif, sans-serif;
35
+ --font-mono: 'Victor Mono', ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace;
24
36
 
25
37
  /* Border-radius scale */
26
38
  --radius-sm: 0.25rem;
@@ -29,3 +41,10 @@
29
41
  --radius-xl: 0.75rem;
30
42
  --radius-full: 9999px;
31
43
  }
44
+
45
+ /* Legacy aliases — outside the :where() so they ALWAYS reflect whichever
46
+ --font-display / --font-ui value won in the cascade (default or preset). */
47
+ :root {
48
+ --font-heading: var(--font-display);
49
+ --font-sans: var(--font-ui);
50
+ }