@softize/opus 29.0.0 → 31.0.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 (59) hide show
  1. package/CHANGELOG.md +137 -0
  2. package/bin/lib/check.mjs +178 -94
  3. package/bin/lib/copy.mjs +2970 -1801
  4. package/docs/adr/0043-neutral-surfaces-and-interactions-use-opaque-role-tokens.md +52 -0
  5. package/docs/adr/0044-neutral-appearance-derives-from-bounded-axes-per-mode.md +27 -2
  6. package/docs/adr/0045-surface-replaces-content-and-card.md +3 -0
  7. package/docs/adr/0060-surface-composition-separates-chrome-and-intro.md +142 -0
  8. package/docs/adr/0062-listas-contidas-e-texto-flexivel.md +68 -0
  9. package/docs/adr/0063-metadados-das-superficies.md +44 -0
  10. package/docs/adr/0064-action-list-com-itens-e-fontes-externas.md +47 -0
  11. package/docs/adr/0065-presentation-composes-settings-sections.md +295 -0
  12. package/docs/adr/README.md +8 -0
  13. package/package.json +1 -1
  14. package/registry/skills/build-opus-ui/SKILL.md +21 -19
  15. package/registry/skills/build-opus-ui/references/evaluations.md +21 -10
  16. package/registry/skills/build-opus-ui/references/ui-patterns.md +33 -28
  17. package/src/core/presentation.ts +938 -32
  18. package/src/core/types.ts +2 -1
  19. package/src/ui/components/patterns/form.tsx +2 -0
  20. package/src/ui/components/patterns/grouped-list.ts +2 -2
  21. package/src/ui/components/patterns/list.tsx +588 -365
  22. package/src/ui/components/patterns/page-heading-context.tsx +12 -5
  23. package/src/ui/components/patterns/page.tsx +238 -181
  24. package/src/ui/components/patterns/presentation-fields.tsx +246 -0
  25. package/src/ui/components/patterns/presentation-sections.tsx +494 -0
  26. package/src/ui/components/patterns/presentation.tsx +1142 -229
  27. package/src/ui/components/patterns/structural-header.tsx +47 -34
  28. package/src/ui/components/patterns/surface-anatomy.ts +27 -217
  29. package/src/ui/components/patterns/surface.tsx +55 -37
  30. package/src/ui/components/patterns/trigger.tsx +10 -2
  31. package/src/ui/components/primitives/close-button.tsx +11 -3
  32. package/src/ui/components/primitives/command.tsx +2 -8
  33. package/src/ui/components/primitives/detail.tsx +1 -1
  34. package/src/ui/components/primitives/dialog.tsx +59 -89
  35. package/src/ui/components/primitives/drawer.tsx +52 -87
  36. package/src/ui/components/primitives/field.tsx +1 -1
  37. package/src/ui/components/primitives/pagination.tsx +3 -2
  38. package/src/ui/components/primitives/table.tsx +3 -3
  39. package/src/ui/components/primitives/tabs.tsx +13 -2
  40. package/src/ui/docs/content/action-form.md +2 -1
  41. package/src/ui/docs/content/action-list.md +146 -73
  42. package/src/ui/docs/content/action-trigger.md +5 -0
  43. package/src/ui/docs/content/button.md +5 -6
  44. package/src/ui/docs/content/command.md +62 -50
  45. package/src/ui/docs/content/compositions.md +129 -459
  46. package/src/ui/docs/content/dialog.md +72 -101
  47. package/src/ui/docs/content/drawer.md +69 -92
  48. package/src/ui/docs/content/field.md +2 -1
  49. package/src/ui/docs/content/page.md +207 -386
  50. package/src/ui/docs/content/presentation.md +371 -23
  51. package/src/ui/docs/content/separator.md +1 -1
  52. package/src/ui/docs/content/surface.md +94 -116
  53. package/src/ui/docs/content/table.md +7 -0
  54. package/src/ui/docs/content/tokens.md +18 -4
  55. package/src/ui/drivers/context.tsx +11 -4
  56. package/src/ui/drivers/react.tsx +27 -7
  57. package/src/ui/meta.ts +5 -5
  58. package/src/ui/react.tsx +38 -8
  59. package/src/ui/theme.css +44 -33
package/src/ui/theme.css CHANGED
@@ -15,8 +15,8 @@
15
15
  * utilitários `rounded-*` — neutraliza o rename do v4 e mantém a escala monotônica.
16
16
  * 4. Escala shadow-* recomposta diretamente em duas camadas claras, difusas e com spread
