fokus-styles 2.5.0 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/package.json +17 -15
  2. package/CHANGELOG.md +0 -940
  3. package/dist/css/components.css.map +0 -1
  4. package/dist/css/components.min.css.map +0 -1
  5. package/dist/css/fokus-components.css.map +0 -1
  6. package/dist/css/fokus-components.min.css.map +0 -1
  7. package/dist/css/fokus-core.css.map +0 -1
  8. package/dist/css/fokus-core.min.css.map +0 -1
  9. package/dist/css/fokus-dark.css.map +0 -1
  10. package/dist/css/fokus-dark.min.css.map +0 -1
  11. package/dist/css/fokus-rtl.css.map +0 -1
  12. package/dist/css/fokus-rtl.min.css.map +0 -1
  13. package/dist/css/fokus-utilities.css.map +0 -1
  14. package/dist/css/fokus-utilities.min.css.map +0 -1
  15. package/dist/css/fokus.css.map +0 -1
  16. package/dist/css/fokus.min.css.map +0 -1
  17. package/dist/css/fonts.css.map +0 -1
  18. package/dist/css/fonts.min.css.map +0 -1
  19. package/dist/css/forms.css.map +0 -1
  20. package/dist/css/forms.min.css.map +0 -1
  21. package/dist/css/helpers.css.map +0 -1
  22. package/dist/css/helpers.min.css.map +0 -1
  23. package/dist/css/layout.css.map +0 -1
  24. package/dist/css/layout.min.css.map +0 -1
  25. package/dist/js/fokus.js.map +0 -7
  26. package/dist/js/fokus.min.js.map +0 -7
  27. package/docs/README.md +0 -86
  28. package/docs/comparison.md +0 -124
  29. package/docs/components/accordion.md +0 -104
  30. package/docs/components/alert-dialog.md +0 -99
  31. package/docs/components/alert.md +0 -104
  32. package/docs/components/avatar.md +0 -13
  33. package/docs/components/badge.md +0 -101
  34. package/docs/components/breadcrumb.md +0 -93
  35. package/docs/components/button-group.md +0 -13
  36. package/docs/components/button.md +0 -98
  37. package/docs/components/card.md +0 -111
  38. package/docs/components/carousel.md +0 -167
  39. package/docs/components/checkbox.md +0 -110
  40. package/docs/components/close-button.md +0 -13
  41. package/docs/components/code.md +0 -13
  42. package/docs/components/collapse.md +0 -78
  43. package/docs/components/combobox.md +0 -123
  44. package/docs/components/command-palette.md +0 -131
  45. package/docs/components/datatable.md +0 -173
  46. package/docs/components/datepicker.md +0 -137
  47. package/docs/components/divider.md +0 -57
  48. package/docs/components/dropdown.md +0 -103
  49. package/docs/components/empty-state.md +0 -65
  50. package/docs/components/file-upload-advanced.md +0 -116
  51. package/docs/components/file-upload.md +0 -93
  52. package/docs/components/icon-link.md +0 -13
  53. package/docs/components/input-group.md +0 -73
  54. package/docs/components/input.md +0 -90
  55. package/docs/components/list-group.md +0 -13
  56. package/docs/components/modal.md +0 -120
  57. package/docs/components/navbar.md +0 -74
  58. package/docs/components/nested-menu.md +0 -90
  59. package/docs/components/notification-center.md +0 -116
  60. package/docs/components/offcanvas.md +0 -102
  61. package/docs/components/pagination.md +0 -145
  62. package/docs/components/placeholder.md +0 -13
  63. package/docs/components/popover.md +0 -118
  64. package/docs/components/progress.md +0 -126
  65. package/docs/components/radio.md +0 -80
  66. package/docs/components/range.md +0 -83
  67. package/docs/components/rating.md +0 -91
  68. package/docs/components/ratio.md +0 -13
  69. package/docs/components/responsive.md +0 -19
  70. package/docs/components/scrollspy.md +0 -13
  71. package/docs/components/segmented-control.md +0 -82
  72. package/docs/components/select.md +0 -89
  73. package/docs/components/skeleton.md +0 -70
  74. package/docs/components/stepper.md +0 -107
  75. package/docs/components/switch.md +0 -97
  76. package/docs/components/table.md +0 -90
  77. package/docs/components/tabs.md +0 -104
  78. package/docs/components/tag.md +0 -144
  79. package/docs/components/tile.md +0 -112
  80. package/docs/components/timeline.md +0 -78
  81. package/docs/components/toast.md +0 -108
  82. package/docs/components/tooltip.md +0 -113
  83. package/docs/components/tree-view.md +0 -118
  84. package/docs/contributing/contributing.md +0 -18
  85. package/docs/getting-started/installation.md +0 -70
  86. package/docs/getting-started/usage.md +0 -105
  87. package/docs/guides/accessibility.md +0 -109
  88. package/docs/guides/charts.md +0 -73
  89. package/docs/guides/dark-mode.md +0 -90
  90. package/docs/guides/icons.md +0 -99
  91. package/docs/guides/javascript-api.md +0 -9
  92. package/docs/guides/layout-advanced.md +0 -118
  93. package/docs/guides/migration-clarus-to-fokus.md +0 -48
  94. package/docs/guides/migration-external.md +0 -123
  95. package/docs/guides/migration-v1.md +0 -63
  96. package/docs/guides/print.md +0 -30
  97. package/docs/guides/rtl-and-system-preferences.md +0 -28
  98. package/docs/guides/theming.md +0 -140
  99. package/docs/guides/utility-api.md +0 -9
  100. package/docs/prompts/prompt-plan.md +0 -45
  101. package/docs/reference/accessibility-matrix.md +0 -77
  102. package/docs/reference/browser-support.md +0 -75
  103. package/docs/reference/contrast-report.md +0 -54
  104. package/docs/reference/definitions.md +0 -868
  105. package/docs/reference/design-tokens.md +0 -208
  106. package/docs/reference/scss-architecture.md +0 -227
  107. package/docs/reference/size-baseline.json +0 -34
  108. package/docs/reference/stability.md +0 -89
  109. package/docs/showcase.md +0 -25
  110. package/mockup/README.md +0 -41
  111. package/mockup/assets/carousel-planning.png +0 -0
  112. package/mockup/assets/carousel-workspace.png +0 -0
  113. package/mockup/assets/example-theme.css +0 -19
  114. package/mockup/assets/example-theme.js +0 -11
  115. package/mockup/assets/showcase-contracts.js +0 -84
  116. package/mockup/assets/showcase.css +0 -91
  117. package/mockup/assets/showcase.js +0 -724
  118. package/mockup/content-data.html +0 -9
  119. package/mockup/examples/accordion-tabs-toast.html +0 -149
  120. package/mockup/examples/alert-dialog.html +0 -84
  121. package/mockup/examples/alerts.html +0 -115
  122. package/mockup/examples/badges-alerts.html +0 -109
  123. package/mockup/examples/buttons.html +0 -58
  124. package/mockup/examples/cards.html +0 -132
  125. package/mockup/examples/carousel.html +0 -126
  126. package/mockup/examples/charts.html +0 -102
  127. package/mockup/examples/check-radio-switch.html +0 -620
  128. package/mockup/examples/collapse.html +0 -69
  129. package/mockup/examples/combobox.html +0 -60
  130. package/mockup/examples/command-palette.html +0 -64
  131. package/mockup/examples/datatable.html +0 -113
  132. package/mockup/examples/datepicker.html +0 -62
  133. package/mockup/examples/divider.html +0 -45
  134. package/mockup/examples/dropdown-tooltip.html +0 -77
  135. package/mockup/examples/empty-state.html +0 -56
  136. package/mockup/examples/file-drop.html +0 -74
  137. package/mockup/examples/file-upload-advanced.html +0 -68
  138. package/mockup/examples/forms-advanced.html +0 -77
  139. package/mockup/examples/hover-card.html +0 -86
  140. package/mockup/examples/icons.html +0 -157
  141. package/mockup/examples/input-group.html +0 -74
  142. package/mockup/examples/js-foundation.html +0 -215
  143. package/mockup/examples/layout.html +0 -134
  144. package/mockup/examples/modal-select.html +0 -127
  145. package/mockup/examples/nested-menu.html +0 -73
  146. package/mockup/examples/notification-center.html +0 -86
  147. package/mockup/examples/offcanvas-popover.html +0 -133
  148. package/mockup/examples/pagination-breadcrumbs.html +0 -92
  149. package/mockup/examples/popover.html +0 -81
  150. package/mockup/examples/range.html +0 -69
  151. package/mockup/examples/rating.html +0 -103
  152. package/mockup/examples/segmented-control.html +0 -96
  153. package/mockup/examples/skeletons.html +0 -82
  154. package/mockup/examples/spinner-progress.html +0 -130
  155. package/mockup/examples/stepper.html +0 -119
  156. package/mockup/examples/tables-navbar.html +0 -89
  157. package/mockup/examples/tag.html +0 -115
  158. package/mockup/examples/theming.html +0 -68
  159. package/mockup/examples/tile.html +0 -107
  160. package/mockup/examples/timeline.html +0 -108
  161. package/mockup/examples/toast.html +0 -113
  162. package/mockup/examples/tooltip.html +0 -68
  163. package/mockup/examples/tree-view.html +0 -68
  164. package/mockup/feedback-actions.html +0 -9
  165. package/mockup/forms.html +0 -13
  166. package/mockup/foundations.html +0 -7
  167. package/mockup/kitchen-sink.html +0 -696
  168. package/mockup/navigation-disclosure.html +0 -11
  169. package/mockup/overlays-commands.html +0 -12
  170. package/mockup/templates/README.md +0 -20
  171. package/mockup/templates/admin.html +0 -334
  172. package/mockup/templates/auth.html +0 -234
  173. package/mockup/templates/dashboard.html +0 -442
  174. package/mockup/templates/landing.html +0 -397
  175. package/packages/fokus-icons/package.json +0 -46
  176. package/scripts/migrate-fokus-map.json +0 -1366
  177. package/scripts/migrate-fokus.mjs +0 -97
