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.
Files changed (101) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/dist/css/components.css +583 -83
  3. package/dist/css/components.css.map +1 -1
  4. package/dist/css/components.min.css +1 -1
  5. package/dist/css/components.min.css.map +1 -1
  6. package/dist/css/fokus-components.css +583 -83
  7. package/dist/css/fokus-components.css.map +1 -1
  8. package/dist/css/fokus-components.min.css +1 -1
  9. package/dist/css/fokus-components.min.css.map +1 -1
  10. package/dist/css/fokus-core.css +22 -0
  11. package/dist/css/fokus-core.css.map +1 -1
  12. package/dist/css/fokus-core.min.css +1 -1
  13. package/dist/css/fokus-core.min.css.map +1 -1
  14. package/dist/css/fokus-dark.css +10 -0
  15. package/dist/css/fokus-dark.css.map +1 -1
  16. package/dist/css/fokus-dark.min.css +1 -1
  17. package/dist/css/fokus-dark.min.css.map +1 -1
  18. package/dist/css/fokus-rtl.css +9166 -0
  19. package/dist/css/fokus-rtl.css.map +1 -0
  20. package/dist/css/fokus-rtl.min.css +2 -0
  21. package/dist/css/fokus-rtl.min.css.map +1 -0
  22. package/dist/css/fokus-utilities.css +158 -0
  23. package/dist/css/fokus-utilities.css.map +1 -1
  24. package/dist/css/fokus-utilities.min.css +1 -1
  25. package/dist/css/fokus-utilities.min.css.map +1 -1
  26. package/dist/css/fokus.css +1018 -258
  27. package/dist/css/fokus.css.map +1 -1
  28. package/dist/css/fokus.min.css +1 -1
  29. package/dist/css/fokus.min.css.map +1 -1
  30. package/dist/css/forms.css +322 -176
  31. package/dist/css/forms.css.map +1 -1
  32. package/dist/css/forms.min.css +1 -1
  33. package/dist/css/forms.min.css.map +1 -1
  34. package/dist/css/helpers.css +158 -0
  35. package/dist/css/helpers.css.map +1 -1
  36. package/dist/css/helpers.min.css +1 -1
  37. package/dist/css/helpers.min.css.map +1 -1
  38. package/dist/css/layout.css +22 -0
  39. package/dist/css/layout.css.map +1 -1
  40. package/dist/css/layout.min.css +1 -1
  41. package/dist/css/layout.min.css.map +1 -1
  42. package/dist/js/fokus.js +270 -25
  43. package/dist/js/fokus.js.map +2 -2
  44. package/dist/js/fokus.min.js +18 -18
  45. package/dist/js/fokus.min.js.map +3 -3
  46. package/docs/components/alert.md +69 -24
  47. package/docs/components/badge.md +23 -4
  48. package/docs/components/checkbox.md +16 -3
  49. package/docs/components/popover.md +20 -7
  50. package/docs/components/radio.md +11 -1
  51. package/docs/components/responsive.md +19 -0
  52. package/docs/components/switch.md +30 -8
  53. package/docs/components/tag.md +19 -4
  54. package/docs/components/toast.md +72 -59
  55. package/docs/components/tooltip.md +38 -2
  56. package/docs/guides/accessibility.md +7 -0
  57. package/docs/guides/rtl-and-system-preferences.md +28 -0
  58. package/docs/prompts/prompt-plan.md +4 -4
  59. package/docs/reference/accessibility-matrix.md +7 -7
  60. package/docs/reference/contrast-report.md +4 -0
  61. package/docs/reference/definitions.md +5 -1
  62. package/docs/reference/design-tokens.md +14 -0
  63. package/docs/reference/size-baseline.json +13 -13
  64. package/mockup/assets/example-theme.css +11 -0
  65. package/mockup/assets/showcase-contracts.js +6 -6
  66. package/mockup/examples/alerts.html +105 -31
  67. package/mockup/examples/badges-alerts.html +91 -59
  68. package/mockup/examples/check-radio-switch.html +575 -99
  69. package/mockup/examples/popover.html +81 -0
  70. package/mockup/examples/tag.html +97 -87
  71. package/mockup/examples/toast.html +113 -0
  72. package/mockup/examples/tooltip.html +68 -0
  73. package/mockup/forms.html +1 -1
  74. package/mockup/overlays-commands.html +2 -2
  75. package/package.json +2 -1
  76. package/packages/fokus-components/scss/components/_alerts.scss +128 -6
  77. package/packages/fokus-components/scss/components/_badges.scss +26 -10
  78. package/packages/fokus-components/scss/components/_index.scss +1 -0
  79. package/packages/fokus-components/scss/components/_popover.scss +131 -21
  80. package/packages/fokus-components/scss/components/_responsive.scss +23 -0
  81. package/packages/fokus-components/scss/components/_tag.scss +37 -14
  82. package/packages/fokus-components/scss/components/_toasts.scss +156 -11
  83. package/packages/fokus-components/scss/components/_tooltips.scss +70 -18
  84. package/packages/fokus-components/scss/forms/_check-radio-switch.scss +313 -215
  85. package/packages/fokus-components/scss/forms/_forms.scss +16 -0
  86. package/packages/fokus-core/scss/base/_accessibility.scss +14 -0
  87. package/packages/fokus-core/scss/tokens/_root.scss +11 -0
  88. package/packages/fokus-js/js/carousel.d.ts +4 -0
  89. package/packages/fokus-js/js/carousel.js +8 -0
  90. package/packages/fokus-js/js/core/positioning.js +18 -9
  91. package/packages/fokus-js/js/dropdown.d.ts +4 -0
  92. package/packages/fokus-js/js/dropdown.js +7 -0
  93. package/packages/fokus-js/js/popover.js +26 -1
  94. package/packages/fokus-js/js/tabs.d.ts +3 -0
  95. package/packages/fokus-js/js/tabs.js +5 -0
  96. package/packages/fokus-js/js/tag.js +17 -0
  97. package/packages/fokus-js/js/toast.js +77 -3
  98. package/packages/fokus-js/js/tooltip.d.ts +8 -1
  99. package/packages/fokus-js/js/tooltip.js +106 -13
  100. package/packages/fokus-utilities/scss/utilities/_api.scss +48 -0
  101. package/scss/entries/rtl-entry.scss +11 -0
