fokus-styles 2.3.0 → 2.5.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/CHANGELOG.md +36 -0
- package/dist/css/components.css +583 -83
- package/dist/css/components.css.map +1 -1
- package/dist/css/components.min.css +1 -1
- package/dist/css/components.min.css.map +1 -1
- package/dist/css/fokus-components.css +583 -83
- package/dist/css/fokus-components.css.map +1 -1
- package/dist/css/fokus-components.min.css +1 -1
- package/dist/css/fokus-components.min.css.map +1 -1
- package/dist/css/fokus-core.css +22 -0
- package/dist/css/fokus-core.css.map +1 -1
- package/dist/css/fokus-core.min.css +1 -1
- package/dist/css/fokus-core.min.css.map +1 -1
- package/dist/css/fokus-dark.css +10 -0
- package/dist/css/fokus-dark.css.map +1 -1
- package/dist/css/fokus-dark.min.css +1 -1
- package/dist/css/fokus-dark.min.css.map +1 -1
- package/dist/css/fokus-rtl.css +9166 -0
- package/dist/css/fokus-rtl.css.map +1 -0
- package/dist/css/fokus-rtl.min.css +2 -0
- package/dist/css/fokus-rtl.min.css.map +1 -0
- package/dist/css/fokus-utilities.css +158 -0
- package/dist/css/fokus-utilities.css.map +1 -1
- package/dist/css/fokus-utilities.min.css +1 -1
- package/dist/css/fokus-utilities.min.css.map +1 -1
- package/dist/css/fokus.css +1018 -258
- package/dist/css/fokus.css.map +1 -1
- package/dist/css/fokus.min.css +1 -1
- package/dist/css/fokus.min.css.map +1 -1
- package/dist/css/forms.css +322 -176
- package/dist/css/forms.css.map +1 -1
- package/dist/css/forms.min.css +1 -1
- package/dist/css/forms.min.css.map +1 -1
- package/dist/css/helpers.css +158 -0
- package/dist/css/helpers.css.map +1 -1
- package/dist/css/helpers.min.css +1 -1
- package/dist/css/helpers.min.css.map +1 -1
- package/dist/css/layout.css +22 -0
- package/dist/css/layout.css.map +1 -1
- package/dist/css/layout.min.css +1 -1
- package/dist/css/layout.min.css.map +1 -1
- package/dist/js/fokus.js +270 -25
- package/dist/js/fokus.js.map +2 -2
- package/dist/js/fokus.min.js +18 -18
- package/dist/js/fokus.min.js.map +3 -3
- package/docs/components/alert.md +69 -24
- package/docs/components/badge.md +23 -4
- package/docs/components/checkbox.md +16 -3
- package/docs/components/popover.md +20 -7
- package/docs/components/radio.md +11 -1
- package/docs/components/responsive.md +19 -0
- package/docs/components/switch.md +30 -8
- package/docs/components/tag.md +19 -4
- package/docs/components/toast.md +72 -59
- package/docs/components/tooltip.md +38 -2
- package/docs/guides/accessibility.md +7 -0
- package/docs/guides/rtl-and-system-preferences.md +28 -0
- package/docs/prompts/prompt-plan.md +4 -4
- package/docs/reference/accessibility-matrix.md +7 -7
- package/docs/reference/contrast-report.md +4 -0
- package/docs/reference/definitions.md +5 -1
- package/docs/reference/design-tokens.md +14 -0
- package/docs/reference/size-baseline.json +13 -13
- package/mockup/assets/example-theme.css +11 -0
- package/mockup/assets/showcase-contracts.js +6 -6
- package/mockup/examples/alerts.html +105 -31
- package/mockup/examples/badges-alerts.html +91 -59
- package/mockup/examples/check-radio-switch.html +575 -99
- package/mockup/examples/popover.html +81 -0
- package/mockup/examples/tag.html +97 -87
- package/mockup/examples/toast.html +113 -0
- package/mockup/examples/tooltip.html +68 -0
- package/mockup/forms.html +1 -1
- package/mockup/overlays-commands.html +2 -2
- package/package.json +2 -1
- 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-core/scss/base/_accessibility.scss +14 -0
- package/packages/fokus-core/scss/tokens/_root.scss +11 -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/scss/entries/rtl-entry.scss +11 -0
package/docs/components/alert.md
CHANGED
|
@@ -1,42 +1,89 @@
|
|
|
1
1
|
# Alert
|
|
2
2
|
|
|
3
|
-
Mensagem
|
|
4
|
-
|
|
3
|
+
Mensagem contextual persistente para informar, confirmar, orientar ou explicar
|
|
4
|
+
um erro relacionado à região da página. Alert é CSS-only; para feedback
|
|
5
|
+
transitório controlado por JavaScript, use [Toast](toast.md).
|
|
5
6
|
|
|
6
|
-
##
|
|
7
|
+
## Uso mínimo
|
|
7
8
|
|
|
8
9
|
```html
|
|
9
|
-
<div class="fs-alert">Alerta neutro, sem cor de estado.</div>
|
|
10
10
|
<div class="fs-alert fs-alert-success">Operação concluída com sucesso.</div>
|
|
11
11
|
```
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
O uso antigo continua válido. Variantes: `.fs-alert-primary`,
|
|
14
|
+
`.fs-alert-secondary`, `.fs-alert-success`, `.fs-alert-warning`,
|
|
15
|
+
`.fs-alert-danger` e `.fs-alert-info`.
|
|
16
|
+
|
|
17
|
+
## Visão geral
|
|
14
18
|
|
|
15
|
-
|
|
19
|
+
Alert permanece visível no contexto da página até que a aplicação resolva a
|
|
20
|
+
condição ou faça seu fechamento manual. Não é substituto de Toast nem de
|
|
21
|
+
Alert Dialog.
|
|
16
22
|
|
|
17
|
-
##
|
|
23
|
+
## Anatomia opcional
|
|
18
24
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
sempre o mesmo `padding`.
|
|
25
|
+
Os slots abaixo são opcionais. O ícone deve ser decorativo quando o texto já
|
|
26
|
+
comunica o estado.
|
|
22
27
|
|
|
23
28
|
```html
|
|
24
|
-
<div class="fs-alert fs-alert-danger"
|
|
25
|
-
<
|
|
29
|
+
<div class="fs-alert fs-alert-danger" role="alert">
|
|
30
|
+
<span class="fs-alert-icon" aria-hidden="true"><svg class="fs-icon" aria-hidden="true"><!-- ícone --></svg></span>
|
|
31
|
+
<div class="fs-alert-content">
|
|
32
|
+
<h3 class="fs-alert-heading">Não foi possível salvar</h3>
|
|
33
|
+
<p class="fs-alert-text">Verifique os campos destacados e tente novamente.</p>
|
|
34
|
+
<div class="fs-alert-actions">
|
|
35
|
+
<button type="button" class="fs-btn fs-btn-danger fs-btn-sm">Tentar novamente</button>
|
|
36
|
+
<a class="fs-alert-link" href="#detalhes">Ver detalhes</a>
|
|
37
|
+
</div>
|
|
38
|
+
</div>
|
|
39
|
+
<button type="button" class="fs-btn-close fs-alert-close" aria-label="Fechar aviso"></button>
|
|
40
|
+
</div>
|
|
26
41
|
```
|
|
27
42
|
|
|
43
|
+
Classes: `.fs-alert-icon`, `.fs-alert-content`, `.fs-alert-heading`,
|
|
44
|
+
`.fs-alert-text`, `.fs-alert-actions`, `.fs-alert-link` e `.fs-alert-close`.
|
|
45
|
+
O fechamento é apenas composição visual; a aplicação liga sua própria lógica.
|
|
46
|
+
|
|
47
|
+
Para mensagens relacionadas, use `.fs-alert-group` no contêiner. A variante
|
|
48
|
+
`.fs-alert-inline` reduz a densidade para mensagens próximas a campos ou
|
|
49
|
+
regiões compactas. Para operações assíncronas, aplique `aria-busy="true"` e
|
|
50
|
+
componha um `.fs-spinner` decorativo; o Alert não desabilita ações nem gerencia
|
|
51
|
+
o término da operação automaticamente.
|
|
52
|
+
|
|
28
53
|
## Estados
|
|
29
54
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
55
|
+
Não há estados JavaScript próprios. Links, botões e o fechamento visual usam
|
|
56
|
+
seus estados nativos de foco, hover e ativação.
|
|
57
|
+
|
|
58
|
+
## Layout e tokens
|
|
59
|
+
|
|
60
|
+
O acabamento usa raio médio, borda estrutural neutra e barra semântica em
|
|
61
|
+
`border-inline-start`, funcionando em RTL. Textos longos quebram sem overflow
|
|
62
|
+
e ações usam flex-wrap em telas estreitas.
|
|
63
|
+
|
|
64
|
+
Tokens locais sobrescrevíveis: `--fs-alert-padding-block`,
|
|
65
|
+
`--fs-alert-padding-inline`, `--fs-alert-gap`, `--fs-alert-radius`,
|
|
66
|
+
`--fs-alert-border-width`, `--fs-alert-accent-width`, `--fs-alert-icon-size`,
|
|
67
|
+
`--fs-alert-heading-gap` e `--fs-alert-actions-gap`.
|
|
68
|
+
|
|
69
|
+
```html
|
|
70
|
+
<div class="fs-alert fs-alert-danger">Ocorreu um erro ao processar a solicitação.</div>
|
|
71
|
+
<div class="fs-alert fs-alert-warning">Atenção: essa ação não pode ser desfeita.</div>
|
|
72
|
+
```
|
|
33
73
|
|
|
34
74
|
## A11y
|
|
35
75
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
76
|
+
O framework não injeta ARIA, não cria ícones automaticamente e não move foco.
|
|
77
|
+
Use `role="status"` para atualização não urgente e `role="alert"` somente
|
|
78
|
+
quando a mensagem precisar ser anunciada imediatamente. O significado deve
|
|
79
|
+
continuar compreensível sem cor, ícone ou borda. Ícones decorativos usam
|
|
80
|
+
`aria-hidden="true"`; informação adicional precisa de texto equivalente.
|
|
81
|
+
|
|
82
|
+
Links e botões mantêm foco visível. Para decisão crítica use [Alert Dialog](alert-dialog.md);
|
|
83
|
+
para mensagem breve use Toast.
|
|
84
|
+
|
|
85
|
+
Em `forced-colors: active`, a borda semântica usa as cores do sistema e o
|
|
86
|
+
conteúdo continua legível sem depender do fundo tintado.
|
|
40
87
|
|
|
41
88
|
## API JS
|
|
42
89
|
|
|
@@ -44,10 +91,8 @@ Nenhuma — 100% CSS.
|
|
|
44
91
|
|
|
45
92
|
## Tokens
|
|
46
93
|
|
|
47
|
-
`--fs-alert-{nome}-bg`/`-text` (fundo tintado e texto
|
|
48
|
-
|
|
49
|
-
[`docs/reference/design-tokens.md`](../reference/design-tokens.md)),
|
|
50
|
-
`--fs-color-border`. Alerts usam `border-radius: 0`.
|
|
94
|
+
`--fs-alert-{nome}-bg`/`-text` (fundo tintado e texto) e `--fs-color-border`.
|
|
95
|
+
Os tokens locais acima permitem ajuste por instância.
|
|
51
96
|
|
|
52
97
|
## Exemplo
|
|
53
98
|
|
|
@@ -56,4 +101,4 @@ Nenhuma — 100% CSS.
|
|
|
56
101
|
<div class="fs-alert fs-alert-danger" role="alert">Erro ao salvar as alterações.</div>
|
|
57
102
|
```
|
|
58
103
|
|
|
59
|
-
Mockup: [laboratório do componente](../../mockup/
|
|
104
|
+
Mockup: [laboratório do componente](../../mockup/examples/alerts.html).
|
package/docs/components/badge.md
CHANGED
|
@@ -26,8 +26,15 @@ Um único elemento, `.fs-badge` — sem marcação interna obrigatória.
|
|
|
26
26
|
metadados e filtros. As variantes sólidas permanecem para destaque alto.
|
|
27
27
|
- **Tamanho**: `.fs-badge-sm` (18px), `.fs-badge-lg` (26px); sem sufixo =
|
|
28
28
|
22px (padrão).
|
|
29
|
+
- **Acabamento**: usa `--fs-radius-sm` (4px) por padrão, mantendo cantos
|
|
30
|
+
levemente arredondados sem transformar o badge em uma pílula.
|
|
31
|
+
- **Densidade**: `--fs-badge-padding-inline`,
|
|
32
|
+
`--fs-badge-padding-block-start` e `--fs-badge-padding-block-end` permitem
|
|
33
|
+
ajustar o espaço interno localmente sem substituir o componente inteiro.
|
|
29
34
|
- **Padrões**: `.fs-badge-dot` adiciona um indicador circular antes do texto;
|
|
30
|
-
`.fs-badge-count` estabiliza contagens com algarismos tabulares
|
|
35
|
+
`.fs-badge-count` estabiliza contagens com algarismos tabulares e
|
|
36
|
+
`.fs-badge-count-circle` cria um indicador circular para contagens curtas,
|
|
37
|
+
preferencialmente de um único dígito.
|
|
31
38
|
- **Split**: `.fs-badge-split` reúne um rótulo e um valor em segmentos
|
|
32
39
|
conectados. Use `.fs-badge-split-{nome}` para colorir o valor; os elementos
|
|
33
40
|
internos obrigatórios são `.fs-badge-split-label` e
|
|
@@ -64,10 +71,13 @@ Nenhuma — 100% CSS.
|
|
|
64
71
|
Usa os tokens de cor de tema (`--fs-color-{nome}`, ver
|
|
65
72
|
[`docs/reference/design-tokens.md`](../reference/design-tokens.md)) e expõe
|
|
66
73
|
`--fs-badge-color`, `--fs-badge-bg`, `--fs-badge-border`,
|
|
67
|
-
`--fs-badge-height` e `--fs-badge-radius` (
|
|
68
|
-
personalização localizada.
|
|
74
|
+
`--fs-badge-height` e `--fs-badge-radius` (`var(--fs-radius-sm)` por padrão)
|
|
75
|
+
para personalização localizada. A densidade também pode ser ajustada com
|
|
76
|
+
`--fs-badge-padding-inline`, `--fs-badge-padding-block-start` e
|
|
77
|
+
`--fs-badge-padding-block-end`. Split também expõe
|
|
69
78
|
`--fs-badge-split-{label|value}-{bg|color}`, `--fs-badge-split-height` e
|
|
70
|
-
`--fs-badge-split-radius
|
|
79
|
+
`--fs-badge-split-radius` (`var(--fs-radius-sm)` por padrão), aplicado ao
|
|
80
|
+
contêiner externo que conecta o rótulo e o valor.
|
|
71
81
|
|
|
72
82
|
## Exemplo
|
|
73
83
|
|
|
@@ -77,6 +87,15 @@ personalização localizada. Split também expõe
|
|
|
77
87
|
<span class="fs-badge fs-badge-warning fs-badge-sm">Pendente</span>
|
|
78
88
|
<span class="fs-badge fs-badge-soft-success fs-badge-dot">Online</span>
|
|
79
89
|
<span class="fs-badge fs-badge-count fs-badge-danger">12</span>
|
|
90
|
+
<span class="fs-badge fs-badge-count fs-badge-count-circle fs-badge-danger" aria-label="1 notificação não lida">1</span>
|
|
80
91
|
```
|
|
81
92
|
|
|
93
|
+
## Composição e contraste
|
|
94
|
+
|
|
95
|
+
Mantenha o badge próximo do título, status ou contagem que ele qualifica e
|
|
96
|
+
não use a cor como única indicação de estado. Para filtros ou ações, use um
|
|
97
|
+
botão ou Tag, não um badge estático. Em temas e marcas customizadas, valide
|
|
98
|
+
as variantes `soft` e `outline` com `npm run contrast:check` e confirme que o
|
|
99
|
+
texto continua legível nos temas claro e escuro.
|
|
100
|
+
|
|
82
101
|
Mockup: [laboratório do componente](../../mockup/feedback-actions.html#badge).
|
|
@@ -51,6 +51,10 @@ o preenchimento fica mais intenso para confirmar o clique.
|
|
|
51
51
|
versão atenuada de `primary`, em vez de reduzir a opacidade do controle todo.
|
|
52
52
|
- **Foco**: `:focus-visible` no input desenha o anel sobre a caixa
|
|
53
53
|
(`::before` da label), não sobre o texto.
|
|
54
|
+
- **Hover/active**: superfície e borda confirmam a interação sem depender
|
|
55
|
+
apenas da cor do texto.
|
|
56
|
+
- **RTL e movimento**: propriedades lógicas acompanham `dir="rtl"` e as
|
|
57
|
+
transições são desativadas em `prefers-reduced-motion: reduce`.
|
|
54
58
|
|
|
55
59
|
```html
|
|
56
60
|
<input type="checkbox" class="fs-check-input is-invalid" id="c1">
|
|
@@ -69,6 +73,9 @@ document.getElementById("c2").indeterminate = true;
|
|
|
69
73
|
- Sempre associe `label` via `for`/`id` — não use só `aria-label` no input
|
|
70
74
|
se houver texto visível ao lado (duplica a leitura ou some com o clique
|
|
71
75
|
no texto).
|
|
76
|
+
- Para grupos relacionados, use `fieldset`/`legend`. Associe ajuda ou erro
|
|
77
|
+
com `aria-describedby` e indique erro com `aria-invalid="true"` quando
|
|
78
|
+
aplicável.
|
|
72
79
|
|
|
73
80
|
## API JS
|
|
74
81
|
|
|
@@ -77,9 +84,15 @@ Nenhuma — 100% CSS. `indeterminate` é uma propriedade do DOM nativo do
|
|
|
77
84
|
|
|
78
85
|
## Tokens
|
|
79
86
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
87
|
+
Tokens de componente podem ser sobrescritos por instância sem `!important`:
|
|
88
|
+
|
|
89
|
+
| Token | Fallback | Uso |
|
|
90
|
+
|---|---|---|
|
|
91
|
+
| `--fs-check-size` | `18px` | Caixa visual |
|
|
92
|
+
| `--fs-check-border-width` | `--fs-border-width` | Borda |
|
|
93
|
+
| `--fs-check-radius` | `--fs-radius-sm` | Raio |
|
|
94
|
+
| `--fs-check-gap` | `--fs-space-2` | Distância até o texto |
|
|
95
|
+
| `--fs-check-mark-color` | `--fs-color-on-primary` | Marca |
|
|
83
96
|
|
|
84
97
|
## Exemplo
|
|
85
98
|
|
|
@@ -19,9 +19,10 @@ aparência de card de superfície em vez do chip escuro.
|
|
|
19
19
|
## Anatomia
|
|
20
20
|
|
|
21
21
|
Gatilho (qualquer elemento) + `.fs-popover` > `.fs-popover-header`
|
|
22
|
-
(opcional) + `.fs-popover-body` + `.fs-popover-footer` (opcional
|
|
23
|
-
|
|
24
|
-
|
|
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.
|
|
25
26
|
|
|
26
27
|
## Variações
|
|
27
28
|
|
|
@@ -52,7 +53,9 @@ automaticamente.
|
|
|
52
53
|
|
|
53
54
|
## Estados
|
|
54
55
|
|
|
55
|
-
`.is-open` — controlado pelo JS.
|
|
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.
|
|
56
59
|
|
|
57
60
|
## A11y
|
|
58
61
|
|
|
@@ -63,6 +66,12 @@ clique fora fecha. Um elemento dentro do popover com
|
|
|
63
66
|
`data-fs-dismiss="popover"` fecha ao ser clicado (útil pra um botão "OK"
|
|
64
67
|
no footer).
|
|
65
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
|
+
|
|
66
75
|
## API JS
|
|
67
76
|
|
|
68
77
|
Auto-init via `data-fs="popover"`. `Popover.getInstance(el)` (`el` é o
|
|
@@ -83,7 +92,12 @@ Auto-init via `data-fs="popover"`. `Popover.getInstance(el)` (`el` é o
|
|
|
83
92
|
## Tokens
|
|
84
93
|
|
|
85
94
|
`--fs-color-border`, `--fs-color-surface`, `--fs-color-subtle` (header),
|
|
86
|
-
`--fs-color-text`, `--fs-radius-md`, `--fs-shadow-md
|
|
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`.
|
|
87
101
|
|
|
88
102
|
## Exemplo
|
|
89
103
|
|
|
@@ -101,5 +115,4 @@ Auto-init via `data-fs="popover"`. `Popover.getInstance(el)` (`el` é o
|
|
|
101
115
|
</div>
|
|
102
116
|
```
|
|
103
117
|
|
|
104
|
-
Mockup: [laboratório do componente](../../mockup/
|
|
105
|
-
[`mockup/overlays-commands.html#hover-card`](../../mockup/overlays-commands.html#popover).
|
|
118
|
+
Mockup: [laboratório independente do componente](../../mockup/examples/popover.html).
|
package/docs/components/radio.md
CHANGED
|
@@ -36,6 +36,9 @@ Tamanho: `.fs-radio-sm`, `.fs-radio-lg` no wrapper.
|
|
|
36
36
|
- **checked**, **disabled**, validação (`.is-valid`/`.is-invalid`) e foco —
|
|
37
37
|
mesmo padrão do [Checkbox](checkbox.md). Não existe `indeterminate` para
|
|
38
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`.
|
|
39
42
|
|
|
40
43
|
## A11y
|
|
41
44
|
|
|
@@ -45,6 +48,8 @@ Tamanho: `.fs-radio-sm`, `.fs-radio-lg` no wrapper.
|
|
|
45
48
|
`Tab`/`Shift+Tab` entram/saem do grupo de uma vez (o item selecionado, ou
|
|
46
49
|
o primeiro se nenhum estiver selecionado, é o único no fluxo de tab).
|
|
47
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`.
|
|
48
53
|
|
|
49
54
|
## API JS
|
|
50
55
|
|
|
@@ -52,7 +57,12 @@ Nenhuma — 100% CSS.
|
|
|
52
57
|
|
|
53
58
|
## Tokens
|
|
54
59
|
|
|
55
|
-
|
|
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 |
|
|
56
66
|
|
|
57
67
|
## Exemplo
|
|
58
68
|
|
|
@@ -0,0 +1,19 @@
|
|
|
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.
|
|
@@ -18,7 +18,7 @@ design deliberada (nada circular no framework além de radio/spinner).
|
|
|
18
18
|
|
|
19
19
|
`.fs-switch` (wrapper) > `.fs-switch-input` (oculto via clip) +
|
|
20
20
|
`.fs-switch-label` (`<label for="...">`, desenha o trilho via `::before` e
|
|
21
|
-
o knob via `::after`, que desliza com
|
|
21
|
+
o knob via `::after`, que desliza com propriedades lógicas e `transition`).
|
|
22
22
|
|
|
23
23
|
## Variações
|
|
24
24
|
|
|
@@ -26,9 +26,11 @@ Tamanho: `.fs-switch-sm`, `.fs-switch-lg` no wrapper.
|
|
|
26
26
|
|
|
27
27
|
## Estados
|
|
28
28
|
|
|
29
|
-
checked/disabled/foco — mesmo padrão do [Checkbox](checkbox.md).
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
checked/disabled/foco — mesmo padrão do [Checkbox](checkbox.md). O switch
|
|
30
|
+
também possui hover com halo sutil, active com redução discreta do thumb,
|
|
31
|
+
valid/invalid opcional para uso em formulário, forced colors e redução de
|
|
32
|
+
movimento. O trilho desligado usa superfície neutra e o thumb possui contraste
|
|
33
|
+
e elevação próprios. Não há `indeterminate`.
|
|
32
34
|
|
|
33
35
|
## A11y
|
|
34
36
|
|
|
@@ -40,6 +42,8 @@ validável, é um controle de preferência/estado).
|
|
|
40
42
|
- Quando não houver texto visível ao lado (ex.: dentro de um
|
|
41
43
|
[Tile](tile.md), como no exemplo abaixo), use `aria-label` no `<input>`
|
|
42
44
|
em vez de deixar a `<label>` vazia.
|
|
45
|
+
- O Fokus Styles não injeta `role="switch"`: o contrato oficial continua
|
|
46
|
+
sendo o checkbox nativo, com `Space` e anúncio de marcado/desmarcado.
|
|
43
47
|
|
|
44
48
|
```html
|
|
45
49
|
<div class="fs-switch">
|
|
@@ -54,9 +58,27 @@ Nenhuma — 100% CSS.
|
|
|
54
58
|
|
|
55
59
|
## Tokens
|
|
56
60
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
`--fs-
|
|
61
|
+
| Token | Fallback | Uso |
|
|
62
|
+
|---|---|---|
|
|
63
|
+
| `--fs-switch-track-width` | `40px` | Largura do trilho |
|
|
64
|
+
| `--fs-switch-track-height` | `24px` | Altura do trilho |
|
|
65
|
+
| `--fs-switch-thumb-width` | `18px` | Largura do knob |
|
|
66
|
+
| `--fs-switch-thumb-height` | `18px` | Altura do knob |
|
|
67
|
+
| `--fs-switch-thumb-offset` | `3px` | Posição desligada |
|
|
68
|
+
| `--fs-switch-on-offset` | `19px` | Posição ligada |
|
|
69
|
+
| `--fs-switch-radius` | `--fs-radius-md` | Raio do trilho |
|
|
70
|
+
| `--fs-switch-thumb-radius` | `--fs-radius-sm` | Raio do knob |
|
|
71
|
+
| `--fs-switch-gap` | `--fs-space-2` | Distância até o texto |
|
|
72
|
+
| `--fs-switch-track-bg` | `--fs-color-subtle` | Fundo desligado |
|
|
73
|
+
| `--fs-switch-track-border` | `--fs-color-border-default` | Borda do trilho |
|
|
74
|
+
| `--fs-switch-track-checked-bg` | `--fs-color-primary` | Fundo ligado |
|
|
75
|
+
| `--fs-switch-thumb-bg` | `--fs-color-surface` | Fundo do knob |
|
|
76
|
+
| `--fs-switch-thumb-border` | `--fs-color-border-default` | Borda do knob |
|
|
77
|
+
| `--fs-switch-thumb-shadow` | `--fs-shadow-sm` | Elevação do knob |
|
|
78
|
+
| `--fs-switch-track-shadow` | Sombra interna sutil | Profundidade do trilho desligado |
|
|
79
|
+
| `--fs-switch-hover-ring` | Mistura de primary com transparente | Halo de hover |
|
|
80
|
+
| `--fs-switch-hover-shadow` | Halo baseado em `--fs-switch-hover-ring` | Sombra de hover |
|
|
81
|
+
| `--fs-switch-active-scale` | `0.92` | Escala do knob durante active |
|
|
60
82
|
|
|
61
83
|
## Exemplo
|
|
62
84
|
|
|
@@ -71,5 +93,5 @@ ligado), `--fs-color-border` (knob desligado), `--fs-radius-md` (trilho),
|
|
|
71
93
|
</div>
|
|
72
94
|
```
|
|
73
95
|
|
|
74
|
-
Mockup: [laboratório do componente](../../mockup/
|
|
96
|
+
Mockup: [laboratório do componente](../../mockup/forms.html#check-radio-switch).
|
|
75
97
|
Uso combinado com Tile: [laboratório de conteúdo e dados](../../mockup/content-data.html#tile).
|
package/docs/components/tag.md
CHANGED
|
@@ -24,9 +24,14 @@ Badge, não um componente separado) contendo texto + `.fs-btn-close` com
|
|
|
24
24
|
- **Tamanho**: apenas o tamanho padrão. Tags são controles compactos de
|
|
25
25
|
remoção; usar uma única densidade evita variações de alvo e de texto em
|
|
26
26
|
filtros e formulários.
|
|
27
|
-
- **Í
|
|
28
|
-
de `.fs-tag-label
|
|
29
|
-
texto
|
|
27
|
+
- **Ícones**: envolva um SVG de `fokus-styles/icons` em `.fs-tag-icon` antes
|
|
28
|
+
de `.fs-tag-label` para ícone inicial ou use `.fs-tag-icon-end` depois do
|
|
29
|
+
texto para indicar um estado. O contêiner do ícone usa a mesma dimensão
|
|
30
|
+
visual do botão de fechamento; `--fs-tag-icon-size`,
|
|
31
|
+
`--fs-tag-icon-glyph-size`, `--fs-tag-icon-gap` e `--fs-tag-icon-color`
|
|
32
|
+
permitem ajustes locais. O
|
|
33
|
+
ícone é decorativo (`aria-hidden="true"`) quando o texto já descreve a tag;
|
|
34
|
+
nunca use uma Tag somente com ícone como padrão.
|
|
30
35
|
- **Texto longo**: use `.fs-tag-truncate` na tag e `.fs-tag-label` no texto.
|
|
31
36
|
Defina `--fs-tag-max-inline-size` conforme o contexto; o texto integral
|
|
32
37
|
continua no DOM e pode ser exposto em `title` como apoio visual.
|
|
@@ -44,6 +49,9 @@ Badge, não um componente separado) contendo texto + `.fs-btn-close` com
|
|
|
44
49
|
Conecte-o a um popover ou a uma lista expandida e mantenha `aria-expanded`
|
|
45
50
|
sincronizado com essa interface.
|
|
46
51
|
|
|
52
|
+
O botão de fechamento usa `--fs-tag-close-size` e `--fs-tag-close-gap`, herda
|
|
53
|
+
o raio do Badge e é a única ação de remoção. A Tag inteira não é um botão.
|
|
54
|
+
|
|
47
55
|
```html
|
|
48
56
|
<div class="fs-tag-group">
|
|
49
57
|
<span class="fs-badge fs-tag" data-fs="tag">Design<button type="button" class="fs-btn-close" data-fs-dismiss="tag" aria-label="Remover"></button></span>
|
|
@@ -69,6 +77,11 @@ remoção é desabilitado até que o estado seja removido.
|
|
|
69
77
|
Frontend", não só "Remover") — é um botão só-ícone.
|
|
70
78
|
- A remoção só acontece ao clicar no botão de fechar, nunca ao clicar na
|
|
71
79
|
tag inteira — evita remoção acidental.
|
|
80
|
+
- Se o botão de fechar estiver focado quando a Tag for removida, o foco vai
|
|
81
|
+
para a próxima Tag do mesmo grupo; se não houver, vai para a anterior.
|
|
82
|
+
Remoções programáticas sem foco no botão não movem o foco.
|
|
83
|
+
- Ícones com significado próprio precisam ser acompanhados por texto ou
|
|
84
|
+
descrição acessível; não dependa apenas do desenho ou da cor.
|
|
72
85
|
- Para tags truncadas, mantenha a string completa dentro de `.fs-tag-label`;
|
|
73
86
|
ela continua disponível para tecnologias assistivas. `title` é apenas uma
|
|
74
87
|
ajuda adicional para ponteiro.
|
|
@@ -91,7 +104,9 @@ Auto-init via `data-fs="tag"`. `Tag.getInstance(el)`.
|
|
|
91
104
|
|
|
92
105
|
## Tokens
|
|
93
106
|
|
|
94
|
-
Usa os tokens de [Badge](badge.md)
|
|
107
|
+
Usa os tokens de [Badge](badge.md) e expõe tokens locais para composição:
|
|
108
|
+
`--fs-tag-icon-size`, `--fs-tag-icon-glyph-size`, `--fs-tag-icon-gap`, `--fs-tag-icon-color`,
|
|
109
|
+
`--fs-tag-close-size` e `--fs-tag-close-gap`.
|
|
95
110
|
|
|
96
111
|
## Exemplo
|
|
97
112
|
|
package/docs/components/toast.md
CHANGED
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
# Toast
|
|
2
2
|
|
|
3
|
-
Notificação
|
|
4
|
-
|
|
3
|
+
Notificação flutuante e temporária para confirmar uma ação não bloqueante.
|
|
4
|
+
Para mensagens persistentes no contexto da página use [Alert](alert.md); para
|
|
5
|
+
histórico e revisão posterior use [Notification Center](notification-center.md).
|
|
5
6
|
|
|
6
7
|
## Visão geral
|
|
7
8
|
|
|
8
9
|
```html
|
|
9
|
-
<button type="button" class="fs-btn fs-btn-primary" id="btn-toast">Mostrar toast</button>
|
|
10
|
-
|
|
11
10
|
<div class="fs-toast-container">
|
|
12
|
-
<div class="fs-toast fs-toast-success" data-fs="toast"
|
|
11
|
+
<div class="fs-toast fs-toast-success" data-fs="toast" data-delay="4000">
|
|
13
12
|
<div class="fs-toast-header">
|
|
14
13
|
<span>Sucesso</span>
|
|
15
14
|
<button type="button" class="fs-btn-close" data-fs-dismiss="toast" aria-label="Fechar"></button>
|
|
@@ -19,77 +18,91 @@ ou automática por tempo. Base do [Notification Center](notification-center.md).
|
|
|
19
18
|
</div>
|
|
20
19
|
```
|
|
21
20
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
});
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
Ao contrário de Modal/Offcanvas, o Toast **não** abre sozinho ao clicar num
|
|
29
|
-
gatilho com `data-fs-target` — ele é mostrado programaticamente via
|
|
30
|
-
`.show()`, porque geralmente é disparado por um evento da sua aplicação
|
|
31
|
-
(sucesso de uma requisição, etc.), não diretamente por um clique.
|
|
21
|
+
O Toast é inicializado pelo atributo `data-fs="toast"`, mas só aparece quando
|
|
22
|
+
`.show()` é chamado. O container é fixo, empilha mensagens e usa propriedades
|
|
23
|
+
lógicas para funcionar em RTL e respeitar áreas seguras móveis.
|
|
32
24
|
|
|
33
25
|
## Anatomia
|
|
34
26
|
|
|
35
|
-
`.fs-toast-container`
|
|
36
|
-
|
|
37
|
-
`.fs-toast-
|
|
27
|
+
`.fs-toast-container` contém um ou mais `.fs-toast`. Dentro dele, os slots
|
|
28
|
+
opcionais são `.fs-toast-header`, `.fs-toast-icon`, `.fs-toast-heading`,
|
|
29
|
+
`.fs-toast-title`, `.fs-toast-meta`, `.fs-toast-body`, `.fs-toast-actions`,
|
|
30
|
+
`.fs-toast-link`, `.fs-toast-close` e `.fs-toast-progress`.
|
|
31
|
+
|
|
32
|
+
```html
|
|
33
|
+
<div class="fs-toast fs-toast-success" data-fs="toast" data-delay="5000" data-toast-progress="true">
|
|
34
|
+
<div class="fs-toast-header">
|
|
35
|
+
<span class="fs-toast-icon" aria-hidden="true">✓</span>
|
|
36
|
+
<div class="fs-toast-heading">
|
|
37
|
+
<strong class="fs-toast-title">Arquivo salvo</strong>
|
|
38
|
+
<span class="fs-toast-meta">Agora</span>
|
|
39
|
+
</div>
|
|
40
|
+
<button type="button" class="fs-btn-close fs-toast-close" data-fs-dismiss="toast" aria-label="Fechar aviso de arquivo salvo"></button>
|
|
41
|
+
</div>
|
|
42
|
+
<div class="fs-toast-body">O documento foi salvo com sucesso.</div>
|
|
43
|
+
<div class="fs-toast-actions">
|
|
44
|
+
<button type="button" class="fs-btn fs-btn-sm fs-btn-success">Desfazer</button>
|
|
45
|
+
<a href="#detalhes" class="fs-toast-link">Ver detalhes</a>
|
|
46
|
+
</div>
|
|
47
|
+
<div class="fs-toast-progress" aria-hidden="true"></div>
|
|
48
|
+
</div>
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
O ícone é fornecido pelo consumidor e deve ser decorativo quando o texto já
|
|
52
|
+
explicar o estado. Ações usam Button; o fechamento continua sendo o único
|
|
53
|
+
controle obrigatório da dispensa.
|
|
38
54
|
|
|
39
|
-
## Variações
|
|
55
|
+
## Variações e estados
|
|
40
56
|
|
|
41
|
-
|
|
42
|
-
`.fs-toast`
|
|
57
|
+
Variantes: `.fs-toast-primary`, `.fs-toast-secondary`, `.fs-toast-success`,
|
|
58
|
+
`.fs-toast-warning`, `.fs-toast-danger` e `.fs-toast-info`.
|
|
43
59
|
|
|
44
|
-
|
|
60
|
+
- `data-delay="4000"` define o tempo de auto-dismiss em milissegundos;
|
|
61
|
+
- `data-autohide="false"` mantém o Toast aberto;
|
|
62
|
+
- `data-toast-progress="true"` exibe a barra de tempo quando o auto-dismiss está ativo;
|
|
63
|
+
- hover, foco e interação pausam o timer e a barra de progresso;
|
|
64
|
+
- `prefers-reduced-motion` elimina a animação contínua do progresso.
|
|
45
65
|
|
|
46
|
-
|
|
47
|
-
inline até a primeira `show()`).
|
|
66
|
+
## Estados
|
|
48
67
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
68
|
+
O Toast começa oculto, entra em `.is-open` durante a exibição e pode ser
|
|
69
|
+
pausado por hover ou foco. `hide()` e auto-dismiss cancelam o timer e ocultam
|
|
70
|
+
o elemento sem transferir foco.
|
|
52
71
|
|
|
53
72
|
## A11y
|
|
54
73
|
|
|
55
|
-
`role="status"`
|
|
56
|
-
|
|
57
|
-
|
|
74
|
+
O JavaScript aplica `role="status"` e `aria-live="polite"`. O Toast não move
|
|
75
|
+
foco automaticamente e não deve usar `aria-live="assertive"` por padrão.
|
|
76
|
+
Botões de fechamento precisam de `aria-label` específico; links e ações devem
|
|
77
|
+
ter nomes compreensíveis. Ícones decorativos usam `aria-hidden="true"` e não
|
|
78
|
+
substituem texto.
|
|
58
79
|
|
|
59
|
-
|
|
80
|
+
Use `data-autohide="false"` para erros que exigem ação. Não use Toast para
|
|
81
|
+
decisões críticas, conteúdo extenso ou mensagens que precisam permanecer no
|
|
82
|
+
contexto da região afetada.
|
|
60
83
|
|
|
61
|
-
|
|
62
|
-
automaticamente). `Toast.getInstance(el)`.
|
|
84
|
+
## API JS
|
|
63
85
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
86
|
+
```js
|
|
87
|
+
const toast = FokusStyles.Toast.getInstance(document.querySelector(".fs-toast"));
|
|
88
|
+
toast.show();
|
|
89
|
+
toast.hide();
|
|
90
|
+
toast.toggle();
|
|
91
|
+
toast.dispose();
|
|
92
|
+
```
|
|
70
93
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
| `fs:toast:shown` | Não | Depois que a animação de mostrar termina. |
|
|
74
|
-
| `fs:toast:hidden` | Não | Depois que a animação de esconder termina (inclusive auto-hide). |
|
|
94
|
+
Eventos preservados: `fs:toast:shown` e `fs:toast:hidden`. O componente pausa
|
|
95
|
+
o auto-dismiss durante hover e foco, sem transferir foco para outro Toast.
|
|
75
96
|
|
|
76
97
|
## Tokens
|
|
77
98
|
|
|
78
|
-
`--fs-
|
|
79
|
-
|
|
99
|
+
Container: `--fs-toast-offset`, `--fs-toast-gap`, `--fs-toast-width` e
|
|
100
|
+
`--fs-toast-max-width`. Instância: `--fs-toast-padding-block`,
|
|
101
|
+
`--fs-toast-padding-inline`, `--fs-toast-gap`, `--fs-toast-radius`,
|
|
102
|
+
`--fs-toast-shadow`, `--fs-toast-icon-size`, `--fs-toast-title-gap`,
|
|
103
|
+
`--fs-toast-actions-gap`, `--fs-toast-border-width` e
|
|
104
|
+
`--fs-toast-progress-height`.
|
|
80
105
|
|
|
81
|
-
##
|
|
82
|
-
|
|
83
|
-
```html
|
|
84
|
-
<div class="fs-toast-container">
|
|
85
|
-
<div class="fs-toast fs-toast-danger" data-fs="toast" id="erroToast" data-autohide="false">
|
|
86
|
-
<div class="fs-toast-header">
|
|
87
|
-
<span>Erro</span>
|
|
88
|
-
<button type="button" class="fs-btn-close" data-fs-dismiss="toast" aria-label="Fechar"></button>
|
|
89
|
-
</div>
|
|
90
|
-
<div class="fs-toast-body">Falha ao salvar. Tente novamente.</div>
|
|
91
|
-
</div>
|
|
92
|
-
</div>
|
|
93
|
-
```
|
|
106
|
+
## Mockup
|
|
94
107
|
|
|
95
|
-
|
|
108
|
+
[Laboratório independente do Toast](../../mockup/examples/toast.html).
|