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