@@ -1,42 +1,89 @@
1
1
  # Alert
2
2
 
3
- Mensagem de estado (sucesso, erro, aviso, informação) com destaque visual —
4
- fundo tintado, texto com contraste garantido, barra lateral colorida.
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
- ## Visão geral
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
- ## Anatomia
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
- Um único elemento, `.fs-alert` sem marcação interna obrigatória.
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
- ## Variações
23
+ ## Anatomia opcional
18
24
 
19
- Cor: `.fs-alert-{primary|secondary|success|warning|danger|info}`. Sem
20
- modificador, usa borda/texto neutros. Sem tamanhos (`-sm`/`-lg`) — Alert é
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">Ocorreu um erro ao processar a solicitação.</div>
25
- <div class="fs-alert fs-alert-warning">Atenção: essa ação não pode ser desfeita.</div>
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
- Nenhum elemento estático. Para um alerta dispensável, monte você mesmo
31
- com um `.fs-btn-close` (ver [Toast](toast.md) para o padrão de dispensa com
32
- JS, caso precise).
55
+ Não 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
- Para alertas que aparecem dinamicamente (não presentes no HTML da
37
- carga), adicione `role="alert"` (ou `role="status"` para os menos urgentes)
38
- no elemento, pra leitores de tela anunciarem automaticamente o framework
39
- não injeta esse atributo.
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, calculados por
48
- `tint-color()`/`shade-color()` a partir do primitivo ver
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/feedback-actions.html#alert).
104
+ Mockup: [laboratório do componente](../../mockup/examples/alerts.html).
@@ -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` (0 por padrão) para
68
- personalização localizada. Split também expõe
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
- Sem tokens de componente próprios usa `--fs-color-primary` (caixa
81
- marcada), `--fs-color-border`/`--fs-color-surface` (caixa vazia),
82
- `--fs-color-success`/`--fs-color-danger` (validação), `--fs-radius-sm`.
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, ações
23
- alinhadas à direita). A seta (`.fs-popover-arrow`) é gerada
24
- automaticamente.
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/overlays-commands.html#popover),
105
- [`mockup/overlays-commands.html#hover-card`](../../mockup/overlays-commands.html#popover).
118
+ Mockup: [laboratório independente do componente](../../mockup/examples/popover.html).
@@ -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
- Mesmos do [Checkbox](checkbox.md) sem tokens próprios.
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 `left` + `transition`).
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). Sem
30
- `indeterminate` nem validação (switch não é um campo de formulário
31
- validável, é um controle de preferência/estado).
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
- Sem tokens de componente próprios usa `--fs-color-primary` (trilho
58
- ligado), `--fs-color-border` (knob desligado), `--fs-radius-md` (trilho),
59
- `--fs-radius-sm` (knob).
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/content-data.html#tile).
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).
@@ -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
- - **Ícone inicial**: envolva um SVG de `fokus-styles/icons` em `.fs-tag-icon` antes
28
- de `.fs-tag-label`. O ícone é decorativo (`aria-hidden="true"`) quando o
29
- texto descreve a tag.
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). Sem tokens de componente próprios.
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
 
