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.
- package/package.json +17 -15
- package/CHANGELOG.md +0 -940
- package/dist/css/components.css.map +0 -1
- package/dist/css/components.min.css.map +0 -1
- package/dist/css/fokus-components.css.map +0 -1
- package/dist/css/fokus-components.min.css.map +0 -1
- package/dist/css/fokus-core.css.map +0 -1
- package/dist/css/fokus-core.min.css.map +0 -1
- package/dist/css/fokus-dark.css.map +0 -1
- package/dist/css/fokus-dark.min.css.map +0 -1
- package/dist/css/fokus-rtl.css.map +0 -1
- package/dist/css/fokus-rtl.min.css.map +0 -1
- package/dist/css/fokus-utilities.css.map +0 -1
- package/dist/css/fokus-utilities.min.css.map +0 -1
- package/dist/css/fokus.css.map +0 -1
- package/dist/css/fokus.min.css.map +0 -1
- package/dist/css/fonts.css.map +0 -1
- package/dist/css/fonts.min.css.map +0 -1
- package/dist/css/forms.css.map +0 -1
- package/dist/css/forms.min.css.map +0 -1
- package/dist/css/helpers.css.map +0 -1
- package/dist/css/helpers.min.css.map +0 -1
- package/dist/css/layout.css.map +0 -1
- package/dist/css/layout.min.css.map +0 -1
- package/dist/js/fokus.js.map +0 -7
- package/dist/js/fokus.min.js.map +0 -7
- package/docs/README.md +0 -86
- package/docs/comparison.md +0 -124
- package/docs/components/accordion.md +0 -104
- package/docs/components/alert-dialog.md +0 -99
- package/docs/components/alert.md +0 -104
- package/docs/components/avatar.md +0 -13
- package/docs/components/badge.md +0 -101
- package/docs/components/breadcrumb.md +0 -93
- package/docs/components/button-group.md +0 -13
- package/docs/components/button.md +0 -98
- package/docs/components/card.md +0 -111
- package/docs/components/carousel.md +0 -167
- package/docs/components/checkbox.md +0 -110
- package/docs/components/close-button.md +0 -13
- package/docs/components/code.md +0 -13
- package/docs/components/collapse.md +0 -78
- package/docs/components/combobox.md +0 -123
- package/docs/components/command-palette.md +0 -131
- package/docs/components/datatable.md +0 -173
- package/docs/components/datepicker.md +0 -137
- package/docs/components/divider.md +0 -57
- package/docs/components/dropdown.md +0 -103
- package/docs/components/empty-state.md +0 -65
- package/docs/components/file-upload-advanced.md +0 -116
- package/docs/components/file-upload.md +0 -93
- package/docs/components/icon-link.md +0 -13
- package/docs/components/input-group.md +0 -73
- package/docs/components/input.md +0 -90
- package/docs/components/list-group.md +0 -13
- package/docs/components/modal.md +0 -120
- package/docs/components/navbar.md +0 -74
- package/docs/components/nested-menu.md +0 -90
- package/docs/components/notification-center.md +0 -116
- package/docs/components/offcanvas.md +0 -102
- package/docs/components/pagination.md +0 -145
- package/docs/components/placeholder.md +0 -13
- package/docs/components/popover.md +0 -118
- package/docs/components/progress.md +0 -126
- package/docs/components/radio.md +0 -80
- package/docs/components/range.md +0 -83
- package/docs/components/rating.md +0 -91
- package/docs/components/ratio.md +0 -13
- package/docs/components/responsive.md +0 -19
- package/docs/components/scrollspy.md +0 -13
- package/docs/components/segmented-control.md +0 -82
- package/docs/components/select.md +0 -89
- package/docs/components/skeleton.md +0 -70
- package/docs/components/stepper.md +0 -107
- package/docs/components/switch.md +0 -97
- package/docs/components/table.md +0 -90
- package/docs/components/tabs.md +0 -104
- package/docs/components/tag.md +0 -144
- package/docs/components/tile.md +0 -112
- package/docs/components/timeline.md +0 -78
- package/docs/components/toast.md +0 -108
- package/docs/components/tooltip.md +0 -113
- package/docs/components/tree-view.md +0 -118
- package/docs/contributing/contributing.md +0 -18
- package/docs/getting-started/installation.md +0 -70
- package/docs/getting-started/usage.md +0 -105
- package/docs/guides/accessibility.md +0 -109
- package/docs/guides/charts.md +0 -73
- package/docs/guides/dark-mode.md +0 -90
- package/docs/guides/icons.md +0 -99
- package/docs/guides/javascript-api.md +0 -9
- package/docs/guides/layout-advanced.md +0 -118
- package/docs/guides/migration-clarus-to-fokus.md +0 -48
- package/docs/guides/migration-external.md +0 -123
- package/docs/guides/migration-v1.md +0 -63
- package/docs/guides/print.md +0 -30
- package/docs/guides/rtl-and-system-preferences.md +0 -28
- package/docs/guides/theming.md +0 -140
- package/docs/guides/utility-api.md +0 -9
- package/docs/prompts/prompt-plan.md +0 -45
- package/docs/reference/accessibility-matrix.md +0 -77
- package/docs/reference/browser-support.md +0 -75
- package/docs/reference/contrast-report.md +0 -54
- package/docs/reference/definitions.md +0 -868
- package/docs/reference/design-tokens.md +0 -208
- package/docs/reference/scss-architecture.md +0 -227
- package/docs/reference/size-baseline.json +0 -34
- package/docs/reference/stability.md +0 -89
- package/docs/showcase.md +0 -25
- package/mockup/README.md +0 -41
- package/mockup/assets/carousel-planning.png +0 -0
- package/mockup/assets/carousel-workspace.png +0 -0
- package/mockup/assets/example-theme.css +0 -19
- package/mockup/assets/example-theme.js +0 -11
- package/mockup/assets/showcase-contracts.js +0 -84
- package/mockup/assets/showcase.css +0 -91
- package/mockup/assets/showcase.js +0 -724
- package/mockup/content-data.html +0 -9
- package/mockup/examples/accordion-tabs-toast.html +0 -149
- package/mockup/examples/alert-dialog.html +0 -84
- package/mockup/examples/alerts.html +0 -115
- package/mockup/examples/badges-alerts.html +0 -109
- package/mockup/examples/buttons.html +0 -58
- package/mockup/examples/cards.html +0 -132
- package/mockup/examples/carousel.html +0 -126
- package/mockup/examples/charts.html +0 -102
- package/mockup/examples/check-radio-switch.html +0 -620
- package/mockup/examples/collapse.html +0 -69
- package/mockup/examples/combobox.html +0 -60
- package/mockup/examples/command-palette.html +0 -64
- package/mockup/examples/datatable.html +0 -113
- package/mockup/examples/datepicker.html +0 -62
- package/mockup/examples/divider.html +0 -45
- package/mockup/examples/dropdown-tooltip.html +0 -77
- package/mockup/examples/empty-state.html +0 -56
- package/mockup/examples/file-drop.html +0 -74
- package/mockup/examples/file-upload-advanced.html +0 -68
- package/mockup/examples/forms-advanced.html +0 -77
- package/mockup/examples/hover-card.html +0 -86
- package/mockup/examples/icons.html +0 -157
- package/mockup/examples/input-group.html +0 -74
- package/mockup/examples/js-foundation.html +0 -215
- package/mockup/examples/layout.html +0 -134
- package/mockup/examples/modal-select.html +0 -127
- package/mockup/examples/nested-menu.html +0 -73
- package/mockup/examples/notification-center.html +0 -86
- package/mockup/examples/offcanvas-popover.html +0 -133
- package/mockup/examples/pagination-breadcrumbs.html +0 -92
- package/mockup/examples/popover.html +0 -81
- package/mockup/examples/range.html +0 -69
- package/mockup/examples/rating.html +0 -103
- package/mockup/examples/segmented-control.html +0 -96
- package/mockup/examples/skeletons.html +0 -82
- package/mockup/examples/spinner-progress.html +0 -130
- package/mockup/examples/stepper.html +0 -119
- package/mockup/examples/tables-navbar.html +0 -89
- package/mockup/examples/tag.html +0 -115
- package/mockup/examples/theming.html +0 -68
- package/mockup/examples/tile.html +0 -107
- package/mockup/examples/timeline.html +0 -108
- package/mockup/examples/toast.html +0 -113
- package/mockup/examples/tooltip.html +0 -68
- package/mockup/examples/tree-view.html +0 -68
- package/mockup/feedback-actions.html +0 -9
- package/mockup/forms.html +0 -13
- package/mockup/foundations.html +0 -7
- package/mockup/kitchen-sink.html +0 -696
- package/mockup/navigation-disclosure.html +0 -11
- package/mockup/overlays-commands.html +0 -12
- package/mockup/templates/README.md +0 -20
- package/mockup/templates/admin.html +0 -334
- package/mockup/templates/auth.html +0 -234
- package/mockup/templates/dashboard.html +0 -442
- package/mockup/templates/landing.html +0 -397
- package/packages/fokus-icons/package.json +0 -46
- package/scripts/migrate-fokus-map.json +0 -1366
- 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
|