@proteos/ui 0.37.0 → 0.39.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 (2) hide show
  1. package/package.json +2 -2
  2. package/src/styles.css +81 -67
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@proteos/ui",
3
- "version": "0.37.0",
3
+ "version": "0.39.0",
4
4
  "license": "FSL-1.1-Apache-2.0",
5
5
  "description": "Proteos React component library (React Aria Components + Tailwind v4).",
6
6
  "repository": {
@@ -55,7 +55,7 @@
55
55
  "tailwind-merge": "^3.5.0",
56
56
  "tailwind-variants": "^3.2.2",
57
57
  "tailwindcss": "^4.2.4",
58
- "@proteos/sdk": "0.37.0"
58
+ "@proteos/sdk": "0.39.0"
59
59
  },
60
60
  "devDependencies": {
61
61
  "@biomejs/biome": "^2.4.13",
package/src/styles.css CHANGED
@@ -25,28 +25,31 @@
25
25
  /* Base — the page/chrome background the app shell paints. The majority
26
26
  surface: pages, panels, headers, toolbars, tables, ghost buttons.
27
27
  Split from --color-surface so themes can lift raised blocks off it;
28
- in paper the two are identical. */
29
- --color-bg: #f2f0ea;
28
+ in paper the two are identical.
29
+
30
+ These base values are the LIGHT theme — light is the default, i.e. the
31
+ absence of data-theme (see the theme-mode blocks below). */
32
+ --color-bg: #fbfbfc;
30
33
 
31
34
  /* Surfaces — raised blocks that sit ON the base: cards, popovers, modals,
32
35
  inputs. surface-2/-3 are the recessed tint steps (hovers, read-only
33
- boxes, chips, table-header fill), stepped darker in paper. */
34
- --color-surface: #f2f0ea;
35
- --color-surface-2: #e7e4db;
36
- --color-surface-3: #dcd8cc;
36
+ boxes, chips, table-header fill). */
37
+ --color-surface: #ffffff;
38
+ --color-surface-2: #f0f0f2;
39
+ --color-surface-3: #e5e5e9;
37
40
 
38
41
  /* Ink — indigo-tinted slate */
39
42
  --color-ink: #1a1d2b;
40
- --color-ink-2: #353a4b;
41
- --color-ink-3: #686c7a;
42
- --color-ink-4: #9a9ca6;
43
+ --color-ink-2: #383d4e;
44
+ --color-ink-3: #63677a;
45
+ --color-ink-4: #7e818f;
43
46
 
44
47
  /* Hairlines. rule-strong marks interactive-control borders (inputs,
45
- ghost buttons, segmented tracks) — equal to rule in paper, darker in
46
- the light/dark themes so touchable chrome pops. */
47
- --color-rule: #cfcbbd;
48
- --color-rule-2: #dbd7c9;
49
- --color-rule-strong: #cfcbbd;
48
+ ghost buttons, segmented tracks) — darker than rule in light/dark so
49
+ touchable chrome pops; equal to rule in paper. */
50
+ --color-rule: #d7d7dc;
51
+ --color-rule-2: #e6e6ea;
52
+ --color-rule-strong: #b0b1ba;
50
53
 
51
54
  /* Accent — deep indigo */
52
55
  --color-accent: #2f3a66;
@@ -90,17 +93,15 @@
90
93
  --radius-xl: 18px;
91
94
  --radius-pill: 999px;
92
95
 
