@softize/opus 30.0.0 → 31.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.
- package/CHANGELOG.md +123 -0
- package/bin/lib/check.mjs +109 -101
- package/bin/lib/copy.mjs +2973 -1801
- package/docs/adr/0043-neutral-surfaces-and-interactions-use-opaque-role-tokens.md +52 -0
- package/docs/adr/0044-neutral-appearance-derives-from-bounded-axes-per-mode.md +27 -2
- package/docs/adr/0060-surface-composition-separates-chrome-and-intro.md +142 -0
- package/docs/adr/0064-action-list-com-itens-e-fontes-externas.md +47 -0
- package/docs/adr/0065-presentation-composes-settings-sections.md +295 -0
- package/docs/adr/0066-civil-date-input-and-calendar-list.md +28 -0
- package/docs/adr/README.md +6 -0
- package/package.json +1 -1
- package/registry/skills/build-opus-ui/SKILL.md +21 -19
- package/registry/skills/build-opus-ui/references/evaluations.md +13 -11
- package/registry/skills/build-opus-ui/references/ui-patterns.md +24 -27
- package/src/core/presentation.ts +938 -32
- package/src/core/types.ts +2 -0
- package/src/ui/components/patterns/form.tsx +22 -1
- package/src/ui/components/patterns/grouped-list.ts +2 -2
- package/src/ui/components/patterns/list-calendar.tsx +129 -0
- package/src/ui/components/patterns/list.tsx +612 -382
- package/src/ui/components/patterns/page-heading-context.tsx +12 -5
- package/src/ui/components/patterns/page.tsx +227 -197
- package/src/ui/components/patterns/presentation-fields.tsx +246 -0
- package/src/ui/components/patterns/presentation-sections.tsx +494 -0
- package/src/ui/components/patterns/presentation.tsx +1142 -229
- package/src/ui/components/patterns/structural-header.tsx +23 -32
- package/src/ui/components/patterns/surface-anatomy.ts +27 -217
- package/src/ui/components/patterns/surface.tsx +19 -29
- package/src/ui/components/patterns/trigger.tsx +10 -2
- package/src/ui/components/primitives/calendar.tsx +39 -18
- package/src/ui/components/primitives/close-button.tsx +11 -3
- package/src/ui/components/primitives/command.tsx +2 -8
- package/src/ui/components/primitives/date-input.tsx +276 -0
- package/src/ui/components/primitives/detail.tsx +1 -1
- package/src/ui/components/primitives/dialog.tsx +19 -81
- package/src/ui/components/primitives/drawer.tsx +17 -79
- package/src/ui/components/primitives/field.tsx +1 -1
- package/src/ui/components/primitives/pagination.tsx +3 -2
- package/src/ui/components/primitives/table.tsx +1 -1
- package/src/ui/components/primitives/tabs.tsx +13 -2
- package/src/ui/docs/content/action-form.md +6 -1
- package/src/ui/docs/content/action-list.md +156 -68
- package/src/ui/docs/content/action-trigger.md +5 -0
- package/src/ui/docs/content/button.md +5 -6
- package/src/ui/docs/content/calendar-month-view.md +50 -0
- package/src/ui/docs/content/calendar.md +6 -1
- package/src/ui/docs/content/command.md +62 -50
- package/src/ui/docs/content/compositions.md +129 -459
- package/src/ui/docs/content/date-input.md +67 -0
- package/src/ui/docs/content/dialog.md +44 -112
- package/src/ui/docs/content/drawer.md +44 -103
- package/src/ui/docs/content/field.md +2 -1
- package/src/ui/docs/content/input.md +3 -0
- package/src/ui/docs/content/page.md +204 -412
- package/src/ui/docs/content/presentation.md +371 -23
- package/src/ui/docs/content/separator.md +1 -1
- package/src/ui/docs/content/surface.md +65 -120
- package/src/ui/docs/content/tokens.md +18 -4
- package/src/ui/docs/registry.tsx +38 -9
- package/src/ui/drivers/context.tsx +11 -4
- package/src/ui/drivers/react.tsx +27 -7
- package/src/ui/meta.ts +17 -6
- package/src/ui/react.tsx +41 -8
- package/src/ui/theme.css +44 -33
package/src/ui/react.tsx
CHANGED
|
@@ -25,6 +25,7 @@ export type {
|
|
|
25
25
|
UseFormActionOptions,
|
|
26
26
|
UseFormActionResult,
|
|
27
27
|
UseListActionResult,
|
|
28
|
+
ListDataSource,
|
|
28
29
|
UseLookupActionResult,
|
|
29
30
|
UseTriggerActionOptions,
|
|
30
31
|
UseTriggerActionResult,
|
|
@@ -53,6 +54,10 @@ export type {
|
|
|
53
54
|
} from "./components/primitives/control.ts";
|
|
54
55
|
|
|
55
56
|
export { Input } from "./components/primitives/input.tsx";
|
|
57
|
+
export {
|
|
58
|
+
DateInput,
|
|
59
|
+
type DateInputProps,
|
|
60
|
+
} from "./components/primitives/date-input.tsx";
|
|
56
61
|
|
|
57
62
|
export { Chat } from "./components/primitives/chat.tsx";
|
|
58
63
|
export type {
|
|
@@ -175,8 +180,6 @@ export {
|
|
|
175
180
|
DialogNavigation,
|
|
176
181
|
DialogMedia,
|
|
177
182
|
DialogActions,
|
|
178
|
-
DialogIntro,
|
|
179
|
-
DialogIntroActions,
|
|
180
183
|
DialogMeta,
|
|
181
184
|
DialogBody,
|
|
182
185
|
DialogFooter,
|
|
@@ -195,7 +198,6 @@ export type { FloatingLayerProps } from "./components/primitives/floating-layer.
|
|
|
195
198
|
|
|
196
199
|
// O pacote de anatomia que Surface, Dialog, Drawer e Pane declaram no root (ADR 0023). As
|
|
197
200
|
// tabelas e o contexto continuam internos; o consumidor escolhe entre os dois nomes.
|
|
198
|
-
export type { SurfaceLayout } from "./components/patterns/surface-anatomy.ts";
|
|
199
201
|
|
|
200
202
|
export {
|
|
201
203
|
Menu,
|
|
@@ -325,8 +327,6 @@ export {
|
|
|
325
327
|
export {
|
|
326
328
|
Drawer,
|
|
327
329
|
DrawerActions,
|
|
328
|
-
DrawerIntro,
|
|
329
|
-
DrawerIntroActions,
|
|
330
330
|
DrawerMeta,
|
|
331
331
|
DrawerClose,
|
|
332
332
|
DrawerContent,
|
|
@@ -467,12 +467,15 @@ export {
|
|
|
467
467
|
presetRange,
|
|
468
468
|
listParamsToState,
|
|
469
469
|
listStateToParams,
|
|
470
|
+
listStateToInput,
|
|
470
471
|
} from "./components/patterns/list.tsx";
|
|
471
472
|
export type {
|
|
472
473
|
ActionFilterBarProps,
|
|
473
474
|
ActionFilterState,
|
|
474
475
|
AdvancedFiltersLayout,
|
|
475
476
|
ActionListProps,
|
|
477
|
+
ActionListItemSpec,
|
|
478
|
+
ActionListContext,
|
|
476
479
|
ActionListColumn,
|
|
477
480
|
ActionListState,
|
|
478
481
|
ActionListView,
|
|
@@ -517,10 +520,7 @@ export {
|
|
|
517
520
|
PageShell,
|
|
518
521
|
Page,
|
|
519
522
|
PageHeader,
|
|
520
|
-
PageIntro,
|
|
521
|
-
PageIntroActions,
|
|
522
523
|
PageMeta,
|
|
523
|
-
PageNavigation,
|
|
524
524
|
PageBack,
|
|
525
525
|
PageTitle,
|
|
526
526
|
PageDescription,
|
|
@@ -626,3 +626,36 @@ export type {
|
|
|
626
626
|
DotContext,
|
|
627
627
|
DotVariant,
|
|
628
628
|
} from "./components/primitives/dot.tsx";
|
|
629
|
+
|
|
630
|
+
export {
|
|
631
|
+
bindPresentationList,
|
|
632
|
+
bindPresentationActionList,
|
|
633
|
+
bindPresentationCells,
|
|
634
|
+
bindPresentationCollection,
|
|
635
|
+
bindPresentationDetail,
|
|
636
|
+
bindPresentationOptions,
|
|
637
|
+
bindPresentationField,
|
|
638
|
+
bindPresentationComponent,
|
|
639
|
+
bindPresentationContent,
|
|
640
|
+
type PresentationRecordSource,
|
|
641
|
+
type PresentationComponentProps,
|
|
642
|
+
type PresentationComponentAdapter,
|
|
643
|
+
bindPresentationListContent,
|
|
644
|
+
bindPresentationRowContent,
|
|
645
|
+
} from "./components/patterns/presentation-sections.tsx";
|
|
646
|
+
export type {
|
|
647
|
+
PresentationCompositionRuntime,
|
|
648
|
+
PresentationListAdapter,
|
|
649
|
+
PresentationCellsAdapter,
|
|
650
|
+
PresentationCollectionAdapter,
|
|
651
|
+
PresentationCollectionControls,
|
|
652
|
+
PresentationDetailAdapter,
|
|
653
|
+
PresentationOptionsAdapter,
|
|
654
|
+
PresentationFieldAdapter,
|
|
655
|
+
PresentationFieldProps,
|
|
656
|
+
PresentationListContentAdapter,
|
|
657
|
+
PresentationRowContentAdapter,
|
|
658
|
+
} from "./components/patterns/presentation-sections.tsx";
|
|
659
|
+
|
|
660
|
+
export { CalendarMonthView } from "./components/patterns/list-calendar.tsx";
|
|
661
|
+
export type { CalendarMonthViewProps } from "./components/patterns/list-calendar.tsx";
|
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
|
|
19
|
-
* canvas
|
|
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;
|
|
66
|
-
|
|
67
|
-
|
|
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) -
|
|
75
|
+
var(--neutral-layer-l) - var(--appearance-layer-contrast) * 0.025
|
|
76
76
|
);
|
|
77
77
|
--neutral-control-l: calc(
|
|
78
|
-
var(--neutral-canvas-l) +
|
|
78
|
+
var(--neutral-canvas-l) + var(--appearance-layer-contrast) * 0.01
|
|
79
79
|
);
|
|
80
|
-
--neutral-muted-l: calc(var(--neutral-canvas-l) - 1.
|
|
81
|
-
--neutral-hover-l: calc(var(--neutral-canvas-l) -
|
|
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) -
|
|
84
|
+
var(--neutral-canvas-l) - 1 - 8 * var(--neutral-step)
|
|
85
85
|
);
|
|
86
|
-
--neutral-line-l: calc(var(--neutral-canvas-l) -
|
|
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
|
|
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
|
-
|
|
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) +
|
|
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) +
|
|
236
|
+
var(--neutral-canvas-l) + 1 + var(--appearance-layer-contrast) * 0.018
|
|
230
237
|
);
|
|
231
|
-
--neutral-muted-l: calc(var(--neutral-layer-l) +
|
|
232
|
-
--neutral-hover-l: calc(var(--neutral-layer-l) +
|
|
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) +
|
|
241
|
+
var(--neutral-layer-l) + 7.1 * var(--neutral-step)
|
|
235
242
|
);
|
|
236
|
-
--neutral-pressed-l: calc(var(--neutral-layer-l) +
|
|
237
|
-
--neutral-line-l: calc(var(--neutral-layer-l) + 6
|
|
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);
|