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,102 +0,0 @@
1
- # Acessibilidade
2
-
3
- Acessibilidade não é um retrofit no Fokus Styles — foco, teclado e ARIA fazem
4
- parte da API de todo componente interativo desde a primeira versão. Este
5
- guia documenta os padrões **compartilhados** entre componentes; o
6
- comportamento específico de cada um está na sua página em
7
- [Componentes](../README.md#componentes), seção "A11y".
8
-
9
- ## Foco visível
10
-
11
- Todo elemento interativo (botões, links, inputs, itens de menu) usa
12
- `:focus-visible` (não `:focus`) para o anel de destaque — aparece só na
13
- navegação por teclado, não em cliques de mouse, evitando o "flash" de foco
14
- indesejado ao clicar. O mixin `focus-ring` (`packages/fokus-core/scss/tools/_mixins.scss`)
15
- centraliza esse estilo; todo componente novo deve reusá-lo em vez de
16
- desenhar um anel de foco próprio.
17
-
18
- ## Focus trap (modal, offcanvas)
19
-
20
- Componentes que sobrepõem a página inteira (Modal, Offcanvas) prendem o
21
- foco dentro de si enquanto abertos — `Tab` no último elemento focável volta
22
- pro primeiro, `Shift+Tab` no primeiro vai pro último
23
- (`packages/fokus-js/js/core/focus.js`, `createFocusTrap()`). Ao abrir, o
24
- foco vai para o primeiro elemento focável do painel; ao fechar, volta para o
25
- elemento que abriu (o gatilho).
26
-
27
- ## Escape e clique fora
28
-
29
- Overlays (Modal, Offcanvas, Dropdown, Popover, Nested Menu) fecham com
30
- `Escape` e com clique fora do painel, por padrão. Componentes com um modo
31
- "preso" (`data-backdrop="static"` no Modal/Offcanvas) desativam essas duas
32
- saídas deliberadamente — para fluxos que exigem uma decisão explícita
33
- (confirmar/cancelar) antes de sair.
34
-
35
- ## Navegação por teclado em grupos (Tabs, Accordion, Nested Menu)
36
-
37
- Grupos de itens relacionados seguem o padrão de "roving tabindex" do
38
- [WAI-ARIA Authoring Practices](https://www.w3.org/WAI/ARIA/apg/): só o item
39
- ativo tem `tabindex="0"`, os demais `tabindex="-1"` — `Tab` entra/sai do
40
- grupo de uma vez, e as setas navegam **dentro** dele:
41
-
42
- - **Tabs**: `ArrowLeft`/`ArrowRight` move entre abas, `Home`/`End` vai pra
43
- primeira/última.
44
- - **Nested Menu**: `ArrowDown`/`ArrowUp` navegam no nível atual,
45
- `ArrowRight` abre um submenu, `ArrowLeft`/`Escape` fecham.
46
-
47
- ## ARIA injetado automaticamente
48
-
49
- Alguns atributos ARIA são calculados e aplicados pelo próprio JS na
50
- inicialização (não precisam ser escritos manualmente no HTML) — por
51
- exemplo, Tabs aplica `role="tablist"`/`role="tab"`/`aria-selected`/
52
- `aria-controls` aos elementos com `data-fs="tabs"`. Onde isso acontece, a
53
- página do componente avisa explicitamente; o resto (`aria-label` em botões
54
- sem texto visível, `alt` em imagens, etc.) é responsabilidade de quem
55
- escreve o HTML — o framework não adivinha texto alternativo.
56
-
57
- ## `prefers-reduced-motion`
58
-
59
- Toda transição de altura acionada por JS (Collapse, Accordion, Toast via
60
- `packages/fokus-js/js/core/transition.js`) verifica
61
- `window.matchMedia("(prefers-reduced-motion: reduce)")` e pula direto para
62
- o estado final — sem animação — quando o usuário pediu menos movimento no
63
- sistema operacional. A camada base do CSS também reduz automaticamente
64
- transições e animações declaradas pelo framework quando essa preferência está
65
- ativa. Se você adicionar uma animação própria, preserve o estado final e
66
- teste o comportamento com `prefers-reduced-motion: reduce`.
67
-
68
- ## Contraste de cor
69
-
70
- Botões/badges/alerts sólidos calculam a cor de texto automaticamente
71
- (`color-contrast()`) para garantir contraste AA (≥ 4.5:1 texto normal, ≥
72
- 3:1 texto grande/UI) contra a cor de fundo escolhida — nunca é preciso
73
- escolher manualmente entre texto branco ou preto. O relatório
74
- `npm run contrast` (ver [`docs/reference/contrast-report.md`](../reference/contrast-report.md))
75
- audita os pares texto/fundo de tokens nos temas claro e escuro; rode-o
76
- depois de qualquer mudança de cor de token.
77
-
78
- ## Formulários
79
-
80
- Inputs de validação (`.is-valid`/`.is-invalid`) e os textos de apoio
81
- (`.fs-valid-feedback`/`.fs-invalid-feedback`, `.fs-form-text`) são
82
- elementos visuais — associe-os ao input via `aria-describedby` no seu HTML
83
- para que leitores de tela anunciem a mensagem ao focar o campo. O
84
- framework não injeta esse atributo automaticamente, porque o `id` do texto
85
- de apoio é definido por você.
86
-
87
- ## Testes automatizados
88
-
89
- A regressão visual (`npm run test:visual`, Playwright) cobre
90
- carregamento/interação sem erros de console, mas não é um gate de
91
- acessibilidade. `npm run test:a11y` roda o axe-core (regras WCAG 2.1 A/AA)
92
- contra cada laboratório em `mockup/*.html` (claro e escuro) e contra as
93
- fontes executáveis em `mockup/examples/*.html`; o build falha ao encontrar
94
- violações (nome acessível ausente, contraste insuficiente, papel ARIA
95
- inválido etc.) — roda no CI a cada PR. Veja a cobertura por componente na
96
- [matriz de acessibilidade](../reference/accessibility-matrix.md).
97
-
98
- Mesmo com o gate automatizado, valide manualmente com um leitor de tela e
99
- navegação só por teclado antes de considerar um componente pronto — axe
100
- cobre um subconjunto de regras verificáveis por máquina (contraste, nomes,
101
- papéis), não a experiência real de uso (ordem de leitura, clareza dos
102
- anúncios, foco percebido).
@@ -1,73 +0,0 @@
1
- # Gráficos (tokens agnósticos de biblioteca)
2
-
3
- O FokusStyles **não inclui um wrapper de nenhuma biblioteca de gráficos** — em
4
- vez disso, expõe um conjunto pequeno de tokens (`--fs-chart-*`) que
5
- qualquer lib (Chart.js, ECharts, Recharts, D3, Highcharts…) pode consumir
6
- via `getComputedStyle`. Zero dependência nova, zero manutenção atrelada à
7
- API de uma lib de terceiro que muda com o tempo, e o gráfico acompanha
8
- `data-theme`/`data-fs-brand` automaticamente porque os tokens são aliases da
9
- camada semântica já existente (mesma técnica de `tokens/_semantic.scss`).
10
-
11
- ## Tokens
12
-
13
- | Token | Uso sugerido |
14
- |---|---|
15
- | `--fs-chart-series-1` … `--fs-chart-series-6` | Cor de cada série/categoria de dados. |
16
- | `--fs-chart-grid` | Linhas de grade do plano cartesiano. |
17
- | `--fs-chart-axis` | Rótulos e linhas dos eixos. |
18
- | `--fs-chart-tooltip-bg` / `--fs-chart-tooltip-text` | Fundo/texto do tooltip do gráfico. |
19
-
20
- As 6 séries reaproveitam as cores de tema (`primary`/`success`/`warning`/
21
- `danger`/`info`/`secondary`) — uma paleta categórica coerente com o resto
22
- da interface, sem introduzir cor nova. Se seu gráfico precisar de mais de
23
- 6 séries ou de uma paleta com propósito diferente (sequencial/divergente),
24
- sobrescreva os tokens que precisar; eles são só `var()`, então qualquer
25
- CSS depois do import do FokusStyles vence.
26
-
27
- ## Uso
28
-
29
- Leia os tokens em runtime com `getComputedStyle` e passe pra sua lib de
30
- gráficos na hora de montar a configuração:
31
-
32
- ```js
33
- const styles = getComputedStyle(document.documentElement);
34
- const chartColors = {
35
- series: [1, 2, 3, 4, 5, 6].map((n) => styles.getPropertyValue(`--fs-chart-series-${n}`).trim()),
36
- grid: styles.getPropertyValue("--fs-chart-grid").trim(),
37
- axis: styles.getPropertyValue("--fs-chart-axis").trim(),
38
- tooltipBg: styles.getPropertyValue("--fs-chart-tooltip-bg").trim(),
39
- tooltipText: styles.getPropertyValue("--fs-chart-tooltip-text").trim(),
40
- };
41
- ```
42
-
43
- Exemplo com Chart.js:
44
-
45
- ```js
46
- new Chart(ctx, {
47
- type: "bar",
48
- data: {
49
- labels: ["Jan", "Fev", "Mar"],
50
- datasets: [{ data: [12, 19, 7], backgroundColor: chartColors.series[0] }],
51
- },
52
- options: {
53
- scales: {
54
- x: { grid: { color: chartColors.grid }, ticks: { color: chartColors.axis } },
55
- y: { grid: { color: chartColors.grid }, ticks: { color: chartColors.axis } },
56
- },
57
- },
58
- });
59
- ```
60
-
61
- ## Tema escuro e multi-brand
62
-
63
- Como os tokens de série são aliases de `--fs-color-*`, eles já respondem a
64
- `data-theme="dark"` e `data-fs-brand="x"` (ver [Theming](theming.md)) sem
65
- nenhum código adicional — só é preciso reler `getComputedStyle` (ou
66
- recriar o gráfico) depois de uma troca de tema/marca em runtime, porque a
67
- maioria das libs de gráfico não observa mudanças de CSS custom properties
68
- sozinha.
69
-
70
- ## Próximo passo
71
-
72
- [Theming](theming.md) — as 3 camadas de tokens que os tokens de gráfico
73
- reaproveitam.
@@ -1,90 +0,0 @@
1
- # Dark mode
2
-
3
- O tema escuro é nativo desde a primeira versão do framework — não é um
4
- plugin nem exige JavaScript.
5
-
6
- ## Ativação
7
-
8
- Um único atributo no `<html>` (ou em qualquer contêiner — o tema se aplica
9
- por escopo, não só global):
10
-
11
- ```html
12
- <html data-theme="dark">
13
- ```
14
-
15
- ```html
16
- <!-- Escopo local: só este painel fica escuro -->
17
- <div data-theme="dark">
18
- <div class="fs-card">...</div>
19
- </div>
20
- ```
21
-
22
- Não há classe `.dark`/`.fs-dark` — é sempre o atributo `data-theme="dark"`.
23
- Remover o atributo (ou trocar pra qualquer outro valor) volta ao tema claro.
24
-
25
- ## Como funciona
26
-
27
- `packages/fokus-core/scss/themes/_dark.scss` redefine os tokens semânticos
28
- de cor (`--fs-color-text`, `--fs-color-surface`, `--fs-color-{primary,
29
- success,...}`, `--fs-alert-*-bg/-text`, `--fs-feedback-*-bg`) sob o seletor
30
- `[data-theme="dark"]`. Como todo componente já consome esses tokens via
31
- `var()`, nenhum CSS extra por componente é necessário — trocar o atributo já
32
- propaga a cor nova para tudo.
33
-
34
- As cores do tema escuro não são um segundo conjunto arbitrário: primary/
35
- secondary/success/warning/danger/info são misturados (`color.mix()`, espaço
36
- OKLCH) a partir do mesmo primitivo do tema claro, clareando em direção ao
37
- branco — mantém a identidade de cor entre os dois temas. Os pesos de mistura
38
- foram calibrados para manter contraste WCAG AA (ver
39
- [`docs/reference/contrast-report.md`](../reference/contrast-report.md) e
40
- `npm run contrast`).
41
-
42
- ## JavaScript para alternar (opcional)
43
-
44
- O framework não fornece um componente de "toggle de tema" pronto — é
45
- deliberadamente simples de implementar com o que você já tem
46
- (`.fs-switch`, ver [`../components/switch.md`](../components/switch.md)):
47
-
48
- ```html
49
- <div class="fs-switch">
50
- <input type="checkbox" class="fs-switch-input" id="theme-toggle">
51
- <label for="theme-toggle" class="fs-switch-label">Tema escuro</label>
52
- </div>
53
- ```
54
-
55
- ```js
56
- const toggle = document.getElementById("theme-toggle");
57
- const stored = localStorage.getItem("theme");
58
-
59
- if (stored === "dark") {
60
- document.documentElement.setAttribute("data-theme", "dark");
61
- toggle.checked = true;
62
- }
63
-
64
- toggle.addEventListener("change", () => {
65
- const theme = toggle.checked ? "dark" : "light";
66
- document.documentElement.setAttribute("data-theme", theme);
67
- localStorage.setItem("theme", theme);
68
- });
69
- ```
70
-
71
- Para respeitar a preferência do sistema operacional por padrão (antes de
72
- qualquer escolha manual salva), combine com
73
- `window.matchMedia("(prefers-color-scheme: dark)").matches` na primeira
74
- carga.
75
-
76
- ## Customizando o tema escuro
77
-
78
- Como qualquer outro token, redefina sob `[data-theme="dark"]` no seu
79
- próprio CSS — carregado **depois** do CSS do FokusStyles, para vencer a cascata:
80
-
81
- ```css
82
- [data-theme="dark"] {
83
- --fs-color-surface: #14151a;
84
- }
85
- ```
86
-
87
- ## Próximo passo
88
-
89
- [Acessibilidade](accessibility.md) — teclado, ARIA e contraste por
90
- componente.
@@ -1,99 +0,0 @@
1
- # Ícones
2
-
3
- O Fokus Styles inclui ícones como subpath opcional — ícone é conteúdo, não
4
- estilo, e o bundle principal não importa nenhum deles. Use
5
- `fokus-styles/icons`, com 1994 ícones SVG do conjunto
6
- [Lucide](https://lucide.dev) (licença ISC), mais uma classe utilitária
7
- `.fs-icon` no `fokus-styles` (sempre disponível, custo desprezível) pro
8
- dimensionamento.
9
-
10
- ## Instalação
11
-
12
- ```bash
13
- npm install fokus-styles
14
- ```
15
-
16
- Zero dependências em runtime — o subpath contém apenas arquivos `.svg` e módulos
17
- `.js` gerados; `lucide-static` é usado apenas para gerar o pacote, nunca é
18
- instalado por quem consome o `fokus-styles`.
19
-
20
- ## Uso — SVG puro (zero JS)
21
-
22
- Cada ícone pode ser resolvido como `fokus-styles/svg/<nome>.svg`, já
23
- com `class="fs-icon"` aplicada. Copie o conteúdo direto no seu HTML:
24
-
25
- ```html
26
- <button type="button" class="fs-btn fs-btn-primary">
27
- <svg class="fs-icon" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6 9 17l-5-5"/></svg>
28
- Salvar
29
- </button>
30
- ```
31
-
32
- Essa é a forma recomendada: nenhuma dependência de build, o SVG já nasce
33
- otimizado (sem comentários, sem atributos redundantes).
34
-
35
- ## Uso — módulo JS (tree-shakeable)
36
-
37
- Se seu projeto já usa um bundler (Vite, esbuild, Rollup, webpack), importe
38
- só os ícones que usa — cada um é um módulo próprio, então o restante dos
39
- 1994 nunca entra no seu bundle final:
40
-
41
- ```js
42
- import check from "fokus-styles/icons/check.js";
43
-
44
- document.querySelector("#status-icon").innerHTML = check;
45
- ```
46
-
47
- Ou pelo barrel, com nomes em camelCase (`arrow-right` → `arrowRight`):
48
-
49
- ```js
50
- import { arrowRight, check } from "fokus-styles/icons";
51
- ```
52
-
53
- O pacote é publicado com `"sideEffects": false`, então bundlers modernos
54
- eliminam os ícones não usados mesmo importando do barrel — mas prefira o
55
- caminho direto (`fokus-styles/icons/check.js`) se seu bundler não fizer
56
- tree-shaking de barrels corretamente.
57
-
58
- ## Dimensionamento e cor — `.fs-icon`
59
-
60
- ```html
61
- <svg class="fs-icon fs-icon-lg" ...>...</svg>
62
- ```
63
-
64
- | Classe | Tamanho |
65
- |---|---|
66
- | `.fs-icon` (padrão) | `1em` × `1em` — acompanha o `font-size` do elemento ao redor |
67
- | `.fs-icon-xs` | 12px |
68
- | `.fs-icon-sm` | 16px |
69
- | `.fs-icon-lg` | 32px |
70
- | `.fs-icon-xl` | 48px |
71
-
72
- Cor: os ícones usam `stroke="currentColor"` — herdam a cor do texto
73
- automaticamente. Para uma cor diferente do texto ao redor, aplique `color`
74
- no elemento (ou num ancestral) como faria com qualquer texto.
75
-
76
- ## Ícones em componentes com JS
77
-
78
- Componentes como [Combobox](../components/combobox.md) ou
79
- [Command Palette](../components/command-palette.md) não têm nenhuma
80
- integração especial com `fokus-styles/icons` — você cola o SVG (ou injeta via
81
- módulo JS) dentro da marcação normal do componente, exatamente como faria
82
- com qualquer outro conteúdo:
83
-
84
- ```html
85
- <li class="fs-dropdown-item" data-value="download">
86
- <svg class="fs-icon" ...>...</svg>
87
- Baixar arquivo
88
- </li>
89
- ```
90
-
91
- ## Licença
92
-
93
- O código de geração do pacote é MIT (mesma licença do FokusStyles). Os ícones
94
- em si são do projeto Lucide, licença ISC — parte deles derivada do
95
- projeto Feather (MIT). Ambos os avisos de copyright são distribuídos junto
96
- do pacote (`LICENSE`/`LICENSE-LUCIDE.txt` em `node_modules/fokus-styles/packages/fokus-icons/`
97
- depois de instalado).
98
-
99
- Mockup: [`mockup/foundations.html#icons`](../../mockup/foundations.html#icons).
@@ -1,9 +0,0 @@
1
- # API JavaScript
2
-
3
- Os módulos vanilla são SSR-safe quando importados e expõem instâncias idempotentes por
4
- `getOrCreateInstance`. Modal, Theme, Navbar, Scrollspy e FormValidation também oferecem
5
- destruição explícita com `dispose()`.
6
-
7
- Os eventos comuns são `fs:show`, `fs:shown`, `fs:hide` e `fs:hidden`. Atributos declarativos
8
- usam `data-fs-toggle`, `data-fs-target`, `data-fs-dismiss`, `data-fs-placement` e
9
- `data-fs-theme`.
@@ -1,118 +0,0 @@
1
- # Layout avançado
2
-
3
- Três primitivas de layout CSS-only (Stack, Cluster, Sidebar), utilitários de
4
- posição sticky e utilitários de container query (`@container`) — para
5
- composições que os utilitários de grid/flex existentes (`.fs-row`/`.fs-col-*`,
6
- `.fs-u-d-flex`) não cobrem bem sozinhos. Exemplo funcional completo em
7
- [`mockup/foundations.html#layout`](../../mockup/foundations.html#layout).
8
-
9
- ## Stack
10
-
11
- Empilha os filhos diretos verticalmente com espaçamento consistente via
12
- `gap` (não `margin` — evita o problema de "o último filho não deve ter
13
- margin-bottom"):
14
-
15
- ```html
16
- <div class="fs-stack">
17
- <div>Item 1</div>
18
- <div>Item 2</div>
19
- <div>Item 3</div>
20
- </div>
21
- ```
22
-
23
- O espaçamento padrão vem do token `--fs-stack-gap` (`$spacers[3]`, `1rem`).
24
- Ajuste com uma classe `.fs-stack-gap-{0..5}` (mesma escala de
25
- `$spacers` usada nos utilitários `.fs-u-m*`/`.fs-u-p*`) ou redefinindo o token
26
- direto no elemento:
27
-
28
- ```html
29
- <div class="fs-stack fs-stack-gap-1">…</div>
30
- ```
31
-
32
- ## Cluster
33
-
34
- Agrupa itens horizontalmente com quebra de linha automática e espaçamento
35
- consistente nos dois eixos — para grupos de tags, botões ou badges que
36
- precisam "fluir" sem estourar o container:
37
-
38
- ```html
39
- <div class="fs-cluster">
40
- <span class="fs-tag">Frontend</span>
41
- <span class="fs-tag">CSS</span>
42
- <span class="fs-tag">Acessibilidade</span>
43
- </div>
44
- ```
45
-
46
- Gap ajustável do mesmo jeito que o Stack: `.fs-cluster-gap-{0..5}` ou
47
- `--fs-cluster-gap`.
48
-
49
- ## Sidebar
50
-
51
- Um lado com largura fixa (a "aside") e o outro preenchendo o espaço
52
- restante — quebra para empilhado quando o container fica estreito demais,
53
- sem media query (a técnica é puramente flexbox: `.fs-sidebar-content` tem
54
- `flex-basis: 0` e `min-width: 50%`, forçando a quebra quando não cabe ao
55
- lado da aside na largura disponível):
56
-
57
- ```html
58
- <div class="fs-sidebar">
59
- <aside class="fs-sidebar-aside">Menu lateral</aside>
60
- <div class="fs-sidebar-content">Conteúdo principal</div>
61
- </div>
62
- ```
63
-
64
- - Largura da aside: `--fs-sidebar-width` (padrão `16rem`), ou uma classe
65
- `.fs-sidebar-width-{sm,md,lg,xl,xxl,xxxl}` (reusa a escala de
66
- `$column-max-widths`, de 120px a 720px).
67
- - `.fs-sidebar-reverse` inverte a ordem visual (aside à direita).
68
- - Gap: `.fs-sidebar-gap-{0..5}` ou `--fs-sidebar-gap`.
69
-
70
- ## Sticky
71
-
72
- `.fs-u-sticky-top`/`.fs-u-sticky-bottom` (`position: sticky`) com offset
73
- configurável via `--fs-sticky-top`/`--fs-sticky-bottom` (padrão `0`) e
74
- `z-index: 1020` (mesma faixa numérica dos demais componentes de overlay —
75
- acima de conteúdo normal e do Dropdown, abaixo de Modal/Offcanvas):
76
-
77
- ```html
78
- <div style="overflow-y: auto; max-height: 300px;">
79
- <div class="fs-u-sticky-top">Cabeçalho fixo</div>
80
- <p>Conteúdo rolável…</p>
81
- </div>
82
- ```
83
-
84
- Um contêiner com scroll próprio (como no exemplo acima) precisa ser
85
- focável por teclado (`tabindex="0"`) se o conteúdo for maior que a área
86
- visível — sem isso, quem navega só por teclado não consegue rolar o
87
- conteúdo (regra `scrollable-region-focusable` do gate `axe` no CI).
88
-
89
- ## Container queries (`@container`)
90
-
91
- Reagem à largura do **container** mais próximo, não da viewport — útil
92
- para um componente que se comporta de forma diferente dependendo de onde é
93
- colocado (uma sidebar estreita vs. uma área de conteúdo larga), independente
94
- do tamanho da tela. Ative com `.fs-u-cq` no elemento pai:
95
-
96
- ```html
97
- <div class="fs-u-cq">
98
- <div class="fs-u-cq-md-d-flex fs-u-gap-2">
99
- <div>A</div>
100
- <div>B</div>
101
- </div>
102
- </div>
103
- ```
104
-
105
- - `.fs-u-cq` define `container-type: inline-size` — só aplique num elemento
106
- cuja largura você quer usar como referência (não precisa ser o `:root`).
107
- - Utilitários disponíveis: `.fs-u-cq-{sm,md,lg}-d-{none,block,inline-block,flex}`,
108
- seguindo os limiares `--fs-cq-sm` (320px), `--fs-cq-md` (480px),
109
- `--fs-cq-lg` (640px) — uma escala própria, mais compacta que a de
110
- viewport (`$breakpoints`), porque containers costumam ser bem menores
111
- que a tela inteira.
112
- - Os tokens `--fs-cq-*` em `:root` são só **informativos** (documentam os
113
- valores usados) — a condição de um `@container` exige um valor literal
114
- em tempo de build, não aceita `var()`; mudar o token em runtime não
115
- recalibra as regras já compiladas.
116
- - Complementam, não substituem, os utilitários de viewport existentes
117
- (`.fs-u-d-flex` etc.) — para a maioria dos casos, media query por viewport
118
- continua sendo a ferramenta certa.
@@ -1,48 +0,0 @@
1
- # Migração do Clarus para o Fokus Styles
2
-
3
- O Fokus Styles 2.0 renomeia integralmente a API pública do Clarus. Não há
4
- aliases: atualize todos os imports, seletores, atributos e acessos ao global
5
- JavaScript antes de remover o pacote anterior.
6
-
7
- | Clarus 1.x | Fokus Styles 2.0 |
8
- | --- | --- |
9
- | `clarus-css` | `fokus-styles` |
10
- | `clarus-icons` | `fokus-styles/icons` |
11
- | `clarus-react` | `fokus-styles/react` |
12
- | `clarus-cli` | `fokus-styles` com o comando `fokus` |
13
- | `.fs-*` | `.fs-*` |
14
- | `.u-*` | `.fs-u-*` |
15
- | `--fs-*` | `--fs-*` |
16
- | `data-fs*` | `data-fs*` |
17
- | `data-fs-brand` | `data-fs-brand` |
18
- | `window.Clarus` | `window.FokusStyles` |
19
- | `fs:*` | `fs:*` |
20
-
21
- ## Instalação
22
-
23
- ```bash
24
- npm uninstall clarus-css clarus-icons clarus-cli clarus-react
25
- npm install fokus-styles
26
- ```
27
-
28
- ## Exemplo
29
-
30
- ```html
31
- <button class="fs-btn fs-btn-primary" data-fs="modal" data-fs-target="#perfil">
32
- Abrir perfil
33
- </button>
34
-
35
- <script src="node_modules/fokus-styles/dist/js/fokus.min.js"></script>
36
- <script>
37
- document.addEventListener("fs:modal:shown", () => console.log("aberto"));
38
- </script>
39
- ```
40
-
41
- Para React, importe `ModalTrigger`, `ModalPanel`, `DropdownTrigger`,
42
- `DropdownMenu` e `TabList` de `fokus-styles/react`. Para ícones, importe do
43
- barrel `fokus-styles/icons` ou de um módulo individual como
44
- `fokus-styles/icons/check.js`.
45
-
46
- O codemod `scripts/migrate-fokus.mjs` ajuda a converter a versão anterior do
47
- framework. Execute-o primeiro com `--dry-run`, revise o diff e só então grave
48
- as alterações.
@@ -1,123 +0,0 @@
1
- # Guia de migração — vindo de outro framework CSS
2
-
3
- Este guia é para quem já usa **outro framework CSS de utilitários/componentes**
4
- (ex.: um framework baseado em classes utilitárias tipo `flex`/`gap-4`, ou um
5
- framework de componentes com prefixo `.btn`/`.card`/`.alert`) e quer migrar
6
- pro Fokus Styles. Ele mapeia os padrões de nomenclatura mais comuns do
7
- ecossistema pros equivalentes do FokusStyles — não é uma migração automatizada
8
- (classes e comportamento não são 1:1 em todo canto), mas cobre os casos mais
9
- frequentes.
10
-
11
- > Procurando pela migração de uma versão **antiga do FokusStyles** (rename da
12
- > API pública pra prefixo `fs-`) para a v1.0.0? Isso é
13
- > [`migration-v1.md`](migration-v1.md), um guia diferente.
14
-
15
- ## Como o FokusStyles nomeia as coisas
16
-
17
- Duas convenções fixas, sem exceção, ajudam a prever qualquer classe sem
18
- decorar a lista inteira:
19
-
20
- - **Componentes**: prefixo `fs-` (`.fs-btn`, `.fs-card`, `.fs-modal`).
21
- - **Utilitários** (uma propriedade CSS por classe): prefixo `fs-u-` (`.fs-u-d-flex`,
22
- `.fs-u-mt-3`, `.fs-u-text-center`).
23
-
24
- Responsividade é sempre um infixo de breakpoint antes do valor:
25
- `.fs-u-d{-sm|-md|-lg|-xl|-xxl}-flex`, `.fs-u-mt-lg-4` — nunca um prefixo diferente
26
- por breakpoint.
27
-
28
- ## Utilitários de layout (flexbox/grid/spacing)
29
-
30
- Framework baseados em classes utilitárias atômicas costumam usar nomes
31
- curtos sem prefixo (`flex`, `gap-4`, `p-2`) ou com prefixo de uma letra
32
- (`d-flex`, `mt-3`, já familiar a quem vem de um framework de componentes com
33
- utilitários auxiliares). O FokusStyles usa **nomes completos com prefixo `fs-u-`**,
34
- priorizando previsibilidade sobre brevidade:
35
-
36
- | Padrão comum no ecossistema | Fokus Styles | Observação |
37
- |---|---|---|
38
- | `flex` / `d-flex` | `.fs-u-d-flex` | Idem `.fs-u-d-block`, `.fs-u-d-none`, `.fs-u-d-inline-block`. |
39
- | `items-center` / `align-items-center` | `.fs-u-align-items-center` | Também `-start`/`-end`. |
40
- | `justify-between` / `justify-content-between` | `.fs-u-justify-content-between` | Também `-start`/`-center`/`-end`/`-around`. |
41
- | `gap-4` / `gap-3` (escala 0–5) | `.fs-u-gap-4` | Escala de espaçamento própria — ver [tokens](../reference/design-tokens.md) pro mapa `$spacers`; não é 1:1 numérico com a escala de outros frameworks. |
42
- | `m-4`, `mt-2`, `mx-auto` | `.fs-u-m-4`, `.fs-u-mt-2`, `.fs-u-mx-auto` | Mesmo padrão de abreviação (`m`/`mt`/`mr`/`mb`/`ml`/`mx`/`my`) já usado por frameworks de componentes com utilitários auxiliares — só troca o prefixo pra `fs-u-`. |
43
- | `p-4`, `px-3`, `py-2` | `.fs-u-p-4`, `.fs-u-px-3`, `.fs-u-py-2` | Idem acima, para padding. |
44
- | `text-center` | `.fs-u-text-center` | Também `-start`/`-end`. |
45
- | `font-bold` / `fw-bold` | `.fs-u-fw-bold` | Também `-regular`/`-medium`/`-semibold`. |
46
- | `text-lg` / `fs-5` | `.fs-u-fs-lg` | Escala nomeada (`xs`/`sm`/`md`/`lg`/`xl`/`h1`…`h6`), não numérica. |
47
- | `hidden` / `d-none` | `.fs-u-d-none` | Oculta via `display: none` (remove do layout e da árvore de acessibilidade). |
48
- | `invisible` | `.fs-u-invisible` | `visibility: hidden` — reserva o espaço no layout, ao contrário de `.fs-u-d-none`. |
49
- | `container` | `.fs-container` | Componente de layout, não utilitário — ver seção seguinte. |
50
- | `row` / `grid grid-cols-12` | `.fs-row` | Grid flexbox de 12 colunas, não CSS Grid. |
51
- | `col`, `col-6`, `col-md-4` | `.fs-col`, `.fs-col-6`, `.fs-col-md-4` | Mesma lógica de frações de 12 colunas com infixo de breakpoint. |
52
-
53
- Para stack/cluster/sidebar/sticky/container-queries (utilitários de layout
54
- mais recentes, sem equivalente direto e estabelecido em frameworks mais
55
- antigos), veja o guia dedicado
56
- [`layout-advanced.md`](layout-advanced.md) — não há "de onde migrar" porque
57
- são aditivos, não substituem nada que você já tinha.
58
-
59
- ## Componentes
60
-
61
- Frameworks de componentes tradicionalmente usam classes curtas sem prefixo
62
- (`.btn`, `.card`, `.alert`); frameworks só-utilitários normalmente não têm
63
- esse conceito (você compõe o visual de um botão a partir de utilitários) —
64
- o FokusStyles segue o primeiro modelo, com o prefixo `fs-` obrigatório em todos:
65
-
66
- | Padrão comum (framework de componentes) | Fokus Styles |
67
- |---|---|
68
- | `.btn`, `.btn.btn-primary` | `.fs-btn`, `.fs-btn.fs-btn-primary` |
69
- | `.btn-outline-primary` | `.fs-btn-outline-primary` |
70
- | `.btn-sm`, `.btn-lg` | `.fs-btn-sm`, `.fs-btn-lg` |
71
- | `.card`, `.card-header`, `.card-body`, `.card-footer` | `.fs-card`, `.fs-card-header`, `.fs-card-body`, `.fs-card-footer` |
72
- | `.alert.alert-danger` | `.fs-alert.fs-alert-danger` |
73
- | `.badge.bg-primary` / `.badge.badge-primary` | `.fs-badge.fs-badge-primary` |
74
- | `.table.table-striped` | `.fs-table.fs-table-striped` |
75
- | `.modal`, `.modal-dialog`, `.modal-body` | `.fs-modal`, `.fs-modal-dialog`, `.fs-modal-body` — ver [modal.md](../components/modal.md) pra diferenças de API JS |
76
- | `.dropdown-menu`, `.dropdown-item` | `.fs-dropdown-menu`, `.fs-dropdown-item` |
77
- | `.form-control` | `.fs-form-control` |
78
-
79
- Se você está migrando de um framework só-utilitários (sem classes de
80
- componente prontas), o ponto de partida é o oposto: em vez de recompor cada
81
- botão/card a partir de utilitários, procure o componente FokusStyles equivalente
82
- em [`docs/components/`](../components/) — geralmente é menos código, não
83
- mais.
84
-
85
- ## O que **não** migra 1:1
86
-
87
- - **API JavaScript**: nomes de método/evento são específicos do FokusStyles
88
- (`data-fs="modal"`, `FokusStyles.Modal.getInstance()`, eventos
89
- `fs:modal:shown`) — não há compatibilidade de API com nenhum outro
90
- framework. Veja a página de cada componente em
91
- [`docs/components/`](../components/) pra API completa.
92
- - **Escala de espaçamento/tipografia**: os valores numéricos
93
- (`fs-u-gap-4`, `fs-u-fs-lg`) seguem a escala própria do FokusStyles
94
- (`$spacers`/`$font-size-*`), não a de nenhum outro framework — não
95
- assuma que `gap-4` de outro lugar é visualmente idêntico a `.fs-u-gap-4`
96
- aqui, mesmo com o nome parecido.
97
- - **Grid**: `.fs-row`/`.fs-col-*` é flexbox de 12 colunas, não CSS Grid —
98
- se você vem de um framework CSS Grid nativo (`grid-cols-12`), o modelo
99
- mental de "colunas fluem e quebram linha" é diferente de "células fixas
100
- numa grade".
101
- - **Tema/dark mode**: o FokusStyles usa `data-theme="dark"` num ancestral
102
- (não uma classe `.dark` no `<html>`) — ver [`dark-mode.md`](dark-mode.md).
103
- - **Build/configuração**: não há arquivo de configuração JS central
104
- (customização é via variáveis Sass — `$primitives`, `$spacers` etc.) —
105
- ver [`scss-architecture.md`](../reference/scss-architecture.md).
106
-
107
- ## Checklist de migração
108
-
109
- 1. Troque classes de utilitário: adicione o prefixo `fs-u-` e expanda
110
- abreviações de uma letra pro nome completo mais próximo da tabela acima
111
- (`flex` → `fs-u-d-flex`, não existe atalho de uma letra no FokusStyles).
112
- 2. Troque classes de componente: adicione o prefixo `fs-` em todas
113
- (`.btn` → `.fs-btn`, incluindo variantes: `.btn-primary` → `.fs-btn-primary`).
114
- 3. Rode `npm run lint:scss` (se você também copiou SCSS customizado — o
115
- FokusStyles usa Stylelint com `stylelint-config-standard-scss`) e
116
- `npm run test:visual` (se tiver mockups próprios) pra pegar
117
- divergências visuais cedo.
118
- 4. Refaça a integração JS pelos `data-fs="*"`/`data-fs-target`/eventos
119
- `fs:*` — não existe camada de compatibilidade com a API de outro
120
- framework.
121
- 5. Revise a matriz de [suporte a navegadores](../reference/browser-support.md)
122
- se seu projeto anterior mirava um alvo diferente (ex.: IE11) — o FokusStyles
123
- não suporta IE11 e usa `@layer`/OKLCH nativamente.