@assembleo/ui 0.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/dist/theme.css ADDED
@@ -0,0 +1,538 @@
1
+ /*
2
+ * Tokens do Assembleo — a "cara" do produto em um arquivo.
3
+ *
4
+ * A ideia visual, em uma linha: a vida em comum de um condomínio — superfícies
5
+ * claras e calmas como as áreas comuns, um azul cívico para a decisão, e uma
6
+ * família de cores expressivas (telhado, jardim, luz de janela) reservada para a
7
+ * camada lúdica: prédios, crachás, livretos.
8
+ *
9
+ * Três princípios, herdados da Apple HIG e adaptados:
10
+ *
11
+ * Clareza o conteúdo manda; tipografia do sistema, hierarquia por peso e
12
+ * cor, nunca por ornamento.
13
+ * Deferência a interface cede o palco: fundos neutros, cor com propósito,
14
+ * profundidade por camadas e não por bordas pesadas.
15
+ * Vida a camada expressiva é bem-vinda onde representa uma coisa real
16
+ * do condomínio (um prédio, um crachá, uma ata) — nunca como
17
+ * decoração solta.
18
+ *
19
+ * Os valores ficam em variáveis CSS comuns, e não direto no `@theme`, porque é o
20
+ * que permite o tema escuro trocar o valor sem que nenhum componente tenha um
21
+ * caminho condicional por tema (técnica herdada do theme.css original do web).
22
+ */
23
+
24
+ /* ---------------------------------------------------------------------------
25
+ * Tema claro — o padrão.
26
+ *
27
+ * O fundo é cinza-frio (como o systemGroupedBackground do iOS) e os cartões são
28
+ * brancos: a profundidade nasce dessa inversão, não de bordas. Todo par
29
+ * texto/fundo aqui foi verificado para WCAG AA (≥ 4.5:1 em texto corrente).
30
+ * ------------------------------------------------------------------------- */
31
+ :root {
32
+ /* Superfícies, do fundo para a frente */
33
+ --assembleo-bg: #f2f2f7;
34
+ --assembleo-surface: #ffffff;
35
+ --assembleo-surface-sunken: #e9e9ef;
36
+ --assembleo-surface-raised: #ffffff;
37
+
38
+ /* Bordas são coadjuvantes: separam quando a sombra não alcança */
39
+ --assembleo-border: #e2e2ea;
40
+ --assembleo-border-strong: #c9c9d4;
41
+
42
+ /* Texto em três vozes */
43
+ --assembleo-text: #1d1d22;
44
+ --assembleo-text-secondary: #52525c;
45
+ --assembleo-text-muted: #66666f;
46
+
47
+ /* O azul cívico — a cor da decisão. 5.7:1 sobre branco. */
48
+ --assembleo-accent: #3a5bd9;
49
+ --assembleo-accent-hover: #3050c8;
50
+ --assembleo-accent-active: #2a46b0;
51
+ --assembleo-accent-text: #ffffff;
52
+ --assembleo-accent-soft: #e8edfc;
53
+ --assembleo-accent-soft-text: #2c49b8;
54
+
55
+ /* Semânticas — sempre em par: cor forte + fundo suave com texto que passa AA */
56
+ --assembleo-success: #1f6b3f;
57
+ --assembleo-success-text: #ffffff;
58
+ --assembleo-success-soft: #e3f3e9;
59
+ --assembleo-success-soft-text: #175934;
60
+
61
+ --assembleo-warning: #8a5a00;
62
+ --assembleo-warning-text: #ffffff;
63
+ --assembleo-warning-soft: #fbf1dc;
64
+ --assembleo-warning-soft-text: #744b00;
65
+
66
+ --assembleo-danger: #b3261e;
67
+ --assembleo-danger-text: #ffffff;
68
+ --assembleo-danger-soft: #fbeae8;
69
+ --assembleo-danger-soft-text: #8c1d17;
70
+
71
+ /*
72
+ * A vila — a paleta expressiva. É dela que saem os prédios, crachás e
73
+ * livretos. Uso decorativo (preenchimento, ilustração), nunca texto corrente
74
+ * sobre fundo claro sem verificação.
75
+ */
76
+ --assembleo-terracota: #c2593b;
77
+ --assembleo-terracota-soft: #f9e9e3;
78
+ --assembleo-jardim: #2f8a57;
79
+ --assembleo-jardim-soft: #e2f2e8;
80
+ --assembleo-ambar: #e8a33d;
81
+ --assembleo-ambar-soft: #fdf2df;
82
+ --assembleo-lavanda: #7a6fe0;
83
+ --assembleo-lavanda-soft: #eeecfb;
84
+ --assembleo-ceu: #3f8fd2;
85
+ --assembleo-ceu-soft: #e5f1fa;
86
+
87
+ /* Véus e materiais translúcidos (o "frosted glass" das barras e sheets) */
88
+ --assembleo-overlay: rgb(24 24 32 / 0.4);
89
+ --assembleo-material: rgb(255 255 255 / 0.72);
90
+ --assembleo-material-thick: rgb(255 255 255 / 0.88);
91
+
92
+ /*
93
+ * Elevação: sombras difusas e tingidas de azul-cinza, nunca preto puro.
94
+ * Três níveis bastam — repouso, flutuando, sobreposto.
95
+ */
96
+ --assembleo-shadow-1: 0 1px 2px 0 rgb(29 29 41 / 0.05), 0 1px 6px -1px rgb(29 29 41 / 0.05);
97
+ --assembleo-shadow-2: 0 2px 8px -2px rgb(29 29 41 / 0.08), 0 8px 24px -4px rgb(29 29 41 / 0.08);
98
+ --assembleo-shadow-3: 0 8px 16px -6px rgb(29 29 41 / 0.1), 0 24px 48px -12px rgb(29 29 41 / 0.18);
99
+ }
100
+
101
+ /* ---------------------------------------------------------------------------
102
+ * Tema escuro.
103
+ *
104
+ * Ativa de duas formas: pela preferência do sistema, ou por `data-theme="dark"`
105
+ * no <html> quando o app quiser dar a escolha ao usuário. `data-theme="light"`
106
+ * força o claro pelo mesmo caminho. Os valores são os mesmos nos dois blocos —
107
+ * CSS não tem como nomear um conjunto e reusar; o teste de tokens garante que
108
+ * os blocos não divirjam.
109
+ * ------------------------------------------------------------------------- */
110
+ @media (prefers-color-scheme: dark) {
111
+ :root:not([data-theme="light"]) {
112
+ --assembleo-bg: #101014;
113
+ --assembleo-surface: #1b1b21;
114
+ --assembleo-surface-sunken: #0c0c10;
115
+ --assembleo-surface-raised: #232329;
116
+
117
+ --assembleo-border: #2d2d35;
118
+ --assembleo-border-strong: #3d3d47;
119
+
120
+ --assembleo-text: #f4f4f6;
121
+ --assembleo-text-secondary: #b9b9c3;
122
+ --assembleo-text-muted: #8e8e99;
123
+
124
+ --assembleo-accent: #94a9f8;
125
+ --assembleo-accent-hover: #a5b7fa;
126
+ --assembleo-accent-active: #b6c5fb;
127
+ --assembleo-accent-text: #101736;
128
+ --assembleo-accent-soft: #252c4e;
129
+ --assembleo-accent-soft-text: #bcc8ff;
130
+
131
+ --assembleo-success: #7fd0a0;
132
+ --assembleo-success-text: #06301a;
133
+ --assembleo-success-soft: #1a3527;
134
+ --assembleo-success-soft-text: #a4e2bf;
135
+
136
+ --assembleo-warning: #ecc06e;
137
+ --assembleo-warning-text: #3a2800;
138
+ --assembleo-warning-soft: #3a2f16;
139
+ --assembleo-warning-soft-text: #f2d195;
140
+
141
+ --assembleo-danger: #f2b8b5;
142
+ --assembleo-danger-text: #3a0906;
143
+ --assembleo-danger-soft: #45201d;
144
+ --assembleo-danger-soft-text: #f7cfcd;
145
+
146
+ --assembleo-terracota: #e08a6d;
147
+ --assembleo-terracota-soft: #40241b;
148
+ --assembleo-jardim: #6fc493;
149
+ --assembleo-jardim-soft: #1d3529;
150
+ --assembleo-ambar: #edb964;
151
+ --assembleo-ambar-soft: #3c2e14;
152
+ --assembleo-lavanda: #a99ff0;
153
+ --assembleo-lavanda-soft: #2b2650;
154
+ --assembleo-ceu: #7ab8e8;
155
+ --assembleo-ceu-soft: #16293a;
156
+
157
+ --assembleo-overlay: rgb(0 0 0 / 0.6);
158
+ --assembleo-material: rgb(24 24 30 / 0.72);
159
+ --assembleo-material-thick: rgb(24 24 30 / 0.9);
160
+
161
+ /* No escuro a sombra perde força; a separação vem da superfície mais clara */
162
+ --assembleo-shadow-1: 0 1px 2px 0 rgb(0 0 0 / 0.2);
163
+ --assembleo-shadow-2: 0 2px 8px -2px rgb(0 0 0 / 0.32), 0 8px 24px -4px rgb(0 0 0 / 0.28);
164
+ --assembleo-shadow-3: 0 8px 16px -6px rgb(0 0 0 / 0.36), 0 24px 48px -12px rgb(0 0 0 / 0.5);
165
+ }
166
+ }
167
+
168
+ :root[data-theme="dark"] {
169
+ --assembleo-bg: #101014;
170
+ --assembleo-surface: #1b1b21;
171
+ --assembleo-surface-sunken: #0c0c10;
172
+ --assembleo-surface-raised: #232329;
173
+
174
+ --assembleo-border: #2d2d35;
175
+ --assembleo-border-strong: #3d3d47;
176
+
177
+ --assembleo-text: #f4f4f6;
178
+ --assembleo-text-secondary: #b9b9c3;
179
+ --assembleo-text-muted: #8e8e99;
180
+
181
+ --assembleo-accent: #94a9f8;
182
+ --assembleo-accent-hover: #a5b7fa;
183
+ --assembleo-accent-active: #b6c5fb;
184
+ --assembleo-accent-text: #101736;
185
+ --assembleo-accent-soft: #252c4e;
186
+ --assembleo-accent-soft-text: #bcc8ff;
187
+
188
+ --assembleo-success: #7fd0a0;
189
+ --assembleo-success-text: #06301a;
190
+ --assembleo-success-soft: #1a3527;
191
+ --assembleo-success-soft-text: #a4e2bf;
192
+
193
+ --assembleo-warning: #ecc06e;
194
+ --assembleo-warning-text: #3a2800;
195
+ --assembleo-warning-soft: #3a2f16;
196
+ --assembleo-warning-soft-text: #f2d195;
197
+
198
+ --assembleo-danger: #f2b8b5;
199
+ --assembleo-danger-text: #3a0906;
200
+ --assembleo-danger-soft: #45201d;
201
+ --assembleo-danger-soft-text: #f7cfcd;
202
+
203
+ --assembleo-terracota: #e08a6d;
204
+ --assembleo-terracota-soft: #40241b;
205
+ --assembleo-jardim: #6fc493;
206
+ --assembleo-jardim-soft: #1d3529;
207
+ --assembleo-ambar: #edb964;
208
+ --assembleo-ambar-soft: #3c2e14;
209
+ --assembleo-lavanda: #a99ff0;
210
+ --assembleo-lavanda-soft: #2b2650;
211
+ --assembleo-ceu: #7ab8e8;
212
+ --assembleo-ceu-soft: #16293a;
213
+
214
+ --assembleo-overlay: rgb(0 0 0 / 0.6);
215
+ --assembleo-material: rgb(24 24 30 / 0.72);
216
+ --assembleo-material-thick: rgb(24 24 30 / 0.9);
217
+
218
+ --assembleo-shadow-1: 0 1px 2px 0 rgb(0 0 0 / 0.2);
219
+ --assembleo-shadow-2: 0 2px 8px -2px rgb(0 0 0 / 0.32), 0 8px 24px -4px rgb(0 0 0 / 0.28);
220
+ --assembleo-shadow-3: 0 8px 16px -6px rgb(0 0 0 / 0.36), 0 24px 48px -12px rgb(0 0 0 / 0.5);
221
+ }
222
+
223
+ /* ---------------------------------------------------------------------------
224
+ * Ponte para o Tailwind.
225
+ *
226
+ * `inline` faz o Tailwind emitir `var(--assembleo-*)` em vez de resolver o
227
+ * valor no build — sem isso o tema escuro não chegaria às utilidades.
228
+ * ------------------------------------------------------------------------- */
229
+ @theme inline {
230
+ /* Cor */
231
+ --color-*: initial;
232
+ --color-bg: var(--assembleo-bg);
233
+ --color-surface: var(--assembleo-surface);
234
+ --color-surface-sunken: var(--assembleo-surface-sunken);
235
+ --color-surface-raised: var(--assembleo-surface-raised);
236
+ --color-border: var(--assembleo-border);
237
+ --color-border-strong: var(--assembleo-border-strong);
238
+ --color-text: var(--assembleo-text);
239
+ --color-text-secondary: var(--assembleo-text-secondary);
240
+ --color-text-muted: var(--assembleo-text-muted);
241
+
242
+ --color-accent: var(--assembleo-accent);
243
+ --color-accent-hover: var(--assembleo-accent-hover);
244
+ --color-accent-active: var(--assembleo-accent-active);
245
+ --color-accent-text: var(--assembleo-accent-text);
246
+ --color-accent-soft: var(--assembleo-accent-soft);
247
+ --color-accent-soft-text: var(--assembleo-accent-soft-text);
248
+
249
+ --color-success: var(--assembleo-success);
250
+ --color-success-text: var(--assembleo-success-text);
251
+ --color-success-soft: var(--assembleo-success-soft);
252
+ --color-success-soft-text: var(--assembleo-success-soft-text);
253
+ --color-warning: var(--assembleo-warning);
254
+ --color-warning-text: var(--assembleo-warning-text);
255
+ --color-warning-soft: var(--assembleo-warning-soft);
256
+ --color-warning-soft-text: var(--assembleo-warning-soft-text);
257
+ --color-danger: var(--assembleo-danger);
258
+ --color-danger-text: var(--assembleo-danger-text);
259
+ --color-danger-soft: var(--assembleo-danger-soft);
260
+ --color-danger-soft-text: var(--assembleo-danger-soft-text);
261
+
262
+ --color-terracota: var(--assembleo-terracota);
263
+ --color-terracota-soft: var(--assembleo-terracota-soft);
264
+ --color-jardim: var(--assembleo-jardim);
265
+ --color-jardim-soft: var(--assembleo-jardim-soft);
266
+ --color-ambar: var(--assembleo-ambar);
267
+ --color-ambar-soft: var(--assembleo-ambar-soft);
268
+ --color-lavanda: var(--assembleo-lavanda);
269
+ --color-lavanda-soft: var(--assembleo-lavanda-soft);
270
+ --color-ceu: var(--assembleo-ceu);
271
+ --color-ceu-soft: var(--assembleo-ceu-soft);
272
+
273
+ --color-overlay: var(--assembleo-overlay);
274
+ --color-material: var(--assembleo-material);
275
+ --color-material-thick: var(--assembleo-material-thick);
276
+
277
+ --color-white: #ffffff;
278
+ --color-black: #000000;
279
+ --color-transparent: transparent;
280
+ --color-current: currentColor;
281
+
282
+ /*
283
+ * Tipografia do sistema — a decisão mais Apple do sistema inteiro: em iPhone
284
+ * e Mac o app fala SF Pro nativo, e em todo lugar a fonte chega em 0ms.
285
+ * `ui-rounded` vira SF Pro Rounded em aparelho Apple; é a voz da camada
286
+ * expressiva, com fallback gracioso para a sans comum.
287
+ */
288
+ --font-sans: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", sans-serif;
289
+ --font-friendly: ui-rounded, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
290
+ --font-mono: ui-monospace, "SF Mono", SFMono-Regular, Menlo, monospace;
291
+
292
+ /*
293
+ * Escala tipográfica da HIG (Large Title → Caption), em rem.
294
+ * O corpo é 17px como no iOS — generoso de propósito: síndico e morador leem
295
+ * ata e pauta no celular, muitas vezes com o braço esticado na assembleia.
296
+ */
297
+ --text-*: initial;
298
+ --text-display: 2.125rem;
299
+ --text-display--line-height: 1.18;
300
+ --text-display--letter-spacing: -0.022em;
301
+ --text-display--font-weight: 700;
302
+ --text-title-1: 1.75rem;
303
+ --text-title-1--line-height: 1.2;
304
+ --text-title-1--letter-spacing: -0.018em;
305
+ --text-title-1--font-weight: 700;
306
+ --text-title-2: 1.375rem;
307
+ --text-title-2--line-height: 1.27;
308
+ --text-title-2--letter-spacing: -0.012em;
309
+ --text-title-2--font-weight: 600;
310
+ --text-title-3: 1.25rem;
311
+ --text-title-3--line-height: 1.3;
312
+ --text-title-3--letter-spacing: -0.008em;
313
+ --text-title-3--font-weight: 600;
314
+ --text-headline: 1.0625rem;
315
+ --text-headline--line-height: 1.3;
316
+ --text-headline--font-weight: 600;
317
+ --text-body: 1.0625rem;
318
+ --text-body--line-height: 1.47;
319
+ --text-callout: 1rem;
320
+ --text-callout--line-height: 1.44;
321
+ --text-subhead: 0.9375rem;
322
+ --text-subhead--line-height: 1.42;
323
+ --text-footnote: 0.8125rem;
324
+ --text-footnote--line-height: 1.38;
325
+ --text-caption: 0.75rem;
326
+ --text-caption--line-height: 1.34;
327
+
328
+ /*
329
+ * Raios generosos — a assinatura de forma do Assembleo. `control` para o que
330
+ * se aperta, `surface` para o que contém, `expressive` para a camada lúdica.
331
+ */
332
+ --radius-*: initial;
333
+ --radius-control: 0.75rem;
334
+ --radius-control-sm: 0.5rem;
335
+ --radius-surface: 1rem;
336
+ --radius-surface-lg: 1.25rem;
337
+ --radius-expressive: 1.5rem;
338
+ --radius-pill: 9999px;
339
+ --radius-full: 9999px;
340
+
341
+ /* Elevação */
342
+ --shadow-*: initial;
343
+ --shadow-level-1: var(--assembleo-shadow-1);
344
+ --shadow-level-2: var(--assembleo-shadow-2);
345
+ --shadow-level-3: var(--assembleo-shadow-3);
346
+ --shadow-none: 0 0 #0000;
347
+
348
+ /*
349
+ * Movimento: rápido para responder, suave para acomodar, mola para dar vida.
350
+ * A mola (`--ease-spring`) é para a camada expressiva e microinterações;
351
+ * transição de layout usa as curvas suaves.
352
+ */
353
+ --ease-out-soft: cubic-bezier(0.25, 1, 0.5, 1);
354
+ --ease-in-out-soft: cubic-bezier(0.45, 0, 0.15, 1);
355
+ --ease-spring: linear(
356
+ 0,
357
+ 0.009,
358
+ 0.035 2.1%,
359
+ 0.141 4.4%,
360
+ 0.723 12.9%,
361
+ 0.938 16.7%,
362
+ 1.017,
363
+ 1.077 20.4%,
364
+ 1.121,
365
+ 1.149 24.3%,
366
+ 1.159,
367
+ 1.163 27.8%,
368
+ 1.154,
369
+ 1.129 32.8%,
370
+ 1.051 39.6%,
371
+ 1.017 43.1%,
372
+ 0.991,
373
+ 0.977 51%,
374
+ 0.974 53.8%,
375
+ 0.975 57.1%,
376
+ 0.997 69.8%,
377
+ 1.003 76.9%,
378
+ 1
379
+ );
380
+
381
+ /* Alvo de toque mínimo: 44 pontos, o piso de iOS e Android. */
382
+ --spacing-touch: 2.75rem;
383
+
384
+ /* Animações de entrada dos componentes de sobreposição */
385
+ --animate-fade-in: assembleo-fade-in var(--motion-quick) var(--ease-out-soft);
386
+ --animate-pop-in: assembleo-pop-in var(--motion-smooth) var(--ease-spring);
387
+ --animate-slide-up: assembleo-slide-up var(--motion-smooth) var(--ease-out-soft);
388
+ --animate-shimmer: assembleo-shimmer 1.6s var(--ease-in-out-soft) infinite;
389
+
390
+ @keyframes assembleo-fade-in {
391
+ from {
392
+ opacity: 0;
393
+ }
394
+ }
395
+
396
+ @keyframes assembleo-pop-in {
397
+ from {
398
+ opacity: 0;
399
+ transform: scale(0.96);
400
+ }
401
+ }
402
+
403
+ @keyframes assembleo-slide-up {
404
+ from {
405
+ opacity: 0;
406
+ transform: translateY(1rem);
407
+ }
408
+ }
409
+
410
+ @keyframes assembleo-shimmer {
411
+ 50% {
412
+ opacity: 0.45;
413
+ }
414
+ }
415
+ }
416
+
417
+ /*
418
+ * Durações fora do @theme: não são um namespace do Tailwind; componentes usam
419
+ * `duration-(--motion-quick)` e afins.
420
+ */
421
+ :root {
422
+ --motion-instant: 100ms;
423
+ --motion-quick: 160ms;
424
+ --motion-smooth: 260ms;
425
+ --motion-gentle: 420ms;
426
+
427
+ /* Camadas de empilhamento — únicas e nomeadas para nunca competirem no grito */
428
+ --z-nav: 20;
429
+ --z-overlay: 40;
430
+ --z-modal: 50;
431
+ --z-toast: 60;
432
+ --z-tooltip: 70;
433
+ }
434
+
435
+ /* ---------------------------------------------------------------------------
436
+ * Utilidades próprias do sistema.
437
+ * ------------------------------------------------------------------------- */
438
+
439
+ /*
440
+ * O squircle — curvatura contínua como a do iOS. `corner-shape` é melhoria
441
+ * progressiva (Chrome 139+); onde não existe, fica o raio comum, que já carrega
442
+ * a assinatura.
443
+ */
444
+ @utility squircle {
445
+ corner-shape: squircle;
446
+ }
447
+
448
+ /*
449
+ * Materiais translúcidos: a barra que deixa o conteúdo passar por baixo.
450
+ * Onde não há backdrop-filter, o fundo vira sólido — legibilidade antes do
451
+ * efeito.
452
+ */
453
+ @utility material {
454
+ background-color: var(--assembleo-surface);
455
+
456
+ @supports (backdrop-filter: blur(1px)) {
457
+ background-color: var(--assembleo-material);
458
+ backdrop-filter: blur(20px) saturate(1.8);
459
+ }
460
+ }
461
+
462
+ @utility material-thick {
463
+ background-color: var(--assembleo-surface);
464
+
465
+ @supports (backdrop-filter: blur(1px)) {
466
+ background-color: var(--assembleo-material-thick);
467
+ backdrop-filter: blur(24px) saturate(1.6);
468
+ }
469
+ }
470
+
471
+ /* Números tabulares: coluna de votos e de valores alinha dígito a dígito. */
472
+ @utility tabular {
473
+ font-variant-numeric: tabular-nums;
474
+ }
475
+
476
+ /* ---------------------------------------------------------------------------
477
+ * Base.
478
+ * ------------------------------------------------------------------------- */
479
+ @layer base {
480
+ :root {
481
+ color-scheme: light dark;
482
+ }
483
+
484
+ :root[data-theme="light"] {
485
+ color-scheme: light;
486
+ }
487
+
488
+ :root[data-theme="dark"] {
489
+ color-scheme: dark;
490
+ }
491
+
492
+ html {
493
+ font-family: var(--font-sans);
494
+ /* Impede o iOS de aumentar o texto ao girar o aparelho. */
495
+ -webkit-text-size-adjust: 100%;
496
+ }
497
+
498
+ body {
499
+ margin: 0;
500
+ min-height: 100dvh;
501
+ background-color: var(--color-bg);
502
+ color: var(--color-text);
503
+ font-size: var(--text-body);
504
+ line-height: var(--text-body--line-height);
505
+ -webkit-font-smoothing: antialiased;
506
+ /* Em PWA instalada no iPhone não existe barra do navegador para proteger o
507
+ conteúdo da barra de gestos. */
508
+ padding: env(safe-area-inset-top) env(safe-area-inset-right) env(safe-area-inset-bottom)
509
+ env(safe-area-inset-left);
510
+ }
511
+
512
+ /* Sem contorno de foco não há navegação por teclado utilizável. */
513
+ :focus-visible {
514
+ outline: 2px solid var(--color-accent);
515
+ outline-offset: 2px;
516
+ }
517
+
518
+ ::selection {
519
+ background-color: var(--assembleo-accent);
520
+ color: var(--assembleo-accent-text);
521
+ }
522
+
523
+ /*
524
+ * Quem pediu menos movimento recebe menos movimento — tudo, de uma vez.
525
+ * As animações caem para um corte quase instantâneo em vez de sumirem, para
526
+ * que estados de entrada (opacity inicial) nunca fiquem presos.
527
+ */
528
+ @media (prefers-reduced-motion: reduce) {
529
+ *,
530
+ *::before,
531
+ *::after {
532
+ animation-duration: 1ms !important;
533
+ animation-iteration-count: 1 !important;
534
+ transition-duration: 1ms !important;
535
+ scroll-behavior: auto !important;
536
+ }
537
+ }
538
+ }
package/package.json ADDED
@@ -0,0 +1,89 @@
1
+ {
2
+ "name": "@assembleo/ui",
3
+ "version": "0.1.0",
4
+ "description": "Design system do Assembleo: tokens, componentes e a camada expressiva que dão cara ao produto.",
5
+ "license": "UNLICENSED",
6
+ "private": false,
7
+ "type": "module",
8
+ "engines": {
9
+ "node": ">=22.0.0",
10
+ "pnpm": ">=11"
11
+ },
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "git+https://github.com/The-Fant-Company/assembleo-ui.git"
15
+ },
16
+ "publishConfig": {
17
+ "registry": "https://registry.npmjs.org",
18
+ "access": "public"
19
+ },
20
+ "sideEffects": [
21
+ "**/*.css"
22
+ ],
23
+ "module": "./dist/index.js",
24
+ "types": "./dist/index.d.ts",
25
+ "exports": {
26
+ ".": {
27
+ "types": "./dist/index.d.ts",
28
+ "default": "./dist/index.js"
29
+ },
30
+ "./theme.css": "./dist/theme.css",
31
+ "./package.json": "./package.json"
32
+ },
33
+ "files": [
34
+ "dist"
35
+ ],
36
+ "peerDependencies": {
37
+ "react": "^19.0.0",
38
+ "react-dom": "^19.0.0",
39
+ "tailwindcss": "^4.3.0"
40
+ },
41
+ "dependencies": {
42
+ "class-variance-authority": "^0.7.1",
43
+ "lucide-react": "^1.33.0",
44
+ "radix-ui": "^1.6.7",
45
+ "tailwind-merge": "^3.6.0"
46
+ },
47
+ "devDependencies": {
48
+ "@biomejs/biome": "2.5.7",
49
+ "@changesets/cli": "^2.31.1",
50
+ "@commitlint/cli": "^21.2.1",
51
+ "@commitlint/config-conventional": "^21.2.0",
52
+ "@storybook/addon-a11y": "^10.5.10",
53
+ "@storybook/addon-docs": "^10.5.10",
54
+ "@storybook/react-vite": "^10.5.10",
55
+ "@tailwindcss/vite": "^4.3.3",
56
+ "@testing-library/jest-dom": "^7.0.1",
57
+ "@testing-library/react": "^16.3.2",
58
+ "@testing-library/user-event": "^14.6.3",
59
+ "@types/node": "^22.19.0",
60
+ "@types/react": "^19.2.17",
61
+ "@types/react-dom": "^19.2.3",
62
+ "@vitejs/plugin-react": "^6.0.4",
63
+ "axe-core": "^4.11.0",
64
+ "jsdom": "^30.0.1",
65
+ "lefthook": "^2.1.10",
66
+ "react": "^19.2.8",
67
+ "react-dom": "^19.2.8",
68
+ "storybook": "^10.5.10",
69
+ "tailwindcss": "^4.3.3",
70
+ "tsup": "^8.5.1",
71
+ "typescript": "^5.9.3",
72
+ "vite": "^8.2.0",
73
+ "vitest": "^4.1.10"
74
+ },
75
+ "scripts": {
76
+ "build": "tsup && cp src/tokens/theme.css dist/theme.css",
77
+ "typecheck": "tsc -p tsconfig.json --noEmit",
78
+ "lint": "biome check .",
79
+ "format": "biome check --write .",
80
+ "clean": "rm -rf dist storybook-static",
81
+ "test": "vitest run",
82
+ "test:watch": "vitest",
83
+ "storybook": "storybook dev -p 6006",
84
+ "build-storybook": "storybook build",
85
+ "changeset": "changeset",
86
+ "version-packages": "changeset version",
87
+ "release": "pnpm build && changeset publish"
88
+ }
89
+ }