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.
- package/dist/css/components.css +561 -83
- package/dist/css/components.min.css +1 -1
- package/dist/css/fokus-components.css +561 -83
- package/dist/css/fokus-components.min.css +1 -1
- package/dist/css/fokus-rtl.css +697 -83
- package/dist/css/fokus-rtl.min.css +1 -1
- package/dist/css/fokus-utilities.css +136 -0
- package/dist/css/fokus-utilities.min.css +1 -1
- package/dist/css/fokus.css +996 -258
- package/dist/css/fokus.min.css +1 -1
- package/dist/css/forms.css +300 -176
- package/dist/css/forms.min.css +1 -1
- package/dist/css/helpers.css +136 -0
- package/dist/css/helpers.min.css +1 -1
- package/dist/js/fokus.js +270 -25
- package/dist/js/fokus.min.js +18 -18
- package/package.json +17 -15
- package/packages/fokus-components/scss/components/_alerts.scss +128 -6
- package/packages/fokus-components/scss/components/_badges.scss +26 -10
- package/packages/fokus-components/scss/components/_index.scss +1 -0
- package/packages/fokus-components/scss/components/_popover.scss +131 -21
- package/packages/fokus-components/scss/components/_responsive.scss +23 -0
- package/packages/fokus-components/scss/components/_tag.scss +37 -14
- package/packages/fokus-components/scss/components/_toasts.scss +156 -11
- package/packages/fokus-components/scss/components/_tooltips.scss +70 -18
- package/packages/fokus-components/scss/forms/_check-radio-switch.scss +313 -215
- package/packages/fokus-components/scss/forms/_forms.scss +16 -0
- package/packages/fokus-js/js/carousel.d.ts +4 -0
- package/packages/fokus-js/js/carousel.js +8 -0
- package/packages/fokus-js/js/core/positioning.js +18 -9
- package/packages/fokus-js/js/dropdown.d.ts +4 -0
- package/packages/fokus-js/js/dropdown.js +7 -0
- package/packages/fokus-js/js/popover.js +26 -1
- package/packages/fokus-js/js/tabs.d.ts +3 -0
- package/packages/fokus-js/js/tabs.js +5 -0
- package/packages/fokus-js/js/tag.js +17 -0
- package/packages/fokus-js/js/toast.js +77 -3
- package/packages/fokus-js/js/tooltip.d.ts +8 -1
- package/packages/fokus-js/js/tooltip.js +106 -13
- package/packages/fokus-utilities/scss/utilities/_api.scss +48 -0
- package/CHANGELOG.md +0 -910
- 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 -59
- package/docs/components/avatar.md +0 -13
- package/docs/components/badge.md +0 -82
- 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 -97
- 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 -105
- package/docs/components/progress.md +0 -126
- package/docs/components/radio.md +0 -70
- package/docs/components/range.md +0 -83
- package/docs/components/rating.md +0 -91
- package/docs/components/ratio.md +0 -13
- 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 -75
- package/docs/components/table.md +0 -90
- package/docs/components/tabs.md +0 -104
- package/docs/components/tag.md +0 -129
- package/docs/components/tile.md +0 -112
- package/docs/components/timeline.md +0 -78
- package/docs/components/toast.md +0 -95
- package/docs/components/tooltip.md +0 -77
- 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 -102
- 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 -50
- package/docs/reference/definitions.md +0 -864
- package/docs/reference/design-tokens.md +0 -194
- 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 -8
- 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 -41
- package/mockup/examples/badges-alerts.html +0 -77
- 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 -144
- 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/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 -105
- package/mockup/examples/theming.html +0 -68
- package/mockup/examples/tile.html +0 -107
- package/mockup/examples/timeline.html +0 -108
- 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
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
# Guia de migração para v1.0.0
|
|
2
|
-
|
|
3
|
-
A v1.0.0 renomeia mecanicamente toda a API pública do Fokus Styles para evitar
|
|
4
|
-
colisão com classes de terceiros na mesma página. É a única mudança
|
|
5
|
-
breaking desta versão — nenhum componente foi removido ou teve
|
|
6
|
-
comportamento alterado.
|
|
7
|
-
|
|
8
|
-
Não mudam: o global `window.FokusStyles` e o nome do pacote npm `fokus-styles`.
|
|
9
|
-
|
|
10
|
-
## O que muda
|
|
11
|
-
|
|
12
|
-
| Categoria | Antes | Depois | Exemplo |
|
|
13
|
-
|---|---|---|---|
|
|
14
|
-
| Classe de componente/layout | sem prefixo | `fs-` | `.btn` → `.fs-btn`, `.dropdown-menu` → `.fs-dropdown-menu`, `.container`/`.row`/`.col-*` → `.fs-container`/`.fs-row`/`.fs-col-*` |
|
|
15
|
-
| Classe utilitária | sem prefixo | `fs-u-` | `.d-flex` → `.fs-u-d-flex`, `.mt-3` → `.fs-u-mt-3` |
|
|
16
|
-
| Estado controlado por JS | variava | `is-*` | `.show` → `.is-open`, `.active` → `.is-active`, `.disabled` → `.is-disabled` |
|
|
17
|
-
| Tokens CSS | `--fokus-*` | `--fs-*` | `--fokus-color-primary` → `--fs-color-primary` |
|
|
18
|
-
| Atributo de auto-init | `data-fokus` | `data-fs` | `data-fokus="modal"` → `data-fs="modal"` |
|
|
19
|
-
| Atributos de alvo/dispensa | `data-target`/`data-dismiss` | `data-fs-target`/`data-fs-dismiss` | `data-target="#foo"` → `data-fs-target="#foo"` |
|
|
20
|
-
| Eventos DOM customizados | `fokus:*` | `fs:*` | `fokus:modal:shown` → `fs:modal:shown` |
|
|
21
|
-
|
|
22
|
-
`.is-valid`/`.is-invalid` (validação de formulário) e `.is-dragover`
|
|
23
|
-
(file-drop) já seguiam a convenção `is-*` antes da v1 — não mudam.
|
|
24
|
-
|
|
25
|
-
## Rodando o codemod
|
|
26
|
-
|
|
27
|
-
O pacote inclui um codemod que aplica essas substituições em arquivos
|
|
28
|
-
HTML/JS (`class="..."`, `data-fokus`/`data-target`/`data-dismiss`, tokens
|
|
29
|
-
`--fokus-*` em `<style>`/JS, e strings de evento `fokus:*`):
|
|
30
|
-
|
|
31
|
-
```bash
|
|
32
|
-
node node_modules/fokus-styles/scripts/migrate-v1.mjs caminho/para/seu/projeto --dry-run
|
|
33
|
-
node node_modules/fokus-styles/scripts/migrate-v1.mjs caminho/para/seu/projeto
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
- `--dry-run` só lista os arquivos que seriam alterados, sem escrever nada.
|
|
37
|
-
- Sem `--dry-run`, sobrescreve os arquivos in-place — rode com o working
|
|
38
|
-
tree do seu projeto limpo (git) para poder revisar o diff depois.
|
|
39
|
-
- A substituição de classes é por correspondência **exata de token**: o
|
|
40
|
-
codemod só troca tokens que batem com um nome antigo conhecido do FokusStyles
|
|
41
|
-
(`scripts/migrate-v1-map.json`, ~1360 pares gerados diretamente da
|
|
42
|
-
renomeação). Uma classe sua com o mesmo nome de uma classe antiga do
|
|
43
|
-
FokusStyles (ex.: você também tinha uma `.card` própria) seria trocada por
|
|
44
|
-
engano — **revise o diff antes de commitar**.
|
|
45
|
-
- O codemod não cobre CSS que você escreveu contra o seletor antigo (ex.:
|
|
46
|
-
`.btn { ... }` no seu próprio stylesheet, sobrescrevendo o FokusStyles) — isso
|
|
47
|
-
precisa de ajuste manual, com a tabela acima como referência.
|
|
48
|
-
|
|
49
|
-
## Checklist de migração manual
|
|
50
|
-
|
|
51
|
-
1. Rode o codemod (acima) na sua base HTML/JS.
|
|
52
|
-
2. Busque no seu CSS por seletores que dependam das classes antigas do
|
|
53
|
-
FokusStyles (não só sobre elas, mas herdando de `--fokus-*`) e atualize para
|
|
54
|
-
os novos nomes/tokens.
|
|
55
|
-
3. Se você escuta os eventos customizados do FokusStyles
|
|
56
|
-
(`addEventListener("fokus:...")`), confirme que o codemod pegou todas as
|
|
57
|
-
strings — ele só reescreve literais entre aspas.
|
|
58
|
-
4. Rode sua suíte de testes/visual regression e confira manualmente os
|
|
59
|
-
componentes interativos (modal, dropdown, tabs, offcanvas) — o
|
|
60
|
-
comportamento não muda, só os seletores.
|
|
61
|
-
5. Se você customizava o framework via `--fokus-*` num stylesheet próprio
|
|
62
|
-
(não gerado pelo codemod, por não estar em HTML/JS), atualize esses
|
|
63
|
-
arquivos `.css` manualmente para `--fs-*`.
|
package/docs/guides/print.md
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
# Utilitários de impressão
|
|
2
|
-
|
|
3
|
-
Classes para ajustar o layout quando a página é impressa (`@media print`),
|
|
4
|
-
sem exigir uma folha de estilos de impressão separada.
|
|
5
|
-
|
|
6
|
-
## Classes
|
|
7
|
-
|
|
8
|
-
- `.fs-u-print-hide` — oculta o elemento só na impressão (`display: none`).
|
|
9
|
-
Útil para navbars, botões de ação, sidebars de navegação.
|
|
10
|
-
- `.fs-u-print-only` — oculta o elemento fora da impressão; ele só aparece no
|
|
11
|
-
resultado impresso (ex.: um bloco com URL/data de geração do documento).
|
|
12
|
-
- `.fs-u-print-block` / `.fs-u-print-inline` / `.fs-u-print-inline-block` — força um
|
|
13
|
-
valor de `display` só na impressão, útil para reverter um `.fs-u-d-none` (ou
|
|
14
|
-
outro `display` aplicado na tela) especificamente no documento impresso.
|
|
15
|
-
|
|
16
|
-
```html
|
|
17
|
-
<header class="fs-u-print-hide">
|
|
18
|
-
<nav>…</nav>
|
|
19
|
-
</header>
|
|
20
|
-
|
|
21
|
-
<div class="fs-u-print-only">Gerado em fokus-styles.dev — 2026-07-07</div>
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
## Notas
|
|
25
|
-
|
|
26
|
-
- São utilitários de `display`, não uma folha de estilos de impressão
|
|
27
|
-
completa — não alteram cor, quebra de página ou tamanho de fonte.
|
|
28
|
-
- Combinam com os demais utilitários de `display` (`.fs-u-d-*`): a classe de
|
|
29
|
-
impressão só atua dentro de `@media print`, então não conflita com o
|
|
30
|
-
valor aplicado na tela.
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
# RTL e preferências do sistema
|
|
2
|
-
|
|
3
|
-
## Visão geral
|
|
4
|
-
|
|
5
|
-
O Fokus Styles 2.4 mantém os componentes em fluxo lógico e oferece o preset
|
|
6
|
-
`fokus-styles/rtl.css` para documentos com `dir="rtl"`. O preset complementa
|
|
7
|
-
a folha principal e preserva `margin-inline`, `padding-inline`, `inset-inline`
|
|
8
|
-
e `border-inline-*`.
|
|
9
|
-
|
|
10
|
-
```html
|
|
11
|
-
<html dir="rtl" data-fs-theme="auto">
|
|
12
|
-
<link rel="stylesheet" href="fokus-styles/dist/css/fokus.css">
|
|
13
|
-
<link rel="stylesheet" href="fokus-styles/dist/css/fokus-rtl.css">
|
|
14
|
-
</html>
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
## Estados de sistema
|
|
18
|
-
|
|
19
|
-
O framework respeita `prefers-reduced-motion`, `prefers-contrast: more`,
|
|
20
|
-
`forced-colors: active` e `prefers-color-scheme`. Em alto contraste, bordas e
|
|
21
|
-
foco passam a usar espessuras maiores; em forced colors, ações preservam
|
|
22
|
-
`ButtonText` e o foco usa `Highlight`.
|
|
23
|
-
|
|
24
|
-
## A11y
|
|
25
|
-
|
|
26
|
-
O atributo `dir` deve ser aplicado ao documento ou ao contêiner que define o
|
|
27
|
-
fluxo de leitura. Use `dir="auto"` quando a direção do texto inserido não for
|
|
28
|
-
conhecida.
|
package/docs/guides/theming.md
DELETED
|
@@ -1,140 +0,0 @@
|
|
|
1
|
-
# Theming
|
|
2
|
-
|
|
3
|
-
Toda a identidade visual do Fokus Styles é exposta via CSS Custom Properties
|
|
4
|
-
(prefixo `--fs-*`) — customize redefinindo a variável no seu próprio CSS,
|
|
5
|
-
sem fork e sem recompilar.
|
|
6
|
-
|
|
7
|
-
## As 3 camadas de tokens
|
|
8
|
-
|
|
9
|
-
1. **Primitivo** — valores Sass em tempo de compilação
|
|
10
|
-
(`packages/fokus-core/scss/settings/`): `$color-blue-500`, `$radius-md`,
|
|
11
|
-
`$spacers`. Não são emitidos como CSS diretamente; só existem para gerar
|
|
12
|
-
as camadas seguintes.
|
|
13
|
-
2. **Semântico** — CSS Custom Properties nomeadas por papel, não por valor
|
|
14
|
-
(`packages/fokus-core/scss/tokens/`): `--fs-color-primary`,
|
|
15
|
-
`--fs-color-bg-surface`, `--fs-color-text-primary`,
|
|
16
|
-
`--fs-color-border-default`. É aqui que você customiza na prática.
|
|
17
|
-
3. **Componente** — alguns componentes expõem tokens próprios, com fallback
|
|
18
|
-
pra um token semântico (ex.: `.fs-btn` tem `--fs-btn-bg`/`--fs-btn-color`/
|
|
19
|
-
`--fs-btn-border-color`) — permite sobrescrever **uma instância**
|
|
20
|
-
específica sem afetar o resto:
|
|
21
|
-
|
|
22
|
-
```css
|
|
23
|
-
.meu-botao-especial {
|
|
24
|
-
--fs-btn-bg: #6d28d9;
|
|
25
|
-
}
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
Ver [`docs/reference/design-tokens.md`](../reference/design-tokens.md) para
|
|
29
|
-
a lista completa de tokens e [`docs/reference/scss-architecture.md`](../reference/scss-architecture.md)
|
|
30
|
-
para como as camadas se organizam em `@layer`.
|
|
31
|
-
|
|
32
|
-
## Customizando globalmente
|
|
33
|
-
|
|
34
|
-
Redefina o token semântico em `:root` (afeta todos os componentes que o
|
|
35
|
-
usam):
|
|
36
|
-
|
|
37
|
-
```css
|
|
38
|
-
:root {
|
|
39
|
-
--fs-color-primary: #6d28d9;
|
|
40
|
-
--fs-radius-md: 10px;
|
|
41
|
-
--fs-font-sans: "Inter", sans-serif;
|
|
42
|
-
}
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
Isso funciona em runtime, direto no CSS final — não precisa recompilar o
|
|
46
|
-
Sass nem ter acesso ao código-fonte do framework.
|
|
47
|
-
|
|
48
|
-
## Cores: OKLCH com fallback automático
|
|
49
|
-
|
|
50
|
-
Os primitivos de cor são gerados em [OKLCH](https://oklch.com/), calibrados
|
|
51
|
-
para reproduzir o mesmo matiz do hex histórico do projeto (round-trip
|
|
52
|
-
hex→oklch→hex). Cada token de cor é declarado duas vezes:
|
|
53
|
-
|
|
54
|
-
```css
|
|
55
|
-
:root {
|
|
56
|
-
--fs-color-primary: #1a61e6; /* fallback sRGB, todo navegador */
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
@supports (color: oklch(0% 0 0)) {
|
|
60
|
-
:root {
|
|
61
|
-
--fs-color-primary: oklch(53.6% 0.213 261.6deg); /* nativo, navegadores modernos */
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
Navegadores sem suporte a `oklch()` ignoram o bloco `@supports` inteiro e
|
|
67
|
-
ficam só com o fallback — sem quebra, sem polyfill. Se você **também**
|
|
68
|
-
customiza uma cor em OKLCH, recomenda-se o mesmo padrão de dois valores
|
|
69
|
-
(fallback + `@supports`) pelo mesmo motivo. Ver
|
|
70
|
-
[`docs/reference/browser-support.md`](../reference/browser-support.md).
|
|
71
|
-
|
|
72
|
-
## Customizando via Sass
|
|
73
|
-
|
|
74
|
-
Para quem compila o próprio bundle (em vez de sobrescrever CSS em runtime),
|
|
75
|
-
os valores primitivos aceitam override na hora do `@use`:
|
|
76
|
-
|
|
77
|
-
```scss
|
|
78
|
-
@use "fokus-styles/scss/fokus" with (
|
|
79
|
-
$radius-md: 10px,
|
|
80
|
-
$font-family-sans: "Inter", sans-serif
|
|
81
|
-
);
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
Qualquer variável marcada `!default` nos arquivos de
|
|
85
|
-
`packages/fokus-core/scss/settings/` pode ser sobrescrita dessa forma.
|
|
86
|
-
|
|
87
|
-
## Escala de espaçamento e breakpoints
|
|
88
|
-
|
|
89
|
-
`$spacers` (0–5, usado pelos utilitários `.fs-u-m*`/`.fs-u-p*`/`.fs-u-g*`) e
|
|
90
|
-
`$breakpoints` (`xs`–`xxxl`, usado pelo grid e por todo utilitário
|
|
91
|
-
responsivo `.fs-u-*-{breakpoint}`) também são customizáveis via Sass — não têm
|
|
92
|
-
equivalente em CSS Custom Property, porque alimentam a geração de classes
|
|
93
|
-
(nomes de classe fixos em `.css`, não podem reagir a uma variável em
|
|
94
|
-
runtime). Ver [`docs/reference/design-tokens.md`](../reference/design-tokens.md).
|
|
95
|
-
|
|
96
|
-
## Multi-brand
|
|
97
|
-
|
|
98
|
-
Além de `data-theme` (claro/escuro), o FokusStyles suporta `data-fs-brand="x"` para
|
|
99
|
-
trocar a **cor de ação primária** em runtime, sem recompilar CSS — útil pra
|
|
100
|
-
produtos white-label ou múltiplas marcas sobre o mesmo design system:
|
|
101
|
-
|
|
102
|
-
```html
|
|
103
|
-
<html data-fs-brand="violet">
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
```html
|
|
107
|
-
<html data-fs-brand="violet" data-theme="dark">
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
Três presets vêm prontos em `packages/fokus-core/scss/themes/_brands.scss`,
|
|
111
|
-
provando que a troca funciona combinada com claro e escuro:
|
|
112
|
-
|
|
113
|
-
- `violet` — o mesmo tom do exemplo de customização acima.
|
|
114
|
-
- `corporate` — azul-marinho sóbrio, para aplicações internas/B2B.
|
|
115
|
-
- `vibrant` — laranja energético, para produtos de consumo/marketing.
|
|
116
|
-
|
|
117
|
-
Só a cor de ação primária muda por marca — `secondary`/`success`/`warning`/
|
|
118
|
-
`danger`/`info` continuam universais entre marcas, porque são semânticos
|
|
119
|
-
(sucesso é sempre verde, erro sempre vermelho, independente de qual marca
|
|
120
|
-
está ativa).
|
|
121
|
-
|
|
122
|
-
Pra adicionar sua própria marca, siga o mesmo padrão do arquivo de exemplo:
|
|
123
|
-
um bloco `[data-fs-brand="sua-marca"]` (mais o par `@supports` OKLCH e a
|
|
124
|
-
combinação com `[data-theme="dark"]`) redefinindo `--fs-color-primary`,
|
|
125
|
-
`--fs-alert-primary-bg`, `--fs-alert-primary-text` e
|
|
126
|
-
`--fs-feedback-primary-bg`.
|
|
127
|
-
|
|
128
|
-
**Limitação conhecida:** `.fs-btn-primary`/`.fs-badge-primary` (preenchimento
|
|
129
|
-
sólido) calculam a cor do texto em tempo de build via `color-contrast()` a
|
|
130
|
-
partir do primary **padrão** (azul) — não recalculam por marca. Escolha um
|
|
131
|
-
primitivo de marca escuro o bastante pro texto branco continuar legível
|
|
132
|
-
(como no exemplo `violet`), ou sobrescreva `--fs-btn-color`/`--fs-badge-color`
|
|
133
|
-
manualmente se o primitivo da sua marca for muito claro. Rode
|
|
134
|
-
`npm run contrast` depois de adicionar uma marca — o relatório já audita os
|
|
135
|
-
pares `brand violet`/`brand corporate`/`brand vibrant` como referência
|
|
136
|
-
(`scripts/contrast-report.scss`).
|
|
137
|
-
|
|
138
|
-
## Próximo passo
|
|
139
|
-
|
|
140
|
-
[Dark mode](dark-mode.md) — como o tema escuro usa a mesma camada de tokens.
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
# Utility API e configuração Sass
|
|
2
|
-
|
|
3
|
-
O Fokus Styles oferece presets públicos em `fokus-styles/core`, `fokus-styles/components`,
|
|
4
|
-
`fokus-styles/utilities` e `fokus-styles/themes`. O arquivo `fokus-styles/config` expõe o
|
|
5
|
-
mapa `$fs-config` para entradas Sass customizadas.
|
|
6
|
-
|
|
7
|
-
O mixin `fs-fluid-type()` usa `clamp()` para escalar valores entre dois limites sem exigir
|
|
8
|
-
JavaScript. Classes utilitárias novas seguem o namespace `fs-u-*` e as classes existentes
|
|
9
|
-
continuam válidas dentro da linha 2.x.
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
# Prompt para planejar refinamentos de um componente
|
|
2
|
-
|
|
3
|
-
Copie o texto abaixo e substitua os campos entre colchetes antes de usar.
|
|
4
|
-
|
|
5
|
-
```text
|
|
6
|
-
Atue como responsável pelo planejamento técnico e de design do Fokus Styles.
|
|
7
|
-
|
|
8
|
-
Quero criar um plano, sem implementar ainda, para o componente **[NOME DO COMPONENTE]**.
|
|
9
|
-
|
|
10
|
-
## Contexto do pedido
|
|
11
|
-
|
|
12
|
-
- Objetivo: [REFINAMENTO VISUAL DO COMPONENTE CAROUSEL;
|
|
13
|
-
Sugira correções, alterações e implementações de códigos, funcionalidades de mudanças de visual para algo com maior qualidade e usabilidade]
|
|
14
|
-
|
|
15
|
-
Antes de propor o plano, investigue o repositório e use a documentação como fonte de verdade. Não presuma que o componente está isolado: determine suas dependências, impactos visuais, comportamentais, públicos e de manutenção.
|
|
16
|
-
|
|
17
|
-
Leia, no mínimo, nesta ordem conforme forem aplicáveis:
|
|
18
|
-
|
|
19
|
-
1. `docs/README.md`, para entender o mapa e o contrato editorial da documentação;
|
|
20
|
-
2. a página de documentação do componente em `docs/components/` e as páginas dos componentes relacionados;
|
|
21
|
-
3. `docs/reference/definitions.md` e `docs/reference/stability.md`, para respeitar decisões e escopo já firmados;
|
|
22
|
-
4. `docs/reference/scss-architecture.md` e `docs/reference/design-tokens.md`, para preservar a arquitetura, as cascade layers, convenções e a hierarquia de tokens;
|
|
23
|
-
5. `docs/guides/accessibility.md`, a matriz de acessibilidade e o relatório de contraste quando o trabalho afetar interface, interação ou cores;
|
|
24
|
-
6. `CONTRIBUTING.md`, os mockups, exemplos, testes e o código-fonte efetivamente envolvidos.
|
|
25
|
-
|
|
26
|
-
Localize o SCSS, JavaScript, documentação, laboratórios em `mockup/`, testes unitários, testes visuais e testes de acessibilidade do componente. Consulte também tokens e componentes relacionados quando houver acoplamento, padrões compartilhados ou risco de regressão.
|
|
27
|
-
|
|
28
|
-
Priorize refinamento visual consistente com o sistema: use tokens semânticos e, quando cabível, tokens próprios do componente com fallback; não introduza valores soltos nem `!important`; preserve `@layer`, prefixos `.fs-*`, `.fs-u-*`, `.is-*`, `--fs-*` e as convenções de API. Avalie responsividade, estados padrão/hover/focus-visible/active/disabled/erro, temas claro e escuro, contraste, teclado, ARIA, foco e `prefers-reduced-motion`. Considere SemVer e compatibilidade pública ao sugerir mudanças de classes, atributos, tokens, eventos ou API JavaScript.
|
|
29
|
-
|
|
30
|
-
Se faltarem informações que alterem materialmente o plano, você pode me fazer de **5 a 10 perguntas** antes de finalizá-lo. Para cada pergunta, apresente exatamente **5 alternativas**, incluindo uma alternativa recomendada identificada como **"Recomendada"** e acompanhada de uma explicação mais detalhada do motivo. Não faça perguntas apenas por formalidade: use-as para resolver incertezas reais de objetivo, escopo, prioridade, direção visual, compatibilidade ou critérios de aceite.
|
|
31
|
-
|
|
32
|
-
Depois da investigação — e das minhas respostas, se houver perguntas — entregue um plano implementável, em português, sem modificar arquivos, com:
|
|
33
|
-
|
|
34
|
-
1. **Diagnóstico breve:** estado atual, causa/limitação e oportunidade identificada, citando arquivos e trechos relevantes.
|
|
35
|
-
2. **Decisões e escopo:** o que será feito, o que não será feito e as premissas adotadas.
|
|
36
|
-
3. **Plano passo a passo:** cada passo deve indicar arquivos prováveis, alteração concreta, justificativa, impacto em API/compatibilidade e dependências entre etapas.
|
|
37
|
-
4. **Direção visual e UX:** alterações propostas para hierarquia, espaçamento, tipografia, cor, elevação, responsividade e todos os estados aplicáveis; diferencie correções objetivas de sugestões opcionais.
|
|
38
|
-
5. **Acessibilidade e qualidade:** verificações de foco, teclado, ARIA, contraste, movimento reduzido e possíveis riscos.
|
|
39
|
-
6. **Testes e validação:** comandos e cenários específicos (unitário, build, lint, visual, a11y, contraste, documentação), proporcionais ao impacto.
|
|
40
|
-
7. **Documentação pós-implementação:** liste exatamente quais documentos devem ser corrigidos ou ampliados depois de implementar o plano — incluindo a página do componente, exemplos/mockups, tokens, guias, matriz de acessibilidade, changelog ou migração somente quando necessário — e descreva o conteúdo a atualizar. A implementação não estará concluída enquanto documentação, exemplos e testes afetados não refletirem o comportamento final.
|
|
41
|
-
8. **Riscos, alternativas e sugestões futuras:** riscos de regressão, trade-offs, alternativas descartadas e possíveis evoluções que devem ficar fora deste plano.
|
|
42
|
-
9. **Critérios de aceite:** resultados objetivos e verificáveis para considerar o trabalho concluído.
|
|
43
|
-
|
|
44
|
-
Se o pedido contiver uma implementação nova, primeiro avalie se ela pode ser composta com recursos existentes e se é coerente com a direção de consolidação do projeto. Sinalize explicitamente qualquer necessidade de discussão prévia por contradizer uma decisão documentada ou por representar uma mudança breaking.
|
|
45
|
-
```
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
# Matriz de acessibilidade por componente
|
|
2
|
-
|
|
3
|
-
Resumo rápido do que cada componente cobre em teclado, ARIA e gestão de foco.
|
|
4
|
-
O detalhe completo (com exemplos) está na seção "A11y" da página de cada
|
|
5
|
-
componente em [Componentes](../README.md#componentes); os padrões
|
|
6
|
-
compartilhados entre vários componentes (foco visível, focus trap,
|
|
7
|
-
`prefers-reduced-motion` etc.) estão no [guia de acessibilidade](../guides/accessibility.md).
|
|
8
|
-
|
|
9
|
-
Todo laboratório em `mockup/*.html` roda no gate `npm run test:a11y` em tema
|
|
10
|
-
claro e escuro. As fontes executáveis em `mockup/examples/*.html` também são
|
|
11
|
-
verificadas por axe-core via
|
|
12
|
-
Playwright, regras WCAG 2.1 A/AA) no CI — um componente só é considerado
|
|
13
|
-
"coberto" abaixo se aparecer em algum mockup testado. Contraste de cor é verificado em dois níveis complementares:
|
|
14
|
-
pares de token conhecidos (`npm run contrast`, ver
|
|
15
|
-
[contrast-report.md](contrast-report.md)) e, de forma mais abrangente, texto
|
|
16
|
-
renderizado de fato nos mockups (via o gate axe).
|
|
17
|
-
|
|
18
|
-
| Componente | Teclado | ARIA | Gestão de foco | Contraste AA | Coberto por axe (CI) |
|
|
19
|
-
|---|---|---|---|---|---|
|
|
20
|
-
| [Accordion](../components/accordion.md) | Nativo (`<button>`) | Automático | — | ✓ | Sim |
|
|
21
|
-
| [Alert Dialog](../components/alert-dialog.md) | Herdado do Modal | Herdado do Modal | Focus trap + devolve ao gatilho | ✓ | Sim |
|
|
22
|
-
| [Alert](../components/alert.md) | N/A | Manual (`role="alert"`/`"status"`) | — | ✓ | Sim |
|
|
23
|
-
| [Badge](../components/badge.md) | N/A (decorativo) | N/A | — | ✓ | Sim |
|
|
24
|
-
| [Breadcrumb](../components/breadcrumb.md) | Nativo (links) | Manual (`<nav aria-label>`) | — | ✓ | Sim |
|
|
25
|
-
| [Button](../components/button.md) | Nativo | Manual (`aria-label` em só-ícone) | Foco visível padrão | ✓ | Sim |
|
|
26
|
-
| [Card](../components/card.md) | Nativo (stretched-link) | — | Foco no link real | ✓ | Sim |
|
|
27
|
-
| [Carousel](../components/carousel.md) | Automático (setas/Home/End e arraste) | Automático (`aria-hidden`, `aria-current`, toggle) | Recebe foco no contêiner; autoplay pausável | ✓ | Sim |
|
|
28
|
-
| [Checkbox](../components/checkbox.md) | Nativo | Nativo | — | ✓ | Sim |
|
|
29
|
-
| [Collapse](../components/collapse.md) | Nativo (gatilho) | Automático | — | ✓ | Sim |
|
|
30
|
-
| [Divider](../components/divider.md) | N/A | Implícito (`<hr>`) | — | ✓ | Sim |
|
|
31
|
-
| [Dropdown](../components/dropdown.md) | Automático (setas/Escape) | Automático | Primeiro item ao abrir; devolve ao gatilho | ✓ | Sim |
|
|
32
|
-
| [Empty State](../components/empty-state.md) | N/A | Manual (`aria-live` opcional) | — | ✓ | Sim |
|
|
33
|
-
| [File Upload](../components/file-upload.md) | Nativo | Nativo | — | ✓ | Sim |
|
|
34
|
-
| [Input / Select estático](../components/input.md) | Nativo | Manual (`for`/`id`, `aria-describedby`) | — | ✓ | Sim |
|
|
35
|
-
| [Input Group](../components/input-group.md) | Nativo | Manual (`aria-describedby` no addon) | — | ✓ | Sim |
|
|
36
|
-
| [Modal](../components/modal.md) | Nativo dentro do trap | Automático (`role="dialog"`) | Focus trap; devolve ao gatilho | ✓ | Sim |
|
|
37
|
-
| [Navbar](../components/navbar.md) | Nativo | Manual (`<nav aria-label>`) | — | ✓ | Sim |
|
|
38
|
-
| [Nested Menu](../components/nested-menu.md) | Automático (setas, Escape por nível) | Automático | Move foco entre níveis | ✓ | Sim |
|
|
39
|
-
| [Notification Center](../components/notification-center.md) | Automático (Escape) | Automático | Devolve ao gatilho | ✓ | Sim |
|
|
40
|
-
| [Offcanvas](../components/offcanvas.md) | Nativo dentro do trap | Automático (`role="dialog"`) | Focus trap; devolve ao gatilho | ✓ | Sim |
|
|
41
|
-
| [Pagination](../components/pagination.md) | Nativo (links) | Manual (`<nav aria-label>`, `aria-current`) | — | ✓ | Sim |
|
|
42
|
-
| [Popover](../components/popover.md) | Automático (Escape) | Automático | Devolve ao gatilho | ✓ | Sim |
|
|
43
|
-
| [Spinner / Progress](../components/progress.md) | N/A | Manual (`role`+`aria-label`/`aria-valuenow`) | — | ✓ | Sim |
|
|
44
|
-
| [Radio](../components/radio.md) | Nativo (setas no grupo) | Nativo | — | ✓ | Sim |
|
|
45
|
-
| [Rating](../components/rating.md) | Nativo (setas no grupo) | Manual (`aria-label` por estrela) | — | ✓ | Sim |
|
|
46
|
-
| [Segmented Control](../components/segmented-control.md) | Nativo (setas no grupo) | Nativo | — | ✓ | Sim |
|
|
47
|
-
| [Select (custom)](../components/select.md) | Herdado do Dropdown | Automático (`role="listbox"`) | Herdado do Dropdown | ✓ | Sim |
|
|
48
|
-
| [Skeleton](../components/skeleton.md) | N/A | Manual (`aria-busy` opcional) | — | ✓ | Sim |
|
|
49
|
-
| [Stepper](../components/stepper.md) | Automático (passos clicáveis) | Automático (`aria-current="step"`) | — | ✓ | Sim |
|
|
50
|
-
| [Switch](../components/switch.md) | Nativo | Nativo (+ `aria-label` sem texto visível) | — | ✓ | Sim |
|
|
51
|
-
| [Table](../components/table.md) | Nativo | Manual (`scope`, `<caption>`) | — | ✓ | Sim |
|
|
52
|
-
| [Tabs](../components/tabs.md) | Automático (roving tabindex) | Automático (`role="tab"`/`"tabpanel"`) | — | ✓ | Sim |
|
|
53
|
-
| [Tag](../components/tag.md) | Nativo (botão de fechar) | Manual (`aria-label` descritivo) | — | ✓ | Sim |
|
|
54
|
-
| [Tile](../components/tile.md) | Nativo (link real) | — | Foco no link, não no `::after` | ✓ | Sim |
|
|
55
|
-
| [Timeline](../components/timeline.md) | N/A (sem interação própria) | — | — | ✓ | Sim |
|
|
56
|
-
| [Toast](../components/toast.md) | N/A | Automático (`role="status"`, `aria-live`) | — | ✓ | Sim |
|
|
57
|
-
| [Tooltip](../components/tooltip.md) | Nativo (`focus`/`blur`) | Automático (`aria-describedby`) | — | ✓ | Sim |
|
|
58
|
-
|
|
59
|
-
## Legenda
|
|
60
|
-
|
|
61
|
-
- **Nativo**: comportamento do elemento HTML nativo (`button`, `input`,
|
|
62
|
-
links), sem JS do framework.
|
|
63
|
-
- **Automático**: o JS do FokusStyles aplica/atualiza o atributo ou o
|
|
64
|
-
comportamento de teclado ao inicializar — nada a fazer no HTML.
|
|
65
|
-
- **Manual**: precisa ser adicionado por quem usa o componente (o framework
|
|
66
|
-
não infere texto/contexto).
|
|
67
|
-
- **N/A**: componente não interativo por padrão.
|
|
68
|
-
|
|
69
|
-
## Processo
|
|
70
|
-
|
|
71
|
-
- Toda contribuição de componente novo segue o checklist de acessibilidade
|
|
72
|
-
do [guia de contribuição](../contributing/contributing.md) antes do merge.
|
|
73
|
-
- O gate `npm run test:a11y` roda no CI a cada PR (ver
|
|
74
|
-
[.github/workflows/ci.yml](../../.github/workflows/ci.yml)); uma
|
|
75
|
-
regressão de contraste, nome acessível ou papel ARIA quebra o build.
|
|
76
|
-
- Esta tabela é mantida manualmente — ao adicionar/alterar teclado, ARIA ou
|
|
77
|
-
foco de um componente, atualize a linha correspondente na mesma PR.
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
# Suporte a navegadores
|
|
2
|
-
|
|
3
|
-
O Fokus Styles mira um alvo **moderno com fallback progressivo**: as duas
|
|
4
|
-
últimas versões dos navegadores principais, com piso mínimo garantido em
|
|
5
|
-
**Safari/iOS Safari 16.4**. Não há suporte a Internet Explorer.
|
|
6
|
-
|
|
7
|
-
## Alvo (`.browserslistrc`)
|
|
8
|
-
|
|
9
|
-
```text
|
|
10
|
-
last 2 Chrome versions
|
|
11
|
-
last 2 Edge versions
|
|
12
|
-
last 2 Firefox versions
|
|
13
|
-
Firefox ESR
|
|
14
|
-
last 2 Safari versions
|
|
15
|
-
Safari >= 16.4
|
|
16
|
-
last 2 iOS versions
|
|
17
|
-
iOS >= 16.4
|
|
18
|
-
not dead
|
|
19
|
-
not IE 11
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
Esse alvo alimenta o Autoprefixer no build (`scripts/build.mjs`), então
|
|
23
|
-
prefixos são adicionados automaticamente apenas onde o alvo ainda exige.
|
|
24
|
-
|
|
25
|
-
## Por que Safari 16.4 é o piso
|
|
26
|
-
|
|
27
|
-
É a versão mínima com suporte estável a todos os recursos usados pela base
|
|
28
|
-
do framework — `@layer` (Safari 16.4) e `color-mix()`/OKLCH (Safari 16.4)
|
|
29
|
-
são os dois recursos que fixam esse piso; sem eles, o piso seria mais baixo.
|
|
30
|
-
|
|
31
|
-
## Matriz de compatibilidade por feature
|
|
32
|
-
|
|
33
|
-
Diferente do alvo geral acima (que é sobre *quais navegadores testamos*),
|
|
34
|
-
esta tabela é sobre *o que acontece em navegadores fora do alvo* —
|
|
35
|
-
navegador mínimo com suporte nativo e o comportamento de fallback
|
|
36
|
-
documentado (não "quebra silenciosamente") para cada recurso moderno
|
|
37
|
-
usado no CSS/JS do framework.
|
|
38
|
-
|
|
39
|
-
| Feature | Uso no FokusStyles | Suporte nativo mínimo | Comportamento sem suporte |
|
|
40
|
-
|---|---|---|---|
|
|
41
|
-
| `@layer` (cascade layers) | Organiza `reset/tokens/base/layout/components/utilities/overrides` (`packages/fokus-core/scss/tokens/_root.scss:8`; ver [scss-architecture.md](scss-architecture.md)) | Safari 16.4, Chrome 99, Firefox 97, Edge 99 | Todas as regras caem para a cascata padrão (ordem de origem + especificidade). Como o SCSS já é organizado na mesma ordem lógica das camadas, a degradação visual é mínima — sem garantia formal de paridade pixel-a-pixel, mas sem quebra funcional. |
|
|
42
|
-
| `color-mix()` / `oklch()` | Tokens de cor gerados em OKLCH, dentro de um bloco `@supports (color: oklch(0% 0 0))` (`packages/fokus-core/scss/tokens/_root.scss:73`); usado também nos temas `data-theme="dark"` e `data-fs-brand="*"` | Safari 16.4, Chrome 111, Firefox 113, Edge 111 | `@supports` faz a detecção — navegadores sem suporte simplesmente ignoram o bloco OKLCH inteiro e usam os valores hex sRGB declarados antes dele (mesmas cores, aproximação visual, não pixel-perfect). Não é uma feature isolada: é o mecanismo de fallback de **todos** os tokens de cor do framework. |
|
|
43
|
-
| `@container` (container queries) | Utilitários opt-in `.fs-u-cq`/`.fs-u-cq-{sm,md,lg}-d-*` (`packages/fokus-utilities/scss/utilities/_container-queries.scss`); ver [layout-advanced.md](../guides/layout-advanced.md) | Safari 16.0, Chrome 105, Firefox 110, Edge 105 | Sem suporte, o `@container` inteiro é ignorado pelo navegador — os elementos permanecem no `display` padrão do HTML (ex.: `<div>` como `block`), sem a responsividade condicionada à largura do container. Como é opt-in (só afeta quem usa `.fs-u-cq-*`), não há regressão em quem não usa esses utilitários. |
|
|
44
|
-
| Propriedades customizadas (`--fs-*`) | Tokens em todas as camadas (cor, espaçamento, raio, sombra, tipografia) | Suportado desde 2017 em todos os navegadores principais (abaixo do piso Safari 16.4) | Não relevante ao alvo atual — nenhum navegador do alvo (`.browserslistrc`) carece desse suporte. |
|
|
45
|
-
| `:focus-visible` | Anel de foco acessível (mixin `focus-ring`, `packages/fokus-core/scss/tools/_mixins.scss`), usado em botões, inputs, itens de menu/tree, etc. | Safari 15.4, Chrome 86, Firefox 85, Edge 86 (abaixo do piso Safari 16.4) | Não relevante ao alvo atual pelo mesmo motivo — mas caso um navegador não suporte, o seletor inteiro é ignorado (sem erro), só o anel de foco customizado some; o `outline` nativo do navegador permanece como fallback funcional (não visual). |
|
|
46
|
-
| `prefers-reduced-motion` | Desliga animações de skeleton/carousel/transições (`packages/fokus-js/js/core/transition.js`, `_skeleton.scss`) | Suportado desde 2019 em todos os navegadores principais (abaixo do piso Safari 16.4) | Não relevante ao alvo atual. Em navegadores sem suporte à media query, a regra é ignorada e as animações continuam ativas por padrão (comportamento seguro: anima por padrão, só desliga quando o recurso E a preferência do usuário existem). |
|
|
47
|
-
|
|
48
|
-
### Recursos considerados, mas não usados hoje
|
|
49
|
-
|
|
50
|
-
Para não deixar dúvida sobre lacunas silenciosas: `:has()` e
|
|
51
|
-
`@custom-media` (as duas features citadas com mais frequência ao lado de
|
|
52
|
-
`@container`/`color-mix()` em discussões sobre CSS moderno) **não são
|
|
53
|
-
usadas em nenhuma linha do framework atualmente** — não há necessidade
|
|
54
|
-
técnica identificada até a v1.0.0. Se/quando entrarem, esta tabela ganha
|
|
55
|
-
uma linha nova no mesmo formato antes do merge.
|
|
56
|
-
|
|
57
|
-
## Fallback progressivo (resumo)
|
|
58
|
-
|
|
59
|
-
- **Cores**: OKLCH com fallback em hex sRGB via `@supports` (ver tabela
|
|
60
|
-
acima) — nunca "quebra", só perde precisão de mistura de cor.
|
|
61
|
-
- **`@layer`**: degrada para cascata padrão, sem garantia formal de
|
|
62
|
-
paridade visual mas sem quebra funcional.
|
|
63
|
-
- **`@container`**: opt-in; sem suporte, os elementos ficam no `display`
|
|
64
|
-
HTML padrão.
|
|
65
|
-
- Sem polyfills: o projeto não inclui polyfills de CSS; navegadores fora
|
|
66
|
-
do alvo (`.browserslistrc`) devem ser tratados como não suportados, não
|
|
67
|
-
como "degradados".
|
|
68
|
-
|
|
69
|
-
## Testes
|
|
70
|
-
|
|
71
|
-
A regressão visual (`npm run test:visual`, Playwright + Chromium) cobre o
|
|
72
|
-
navegador mais permissivo do alvo. Não há cobertura automatizada de
|
|
73
|
-
Safari/Firefox no momento — mudanças que dependem de recursos recentes
|
|
74
|
-
(a tabela acima) devem ser verificadas manualmente nesses engines antes
|
|
75
|
-
do release.
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
# Relatório de contraste
|
|
2
|
-
|
|
3
|
-
`npm run contrast` audita a razão de contraste WCAG dos pares
|
|
4
|
-
texto/fundo emitidos pelos tokens (`packages/fokus-core/scss/tokens/_root.scss`,
|
|
5
|
-
`packages/fokus-core/scss/themes/_dark.scss`), nos temas claro e escuro:
|
|
6
|
-
texto base sobre superfície, botões sólidos e alerts, nas seis cores de tema
|
|
7
|
-
(`primary`/`secondary`/`success`/`warning`/`danger`/`info`).
|
|
8
|
-
|
|
9
|
-
## Como rodar
|
|
10
|
-
|
|
11
|
-
```bash
|
|
12
|
-
npm run contrast
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
Cada linha reporta a razão calculada e se atinge AA (WCAG 2.1 SC 1.4.3/1.4.11)
|
|
16
|
-
e AAA:
|
|
17
|
-
|
|
18
|
-
- **4.5:1** — mínimo AA para texto normal (corpo de alert, texto base).
|
|
19
|
-
- **3:1** — mínimo AA para texto grande/negrito e componentes de UI (usado
|
|
20
|
-
para o texto de botões sólidos, que é sempre bold/UI, não corpo de leitura).
|
|
21
|
-
- **7:1** — AAA, opcional.
|
|
22
|
-
|
|
23
|
-
`npm run contrast -- --strict` sai com código de erro se algum par ficar
|
|
24
|
-
abaixo do mínimo AA — é o comando rodado pelo gate `contrast:check` do CI
|
|
25
|
-
(`.github/workflows/ci.yml`).
|
|
26
|
-
|
|
27
|
-
## Por que o tema escuro precisa de pesos próprios
|
|
28
|
-
|
|
29
|
-
O texto de um botão sólido (`.fs-btn-primary` etc.) é decidido uma vez, em
|
|
30
|
-
tempo de build, por `color-contrast()` (branco ou preto, o que der mais
|
|
31
|
-
contraste contra a cor sólida no **tema claro**) e gravado como valor
|
|
32
|
-
estático em `--fs-btn-color`. Ele não é recalculado por tema. O fundo, por
|
|
33
|
-
outro lado, muda no escuro (`--fs-color-{nome}` é misturado em direção ao
|
|
34
|
-
branco). Isso significa que uma cor de texto escolhida para o fundo claro
|
|
35
|
-
pode ficar com contraste ruim contra o fundo (mais claro) do tema escuro — é
|
|
36
|
-
exatamente esse cenário que o relatório cobre nas linhas `dark: btn-* text
|
|
37
|
-
(light)/bg(dark)`.
|
|
38
|
-
|
|
39
|
-
Da mesma forma, os pesos de mistura de `--fs-alert-*-bg`/`-text` no escuro
|
|
40
|
-
(`$dark-alert-bg-weight`/`$dark-alert-text-weight` em `themes/_dark.scss`)
|
|
41
|
-
foram ajustados a partir do relatório — os pesos "óbvios" (mistura simétrica)
|
|
42
|
-
davam ~4.0–4.3:1 em quatro das seis cores, abaixo do mínimo AA de 4.5:1. Se
|
|
43
|
-
você alterar esses pesos, ou os pesos de `$dark-color-weights`, rode
|
|
44
|
-
`npm run contrast` de novo antes de commitar.
|
|
45
|
-
|
|
46
|
-
## Última execução
|
|
47
|
-
|
|
48
|
-
29 pares checados, 0 abaixo do mínimo AA (ver `npm run contrast` para os
|
|
49
|
-
valores atuais — este arquivo documenta o processo, não os números, que
|
|
50
|
-
mudam a cada ajuste de token).
|