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.
- package/dist/css/components.css +561 -83
- package/dist/css/components.min.css +1 -1
- package/dist/css/fokus-components.css +561 -83
- package/dist/css/fokus-components.min.css +1 -1
- package/dist/css/fokus-rtl.css +697 -83
- package/dist/css/fokus-rtl.min.css +1 -1
- package/dist/css/fokus-utilities.css +136 -0
- package/dist/css/fokus-utilities.min.css +1 -1
- package/dist/css/fokus.css +996 -258
- package/dist/css/fokus.min.css +1 -1
- package/dist/css/forms.css +300 -176
- package/dist/css/forms.min.css +1 -1
- package/dist/css/helpers.css +136 -0
- package/dist/css/helpers.min.css +1 -1
- package/dist/js/fokus.js +270 -25
- package/dist/js/fokus.min.js +18 -18
- package/package.json +17 -15
- package/packages/fokus-components/scss/components/_alerts.scss +128 -6
- package/packages/fokus-components/scss/components/_badges.scss +26 -10
- package/packages/fokus-components/scss/components/_index.scss +1 -0
- package/packages/fokus-components/scss/components/_popover.scss +131 -21
- package/packages/fokus-components/scss/components/_responsive.scss +23 -0
- package/packages/fokus-components/scss/components/_tag.scss +37 -14
- package/packages/fokus-components/scss/components/_toasts.scss +156 -11
- package/packages/fokus-components/scss/components/_tooltips.scss +70 -18
- package/packages/fokus-components/scss/forms/_check-radio-switch.scss +313 -215
- package/packages/fokus-components/scss/forms/_forms.scss +16 -0
- package/packages/fokus-js/js/carousel.d.ts +4 -0
- package/packages/fokus-js/js/carousel.js +8 -0
- package/packages/fokus-js/js/core/positioning.js +18 -9
- package/packages/fokus-js/js/dropdown.d.ts +4 -0
- package/packages/fokus-js/js/dropdown.js +7 -0
- package/packages/fokus-js/js/popover.js +26 -1
- package/packages/fokus-js/js/tabs.d.ts +3 -0
- package/packages/fokus-js/js/tabs.js +5 -0
- package/packages/fokus-js/js/tag.js +17 -0
- package/packages/fokus-js/js/toast.js +77 -3
- package/packages/fokus-js/js/tooltip.d.ts +8 -1
- package/packages/fokus-js/js/tooltip.js +106 -13
- package/packages/fokus-utilities/scss/utilities/_api.scss +48 -0
- package/CHANGELOG.md +0 -910
- 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 -59
- package/docs/components/avatar.md +0 -13
- package/docs/components/badge.md +0 -82
- 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 -97
- 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 -105
- package/docs/components/progress.md +0 -126
- package/docs/components/radio.md +0 -70
- package/docs/components/range.md +0 -83
- package/docs/components/rating.md +0 -91
- package/docs/components/ratio.md +0 -13
- 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 -75
- package/docs/components/table.md +0 -90
- package/docs/components/tabs.md +0 -104
- package/docs/components/tag.md +0 -129
- package/docs/components/tile.md +0 -112
- package/docs/components/timeline.md +0 -78
- package/docs/components/toast.md +0 -95
- package/docs/components/tooltip.md +0 -77
- 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 -102
- 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 -50
- package/docs/reference/definitions.md +0 -864
- package/docs/reference/design-tokens.md +0 -194
- 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 -8
- 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 -41
- package/mockup/examples/badges-alerts.html +0 -77
- 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 -144
- 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/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 -105
- package/mockup/examples/theming.html +0 -68
- package/mockup/examples/tile.html +0 -107
- package/mockup/examples/timeline.html +0 -108
- 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,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).
|
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`.
|
|
@@ -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.
|