17
17
  * negativo — preserva inclusive modifiers como `shadow-lg/30` (ver docs/elevation-scale.md).
18
- * 5. Bordas mais leves no light: --border/--input em 92.5% (upstream 89.8%) — par do
19
- * canvas quase-branco; superfícies elevadas usam a mesma borda real dos demais papéis.
18
+ * 5. Bordas mais leves no light: --border/--input em 92% (upstream 89.8%) — par do
19
+ * canvas branco; superfícies elevadas usam a mesma borda real dos demais papéis.
20
20
  * 6. Radius base em 0.75rem — identidade mais arredondada; os componentes continuam usando
21
21
  * diretamente a escala Tailwind, sem tokens por papel (ver docs/radius-scale.md).
22
22
  * Tudo o mais (semânticas e contratos das primitives) segue o upstream.
@@ -62,9 +62,9 @@
62
62
  --appearance-layer-contrast: var(--appearance-light-layer-contrast);
63
63
 
64
64
  /* Escala neutra derivada (luminosidade em número, 0 a 100). No claro a superfície elevada
65
- parte do branco; o canvas desce dela conforme o contraste entre camadas e o controle fica
66
- entre os dois. Estados neutros, muted e bordas descem a partir do canvas — a superfície
67
- mais escura — na direção do texto, em passos que o contraste amplia. O texto secundário
65
+ parte do branco; canvas e controle também são brancos no preset. O contraste entre camadas
66
+ separa esses papéis. Estados neutros, muted e bordas preservam a base de calibração anterior,
67
+ um ponto abaixo do canvas, e avançam na direção do texto em passos que o contraste amplia. O texto secundário
68
68
  recebe só uma fração da saturação e escurece junto com as superfícies e com a intensidade,
69
69
  para que nem o ajuste nem o matiz escolhido pelo app reduzam a leitura. */
70
70
  --neutral-saturation: calc(var(--appearance-color-intensity) * 0.2%);
@@ -72,18 +72,18 @@
72
72
  --neutral-step: calc(1 + var(--appearance-contrast) * 0.01);
73
73
  --neutral-layer-l: calc(95 + var(--appearance-surface-brightness) * 0.05);
74
74
  --neutral-canvas-l: calc(
75
- var(--neutral-layer-l) - 2.5 - var(--appearance-layer-contrast) * 0.025
75
+ var(--neutral-layer-l) - var(--appearance-layer-contrast) * 0.025
76
76
  );
77
77
  --neutral-control-l: calc(
78
- var(--neutral-canvas-l) + 1 + var(--appearance-layer-contrast) * 0.01
78
+ var(--neutral-canvas-l) + var(--appearance-layer-contrast) * 0.01
79
79
  );
80
- --neutral-muted-l: calc(var(--neutral-canvas-l) - 1.4 * var(--neutral-step));
81
- --neutral-hover-l: calc(var(--neutral-canvas-l) - 2 * var(--neutral-step));
82
- --neutral-selected-l: calc(var(--neutral-canvas-l) - 5 * var(--neutral-step));
80
+ --neutral-muted-l: calc(var(--neutral-canvas-l) - 1 - 2.5 * var(--neutral-step));
81
+ --neutral-hover-l: calc(var(--neutral-canvas-l) - 1 - 3.3 * var(--neutral-step));
82
+ --neutral-selected-l: calc(var(--neutral-canvas-l) - 1 - 5 * var(--neutral-step));
83
83
  --neutral-pressed-l: calc(
84
- var(--neutral-canvas-l) - 6.5 * var(--neutral-step)
84
+ var(--neutral-canvas-l) - 1 - 8 * var(--neutral-step)
85
85
  );
86
- --neutral-line-l: calc(var(--neutral-canvas-l) - 5 * var(--neutral-step));
86
+ --neutral-line-l: calc(var(--neutral-canvas-l) - 1 - 7 * var(--neutral-step));
87
87
  --neutral-ring-l: calc(var(--neutral-line-l) - 6.5 * var(--neutral-step));
88
88
  --neutral-muted-foreground-l: calc(
89
89
  45.1 - (96.1 - var(--neutral-muted-l)) * 0.8 -
@@ -136,6 +136,11 @@
136
136
  var(--neutral-hue) var(--neutral-text-saturation)
137
137
  calc(var(--neutral-muted-foreground-l) * 1%)
138
138
  );