@@ -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) | Nativo quando houver link/botão | Manual (`role="alert"`/`"status"`) | Nenhuma automática | ✓ | 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 (Space) | Nativo + `aria-describedby` manual | Foco visível no controle | ✓ | 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 + `fieldset/legend` manual | Foco visível no controle | ✓ | 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 (Space) | Checkbox nativo; nome manual sem texto | Foco visível no trilho | ✓ | 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, `aria-busy`) | Foco preservado/transferido após dismiss | ✓ | 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) | Nativo em fechamento e ações | Automático (`role="status"`, `aria-live="polite"`) | Nenhuma automática; pausa em foco/hover | ✓ | Sim |
57
- | [Tooltip](../components/tooltip.md) | Nativo (`focus`/`blur`, ponteiro e Escape) | Automático (`role="tooltip"`, `aria-describedby`) | Nenhuma; foco permanece no gatilho | ✓ | 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,54 +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
- Checkbox, Radio e Switch reutilizam esses tokens semânticos para bordas,
24
- superfícies, estados de ação e validação. O relatório visual dos laboratórios
25
- também deve ser executado após qualquer ajuste nos tokens locais dos controles.
26
-
27
- `npm run contrast -- --strict` sai com código de erro se algum par ficar
28
- abaixo do mínimo AA — é o comando rodado pelo gate `contrast:check` do CI
29
- (`.github/workflows/ci.yml`).
30
-
31
- ## Por que o tema escuro precisa de pesos próprios
32
-
33
- O texto de um botão sólido (`.fs-btn-primary` etc.) é decidido uma vez, em
34
- tempo de build, por `color-contrast()` (branco ou preto, o que der mais
35
- contraste contra a cor sólida no **tema claro**) e gravado como valor
36
- estático em `--fs-btn-color`. Ele não é recalculado por tema. O fundo, por
37
- outro lado, muda no escuro (`--fs-color-{nome}` é misturado em direção ao
38
- branco). Isso significa que uma cor de texto escolhida para o fundo claro
39
- pode ficar com contraste ruim contra o fundo (mais claro) do tema escuro — é
40
- exatamente esse cenário que o relatório cobre nas linhas `dark: btn-* text
41
- (light)/bg(dark)`.
42
-
43
- Da mesma forma, os pesos de mistura de `--fs-alert-*-bg`/`-text` no escuro
44
- (`$dark-alert-bg-weight`/`$dark-alert-text-weight` em `themes/_dark.scss`)
45
- foram ajustados a partir do relatório — os pesos "óbvios" (mistura simétrica)
46
- davam ~4.0–4.3:1 em quatro das seis cores, abaixo do mínimo AA de 4.5:1. Se
47
- você alterar esses pesos, ou os pesos de `$dark-color-weights`, rode
48
- `npm run contrast` de novo antes de commitar.
49
-
50
- ## Última execução
51
-
52
- 29 pares checados, 0 abaixo do mínimo AA (ver `npm run contrast` para os
53
- valores atuais — este arquivo documenta o processo, não os números, que
54
- mudam a cada ajuste de token).