@marigold/theme-rui 5.1.0 → 5.2.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.
package/dist/theme.css CHANGED
@@ -16,7 +16,6 @@
16
16
  */
17
17
 
18
18
  @plugin 'tailwindcss-react-aria-components';
19
- @plugin 'tailwindcss-animate';
20
19
 
21
20
  @theme static {
22
21
  --font-sans: Inter, system-ui, sans-serif;
@@ -101,13 +100,13 @@
101
100
  Currently used for: helptext, icons inside inputs, readonly background inside inputs, variant for text
102
101
  */
103
102
  --color-muted: var(--color-stone-100);
104
- --color-muted-foreground: var(--color-stone-500);
103
+ --color-muted-foreground: var(--color-stone-600);
105
104
 
106
105
  --color-disabled: var(--color-stone-200);
107
- --color-disabled-foreground: var(--color-stone-400);
106
+ --color-disabled-foreground: var(--color-stone-500);
108
107
 
109
108
  /* used for placeholder color */
110
- --color-placeholder: var(--color-stone-500);
109
+ --color-placeholder: var(--color-stone-600);
111
110
  /* used for outline/border as ring*/
112
111
  --color-ring: var(--color-stone-400);
113
112
 
@@ -144,14 +143,13 @@
144
143
 
145
144
  /* Border elevation - subtle shadow for input elements and cards */
146
145
  --shadow-elevation-border:
147
- 0px 0.3px 0.3px oklch(0 0 0 / 0.19),
148
- 0.1px 1.1px 1.2px -3px oklch(0 0 0 / 0.16);
146
+ 0px 0.3px 0.3px oklch(0 0 0 / 0.14), 0px 1px 1.2px -3px oklch(0 0 0 / 0.12);
149
147
 
150
148
  /* Raised elevation - moderate shadow for cards, tiles, and containers */
151
149
  --shadow-elevation-raised:
152
- 0px 0.3px 0.3px oklch(0 0 0 / 0.23),
153
- 0px 1.4px 1.3px -2px oklch(0 0 0 / 0.17),
154
- 0px 6.7px 6px -4px oklch(0 0 0 / 0.12);
150
+ 0px 0.3px 0.8px oklch(0 0 0 / 0.28),
151
+ 0px 1.4px 1.3px -2px oklch(0 0 0 / 0.21),
152
+ 0px 6.7px 6px -4px oklch(0 0 0 / 0.15);
155
153
 
156
154
  /* Overlay elevation - prominent shadow for modals, dialogs, popovers */
157
155
  --shadow-elevation-overlay:
@@ -192,13 +190,11 @@
192
190
 
193
191
  /* RELATIONAL SPACING */
194
192
 
195
- --spacing-joined: --spacing(0.25);
196
- --spacing-tight: --spacing(1);
193
+ --spacing-tight: --spacing(1.5);
197
194
  --spacing-related: --spacing(2);
198
- --spacing-peer: --spacing(4);
199
- --spacing-group: --spacing(8);
200
- --spacing-section: --spacing(16);
201
- --spacing-context: --spacing(32);
195
+ --spacing-regular: --spacing(6);
196
+ --spacing-group: --spacing(12);
197
+ --spacing-section: --spacing(24);
202
198
 
203
199
  /* INSET SPACING */
204
200
 
@@ -245,20 +241,18 @@
245
241
  --ease-in-expo: cubic-bezier(0.95, 0.05, 0.795, 0.035);
246
242
  --ease-in-circ: cubic-bezier(0.6, 0.04, 0.98, 0.335);
247
243
 
248
- --fade-in-duration: 0.25s;
249
- --fade-out-duration: 0.15s;
244
+ --fade-in-duration: 0.3s;
245
+ --fade-out-duration: 0.2s;
250
246
 
251
- --animate-fade-in: fade-in var(--fade-in-duration) var(--ease-out-cubic);
252
- --animate-fade-out: fade-in var(--fade-out-duration) reverse;
247
+ --animate-fade-in: fade-in var(--fade-in-duration) ease-out;
248
+ --animate-fade-out: fade-in var(--fade-out-duration) ease-in reverse;
253
249
 
254
250
  @keyframes fade-in {
255
251
  from {
256
252
  opacity: 0;
257
- filter: blur(6px);
258
253
  }
259
254
  to {
260
255
  opacity: 1;
261
- filter: blur(0);
262
256
  }
263
257
  }
264
258
 
@@ -267,13 +261,39 @@
267
261
  @keyframes fade-in-up {
268
262
  from {
269
263
  opacity: 0;
270
- transform: translateY(15px);
271
264
  filter: blur(6px);
265
+ transform: translateY(15px);
272
266
  }
273
267
  to {
274
268
  opacity: 1;
275
- transform: translateY(0);
276
269
  filter: blur(0);
270
+ transform: translateY(0);
271
+ }
272
+ }
273
+
274
+ /* ActionBar enter/exit */
275
+ --animate-slide-in: slide-in 0.25s var(--ease-out-quart) forwards;
276
+ --animate-slide-out: slide-out 0.2s var(--ease-out-quart) forwards;
277
+
278
+ @keyframes slide-in {
279
+ 0% {
280
+ opacity: 0;
281
+ transform: translateY(24px);
282
+ }
283
+ 100% {
284
+ opacity: 1;
285
+ transform: translateY(0);
286
+ }
287
+ }
288
+
289
+ @keyframes slide-out {
290
+ 0% {
291
+ opacity: 1;
292
+ transform: translateY(0);
293
+ }
294
+ 100% {
295
+ opacity: 0;
296
+ transform: translateY(16px);
277
297
  }
278
298
  }
279
299
 
@@ -283,11 +303,12 @@
283
303
 
284
304
  --animate-slide-in-right: slide-in-right var(--slide-in-duration)
285
305
  var(--ease-out-expo);
286
- --animate-slide-out-right: slide-in-right var(--slide-out-duration) reverse;
306
+ --animate-slide-out-right: slide-in-right var(--slide-out-duration) reverse
307
+ forwards;
287
308
 
288
309
  @keyframes slide-in-right {
289
310
  from {
290
- transform: translateX(100%);
311
+ transform: translateX(calc(100% + var(--slide-offset, 0px)));
291
312
  }
292
313
 
293
314
  to {
@@ -298,11 +319,12 @@
298
319
  /* animation slide in left*/
299
320
  --animate-slide-in-left: slide-in-left var(--slide-in-duration)
300
321
  var(--ease-out-expo);
301
- --animate-slide-out-left: slide-in-left var(--slide-out-duration) reverse;
322
+ --animate-slide-out-left: slide-in-left var(--slide-out-duration) reverse
323
+ forwards;
302
324
 
303
325
  @keyframes slide-in-left {
304
326
  from {
305
- transform: translateX(-100%);
327
+ transform: translateX(calc(-100% - var(--slide-offset, 0px)));
306
328
  }
307
329
 
308
330
  to {
@@ -313,11 +335,12 @@
313
335
  /* animation slide in top*/
314
336
  --animate-slide-in-top: slide-in-top var(--slide-in-duration)
315
337
  var(--ease-out-expo);
316
- --animate-slide-out-top: slide-in-top var(--slide-out-duration) reverse;
338
+ --animate-slide-out-top: slide-in-top var(--slide-out-duration) reverse
339
+ forwards;
317
340
 
318
341
  @keyframes slide-in-top {
319
342
  from {
320
- transform: translateY(-100%);
343
+ transform: translateY(calc(-100% - var(--slide-offset, 0px)));
321
344
  }
322
345
 
323
346
  to {
@@ -328,11 +351,12 @@
328
351
  /* animation slide in bottom*/
329
352
  --animate-slide-in-bottom: slide-in-bottom var(--slide-in-duration)
330
353
  var(--ease-out-expo);
331
- --animate-slide-out-bottom: slide-in-bottom var(--slide-out-duration) reverse;
354
+ --animate-slide-out-bottom: slide-in-bottom var(--slide-out-duration) reverse
355
+ forwards;
332
356
 
333
357
  @keyframes slide-in-bottom {
334
358
  from {
335
- transform: translateY(100%);
359
+ transform: translateY(calc(100% + var(--slide-offset, 0px)));
336
360
  }
337
361
 
338
362
  to {
package/dist/ui.css CHANGED
@@ -24,12 +24,9 @@
24
24
  /* Surface */
25
25
  /* ========================= */
26
26
 
27
- /*
28
- * The "ui-surface" utility defines visual surfaces with distinct background colors.
29
- * Apply elevation levels to them when needed (uses raised as default).
30
- *
31
- * This utility uses background-clip and background-origin with gradient borders.
32
- * The gradient border transitions from top (lighter) to bottom (darker).
27
+ /*
28
+ * Use for interactive UI elements like inputs, selects, and cards. Anything that
29
+ * sits on the page background and needs a clear visual boundary.
33
30
  */
34
31
  @utility ui-surface {
35
32
  @apply rounded-surface relative transition-[background,border,box-shadow];
@@ -46,11 +43,41 @@
46
43
  var(--ui-border-color, var(--color-surface-border)),
47
44
  oklch(from var(--ui-border-color, var(--color-surface-border)) calc(l - 0.1) c h)
48
45
  );
46
+
49
47
  background-clip: padding-box, border-box;
50
48
  background-origin: padding-box, border-box;
51
49
  border: 1px solid transparent;
52
50
  }
53
51
 
52
+ /*
53
+ * Use when the surface must stand out against the page. Toolbars, action bars,
54
+ * or anything that uses the brand color to signal prominence.
55
+ */
56
+ @utility ui-surface-contrast {
57
+ @apply rounded-surface relative transition-[background,border,box-shadow];
58
+ @apply text-brand-foreground;
59
+
60
+ @apply inset-shadow-[0_1px_0_0_var(--ui-highlight-color,oklch(from_var(--color-brand)_calc(l+0.4)_c_h))];
61
+
62
+ /* prettier-ignore */
63
+ background:
64
+ radial-gradient(ellipse 120% 60% at 50% -25%, var(--ui-highlight-color, oklch(from var(--color-brand) calc(l + 0.4) c h)), transparent 90%),
65
+ linear-gradient(
66
+ to bottom,
67
+ var(--ui-background-color, var(--color-brand)),
68
+ var(--ui-background-color, var(--color-brand))
69
+ ),
70
+ linear-gradient(
71
+ to bottom,
72
+ oklch(from var(--ui-border-color, var(--color-brand)) calc(l + 0.2) c h),
73
+ oklch(from var(--ui-border-color, var(--color-brand)) calc(l + 0.15) c h)
74
+ );
75
+
76
+ background-clip: padding-box, padding-box, border-box;
77
+ background-origin: padding-box, padding-box, border-box;
78
+ border: 1px solid transparent;
79
+ }
80
+
54
81
  /* ========================= */
55
82
  /* State */
56
83
  /* ========================= */
@@ -77,7 +104,10 @@
77
104
  * Applies a consistent visual style for disabled elements.
78
105
  */
79
106
  @utility ui-state-disabled {
80
- @apply text-disabled-foreground bg-disabled cursor-not-allowed;
107
+ @apply text-disabled-foreground cursor-not-allowed;
108
+ background: var(--color-disabled);
109
+ background-clip: border-box;
110
+ box-shadow: none;
81
111
  }
82
112
 
83
113
  /*
@@ -86,3 +116,117 @@
86
116
  @utility ui-state-readonly {
87
117
  --ui-background-color: var(--color-muted);
88
118
  }
119
+
120
+ /*
121
+ * Applies focus ring, disabled state, and pointer cursor to any interactive element.
122
+ * Combines: focus-visible:ui-state-focus, outline-none, disabled:ui-state-disabled, cursor-pointer
123
+ */
124
+ @utility ui-interactive {
125
+ @apply cursor-pointer outline-none;
126
+ @apply focus-visible:ui-state-focus;
127
+ @apply disabled:ui-state-disabled;
128
+ }
129
+
130
+ /*
131
+ * Base styles shared by all button-like elements (Button, ToggleButton, Menu.button,
132
+ * Pagination buttons, IconButton).
133
+ */
134
+ @utility ui-button-base {
135
+ @apply inline-flex items-center justify-center;
136
+ @apply rounded-surface font-medium whitespace-nowrap transition-[color,box-shadow,transform];
137
+ @apply ui-interactive;
138
+ @apply border border-transparent;
139
+
140
+ & svg {
141
+ pointer-events: none;
142
+ flex-shrink: 0;
143
+ }
144
+ }
145
+
146
+ /*
147
+ * Applies press/tap scale feedback (150ms, 97% scale on :active and [data-pressed]).
148
+ * Used by button-like elements that are not regular Buttons (which have a different
149
+ * pressed:not-aria-expanded variant).
150
+ */
151
+ @utility ui-press {
152
+ transition-duration: 150ms;
153
+ &:active {
154
+ scale: 0.97;
155
+ }
156
+ &[data-pressed] {
157
+ scale: 0.97;
158
+ }
159
+ }
160
+
161
+ /*
162
+ * Standard panel header slot — shared by Drawer and Tray.
163
+ */
164
+ @utility ui-panel-header {
165
+ @apply border-border border-b px-6 py-4;
166
+ }
167
+
168
+ /*
169
+ * Standard panel actions slot — shared by Drawer and Tray.
170
+ */
171
+ @utility ui-panel-actions {
172
+ @apply border-border flex flex-row justify-end gap-3 border-t px-6 py-4;
173
+ }
174
+
175
+ /* ========================= */
176
+ /* Touch & Scroll */
177
+ /* ========================= */
178
+
179
+ /*
180
+ * Applies a touch-friendly hitbox to elements, ensuring they are easily tappable on touch devices.
181
+ * This is important for accessibility, as it helps meet WCAG guidelines for minimum touch target size
182
+ * and improves usability for users with motor impairments.
183
+ */
184
+ @utility ui-touch-hitbox {
185
+ position: relative;
186
+ &:before {
187
+ content: '';
188
+ position: absolute;
189
+ display: block;
190
+ top: 50%;
191
+ left: 50%;
192
+ transform: translate(-50%, -50%);
193
+ width: 100%;
194
+ height: 100%;
195
+ /* Touch target minimum 24x24px (WCAG 2.1 AA) */
196
+ /* For WCAG 2.2 compliance, update to 44x44px */
197
+ /* Uses z-100 to ensure hitbox is above content but below system overlays */
198
+ min-height: 24px;
199
+ min-width: 24px;
200
+ z-index: 100;
201
+ }
202
+ }
203
+
204
+ /*
205
+ * Custom scrollbar styling to match the theme's design.
206
+ * This utility provides a consistent look for scrollbars across different browsers.
207
+ */
208
+ @utility ui-scrollbar {
209
+ scrollbar-width: auto;
210
+ scrollbar-color: var(--color-scrollbar) var(--color-scrollbar-track);
211
+
212
+ &::-webkit-scrollbar {
213
+ display: block;
214
+ width: 12px;
215
+ height: 12px;
216
+ }
217
+
218
+ &::-webkit-scrollbar-track {
219
+ background-color: var(--color-scrollbar-track);
220
+ border-radius: var(--radius-full);
221
+ }
222
+
223
+ &::-webkit-scrollbar-thumb {
224
+ transition: background-color 0.2s var(--ease-out-quad);
225
+ background-color: var(--color-scrollbar);
226
+ border-radius: var(--radius-full);
227
+ border: 0px solid transparent;
228
+ }
229
+ &::-webkit-scrollbar-thumb:hover {
230
+ background-color: var(--color-scrollbar-hover);
231
+ }
232
+ }
package/dist/utils.css CHANGED
@@ -5,63 +5,6 @@
5
5
  * encapsulate common design decisions across the theme.
6
6
  */
7
7
 
8
- /*
9
- * Applies a touch-friendly hitbox to elements, ensuring they are easily tappable on touch devices.
10
- * This is important for accessibility, as it helps meet WCAG guidelines for minimum touch target size
11
- * and improves usability for users with motor impairments.
12
- */
13
- @utility util-touch-hitbox {
14
- position: relative;
15
- &:before {
16
- content: '';
17
- position: absolute;
18
- display: block;
19
- top: 50%;
20
- left: 50%;
21
- transform: translate(-50%, -50%);
22
- width: 100%;
23
- height: 100%;
24
- /* Touch target minimum 24x24px (WCAG 2.1 AA) */
25
- /* For WCAG 2.2 compliance, update to 44x44px */
26
- /* Uses z-100 to ensure hitbox is above content but below system overlays */
27
- min-height: 24px;
28
- min-width: 24px;
29
- z-index: 100;
30
- }
31
- }
32
-
33
- /*
34
- * Custom scrollbar styling to match the theme's design.
35
- * This utility provides a consistent look for scrollbars across different browsers.
36
- */
37
- @utility util-scrollbar {
38
- scrollbar-width: auto;
39
- scrollbar-color: var(--color-scrollbar) var(--color-scrollbar-track);
40
-
41
- &::-webkit-scrollbar {
42
- display: block;
43
- width: 12px;
44
- height: 12px;
45
- }
46
-
47
- &::-webkit-scrollbar-track {
48
- background-color: var(--color-scrollbar-track);
49
- border-radius: var(--radius-full);
50
- }
51
-
52
- &::-webkit-scrollbar-thumb {
53
- transition: background-color 0.2s var(--ease-out-quad);
54
- background-color: var(--color-scrollbar);
55
- border-radius: var(--radius-full);
56
- border: 0px solid transparent;
57
- }
58
- &::-webkit-scrollbar-thumb:hover {
59
- background-color: var(--color-scrollbar-hover);
60
- }
61
- }
62
-
63
- /* ========================================================== */
64
-
65
8
  /* ========================= */
66
9
  /* Surface & Elevation */
67
10
  /* ========================= */
package/dist/variants.css CHANGED
@@ -3,3 +3,4 @@
3
3
  * Meaning they are not disabled, not focused, and not marked as invalid.
4
4
  */
5
5
  @custom-variant default-state (&:where(:not(:disabled, :focus-visible, :read-only, [aria-invalid="true"], [data-rac][data-invalid="true"], [aria-readonly="true"])));
6
+ @custom-variant in-field (:is(.group\/field) > &);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@marigold/theme-rui",
3
- "version": "5.1.0",
3
+ "version": "5.2.0",
4
4
  "description": "Marigold RUI Theme",
5
5
  "license": "MIT",
6
6
  "keywords": [
@@ -14,9 +14,15 @@
14
14
  "types": "./dist/index.d.ts",
15
15
  "exports": {
16
16
  ".": {
17
+ "types": "./dist/index.d.mts",
17
18
  "require": "./dist/index.js",
18
19
  "import": "./dist/index.mjs"
19
20
  },
21
+ "./appearances": {
22
+ "types": "./dist/appearances.d.mts",
23
+ "require": "./dist/appearances.js",
24
+ "import": "./dist/appearances.mjs"
25
+ },
20
26
  "./*": {
21
27
  "require": "./dist/*.js",
22
28
  "import": "./dist/*.mjs"
@@ -43,22 +49,23 @@
43
49
  "directory": "themes/theme-rui"
44
50
  },
45
51
  "devDependencies": {
46
- "@tailwindcss/postcss": "4.1.18",
52
+ "@tailwindcss/postcss": "4.2.1",
47
53
  "cross-env": "^10.0.0",
48
- "cssnano": "7.1.2",
54
+ "cssnano": "7.1.3",
49
55
  "postcss-cli": "11.0.1",
56
+ "postcss-prefix-selector": "2.1.1",
50
57
  "shx": "^0.4.0",
51
- "tailwindcss": "4.1.18",
52
- "tsdown": "0.16.8",
58
+ "tailwindcss": "4.2.1",
59
+ "tsdown": "0.20.3",
60
+ "typescript": "5.9.3",
53
61
  "@marigold/tsconfig": "0.4.2"
54
62
  },
55
63
  "dependencies": {
56
- "tailwindcss-animate": "1.0.7",
57
64
  "tailwindcss-react-aria-components": "^2.0.1",
58
- "@marigold/components": "17.1.0",
59
- "@marigold/system": "17.1.0"
65
+ "@marigold/components": "17.2.0",
66
+ "@marigold/system": "17.2.0"
60
67
  },
61
68
  "scripts": {
62
- "build": "cross-env NODE_ENV=production tsdown && postcss -o dist/styles.css src/styles.css && shx cp src/theme.css src/global.css src/utils.css src/variants.css src/ui.css dist/"
69
+ "build": "node ./scripts/build-appearances.mjs && cross-env NODE_ENV=production tsdown && postcss -o dist/styles.css src/styles.css && shx cp src/theme.css src/global.css src/utils.css src/variants.css src/ui.css dist/"
63
70
  }
64
71
  }