fokus-styles 2.5.0 → 2.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +17 -15
- package/CHANGELOG.md +0 -940
- package/dist/css/components.css.map +0 -1
- package/dist/css/components.min.css.map +0 -1
- package/dist/css/fokus-components.css.map +0 -1
- package/dist/css/fokus-components.min.css.map +0 -1
- package/dist/css/fokus-core.css.map +0 -1
- package/dist/css/fokus-core.min.css.map +0 -1
- package/dist/css/fokus-dark.css.map +0 -1
- package/dist/css/fokus-dark.min.css.map +0 -1
- package/dist/css/fokus-rtl.css.map +0 -1
- package/dist/css/fokus-rtl.min.css.map +0 -1
- package/dist/css/fokus-utilities.css.map +0 -1
- package/dist/css/fokus-utilities.min.css.map +0 -1
- package/dist/css/fokus.css.map +0 -1
- package/dist/css/fokus.min.css.map +0 -1
- package/dist/css/fonts.css.map +0 -1
- package/dist/css/fonts.min.css.map +0 -1
- package/dist/css/forms.css.map +0 -1
- package/dist/css/forms.min.css.map +0 -1
- package/dist/css/helpers.css.map +0 -1
- package/dist/css/helpers.min.css.map +0 -1
- package/dist/css/layout.css.map +0 -1
- package/dist/css/layout.min.css.map +0 -1
- package/dist/js/fokus.js.map +0 -7
- package/dist/js/fokus.min.js.map +0 -7
- package/docs/README.md +0 -86
- package/docs/comparison.md +0 -124
- package/docs/components/accordion.md +0 -104
- package/docs/components/alert-dialog.md +0 -99
- package/docs/components/alert.md +0 -104
- package/docs/components/avatar.md +0 -13
- package/docs/components/badge.md +0 -101
- package/docs/components/breadcrumb.md +0 -93
- package/docs/components/button-group.md +0 -13
- package/docs/components/button.md +0 -98
- package/docs/components/card.md +0 -111
- package/docs/components/carousel.md +0 -167
- package/docs/components/checkbox.md +0 -110
- package/docs/components/close-button.md +0 -13
- package/docs/components/code.md +0 -13
- package/docs/components/collapse.md +0 -78
- package/docs/components/combobox.md +0 -123
- package/docs/components/command-palette.md +0 -131
- package/docs/components/datatable.md +0 -173
- package/docs/components/datepicker.md +0 -137
- package/docs/components/divider.md +0 -57
- package/docs/components/dropdown.md +0 -103
- package/docs/components/empty-state.md +0 -65
- package/docs/components/file-upload-advanced.md +0 -116
- package/docs/components/file-upload.md +0 -93
- package/docs/components/icon-link.md +0 -13
- package/docs/components/input-group.md +0 -73
- package/docs/components/input.md +0 -90
- package/docs/components/list-group.md +0 -13
- package/docs/components/modal.md +0 -120
- package/docs/components/navbar.md +0 -74
- package/docs/components/nested-menu.md +0 -90
- package/docs/components/notification-center.md +0 -116
- package/docs/components/offcanvas.md +0 -102
- package/docs/components/pagination.md +0 -145
- package/docs/components/placeholder.md +0 -13
- package/docs/components/popover.md +0 -118
- package/docs/components/progress.md +0 -126
- package/docs/components/radio.md +0 -80
- package/docs/components/range.md +0 -83
- package/docs/components/rating.md +0 -91
- package/docs/components/ratio.md +0 -13
- package/docs/components/responsive.md +0 -19
- package/docs/components/scrollspy.md +0 -13
- package/docs/components/segmented-control.md +0 -82
- package/docs/components/select.md +0 -89
- package/docs/components/skeleton.md +0 -70
- package/docs/components/stepper.md +0 -107
- package/docs/components/switch.md +0 -97
- package/docs/components/table.md +0 -90
- package/docs/components/tabs.md +0 -104
- package/docs/components/tag.md +0 -144
- package/docs/components/tile.md +0 -112
- package/docs/components/timeline.md +0 -78
- package/docs/components/toast.md +0 -108
- package/docs/components/tooltip.md +0 -113
- package/docs/components/tree-view.md +0 -118
- package/docs/contributing/contributing.md +0 -18
- package/docs/getting-started/installation.md +0 -70
- package/docs/getting-started/usage.md +0 -105
- package/docs/guides/accessibility.md +0 -109
- package/docs/guides/charts.md +0 -73
- package/docs/guides/dark-mode.md +0 -90
- package/docs/guides/icons.md +0 -99
- package/docs/guides/javascript-api.md +0 -9
- package/docs/guides/layout-advanced.md +0 -118
- package/docs/guides/migration-clarus-to-fokus.md +0 -48
- package/docs/guides/migration-external.md +0 -123
- package/docs/guides/migration-v1.md +0 -63
- package/docs/guides/print.md +0 -30
- package/docs/guides/rtl-and-system-preferences.md +0 -28
- package/docs/guides/theming.md +0 -140
- package/docs/guides/utility-api.md +0 -9
- package/docs/prompts/prompt-plan.md +0 -45
- package/docs/reference/accessibility-matrix.md +0 -77
- package/docs/reference/browser-support.md +0 -75
- package/docs/reference/contrast-report.md +0 -54
- package/docs/reference/definitions.md +0 -868
- package/docs/reference/design-tokens.md +0 -208
- package/docs/reference/scss-architecture.md +0 -227
- package/docs/reference/size-baseline.json +0 -34
- package/docs/reference/stability.md +0 -89
- package/docs/showcase.md +0 -25
- package/mockup/README.md +0 -41
- package/mockup/assets/carousel-planning.png +0 -0
- package/mockup/assets/carousel-workspace.png +0 -0
- package/mockup/assets/example-theme.css +0 -19
- package/mockup/assets/example-theme.js +0 -11
- package/mockup/assets/showcase-contracts.js +0 -84
- package/mockup/assets/showcase.css +0 -91
- package/mockup/assets/showcase.js +0 -724
- package/mockup/content-data.html +0 -9
- package/mockup/examples/accordion-tabs-toast.html +0 -149
- package/mockup/examples/alert-dialog.html +0 -84
- package/mockup/examples/alerts.html +0 -115
- package/mockup/examples/badges-alerts.html +0 -109
- package/mockup/examples/buttons.html +0 -58
- package/mockup/examples/cards.html +0 -132
- package/mockup/examples/carousel.html +0 -126
- package/mockup/examples/charts.html +0 -102
- package/mockup/examples/check-radio-switch.html +0 -620
- package/mockup/examples/collapse.html +0 -69
- package/mockup/examples/combobox.html +0 -60
- package/mockup/examples/command-palette.html +0 -64
- package/mockup/examples/datatable.html +0 -113
- package/mockup/examples/datepicker.html +0 -62
- package/mockup/examples/divider.html +0 -45
- package/mockup/examples/dropdown-tooltip.html +0 -77
- package/mockup/examples/empty-state.html +0 -56
- package/mockup/examples/file-drop.html +0 -74
- package/mockup/examples/file-upload-advanced.html +0 -68
- package/mockup/examples/forms-advanced.html +0 -77
- package/mockup/examples/hover-card.html +0 -86
- package/mockup/examples/icons.html +0 -157
- package/mockup/examples/input-group.html +0 -74
- package/mockup/examples/js-foundation.html +0 -215
- package/mockup/examples/layout.html +0 -134
- package/mockup/examples/modal-select.html +0 -127
- package/mockup/examples/nested-menu.html +0 -73
- package/mockup/examples/notification-center.html +0 -86
- package/mockup/examples/offcanvas-popover.html +0 -133
- package/mockup/examples/pagination-breadcrumbs.html +0 -92
- package/mockup/examples/popover.html +0 -81
- package/mockup/examples/range.html +0 -69
- package/mockup/examples/rating.html +0 -103
- package/mockup/examples/segmented-control.html +0 -96
- package/mockup/examples/skeletons.html +0 -82
- package/mockup/examples/spinner-progress.html +0 -130
- package/mockup/examples/stepper.html +0 -119
- package/mockup/examples/tables-navbar.html +0 -89
- package/mockup/examples/tag.html +0 -115
- package/mockup/examples/theming.html +0 -68
- package/mockup/examples/tile.html +0 -107
- package/mockup/examples/timeline.html +0 -108
- package/mockup/examples/toast.html +0 -113
- package/mockup/examples/tooltip.html +0 -68
- package/mockup/examples/tree-view.html +0 -68
- package/mockup/feedback-actions.html +0 -9
- package/mockup/forms.html +0 -13
- package/mockup/foundations.html +0 -7
- package/mockup/kitchen-sink.html +0 -696
- package/mockup/navigation-disclosure.html +0 -11
- package/mockup/overlays-commands.html +0 -12
- package/mockup/templates/README.md +0 -20
- package/mockup/templates/admin.html +0 -334
- package/mockup/templates/auth.html +0 -234
- package/mockup/templates/dashboard.html +0 -442
- package/mockup/templates/landing.html +0 -397
- package/packages/fokus-icons/package.json +0 -46
- package/scripts/migrate-fokus-map.json +0 -1366
- package/scripts/migrate-fokus.mjs +0 -97
|
@@ -1,118 +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). Slots
|
|
23
|
-
aditivos incluem `.fs-popover-icon`, `.fs-popover-heading`,
|
|
24
|
-
`.fs-popover-title`, `.fs-popover-meta`, `.fs-popover-text` e
|
|
25
|
-
`.fs-popover-close`. A seta (`.fs-popover-arrow`) é posicionada junto ao painel.
|
|
26
|
-
|
|
27
|
-
## Variações
|
|
28
|
-
|
|
29
|
-
- **Posicionamento**: `data-placement`/`data-align` no gatilho — mesma
|
|
30
|
-
convenção do [Dropdown](dropdown.md).
|
|
31
|
-
- **Gatilho**: `data-trigger` no elemento gatilho —
|
|
32
|
-
`click` (padrão), `hover` (com pequeno atraso ao sair, pra dar tempo de
|
|
33
|
-
mover o mouse até o popover), `focus` (mostra ao focar, some ao perder
|
|
34
|
-
foco pra fora do trigger+popover), `manual` (você chama `show()`/`hide()`
|
|
35
|
-
vocẽ mesmo, sem listener automático).
|
|
36
|
-
- **Hover Card**: `.fs-popover-hover-card` — não é um componente
|
|
37
|
-
separado, é este mesmo Popover com `data-trigger="hover"` e um
|
|
38
|
-
modificador visual (mais largo, corpo em linha) pra conteúdo tipo
|
|
39
|
-
avatar + bio.
|
|
40
|
-
|
|
41
|
-
```html
|
|
42
|
-
<a href="#" data-fs="popover" data-fs-target="#hc-1" data-trigger="hover">@jorgewreis</a>
|
|
43
|
-
<div class="fs-popover fs-popover-hover-card" id="hc-1">
|
|
44
|
-
<div class="fs-popover-body">
|
|
45
|
-
<img src="avatar.jpg" alt="" width="40" height="40">
|
|
46
|
-
<div>
|
|
47
|
-
<strong>Jorge Reis</strong>
|
|
48
|
-
<p>Mantenedor do Fokus Styles.</p>
|
|
49
|
-
</div>
|
|
50
|
-
</div>
|
|
51
|
-
</div>
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
## Estados
|
|
55
|
-
|
|
56
|
-
`.is-open` — controlado pelo JS. Escape, clique externo (trigger click) e
|
|
57
|
-
`data-fs-dismiss="popover"` fecham conforme o tipo de gatilho. Popover não é
|
|
58
|
-
modal: não bloqueia scroll nem cria focus trap.
|
|
59
|
-
|
|
60
|
-
## A11y
|
|
61
|
-
|
|
62
|
-
`role="dialog"` + `aria-modal="false"` no popover, `aria-controls`/
|
|
63
|
-
`aria-expanded` no gatilho (JS aplica automaticamente). Com
|
|
64
|
-
`data-trigger="click"` (padrão): `Escape` fecha e devolve foco ao gatilho;
|
|
65
|
-
clique fora fecha. Um elemento dentro do popover com
|
|
66
|
-
`data-fs-dismiss="popover"` fecha ao ser clicado (útil pra um botão "OK"
|
|
67
|
-
no footer).
|
|
68
|
-
|
|
69
|
-
Ao abrir outro Popover, o painel anterior é fechado para evitar sobreposição.
|
|
70
|
-
O posicionamento testa alternativas quando o lado solicitado não cabe na
|
|
71
|
-
viewport, e a seta acompanha o alinhamento do gatilho. Para conteúdo carregado
|
|
72
|
-
de forma assíncrona, use `aria-busy="true"` e componha um `.fs-spinner` com
|
|
73
|
-
texto de carregamento.
|
|
74
|
-
|
|
75
|
-
## API JS
|
|
76
|
-
|
|
77
|
-
Auto-init via `data-fs="popover"`. `Popover.getInstance(el)` (`el` é o
|
|
78
|
-
**gatilho**).
|
|
79
|
-
|
|
80
|
-
| Método | Descrição |
|
|
81
|
-
|---|---|
|
|
82
|
-
| `show()` | Abre, posiciona, ativa fechamento por clique fora (só no trigger `click`). |
|
|
83
|
-
| `hide()` | Fecha. |
|
|
84
|
-
| `toggle()` | Alterna. |
|
|
85
|
-
| `dispose()` | Fecha se aberto, remove todos os listeners, remove o elemento do popover do DOM. |
|
|
86
|
-
|
|
87
|
-
| Evento (no gatilho) | Cancelável | Quando |
|
|
88
|
-
|---|---|---|
|
|
89
|
-
| `fs:popover:shown` | Não | Depois de abrir. |
|
|
90
|
-
| `fs:popover:hidden` | Não | Depois de fechar. |
|
|
91
|
-
|
|
92
|
-
## Tokens
|
|
93
|
-
|
|
94
|
-
`--fs-color-border`, `--fs-color-surface`, `--fs-color-subtle` (header),
|
|
95
|
-
`--fs-color-text`, `--fs-radius-md`, `--fs-shadow-md` e os tokens locais
|
|
96
|
-
`--fs-popover-width`, `--fs-popover-max-width`, `--fs-popover-padding-block`,
|
|
97
|
-
`--fs-popover-padding-inline`, `--fs-popover-gap`, `--fs-popover-radius`,
|
|
98
|
-
`--fs-popover-shadow`, `--fs-popover-icon-size`, `--fs-popover-heading-gap`,
|
|
99
|
-
`--fs-popover-footer-gap`, `--fs-popover-arrow-size` e
|
|
100
|
-
`--fs-popover-border-width`.
|
|
101
|
-
|
|
102
|
-
## Exemplo
|
|
103
|
-
|
|
104
|
-
```html
|
|
105
|
-
<button type="button" class="fs-btn" data-fs="popover" data-fs-target="#confirmar-envio">
|
|
106
|
-
Enviar
|
|
107
|
-
</button>
|
|
108
|
-
<div class="fs-popover" id="confirmar-envio">
|
|
109
|
-
<div class="fs-popover-header">Confirmar envio?</div>
|
|
110
|
-
<div class="fs-popover-body">Não será possível editar depois de enviado.</div>
|
|
111
|
-
<div class="fs-popover-footer">
|
|
112
|
-
<button type="button" class="fs-btn fs-btn-sm" data-fs-dismiss="popover">Cancelar</button>
|
|
113
|
-
<button type="button" class="fs-btn fs-btn-primary fs-btn-sm">Confirmar</button>
|
|
114
|
-
</div>
|
|
115
|
-
</div>
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
Mockup: [laboratório independente do componente](../../mockup/examples/popover.html).
|
|
@@ -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,80 +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
|
-
- Hover e active também alteram a superfície do círculo vazio e selecionado.
|
|
40
|
-
- O controle acompanha `dir="rtl"`, `prefers-reduced-motion` e
|
|
41
|
-
`forced-colors: active`.
|
|
42
|
-
|
|
43
|
-
## A11y
|
|
44
|
-
|
|
45
|
-
- `<input type="radio">` nativo com `name` compartilhado — `ArrowUp`/
|
|
46
|
-
`ArrowDown`/`ArrowLeft`/`ArrowRight` movem a seleção **dentro do grupo**
|
|
47
|
-
automaticamente (comportamento do navegador, não do framework).
|
|
48
|
-
`Tab`/`Shift+Tab` entram/saem do grupo de uma vez (o item selecionado, ou
|
|
49
|
-
o primeiro se nenhum estiver selecionado, é o único no fluxo de tab).
|
|
50
|
-
- Sempre associe `label` via `for`/`id`.
|
|
51
|
-
- Agrupe opções relacionadas com `fieldset`/`legend` e associe instruções ou
|
|
52
|
-
erros por `aria-describedby`.
|
|
53
|
-
|
|
54
|
-
## API JS
|
|
55
|
-
|
|
56
|
-
Nenhuma — 100% CSS.
|
|
57
|
-
|
|
58
|
-
## Tokens
|
|
59
|
-
|
|
60
|
-
| Token | Fallback | Uso |
|
|
61
|
-
|---|---|---|
|
|
62
|
-
| `--fs-radio-size` | `18px` | Círculo externo |
|
|
63
|
-
| `--fs-radio-dot-size` | `8px` | Ponto selecionado |
|
|
64
|
-
| `--fs-radio-radius` | `50%` | Forma circular |
|
|
65
|
-
| `--fs-radio-gap` | `--fs-space-2` | Distância até o texto |
|
|
66
|
-
|
|
67
|
-
## Exemplo
|
|
68
|
-
|
|
69
|
-
```html
|
|
70
|
-
<div class="fs-radio">
|
|
71
|
-
<input type="radio" name="plano" class="fs-radio-input" id="p1" checked>
|
|
72
|
-
<label for="p1" class="fs-radio-label">Mensal</label>
|
|
73
|
-
</div>
|
|
74
|
-
<div class="fs-radio">
|
|
75
|
-
<input type="radio" name="plano" class="fs-radio-input" id="p2">
|
|
76
|
-
<label for="p2" class="fs-radio-label">Anual</label>
|
|
77
|
-
</div>
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
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,19 +0,0 @@
|
|
|
1
|
-
# Responsive
|
|
2
|
-
|
|
3
|
-
## Visão geral
|
|
4
|
-
|
|
5
|
-
Os utilitários `.fs-stack`, `.fs-cluster`, `.fs-stack-md-row` e
|
|
6
|
-
`.fs-table-responsive` compõem layouts que se adaptam ao espaço disponível.
|
|
7
|
-
O comportamento usa propriedades lógicas e funciona com `dir="rtl"`.
|
|
8
|
-
|
|
9
|
-
## Estados
|
|
10
|
-
|
|
11
|
-
Em telas estreitas, grupos responsivos ocupam toda a largura e tabelas passam
|
|
12
|
-
a permitir rolagem horizontal. O layout continua funcional em zoom de 200% e
|
|
13
|
-
em orientação portrait ou landscape.
|
|
14
|
-
|
|
15
|
-
## A11y
|
|
16
|
-
|
|
17
|
-
O componente não altera a ordem semântica do conteúdo. Para tabelas largas,
|
|
18
|
-
mantenha uma legenda (`caption`) e forneça uma indicação textual quando a
|
|
19
|
-
rolagem horizontal for necessária.
|
|
@@ -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).
|