fokus-styles 2.5.0 → 2.6.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 (177) hide show
  1. package/package.json +17 -15
  2. package/CHANGELOG.md +0 -940
  3. package/dist/css/components.css.map +0 -1
  4. package/dist/css/components.min.css.map +0 -1
  5. package/dist/css/fokus-components.css.map +0 -1
  6. package/dist/css/fokus-components.min.css.map +0 -1
  7. package/dist/css/fokus-core.css.map +0 -1
  8. package/dist/css/fokus-core.min.css.map +0 -1
  9. package/dist/css/fokus-dark.css.map +0 -1
  10. package/dist/css/fokus-dark.min.css.map +0 -1
  11. package/dist/css/fokus-rtl.css.map +0 -1
  12. package/dist/css/fokus-rtl.min.css.map +0 -1
  13. package/dist/css/fokus-utilities.css.map +0 -1
  14. package/dist/css/fokus-utilities.min.css.map +0 -1
  15. package/dist/css/fokus.css.map +0 -1
  16. package/dist/css/fokus.min.css.map +0 -1
  17. package/dist/css/fonts.css.map +0 -1
  18. package/dist/css/fonts.min.css.map +0 -1
  19. package/dist/css/forms.css.map +0 -1
  20. package/dist/css/forms.min.css.map +0 -1
  21. package/dist/css/helpers.css.map +0 -1
  22. package/dist/css/helpers.min.css.map +0 -1
  23. package/dist/css/layout.css.map +0 -1
  24. package/dist/css/layout.min.css.map +0 -1
  25. package/dist/js/fokus.js.map +0 -7
  26. package/dist/js/fokus.min.js.map +0 -7
  27. package/docs/README.md +0 -86
  28. package/docs/comparison.md +0 -124
  29. package/docs/components/accordion.md +0 -104
  30. package/docs/components/alert-dialog.md +0 -99
  31. package/docs/components/alert.md +0 -104
  32. package/docs/components/avatar.md +0 -13
  33. package/docs/components/badge.md +0 -101
  34. package/docs/components/breadcrumb.md +0 -93
  35. package/docs/components/button-group.md +0 -13
  36. package/docs/components/button.md +0 -98
  37. package/docs/components/card.md +0 -111
  38. package/docs/components/carousel.md +0 -167
  39. package/docs/components/checkbox.md +0 -110
  40. package/docs/components/close-button.md +0 -13
  41. package/docs/components/code.md +0 -13
  42. package/docs/components/collapse.md +0 -78
  43. package/docs/components/combobox.md +0 -123
  44. package/docs/components/command-palette.md +0 -131
  45. package/docs/components/datatable.md +0 -173
  46. package/docs/components/datepicker.md +0 -137
  47. package/docs/components/divider.md +0 -57
  48. package/docs/components/dropdown.md +0 -103
  49. package/docs/components/empty-state.md +0 -65
  50. package/docs/components/file-upload-advanced.md +0 -116
  51. package/docs/components/file-upload.md +0 -93
  52. package/docs/components/icon-link.md +0 -13
  53. package/docs/components/input-group.md +0 -73
  54. package/docs/components/input.md +0 -90
  55. package/docs/components/list-group.md +0 -13
  56. package/docs/components/modal.md +0 -120
  57. package/docs/components/navbar.md +0 -74
  58. package/docs/components/nested-menu.md +0 -90
  59. package/docs/components/notification-center.md +0 -116
  60. package/docs/components/offcanvas.md +0 -102
  61. package/docs/components/pagination.md +0 -145
  62. package/docs/components/placeholder.md +0 -13
  63. package/docs/components/popover.md +0 -118
  64. package/docs/components/progress.md +0 -126
  65. package/docs/components/radio.md +0 -80
  66. package/docs/components/range.md +0 -83
  67. package/docs/components/rating.md +0 -91
  68. package/docs/components/ratio.md +0 -13
  69. package/docs/components/responsive.md +0 -19
  70. package/docs/components/scrollspy.md +0 -13
  71. package/docs/components/segmented-control.md +0 -82
  72. package/docs/components/select.md +0 -89
  73. package/docs/components/skeleton.md +0 -70
  74. package/docs/components/stepper.md +0 -107
  75. package/docs/components/switch.md +0 -97
  76. package/docs/components/table.md +0 -90
  77. package/docs/components/tabs.md +0 -104
  78. package/docs/components/tag.md +0 -144
  79. package/docs/components/tile.md +0 -112
  80. package/docs/components/timeline.md +0 -78
  81. package/docs/components/toast.md +0 -108
  82. package/docs/components/tooltip.md +0 -113
  83. package/docs/components/tree-view.md +0 -118
  84. package/docs/contributing/contributing.md +0 -18
  85. package/docs/getting-started/installation.md +0 -70
  86. package/docs/getting-started/usage.md +0 -105
  87. package/docs/guides/accessibility.md +0 -109
  88. package/docs/guides/charts.md +0 -73
  89. package/docs/guides/dark-mode.md +0 -90
  90. package/docs/guides/icons.md +0 -99
  91. package/docs/guides/javascript-api.md +0 -9
  92. package/docs/guides/layout-advanced.md +0 -118
  93. package/docs/guides/migration-clarus-to-fokus.md +0 -48
  94. package/docs/guides/migration-external.md +0 -123
  95. package/docs/guides/migration-v1.md +0 -63
  96. package/docs/guides/print.md +0 -30
  97. package/docs/guides/rtl-and-system-preferences.md +0 -28
  98. package/docs/guides/theming.md +0 -140
  99. package/docs/guides/utility-api.md +0 -9
  100. package/docs/prompts/prompt-plan.md +0 -45
  101. package/docs/reference/accessibility-matrix.md +0 -77
  102. package/docs/reference/browser-support.md +0 -75
  103. package/docs/reference/contrast-report.md +0 -54
  104. package/docs/reference/definitions.md +0 -868
  105. package/docs/reference/design-tokens.md +0 -208
  106. package/docs/reference/scss-architecture.md +0 -227
  107. package/docs/reference/size-baseline.json +0 -34
  108. package/docs/reference/stability.md +0 -89
  109. package/docs/showcase.md +0 -25
  110. package/mockup/README.md +0 -41
  111. package/mockup/assets/carousel-planning.png +0 -0
  112. package/mockup/assets/carousel-workspace.png +0 -0
  113. package/mockup/assets/example-theme.css +0 -19
  114. package/mockup/assets/example-theme.js +0 -11
  115. package/mockup/assets/showcase-contracts.js +0 -84
  116. package/mockup/assets/showcase.css +0 -91
  117. package/mockup/assets/showcase.js +0 -724
  118. package/mockup/content-data.html +0 -9
  119. package/mockup/examples/accordion-tabs-toast.html +0 -149
  120. package/mockup/examples/alert-dialog.html +0 -84
  121. package/mockup/examples/alerts.html +0 -115
  122. package/mockup/examples/badges-alerts.html +0 -109
  123. package/mockup/examples/buttons.html +0 -58
  124. package/mockup/examples/cards.html +0 -132
  125. package/mockup/examples/carousel.html +0 -126
  126. package/mockup/examples/charts.html +0 -102
  127. package/mockup/examples/check-radio-switch.html +0 -620
  128. package/mockup/examples/collapse.html +0 -69
  129. package/mockup/examples/combobox.html +0 -60
  130. package/mockup/examples/command-palette.html +0 -64
  131. package/mockup/examples/datatable.html +0 -113
  132. package/mockup/examples/datepicker.html +0 -62
  133. package/mockup/examples/divider.html +0 -45
  134. package/mockup/examples/dropdown-tooltip.html +0 -77
  135. package/mockup/examples/empty-state.html +0 -56
  136. package/mockup/examples/file-drop.html +0 -74
  137. package/mockup/examples/file-upload-advanced.html +0 -68
  138. package/mockup/examples/forms-advanced.html +0 -77
  139. package/mockup/examples/hover-card.html +0 -86
  140. package/mockup/examples/icons.html +0 -157
  141. package/mockup/examples/input-group.html +0 -74
  142. package/mockup/examples/js-foundation.html +0 -215
  143. package/mockup/examples/layout.html +0 -134
  144. package/mockup/examples/modal-select.html +0 -127
  145. package/mockup/examples/nested-menu.html +0 -73
  146. package/mockup/examples/notification-center.html +0 -86
  147. package/mockup/examples/offcanvas-popover.html +0 -133
  148. package/mockup/examples/pagination-breadcrumbs.html +0 -92
  149. package/mockup/examples/popover.html +0 -81
  150. package/mockup/examples/range.html +0 -69
  151. package/mockup/examples/rating.html +0 -103
  152. package/mockup/examples/segmented-control.html +0 -96
  153. package/mockup/examples/skeletons.html +0 -82
  154. package/mockup/examples/spinner-progress.html +0 -130
  155. package/mockup/examples/stepper.html +0 -119
  156. package/mockup/examples/tables-navbar.html +0 -89
  157. package/mockup/examples/tag.html +0 -115
  158. package/mockup/examples/theming.html +0 -68
  159. package/mockup/examples/tile.html +0 -107
  160. package/mockup/examples/timeline.html +0 -108
  161. package/mockup/examples/toast.html +0 -113
  162. package/mockup/examples/tooltip.html +0 -68
  163. package/mockup/examples/tree-view.html +0 -68
  164. package/mockup/feedback-actions.html +0 -9
  165. package/mockup/forms.html +0 -13
  166. package/mockup/foundations.html +0 -7
  167. package/mockup/kitchen-sink.html +0 -696
  168. package/mockup/navigation-disclosure.html +0 -11
  169. package/mockup/overlays-commands.html +0 -12
  170. package/mockup/templates/README.md +0 -20
  171. package/mockup/templates/admin.html +0 -334
  172. package/mockup/templates/auth.html +0 -234
  173. package/mockup/templates/dashboard.html +0 -442
  174. package/mockup/templates/landing.html +0 -397
  175. package/packages/fokus-icons/package.json +0 -46
  176. package/scripts/migrate-fokus-map.json +0 -1366
  177. package/scripts/migrate-fokus.mjs +0 -97