@@ -1,15 +1,14 @@
1
1
  # Toast
2
2
 
3
- Notificação temporária, empilhada num canto da tela, com dispensa manual
4
- ou automática por tempo. Base do [Notification Center](notification-center.md).
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" id="meuToast" data-delay="4000">
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
- ```js
23
- document.getElementById("btn-toast").addEventListener("click", () => {
24
- FokusStyles.Toast.getInstance(document.getElementById("meuToast")).show();
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` (posição fixa num canto um por página,
36
- compartilhado por todos os toasts) > `.fs-toast` (`data-fs="toast"`) >
37
- `.fs-toast-header` (título + `.fs-btn-close`) + `.fs-toast-body`.
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
- Cor: `.fs-toast-{primary|secondary|success|warning|danger|info}` no
42
- `.fs-toast` tinge só o header.
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
- ## Estados
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
- `.is-open` — controlado pelo JS (o toast começa com `display: none`
47
- inline até a primeira `show()`).
66
+ ## Estados
48
67
 
49
- - `data-delay` (ms, padrão `4000`) tempo até auto-esconder.
50
- - `data-autohide="false"` desativa o auto-esconder; fecha pelo
51
- `.fs-btn-close` ou `.hide()` programático.
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"` + `aria-live="polite"` aplicados automaticamente leitor
56
- de tela anuncia o conteúdo ao aparecer, sem interromper o que está sendo
57
- lido (diferente de `aria-live="assertive"`, que interromperia).
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
- ## API JS
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
- Auto-init via `data-fs="toast"` (registra a instância, mas **não** mostra
62
- automaticamente). `Toast.getInstance(el)`.
84
+ ## API JS
63
85
 
64
- | Método | Descrição |
65
- |---|---|
66
- | `show()` | Mostra (anima expansão), inicia o temporizador de auto-esconder se `autohide` estiver ativo. |
67
- | `hide()` | Esconde (anima recolhimento), cancela o temporizador. |
68
- | `toggle()` | Alterna. |
69
- | `dispose()` | Cancela o temporizador, remove listeners, desregistra a instância. |
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
- | Evento | Cancelável | Quando |
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-color-border`, `--fs-color-surface`, `--fs-alert-{nome}-bg`/`-text`
79
- (header colorido), `--fs-radius-md`, `--fs-shadow-md`.
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
- ## Exemplo
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
- Mockup: [laboratório do componente](../../mockup/overlays-commands.html#toast).
108
+ [Laboratório independente do Toast](../../mockup/examples/toast.html).