139
+ --sidebar-global: var(--background);
140
+ --sidebar: hsl(
141
+ var(--neutral-hue) var(--neutral-saturation)
142
+ calc((var(--neutral-canvas-l) - 1) * 1%)
143
+ );
139
144
  --accent: var(--interaction-hover);
140
145
  --accent-foreground: hsl(var(--neutral-hue) var(--neutral-saturation) 9%);
141
146
  --destructive: hsl(0 84.2% 60.2%);
@@ -212,7 +217,7 @@
212
217
  --appearance-surface-brightness: var(--appearance-dark-surface-brightness);
213
218
  --appearance-layer-contrast: var(--appearance-dark-layer-contrast);
214
219
 
215
- /* No escuro o brilho leva o canvas do preto, em 0, até um escuro suave, em 100. Elevação com
220
+ /* No escuro o brilho move o canvas em uma faixa escura. Elevação com
216
221
  contraste de verdade (dialog e card "sobem" da página): a camada sobe do canvas conforme o
217
222
  contraste entre camadas e o controle fica entre os dois. Estados neutros, muted e bordas
218
223
  sobem a partir da camada — a superfície mais clara — na direção do texto. Mesmos papéis do
@@ -221,20 +226,22 @@
221
226
  --neutral-saturation: calc(var(--appearance-color-intensity) * 0.2%);
222
227
  --neutral-text-saturation: calc(var(--appearance-color-intensity) * 0.08%);
223
228
  --neutral-step: calc(1 + var(--appearance-contrast) * 0.006);
224
- --neutral-canvas-l: calc(var(--appearance-surface-brightness) * 0.078);
229
+ /* Redução proporcional aplicada uma vez às superfícies e linhas, sem escurecer o texto. */
230
+ --neutral-surface-scale: 0.95;
231
+ --neutral-canvas-l: calc(5.5 + var(--appearance-surface-brightness) * 0.078);
225
232
  --neutral-layer-l: calc(
226
- var(--neutral-canvas-l) + 6.1 + var(--appearance-layer-contrast) * 0.03
233
+ var(--neutral-canvas-l) + 2 + var(--appearance-layer-contrast) * 0.03
227
234
  );
228
235
  --neutral-control-l: calc(
229
- var(--neutral-canvas-l) + 3.8 + var(--appearance-layer-contrast) * 0.018
236
+ var(--neutral-canvas-l) + 1 + var(--appearance-layer-contrast) * 0.018
230
237
  );
231
- --neutral-muted-l: calc(var(--neutral-layer-l) + 4.9 * var(--neutral-step));
232
- --neutral-hover-l: calc(var(--neutral-layer-l) + 4.9 * var(--neutral-step));
238
+ --neutral-muted-l: calc(var(--neutral-layer-l) + 3.5 * var(--neutral-step));
239
+ --neutral-hover-l: calc(var(--neutral-layer-l) + 5.5 * var(--neutral-step));
233
240
  --neutral-selected-l: calc(
234
- var(--neutral-layer-l) + 8.5 * var(--neutral-step)
241
+ var(--neutral-layer-l) + 7.1 * var(--neutral-step)
235
242
  );
236
- --neutral-pressed-l: calc(var(--neutral-layer-l) + 11 * var(--neutral-step));
237
- --neutral-line-l: calc(var(--neutral-layer-l) + 6.5 * var(--neutral-step));
243
+ --neutral-pressed-l: calc(var(--neutral-layer-l) + 9.6 * var(--neutral-step));
244
+ --neutral-line-l: calc(var(--neutral-layer-l) + 9.6 * var(--neutral-step));
238
245
  --neutral-ring-l: calc(var(--neutral-line-l) + 19.5 * var(--neutral-step));
