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.
- package/package.json +17 -15
- package/CHANGELOG.md +0 -940
- package/dist/css/components.css.map +0 -1
- package/dist/css/components.min.css.map +0 -1
- package/dist/css/fokus-components.css.map +0 -1
- package/dist/css/fokus-components.min.css.map +0 -1
- package/dist/css/fokus-core.css.map +0 -1
- package/dist/css/fokus-core.min.css.map +0 -1
- package/dist/css/fokus-dark.css.map +0 -1
- package/dist/css/fokus-dark.min.css.map +0 -1
- package/dist/css/fokus-rtl.css.map +0 -1
- package/dist/css/fokus-rtl.min.css.map +0 -1
- package/dist/css/fokus-utilities.css.map +0 -1
- package/dist/css/fokus-utilities.min.css.map +0 -1
- package/dist/css/fokus.css.map +0 -1
- package/dist/css/fokus.min.css.map +0 -1
- package/dist/css/fonts.css.map +0 -1
- package/dist/css/fonts.min.css.map +0 -1
- package/dist/css/forms.css.map +0 -1
- package/dist/css/forms.min.css.map +0 -1
- package/dist/css/helpers.css.map +0 -1
- package/dist/css/helpers.min.css.map +0 -1
- package/dist/css/layout.css.map +0 -1
- package/dist/css/layout.min.css.map +0 -1
- package/dist/js/fokus.js.map +0 -7
- package/dist/js/fokus.min.js.map +0 -7
- package/docs/README.md +0 -86
- package/docs/comparison.md +0 -124
- package/docs/components/accordion.md +0 -104
- package/docs/components/alert-dialog.md +0 -99
- package/docs/components/alert.md +0 -104
- package/docs/components/avatar.md +0 -13
- package/docs/components/badge.md +0 -101
- package/docs/components/breadcrumb.md +0 -93
- package/docs/components/button-group.md +0 -13
- package/docs/components/button.md +0 -98
- package/docs/components/card.md +0 -111
- package/docs/components/carousel.md +0 -167
- package/docs/components/checkbox.md +0 -110
- package/docs/components/close-button.md +0 -13
- package/docs/components/code.md +0 -13
- package/docs/components/collapse.md +0 -78
- package/docs/components/combobox.md +0 -123
- package/docs/components/command-palette.md +0 -131
- package/docs/components/datatable.md +0 -173
- package/docs/components/datepicker.md +0 -137
- package/docs/components/divider.md +0 -57
- package/docs/components/dropdown.md +0 -103
- package/docs/components/empty-state.md +0 -65
- package/docs/components/file-upload-advanced.md +0 -116
- package/docs/components/file-upload.md +0 -93
- package/docs/components/icon-link.md +0 -13
- package/docs/components/input-group.md +0 -73
- package/docs/components/input.md +0 -90
- package/docs/components/list-group.md +0 -13
- package/docs/components/modal.md +0 -120
- package/docs/components/navbar.md +0 -74
- package/docs/components/nested-menu.md +0 -90
- package/docs/components/notification-center.md +0 -116
- package/docs/components/offcanvas.md +0 -102
- package/docs/components/pagination.md +0 -145
- package/docs/components/placeholder.md +0 -13
- package/docs/components/popover.md +0 -118
- package/docs/components/progress.md +0 -126
- package/docs/components/radio.md +0 -80
- package/docs/components/range.md +0 -83
- package/docs/components/rating.md +0 -91
- package/docs/components/ratio.md +0 -13
- package/docs/components/responsive.md +0 -19
- package/docs/components/scrollspy.md +0 -13
- package/docs/components/segmented-control.md +0 -82
- package/docs/components/select.md +0 -89
- package/docs/components/skeleton.md +0 -70
- package/docs/components/stepper.md +0 -107
- package/docs/components/switch.md +0 -97
- package/docs/components/table.md +0 -90
- package/docs/components/tabs.md +0 -104
- package/docs/components/tag.md +0 -144
- package/docs/components/tile.md +0 -112
- package/docs/components/timeline.md +0 -78
- package/docs/components/toast.md +0 -108
- package/docs/components/tooltip.md +0 -113
- package/docs/components/tree-view.md +0 -118
- package/docs/contributing/contributing.md +0 -18
- package/docs/getting-started/installation.md +0 -70
- package/docs/getting-started/usage.md +0 -105
- package/docs/guides/accessibility.md +0 -109
- package/docs/guides/charts.md +0 -73
- package/docs/guides/dark-mode.md +0 -90
- package/docs/guides/icons.md +0 -99
- package/docs/guides/javascript-api.md +0 -9
- package/docs/guides/layout-advanced.md +0 -118
- package/docs/guides/migration-clarus-to-fokus.md +0 -48
- package/docs/guides/migration-external.md +0 -123
- package/docs/guides/migration-v1.md +0 -63
- package/docs/guides/print.md +0 -30
- package/docs/guides/rtl-and-system-preferences.md +0 -28
- package/docs/guides/theming.md +0 -140
- package/docs/guides/utility-api.md +0 -9
- package/docs/prompts/prompt-plan.md +0 -45
- package/docs/reference/accessibility-matrix.md +0 -77
- package/docs/reference/browser-support.md +0 -75
- package/docs/reference/contrast-report.md +0 -54
- package/docs/reference/definitions.md +0 -868
- package/docs/reference/design-tokens.md +0 -208
- package/docs/reference/scss-architecture.md +0 -227
- package/docs/reference/size-baseline.json +0 -34
- package/docs/reference/stability.md +0 -89
- package/docs/showcase.md +0 -25
- package/mockup/README.md +0 -41
- package/mockup/assets/carousel-planning.png +0 -0
- package/mockup/assets/carousel-workspace.png +0 -0
- package/mockup/assets/example-theme.css +0 -19
- package/mockup/assets/example-theme.js +0 -11
- package/mockup/assets/showcase-contracts.js +0 -84
- package/mockup/assets/showcase.css +0 -91
- package/mockup/assets/showcase.js +0 -724
- package/mockup/content-data.html +0 -9
- package/mockup/examples/accordion-tabs-toast.html +0 -149
- package/mockup/examples/alert-dialog.html +0 -84
- package/mockup/examples/alerts.html +0 -115
- package/mockup/examples/badges-alerts.html +0 -109
- package/mockup/examples/buttons.html +0 -58
- package/mockup/examples/cards.html +0 -132
- package/mockup/examples/carousel.html +0 -126
- package/mockup/examples/charts.html +0 -102
- package/mockup/examples/check-radio-switch.html +0 -620
- package/mockup/examples/collapse.html +0 -69
- package/mockup/examples/combobox.html +0 -60
- package/mockup/examples/command-palette.html +0 -64
- package/mockup/examples/datatable.html +0 -113
- package/mockup/examples/datepicker.html +0 -62
- package/mockup/examples/divider.html +0 -45
- package/mockup/examples/dropdown-tooltip.html +0 -77
- package/mockup/examples/empty-state.html +0 -56
- package/mockup/examples/file-drop.html +0 -74
- package/mockup/examples/file-upload-advanced.html +0 -68
- package/mockup/examples/forms-advanced.html +0 -77
- package/mockup/examples/hover-card.html +0 -86
- package/mockup/examples/icons.html +0 -157
- package/mockup/examples/input-group.html +0 -74
- package/mockup/examples/js-foundation.html +0 -215
- package/mockup/examples/layout.html +0 -134
- package/mockup/examples/modal-select.html +0 -127
- package/mockup/examples/nested-menu.html +0 -73
- package/mockup/examples/notification-center.html +0 -86
- package/mockup/examples/offcanvas-popover.html +0 -133
- package/mockup/examples/pagination-breadcrumbs.html +0 -92
- package/mockup/examples/popover.html +0 -81
- package/mockup/examples/range.html +0 -69
- package/mockup/examples/rating.html +0 -103
- package/mockup/examples/segmented-control.html +0 -96
- package/mockup/examples/skeletons.html +0 -82
- package/mockup/examples/spinner-progress.html +0 -130
- package/mockup/examples/stepper.html +0 -119
- package/mockup/examples/tables-navbar.html +0 -89
- package/mockup/examples/tag.html +0 -115
- package/mockup/examples/theming.html +0 -68
- package/mockup/examples/tile.html +0 -107
- package/mockup/examples/timeline.html +0 -108
- package/mockup/examples/toast.html +0 -113
- package/mockup/examples/tooltip.html +0 -68
- package/mockup/examples/tree-view.html +0 -68
- package/mockup/feedback-actions.html +0 -9
- package/mockup/forms.html +0 -13
- package/mockup/foundations.html +0 -7
- package/mockup/kitchen-sink.html +0 -696
- package/mockup/navigation-disclosure.html +0 -11
- package/mockup/overlays-commands.html +0 -12
- package/mockup/templates/README.md +0 -20
- package/mockup/templates/admin.html +0 -334
- package/mockup/templates/auth.html +0 -234
- package/mockup/templates/dashboard.html +0 -442
- package/mockup/templates/landing.html +0 -397
- package/packages/fokus-icons/package.json +0 -46
- package/scripts/migrate-fokus-map.json +0 -1366
- package/scripts/migrate-fokus.mjs +0 -97
|
@@ -1,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).
|
package/docs/guides/charts.md
DELETED
|
@@ -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.
|
package/docs/guides/dark-mode.md
DELETED
|
@@ -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.
|
package/docs/guides/icons.md
DELETED
|
@@ -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`.
|