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
package/docs/components/modal.md
DELETED
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
# Modal
|
|
2
|
-
|
|
3
|
-
Diálogo sobreposto à página inteira, com focus trap, `Escape` e clique
|
|
4
|
-
fora pra fechar. Base do [Alert Dialog](alert-dialog.md).
|
|
5
|
-
|
|
6
|
-
## Visão geral
|
|
7
|
-
|
|
8
|
-
```html
|
|
9
|
-
<button type="button" class="fs-btn fs-btn-primary" data-fs="modal" data-fs-target="#meuModal">
|
|
10
|
-
Abrir modal
|
|
11
|
-
</button>
|
|
12
|
-
|
|
13
|
-
<div class="fs-modal" id="meuModal">
|
|
14
|
-
<div class="fs-modal-dialog">
|
|
15
|
-
<div class="fs-modal-content">
|
|
16
|
-
<div class="fs-modal-header">
|
|
17
|
-
<h3 class="fs-modal-title">Título</h3>
|
|
18
|
-
<button type="button" class="fs-btn-close" data-fs-dismiss="modal" aria-label="Fechar"></button>
|
|
19
|
-
</div>
|
|
20
|
-
<div class="fs-modal-body">Conteúdo do modal.</div>
|
|
21
|
-
<div class="fs-modal-footer">
|
|
22
|
-
<button type="button" class="fs-btn" data-fs-dismiss="modal">Cancelar</button>
|
|
23
|
-
<button type="button" class="fs-btn fs-btn-primary">Confirmar</button>
|
|
24
|
-
</div>
|
|
25
|
-
</div>
|
|
26
|
-
</div>
|
|
27
|
-
</div>
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
`data-fs` vai no **gatilho** (o botão que abre), não no `.fs-modal` — ao
|
|
31
|
-
contrário da maioria dos outros componentes.
|
|
32
|
-
|
|
33
|
-
## Anatomia
|
|
34
|
-
|
|
35
|
-
Gatilho (`data-fs="modal"` + `data-fs-target`) + `.fs-modal` (overlay de
|
|
36
|
-
tela cheia, centraliza o conteúdo) > `.fs-modal-dialog` (limita a largura)
|
|
37
|
-
> `.fs-modal-content` (card visual) > `.fs-modal-header` (título +
|
|
38
|
-
`.fs-btn-close`, opcional) + `.fs-modal-body` (rola internamente se o
|
|
39
|
-
conteúdo for maior que a viewport) + `.fs-modal-footer` (ações, opcional).
|
|
40
|
-
|
|
41
|
-
## Variações
|
|
42
|
-
|
|
43
|
-
Tamanho do diálogo: `.fs-modal-sm` (320px), `.fs-modal-lg` (720px) em
|
|
44
|
-
`.fs-modal-dialog`; sem sufixo = 480px (padrão).
|
|
45
|
-
|
|
46
|
-
```html
|
|
47
|
-
<div class="fs-modal-dialog fs-modal-lg">...</div>
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
## Estados
|
|
51
|
-
|
|
52
|
-
`.is-open` no `.fs-modal` — controlado pelo JS.
|
|
53
|
-
|
|
54
|
-
**Backdrop estático** (`data-backdrop="static"` no `.fs-modal`): desativa
|
|
55
|
-
fechamento por `Escape` e clique fora — só um `data-fs-dismiss="modal"`
|
|
56
|
-
explícito fecha. Use para fluxos que exigem uma decisão explícita.
|
|
57
|
-
|
|
58
|
-
```html
|
|
59
|
-
<div class="fs-modal" id="modalCritico" data-backdrop="static">...</div>
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
## A11y
|
|
63
|
-
|
|
64
|
-
Use `.fs-modal-sm`, `.fs-modal-lg`, `.fs-modal-xl`, `.fs-modal-fullscreen` e
|
|
65
|
-
`.fs-modal-scrollable` conforme o fluxo. Em telas menores o diálogo respeita safe areas.
|
|
66
|
-
|
|
67
|
-
Ao inicializar, o componente controla `aria-hidden` e, quando encontra
|
|
68
|
-
`.fs-modal-title`, cria automaticamente o vínculo `aria-labelledby`. Um
|
|
69
|
-
`id` existente no título é preservado.
|
|
70
|
-
|
|
71
|
-
`role="dialog"` + `aria-modal="true"` aplicados automaticamente. Ao abrir:
|
|
72
|
-
foco preso dentro do `.fs-modal-dialog` (`Tab`/`Shift+Tab` ciclam só entre
|
|
73
|
-
os elementos focáveis internos), primeiro elemento focável recebe foco,
|
|
74
|
-
scroll da página é bloqueado. Ao fechar: foco volta pro gatilho que abriu.
|
|
75
|
-
|
|
76
|
-
## API JS
|
|
77
|
-
|
|
78
|
-
Auto-init via `data-fs="modal"` **no gatilho**. `Modal.getInstance(triggerEl)`.
|
|
79
|
-
|
|
80
|
-
| Método | Descrição |
|
|
81
|
-
|---|---|
|
|
82
|
-
| `show()` | Abre, trava o scroll, ativa o focus trap. |
|
|
83
|
-
| `hide()` | Fecha, libera o scroll, devolve o foco ao gatilho. |
|
|
84
|
-
| `toggle()` | Alterna. |
|
|
85
|
-
| `dispose()` | Fecha se aberto, remove listeners, desregistra a instância. |
|
|
86
|
-
|
|
87
|
-
| Evento (no gatilho) | Cancelável | Quando |
|
|
88
|
-
|---|---|---|
|
|
89
|
-
| `fs:modal:shown` | Não | Depois de abrir. |
|
|
90
|
-
| `fs:modal:hidden` | Não | Depois de fechar (inclusive via Escape/clique fora). |
|
|
91
|
-
|
|
92
|
-
## Tokens
|
|
93
|
-
|
|
94
|
-
`--fs-color-surface`, `--fs-color-text`, `--fs-color-border`,
|
|
95
|
-
`--fs-radius-md`, `--fs-shadow-lg`.
|
|
96
|
-
|
|
97
|
-
## Exemplo
|
|
98
|
-
|
|
99
|
-
```html
|
|
100
|
-
<button type="button" class="fs-btn fs-btn-danger" data-fs="modal" data-fs-target="#confirmarExclusao">
|
|
101
|
-
Excluir
|
|
102
|
-
</button>
|
|
103
|
-
<div class="fs-modal" id="confirmarExclusao">
|
|
104
|
-
<div class="fs-modal-dialog fs-modal-sm">
|
|
105
|
-
<div class="fs-modal-content">
|
|
106
|
-
<div class="fs-modal-body">
|
|
107
|
-
<h3 class="fs-modal-title">Excluir item?</h3>
|
|
108
|
-
<p>Essa ação não pode ser desfeita.</p>
|
|
109
|
-
</div>
|
|
110
|
-
<div class="fs-modal-footer">
|
|
111
|
-
<button type="button" class="fs-btn" data-fs-dismiss="modal">Cancelar</button>
|
|
112
|
-
<button type="button" class="fs-btn fs-btn-danger">Excluir</button>
|
|
113
|
-
</div>
|
|
114
|
-
</div>
|
|
115
|
-
</div>
|
|
116
|
-
</div>
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
Para o mesmo padrão sem escrever HTML, ver [Alert Dialog](alert-dialog.md)
|
|
120
|
-
(`FokusStyles.confirm()`). Mockup: [laboratório do componente](../../mockup/overlays-commands.html#modal).
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
# Navbar
|
|
2
|
-
|
|
3
|
-
Barra de navegação horizontal estática — marca de um lado, links do outro.
|
|
4
|
-
Versão "crua": sem collapse/hambúrguer próprio para mobile e sem dropdown
|
|
5
|
-
embutido; para um menu suspenso dentro da navbar, combine com
|
|
6
|
-
[Dropdown](dropdown.md).
|
|
7
|
-
|
|
8
|
-
## Visão geral
|
|
9
|
-
|
|
10
|
-
```html
|
|
11
|
-
<nav class="fs-navbar">
|
|
12
|
-
<a href="#" class="fs-navbar-brand">Minha Marca</a>
|
|
13
|
-
<ul class="fs-navbar-nav">
|
|
14
|
-
<li><a href="#" class="fs-nav-link is-active">Início</a></li>
|
|
15
|
-
<li><a href="#" class="fs-nav-link">Produtos</a></li>
|
|
16
|
-
<li><a href="#" class="fs-nav-link is-disabled">Em breve</a></li>
|
|
17
|
-
</ul>
|
|
18
|
-
</nav>
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
## Anatomia
|
|
22
|
-
|
|
23
|
-
`.fs-navbar` (flex, `justify-content: space-between`, quebra linha se não
|
|
24
|
-
houver espaço) > `.fs-navbar-brand` (nome/logo) + `.fs-navbar-nav`
|
|
25
|
-
(`<ul>` sem marcadores) > `<li>` > `.fs-nav-link`.
|
|
26
|
-
|
|
27
|
-
`.fs-nav-link` é compartilhado com [Tabs](tabs.md) — o mesmo estilo de
|
|
28
|
-
link de navegação serve pros dois contextos.
|
|
29
|
-
|
|
30
|
-
## Variações
|
|
31
|
-
|
|
32
|
-
Nenhuma variação de cor/tamanho — a navbar é sempre o mesmo visual; a
|
|
33
|
-
composição (o que vai dentro) que muda.
|
|
34
|
-
|
|
35
|
-
## Estados
|
|
36
|
-
|
|
37
|
-
- `.fs-nav-link.is-active` — destaque de cor primária + peso de fonte
|
|
38
|
-
maior.
|
|
39
|
-
- `.fs-nav-link.is-disabled` — cor muted, não clicável.
|
|
40
|
-
|
|
41
|
-
## A11y
|
|
42
|
-
|
|
43
|
-
O padrão responsivo usa `.fs-navbar-toggler`, `.fs-navbar-collapse` e `data-fs-target`.
|
|
44
|
-
Mantenha `aria-expanded` e um nome acessível no botão.
|
|
45
|
-
|
|
46
|
-
- Use `<nav>` como elemento raiz (já no exemplo) — landmark de navegação
|
|
47
|
-
pra leitores de tela.
|
|
48
|
-
- Se houver mais de uma navbar na página, diferencie com
|
|
49
|
-
`aria-label="Navegação principal"` (ou similar) em cada `<nav>`.
|
|
50
|
-
|
|
51
|
-
## API JS
|
|
52
|
-
|
|
53
|
-
Nenhuma — 100% CSS.
|
|
54
|
-
|
|
55
|
-
## Tokens
|
|
56
|
-
|
|
57
|
-
`--fs-color-border` (borda inferior), `--fs-color-surface` (fundo),
|
|
58
|
-
`--fs-color-text`, `--fs-color-primary` (ativo), `--fs-color-muted`
|
|
59
|
-
(desabilitado), `--fs-radius-sm` (hover do link).
|
|
60
|
-
|
|
61
|
-
## Exemplo
|
|
62
|
-
|
|
63
|
-
```html
|
|
64
|
-
<nav class="fs-navbar" aria-label="Navegação principal">
|
|
65
|
-
<a href="#" class="fs-navbar-brand">FokusStyles</a>
|
|
66
|
-
<ul class="fs-navbar-nav">
|
|
67
|
-
<li><a href="#" class="fs-nav-link is-active">Dashboard</a></li>
|
|
68
|
-
<li><a href="#" class="fs-nav-link">Relatórios</a></li>
|
|
69
|
-
<li><a href="#" class="fs-nav-link">Configurações</a></li>
|
|
70
|
-
</ul>
|
|
71
|
-
</nav>
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
Mockup: [laboratório do componente](../../mockup/navigation-disclosure.html#navbar).
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
# Nested Menu
|
|
2
|
-
|
|
3
|
-
[Dropdown](dropdown.md) com submenus recursivos, quantos níveis quiser.
|
|
4
|
-
Reusa `.fs-dropdown-menu`/`.fs-dropdown-item` sem reestilizar — só adiciona
|
|
5
|
-
o posicionamento em cascata e a navegação por nível. Componente próprio
|
|
6
|
-
(não é o Dropdown com opção extra) porque a navegação por teclado é por
|
|
7
|
-
nível, não linear sobre todos os itens.
|
|
8
|
-
|
|
9
|
-
## Visão geral
|
|
10
|
-
|
|
11
|
-
```html
|
|
12
|
-
<button type="button" class="fs-btn fs-dropdown-toggle" data-fs="nested-menu" data-fs-target="#menu">
|
|
13
|
-
Arquivo
|
|
14
|
-
</button>
|
|
15
|
-
<div class="fs-dropdown-menu" id="menu">
|
|
16
|
-
<a href="#" class="fs-dropdown-item">Novo</a>
|
|
17
|
-
<div class="fs-dropdown-submenu">
|
|
18
|
-
<a href="#" class="fs-dropdown-item fs-dropdown-item-submenu">Exportar</a>
|
|
19
|
-
<div class="fs-dropdown-menu">
|
|
20
|
-
<a href="#" class="fs-dropdown-item">PDF</a>
|
|
21
|
-
<a href="#" class="fs-dropdown-item">CSV</a>
|
|
22
|
-
</div>
|
|
23
|
-
</div>
|
|
24
|
-
<a href="#" class="fs-dropdown-item">Fechar</a>
|
|
25
|
-
</div>
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## Anatomia
|
|
29
|
-
|
|
30
|
-
Gatilho + `.fs-dropdown-menu` (raiz) — cada submenu é
|
|
31
|
-
`.fs-dropdown-submenu` (âncora de posicionamento) envolvendo um
|
|
32
|
-
`.fs-dropdown-item.fs-dropdown-item-submenu` (o item que abre, com seta
|
|
33
|
-
lateral) seguido de outro `.fs-dropdown-menu` (o submenu em si, mesmo
|
|
34
|
-
padrão recursivamente).
|
|
35
|
-
|
|
36
|
-
## Variações
|
|
37
|
-
|
|
38
|
-
Mesmas de [Dropdown](dropdown.md) no gatilho raiz (`data-placement`,
|
|
39
|
-
`data-align`). Submenus não têm variação própria — abrem sempre à direita
|
|
40
|
-
do item pai, com flip automático para a esquerda se não couber (a classe
|
|
41
|
-
`.fs-dropdown-submenu-left` é aplicada/removida pelo JS, não escreva
|
|
42
|
-
manualmente).
|
|
43
|
-
|
|
44
|
-
## Estados
|
|
45
|
-
|
|
46
|
-
`.is-open` em cada `.fs-dropdown-menu` (raiz e submenus, independentes).
|
|
47
|
-
Só um submenu por nível fica aberto por vez — abrir um fecha os irmãos do
|
|
48
|
-
mesmo nível.
|
|
49
|
-
|
|
50
|
-
Abertura por **hover** é 100% CSS (`:hover` no `.fs-dropdown-submenu`);
|
|
51
|
-
por **clique/teclado** é controlada pelo JS, coexistindo sem conflito
|
|
52
|
-
(passar o mouse fecha ramos abertos por teclado que não estão no caminho
|
|
53
|
-
do hover).
|
|
54
|
-
|
|
55
|
-
## A11y
|
|
56
|
-
|
|
57
|
-
`role="menu"` em todo nível, `aria-haspopup="menu"` + `aria-expanded` em
|
|
58
|
-
todo item que abre submenu (sincronizados automaticamente). Teclado (com
|
|
59
|
-
foco num item do menu): `ArrowDown`/`ArrowUp` navegam no nível atual,
|
|
60
|
-
`ArrowRight` abre o submenu do item focado e move o foco pro primeiro item
|
|
61
|
-
dele, `ArrowLeft` fecha o submenu atual e devolve o foco ao item pai,
|
|
62
|
-
`Escape` fecha só o nível atual (se estiver num submenu) ou o menu inteiro
|
|
63
|
-
(se estiver na raiz), `Enter`/`Space` num item com submenu alterna
|
|
64
|
-
abrir/fechar.
|
|
65
|
-
|
|
66
|
-
## API JS
|
|
67
|
-
|
|
68
|
-
Auto-init via `data-fs="nested-menu"`. `NestedMenu.getInstance(el)` (`el`
|
|
69
|
-
é o gatilho).
|
|
70
|
-
|
|
71
|
-
| Método | Descrição |
|
|
72
|
-
|---|---|
|
|
73
|
-
| `show()` | Abre o menu raiz, posiciona, foca o primeiro item. |
|
|
74
|
-
| `hide()` | Fecha o menu raiz e todos os submenus abertos. |
|
|
75
|
-
| `toggle()` | Alterna. |
|
|
76
|
-
| `dispose()` | Fecha se aberto, remove todos os listeners, desregistra a instância. |
|
|
77
|
-
|
|
78
|
-
| Evento (no gatilho) | Cancelável | Quando |
|
|
79
|
-
|---|---|---|
|
|
80
|
-
| `fs:nested-menu:shown` | Não | Depois de abrir o menu raiz. |
|
|
81
|
-
| `fs:nested-menu:hidden` | Não | Depois de fechar o menu raiz (fecha todos os submenus junto). |
|
|
82
|
-
|
|
83
|
-
## Tokens
|
|
84
|
-
|
|
85
|
-
Mesmos do [Dropdown](dropdown.md) — sem tokens próprios.
|
|
86
|
-
|
|
87
|
-
## Exemplo
|
|
88
|
-
|
|
89
|
-
Ver acima (Visão geral) — mockup com múltiplos níveis em
|
|
90
|
-
[laboratório do componente](../../mockup/navigation-disclosure.html#nested-menu).
|
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
# Notification Center
|
|
2
|
-
|
|
3
|
-
Orquestra múltiplas instâncias de [Toast](toast.md) e mantém um histórico
|
|
4
|
-
com painel de notificações e contador de não-lidas — não introduz um
|
|
5
|
-
elemento visual novo, compõe o que já existe.
|
|
6
|
-
|
|
7
|
-
## Visão geral
|
|
8
|
-
|
|
9
|
-
```html
|
|
10
|
-
<button type="button" class="fs-btn" data-fs="notification-center" data-fs-target="#painel-notif" aria-label="Notificações">
|
|
11
|
-
<svg class="fs-icon" aria-hidden="true" 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="M10.268 21a2 2 0 0 0 3.464 0"/><path d="M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326"/></svg>
|
|
12
|
-
<span class="fs-notification-badge" hidden>0</span>
|
|
13
|
-
</button>
|
|
14
|
-
|
|
15
|
-
<div class="fs-notification-center" id="painel-notif">
|
|
16
|
-
<div class="fs-notification-center-header">
|
|
17
|
-
<span class="fs-notification-center-title">Notificações</span>
|
|
18
|
-
<button type="button" class="fs-btn fs-btn-sm" data-notification="clear">Limpar tudo</button>
|
|
19
|
-
</div>
|
|
20
|
-
<ul class="fs-notification-list"></ul>
|
|
21
|
-
<p class="fs-notification-empty">Nenhuma notificação.</p>
|
|
22
|
-
</div>
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
```js
|
|
26
|
-
const center = FokusStyles.NotificationCenter.getInstance(document.querySelector('[data-fs="notification-center"]'));
|
|
27
|
-
center.push({ title: "Sucesso", body: "Arquivo salvo.", variant: "success" });
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
## Anatomia
|
|
31
|
-
|
|
32
|
-
Gatilho (`data-fs="notification-center"` + `data-fs-target`, com
|
|
33
|
-
`.fs-notification-badge` opcional dentro) + `.fs-notification-center`
|
|
34
|
-
(painel) > `.fs-notification-center-header` (título + botão "limpar tudo",
|
|
35
|
-
via `data-notification="clear"`) + `.fs-notification-list` (`<ul>`,
|
|
36
|
-
preenchida dinamicamente) + `.fs-notification-empty` (mostrado/escondido
|
|
37
|
-
automaticamente conforme o histórico). O `.fs-toast-container` é criado
|
|
38
|
-
automaticamente se não existir um na página (ou aponte pra um existente
|
|
39
|
-
com `data-toast-container="#seletor"`).
|
|
40
|
-
|
|
41
|
-
## Variações
|
|
42
|
-
|
|
43
|
-
Cor por item de notificação: `.fs-notification-item-{nome}` (borda
|
|
44
|
-
esquerda colorida) — aplicada automaticamente a partir do `variant`
|
|
45
|
-
passado em `push()`.
|
|
46
|
-
|
|
47
|
-
## Estados
|
|
48
|
-
|
|
49
|
-
- `.fs-notification-item-unread` — aplicada automaticamente aos itens
|
|
50
|
-
ainda não lidos (some ao abrir o painel — abrir marca tudo como lido).
|
|
51
|
-
- Persistência: `data-storage="local"` + `data-storage-key="..."` no
|
|
52
|
-
gatilho grava o histórico em `localStorage` (sobrevive a reload); padrão
|
|
53
|
-
é `"memory"` (perde ao recarregar a página).
|
|
54
|
-
|
|
55
|
-
```html
|
|
56
|
-
<button data-fs="notification-center" data-fs-target="#painel" data-storage="local" data-storage-key="minhas-notificacoes" aria-label="Notificações">
|
|
57
|
-
<svg class="fs-icon" aria-hidden="true" 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="M10.268 21a2 2 0 0 0 3.464 0"/><path d="M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326"/></svg>
|
|
58
|
-
</button>
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
## A11y
|
|
62
|
-
|
|
63
|
-
`aria-haspopup="dialog"` + `aria-expanded` no gatilho, `role="region"` +
|
|
64
|
-
`aria-label="Notificações"` no painel (aplicados automaticamente, a menos
|
|
65
|
-
que você já tenha definido `aria-label` próprio). `Escape` fecha e devolve
|
|
66
|
-
foco ao gatilho; clique fora fecha.
|
|
67
|
-
|
|
68
|
-
## API JS
|
|
69
|
-
|
|
70
|
-
Auto-init via `data-fs="notification-center"` **no gatilho**.
|
|
71
|
-
`NotificationCenter.getInstance(triggerEl)`.
|
|
72
|
-
|
|
73
|
-
| Método | Descrição |
|
|
74
|
-
|---|---|
|
|
75
|
-
| `push({ title, body, variant, autohide, delay })` | Empilha um toast na hora e registra a notificação no histórico. Retorna o `id` do registro. |
|
|
76
|
-
| `remove(id)` | Remove uma notificação específica do histórico. |
|
|
77
|
-
| `clear()` | Remove todo o histórico. |
|
|
78
|
-
| `getAll()` | Retorna uma cópia do histórico atual (array de registros). |
|
|
79
|
-
| `open()` / `close()` / `toggle()` | Abrem/fecham o painel (abrir marca tudo como lido). |
|
|
80
|
-
| `dispose()` | Fecha se aberto, remove listeners, desregistra a instância. |
|
|
81
|
-
|
|
82
|
-
| Evento (no gatilho) | Cancelável | Quando |
|
|
83
|
-
|---|---|---|
|
|
84
|
-
| `fs:notification:pushed` | Não | Depois de `push()` — `event.detail.record` traz o registro criado. |
|
|
85
|
-
| `fs:notification:opened` / `-closed` | Não | Depois de abrir/fechar o painel. |
|
|
86
|
-
| `fs:notification:cleared` | Não | Depois de `clear()`. |
|
|
87
|
-
|
|
88
|
-
## Tokens
|
|
89
|
-
|
|
90
|
-
`--fs-color-border`, `--fs-color-surface`, `--fs-color-subtle` (item não
|
|
91
|
-
lido), `--fs-color-danger` (badge de contagem), `--fs-color-{nome}` (borda
|
|
92
|
-
por variante), `--fs-radius-md`, `--fs-shadow-md`.
|
|
93
|
-
|
|
94
|
-
## Exemplo
|
|
95
|
-
|
|
96
|
-
```html
|
|
97
|
-
<button type="button" class="fs-btn" data-fs="notification-center" data-fs-target="#nc" id="nc-trigger" aria-label="Notificações">
|
|
98
|
-
<svg class="fs-icon" aria-hidden="true" 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="M10.268 21a2 2 0 0 0 3.464 0"/><path d="M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326"/></svg>
|
|
99
|
-
<span class="fs-notification-badge" hidden>0</span>
|
|
100
|
-
</button>
|
|
101
|
-
<div class="fs-notification-center" id="nc">
|
|
102
|
-
<div class="fs-notification-center-header">
|
|
103
|
-
<span class="fs-notification-center-title">Notificações</span>
|
|
104
|
-
<button type="button" class="fs-btn fs-btn-sm" data-notification="clear">Limpar tudo</button>
|
|
105
|
-
</div>
|
|
106
|
-
<ul class="fs-notification-list"></ul>
|
|
107
|
-
<p class="fs-notification-empty">Nenhuma notificação.</p>
|
|
108
|
-
</div>
|
|
109
|
-
<script>
|
|
110
|
-
document.getElementById("nc-trigger").addEventListener("fs:notification:pushed", (e) => {
|
|
111
|
-
console.log("nova notificação:", e.detail.record);
|
|
112
|
-
});
|
|
113
|
-
</script>
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
Mockup: [laboratório do componente](../../mockup/overlays-commands.html#notification-center).
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
# Offcanvas
|
|
2
|
-
|
|
3
|
-
Painel deslizante de qualquer borda da tela (menu lateral mobile, carrinho,
|
|
4
|
-
filtros) — mesmo focus trap/`Escape`/clique-fora do [Modal](modal.md), mas
|
|
5
|
-
não cobre a tela inteira.
|
|
6
|
-
|
|
7
|
-
## Visão geral
|
|
8
|
-
|
|
9
|
-
```html
|
|
10
|
-
<button type="button" class="fs-btn" data-fs="offcanvas" data-fs-target="#meuPainel">
|
|
11
|
-
Abrir menu
|
|
12
|
-
</button>
|
|
13
|
-
|
|
14
|
-
<div class="fs-offcanvas fs-offcanvas-start" id="meuPainel">
|
|
15
|
-
<div class="fs-offcanvas-header">
|
|
16
|
-
<h3 class="fs-offcanvas-title">Menu</h3>
|
|
17
|
-
<button type="button" class="fs-btn-close" data-fs-dismiss="offcanvas" aria-label="Fechar"></button>
|
|
18
|
-
</div>
|
|
19
|
-
<div class="fs-offcanvas-body">Conteúdo do painel.</div>
|
|
20
|
-
</div>
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
`data-fs` vai no gatilho, como no Modal.
|
|
24
|
-
|
|
25
|
-
## Anatomia
|
|
26
|
-
|
|
27
|
-
Gatilho + `.fs-offcanvas` (painel, `position: fixed`, fora da viewport até
|
|
28
|
-
abrir) > `.fs-offcanvas-header` (título + `.fs-btn-close`, opcional) +
|
|
29
|
-
`.fs-offcanvas-body` (rola internamente) + `.fs-offcanvas-footer`
|
|
30
|
-
(opcional). Um `.fs-offcanvas-backdrop` é criado/removido dinamicamente
|
|
31
|
-
pelo JS a cada abertura (não escreva no HTML).
|
|
32
|
-
|
|
33
|
-
## Variações
|
|
34
|
-
|
|
35
|
-
Borda de entrada — obrigatório escolher uma:
|
|
36
|
-
|
|
37
|
-
- `.fs-offcanvas-start` — esquerda, 320px de largura.
|
|
38
|
-
- `.fs-offcanvas-end` — direita, 320px de largura.
|
|
39
|
-
- `.fs-offcanvas-top` — topo, 40vh de altura.
|
|
40
|
-
- `.fs-offcanvas-bottom` — base, 40vh de altura.
|
|
41
|
-
|
|
42
|
-
## Estados
|
|
43
|
-
|
|
44
|
-
`.is-open` — controlado pelo JS, anima via `transform`/`transition`
|
|
45
|
-
(desativada automaticamente sob `prefers-reduced-motion: reduce`).
|
|
46
|
-
|
|
47
|
-
**Backdrop**: `data-backdrop="false"` no `.fs-offcanvas` remove o
|
|
48
|
-
backdrop (painel some, mas o resto da página continua interativa por
|
|
49
|
-
baixo); `data-backdrop="static"` mantém o backdrop mas desativa
|
|
50
|
-
`Escape`/clique-fora (só `data-fs-dismiss="offcanvas"` fecha) — mesma
|
|
51
|
-
semântica do Modal.
|
|
52
|
-
|
|
53
|
-
## A11y
|
|
54
|
-
|
|
55
|
-
Ao inicializar, o componente controla `aria-hidden` e, quando encontra
|
|
56
|
-
`.fs-offcanvas-title`, cria automaticamente o vínculo `aria-labelledby`. Um
|
|
57
|
-
`id` existente no título é preservado.
|
|
58
|
-
|
|
59
|
-
`role="dialog"` + `aria-modal="true"` aplicados automaticamente. Foco
|
|
60
|
-
preso dentro do painel enquanto aberto, movido pro primeiro elemento
|
|
61
|
-
focável (com um pequeno atraso técnico pra garantir que a transição de
|
|
62
|
-
`visibility` já rodou — o painel usa `visibility: hidden` em vez de
|
|
63
|
-
`display: none` pra poder animar). Ao fechar, foco volta pro gatilho.
|
|
64
|
-
|
|
65
|
-
## API JS
|
|
66
|
-
|
|
67
|
-
Auto-init via `data-fs="offcanvas"` **no gatilho**. `Offcanvas.getInstance(triggerEl)`.
|
|
68
|
-
|
|
69
|
-
| Método | Descrição |
|
|
70
|
-
|---|---|
|
|
71
|
-
| `show()` | Abre, cria o backdrop (se aplicável), trava scroll, ativa focus trap. |
|
|
72
|
-
| `hide()` | Fecha, remove o backdrop, libera scroll, devolve foco ao gatilho. |
|
|
73
|
-
| `toggle()` | Alterna. |
|
|
74
|
-
| `dispose()` | Fecha se aberto, remove listeners, desregistra a instância. |
|
|
75
|
-
|
|
76
|
-
| Evento (no gatilho) | Cancelável | Quando |
|
|
77
|
-
|---|---|---|
|
|
78
|
-
| `fs:offcanvas:shown` | Não | Depois de abrir. |
|
|
79
|
-
| `fs:offcanvas:hidden` | Não | Depois de fechar. |
|
|
80
|
-
|
|
81
|
-
## Tokens
|
|
82
|
-
|
|
83
|
-
`--fs-color-surface`, `--fs-color-text`, `--fs-color-border`,
|
|
84
|
-
`--fs-shadow-lg`.
|
|
85
|
-
|
|
86
|
-
## Exemplo
|
|
87
|
-
|
|
88
|
-
```html
|
|
89
|
-
<button type="button" class="fs-btn" data-fs="offcanvas" data-fs-target="#filtros">Filtros</button>
|
|
90
|
-
<div class="fs-offcanvas fs-offcanvas-end" id="filtros" data-backdrop="static">
|
|
91
|
-
<div class="fs-offcanvas-header">
|
|
92
|
-
<h3 class="fs-offcanvas-title">Filtros</h3>
|
|
93
|
-
<button type="button" class="fs-btn-close" data-fs-dismiss="offcanvas" aria-label="Fechar"></button>
|
|
94
|
-
</div>
|
|
95
|
-
<div class="fs-offcanvas-body">...</div>
|
|
96
|
-
<div class="fs-offcanvas-footer">
|
|
97
|
-
<button type="button" class="fs-btn fs-btn-primary" data-fs-dismiss="offcanvas">Aplicar</button>
|
|
98
|
-
</div>
|
|
99
|
-
</div>
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
Mockup: [laboratório do componente](../../mockup/overlays-commands.html#offcanvas).
|
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
# Pagination
|
|
2
|
-
|
|
3
|
-
Navegação entre páginas de uma listagem — sem JavaScript próprio; qual
|
|
4
|
-
página está ativa/desabilitada é responsabilidade da sua aplicação (você
|
|
5
|
-
adiciona/remove `.is-active`/`.is-disabled` conforme o estado atual). Os
|
|
6
|
-
ícones de anterior/próxima/reticências usam o pacote
|
|
7
|
-
[`fokus-styles/icons`](../guides/icons.md) (Lucide) — veja lá se quiser trocar
|
|
8
|
-
por outro conjunto.
|
|
9
|
-
|
|
10
|
-
## Visão geral
|
|
11
|
-
|
|
12
|
-
```html
|
|
13
|
-
<ul class="fs-pagination">
|
|
14
|
-
<li class="fs-page-item is-disabled">
|
|
15
|
-
<a href="#" class="fs-page-link" aria-label="Anterior">
|
|
16
|
-
<svg class="fs-icon" aria-hidden="true" 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="m15 18-6-6 6-6"/></svg>
|
|
17
|
-
</a>
|
|
18
|
-
</li>
|
|
19
|
-
<li class="fs-page-item"><a href="#" class="fs-page-link">1</a></li>
|
|
20
|
-
<li class="fs-page-item is-active"><a href="#" class="fs-page-link">2</a></li>
|
|
21
|
-
<li class="fs-page-item"><a href="#" class="fs-page-link">3</a></li>
|
|
22
|
-
<li class="fs-page-item">
|
|
23
|
-
<a href="#" class="fs-page-link" aria-label="Próxima">
|
|
24
|
-
<svg class="fs-icon" aria-hidden="true" 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="m9 18 6-6-6-6"/></svg>
|
|
25
|
-
</a>
|
|
26
|
-
</li>
|
|
27
|
-
</ul>
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
## Anatomia
|
|
31
|
-
|
|
32
|
-
`<ul class="fs-pagination">` > `<li class="fs-page-item">` >
|
|
33
|
-
`<a class="fs-page-link">` — marcação de lista nativa, `<ul>`/`<li>`. Nos
|
|
34
|
-
itens de anterior/próxima só com ícone (sem texto visível), o `<a>` precisa
|
|
35
|
-
de `aria-label` (`"Anterior"`/`"Próxima"`) já que o SVG é `aria-hidden`.
|
|
36
|
-
|
|
37
|
-
## Variações
|
|
38
|
-
|
|
39
|
-
- **Bordered**: `.fs-pagination-bordered` — itens colados (sem gap), borda
|
|
40
|
-
fundida entre eles (técnica de margin negativo do
|
|
41
|
-
[Input Group](input-group.md)), cantos arredondados só nas pontas.
|
|
42
|
-
- **Tamanho**: `.fs-pagination-sm`, `.fs-pagination-lg`; sem sufixo =
|
|
43
|
-
padrão (32px).
|
|
44
|
-
- **Prev/next descritivo**: `.fs-page-link-text` no item de anterior/
|
|
45
|
-
próxima, pra ícone + texto (`"Anterior"`/`"Próxima"`) em vez de só o
|
|
46
|
-
ícone — só ajusta o `gap`/padding, o `.fs-page-link` já acomoda largura
|
|
47
|
-
variável. Com texto visível, dispensa o `aria-label` (o link já tem
|
|
48
|
-
nome acessível pelo próprio texto).
|
|
49
|
-
- **Reticências** (intervalo de páginas omitido, ex. `1 2 3 … 8 9 10`):
|
|
50
|
-
`.fs-page-item.is-disabled` com um `<span>` (não `<a>` — não é uma ação)
|
|
51
|
-
contendo o ícone `ellipsis`, `aria-hidden="true"` no item inteiro
|
|
52
|
-
(não comunica nada de acionável a leitores de tela).
|
|
53
|
-
|
|
54
|
-
```html
|
|
55
|
-
<ul class="fs-pagination fs-pagination-bordered fs-pagination-sm">
|
|
56
|
-
<li class="fs-page-item"><a href="#" class="fs-page-link">1</a></li>
|
|
57
|
-
<li class="fs-page-item is-active"><a href="#" class="fs-page-link">2</a></li>
|
|
58
|
-
</ul>
|
|
59
|
-
|
|
60
|
-
<ul class="fs-pagination">
|
|
61
|
-
<li class="fs-page-item">
|
|
62
|
-
<a href="#" class="fs-page-link fs-page-link-text">
|
|
63
|
-
<svg class="fs-icon" aria-hidden="true" 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="m15 18-6-6 6-6"/></svg>
|
|
64
|
-
Anterior
|
|
65
|
-
</a>
|
|
66
|
-
</li>
|
|
67
|
-
<li class="fs-page-item">
|
|
68
|
-
<a href="#" class="fs-page-link fs-page-link-text">
|
|
69
|
-
Próxima
|
|
70
|
-
<svg class="fs-icon" aria-hidden="true" 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="m9 18 6-6-6-6"/></svg>
|
|
71
|
-
</a>
|
|
72
|
-
</li>
|
|
73
|
-
</ul>
|
|
74
|
-
|
|
75
|
-
<ul class="fs-pagination">
|
|
76
|
-
<li class="fs-page-item"><a href="#" class="fs-page-link">1</a></li>
|
|
77
|
-
<li class="fs-page-item"><a href="#" class="fs-page-link">2</a></li>
|
|
78
|
-
<li class="fs-page-item"><a href="#" class="fs-page-link">3</a></li>
|
|
79
|
-
<li class="fs-page-item is-disabled" aria-hidden="true">
|
|
80
|
-
<span class="fs-page-link">
|
|
81
|
-
<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"><circle cx="12" cy="12" r="1"/><circle cx="19" cy="12" r="1"/><circle cx="5" cy="12" r="1"/></svg>
|
|
82
|
-
</span>
|
|
83
|
-
</li>
|
|
84
|
-
<li class="fs-page-item"><a href="#" class="fs-page-link">8</a></li>
|
|
85
|
-
<li class="fs-page-item"><a href="#" class="fs-page-link">9</a></li>
|
|
86
|
-
<li class="fs-page-item"><a href="#" class="fs-page-link">10</a></li>
|
|
87
|
-
</ul>
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
## Estados
|
|
91
|
-
|
|
92
|
-
- `.fs-page-item.is-active .fs-page-link` — fundo/borda na cor primária.
|
|
93
|
-
- `.fs-page-item.is-disabled .fs-page-link` — opacidade reduzida,
|
|
94
|
-
`pointer-events: none` (não clicável, não focável por mouse; ainda é
|
|
95
|
-
focável por teclado como um link comum — considere `aria-disabled="true"`
|
|
96
|
-
e remover do fluxo de tab se precisar bloquear totalmente). No item de
|
|
97
|
-
reticências (sem `<a>`), isso não se aplica — ele nunca é focável.
|
|
98
|
-
|
|
99
|
-
## A11y
|
|
100
|
-
|
|
101
|
-
Envolva a paginação em `.fs-pagination-scroll` quando houver muitos itens. Use `nav`
|
|
102
|
-
nomeado, `aria-current="page"` e desabilite controles sem destino real.
|
|
103
|
-
|
|
104
|
-
- Envolva a lista num `<nav aria-label="Paginação">` — o elemento `<nav>`
|
|
105
|
-
não é gerado pelo framework, adicione no seu HTML.
|
|
106
|
-
- Marque a página atual com `aria-current="page"` no link ativo, além de
|
|
107
|
-
`.is-active` (a classe é só visual).
|
|
108
|
-
- Ícone sozinho (sem texto) precisa de `aria-label` no `<a>` pai; ícone +
|
|
109
|
-
texto visível não precisa (o texto já nomeia o link) — só marque o SVG
|
|
110
|
-
como `aria-hidden="true"` nos dois casos, pra não duplicar o nome
|
|
111
|
-
acessível.
|
|
112
|
-
|
|
113
|
-
## API JS
|
|
114
|
-
|
|
115
|
-
Nenhuma — 100% CSS. Ativar/desativar itens é feito pela sua aplicação.
|
|
116
|
-
|
|
117
|
-
## Tokens
|
|
118
|
-
|
|
119
|
-
Usa `--fs-color-border`, `--fs-color-surface`, `--fs-color-subtle`
|
|
120
|
-
(hover), `--fs-color-primary` (ativo), `--fs-color-muted` (desabilitado),
|
|
121
|
-
`--fs-radius-sm`.
|
|
122
|
-
|
|
123
|
-
## Exemplo
|
|
124
|
-
|
|
125
|
-
```html
|
|
126
|
-
<nav aria-label="Paginação">
|
|
127
|
-
<ul class="fs-pagination fs-pagination-bordered">
|
|
128
|
-
<li class="fs-page-item is-disabled">
|
|
129
|
-
<a href="#" class="fs-page-link" aria-label="Anterior">
|
|
130
|
-
<svg class="fs-icon" aria-hidden="true" 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="m15 18-6-6 6-6"/></svg>
|
|
131
|
-
</a>
|
|
132
|
-
</li>
|
|
133
|
-
<li class="fs-page-item"><a href="#" class="fs-page-link">1</a></li>
|
|
134
|
-
<li class="fs-page-item is-active"><a href="#" class="fs-page-link" aria-current="page">2</a></li>
|
|
135
|
-
<li class="fs-page-item"><a href="#" class="fs-page-link">3</a></li>
|
|
136
|
-
<li class="fs-page-item">
|
|
137
|
-
<a href="#" class="fs-page-link" aria-label="Próxima">
|
|
138
|
-
<svg class="fs-icon" aria-hidden="true" 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="m9 18 6-6-6-6"/></svg>
|
|
139
|
-
</a>
|
|
140
|
-
</li>
|
|
141
|
-
</ul>
|
|
142
|
-
</nav>
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
Mockup: [laboratório do componente](../../mockup/navigation-disclosure.html#pagination).
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
# Placeholder
|
|
2
|
-
|
|
3
|
-
## Visão geral
|
|
4
|
-
|
|
5
|
-
`.fs-placeholder` representa conteúdo ainda carregando e é visualmente distinto de Skeleton.
|
|
6
|
-
|
|
7
|
-
## Estados
|
|
8
|
-
|
|
9
|
-
Use `.fs-placeholder-glow`, `.fs-placeholder-wave` ou `.fs-placeholder-btn` conforme o formato.
|
|
10
|
-
|
|
11
|
-
## A11y
|
|
12
|
-
|
|
13
|
-
Anuncie carregamento com `aria-busy="true"` no contêiner e uma região live quando necessário.
|