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,105 +0,0 @@
|
|
|
1
|
-
# Popover
|
|
2
|
-
|
|
3
|
-
Painel flutuante com conteúdo rico (header/body/footer, pode conter
|
|
4
|
-
elementos interativos) — mesmo posicionamento do [Tooltip](tooltip.md),
|
|
5
|
-
aparência de card de superfície em vez do chip escuro.
|
|
6
|
-
|
|
7
|
-
## Visão geral
|
|
8
|
-
|
|
9
|
-
```html
|
|
10
|
-
<button type="button" class="fs-btn" data-fs="popover" data-fs-target="#meu-popover">
|
|
11
|
-
Mais informações
|
|
12
|
-
</button>
|
|
13
|
-
<div class="fs-popover" id="meu-popover">
|
|
14
|
-
<div class="fs-popover-header">Título</div>
|
|
15
|
-
<div class="fs-popover-body">Conteúdo detalhado aqui.</div>
|
|
16
|
-
</div>
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
## Anatomia
|
|
20
|
-
|
|
21
|
-
Gatilho (qualquer elemento) + `.fs-popover` > `.fs-popover-header`
|
|
22
|
-
(opcional) + `.fs-popover-body` + `.fs-popover-footer` (opcional, ações
|
|
23
|
-
alinhadas à direita). A seta (`.fs-popover-arrow`) é gerada
|
|
24
|
-
automaticamente.
|
|
25
|
-
|
|
26
|
-
## Variações
|
|
27
|
-
|
|
28
|
-
- **Posicionamento**: `data-placement`/`data-align` no gatilho — mesma
|
|
29
|
-
convenção do [Dropdown](dropdown.md).
|
|
30
|
-
- **Gatilho**: `data-trigger` no elemento gatilho —
|
|
31
|
-
`click` (padrão), `hover` (com pequeno atraso ao sair, pra dar tempo de
|
|
32
|
-
mover o mouse até o popover), `focus` (mostra ao focar, some ao perder
|
|
33
|
-
foco pra fora do trigger+popover), `manual` (você chama `show()`/`hide()`
|
|
34
|
-
vocẽ mesmo, sem listener automático).
|
|
35
|
-
- **Hover Card**: `.fs-popover-hover-card` — não é um componente
|
|
36
|
-
separado, é este mesmo Popover com `data-trigger="hover"` e um
|
|
37
|
-
modificador visual (mais largo, corpo em linha) pra conteúdo tipo
|
|
38
|
-
avatar + bio.
|
|
39
|
-
|
|
40
|
-
```html
|
|
41
|
-
<a href="#" data-fs="popover" data-fs-target="#hc-1" data-trigger="hover">@jorgewreis</a>
|
|
42
|
-
<div class="fs-popover fs-popover-hover-card" id="hc-1">
|
|
43
|
-
<div class="fs-popover-body">
|
|
44
|
-
<img src="avatar.jpg" alt="" width="40" height="40">
|
|
45
|
-
<div>
|
|
46
|
-
<strong>Jorge Reis</strong>
|
|
47
|
-
<p>Mantenedor do Fokus Styles.</p>
|
|
48
|
-
</div>
|
|
49
|
-
</div>
|
|
50
|
-
</div>
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
## Estados
|
|
54
|
-
|
|
55
|
-
`.is-open` — controlado pelo JS.
|
|
56
|
-
|
|
57
|
-
## A11y
|
|
58
|
-
|
|
59
|
-
`role="dialog"` + `aria-modal="false"` no popover, `aria-controls`/
|
|
60
|
-
`aria-expanded` no gatilho (JS aplica automaticamente). Com
|
|
61
|
-
`data-trigger="click"` (padrão): `Escape` fecha e devolve foco ao gatilho;
|
|
62
|
-
clique fora fecha. Um elemento dentro do popover com
|
|
63
|
-
`data-fs-dismiss="popover"` fecha ao ser clicado (útil pra um botão "OK"
|
|
64
|
-
no footer).
|
|
65
|
-
|
|
66
|
-
## API JS
|
|
67
|
-
|
|
68
|
-
Auto-init via `data-fs="popover"`. `Popover.getInstance(el)` (`el` é o
|
|
69
|
-
**gatilho**).
|
|
70
|
-
|
|
71
|
-
| Método | Descrição |
|
|
72
|
-
|---|---|
|
|
73
|
-
| `show()` | Abre, posiciona, ativa fechamento por clique fora (só no trigger `click`). |
|
|
74
|
-
| `hide()` | Fecha. |
|
|
75
|
-
| `toggle()` | Alterna. |
|
|
76
|
-
| `dispose()` | Fecha se aberto, remove todos os listeners, remove o elemento do popover do DOM. |
|
|
77
|
-
|
|
78
|
-
| Evento (no gatilho) | Cancelável | Quando |
|
|
79
|
-
|---|---|---|
|
|
80
|
-
| `fs:popover:shown` | Não | Depois de abrir. |
|
|
81
|
-
| `fs:popover:hidden` | Não | Depois de fechar. |
|
|
82
|
-
|
|
83
|
-
## Tokens
|
|
84
|
-
|
|
85
|
-
`--fs-color-border`, `--fs-color-surface`, `--fs-color-subtle` (header),
|
|
86
|
-
`--fs-color-text`, `--fs-radius-md`, `--fs-shadow-md`.
|
|
87
|
-
|
|
88
|
-
## Exemplo
|
|
89
|
-
|
|
90
|
-
```html
|
|
91
|
-
<button type="button" class="fs-btn" data-fs="popover" data-fs-target="#confirmar-envio">
|
|
92
|
-
Enviar
|
|
93
|
-
</button>
|
|
94
|
-
<div class="fs-popover" id="confirmar-envio">
|
|
95
|
-
<div class="fs-popover-header">Confirmar envio?</div>
|
|
96
|
-
<div class="fs-popover-body">Não será possível editar depois de enviado.</div>
|
|
97
|
-
<div class="fs-popover-footer">
|
|
98
|
-
<button type="button" class="fs-btn fs-btn-sm" data-fs-dismiss="popover">Cancelar</button>
|
|
99
|
-
<button type="button" class="fs-btn fs-btn-primary fs-btn-sm">Confirmar</button>
|
|
100
|
-
</div>
|
|
101
|
-
</div>
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
Mockup: [laboratório do componente](../../mockup/overlays-commands.html#popover),
|
|
105
|
-
[`mockup/overlays-commands.html#hover-card`](../../mockup/overlays-commands.html#popover).
|
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
# Spinner & Progress
|
|
2
|
-
|
|
3
|
-
Dois indicadores de carregamento, 100% CSS: Spinner (indeterminado, giratório)
|
|
4
|
-
e Progress (determinado, barra linear).
|
|
5
|
-
|
|
6
|
-
## Visão geral
|
|
7
|
-
|
|
8
|
-
```html
|
|
9
|
-
<div class="fs-spinner" role="status" aria-label="Carregando"></div>
|
|
10
|
-
|
|
11
|
-
<div class="fs-progress">
|
|
12
|
-
<div class="fs-progress-bar" style="--fs-progress-value: 60;"></div>
|
|
13
|
-
</div>
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
## Anatomia
|
|
17
|
-
|
|
18
|
-
**Spinner**: um único elemento, `.fs-spinner` — um anel com trilho sutil e
|
|
19
|
-
segmento ativo, girando; sem marcação interna.
|
|
20
|
-
|
|
21
|
-
**Progress**: `.fs-progress` (trilho) > `.fs-progress-bar` (preenchimento
|
|
22
|
-
— a largura é controlada pela custom property `--fs-progress-value`, de
|
|
23
|
-
`0` a `100`, ou diretamente por `style="width: 60%"`).
|
|
24
|
-
|
|
25
|
-
## Variações
|
|
26
|
-
|
|
27
|
-
**Spinner**:
|
|
28
|
-
- Tamanho: `.fs-spinner-sm` (14px), `.fs-spinner-lg` (32px); sem sufixo =
|
|
29
|
-
20px.
|
|
30
|
-
- Cor: `.fs-spinner-{primary|secondary|success|warning|danger|info}` — o
|
|
31
|
-
spinner herda `currentColor` por padrão, então também responde a
|
|
32
|
-
qualquer utilitário de cor de texto (`.fs-u-text-*`) se você não usar essas
|
|
33
|
-
classes.
|
|
34
|
-
|
|
35
|
-
**Progress**:
|
|
36
|
-
- Altura: `.fs-progress-sm` (4px), `.fs-progress-lg` (16px); sem sufixo =
|
|
37
|
-
8px.
|
|
38
|
-
- Cor da barra: `.fs-progress-bar-{cor}` — mesmas 6 cores de tema.
|
|
39
|
-
- `.fs-progress-bar-striped` — faixas diagonais; some com
|
|
40
|
-
`.fs-progress-bar-animated` pra elas se moverem continuamente.
|
|
41
|
-
- Valor visual: use texto dentro de `.fs-progress-bar` apenas em
|
|
42
|
-
`.fs-progress-lg`; nas barras compactas, exponha o valor por `aria-valuenow`
|
|
43
|
-
e por um rótulo externo quando ele precisar ser visível.
|
|
44
|
-
- Rótulo externo: `.fs-progress-meta` contém o nome da operação e
|
|
45
|
-
`.fs-progress-value` para percentual, contagem ou duração.
|
|
46
|
-
- Indeterminado: `.fs-progress-indeterminate` mostra deslocamento contínuo;
|
|
47
|
-
omita `aria-valuenow` e use `aria-valuetext="Progresso indeterminado"`.
|
|
48
|
-
- Finalização: `.fs-progress-complete` aplica `success`; `.fs-progress-error`
|
|
49
|
-
aplica `danger`. Use `.fs-progress-status` para uma confirmação ou ação de
|
|
50
|
-
recuperação fora da barra.
|
|
51
|
-
- Meta: adicione `.fs-progress-marker` dentro do trilho e defina
|
|
52
|
-
`--fs-progress-marker-value` (0–100). Explique a meta em texto externo.
|
|
53
|
-
- Início perceptível: `.fs-progress-minimum` preserva ao menos 4px visíveis
|
|
54
|
-
para valores reais acima de zero; `aria-valuenow` continua sendo a fonte de
|
|
55
|
-
verdade.
|
|
56
|
-
- Fluxo por etapas: componha [Stepper](stepper.md) para comunicar a etapa
|
|
57
|
-
atual e uma `.fs-progress` para representar o avanço global. Não duplique
|
|
58
|
-
ambos para o mesmo significado.
|
|
59
|
-
|
|
60
|
-
```html
|
|
61
|
-
<div class="fs-spinner fs-spinner-lg fs-spinner-primary"></div>
|
|
62
|
-
|
|
63
|
-
<div class="fs-progress fs-progress-lg">
|
|
64
|
-
<div class="fs-progress-bar fs-progress-bar-success fs-progress-bar-striped fs-progress-bar-animated" style="--fs-progress-value: 40;"></div>
|
|
65
|
-
</div>
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
## Estados
|
|
69
|
-
|
|
70
|
-
Nenhum — ambos refletem o valor/presença que você controla (spinner:
|
|
71
|
-
presente = carregando; progress: `--fs-progress-value` = progresso atual).
|
|
72
|
-
|
|
73
|
-
## A11y
|
|
74
|
-
|
|
75
|
-
- Spinner: adicione `role="status"` + `aria-label` (ou um texto
|
|
76
|
-
visualmente oculto dentro) — não é automático, o elemento é puramente
|
|
77
|
-
visual por padrão.
|
|
78
|
-
- Progress: para expor o valor a leitores de tela, adicione
|
|
79
|
-
`role="progressbar"` + `aria-valuenow`/`aria-valuemin="0"`/
|
|
80
|
-
`aria-valuemax="100"` **e um nome acessível** (`aria-label="Progresso: 60%"`
|
|
81
|
-
ou `aria-labelledby` apontando pro rótulo visível) no `.fs-progress`
|
|
82
|
-
(mantidos em sincronia com `--fs-progress-value` pela sua aplicação — o
|
|
83
|
-
framework não injeta automaticamente). Sem nome acessível, o
|
|
84
|
-
`role="progressbar"` é rejeitado por leitores de tela (gate `axe` no CI:
|
|
85
|
-
regra `aria-progressbar-name`).
|
|
86
|
-
- A animação de listras (`.fs-progress-bar-animated`), a barra indeterminada
|
|
87
|
-
e a rotação do spinner desaceleram em `prefers-reduced-motion: reduce`, mas
|
|
88
|
-
não param completamente para não parecerem travadas.
|
|
89
|
-
- Para o indeterminado, não informe um valor numérico inexistente. O movimento
|
|
90
|
-
reduz a velocidade em `prefers-reduced-motion`, mas continua ativo para não
|
|
91
|
-
parecer uma interface travada.
|
|
92
|
-
|
|
93
|
-
## API JS
|
|
94
|
-
|
|
95
|
-
Nenhuma — 100% CSS. Atualizar `--fs-progress-value` é responsabilidade da
|
|
96
|
-
sua aplicação (ex.: `barEl.style.setProperty("--fs-progress-value", "75")`).
|
|
97
|
-
|
|
98
|
-
## Tokens
|
|
99
|
-
|
|
100
|
-
Spinner: `--fs-color-{nome}` (variantes de cor). Progress:
|
|
101
|
-
`--fs-color-subtle` (trilho), `--fs-color-primary`/`--fs-color-{nome}`
|
|
102
|
-
(preenchimento), `--fs-progress-height`, `--fs-progress-track`,
|
|
103
|
-
`--fs-progress-bar-bg` e `--fs-progress-radius`. O Spinner também expõe
|
|
104
|
-
`--fs-spinner-size`, `--fs-spinner-stroke` e `--fs-spinner-duration` para
|
|
105
|
-
ajustes locais.
|
|
106
|
-
|
|
107
|
-
## Exemplo
|
|
108
|
-
|
|
109
|
-
```html
|
|
110
|
-
<div class="fs-spinner" role="status" aria-label="Carregando"></div>
|
|
111
|
-
|
|
112
|
-
<div class="fs-progress" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100">
|
|
113
|
-
<div class="fs-progress-bar" style="--fs-progress-value: 60;">60%</div>
|
|
114
|
-
</div>
|
|
115
|
-
|
|
116
|
-
<div class="fs-progress-meta"><span>Upload de anexos</span><span class="fs-progress-value">3 de 8 arquivos</span></div>
|
|
117
|
-
<div class="fs-progress" role="progressbar" aria-label="Upload de anexos" aria-valuetext="3 de 8 arquivos enviados" aria-valuenow="38" aria-valuemin="0" aria-valuemax="100">
|
|
118
|
-
<div class="fs-progress-bar" style="--fs-progress-value: 38"></div>
|
|
119
|
-
</div>
|
|
120
|
-
|
|
121
|
-
<div class="fs-progress fs-progress-indeterminate" role="progressbar" aria-label="Processando pagamento" aria-valuetext="Progresso indeterminado" aria-busy="true">
|
|
122
|
-
<div class="fs-progress-bar"></div>
|
|
123
|
-
</div>
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
Mockup: [laboratório do componente](../../mockup/feedback-actions.html#progress).
|
package/docs/components/radio.md
DELETED
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
# Radio
|
|
2
|
-
|
|
3
|
-
Radio button 100% CSS, mesma técnica do [Checkbox](checkbox.md) — sobre um
|
|
4
|
-
`<input type="radio">` nativo. É a única exceção circular do framework
|
|
5
|
-
além do [Spinner](progress.md), por decisão de design (anti-circular no
|
|
6
|
-
resto de tudo).
|
|
7
|
-
|
|
8
|
-
## Visão geral
|
|
9
|
-
|
|
10
|
-
```html
|
|
11
|
-
<div class="fs-radio">
|
|
12
|
-
<input type="radio" name="periodo" class="fs-radio-input" id="dia" checked>
|
|
13
|
-
<label for="dia" class="fs-radio-label">Dia</label>
|
|
14
|
-
</div>
|
|
15
|
-
<div class="fs-radio">
|
|
16
|
-
<input type="radio" name="periodo" class="fs-radio-input" id="semana">
|
|
17
|
-
<label for="semana" class="fs-radio-label">Semana</label>
|
|
18
|
-
</div>
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
Radios do mesmo grupo compartilham `name` — seleção exclusiva é
|
|
22
|
-
comportamento nativo do `<input type="radio">`, sem JS.
|
|
23
|
-
|
|
24
|
-
## Anatomia
|
|
25
|
-
|
|
26
|
-
`.fs-radio` (wrapper) > `.fs-radio-input` (oculto via clip) +
|
|
27
|
-
`.fs-radio-label` (`<label for="...">`, desenha o círculo via `::before` e
|
|
28
|
-
o ponto interno via `::after`).
|
|
29
|
-
|
|
30
|
-
## Variações
|
|
31
|
-
|
|
32
|
-
Tamanho: `.fs-radio-sm`, `.fs-radio-lg` no wrapper.
|
|
33
|
-
|
|
34
|
-
## Estados
|
|
35
|
-
|
|
36
|
-
- **checked**, **disabled**, validação (`.is-valid`/`.is-invalid`) e foco —
|
|
37
|
-
mesmo padrão do [Checkbox](checkbox.md). Não existe `indeterminate` para
|
|
38
|
-
radio.
|
|
39
|
-
|
|
40
|
-
## A11y
|
|
41
|
-
|
|
42
|
-
- `<input type="radio">` nativo com `name` compartilhado — `ArrowUp`/
|
|
43
|
-
`ArrowDown`/`ArrowLeft`/`ArrowRight` movem a seleção **dentro do grupo**
|
|
44
|
-
automaticamente (comportamento do navegador, não do framework).
|
|
45
|
-
`Tab`/`Shift+Tab` entram/saem do grupo de uma vez (o item selecionado, ou
|
|
46
|
-
o primeiro se nenhum estiver selecionado, é o único no fluxo de tab).
|
|
47
|
-
- Sempre associe `label` via `for`/`id`.
|
|
48
|
-
|
|
49
|
-
## API JS
|
|
50
|
-
|
|
51
|
-
Nenhuma — 100% CSS.
|
|
52
|
-
|
|
53
|
-
## Tokens
|
|
54
|
-
|
|
55
|
-
Mesmos do [Checkbox](checkbox.md) — sem tokens próprios.
|
|
56
|
-
|
|
57
|
-
## Exemplo
|
|
58
|
-
|
|
59
|
-
```html
|
|
60
|
-
<div class="fs-radio">
|
|
61
|
-
<input type="radio" name="plano" class="fs-radio-input" id="p1" checked>
|
|
62
|
-
<label for="p1" class="fs-radio-label">Mensal</label>
|
|
63
|
-
</div>
|
|
64
|
-
<div class="fs-radio">
|
|
65
|
-
<input type="radio" name="plano" class="fs-radio-input" id="p2">
|
|
66
|
-
<label for="p2" class="fs-radio-label">Anual</label>
|
|
67
|
-
</div>
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
Mockup: [laboratório do componente](../../mockup/forms.html#check-radio-switch).
|
package/docs/components/range.md
DELETED
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
# Range / Slider
|
|
2
|
-
|
|
3
|
-
`<input type="range">` estilizado — trilha preenchida até o valor atual e
|
|
4
|
-
thumb customizados via pseudo-elementos (`::-webkit-slider-thumb`/
|
|
5
|
-
`::-moz-range-thumb`, sem padrão unificado entre navegadores). Teclado
|
|
6
|
-
(setas, `Home`/`End`, `PageUp`/`PageDown`) e ARIA (`role="slider"` implícito,
|
|
7
|
-
`aria-valuenow`/`aria-valuemin`/`aria-valuemax` automáticos) já vêm do
|
|
8
|
-
elemento nativo, sem nenhum JS.
|
|
9
|
-
|
|
10
|
-
## Visão geral
|
|
11
|
-
|
|
12
|
-
```html
|
|
13
|
-
<label for="volume" class="fs-form-label">Volume</label>
|
|
14
|
-
<input type="range" class="fs-form-range" id="volume" min="0" max="100" value="40">
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
## Valor visível (API JS opcional)
|
|
18
|
-
|
|
19
|
-
Um `<output>` associado via `data-fs-target` mostra o valor atual em texto
|
|
20
|
-
— útil pra quem não percebe a posição do thumb só visualmente. Auto-init
|
|
21
|
-
com `data-fs="range"` no próprio `<input>`:
|
|
22
|
-
|
|
23
|
-
```html
|
|
24
|
-
<input type="range" class="fs-form-range" id="volume" min="0" max="100" value="40"
|
|
25
|
-
data-fs="range" data-fs-target="#volume-output">
|
|
26
|
-
<output class="fs-range-output" id="volume-output" for="volume">40</output>
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
O JS também é responsável por pintar a trilha preenchida
|
|
30
|
-
(`--fs-range-percent`, ver token abaixo) — sem ele, a trilha renderiza sem
|
|
31
|
-
preenchimento (só a cor de fundo neutra), porque só o Firefox suporta
|
|
32
|
-
`::-moz-range-progress`; Chrome/Safari não têm equivalente em CSS puro.
|
|
33
|
-
|
|
34
|
-
## Marcações (`<datalist>`)
|
|
35
|
-
|
|
36
|
-
Marcações na trilha são nativas via `list` + `<datalist>` (sem JS,
|
|
37
|
-
suporte no Chrome/Edge; degrada para nenhuma marcação visível nos
|
|
38
|
-
navegadores sem suporte, sem quebrar a funcionalidade):
|
|
39
|
-
|
|
40
|
-
```html
|
|
41
|
-
<input type="range" class="fs-form-range" min="0" max="100" step="25" list="marcas">
|
|
42
|
-
<datalist id="marcas">
|
|
43
|
-
<option value="0"></option>
|
|
44
|
-
<option value="25"></option>
|
|
45
|
-
<option value="50"></option>
|
|
46
|
-
<option value="75"></option>
|
|
47
|
-
<option value="100"></option>
|
|
48
|
-
</datalist>
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
## Tokens
|
|
52
|
-
|
|
53
|
-
| Token | Uso |
|
|
54
|
-
|---|---|
|
|
55
|
-
| `--fs-range-track-height` | Altura da trilha. |
|
|
56
|
-
| `--fs-range-track-color` | Cor da trilha não preenchida. |
|
|
57
|
-
| `--fs-range-fill-color` | Cor da trilha preenchida (até o valor atual). |
|
|
58
|
-
| `--fs-range-thumb-size` | Diâmetro do thumb. |
|
|
59
|
-
| `--fs-range-thumb-color` | Cor de fundo do thumb. |
|
|
60
|
-
| `--fs-range-thumb-border-color` | Cor da borda do thumb. |
|
|
61
|
-
| `--fs-range-percent` | Percentual preenchido da trilha — escrito pelo JS (`RangeSlider`), não pensado pra edição manual. |
|
|
62
|
-
|
|
63
|
-
## Estados
|
|
64
|
-
|
|
65
|
-
- `:disabled` — opacidade reduzida, cursor `not-allowed`, sem interação.
|
|
66
|
-
- `:focus-visible` — anel de foco no thumb (mesma técnica de
|
|
67
|
-
`focus-ring()` dos demais controles).
|
|
68
|
-
|
|
69
|
-
## A11y
|
|
70
|
-
|
|
71
|
-
Nativo — `<input type="range">` já expõe `role="slider"` e os valores
|
|
72
|
-
`aria-value*` automaticamente. Sempre associe um `<label>` (via `for`), e
|
|
73
|
-
use `aria-label`/`aria-labelledby` quando não houver label visível.
|
|
74
|
-
|
|
75
|
-
## API JS
|
|
76
|
-
|
|
77
|
-
- `data-fs="range"` — auto-init.
|
|
78
|
-
- `data-fs-target="#id"` — `<output>` que recebe o valor atual em texto.
|
|
79
|
-
|
|
80
|
-
| Método | Descrição |
|
|
81
|
-
|---|---|
|
|
82
|
-
| `RangeSlider.getInstance(el)` | Retorna a instância associada ao `<input>` (ou `undefined`). |
|
|
83
|
-
| `dispose()` | Remove o listener de `input`. |
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
# Rating
|
|
2
|
-
|
|
3
|
-
Avaliação por estrelas, 100% CSS — mesma técnica de input oculto + label
|
|
4
|
-
irmã do [Checkbox](checkbox.md)/[Segmented Control](segmented-control.md),
|
|
5
|
-
usando `<input type="radio">` (seleção exclusiva nativa). A estrela é o
|
|
6
|
-
ícone `star` do [`fokus-styles/icons`](../guides/icons.md) — contorno vazio por
|
|
7
|
-
padrão, preenchido (`fill: currentcolor`) quando selecionada ou em hover.
|
|
8
|
-
|
|
9
|
-
## Visão geral
|
|
10
|
-
|
|
11
|
-
```html
|
|
12
|
-
<div class="fs-rating">
|
|
13
|
-
<input type="radio" name="nota" class="fs-rating-input" id="nota-5" value="5">
|
|
14
|
-
<label for="nota-5" class="fs-rating-star" aria-label="5 estrelas">
|
|
15
|
-
<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="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"/></svg>
|
|
16
|
-
</label>
|
|
17
|
-
<input type="radio" name="nota" class="fs-rating-input" id="nota-4" value="4">
|
|
18
|
-
<label for="nota-4" class="fs-rating-star" aria-label="4 estrelas">
|
|
19
|
-
<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="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"/></svg>
|
|
20
|
-
</label>
|
|
21
|
-
<!-- ... 3, 2, 1, mesmo padrão ... -->
|
|
22
|
-
</div>
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
**A ordem no HTML é decrescente** (5, 4, 3, 2, 1) — truque clássico de CSS
|
|
26
|
-
puro: o contêiner usa `row-reverse` (visualmente reordena pra crescente,
|
|
27
|
-
esquerda→direita) e o destaque "estrela clicada + todas à esquerda dela"
|
|
28
|
-
usa só o combinador de irmãos gerais (`~`, que só enxerga o que vem
|
|
29
|
-
**depois** no DOM) — depende da ordem decrescente pra funcionar.
|
|
30
|
-
|
|
31
|
-
## Anatomia
|
|
32
|
-
|
|
33
|
-
`.fs-rating` (contêiner, `row-reverse`) > pares `.fs-rating-input`
|
|
34
|
-
(`<input type="radio">`, mesmo `name`, oculto via clip) +
|
|
35
|
-
`.fs-rating-star` (`<label for="...">` com `aria-label` + o ícone `star`
|
|
36
|
-
dentro, `aria-hidden`), um par por nota possível, em ordem decrescente de
|
|
37
|
-
`value`.
|
|
38
|
-
|
|
39
|
-
## Variações
|
|
40
|
-
|
|
41
|
-
Tamanho: `.fs-rating-sm` (16px), `.fs-rating-lg` (32px); sem sufixo = 24px
|
|
42
|
-
(padrão) — controla o `font-size` do `<label>`, e o ícone (`.fs-icon`,
|
|
43
|
-
`1em` × `1em`) acompanha.
|
|
44
|
-
|
|
45
|
-
## Estados
|
|
46
|
-
|
|
47
|
-
- Nota selecionada e todas as anteriores (maior valor) ficam na cor de
|
|
48
|
-
aviso (`--fs-color-warning`) e com a estrela preenchida — via
|
|
49
|
-
`:checked ~ .fs-rating-star`.
|
|
50
|
-
- **Hover** prévia a mesma seleção antes de confirmar o clique
|
|
51
|
-
(`:hover`/`:hover ~`).
|
|
52
|
-
- `disabled` no input — opacidade reduzida, sem interação.
|
|
53
|
-
|
|
54
|
-
## A11y
|
|
55
|
-
|
|
56
|
-
`<input type="radio">` nativo — `Tab` foca o grupo, `ArrowLeft`/
|
|
57
|
-
`ArrowRight` (ou `Up`/`Down`) movem a seleção entre notas, `Space`
|
|
58
|
-
confirma. Como a estrela é um ícone (`aria-hidden="true"`, sem texto
|
|
59
|
-
visível), o `<label>` **precisa** de `aria-label` (`"5 estrelas"`,
|
|
60
|
-
`"1 estrela"` etc.) — sem isso o link não tem nome acessível nenhum.
|
|
61
|
-
|
|
62
|
-
## API JS
|
|
63
|
-
|
|
64
|
-
Nenhuma — 100% CSS. O valor selecionado é lido como qualquer grupo de
|
|
65
|
-
radio nativo (`document.querySelector('input[name="nota"]:checked').value`).
|
|
66
|
-
|
|
67
|
-
## Tokens
|
|
68
|
-
|
|
69
|
-
`--fs-color-border` (estrela vazia), `--fs-color-warning` (selecionada/
|
|
70
|
-
hover), `--fs-color-primary` (anel de foco).
|
|
71
|
-
|
|
72
|
-
## Exemplo
|
|
73
|
-
|
|
74
|
-
```html
|
|
75
|
-
<fieldset>
|
|
76
|
-
<legend>Avalie sua experiência</legend>
|
|
77
|
-
<div class="fs-rating">
|
|
78
|
-
<input type="radio" name="exp" class="fs-rating-input" id="exp-5" value="5" checked>
|
|
79
|
-
<label for="exp-5" class="fs-rating-star" aria-label="5 estrelas">
|
|
80
|
-
<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="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"/></svg>
|
|
81
|
-
</label>
|
|
82
|
-
<input type="radio" name="exp" class="fs-rating-input" id="exp-4" value="4">
|
|
83
|
-
<label for="exp-4" class="fs-rating-star" aria-label="4 estrelas">
|
|
84
|
-
<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="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"/></svg>
|
|
85
|
-
</label>
|
|
86
|
-
<!-- ... 3, mesmo padrão ... -->
|
|
87
|
-
</div>
|
|
88
|
-
</fieldset>
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
Mockup: [laboratório do componente](../../mockup/forms.html#rating).
|
package/docs/components/ratio.md
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
# Ratio
|
|
2
|
-
|
|
3
|
-
## Visão geral
|
|
4
|
-
|
|
5
|
-
`.fs-ratio` cria frames de mídia responsivos sem depender da altura do viewport.
|
|
6
|
-
|
|
7
|
-
## Estados
|
|
8
|
-
|
|
9
|
-
Escolha `.fs-ratio-1x1`, `.fs-ratio-4x3`, `.fs-ratio-16x9` ou `.fs-ratio-21x9`.
|
|
10
|
-
|
|
11
|
-
## A11y
|
|
12
|
-
|
|
13
|
-
Mantenha texto alternativo em imagens e legendas ou título acessível em mídia incorporada.
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
# Scrollspy
|
|
2
|
-
|
|
3
|
-
## Visão geral
|
|
4
|
-
|
|
5
|
-
`data-fs-scrollspy` destaca o link da seção atualmente visível e pode ser usado em navegação lateral.
|
|
6
|
-
|
|
7
|
-
## Estados
|
|
8
|
-
|
|
9
|
-
O módulo JS aplica `.is-active` e emite `fs:scrollspy:activate`.
|
|
10
|
-
|
|
11
|
-
## A11y
|
|
12
|
-
|
|
13
|
-
Use uma navegação nomeada, mantenha foco visível e não remova a indicação textual do destino.
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
# Segmented Control
|
|
2
|
-
|
|
3
|
-
Grupo de botões com estado selecionado — alternativa compacta a radio
|
|
4
|
-
buttons/tabs para poucas opções mutuamente exclusivas (ou não). 100% CSS,
|
|
5
|
-
mesma técnica de input oculto + label irmã.
|
|
6
|
-
|
|
7
|
-
## Visão geral
|
|
8
|
-
|
|
9
|
-
```html
|
|
10
|
-
<div class="fs-segmented-control">
|
|
11
|
-
<div class="fs-segmented-item">
|
|
12
|
-
<input type="radio" name="periodo" class="fs-segmented-input" id="p-dia" checked>
|
|
13
|
-
<label for="p-dia" class="fs-segmented-label">Dia</label>
|
|
14
|
-
</div>
|
|
15
|
-
<div class="fs-segmented-item">
|
|
16
|
-
<input type="radio" name="periodo" class="fs-segmented-input" id="p-semana">
|
|
17
|
-
<label for="p-semana" class="fs-segmented-label">Semana</label>
|
|
18
|
-
</div>
|
|
19
|
-
<div class="fs-segmented-item">
|
|
20
|
-
<input type="radio" name="periodo" class="fs-segmented-input" id="p-mes">
|
|
21
|
-
<label for="p-mes" class="fs-segmented-label">Mês</label>
|
|
22
|
-
</div>
|
|
23
|
-
</div>
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
## Anatomia
|
|
27
|
-
|
|
28
|
-
`.fs-segmented-control` (contêiner, borda externa única) >
|
|
29
|
-
`.fs-segmented-item` (um por opção) > `.fs-segmented-input`
|
|
30
|
-
(`<input>`, oculto via clip) + `.fs-segmented-label` (`<label for="...">`).
|
|
31
|
-
|
|
32
|
-
## Variações
|
|
33
|
-
|
|
34
|
-
- **Exclusivo vs. inclusivo**: use `<input type="radio">` com o mesmo
|
|
35
|
-
`name` (só uma opção selecionada por vez — como no exemplo) ou
|
|
36
|
-
`<input type="checkbox">` (cada item seleciona/deseleciona
|
|
37
|
-
independentemente).
|
|
38
|
-
- **Tamanho**: `.fs-segmented-control-sm`, `.fs-segmented-control-lg`; sem
|
|
39
|
-
sufixo = padrão (38px de altura).
|
|
40
|
-
|
|
41
|
-
```html
|
|
42
|
-
<div class="fs-segmented-control fs-segmented-control-sm">...</div>
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
## Estados
|
|
46
|
-
|
|
47
|
-
- **checked**: item selecionado ganha fundo/texto na cor primária.
|
|
48
|
-
- **disabled**: no input — opacidade reduzida, sem interação.
|
|
49
|
-
- **Foco**: anel sobre o item focado (`z-index` elevado pra não ficar
|
|
50
|
-
parcialmente escondido pela borda do vizinho).
|
|
51
|
-
|
|
52
|
-
## A11y
|
|
53
|
-
|
|
54
|
-
`<input>` nativo (radio ou checkbox) — toda a semântica de grupo (seleção
|
|
55
|
-
exclusiva com radio, navegação por seta entre itens do mesmo `name`) vem
|
|
56
|
-
do navegador, sem JS. Sempre associe `label` via `for`/`id`.
|
|
57
|
-
|
|
58
|
-
## API JS
|
|
59
|
-
|
|
60
|
-
Nenhuma — 100% CSS.
|
|
61
|
-
|
|
62
|
-
## Tokens
|
|
63
|
-
|
|
64
|
-
`--fs-color-border`, `--fs-color-surface`, `--fs-color-subtle` (hover),
|
|
65
|
-
`--fs-color-primary` (selecionado), `--fs-radius-sm`.
|
|
66
|
-
|
|
67
|
-
## Exemplo
|
|
68
|
-
|
|
69
|
-
```html
|
|
70
|
-
<div class="fs-segmented-control">
|
|
71
|
-
<div class="fs-segmented-item">
|
|
72
|
-
<input type="checkbox" class="fs-segmented-input" id="f-ativo" checked>
|
|
73
|
-
<label for="f-ativo" class="fs-segmented-label">Ativos</label>
|
|
74
|
-
</div>
|
|
75
|
-
<div class="fs-segmented-item">
|
|
76
|
-
<input type="checkbox" class="fs-segmented-input" id="f-arquivado">
|
|
77
|
-
<label for="f-arquivado" class="fs-segmented-label">Arquivados</label>
|
|
78
|
-
</div>
|
|
79
|
-
</div>
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
Mockup: [laboratório do componente](../../mockup/forms.html#segmented-control).
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
# Select customizado
|
|
2
|
-
|
|
3
|
-
Substitui a aparência do `<select>` nativo (impossível de estilizar
|
|
4
|
-
consistentemente entre navegadores) por um [Dropdown](dropdown.md), mantendo
|
|
5
|
-
o `<select>` real por baixo — sincronizado, escondido visualmente.
|
|
6
|
-
|
|
7
|
-
## Visão geral
|
|
8
|
-
|
|
9
|
-
```html
|
|
10
|
-
<select class="fs-form-select" data-fs="select" id="pais">
|
|
11
|
-
<option value="br">Brasil</option>
|
|
12
|
-
<option value="pt">Portugal</option>
|
|
13
|
-
<option value="us" disabled>Estados Unidos (indisponível)</option>
|
|
14
|
-
</select>
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
O JS constrói o dropdown customizado logo depois do `<select>` no DOM e
|
|
18
|
-
esconde o original (`display: none` — continua no DOM, então
|
|
19
|
-
`<select>`/`<option>` do seu HTML/backend seguem sendo a fonte da
|
|
20
|
-
verdade).
|
|
21
|
-
|
|
22
|
-
## Anatomia
|
|
23
|
-
|
|
24
|
-
Gerado automaticamente a partir do `<select>`: `.fs-dropdown.fs-form-select-dropdown`
|
|
25
|
-
> `.fs-form-select` (botão-toggle, mesma aparência estática documentada em
|
|
26
|
-
[Input](input.md#anatomia)) + `.fs-dropdown-menu` > um `.fs-dropdown-item`
|
|
27
|
-
por `<option>`.
|
|
28
|
-
|
|
29
|
-
## Variações
|
|
30
|
-
|
|
31
|
-
Tamanho: `data-size="sm"`/`"lg"` no `<select>` original — vira
|
|
32
|
-
`.fs-form-select-sm`/`-lg` no toggle gerado.
|
|
33
|
-
|
|
34
|
-
```html
|
|
35
|
-
<select class="fs-form-select" data-fs="select" data-size="sm">...</select>
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
## Estados
|
|
39
|
-
|
|
40
|
-
- `<option disabled>` vira um item com `.is-disabled` no menu (não
|
|
41
|
-
clicável).
|
|
42
|
-
- `<select disabled>` desabilita o botão-toggle inteiro.
|
|
43
|
-
- Item selecionado (`selectedIndex`) fica com `.is-active` no menu.
|
|
44
|
-
|
|
45
|
-
## A11y
|
|
46
|
-
|
|
47
|
-
`aria-haspopup="listbox"` no toggle, `role="listbox"` no menu,
|
|
48
|
-
`role="option"` + `aria-selected` em cada item — aplicados
|
|
49
|
-
automaticamente. Navegação por teclado herdada do
|
|
50
|
-
[Dropdown](dropdown.md) (`ArrowDown`/`ArrowUp` entre opções, `Escape`
|
|
51
|
-
fecha). Selecionar uma opção dispara `change` no `<select>` original —
|
|
52
|
-
formulários/validação que escutam esse evento continuam funcionando sem
|
|
53
|
-
mudança.
|
|
54
|
-
|
|
55
|
-
## API JS
|
|
56
|
-
|
|
57
|
-
Auto-init via `data-fs="select"` **no `<select>`**. `Select.getInstance(selectEl)`.
|
|
58
|
-
|
|
59
|
-
| Método | Descrição |
|
|
60
|
-
|---|---|
|
|
61
|
-
| `show()` / `hide()` / `toggle()` | Delegam pro Dropdown interno. |
|
|
62
|
-
| `dispose()` | Desmonta o dropdown gerado, restaura o `<select>` original visível. |
|
|
63
|
-
|
|
64
|
-
| Evento (no `<select>` original) | Cancelável | Quando |
|
|
65
|
-
|---|---|---|
|
|
66
|
-
| `change` (nativo) | Não | Ao selecionar uma opção — mesmo evento que um `<select>` comum dispara. |
|
|
67
|
-
| `fs:select:changed` | Não | Mesmo momento, com `event.detail.value` (o novo valor). |
|
|
68
|
-
|
|
69
|
-
## Tokens
|
|
70
|
-
|
|
71
|
-
Os mesmos do [Dropdown](dropdown.md) e de
|
|
72
|
-
[`.fs-form-select`](input.md) — sem tokens próprios.
|
|
73
|
-
|
|
74
|
-
## Exemplo
|
|
75
|
-
|
|
76
|
-
```html
|
|
77
|
-
<select class="fs-form-select" data-fs="select" id="prioridade">
|
|
78
|
-
<option value="baixa">Baixa</option>
|
|
79
|
-
<option value="media" selected>Média</option>
|
|
80
|
-
<option value="alta">Alta</option>
|
|
81
|
-
</select>
|
|
82
|
-
<script>
|
|
83
|
-
document.getElementById("prioridade").addEventListener("fs:select:changed", (e) => {
|
|
84
|
-
console.log("nova prioridade:", e.detail.value);
|
|
85
|
-
});
|
|
86
|
-
</script>
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
Mockup: [laboratório do componente](../../mockup/forms.html#select).
|