fokus-styles 2.4.0 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (212) hide show
  1. package/dist/css/components.css +561 -83
  2. package/dist/css/components.min.css +1 -1
  3. package/dist/css/fokus-components.css +561 -83
  4. package/dist/css/fokus-components.min.css +1 -1
  5. package/dist/css/fokus-rtl.css +697 -83
  6. package/dist/css/fokus-rtl.min.css +1 -1
  7. package/dist/css/fokus-utilities.css +136 -0
  8. package/dist/css/fokus-utilities.min.css +1 -1
  9. package/dist/css/fokus.css +996 -258
  10. package/dist/css/fokus.min.css +1 -1
  11. package/dist/css/forms.css +300 -176
  12. package/dist/css/forms.min.css +1 -1
  13. package/dist/css/helpers.css +136 -0
  14. package/dist/css/helpers.min.css +1 -1
  15. package/dist/js/fokus.js +270 -25
  16. package/dist/js/fokus.min.js +18 -18
  17. package/package.json +17 -15
  18. package/packages/fokus-components/scss/components/_alerts.scss +128 -6
  19. package/packages/fokus-components/scss/components/_badges.scss +26 -10
  20. package/packages/fokus-components/scss/components/_index.scss +1 -0
  21. package/packages/fokus-components/scss/components/_popover.scss +131 -21
  22. package/packages/fokus-components/scss/components/_responsive.scss +23 -0
  23. package/packages/fokus-components/scss/components/_tag.scss +37 -14
  24. package/packages/fokus-components/scss/components/_toasts.scss +156 -11
  25. package/packages/fokus-components/scss/components/_tooltips.scss +70 -18
  26. package/packages/fokus-components/scss/forms/_check-radio-switch.scss +313 -215
  27. package/packages/fokus-components/scss/forms/_forms.scss +16 -0
  28. package/packages/fokus-js/js/carousel.d.ts +4 -0
  29. package/packages/fokus-js/js/carousel.js +8 -0
  30. package/packages/fokus-js/js/core/positioning.js +18 -9
  31. package/packages/fokus-js/js/dropdown.d.ts +4 -0
  32. package/packages/fokus-js/js/dropdown.js +7 -0
  33. package/packages/fokus-js/js/popover.js +26 -1
  34. package/packages/fokus-js/js/tabs.d.ts +3 -0
  35. package/packages/fokus-js/js/tabs.js +5 -0
  36. package/packages/fokus-js/js/tag.js +17 -0
  37. package/packages/fokus-js/js/toast.js +77 -3
  38. package/packages/fokus-js/js/tooltip.d.ts +8 -1
  39. package/packages/fokus-js/js/tooltip.js +106 -13
  40. package/packages/fokus-utilities/scss/utilities/_api.scss +48 -0
  41. package/CHANGELOG.md +0 -910
  42. package/dist/css/components.css.map +0 -1
  43. package/dist/css/components.min.css.map +0 -1
  44. package/dist/css/fokus-components.css.map +0 -1
  45. package/dist/css/fokus-components.min.css.map +0 -1
  46. package/dist/css/fokus-core.css.map +0 -1
  47. package/dist/css/fokus-core.min.css.map +0 -1
  48. package/dist/css/fokus-dark.css.map +0 -1
  49. package/dist/css/fokus-dark.min.css.map +0 -1
  50. package/dist/css/fokus-rtl.css.map +0 -1
  51. package/dist/css/fokus-rtl.min.css.map +0 -1
  52. package/dist/css/fokus-utilities.css.map +0 -1
  53. package/dist/css/fokus-utilities.min.css.map +0 -1
  54. package/dist/css/fokus.css.map +0 -1
  55. package/dist/css/fokus.min.css.map +0 -1
  56. package/dist/css/fonts.css.map +0 -1
  57. package/dist/css/fonts.min.css.map +0 -1
  58. package/dist/css/forms.css.map +0 -1
  59. package/dist/css/forms.min.css.map +0 -1
  60. package/dist/css/helpers.css.map +0 -1
  61. package/dist/css/helpers.min.css.map +0 -1
  62. package/dist/css/layout.css.map +0 -1
  63. package/dist/css/layout.min.css.map +0 -1
  64. package/dist/js/fokus.js.map +0 -7
  65. package/dist/js/fokus.min.js.map +0 -7
  66. package/docs/README.md +0 -86
  67. package/docs/comparison.md +0 -124
  68. package/docs/components/accordion.md +0 -104
  69. package/docs/components/alert-dialog.md +0 -99
  70. package/docs/components/alert.md +0 -59
  71. package/docs/components/avatar.md +0 -13
  72. package/docs/components/badge.md +0 -82
  73. package/docs/components/breadcrumb.md +0 -93
  74. package/docs/components/button-group.md +0 -13
  75. package/docs/components/button.md +0 -98
  76. package/docs/components/card.md +0 -111
  77. package/docs/components/carousel.md +0 -167
  78. package/docs/components/checkbox.md +0 -97
  79. package/docs/components/close-button.md +0 -13
  80. package/docs/components/code.md +0 -13
  81. package/docs/components/collapse.md +0 -78
  82. package/docs/components/combobox.md +0 -123
  83. package/docs/components/command-palette.md +0 -131
  84. package/docs/components/datatable.md +0 -173
  85. package/docs/components/datepicker.md +0 -137
  86. package/docs/components/divider.md +0 -57
  87. package/docs/components/dropdown.md +0 -103
  88. package/docs/components/empty-state.md +0 -65
  89. package/docs/components/file-upload-advanced.md +0 -116
  90. package/docs/components/file-upload.md +0 -93
  91. package/docs/components/icon-link.md +0 -13
  92. package/docs/components/input-group.md +0 -73
  93. package/docs/components/input.md +0 -90
  94. package/docs/components/list-group.md +0 -13
  95. package/docs/components/modal.md +0 -120
  96. package/docs/components/navbar.md +0 -74
  97. package/docs/components/nested-menu.md +0 -90
  98. package/docs/components/notification-center.md +0 -116
  99. package/docs/components/offcanvas.md +0 -102
  100. package/docs/components/pagination.md +0 -145
  101. package/docs/components/placeholder.md +0 -13
  102. package/docs/components/popover.md +0 -105
  103. package/docs/components/progress.md +0 -126
  104. package/docs/components/radio.md +0 -70
  105. package/docs/components/range.md +0 -83
  106. package/docs/components/rating.md +0 -91
  107. package/docs/components/ratio.md +0 -13
  108. package/docs/components/scrollspy.md +0 -13
  109. package/docs/components/segmented-control.md +0 -82
  110. package/docs/components/select.md +0 -89
  111. package/docs/components/skeleton.md +0 -70
  112. package/docs/components/stepper.md +0 -107
  113. package/docs/components/switch.md +0 -75
  114. package/docs/components/table.md +0 -90
  115. package/docs/components/tabs.md +0 -104
  116. package/docs/components/tag.md +0 -129
  117. package/docs/components/tile.md +0 -112
  118. package/docs/components/timeline.md +0 -78
  119. package/docs/components/toast.md +0 -95
  120. package/docs/components/tooltip.md +0 -77
  121. package/docs/components/tree-view.md +0 -118
  122. package/docs/contributing/contributing.md +0 -18
  123. package/docs/getting-started/installation.md +0 -70
  124. package/docs/getting-started/usage.md +0 -105
  125. package/docs/guides/accessibility.md +0 -102
  126. package/docs/guides/charts.md +0 -73
  127. package/docs/guides/dark-mode.md +0 -90
  128. package/docs/guides/icons.md +0 -99
  129. package/docs/guides/javascript-api.md +0 -9
  130. package/docs/guides/layout-advanced.md +0 -118
  131. package/docs/guides/migration-clarus-to-fokus.md +0 -48
  132. package/docs/guides/migration-external.md +0 -123
  133. package/docs/guides/migration-v1.md +0 -63
  134. package/docs/guides/print.md +0 -30
  135. package/docs/guides/rtl-and-system-preferences.md +0 -28
  136. package/docs/guides/theming.md +0 -140
  137. package/docs/guides/utility-api.md +0 -9
  138. package/docs/prompts/prompt-plan.md +0 -45
  139. package/docs/reference/accessibility-matrix.md +0 -77
  140. package/docs/reference/browser-support.md +0 -75
  141. package/docs/reference/contrast-report.md +0 -50
  142. package/docs/reference/definitions.md +0 -864
  143. package/docs/reference/design-tokens.md +0 -194
  144. package/docs/reference/scss-architecture.md +0 -227
  145. package/docs/reference/size-baseline.json +0 -34
  146. package/docs/reference/stability.md +0 -89
  147. package/docs/showcase.md +0 -25
  148. package/mockup/README.md +0 -41
  149. package/mockup/assets/carousel-planning.png +0 -0
  150. package/mockup/assets/carousel-workspace.png +0 -0
  151. package/mockup/assets/example-theme.css +0 -8
  152. package/mockup/assets/example-theme.js +0 -11
  153. package/mockup/assets/showcase-contracts.js +0 -84
  154. package/mockup/assets/showcase.css +0 -91
  155. package/mockup/assets/showcase.js +0 -724
  156. package/mockup/content-data.html +0 -9
  157. package/mockup/examples/accordion-tabs-toast.html +0 -149
  158. package/mockup/examples/alert-dialog.html +0 -84
  159. package/mockup/examples/alerts.html +0 -41
  160. package/mockup/examples/badges-alerts.html +0 -77
  161. package/mockup/examples/buttons.html +0 -58
  162. package/mockup/examples/cards.html +0 -132
  163. package/mockup/examples/carousel.html +0 -126
  164. package/mockup/examples/charts.html +0 -102
  165. package/mockup/examples/check-radio-switch.html +0 -144
  166. package/mockup/examples/collapse.html +0 -69
  167. package/mockup/examples/combobox.html +0 -60
  168. package/mockup/examples/command-palette.html +0 -64
  169. package/mockup/examples/datatable.html +0 -113
  170. package/mockup/examples/datepicker.html +0 -62
  171. package/mockup/examples/divider.html +0 -45
  172. package/mockup/examples/dropdown-tooltip.html +0 -77
  173. package/mockup/examples/empty-state.html +0 -56
  174. package/mockup/examples/file-drop.html +0 -74
  175. package/mockup/examples/file-upload-advanced.html +0 -68
  176. package/mockup/examples/forms-advanced.html +0 -77
  177. package/mockup/examples/hover-card.html +0 -86
  178. package/mockup/examples/icons.html +0 -157
  179. package/mockup/examples/input-group.html +0 -74
  180. package/mockup/examples/js-foundation.html +0 -215
  181. package/mockup/examples/layout.html +0 -134
  182. package/mockup/examples/modal-select.html +0 -127
  183. package/mockup/examples/nested-menu.html +0 -73
  184. package/mockup/examples/notification-center.html +0 -86
  185. package/mockup/examples/offcanvas-popover.html +0 -133
  186. package/mockup/examples/pagination-breadcrumbs.html +0 -92
  187. package/mockup/examples/range.html +0 -69
  188. package/mockup/examples/rating.html +0 -103
  189. package/mockup/examples/segmented-control.html +0 -96
  190. package/mockup/examples/skeletons.html +0 -82
  191. package/mockup/examples/spinner-progress.html +0 -130
  192. package/mockup/examples/stepper.html +0 -119
  193. package/mockup/examples/tables-navbar.html +0 -89
  194. package/mockup/examples/tag.html +0 -105
  195. package/mockup/examples/theming.html +0 -68
  196. package/mockup/examples/tile.html +0 -107
  197. package/mockup/examples/timeline.html +0 -108
  198. package/mockup/examples/tree-view.html +0 -68
  199. package/mockup/feedback-actions.html +0 -9
  200. package/mockup/forms.html +0 -13
  201. package/mockup/foundations.html +0 -7
  202. package/mockup/kitchen-sink.html +0 -696
  203. package/mockup/navigation-disclosure.html +0 -11
  204. package/mockup/overlays-commands.html +0 -12
  205. package/mockup/templates/README.md +0 -20
  206. package/mockup/templates/admin.html +0 -334
  207. package/mockup/templates/auth.html +0 -234
  208. package/mockup/templates/dashboard.html +0 -442
  209. package/mockup/templates/landing.html +0 -397
  210. package/packages/fokus-icons/package.json +0 -46
  211. package/scripts/migrate-fokus-map.json +0 -1366
  212. package/scripts/migrate-fokus.mjs +0 -97
@@ -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-*`.
@@ -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.
@@ -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).