239
246
  --neutral-muted-foreground-l: calc(
240
247
  63.9 + max(0, var(--neutral-muted-l) - 14.9) * 1.6 +
@@ -243,50 +250,52 @@
243
250
 
244
251
  --background: hsl(
245
252
  var(--neutral-hue) var(--neutral-saturation)
246
- calc(var(--neutral-canvas-l) * 1%)
253
+ calc(var(--neutral-canvas-l) * var(--neutral-surface-scale) * 1%)
247
254
  );
248
255
  --foreground: hsl(var(--neutral-hue) var(--neutral-saturation) 98%);
249
256
  --card: hsl(
250
257
  var(--neutral-hue) var(--neutral-saturation)
251
- calc(var(--neutral-layer-l) * 1%)
258
+ calc(var(--neutral-layer-l) * var(--neutral-surface-scale) * 1%)
252
259
  );
253
260
  --card-foreground: hsl(var(--neutral-hue) var(--neutral-saturation) 98%);
254
261
  --control: hsl(
255
262
  var(--neutral-hue) var(--neutral-saturation)
256
- calc(var(--neutral-control-l) * 1%)
263
+ calc(var(--neutral-control-l) * var(--neutral-surface-scale) * 1%)
257
264
  );
258
265
  --interaction-hover: hsl(
259
266
  var(--neutral-hue) var(--neutral-saturation)
260
- calc(var(--neutral-hover-l) * 1%)
267
+ calc(var(--neutral-hover-l) * var(--neutral-surface-scale) * 1%)
261
268
  );
262
269
  --interaction-selected: hsl(
263
270
  var(--neutral-hue) var(--neutral-saturation)
264
- calc(var(--neutral-selected-l) * 1%)
271
+ calc(var(--neutral-selected-l) * var(--neutral-surface-scale) * 1%)
265
272
  );
266
273
  --interaction-pressed: hsl(
267
274
  var(--neutral-hue) var(--neutral-saturation)
268
- calc(var(--neutral-pressed-l) * 1%)
275
+ calc(var(--neutral-pressed-l) * var(--neutral-surface-scale) * 1%)
269
276
  );
270
277
  --popover: hsl(
271
278
  var(--neutral-hue) var(--neutral-saturation)
272
- calc(var(--neutral-layer-l) * 1%)
279
+ calc(var(--neutral-layer-l) * var(--neutral-surface-scale) * 1%)
273
280
  );
274
281
  --popover-foreground: hsl(var(--neutral-hue) var(--neutral-saturation) 98%);
275
282
  --primary: hsl(0 0% 98%);
276
283
  --primary-foreground: hsl(0 0% 9%);
277
284
  --secondary: hsl(
278
285
  var(--neutral-hue) var(--neutral-saturation)
279
- calc(var(--neutral-muted-l) * 1%)
286
+ calc(var(--neutral-muted-l) * var(--neutral-surface-scale) * 1%)
280
287
  );
281
288
  --secondary-foreground: hsl(var(--neutral-hue) var(--neutral-saturation) 98%);
282
289
  --muted: hsl(
283
290
  var(--neutral-hue) var(--neutral-saturation)
284
- calc(var(--neutral-muted-l) * 1%)
291
+ calc(var(--neutral-muted-l) * var(--neutral-surface-scale) * 1%)
285
292
  );
286
293
  --muted-foreground: hsl(
287
294
  var(--neutral-hue) var(--neutral-text-saturation)
288
295
  calc(var(--neutral-muted-foreground-l) * 1%)
289
296
  );
297
+ --sidebar-global: var(--background);
298
+ --sidebar: var(--card);
290
299
  --accent: var(--interaction-hover);
291
300
  --accent-foreground: hsl(var(--neutral-hue) var(--neutral-saturation) 98%);
292
301
  /* Vermelho CLARO no escuro (era 30.6% — calibrado só pra FUNDO, com texto branco).
@@ -302,15 +311,15 @@
302
311
  --context-danger-emphasis: hsl(0 91% 71%);
303
312
  --border: hsl(
304
313
  var(--neutral-hue) var(--neutral-saturation)
305
- calc(var(--neutral-line-l) * 1%)
314
+ calc(var(--neutral-line-l) * var(--neutral-surface-scale) * 1%)
306
315
  );
307
316
  --input: hsl(
308
317
  var(--neutral-hue) var(--neutral-saturation)
309
- calc(var(--neutral-line-l) * 1%)
318
+ calc(var(--neutral-line-l) * var(--neutral-surface-scale) * 1%)
310
319
  );
311
320
  --ring: hsl(
312
321
  var(--neutral-hue) var(--neutral-saturation)
313
- calc(var(--neutral-ring-l) * 1%)
322
+ calc(var(--neutral-ring-l) * var(--neutral-surface-scale) * 1%)
314
323
  );
315
324
  }
316
325
 
@@ -346,6 +355,8 @@
346
355
  --color-card: var(--card);
347
356
  --color-card-foreground: var(--card-foreground);
348
357
  --color-control: var(--control);
358
+ --color-sidebar: var(--sidebar);
359
+ --color-sidebar-global: var(--sidebar-global);
349
360
  --color-interaction-hover: var(--interaction-hover);
350
361
  --color-interaction-selected: var(--interaction-selected);
351
362
  --color-interaction-pressed: var(--interaction-pressed);