package/CHANGELOG.md DELETED
@@ -1,940 +0,0 @@
1
- # Changelog
2
-
3
- ## Unreleased
4
-
5
-
6
-
7
- ## [2.6.0] - 2026-09-07
8
-
9
- - refina visualmente Checkbox, Radio e Switch com tokens próprios, propriedades lógicas e área de interação consistente;
10
- - adiciona estados hover, active, valid, invalid, forced colors e reduced motion aos controles nativos;
11
- - aprimora o Switch com trilho neutro, thumb elevado, halo de hover e feedback active;
12
- - documenta grupos com `fieldset/legend`, `aria-describedby`, RTL e tokens de componente.
13
-
14
- ## [2.5.0] - 2026-09-08
15
-
16
- - expande a Utility API com display, flex, gap, tipografia, estados e variantes responsivas configuráveis;
17
- - padroniza APIs estáticas de Dropdown, Tabs e Carousel e eventos comuns `fs:shown`/`fs:hidden`;
18
- - adiciona pausa de Toast por foco/hover, layouts Stack/Cluster e regras responsivas para telas estreitas;
19
- - reforça composição RTL, forced colors, redução de movimento e layouts responsivos sem alterar a API `fs-*` existente.
20
- - refina Alert com raio, borda semântica lógica, tokens locais, slots opcionais para ícone, conteúdo, ações e fechamento visual responsivo;
21
- - adiciona grupos, variante inline, composição de loading com Spinner e fallback visual para forced colors;
22
- - refina Toast com posicionamento lógico, safe area, tokens locais, slots de ícone/ações e progresso opcional sincronizado ao auto-dismiss;
23
- - refina Popover com tokens locais, composição rica, seta responsiva, foco previsível e laboratório independente;
24
- - refina Tooltip com tokens locais, posicionamento lógico, fallback, delays opcionais, suporte a ponteiro/touch e laboratório independente;
25
- - documenta o uso manual de `role="status"`/`role="alert"` e mantém Alert CSS-only, sem mover foco ou fechar automaticamente.
26
-
27
- ## [2.4.0] - 2026-09-07
28
-
29
- - adiciona preset `fokus-rtl.css` e export `fokus-styles/rtl.css`;
30
- - amplia tokens para `prefers-contrast: more` e regras de `forced-colors: active`;
31
- - documenta RTL, alto contraste, foco e preferências de movimento/cor do sistema.
32
-
33
- ## [2.3.0] - 2026-09-07
34
-
35
- - adiciona registro compartilhado de overlays, evitando múltiplos Modal/Offcanvas concorrentes;
36
- - amplia o contrato TypeScript do núcleo de overlay;
37
- - mantém o gerenciamento de foco, `inert`, scroll lock e eventos `fs:*` coordenados entre componentes.
38
-
39
- ## [2.2.0] - 2026-09-07
40
-
41
- - adiciona Utility API Sass configurável para cores, espaçamento, sizing e variantes responsivas;
42
- - adiciona tokens de configuração para presets e inclusão seletiva de famílias de utilitários;
43
- - adiciona `Spinner`, `Pagination` dinâmica e fallback de Scrollspy sem `IntersectionObserver`;
44
- - adiciona suporte a `inert`/`aria-hidden` no focus trap e estilos do spinner com redução de movimento.
45
-
46
- ## Unreleased
47
-
48
- - arredonda badges e badges split com `--fs-radius-sm`, preservando os tokens
49
- locais de personalização;
50
- - adiciona tokens de densidade, contagem circular opcional e cobertura visual
51
- dedicada para badges nos temas claro e escuro;
52
- - refina Tags com tokens de ícones, ícone final, fechamento arredondado,
53
- foco após remoção e laboratório visual de estados;
54
- - refina o Carousel com tokens locais, controles compactos, indicadores em
55
- pill, legendas opt-in, arraste aprimorado e autoplay pausável/retomável;
56
- - consolida tokens públicos de foco, transição, densidade, alturas e padding dos controles;
57
- - adiciona suporte CSS global a `prefers-reduced-motion`;
58
- - reorganiza o índice da documentação e adiciona `npm run docs:check` ao fluxo local e ao CI;
59
- - atualiza a baseline de tamanho e os snapshots visuais afetados pelo refinamento dos componentes.
60
- - define fundos semânticos explícitos para superfícies, controles, navegação,
61
- accordions, calendários, dropdowns e ordenação de tabelas.
62
- - consolida os mockups em seis laboratórios documentados, com âncoras estáveis,
63
- preview funcional, código sincronizado, temas e cobertura de regressão visual;
64
- preserva as fontes executáveis em `mockup/examples/` para testes de interação
65
- e acessibilidade.
66
-
67
- - atualiza as baselines visuais Linux dos mockups após o refinamento dos componentes;\n- consolidates visual tokens for spacing, control heights, overlay layers and
68
- contrast-aware content colors;
69
- - refines focus-visible states, responsive form controls and overlay widths;
70
- - improves dropdown, tooltip, popover and datepicker positioning on resize and
71
- scroll, while restoring DOM/style state on disposal;
72
- - strengthens modal/offcanvas/accordion/tabs semantics and adds manual tab
73
- activation;
74
- - adds typed DataTable sorting and busy-state feedback;
75
- - hardens date parsing, transition fallback and scroll-lock restoration.
76
-
77
- Todas as mudanças notáveis deste projeto serão documentadas neste arquivo.
78
-
79
- O formato segue [Keep a Changelog](https://keepachangelog.com/pt-BR/1.1.0/),
80
- e este projeto adere a [Semantic Versioning](https://semver.org/lang/pt-BR/).
81
-
82
- ## [Unreleased]
83
-
84
- ## [1.0.0] - 2026-07-08
85
-
86
- > As versões `0.3.1`–`0.6.0` foram tags de checkpoint cortadas em sequência
87
- > rápida durante o mesmo arco contínuo de desenvolvimento rumo à v1.0.0
88
- > (sem changelog próprio por versão) — todo o trabalho acumulado desde a
89
- > `0.3.0` está consolidado nesta entrada única, que corresponde ao corte
90
- > da primeira versão estável do framework.
91
-
92
- ### Added
93
-
94
- - **Templates prontos e página comparativa**: 4 templates
95
- completos e prontos pra copiar em `mockup/templates/` (`dashboard.html`,
96
- `auth.html`, `landing.html`, `admin.html`), montados só com componentes/
97
- utilitários já publicados (`dist/css`/`dist/js`), com tema escuro
98
- funcional (mesmo mecanismo de `docs/guides/dark-mode.md`) — referenciados
99
- em `docs/README.md#templates-prontos`. Nova página
100
- [`docs/comparison.md`](docs/comparison.md) ("Clarus vs Bootstrap vs
101
- Tailwind CSS"): tabelas de filosofia, tamanho de bundle, dependências e
102
- tema escuro nativo, com dados públicos e reproduzíveis (arquivos
103
- oficiais publicados de cada framework, medidos localmente com o mesmo
104
- método do gate de CI — `gzip` nível 9) em vez de números estimados;
105
- benchmarks de performance ao vivo marcados explicitamente como
106
- "pendente de metodologia" em vez de omitidos silenciosamente.
107
-
108
- ### Fixed
109
-
110
- - `.fs-empty-state[hidden]` não escondia o elemento: `.fs-empty-state`
111
- define `display: flex` em `@layer components`, e author styles sempre
112
- vencem a regra `[hidden] { display: none }` do user-agent stylesheet,
113
- mesmo dentro de `@layer` — sem uma regra author explícita pro atributo
114
- `hidden`, ele não tinha efeito nenhum. Descoberto ao construir o
115
- template `dashboard.html` (sub-fase 5.13): `DataTable`
116
- (`packages/clarus-js/js/datatable.js`) alterna esse atributo em
117
- `this.emptyEl`/`this.errorEl`, então o estado vazio/erro ficava sempre
118
- visível por baixo da tabela com dados — inclusive no mockup oficial
119
- (`mockup/datatable.html`, baseline visual atualizada). Corrigido com
120
- `.fs-empty-state[hidden] { display: none; }` em
121
- `packages/clarus-components/scss/components/_empty-state.scss`, mesmo
122
- padrão já usado em `.fs-notification-badge[hidden]`/
123
- `.fs-notification-empty[hidden]`.
124
-
125
- ### Changed
126
-
127
- - Dogfooding do `clarus-icons`: emoji usados como placeholder de ícone em
128
- mockups/docs (Empty State, Tile, Notification Center, DataTable)
129
- trocados por SVGs reais do pacote — nenhum lugar oficial do projeto usa
130
- emoji como ícone hoje. [Rating](docs/components/rating.md) também
131
- trocou o glifo `★` pelo ícone `star` (contorno vazio por padrão,
132
- preenchido via `fill: currentcolor` quando selecionado/hover — imita o
133
- visual sólido do glifo antigo sem perder o estado "vazio"); cada
134
- `<label>` ganhou `aria-label` (`"5 estrelas"` etc.), obrigatório agora
135
- que o ícone é `aria-hidden`. Pagination ganhou ícones
136
- (`chevron-left`/`chevron-right` no lugar de `«`/`»`, `ellipsis` pra
137
- intervalo de páginas omitido — variação nova, documentada), e o pager
138
- gerado por `DataTable` (`packages/clarus-js/js/datatable.js`) trocou
139
- `‹`/`›` pelos mesmos chevrons (SVG embutido como string — `clarus-js`
140
- não pode depender do pacote opcional `clarus-icons` em runtime).
141
- `.fs-btn`/`.fs-badge`/`.fs-alert`/`.fs-breadcrumb-item a` ganharam `gap`
142
- próprio pra espaçar ícone+texto corretamente (antes só funcionava por
143
- acidente, via colapso de espaço em branco do HTML); ajustado
144
- `.fs-dropdown-toggle::after` (removido `margin-left` redundante, já que
145
- agora conta como item flex do `.fs-btn` e herda o `gap`). Pagination
146
- ganhou `aria-label`/`aria-hidden` explícitos nos itens só-ícone.
147
-
148
- ### Added
149
-
150
- - **DX e supply-chain**: `.d.ts`
151
- hand-escritos para toda a API JS pública (`packages/clarus-js/js/*.d.ts`,
152
- um por módulo + `clarus.d.ts` agregador + `global.d.ts` pro uso via
153
- `<script>`), validados por `npm run types:check` (`tsc --noEmit`) contra
154
- um exemplo de uso real (`tests/types/clarus.test-d.ts`) — gate novo no
155
- CI. Corrigido bug real descoberto ao validar o subpath export
156
- (`clarus-css/js/modal.js`, o formato documentado em `usage.md`): o
157
- padrão `"./js/*"` do `exports` do `package.json` duplicava a extensão
158
- `.js` (`modal.js.js`), quebrando qualquer import direto de um módulo —
159
- nunca fora exercitado por um import real antes desta sub-fase.
160
- `npm publish --provenance` no novo `.github/workflows/release.yml`
161
- (dispara em tags `v*.*.*`, publica `clarus-css`+`clarus-icons`).
162
- `.github/FUNDING.yml` e `.github/dependabot.yml` (npm + github-actions,
163
- semanal). Utilitários de impressão (`.u-print-hide`/`.u-print-only`/
164
- `.u-print-block`/`-inline`/`-inline-block`,
165
- `packages/clarus-utilities/scss/utilities/_print.scss`), documentados em
166
- `docs/guides/print.md`. Página kitchen sink
167
- (`mockup/kitchen-sink.html`) com um exemplo compacto de cada componente,
168
- dois temas — smoke test visual rápido, referenciada em `docs/README.md`.
169
-
170
- - **Presets de tema, `clarus-cli`, tokens de gráficos, forms extras e wrapper React**:
171
- - Dois novos presets de marca em
172
- `packages/clarus-core/scss/themes/_brands.scss`: `corporate`
173
- (azul-marinho sóbrio) e `vibrant` (laranja energético) — mesma técnica
174
- OKLCH do preset `violet` existente. O primitivo do "vibrant" é claro o
175
- bastante pra o texto branco padrão de `.fs-btn-primary`/
176
- `.fs-badge-primary` cair abaixo de 4.5:1 (pego pelo gate `test:a11y`);
177
- corrigido com um override em `@layer overrides` (a camada de maior
178
- prioridade — cascade layers ignoram especificidade, então um seletor
179
- mais específico dentro de `@layer tokens` perderia mesmo assim). Ao
180
- investigar o fix, descoberto que `.fs-badge-primary` fixava `color`
181
- diretamente (ao contrário de `.fs-btn-primary`, que já seguia a
182
- convenção de só sobrescrever uma custom property) — alinhado
183
- (`--fs-badge-color`/`--fs-badge-bg`, mesmo padrão de `.fs-btn`).
184
- - Pacote `clarus-cli` (`packages/clarus-cli/`): comandos `build`
185
- (compila um entry `.scss` de um projeto consumidor com o mesmo
186
- pipeline sass→autoprefixer→cssnano do build interno), `theme` (gera um
187
- preset `data-fs-brand` em CSS puro via `color-mix()`, sem dependência de
188
- Sass, decidindo automaticamente `--fs-btn-color`/`--fs-badge-color`
189
- pelo contraste com a cor informada) e `analyze` (tamanho bruto/gzip de
190
- qualquer arquivo, versão genérica de `scripts/size.mjs`).
191
- - Tokens de gráficos agnósticos de biblioteca (`--fs-chart-series-1..6`,
192
- `--fs-chart-grid`, `--fs-chart-axis`, `--fs-chart-tooltip-bg/text`,
193
- `packages/clarus-core/scss/tokens/_charts.scss`) — aliases da camada
194
- semântica existente, sem wrapper de nenhuma lib específica. Documentado
195
- em `docs/guides/charts.md`, mockup `mockup/charts.html`.
196
- - Range/Slider (`.fs-form-range`,
197
- `packages/clarus-components/scss/forms/_range.scss`): trilha/thumb
198
- estilizados via pseudo-elementos vendor-prefixados; teclado e ARIA já
199
- vêm do `<input type="range">` nativo. JS opcional
200
- (`packages/clarus-js/js/range.js`, `data-fs="range"`) só pinta a
201
- trilha preenchida (`--fs-range-percent`, necessário porque só o
202
- Firefox suporta `::-moz-range-progress`) e espelha o valor num
203
- `<output>` associado. Documentado em `docs/components/range.md`,
204
- mockup `mockup/range.html`.
205
- - Upload avançado (`packages/clarus-js/js/file-upload-advanced.js`,
206
- `data-fs="file-upload-advanced"`): evolução do File Upload simples —
207
- múltiplos arquivos, preview (thumbnail de imagem via
208
- `URL.createObjectURL`, nome, tamanho), progresso individual
209
- (`setProgress`/`setError`, reusa `.fs-progress`) e remoção por item.
210
- Agnóstico de backend (não faz upload de verdade, só expõe a API pro
211
- consumidor plugar o próprio XHR/fetch). Documentado em
212
- `docs/components/file-upload-advanced.md`, mockup
213
- `mockup/file-upload-advanced.html`.
214
- - Pacote `clarus-react` (`packages/clarus-react/`): wrapper React fino
215
- (`ModalTrigger`/`ModalPanel`, `DropdownTrigger`/`DropdownMenu`,
216
- `TabList`) — cada componente só instancia a classe vanilla
217
- correspondente (`clarus-css/js/*`) sobre o elemento renderizado pelo
218
- React e desfaz no unmount, sem reimplementar comportamento. Cobertura
219
- parcial e deliberada (só React, só 3 componentes cobrindo os dois
220
- formatos de contrato do `clarus-js`) — serve de molde pros demais.
221
- - Placeholder estrutural de showcase de produção (`docs/showcase.md`) —
222
- sem casos fictícios nem métricas inventadas, aguardando projetos reais.
223
- - `.github/workflows/ci.yml` ganhou o gate `npm run types:check`.
224
-
225
- - **Pacote `clarus-icons`**: 1994 ícones SVG do conjunto [Lucide](https://lucide.dev) (ISC),
226
- gerados em build-time a partir do devDependency `lucide-static`
227
- (`scripts/build-icons.mjs`, `npm run build:icons`) — o pacote publicado
228
- não tem nenhuma dependência de runtime. Dois formatos de consumo: SVG
229
- puro (`clarus-icons/svg/<nome>.svg`) e módulos ES tree-shakeable
230
- (`clarus-icons/icons/<nome>.js`, mais um barrel `clarus-icons` com nomes
231
- em camelCase). Nova classe utilitária `.fs-icon` (com `-xs`/`-sm`/`-lg`/`-xl`)
232
- em `packages/clarus-utilities/scss/utilities/_icon.scss`, sempre
233
- disponível no `clarus-css` independente do pacote de ícones estar
234
- instalado. Documentado em `docs/guides/icons.md`, mockup
235
- `mockup/icons.html`, 5 testes unitários cobrindo a geração (limpeza do
236
- SVG, `stroke="currentColor"`, colisões de nome no barrel). Licenças
237
- (`LICENSE` MIT do Clarus + `LICENSE-LUCIDE.txt` ISC/Feather) distribuídas
238
- junto do pacote.
239
-
240
- - **Matriz de compatibilidade e guia de migração externa**:
241
- `docs/reference/browser-support.md` ganhou uma **matriz de
242
- compatibilidade explícita por feature** (`@layer`, `color-mix()`/OKLCH,
243
- `@container`, `:focus-visible`, `prefers-reduced-motion`) — navegador
244
- mínimo com suporte nativo × comportamento de fallback documentado por
245
- recurso, em vez de só o alvo geral do `.browserslistrc`. Novo guia
246
- `docs/guides/migration-external.md`: tabela de equivalência de
247
- classes/componentes pra quem migra de outro framework CSS pro Clarus
248
- (utilitários, componentes, o que não migra 1:1, checklist). Corrigida
249
- também uma lacuna no índice (`docs/README.md`): DataTable, Command
250
- Palette e Tree View (sub-fases 5.5/5.6) não estavam listados.
251
-
252
- - **Command Palette e Tree View**:
253
- `packages/clarus-js/js/command-palette.js`, diálogo de busca/comandos
254
- disparado por botão ou por atalho global (`data-fs-shortcut="mod+k"`),
255
- combinando o overlay/focus trap do Modal com o filtro/navegação por
256
- teclado do Combobox — reusa `.fs-dropdown-item` pros itens da lista.
257
- `packages/clarus-js/js/tree-view.js`, lista hierárquica seguindo o
258
- padrão [WAI-ARIA Tree View](https://www.w3.org/WAI/ARIA/apg/patterns/treeview/):
259
- marcação `<ul>`/`<li>` nativa aninhada, botão de expandir/colapsar
260
- auto-injetado, roving `tabindex`, navegação completa por teclado
261
- (`ArrowRight`/`ArrowLeft` cruzam níveis, `Home`/`End`,
262
- `Enter`/`Espaço`). 27 testes unitários somados entre os dois, mockups
263
- (`mockup/command-palette.html`, `mockup/tree-view.html`), a11y e visual
264
- regression verdes. Documentados em `docs/components/command-palette.md`
265
- e `docs/components/tree-view.md`. Budget de tamanho do JS: 17.25 KB
266
- gzip de um teto de 24 KB.
267
-
268
- - **DataTable v1**:
269
- `packages/clarus-js/js/datatable.js`, camada JS opcional sobre uma
270
- [Table](docs/components/table.md) comum — ordenação por coluna
271
- (`data-fs-sort`, ciclo asc → desc → nenhuma, `aria-sort` seguindo o
272
- padrão [WAI-ARIA Table Sort](https://www.w3.org/WAI/ARIA/apg/patterns/table/examples/sortable-table/)),
273
- filtro por texto (`[data-fs-datatable-filter]`, substring
274
- case-insensitive em qualquer célula) e paginação client-side
275
- (`data-fs-page-size`, reusa `.fs-pagination`/`.fs-page-link`). Estados de
276
- vazio/carregando/erro reusam `.fs-empty-state`/`.fs-skeleton`
277
- (`setLoading()`/`setError()`). Roving `tabindex` nas células do corpo com
278
- navegação completa por setas/`Home`/`End`/`Ctrl+Home`/`Ctrl+End`. 18
279
- testes unitários, mockup (`mockup/datatable.html`), a11y e visual
280
- regression verdes. Documentado em `docs/components/datatable.md` (com
281
- `docs/components/table.md` atualizado pra referenciá-lo).
282
-
283
- ### Changed
284
-
285
- - Budget de tamanho do JS (`scripts/size.mjs`, gate `npm run size:check`)
286
- recalibrado de 14 KB pra **24 KB gzip** (`js/clarus.min.js`). O teto de
287
- 14 KB foi fixado antes da decisão de incluir Combobox, Datepicker,
288
- DataTable, Command Palette e Tree View no bundle — com Combobox+Datepicker
289
- já em 13.82 KB, não sobrevivia ao resto do escopo aprovado.
290
-
291
- ### Added
292
-
293
- - **Datepicker/Timepicker**: duas
294
- abordagens. **CSS-only**:
295
- `<input type="date">`/`<input type="time">` herdam `.fs-form-control`
296
- normalmente; corrige o indicador nativo (ícone calendário/relógio) no
297
- tema escuro, invisível por padrão sobre `--fs-color-surface` escuro.
298
- **Datepicker customizado (JS)**, `packages/clarus-js/js/datepicker.js`:
299
- calendário completo seguindo o padrão
300
- [WAI-ARIA Date Picker Dialog](https://www.w3.org/WAI/ARIA/apg/patterns/dialog-modal/examples/datepicker-dialog/)
301
- adaptado a popup não-modal — `role="combobox"`/`aria-haspopup="grid"` no
302
- input, `role="grid"`/`"row"`/`"gridcell"` na grade, roving `tabindex`
303
- (dias são focáveis de verdade, ao contrário do Combobox). Teclado
304
- completo: `ArrowRight`/`ArrowLeft`/`ArrowUp`/`ArrowDown` (cruzam
305
- semana/mês), `Home`/`End`, `PageUp`/`PageDown` (mês),
306
- `Shift+PageUp`/`Shift+PageDown` (ano), `Enter`/`Space` seleciona,
307
- `Escape` fecha sem alterar o valor. Reusa `js/core/positioning.js`.
308
- 17 testes unitários (incluídos dois bugs reais pegos e corrigidos
309
- durante o desenvolvimento: `aria-expanded` não é permitido no role
310
- implícito `textbox`, exigindo `role="combobox"`; e as setas do teclado
311
- não tinham efeito nenhum com foco no input, porque o handler de teclado
312
- do grid só reagia com foco já num dia — corrigido com um handler
313
- dedicado no input que abre/move o foco pro grid em `ArrowDown`/`ArrowUp`).
314
- Mockup em `mockup/datepicker.html`, documentado em
315
- [`docs/components/datepicker.md`](docs/components/datepicker.md).
316
-
317
- - **Combobox/Autocomplete**: `<input>` de
318
- texto com listbox de sugestões que filtra por substring conforme o
319
- usuário digita, seguindo o padrão
320
- [WAI-ARIA Combobox (List Autocomplete)](https://www.w3.org/WAI/ARIA/apg/patterns/combobox/)
321
- — `role="combobox"`/`aria-autocomplete`/`aria-controls`/`aria-expanded`
322
- no input, `role="listbox"`/`role="option"`/`aria-selected` na lista,
323
- destaque de navegação via `aria-activedescendant` (foco nunca sai do
324
- input). Teclado completo (`ArrowUp`/`ArrowDown` com wrap,
325
- `Home`/`End`, `Enter` seleciona, `Escape` fecha sem alterar o valor).
326
- Reusa `js/core/positioning.js` e as classes `.fs-dropdown-menu`/
327
- `.fs-dropdown-item` do Dropdown/Select para a listbox flutuante — só
328
- `packages/clarus-components/scss/components/_combobox.scss` (wrapper +
329
- `max-height` com scroll) é novo em CSS. Item opcional `data-fs-empty`
330
- para mensagem de "sem resultados", com visibilidade alternada
331
- automaticamente. Testes unitários (13 casos), mockup em
332
- `mockup/combobox.html`, documentado em
333
- [`docs/components/combobox.md`](docs/components/combobox.md).
334
-
335
- - **Theming multi-brand**: suporte a
336
- `data-fs-brand="x"` sobre a camada de tokens semânticos existente,
337
- sobrescrevendo só a cor de ação primária (`--fs-color-primary` e os
338
- tokens derivados de alert/feedback) — `secondary`/`success`/`warning`/
339
- `danger`/`info` continuam universais entre marcas. Combina corretamente
340
- com `data-theme="dark"` (mesma técnica de mistura OKLCH de
341
- `themes/_dark.scss`). Um brand de exemplo (`violet`) em
342
- `packages/clarus-core/scss/themes/_brands.scss` prova a troca em runtime
343
- sem recompilar, com par de contraste auditado em `npm run contrast` e
344
- demo em `mockup/theming.html`. Documentado em
345
- [`docs/guides/theming.md`](docs/guides/theming.md#multi-brand), incluindo
346
- a limitação conhecida de `color-contrast()` (texto de preenchimento
347
- sólido calculado em build a partir do primary padrão, não por marca).
348
-
349
- - **Layout avançado**: três novas
350
- primitivas de layout CSS-only, `.fs-stack` (empilhamento vertical com
351
- `gap`), `.fs-cluster` (grupo horizontal com quebra automática) e
352
- `.fs-sidebar` (aside de largura fixa + conteúdo flexível, com variante
353
- `.fs-sidebar-reverse`) — todas com modificador de gap
354
- (`.fs-{stack,cluster,sidebar}-gap-{0..5}`), em
355
- `packages/clarus-core/scss/layout/`. Utilitários `.u-sticky-top`/
356
- `.u-sticky-bottom` (posição fixa ao rolar, com offset configurável).
357
- Utilitários de container query (`.u-cq` + `.u-cq-{sm,md,lg}-d-*`),
358
- reagindo à largura do container mais próximo em vez da viewport, com
359
- tokens de referência `--fs-cq-sm/md/lg` (320/480/640px). Documentado em
360
- [`docs/guides/layout-advanced.md`](docs/guides/layout-advanced.md), com
361
- exemplo em `mockup/layout.html`.
362
-
363
- - **Qualidade, A11y e performance como gate de CI**:
364
- - Gate `npm run test:a11y` (axe-core via Playwright, regras WCAG 2.1
365
- A/AA) sobre todo mockup em `mockup/*.html`, rodando no CI a cada PR.
366
- Descobriu e corrigiu violações reais de contraste em texto sobre
367
- fundo (link/nav ativo, botão `outline-*`, feedback de formulário,
368
- step/timeline de erro) que usavam a cor de token "crua" — agora usam
369
- `--fs-alert-{nome}-text` (já calibrado ≥4.5:1 nos dois temas) — e uma
370
- violação de nome acessível ausente em `role="progressbar"`
371
- (`aria-label` adicionado nos exemplos, guia atualizado em
372
- [`docs/components/progress.md`](docs/components/progress.md)).
373
- - [Matriz de acessibilidade](docs/reference/accessibility-matrix.md)
374
- publicada em `docs/reference/`: teclado, ARIA e gestão de foco por
375
- componente, com link pra seção "A11y" de cada página.
376
- - Budgets de tamanho como blocker no CI: `npm run size:check` falha o
377
- build se `layout` (core), `components`, `clarus` (full) ou o JS
378
- ultrapassarem os tetos definidos (12/18/32/14 KB gzip). Relatório
379
- de tamanho gzip desta release (`npm run size`):
380
-
381
- | Distribuição | Bruto | Gzip | Budget |
382
- | --- | --- | --- | --- |
383
- | `css/layout.min.css` | 13.39 KB | 3.10 KB | 12 KB |
384
- | `css/forms.min.css` | 18.24 KB | 4.26 KB | — |
385
- | `css/components.min.css` | 48.41 KB | 9.19 KB | 18 KB |
386
- | `css/helpers.min.css` | 41.59 KB | 7.24 KB | — |
387
- | `css/fonts.min.css` | 1.47 KB | 0.40 KB | — |
388
- | `css/clarus.min.css` | 97.08 KB | 15.58 KB | 32 KB |
389
- | `js/clarus.min.js` | 51.17 KB | 11.19 KB | 14 KB |
390
-
391
- - `npm run contrast:check` (mesma auditoria de `npm run contrast`, mas
392
- falha o build abaixo de AA) também vira gate do CI.
393
-
394
- ### Changed
395
-
396
- - **Documentação profissional**: `guide.md` (76KB, um
397
- arquivo só, desatualizado em relação ao rename da API) é substituído
398
- por `docs/`, estruturada por categoria: `getting-started/` (instalação,
399
- uso), `guides/` (theming, dark mode, acessibilidade, migração),
400
- `components/` (38 arquivos, um por componente/controle, template padrão:
401
- visão geral → anatomia → variações → estados → A11y → API JS → tokens →
402
- exemplo — todo conteúdo verificado contra o SCSS/JS atual, não copiado do
403
- guia antigo), `reference/` (design tokens, arquitetura SCSS, suporte a
404
- navegadores, relatório de contraste, definições) e `contributing/`.
405
- Documentos internos de planejamento (planos provisórios, gap-analysis,
406
- guia de comandos) mantidos fora da documentação pública; removidos do
407
- repositório após o corte da v1.0.0, papel encerrado.
408
- `definitions.md`/`scss-architecture.md` movidos para `docs/reference/`.
409
- `package.json > files` publica a nova `docs/` pública (exceto `internal/`).
410
- Referências cruzadas (README raiz, CONTRIBUTING, templates de PR)
411
- atualizadas para os novos caminhos.
412
-
413
- - **BREAKING** — Refundação técnica rumo à v1.0.0:
414
- - Rename mecânico de toda a API pública com prefixo `fs-`, para não colidir
415
- com classes de outras bibliotecas/CSS de terceiros na mesma página: toda
416
- classe de componente ganha o prefixo `fs-` (`.btn` → `.fs-btn`,
417
- `.dropdown-menu` → `.fs-dropdown-menu` etc.), utilitários passam a usar
418
- `u-` (`.d-flex` → `.u-d-flex`, `.mt-3` → `.u-mt-3`), e os estados
419
- controlados por JavaScript usam `.is-*` (`.show` → `.is-open`, `.active`
420
- → `.is-active`, `.disabled` → `.is-disabled`; `.is-valid`/`.is-invalid`
421
- já seguiam a convenção). Tokens CSS (`--clarus-*` → `--fs-*`), o atributo
422
- de auto-init (`data-fsarus` → `data-fs`) e os atributos de alvo/dispensa
423
- (`data-target`/`data-dismiss` → `data-fs-target`/`data-fs-dismiss`)
424
- seguem o mesmo prefixo, assim como os eventos DOM customizados
425
- (`clarus:*` → `fs:*`). O global JavaScript (`window.Clarus`) e o nome do
426
- pacote npm (`clarus-css`) **não mudam**. Afeta todo HTML que consome o
427
- framework — quem atualizar precisa migrar as classes/atributos/eventos
428
- citados acima.
429
- - Reestruturação do repositório em monorepo (npm workspaces):
430
- `scss/`/`js/` viram `packages/{clarus-core,clarus-components,
431
- clarus-utilities,clarus-js,clarus-fonts}/`. Não afeta o consumo do
432
- pacote publicado (`dist/`, `clarus-css/scss`, `clarus-css/js/*`
433
- continuam nos mesmos caminhos), só a organização interna do
434
- repositório-fonte.
435
- - Todo o CSS emitido agora está organizado em cascade layers, na ordem
436
- `reset, tokens, base, layout, components, utilities, overrides`
437
- (declarada uma vez em `packages/clarus-core/scss/tokens/_root.scss`,
438
- propagada a cada bundle de `dist/css/`). Efeito prático: uma classe
439
- utilitária (`.u-*`) sempre vence uma classe de componente, mesmo com
440
- especificidade igual, independente da ordem de import — ver
441
- `docs/reference/scss-architecture.md`. A camada `overrides` fica reservada, sem
442
- regras do framework, para customização do consumidor sem `!important`.
443
- - Cores primitivas migradas para OKLCH (`packages/clarus-core/scss/settings/_colors.scss`),
444
- calibradas para reproduzir os mesmos matizes hex de antes (round-trip
445
- hex→oklch→hex), com fallback automático em sRGB via
446
- `@supports (color: oklch(0% 0 0))` para navegadores sem suporte —
447
- identidade visual inalterada, sem browsers não suportados. Piso de
448
- navegador atualizado para moderno com fallback progressivo (Safari/iOS
449
- 16.4+; ver `docs/reference/browser-support.md`).
450
- - Nova camada semântica de tokens (`packages/clarus-core/scss/tokens/_semantic.scss`:
451
- `--fs-color-bg-surface`, `--fs-color-text-primary`,
452
- `--fs-color-border-default` etc., todos alias `var()` dos tokens
453
- primitivos) e primeiro componente migrado para tokens próprios
454
- (`.fs-btn` ganha `--fs-btn-bg`/`--fs-btn-color`/`--fs-btn-border-color`,
455
- sobrescrevíveis por instância sem `!important`) — ver
456
- `docs/reference/scss-architecture.md` para o padrão a seguir em outros componentes.
457
- - Nova escala tipográfica compacta (`--fs-font-size-*`): corpo ~13px, piso
458
- ~11px reservado a texto de apoio; headings (`h1`–`h6`) ganham tamanho e
459
- peso próprios pela primeira vez (antes usavam o padrão do navegador).
460
- Utilitários `.u-fs-*`/`.u-fw-*` expandidos (`xl`, `h1`–`h6`,
461
- `semibold`/`bold`).
462
- - Governança: `CODE_OF_CONDUCT.md`, templates de issue/PR
463
- (`.github/ISSUE_TEMPLATE/`, `.github/PULL_REQUEST_TEMPLATE.md`), política
464
- de depreciação (2 minors) em `CONTRIBUTING.md`, guia de migração
465
- (`docs/guides/migration-v1.md`) com codemod (`scripts/migrate-v1.mjs`),
466
- script de baseline de tamanho gzip (`npm run size`) e relatório de
467
- contraste WCAG (`npm run contrast`).
468
-
469
- ### Added
470
-
471
- - **Componentes e refinamentos Cirrus**, já na convenção `fs-`/`@layer`/tokens:
472
- - Checkbox/radio/switch 100% CSS (`packages/clarus-components/scss/forms/_check-radio-switch.scss`):
473
- `.fs-check`/`.fs-radio`/`.fs-switch`, técnica de input oculto + label
474
- irmã (mesma do Segmented Control/Rating). Estados checked/disabled/
475
- indeterminate/`:focus-visible`, validação `is-valid`/`is-invalid`,
476
- tamanhos sm/md/lg. Switch com knob retangular arredondado (não circular).
477
- - Tile (`_tile.scss`): `.fs-tile` > `.fs-tile-icon` / `.fs-tile-body`
478
- (`-title`/`-subtitle`) / `.fs-tile-actions` (à direita por padrão,
479
- `.fs-tile-actions-bottom` pra embaixo). Variante `.fs-tile-clickable`
480
- reusa `.fs-stretched-link` do Card. Tamanhos sm/lg.
481
- - Pagination (`_pagination.scss`): `.fs-pagination-bordered` (itens
482
- colados, borda fundida), tamanhos sm/lg, `.fs-page-link-text` para
483
- prev/next descritivo (texto em vez de só «/»).
484
- - Tabs (`_tabs.scss`): estilos `.fs-tabs-pill` e `.fs-tabs-depth` (além do
485
- padrão em linha), alinhamento `.fs-tabs-center`/`-right`/`-fill`,
486
- tamanhos sm/lg — tudo modificador de `.fs-tabs`, reaproveita `.fs-nav-link`
487
- e a navegação por teclado existente (`js/tabs.js`) sem mudar o HTML.
488
- - Tags (`_tag.scss`): escala própria `.fs-tag-xs`…`-xl`, agrupamento
489
- (`.fs-tag-group`), feedback tátil (`:active`) no botão de dispensa.
490
- - Mockups novos: `mockup/check-radio-switch.html`, `mockup/tile.html`;
491
- exemplos adicionados a `mockup/pagination-breadcrumbs.html`,
492
- `mockup/accordion-tabs-toast.html`, `mockup/tag.html`.
493
-
494
- - **Notification Center e Nested Menu**:
495
- - Notification Center (`scss/components/_notification-center.scss`,
496
- `js/notification-center.js`): orquestra múltiplas instâncias de
497
- `Clarus.Toast` e mantém um histórico. `push({title, body, variant})` empilha
498
- um toast e registra a notificação; painel de histórico (posicionado como o
499
- Dropdown, fecha com Escape/clique fora) com dispensa por item, "limpar tudo"
500
- e contador de não-lidas no gatilho — abrir marca tudo como lido.
501
- Persistência opcional em `localStorage` (`data-storage="local"` +
502
- `data-storage-key`); padrão em memória. `Clarus.NotificationCenter` com
503
- `push()`/`remove()`/`clear()`/`getAll()`/`open()`/`close()`/`toggle()`/
504
- `dispose()` e eventos `clarus:notification:pushed`/`-opened`/`-closed`/
505
- `-cleared`. Mockup `mockup/notification-center.html`. Testes em
506
- `tests/unit/notification-center.test.js`.
507
- - Menu aninhado / Nested Menu (`scss/components/_nested-menu.scss`,
508
- `js/nested-menu.js`): Dropdown com submenus recursivos, reaproveitando
509
- `.dropdown-menu`/`.dropdown-item`. Abertura por hover é 100% CSS;
510
- posicionamento em cascata (`left: 100%`, com flip para a esquerda perto da
511
- borda) e navegação por teclado por nível (↓/↑ no nível, → abre, ←/Esc
512
- fecham, Enter/Espaço alternam). `Clarus.NestedMenu` com API padrão
513
- (`getInstance()`/`show()`/`hide()`/`toggle()`/`dispose()`) e eventos
514
- `clarus:nested-menu:shown`/`-hidden`. Mockup `mockup/nested-menu.html`.
515
- Testes em `tests/unit/nested-menu.test.js`.
516
- - **File Input Drag-and-Drop e Hover Card**:
517
- - File Input Drag-and-Drop (`js/file-drop.js`): evolui
518
- `.file-upload`/`.file-input`/`.file-label` com
519
- `dragenter`/`dragover`/`dragleave`/`drop`, sincronizando o arquivo
520
- solto com o `<input type="file">` nativo (dispara `change` nativo).
521
- Estado visual `.is-dragover` e variante `.file-label-dropzone`. Mockup
522
- `mockup/file-drop.html`. Testes unitários em
523
- `tests/unit/file-drop.test.js`.
524
- - Hover Card (`.popover-hover-card` em `scss/components/_popover.scss`):
525
- composição do Popover já existente com `data-trigger="hover"`, sem
526
- JavaScript novo — só um ajuste visual (largura + layout de avatar ao
527
- lado do texto). Mockup `mockup/hover-card.html`.
528
- - **Badge dismissível / Tag** (`scss/components/_tag.scss`, `js/tag.js`).
529
- `.tag` estende `.badge` e `.btn-close`, só ajustando o
530
- tamanho do botão de fechar (14×14px) para caber num badge. Precisa de
531
- JavaScript, de forma mínima:
532
- `Clarus.Tag` só ouve o clique em `[data-dismiss="tag"]` e dispara o
533
- evento cancelável `clarus:tag:dismissed` antes de remover o elemento do
534
- DOM (`preventDefault()` bloqueia a remoção). Mockup `mockup/tag.html`.
535
- Testes unitários em `tests/unit/tag.test.js`.
536
- - **Quick wins 100% CSS**:
537
- - Divider (`scss/components/_divider.scss`): `<hr class="divider">` para
538
- o traço simples; `<div class="divider">` com `.divider-label` para
539
- texto centralizado, via `::before`/`::after`. Mockup
540
- `mockup/divider.html`.
541
- - Empty State (`scss/components/_empty-state.scss`): `.empty-state` com
542
- `.empty-state-icon` (slot vazio), `.empty-state-title`,
543
- `.empty-state-text` e ação opcional reaproveitando os botões
544
- existentes. Mockup `mockup/empty-state.html`.
545
- - Rating / Stars (`scss/components/_rating.scss`): `.rating`/
546
- `.rating-star`, mesma técnica de input oculto + label irmão do
547
- Segmented Control (`<input type="radio">` por estrela, `row-reverse` +
548
- combinador de irmãos gerais). Tamanhos `.rating-sm`/`-lg`. Mockup
549
- `mockup/rating.html`.
550
- - **Input Group e Alert Dialog**:
551
- - Input Group (`scss/forms/_forms.scss`): `.input-group`/`.input-group-text`,
552
- 100% CSS. Funde `.form-control`/`.form-select`/`.btn` com addons de
553
- prefixo/sufixo, bordas adjacentes sem duplicação e altura do addon
554
- acompanhando o controle via `align-items: stretch`. Tamanhos
555
- `.input-group-sm`/`-lg`. Mockup `mockup/input-group.html`.
556
- - Alert Dialog / Confirm (`scss/components/_alert-dialog.scss`,
557
- `js/confirm.js`): variante do Modal para confirmação, montada
558
- dinamicamente (sem HTML pré-declarado) por `Clarus.confirm(options)`,
559
- reaproveitando `js/modal.js` (foco/teclado/overlay). Retorna uma
560
- `Promise<boolean>` (`true` ao confirmar, `false` ao cancelar/Escape/
561
- clique fora), com o foco voltando ao elemento que chamou. Opções
562
- `title`/`message`/`confirmText`/`cancelText`/`variant`. Mockup
563
- `mockup/alert-dialog.html`.
564
- - Testes unitários (Vitest) para `confirm()` (`tests/unit/confirm.test.js`).
565
- - **Segmented Control, Skeletons, Timeline, Collapse standalone e Breadcrumb avançado**:
566
- - Componente Segmented Control (`scss/components/_segmented-control.scss`):
567
- `.segmented-control`/`.segmented-item`/`.segmented-label`, 100% CSS.
568
- Modo exclusivo (`<input type="radio">`) ou inclusivo (`<input
569
- type="checkbox">`), input oculto pela mesma técnica de `.file-input`
570
- (`scss/forms/_forms.scss`), reaproveitando `color-contrast()` no item
571
- selecionado. Tamanhos `.segmented-control-sm`/`-lg`. Mockup
572
- `mockup/segmented-control.html`.
573
- - Componente Skeletons (`scss/components/_skeleton.scss`): `.skeleton` base
574
- e variantes `.skeleton-text`/`-circle`/`-rect`, 100% CSS. Animação
575
- "pulse" por padrão; `.skeleton-wave` varre um brilho via
576
- pseudo-elemento. Ambas desativadas em `prefers-reduced-motion: reduce`.
577
- Mockup `mockup/skeletons.html`.
578
- - Componente Timeline (`scss/components/_timeline.scss`): `.timeline`/
579
- `.timeline-item`/`.timeline-marker`, 100% CSS, vertical por padrão
580
- (`.timeline-horizontal` inverte o eixo). Estados padrão (pendente)/
581
- `.timeline-active`/`.timeline-completed`/`.timeline-failed`
582
- reaproveitando os tokens de cor de estado; conector de progresso na
583
- mesma lógica do Stepper. Mockup `mockup/timeline.html`.
584
- - Collapse standalone (`scss/components/_collapse.scss`, `js/collapse.js`):
585
- extrai `collapse()`/`expand()` de `js/core/transition.js` (já usado pelo
586
- Accordion) para uma seção expansível independente. `Clarus.Collapse`
587
- segue a API da seção 20 (`data-fsarus="collapse"`, `data-target`,
588
- `getInstance()`, `.show()`/`.hide()`/`.toggle()`/`.dispose()`, eventos
589
- `clarus:collapse:shown`/`-hidden`). Mockup `mockup/collapse.html`.
590
- - Breadcrumb avançado (`scss/components/_breadcrumbs.scss`,
591
- `js/breadcrumb.js`): truncamento por CSS com tooltip (`js/tooltip.js`)
592
- só quando o texto transborda (medido após `document.fonts.ready`); abaixo
593
- do breakpoint `sm` (640px), colapsa os níveis intermediários num item
594
- "…" que compõe um `Dropdown` (`js/dropdown.js`), mantendo sempre o
595
- primeiro e o último nível visíveis. `data-max-items` configurável.
596
- Mockup `mockup/pagination-breadcrumbs.html` (exemplo avançado).
597
- - Testes unitários (Vitest) para Collapse e Breadcrumb
598
- (`tests/unit/collapse.test.js`, `tests/unit/breadcrumb.test.js`).
599
-
600
- ### Changed
601
-
602
- - Cores `primary` e `danger` escurecidas no preenchimento sólido para o texto
603
- branco ter contraste adequado (WCAG ≥ 4.5:1): `--clarus-color-primary` passa
604
- de blue-500 (#2972fa) para blue-600 (#1a61e6) e `--clarus-color-danger` de
605
- red-500 (#fb4143) para red-700 (#cc3335) em `scss/settings/_colors.scss`.
606
- Antes o `color-contrast()` caía para texto preto nesses fundos (pouca
607
- legibilidade, sobretudo no vermelho). O peso de clareamento do `primary` no
608
- dark mode (`scss/themes/_dark.scss`) sobe de 86% para 95%, porque o texto do
609
- preenchimento passou de preto para branco (clarear reduz o contraste com o
610
- branco). Afeta botões, badges, alerts e bordas que usam essas cores.
611
- - Fontes self-hosted (Plus Jakarta Sans e Source Code Pro) movidas para um
612
- arquivo à parte, opcional: novo bundle `dist/css/fonts.css` (a partir de
613
- `scss/base/_fonts.scss` + `scss/entries/fonts-entry.scss`), exportado como
614
- `clarus-css/fonts.css`; `scss/base/_typography.scss` mantém só as pilhas de
615
- `font-family`. Quem quiser as fontes importa `fonts.css` antes do CSS
616
- principal; sem ele, a tipografia cai no `sans-serif`/`monospace` do sistema.
617
- Também elimina a duplicação dos `@font-face`, antes repetidos em `clarus.css`,
618
- `components.css`, `forms.css`, `layout.css` e `helpers.css`.
619
- - Alert Dialog / Confirm (`js/confirm.js`, `scss/components/_alert-dialog.scss`):
620
- removido o ícone informativo do corpo do diálogo — fica só título e mensagem.
621
- - Paleta de cores evoluída para escalas completas 100-900 por matiz
622
- (yellow/green/blue/gray/red/purple) com papéis semânticos por cor de
623
- estado (`color`/`-hover`/`-active`/`-disabled`/`bg`/`bg-2`/`text`/`text-2`/
624
- `border`) em `scss/settings/_colors.scss`, incluindo uma nova cor
625
- `secondary`; `scss/tokens/_root.scss` e `scss/themes/_dark.scss`
626
- (variantes de dark mode por peso de tint) acompanham a nova estrutura.
627
- - Fonte monoespaçada Source Code Pro passa a ser self-hosted
628
- (`assets/fonts/source-code-pro/`, licença OFL), removendo o último
629
- `@import` externo de Google Fonts em `scss/base/_typography.scss` —
630
- completa a meta de dependência externa zero em tempo de execução (seção 6
631
- de `docs/definitions.md`) também para a fonte mono, no mesmo padrão já
632
- usado pela Plus Jakarta Sans.
633
-
634
- - Componente Stepper/Wizard (`scss/components/_stepper.scss`, `js/stepper.js`):
635
- `.stepper`/`.stepper-header`/`.step` com `.step-indicator` (número, ou "check"
636
- em SVG quando concluído) e `.step-label`; estados `.step-active`/
637
- `.step-completed`/`.step-error`; conector de progresso na cor primária após um
638
- passo concluído; variante `.stepper-vertical` (com `.step-content` +
639
- `.step-description`); painéis opcionais `.step-panel` e ações `.stepper-actions`
640
- com `[data-stepper="prev"]`/`[data-stepper="next"]`. `Clarus.Stepper` com
641
- `.next()`/`.prev()`/`.goTo()`/`.setError()`/`.complete()`/`.dispose()`; evento
642
- **cancelável** `clarus:stepper:beforechange` (hook de validação por passo),
643
- `clarus:stepper:changed` e `clarus:stepper:completed`. Linear por padrão
644
- (`data-linear`), `aria-current="step"` e navegação por teclado. Mockup
645
- `mockup/stepper.html`.
646
- - Breakpoint adicional `xxxl` (1920px, `scss/settings/_breakpoints.scss`),
647
- para monitores externos Full HD sem escala — gera automaticamente
648
- `.col-xxxl-*`, `.container-xxxl` e todos os utilitários responsivos
649
- `-xxxl` (spacing, gap, flex, display) via os mesmos loops que já geram os
650
- demais breakpoints.
651
- - Componente Offcanvas (`scss/components/_offcanvas.scss`, `js/offcanvas.js`):
652
- painel deslizante com posições `.offcanvas-start`/`-end`/`-top`/`-bottom`,
653
- mesmo mecanismo de overlay do Modal (bloqueio de scroll, focus trap,
654
- Escape/clique fora), aplicado de forma independente (sem compor
655
- `js/modal.js`). Backdrop criado dinamicamente pelo JS;
656
- `data-backdrop="static"` desativa Escape/clique fora, `data-backdrop="false"`
657
- remove o backdrop visual mantendo Escape/clique fora ativos. `Clarus.Offcanvas`
658
- com `getInstance()`/`.show()`/`.hide()`/`.toggle()`/`.dispose()`, eventos
659
- `clarus:offcanvas:shown`/`-hidden`, `data-dismiss="offcanvas"`. Mockup
660
- `mockup/offcanvas-popover.html`.
661
- - Componente Popover (`scss/components/_popover.scss`, `js/popover.js`):
662
- painel flutuante com conteúdo rico (`.popover-header`/`-body`/`-footer`),
663
- posicionado via `computePosition()`/`applyPosition()` (como Dropdown/Tooltip),
664
- `role="dialog"` + `aria-modal="false"` (não é modal — sem focus trap, sem
665
- bloqueio de scroll). `data-trigger` controla o disparo: `"click"` (padrão),
666
- `"hover"` (com tolerância para mover o mouse ao conteúdo), `"focus"` (via
667
- `focusout`/`relatedTarget`) ou `"manual"` (sem listeners automáticos).
668
- `Clarus.Popover` com `getInstance()`/`.show()`/`.hide()`/`.toggle()`/
669
- `.dispose()`, eventos `clarus:popover:shown`/`-hidden`, `data-dismiss="popover"`.
670
- Mockup `mockup/offcanvas-popover.html`.
671
-
672
- ### Changed
673
-
674
- - Escala de breakpoints (`scss/settings/_breakpoints.scss`) recalibrada para
675
- as larguras lógicas de tela mais comuns do mercado atual:
676
- `sm` 576px→640px (tablets pequenos/phablets), `lg` 992px→1024px (tablet
677
- paisagem/iPad), `xl` 1200px→1280px (laptop comum), `xxl` 1400px→1536px
678
- (laptop/desktop com escala, ex.: Mac/Windows a 125%). `md` (768px)
679
- permanece igual. `$container-max-widths` ajustado na mesma proporção
680
- (600/720/960/1200/1440px). Os nomes de classe não mudam
681
- (`.col-md-6`, `.d-lg-none`, etc. continuam os mesmos) — só os valores em
682
- px por trás de cada breakpoint, o que pode alterar sutilmente o layout
683
- visual de projetos existentes nos pontos de corte afetados.
684
-
685
- ### Fixed
686
-
687
- - Erro do bundlephobia ao analisar o pacote ("Found an asset without the
688
- `.bundle` suffix ... `.woff2`"): o `main` (`dist/css/clarus.css`) referenciava
689
- as `url(...woff2)` dos `@font-face`, que o webpack do bundlephobia não resolve
690
- sem loader. Com os `@font-face` isolados em `fonts.css` (ver Changed), os
691
- bundles principais não têm mais referências a woff2.
692
- - Badge (`scss/components/_badges.scss`): texto centralizado verticalmente — o
693
- padding assimétrico `2px 8px 0`, que empurrava o texto para baixo, virou
694
- `0 8px`, deixando a centralização por conta do flex.
695
- - Tag (`scss/components/_tag.scss`): o "x" do botão de fechar herda a cor de
696
- texto do badge (contraste automático por variante) em vez de um cinza fixo,
697
- corrigindo a baixa visibilidade sobre badges coloridos.
698
- - Timeline horizontal (`scss/components/_timeline.scss`): o conector alinha com
699
- o centro do marcador — o `margin-top: 3px` do marcador (necessário só no modo
700
- vertical) é zerado no horizontal, onde deixava a linha acima do centro do
701
- círculo.
702
-
703
- ## [0.3.0] - 2026-07-04
704
-
705
- ### Added
706
-
707
- - Componente Spinner e Progress (`scss/components/_spinner.scss`, 100% CSS):
708
- spinner giratório `.spinner` (animação `clarus-spin`) com tamanhos
709
- (`.spinner-sm`/`.spinner-lg`) e variantes de cor de estado
710
- (`.spinner-#{nome}`); barra de progresso `.progress`/`.progress-bar` com
711
- largura por `--clarus-progress-value` (0–100), tamanhos
712
- (`.progress-sm`/`.progress-lg`), variantes de cor
713
- (`.progress-bar-#{nome}`, via `color-contrast()`) e faixas opcionais
714
- (`.progress-bar-striped`/`.progress-bar-animated`). Toda animação respeita
715
- `prefers-reduced-motion`. Mockup `mockup/spinner-progress.html`. Primeiro
716
- item da Etapa 1 do roadmap de paridade.
717
- - Componente Carousel (`scss/components/_carousel.scss`, `js/carousel.js`):
718
- carrossel de slides com layout "slide" (trilha flex deslocada por
719
- `translateX`) e variante `.carousel-fade` (opacidade); setas
720
- (`.carousel-control-prev`/`-next`) e indicadores (`.carousel-indicators`)
721
- opcionais, com modificador opcional `.carousel-hover-controls` (setas só no
722
- hover/foco). `Clarus.Carousel` com `.next()`/`.prev()`/`.goTo()`/`.pause()`/
723
- `.dispose()`, evento `clarus:carousel:slid`, navegação por teclado
724
- (setas/Home/End), swipe por pointer events e autoplay opcional
725
- (`data-autoplay`/`data-interval`, válido para slide e fade) que pausa no
726
- hover/foco. ARIA completo (`role="group"`, `aria-roledescription`,
727
- `aria-current` nos indicadores) e respeito a `prefers-reduced-motion`. O
728
- recorte fica no `.carousel` (elemento parado) e não na trilha, para não
729
- cortar os slides seguintes ao deslocar. Mockup `mockup/carousel.html`.
730
- Segundo item (Etapa 2) do roadmap de paridade.
731
- - Testes de regressão visual com Playwright integrados ao CI, com baselines por
732
- plataforma (`-win32`/`-linux`, estas geradas em container Docker para bater
733
- com o ambiente do CI).
734
-
735
- ## [0.2.0] - 2026-07-04
736
-
737
- ### Added
738
-
739
- - Suíte de testes automatizados: testes funcionais de JavaScript com Vitest +
740
- jsdom (`tests/unit/`, cobrindo estado, ARIA e eventos de cada componente
741
- interativo e dos módulos de `js/core/`) e testes visuais com Playwright
742
- (`tests/visual/`, screenshots de baseline por mockup e testes de interação).
743
- Ambos rodam automaticamente no GitHub Actions a cada push/PR, além do lint e
744
- do build.
745
-
746
- ## [0.1.2] - 2026-07-04
747
-
748
- ### Added
749
-
750
- - Componente Botões (`scss/components/_buttons.scss`): variantes sólidas e
751
- outline por cor de estado (`.btn-primary/success/warning/danger/info`,
752
- `.btn-outline-*`), tamanhos (`.btn-sm`/`.btn-lg`) e estados de
753
- hover/active/focus/disabled.
754
- - Função `color-contrast()` (`scss/tools/_mixins.scss`), que escolhe texto
755
- branco ou preto por cor de fundo com base no contraste WCAG (mínimo 4.5:1).
756
- - Componente Badges (`scss/components/_badges.scss`): variantes sólidas por
757
- cor de estado (`.badge-primary/success/warning/danger/info`) e tamanhos
758
- (`.badge-sm`/`.badge-lg`).
759
- - Componente Alertas (`scss/components/_alerts.scss`): variantes tintadas
760
- por cor de estado (`.alert-primary/success/warning/danger/info`), com
761
- tokens `--clarus-alert-*-bg`/`-text` (`scss/tokens/_root.scss`,
762
- sobrescritos no dark mode em `scss/themes/_dark.scss`).
763
- - Funções `tint-color()`/`shade-color()` (`scss/tools/_mixins.scss`), para
764
- gerar variações claras/escuras de uma cor base.
765
- - Componente Cards (`scss/components/_cards.scss`): `.card-header`,
766
- `.card-body`, `.card-footer`, `.card-title`, `.card-subtitle`,
767
- `.card-text` e tamanhos (`.card-sm`/`.card-lg`).
768
- - Utilitários de sombra (`.shadow-sm`/`.shadow`/`.shadow-lg`) em
769
- `scss/utilities/_shadow.scss`, com tokens `--clarus-shadow-*`
770
- (`scss/tokens/_root.scss`) e override para dark mode.
771
- - Componente `.btn-close` (`scss/components/_buttons.scss`), reaproveitável
772
- em cards, e futuramente em modal/toast.
773
- - `.card-header` agora suporta título + botão de fechar alinhados nas
774
- pontas (layout flex com `justify-content: space-between`).
775
- - `.card-clickable` + `.stretched-link`: torna o card inteiro clicável e
776
- focável via um único link, sem aninhar elementos interativos.
777
- - `.card-horizontal`: inverte o eixo do card para linha, com raio e borda
778
- do header/footer ajustados para a lateral.
779
- - Componente Tabelas (`scss/components/_tables.scss`): `.table-striped`,
780
- `.table-hover`, `.table-bordered`, `.table-borderless`, `.table-sm`,
781
- `.table-responsive` e variantes de cor de estado
782
- (`.table-primary/success/warning/danger/info`), reaproveitando os
783
- tokens `--clarus-alert-*-bg`/`-text` da Fase 2.
784
- - Componente Navbar (`scss/components/_navbar.scss`): `.navbar-brand`,
785
- `.navbar-nav`, `.nav-link` (com estados `.active`/`.disabled`), versão
786
- estática (sem dropdown/collapse).
787
- - Componente Paginação (`scss/components/_pagination.scss`): `.page-link`,
788
- estados `.active`/`.disabled`, reaproveitando `color-contrast()` da
789
- Fase 1.
790
- - Componente Breadcrumbs (`scss/components/_breadcrumbs.scss`):
791
- `.breadcrumb-item`, separador via `::before`, estado `.active`.
792
- - Infraestrutura JS compartilhada (`js/core/`), pré-requisito dos
793
- componentes interativos das próximas fases, sem dependências externas:
794
- `positioning.js` (`computePosition()`/`applyPosition()`, com flip
795
- automático e clamp na viewport); `overlay.js` (`lockScroll()`/
796
- `unlockScroll()` com compensação de scrollbar e contagem de referências,
797
- `onClickOutside()`); `focus.js` (`createFocusTrap()` com ciclo
798
- Tab/Shift+Tab, `onEscapeKey()`); `transition.js` (`collapse()`/
799
- `expand()` animando `height`, respeitando `prefers-reduced-motion`).
800
- Reexportado como `Clarus.core` pelo bundle único e importável de forma
801
- granular (`clarus-css/js/core/*`).
802
- - Componente Dropdown (`scss/components/_dropdown.scss`, `js/dropdown.js`):
803
- `.dropdown-toggle`/`.dropdown-menu`/`.dropdown-item`/`.dropdown-divider`/
804
- `.dropdown-header`; posicionamento via `Clarus.core` com flip automático e
805
- alinhamento configurável (`data-align="start"`/`"center"`/`"end"`, padrão
806
- `"start"`), navegação por ArrowUp/ArrowDown, fecha com clique fora/em um
807
- item/Escape (foco retorna ao toggle). Primeiro componente a seguir a API
808
- JS da seção 20: auto-init via `data-fsarus="dropdown"`, `Clarus.Dropdown`
809
- com `getInstance()`/`.show()`/`.hide()`/`.toggle()`/`.dispose()`, eventos
810
- `clarus:dropdown:shown`/`-hidden`.
811
- - `computePosition()` (`js/core/positioning.js`) ganhou a opção `align`
812
- para o eixo cruzado (usada pelo Dropdown acima), além do `placement`
813
- já existente.
814
- - Componente Tooltip (`scss/components/_tooltips.scss`, `js/tooltip.js`):
815
- `.tooltip`/`.tooltip-inner`/`.tooltip-arrow` com 4 posicionamentos
816
- (top/bottom/left/right) e novos tokens `--clarus-tooltip-bg`/`-text`
817
- (invertidos no dark mode); show/hide por hover/foco/blur e Escape,
818
- `aria-describedby` ligando referência e tooltip; mesma API JS do
819
- Dropdown (`Clarus.Tooltip`, `data-fsarus="tooltip"`, eventos
820
- `clarus:tooltip:shown`/`-hidden`).
821
- - `js/core/register.js` (`autoInit()`/`createInstanceRegistry()`):
822
- generaliza o padrão de auto-inicialização via `data-fsarus` e registro de
823
- instância (`getInstance()`) para os próximos componentes interativos.
824
- - Componente Modal (`scss/components/_modal.scss`, `js/modal.js`):
825
- `.modal`/`.modal-dialog`/`.modal-content`/`.modal-header`/`.modal-title`/
826
- `.modal-body`/`.modal-footer`, tamanhos `.modal-sm`/`.modal-lg`. Reaproveita
827
- a infraestrutura da Fase 7: `lockScroll()` enquanto aberto,
828
- `createFocusTrap()`, fecha com Escape/clique fora (foco volta ao
829
- gatilho) ou `data-dismiss="modal"`; `data-backdrop="static"` desativa
830
- fechar por Escape/clique fora. Segue a mesma API JS de Dropdown/Tooltip
831
- (`Clarus.Modal`, `data-fsarus="modal"`, eventos
832
- `clarus:modal:shown`/`-hidden`).
833
- - Select customizado (`js/select.js`, `Clarus.Select`): gera a marcação
834
- (`.form-select` + `.dropdown-menu`/`.dropdown-item` por `<option>`) a
835
- partir de um `<select>` nativo (`data-fsarus="select"`, oculto mas
836
- sincronizado para submissão de formulário) e compõe uma instância de
837
- `Dropdown` por cima, reaproveitando posicionamento/navegação/fechamento
838
- da Fase 8 em vez de duplicar essa lógica; dispara `change` nativo e
839
- `clarus:select:changed` ao selecionar. Novo `.form-select`/
840
- `.form-select-sm`/`-lg` em `scss/forms/_forms.scss`.
841
- - Componente Accordion (`scss/components/_accordion.scss`, `js/accordion.js`):
842
- `.accordion`/`.accordion-item`/`.accordion-header`/`.accordion-button`/
843
- `.accordion-collapse`/`.accordion-body`. Reaproveita `collapse()`/
844
- `expand()` de `Clarus.core` (Fase 7) para animar a altura de cada painel;
845
- só um painel aberto por vez por padrão (`data-multiple="true"` permite
846
- vários); segue a API JS da seção 20 (`Clarus.Accordion`,
847
- `data-fsarus="accordion"`, eventos `clarus:accordion:shown`/`-hidden`).
848
- - Componente Tabs (`scss/components/_tabs.scss`, `js/tabs.js`):
849
- `.tabs`/`.tab-content`/`.tab-pane`, reaproveitando `.nav-link` (Navbar,
850
- Fase 4) com indicador de sublinhado escopado a `.tabs`. Navegação por
851
- ArrowLeft/ArrowRight/Home/End (`role="tablist"`/`"tab"`/`"tabpanel"`,
852
- `aria-selected`, `tabindex` roving), disparando `clarus:tab:changed`
853
- (`Clarus.Tabs`, `data-fsarus="tabs"`).
854
- - Componente Toast (`scss/components/_toasts.scss`, `js/toast.js`):
855
- `.toast-container`/`.toast`/`.toast-header`/`.toast-body`, variantes de
856
- cor de estado (`.toast-#{nome}`, reaproveitando os tokens
857
- `--clarus-alert-*-bg`/`-text` da Fase 2). Reaproveita `expand()`/
858
- `collapse()` de `Clarus.core` para mostrar/esconder, com timer de
859
- auto-dismiss configurável (`data-delay`, `data-autohide="false"` para
860
- desativar) e dismiss via `data-dismiss="toast"`; segue a API JS da seção
861
- 20 (`Clarus.Toast`, `data-fsarus="toast"`, eventos
862
- `clarus:toast:shown`/`-hidden`).
863
- - Formulários avançados (`scss/forms/_forms.scss`): estados de validação
864
- `.form-control.is-valid`/`.is-invalid` (borda e anel de foco em
865
- `--clarus-color-success`/`-danger`) com `.valid-feedback`/
866
- `.invalid-feedback` (exibidos via seletor de irmão adjacente, sem
867
- JavaScript); upload de arquivo estilizado `.file-upload`/`.file-input`/
868
- `.file-label` (input nativo ocultado via `clip-path`, mantendo foco e
869
- navegação por teclado), com tamanhos (`.file-label-sm`/`-lg`) e estado
870
- desabilitado.
871
- - Paleta de cores oficial "Indigo autoral" (`docs/definitions.md`, seção
872
- 18.1) em `scss/settings/_colors.scss`: `primary #4F46E5`, `success
873
- #1BC559`, `warning #F0B40E`, `danger #DC263E`, `info #8BA2C4`; escala
874
- neutra completada para 9 degraus cheios (`$color-gray-100` a
875
- `$color-gray-900`).
876
- - Variantes de `primary`/`success`/`warning`/`danger`/`info` para o dark
877
- mode (`scss/themes/_dark.scss`, token `--clarus-color-#{nome}`, via
878
- `color.mix()` com peso por cor em `$dark-color-weights`).
879
- - Tipografia principal Plus Jakarta Sans self-hosted (`docs/definitions.md`,
880
- seção 18.2): arquivos `.woff2` (licença OFL) em
881
- `assets/fonts/plus-jakarta-sans/`, com `@font-face` em
882
- `scss/base/_typography.scss` no lugar do `@import` do Google Fonts,
883
- cumprindo a meta de dependência externa zero em tempo de execução para a
884
- fonte principal (Source Code Pro, no monoespaçado, mantida via Google
885
- Fonts).
886
-
887
- ### Fixed
888
-
889
- - Duplicidade entre `$color-primary` e `$color-info` (mesmo valor de azul)
890
- em `scss/settings/_colors.scss`, corrigida pela nova paleta "Indigo
891
- autoral".
892
- - `.dropdown-menu` sem `position: absolute` no CSS base (só era aplicado
893
- via JS no `show()`): a medição de largura acontecia com o menu ainda como
894
- bloco normal (ocupando a largura inteira do `body`), quebrando o cálculo
895
- de alinhamento `start`/`end`. Corrigido em
896
- `scss/components/_dropdown.scss`.
897
- - Texto solto (`<h2>`/`<p>` sem cor própria) invisível no painel escuro de
898
- vários mockups (`badges-alerts.html`, `buttons.html`, `forms-advanced.html`,
899
- `dropdown-tooltip.html`): `[data-theme="dark"].theme-panel` só definia
900
- `background-color`, nunca `color` — o texto herdava o valor já resolvido
901
- de `color` do `body` (calculado no tema claro), que não é reavaliado só
902
- por redefinir a custom property num elemento descendente.
903
- - Tooltip/Dropdown não invertiam para o tema escuro quando o elemento de
904
- referência estava dentro de um wrapper com `data-theme="dark"` (em vez de
905
- no `<html>`): como `js/tooltip.js`/`js/dropdown.js` reanexam o elemento
906
- flutuante a `document.body`, ele saía do escopo do wrapper e sempre usava
907
- os tokens do tema claro. Agora ambos copiam o `data-theme` do ancestral
908
- mais próximo do elemento de referência/toggle para o elemento flutuante a
909
- cada `show()`.
910
- - `.btn-close` (`scss/components/_buttons.scss`): o "×" (glifo `\00d7`)
911
- centralizado por flexbox não ficava opticamente centrado no botão, por
912
- depender da métrica vertical do glifo na fonte. Substituído por duas
913
- barras via `::before`/`::after`, giradas ±45° e centralizadas por
914
- `transform: translate(-50%, -50%)` a partir do centro absoluto do
915
- botão — centralização exata, independente de fonte.
916
-
917
- ## [0.1.1] - 2026-07-01
918
-
919
- ### Added
920
-
921
- - Definições iniciais do projeto (`docs/definitions.md`) e arquitetura SCSS
922
- (`docs/scss-architecture.md`).
923
- - Estrutura modular `scss/` (settings, tools, tokens, base, layout, forms,
924
- components, utilities, themes).
925
- - Sistema de layout: containers, grid de 12 colunas baseado em Flexbox
926
- (`.row`/`.col-*`) e utilitários responsivos por breakpoint.
927
- - Pipeline de build: Sass + PostCSS (Autoprefixer) + esbuild, gerando `dist/css`
928
- (`layout`, `forms`, `components`, `helpers`, `clarus`) e `dist/js/clarus.js`,
929
- cada um em versão expandida e minificada com source maps.
930
- - Lint de SCSS via stylelint.
931
- - CI no GitHub Actions (lint + build).
932
- - Utilitários de tipografia (`text-*`, `fw-*`, `fs-*`, `font-*`) em
933
- `scss/utilities/_typography.scss`.
934
- - Estado `:read-only` em `.form-control`.
935
-
936
- [Unreleased]: https://github.com/jorgewreis/clarus-css/compare/v0.3.0...HEAD
937
- [0.3.0]: https://github.com/jorgewreis/clarus-css/compare/v0.2.0...v0.3.0
938
- [0.2.0]: https://github.com/jorgewreis/clarus-css/compare/v0.1.2...v0.2.0
939
- [0.1.2]: https://github.com/jorgewreis/clarus-css/compare/v0.1.1...v0.1.2
940
- [0.1.1]: https://github.com/jorgewreis/clarus-css/releases/tag/v0.1.1