93
- /* Shadows — warm, low-key */
94
- --shadow-inset: 0 1px 0 rgba(255, 255, 255, 0.6) inset,
95
- 0 1px 2px rgba(26, 29, 43, 0.05);
96
- --shadow-rest: 0 1px 0 rgba(255, 255, 255, 0.6) inset,
97
- 0 4px 10px -4px rgba(26, 29, 43, 0.1), 0 1px 2px rgba(26, 29, 43, 0.05);
98
- --shadow-raised: 0 1px 0 rgba(255, 255, 255, 0.6) inset,
99
- 0 14px 30px -14px rgba(26, 29, 43, 0.18),
100
- 0 2px 4px rgba(26, 29, 43, 0.05);
101
- --shadow-float: 0 1px 0 rgba(255, 255, 255, 0.6) inset,
102
- 0 30px 60px -30px rgba(26, 29, 43, 0.28),
103
- 0 2px 6px rgba(26, 29, 43, 0.06);
96
+ /* Shadows — cool, crisp. No white top-inset highlight: it's invisible on
97
+ white surfaces (paper re-adds it in its override block). */
98
+ --shadow-inset: 0 1px 2px rgba(23, 25, 45, 0.05);
99
+ --shadow-rest: 0 1px 2px rgba(23, 25, 45, 0.05),
100
+ 0 3px 10px -3px rgba(23, 25, 45, 0.07);
101
+ --shadow-raised: 0 2px 4px rgba(23, 25, 45, 0.05),
102
+ 0 12px 28px -10px rgba(23, 25, 45, 0.14);
103
+ --shadow-float: 0 4px 10px rgba(23, 25, 45, 0.06),
104
+ 0 28px 60px -20px rgba(23, 25, 45, 0.22);
104
105
  --shadow-focus: 0 0 0 4px color-mix(in oklab, var(--color-accent) 22%, transparent);
105
106
  --shadow-focus-danger: 0 0 0 4px
106
107
  color-mix(in oklab, var(--color-danger) 18%, transparent);
@@ -165,54 +166,67 @@
165
166
 
166
167
  /* Table zebra-stripe + row-hover strength — the % of ink mixed into the
167
168
  page bg per row (see Table). Per-theme so each mode tunes independently:
168
- near-white bases show a given delta more, so light dials down. Paper 3%
169
- matches the pre-theme stripe tone. */
170
- --row-stripe: 3%;
171
- --row-hover: 6%;
169
+ near-white bases show a given delta more, so light (the default here)
170
+ dials down; paper lifts back to 3%. */
171
+ --row-stripe: 2%;
172
+ --row-hover: 4%;
172
173
 
173
174
  color-scheme: light;
174
175
  }
175
176
 
176
177
  /* ==========================================================
177
- Theme modes — paper (default, tokens above) · light · dark.
178
+ Theme modes — light (default, tokens above) · paper · dark.
178
179
  Switched via data-theme on <html> (see clients/web lib/theme.ts).
180
+ Light = the ABSENCE of the attribute, so anything rendering these
181
+ tokens without the pre-paint script (iframes, public pages, Storybook)
182
+ lands on light.
179
183
  Plain unlayered blocks: they beat Tailwind's @layer theme :root
180
184
  declarations, and [data-theme] beats :root on specificity. Tailwind
181
185
  utilities resolve var(--color-*) / var(--shadow-*) at use-time, so
182
186
  redefining the custom properties re-skins every component.
183
187
  ========================================================== */
184
188
 
