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,18 +0,0 @@
1
- # Contribuindo
2
-
3
- O guia de contribuição vive na raiz do repositório —
4
- [`CONTRIBUTING.md`](../../CONTRIBUTING.md) — para o GitHub linkar
5
- automaticamente em issues/PRs. Cobre:
6
-
7
- - Pré-requisitos e setup local.
8
- - Scripts (`build`, `lint`, `test`, `test:visual`, `test:a11y`, `contrast`,
9
- `size`, `docs:check`).
10
- - Convenções de SCSS e o fluxo pra criar um componente novo.
11
- - Contrato editorial: cada componente precisa manter implementação, exemplo,
12
- documentação, testes e acessibilidade alinhados.
13
- - Semver e política de depreciação.
14
- - Checklist de Pull Request.
15
-
16
- Ver também: [Código de Conduta](../../CODE_OF_CONDUCT.md),
17
- [templates de issue](../../.github/ISSUE_TEMPLATE/) e o
18
- [template de Pull Request](../../.github/PULL_REQUEST_TEMPLATE.md).
@@ -1,70 +0,0 @@
1
- # Instalação
2
-
3
- ## Via npm
4
-
5
- ```bash
6
- npm install fokus-styles
7
- ```
8
-
9
- ## Via CDN
10
-
11
- Sem instalar nada, direto do jsDelivr ou unpkg:
12
-
13
- ```html
14
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/fokus-styles/dist/css/fokus.css">
15
- <script src="https://cdn.jsdelivr.net/npm/fokus-styles/dist/js/fokus.js"></script>
16
- ```
17
-
18
- Troque `fokus.css`/`fokus.js` por `fokus.min.css`/`fokus.min.js` para as
19
- versões minificadas em produção.
20
-
21
- ## Fontes self-hosted
22
-
23
- Plus Jakarta Sans (sans) e Source Code Pro (mono) são distribuídas à parte,
24
- em `fonts.css`, para não forçar o download das fontes em quem prefere usar
25
- as próprias. Inclua **antes** do CSS principal:
26
-
27
- ```html
28
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/fokus-styles/dist/css/fonts.css">
29
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/fokus-styles/dist/css/fokus.css">
30
- ```
31
-
32
- Sem `fonts.css`, a tipografia cai no fallback `sans-serif`/`monospace` do
33
- sistema — nada quebra, só muda a fonte.
34
-
35
- ## Distribuições disponíveis
36
-
37
- O pacote publica o bundle completo (`fokus.css`) e distribuições granulares,
38
- para quem não precisa do framework inteiro:
39
-
40
- | Arquivo | Conteúdo |
41
- |---|---|
42
- | `dist/css/fokus.css` | Bundle completo: tokens, reset, layout, forms, components, utilities, tema escuro. |
43
- | `dist/css/layout.css` | Só grid/containers (+ tokens/reset/tema). |
44
- | `dist/css/forms.css` | Só formulários (+ tokens/reset/tema). |
45
- | `dist/css/components.css` | Só componentes prontos (+ tokens/reset/tema). |
46
- | `dist/css/helpers.css` | Só utilitários atômicos (+ tokens/reset/tema). |
47
- | `dist/css/fonts.css` | Só os `@font-face` self-hosted (opcional, ver acima). |
48
- | `dist/js/fokus.js` | Todo o JavaScript dos componentes interativos, IIFE global `FokusStyles`. |
49
-
50
- Cada distribuição CSS granular já inclui tokens, reset e tema escuro
51
- completos — pode ser usada isoladamente sem quebrar variáveis ou dark mode.
52
-
53
- ## Import via Sass
54
-
55
- Para compilar com suas próprias variáveis Sass (sobrescrever antes de
56
- compilar, em vez de sobrescrever CSS Custom Properties depois):
57
-
58
- ```scss
59
- @use "fokus-styles/scss/fokus" with (
60
- $radius-md: 10px
61
- );
62
- ```
63
-
64
- Ver [`docs/reference/scss-architecture.md`](../reference/scss-architecture.md)
65
- para a lista completa de variáveis e a organização dos módulos.
66
-
67
- ## Próximo passo
68
-
69
- [Formas de uso](usage.md) — como inicializar componentes interativos e a
70
- convenção de nomenclatura de classes.
@@ -1,105 +0,0 @@
1
- # Formas de uso
2
-
3
- ## Convenção de nomenclatura
4
-
5
- | Prefixo | Papel | Exemplo |
6
- |---|---|---|
7
- | `.fs-*` | Componente (estrutura/aparência) | `.fs-btn`, `.fs-card`, `.fs-modal` |
8
- | `.fs-u-*` | Utilitário atômico | `.fs-u-d-flex`, `.fs-u-mt-3`, `.fs-u-gx-2` |
9
- | `.is-*` | Estado, controlado por você ou por JS | `.is-active`, `.is-disabled`, `.is-open` |
10
- | `--fs-*` | Token CSS (Custom Property) | `--fs-color-primary`, `--fs-radius-md` |
11
- | `data-fs` | Auto-init de componente interativo | `data-fs="modal"` |
12
- | `data-fs-target`/`data-fs-dismiss` | Alvo/dispensa de componente interativo | `data-fs-target="#meuModal"` |
13
- | `fs:*` | Evento DOM customizado disparado por um componente | `fs:modal:shown` |
14
-
15
- Essa separação existe para o framework nunca colidir com classes de outras
16
- bibliotecas/CSS na mesma página — ver
17
- [`docs/reference/scss-architecture.md`](../reference/scss-architecture.md#cascade-layers-layer)
18
- para como isso se reflete em cascade layers.
19
-
20
- ## Auto-init de componentes interativos
21
-
22
- Todo componente que precisa de JavaScript se inicializa sozinho ao carregar
23
- a página, a partir do atributo `data-fs="<nome>"` no elemento raiz — não é
24
- preciso chamar `new FokusStyles.Algo(...)` manualmente:
25
-
26
- ```html
27
- <button type="button" class="fs-btn" data-fs-target="#meuModal">Abrir</button>
28
-
29
- <div class="fs-modal" data-fs="modal" id="meuModal">
30
- <div class="fs-modal-dialog">
31
- <div class="fs-modal-content">
32
- <div class="fs-modal-body">Conteúdo.</div>
33
- </div>
34
- </div>
35
- </div>
36
-
37
- <script src="dist/js/fokus.js"></script>
38
- ```
39
-
40
- O auto-init roda em `DOMContentLoaded` (ou imediatamente, se o script for
41
- carregado depois que o DOM já terminou) e é idempotente — chamar de novo não
42
- cria uma segunda instância no mesmo elemento.
43
-
44
- ## API comum aos componentes interativos
45
-
46
- A maioria segue a mesma forma, acessível via `getInstance()`:
47
-
48
- ```js
49
- const modal = FokusStyles.Modal.getInstance(document.getElementById("meuModal"));
50
- modal.show();
51
- modal.hide();
52
- modal.toggle();
53
- modal.dispose(); // remove listeners e o registro da instância
54
- ```
55
-
56
- - `getInstance(el)` — retorna a instância já criada para aquele elemento
57
- (`undefined` se não houver, ou se `data-fs` nunca esteve presente e você
58
- precisa instanciar manualmente com `new FokusStyles.Nome(el)`).
59
- - `show()`/`hide()`/`toggle()` — nem todo componente tem os três (ex.:
60
- Tabs usa `show(tabEl)` para trocar a aba ativa; Tag só tem `dismiss()`).
61
- Ver a página de cada componente em [Componentes](../README.md#componentes)
62
- para a API exata.
63
- - `dispose()` — remove os listeners e desregistra a instância; o elemento
64
- em si não é removido do DOM (exceto onde a própria natureza do componente
65
- implica remoção, como `Tag.dismiss()`).
66
-
67
- Uma exceção à regra: **Alert Dialog** não usa `data-fs`/`getInstance()` — é
68
- 100% programático, via `FokusStyles.confirm({ title, message, ... })`, que
69
- retorna uma Promise. Ver
70
- [`../components/alert-dialog.md`](../components/alert-dialog.md).
71
-
72
- ## Eventos
73
-
74
- Componentes disparam eventos DOM customizados, no padrão
75
- `fs:<componente>:<ação>` (particípio: `shown`/`hidden`/`changed`...),
76
- sempre com `bubbles: true` — escute no documento ou em qualquer ancestral:
77
-
78
- ```js
79
- document.addEventListener("fs:modal:shown", (event) => {
80
- console.log("modal aberto:", event.target);
81
- });
82
- ```
83
-
84
- Alguns eventos são **canceláveis** (`cancelable: true`) — chamar
85
- `event.preventDefault()` no handler impede a ação (ex.: `fs:tag:dismissed`
86
- cancela a remoção da tag). A documentação de cada componente lista quais
87
- eventos existem e se são canceláveis.
88
-
89
- ## Import via ES modules
90
-
91
- Além do bundle IIFE (`dist/js/fokus.js`, global `FokusStyles`), os módulos
92
- individuais são importáveis via `fokus-styles/js/*`:
93
-
94
- ```js
95
- import { Modal } from "fokus-styles/js/modal.js";
96
- ```
97
-
98
- Útil para bundlers que fazem tree-shaking — importar só o que usa em vez do
99
- JS inteiro.
100
-
101
- ## Próximo passo
102
-
103
- [Componentes](../README.md#componentes) — catálogo completo, ou
104
- [Theming](../guides/theming.md) para customizar cores/tipografia/raio sem
105
- fork.
@@ -1,109 +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
- Para Checkbox, Radio e Switch, mantenha o input nativo e associe o texto com
88
- `for`/`id`. Opções relacionadas devem ficar em `fieldset` com `legend`.
89
- Mensagens de ajuda e erro devem ser referenciadas por `aria-describedby`, e
90
- um campo inválido pode usar `aria-invalid="true"` junto de `.is-invalid`.
91
- Switch não recebe `role="switch"` automaticamente; a semântica oficial é a
92
- do checkbox nativo, inclusive para a tecla `Space`.
93
-
94
- ## Testes automatizados
95
-
96
- A regressão visual (`npm run test:visual`, Playwright) cobre
97
- carregamento/interação sem erros de console, mas não é um gate de
98
- acessibilidade. `npm run test:a11y` roda o axe-core (regras WCAG 2.1 A/AA)
99
- contra cada laboratório em `mockup/*.html` (claro e escuro) e contra as
100
- fontes executáveis em `mockup/examples/*.html`; o build falha ao encontrar
101
- violações (nome acessível ausente, contraste insuficiente, papel ARIA
102
- inválido etc.) — roda no CI a cada PR. Veja a cobertura por componente na
103
- [matriz de acessibilidade](../reference/accessibility-matrix.md).
104
-
105
- Mesmo com o gate automatizado, valide manualmente com um leitor de tela e
106
- navegação só por teclado antes de considerar um componente pronto — axe
107
- cobre um subconjunto de regras verificáveis por máquina (contraste, nomes,
108
- papéis), não a experiência real de uso (ordem de leitura, clareza dos
109
- 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`.