185
- /* Light — white surfaces lifted off a cool-gray base. */
189
+ /* Light — same tokens as the base above. The attribute is never written for
190
+ light (setTheme removes it), but a stale stored value or a module bundle
191
+ may still set it, so it must resolve to the light ramp rather than dark. */
186
192
  :root[data-theme='light'] {
187
- --color-bg: #fbfbfc;
188
- --color-surface: #ffffff;
189
- --color-surface-2: #f0f0f2;
190
- --color-surface-3: #e5e5e9;
193
+ color-scheme: light;
194
+ }
195
+
196
+ /* Paper — warm sand surfaces, the original Proteos skin. Opt-in. */
197
+ :root[data-theme='paper'] {
198
+ --color-bg: #f2f0ea;
199
+ --color-surface: #f2f0ea;
200
+ --color-surface-2: #e7e4db;
201
+ --color-surface-3: #dcd8cc;
191
202
 
192
203
  --color-ink: #1a1d2b;
193
- --color-ink-2: #383d4e;
194
- --color-ink-3: #63677a;
195
- --color-ink-4: #7e818f;
204
+ --color-ink-2: #353a4b;
205
+ --color-ink-3: #686c7a;
206
+ --color-ink-4: #9a9ca6;
196
207
 
197
- --color-rule: #d7d7dc;
198
- --color-rule-2: #e6e6ea;
199
- --color-rule-strong: #b0b1ba;
208
+ /* rule-strong equals rule here — the warm hairline already reads. */
209
+ --color-rule: #cfcbbd;
210
+ --color-rule-2: #dbd7c9;
211
+ --color-rule-strong: #cfcbbd;
200
212
 
201
- /* Softer stripes — the near-white base makes any delta read stronger. */
202
- --row-stripe: 2%;
203
- --row-hover: 4%;
213
+ /* Stronger stripes — the sand base swallows a delta the white one shows. */
214
+ --row-stripe: 3%;
215
+ --row-hover: 6%;
204
216
 
205
- /* Accent, semantics, indigo ramp, tiles — unchanged from paper. */
217
+ /* Accent, semantics, indigo ramp, tiles — unchanged from light. */
206
218
 
207
- /* Cooler, crisper shadows; the white top-inset highlight from paper is
208
- dropped — invisible on white surfaces. */
209
- --shadow-inset: 0 1px 2px rgba(23, 25, 45, 0.05);
210
- --shadow-rest: 0 1px 2px rgba(23, 25, 45, 0.05),
211
- 0 3px 10px -3px rgba(23, 25, 45, 0.07);
212
- --shadow-raised: 0 2px 4px rgba(23, 25, 45, 0.05),
213
- 0 12px 28px -10px rgba(23, 25, 45, 0.14);
214
- --shadow-float: 0 4px 10px rgba(23, 25, 45, 0.06),
215
- 0 28px 60px -20px rgba(23, 25, 45, 0.22);
219
+ /* Warm, low-key shadows with a white top-inset highlight. */
220
+ --shadow-inset: 0 1px 0 rgba(255, 255, 255, 0.6) inset,
221
+ 0 1px 2px rgba(26, 29, 43, 0.05);
222
+ --shadow-rest: 0 1px 0 rgba(255, 255, 255, 0.6) inset,
223
+ 0 4px 10px -4px rgba(26, 29, 43, 0.1), 0 1px 2px rgba(26, 29, 43, 0.05);
224
+ --shadow-raised: 0 1px 0 rgba(255, 255, 255, 0.6) inset,
225
+ 0 14px 30px -14px rgba(26, 29, 43, 0.18),
226
+ 0 2px 4px rgba(26, 29, 43, 0.05);
227
+ --shadow-float: 0 1px 0 rgba(255, 255, 255, 0.6) inset,
228
+ 0 30px 60px -30px rgba(26, 29, 43, 0.28),
229
+ 0 2px 6px rgba(26, 29, 43, 0.06);
216
230
  }
217
231
 
218
232
  /* Dark — parallel ramp, not an inversion. Accent lifts to a lighter
@@ -276,9 +290,13 @@
276
290
  color-mix(in oklab, var(--color-danger) 28%, transparent);
277
291
  }
278
292
 
279
- /* Paper grain — faint dotted multiply overlay, identical to the design system spec.
280
- Applied as a fixed decorative layer above content but below interactive chrome. */
281
- .proteos-grain::before {
293
+ /* Paper grain — faint dotted multiply overlay, identical to the design system
294
+ spec. A fixed decorative layer above content but below interactive chrome.
295
+ Paper-mode signature ONLY: on white it reads as dirt, and the multiply dots
296
+ vanish or muddy on dark — so it is gated on the attribute (absent = light =
297
+ no grain). `.proteos-grain-dots` gates inline-styled dot overlays
298
+ (page-designer canvas) the same way. */
299
+ :root[data-theme='paper'] .proteos-grain::before {
282
300
  content: "";
283
301
  position: fixed;
284
302
  inset: 0;
@@ -293,18 +311,14 @@
293
311
  background-position: 0 0, 1px 2px;
294
312
  }
295
313
 
296
- /* Grain is a paper-mode signature only. On white it reads as dirt; the
297
- multiply dots vanish or muddy on dark. Absent attribute = paper.
298
- `.proteos-grain-dots` gates inline-styled dot overlays (page-designer
299
- canvas) the same way. */
300
- :root[data-theme='light'] .proteos-grain::before,
301
- :root[data-theme='dark'] .proteos-grain::before {
302
- content: none;
314
+ /* Hidden everywhere but paper (the canvas overlay is a plain <div>, so the
315
+ paper state is `block`). */
316
+ .proteos-grain-dots {
317
+ display: none;
303
318
  }
304
319
 
305
- :root[data-theme='light'] .proteos-grain-dots,
306
- :root[data-theme='dark'] .proteos-grain-dots {
307
- display: none;
320
+ :root[data-theme='paper'] .proteos-grain-dots {
321
+ display: block;
308
322
  }
309
323
 
310
324
  /* DEPRECATED aliases for module components built before the surface rename