fokus-styles 2.4.0 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (212) hide show
  1. package/dist/css/components.css +561 -83
  2. package/dist/css/components.min.css +1 -1
  3. package/dist/css/fokus-components.css +561 -83
  4. package/dist/css/fokus-components.min.css +1 -1
  5. package/dist/css/fokus-rtl.css +697 -83
  6. package/dist/css/fokus-rtl.min.css +1 -1
  7. package/dist/css/fokus-utilities.css +136 -0
  8. package/dist/css/fokus-utilities.min.css +1 -1
  9. package/dist/css/fokus.css +996 -258
  10. package/dist/css/fokus.min.css +1 -1
  11. package/dist/css/forms.css +300 -176
  12. package/dist/css/forms.min.css +1 -1
  13. package/dist/css/helpers.css +136 -0
  14. package/dist/css/helpers.min.css +1 -1
  15. package/dist/js/fokus.js +270 -25
  16. package/dist/js/fokus.min.js +18 -18
  17. package/package.json +17 -15
  18. package/packages/fokus-components/scss/components/_alerts.scss +128 -6
  19. package/packages/fokus-components/scss/components/_badges.scss +26 -10
  20. package/packages/fokus-components/scss/components/_index.scss +1 -0
  21. package/packages/fokus-components/scss/components/_popover.scss +131 -21
  22. package/packages/fokus-components/scss/components/_responsive.scss +23 -0
  23. package/packages/fokus-components/scss/components/_tag.scss +37 -14
  24. package/packages/fokus-components/scss/components/_toasts.scss +156 -11
  25. package/packages/fokus-components/scss/components/_tooltips.scss +70 -18
  26. package/packages/fokus-components/scss/forms/_check-radio-switch.scss +313 -215
  27. package/packages/fokus-components/scss/forms/_forms.scss +16 -0
  28. package/packages/fokus-js/js/carousel.d.ts +4 -0
  29. package/packages/fokus-js/js/carousel.js +8 -0
  30. package/packages/fokus-js/js/core/positioning.js +18 -9
  31. package/packages/fokus-js/js/dropdown.d.ts +4 -0
  32. package/packages/fokus-js/js/dropdown.js +7 -0
  33. package/packages/fokus-js/js/popover.js +26 -1
  34. package/packages/fokus-js/js/tabs.d.ts +3 -0
  35. package/packages/fokus-js/js/tabs.js +5 -0
  36. package/packages/fokus-js/js/tag.js +17 -0
  37. package/packages/fokus-js/js/toast.js +77 -3
  38. package/packages/fokus-js/js/tooltip.d.ts +8 -1
  39. package/packages/fokus-js/js/tooltip.js +106 -13
  40. package/packages/fokus-utilities/scss/utilities/_api.scss +48 -0
  41. package/CHANGELOG.md +0 -910
  42. package/dist/css/components.css.map +0 -1
  43. package/dist/css/components.min.css.map +0 -1
  44. package/dist/css/fokus-components.css.map +0 -1
  45. package/dist/css/fokus-components.min.css.map +0 -1
  46. package/dist/css/fokus-core.css.map +0 -1
  47. package/dist/css/fokus-core.min.css.map +0 -1
  48. package/dist/css/fokus-dark.css.map +0 -1
  49. package/dist/css/fokus-dark.min.css.map +0 -1
  50. package/dist/css/fokus-rtl.css.map +0 -1
  51. package/dist/css/fokus-rtl.min.css.map +0 -1
  52. package/dist/css/fokus-utilities.css.map +0 -1
  53. package/dist/css/fokus-utilities.min.css.map +0 -1
  54. package/dist/css/fokus.css.map +0 -1
  55. package/dist/css/fokus.min.css.map +0 -1
  56. package/dist/css/fonts.css.map +0 -1
  57. package/dist/css/fonts.min.css.map +0 -1
  58. package/dist/css/forms.css.map +0 -1
  59. package/dist/css/forms.min.css.map +0 -1
  60. package/dist/css/helpers.css.map +0 -1
  61. package/dist/css/helpers.min.css.map +0 -1
  62. package/dist/css/layout.css.map +0 -1
  63. package/dist/css/layout.min.css.map +0 -1
  64. package/dist/js/fokus.js.map +0 -7
  65. package/dist/js/fokus.min.js.map +0 -7
  66. package/docs/README.md +0 -86
  67. package/docs/comparison.md +0 -124
  68. package/docs/components/accordion.md +0 -104
  69. package/docs/components/alert-dialog.md +0 -99
  70. package/docs/components/alert.md +0 -59
  71. package/docs/components/avatar.md +0 -13
  72. package/docs/components/badge.md +0 -82
  73. package/docs/components/breadcrumb.md +0 -93
  74. package/docs/components/button-group.md +0 -13
  75. package/docs/components/button.md +0 -98
  76. package/docs/components/card.md +0 -111
  77. package/docs/components/carousel.md +0 -167
  78. package/docs/components/checkbox.md +0 -97
  79. package/docs/components/close-button.md +0 -13
  80. package/docs/components/code.md +0 -13
  81. package/docs/components/collapse.md +0 -78
  82. package/docs/components/combobox.md +0 -123
  83. package/docs/components/command-palette.md +0 -131
  84. package/docs/components/datatable.md +0 -173
  85. package/docs/components/datepicker.md +0 -137
  86. package/docs/components/divider.md +0 -57
  87. package/docs/components/dropdown.md +0 -103
  88. package/docs/components/empty-state.md +0 -65
  89. package/docs/components/file-upload-advanced.md +0 -116
  90. package/docs/components/file-upload.md +0 -93
  91. package/docs/components/icon-link.md +0 -13
  92. package/docs/components/input-group.md +0 -73
  93. package/docs/components/input.md +0 -90
  94. package/docs/components/list-group.md +0 -13
  95. package/docs/components/modal.md +0 -120
  96. package/docs/components/navbar.md +0 -74
  97. package/docs/components/nested-menu.md +0 -90
  98. package/docs/components/notification-center.md +0 -116
  99. package/docs/components/offcanvas.md +0 -102
  100. package/docs/components/pagination.md +0 -145
  101. package/docs/components/placeholder.md +0 -13
  102. package/docs/components/popover.md +0 -105
  103. package/docs/components/progress.md +0 -126
  104. package/docs/components/radio.md +0 -70
  105. package/docs/components/range.md +0 -83
  106. package/docs/components/rating.md +0 -91
  107. package/docs/components/ratio.md +0 -13
  108. package/docs/components/scrollspy.md +0 -13
  109. package/docs/components/segmented-control.md +0 -82
  110. package/docs/components/select.md +0 -89
  111. package/docs/components/skeleton.md +0 -70
  112. package/docs/components/stepper.md +0 -107
  113. package/docs/components/switch.md +0 -75
  114. package/docs/components/table.md +0 -90
  115. package/docs/components/tabs.md +0 -104
  116. package/docs/components/tag.md +0 -129
  117. package/docs/components/tile.md +0 -112
  118. package/docs/components/timeline.md +0 -78
  119. package/docs/components/toast.md +0 -95
  120. package/docs/components/tooltip.md +0 -77
  121. package/docs/components/tree-view.md +0 -118
  122. package/docs/contributing/contributing.md +0 -18
  123. package/docs/getting-started/installation.md +0 -70
  124. package/docs/getting-started/usage.md +0 -105
  125. package/docs/guides/accessibility.md +0 -102
  126. package/docs/guides/charts.md +0 -73
  127. package/docs/guides/dark-mode.md +0 -90
  128. package/docs/guides/icons.md +0 -99
  129. package/docs/guides/javascript-api.md +0 -9
  130. package/docs/guides/layout-advanced.md +0 -118
  131. package/docs/guides/migration-clarus-to-fokus.md +0 -48
  132. package/docs/guides/migration-external.md +0 -123
  133. package/docs/guides/migration-v1.md +0 -63
  134. package/docs/guides/print.md +0 -30
  135. package/docs/guides/rtl-and-system-preferences.md +0 -28
  136. package/docs/guides/theming.md +0 -140
  137. package/docs/guides/utility-api.md +0 -9
  138. package/docs/prompts/prompt-plan.md +0 -45
  139. package/docs/reference/accessibility-matrix.md +0 -77
  140. package/docs/reference/browser-support.md +0 -75
  141. package/docs/reference/contrast-report.md +0 -50
  142. package/docs/reference/definitions.md +0 -864
  143. package/docs/reference/design-tokens.md +0 -194
  144. package/docs/reference/scss-architecture.md +0 -227
  145. package/docs/reference/size-baseline.json +0 -34
  146. package/docs/reference/stability.md +0 -89
  147. package/docs/showcase.md +0 -25
  148. package/mockup/README.md +0 -41
  149. package/mockup/assets/carousel-planning.png +0 -0
  150. package/mockup/assets/carousel-workspace.png +0 -0
  151. package/mockup/assets/example-theme.css +0 -8
  152. package/mockup/assets/example-theme.js +0 -11
  153. package/mockup/assets/showcase-contracts.js +0 -84
  154. package/mockup/assets/showcase.css +0 -91
  155. package/mockup/assets/showcase.js +0 -724
  156. package/mockup/content-data.html +0 -9
  157. package/mockup/examples/accordion-tabs-toast.html +0 -149
  158. package/mockup/examples/alert-dialog.html +0 -84
  159. package/mockup/examples/alerts.html +0 -41
  160. package/mockup/examples/badges-alerts.html +0 -77
  161. package/mockup/examples/buttons.html +0 -58
  162. package/mockup/examples/cards.html +0 -132
  163. package/mockup/examples/carousel.html +0 -126
  164. package/mockup/examples/charts.html +0 -102
  165. package/mockup/examples/check-radio-switch.html +0 -144
  166. package/mockup/examples/collapse.html +0 -69
  167. package/mockup/examples/combobox.html +0 -60
  168. package/mockup/examples/command-palette.html +0 -64
  169. package/mockup/examples/datatable.html +0 -113
  170. package/mockup/examples/datepicker.html +0 -62
  171. package/mockup/examples/divider.html +0 -45
  172. package/mockup/examples/dropdown-tooltip.html +0 -77
  173. package/mockup/examples/empty-state.html +0 -56
  174. package/mockup/examples/file-drop.html +0 -74
  175. package/mockup/examples/file-upload-advanced.html +0 -68
  176. package/mockup/examples/forms-advanced.html +0 -77
  177. package/mockup/examples/hover-card.html +0 -86
  178. package/mockup/examples/icons.html +0 -157
  179. package/mockup/examples/input-group.html +0 -74
  180. package/mockup/examples/js-foundation.html +0 -215
  181. package/mockup/examples/layout.html +0 -134
  182. package/mockup/examples/modal-select.html +0 -127
  183. package/mockup/examples/nested-menu.html +0 -73
  184. package/mockup/examples/notification-center.html +0 -86
  185. package/mockup/examples/offcanvas-popover.html +0 -133
  186. package/mockup/examples/pagination-breadcrumbs.html +0 -92
  187. package/mockup/examples/range.html +0 -69
  188. package/mockup/examples/rating.html +0 -103
  189. package/mockup/examples/segmented-control.html +0 -96
  190. package/mockup/examples/skeletons.html +0 -82
  191. package/mockup/examples/spinner-progress.html +0 -130
  192. package/mockup/examples/stepper.html +0 -119
  193. package/mockup/examples/tables-navbar.html +0 -89
  194. package/mockup/examples/tag.html +0 -105
  195. package/mockup/examples/theming.html +0 -68
  196. package/mockup/examples/tile.html +0 -107
  197. package/mockup/examples/timeline.html +0 -108
  198. package/mockup/examples/tree-view.html +0 -68
  199. package/mockup/feedback-actions.html +0 -9
  200. package/mockup/forms.html +0 -13
  201. package/mockup/foundations.html +0 -7
  202. package/mockup/kitchen-sink.html +0 -696
  203. package/mockup/navigation-disclosure.html +0 -11
  204. package/mockup/overlays-commands.html +0 -12
  205. package/mockup/templates/README.md +0 -20
  206. package/mockup/templates/admin.html +0 -334
  207. package/mockup/templates/auth.html +0 -234
  208. package/mockup/templates/dashboard.html +0 -442
  209. package/mockup/templates/landing.html +0 -397
  210. package/packages/fokus-icons/package.json +0 -46
  211. package/scripts/migrate-fokus-map.json +0 -1366
  212. package/scripts/migrate-fokus.mjs +0 -97
@@ -1,105 +0,0 @@
1
- # Popover
2
-
3
- Painel flutuante com conteúdo rico (header/body/footer, pode conter
4
- elementos interativos) — mesmo posicionamento do [Tooltip](tooltip.md),
5
- aparência de card de superfície em vez do chip escuro.
6
-
7
- ## Visão geral
8
-
9
- ```html
10
- <button type="button" class="fs-btn" data-fs="popover" data-fs-target="#meu-popover">
11
- Mais informações
12
- </button>
13
- <div class="fs-popover" id="meu-popover">
14
- <div class="fs-popover-header">Título</div>
15
- <div class="fs-popover-body">Conteúdo detalhado aqui.</div>
16
- </div>
17
- ```
18
-
19
- ## Anatomia
20
-
21
- Gatilho (qualquer elemento) + `.fs-popover` > `.fs-popover-header`
22
- (opcional) + `.fs-popover-body` + `.fs-popover-footer` (opcional, ações
23
- alinhadas à direita). A seta (`.fs-popover-arrow`) é gerada
24
- automaticamente.
25
-
26
- ## Variações
27
-
28
- - **Posicionamento**: `data-placement`/`data-align` no gatilho — mesma
29
- convenção do [Dropdown](dropdown.md).
30
- - **Gatilho**: `data-trigger` no elemento gatilho —
31
- `click` (padrão), `hover` (com pequeno atraso ao sair, pra dar tempo de
32
- mover o mouse até o popover), `focus` (mostra ao focar, some ao perder
33
- foco pra fora do trigger+popover), `manual` (você chama `show()`/`hide()`
34
- vocẽ mesmo, sem listener automático).
35
- - **Hover Card**: `.fs-popover-hover-card` — não é um componente
36
- separado, é este mesmo Popover com `data-trigger="hover"` e um
37
- modificador visual (mais largo, corpo em linha) pra conteúdo tipo
38
- avatar + bio.
39
-
40
- ```html
41
- <a href="#" data-fs="popover" data-fs-target="#hc-1" data-trigger="hover">@jorgewreis</a>
42
- <div class="fs-popover fs-popover-hover-card" id="hc-1">
43
- <div class="fs-popover-body">
44
- <img src="avatar.jpg" alt="" width="40" height="40">
45
- <div>
46
- <strong>Jorge Reis</strong>
47
- <p>Mantenedor do Fokus Styles.</p>
48
- </div>
49
- </div>
50
- </div>
51
- ```
52
-
53
- ## Estados
54
-
55
- `.is-open` — controlado pelo JS.
56
-
57
- ## A11y
58
-
59
- `role="dialog"` + `aria-modal="false"` no popover, `aria-controls`/
60
- `aria-expanded` no gatilho (JS aplica automaticamente). Com
61
- `data-trigger="click"` (padrão): `Escape` fecha e devolve foco ao gatilho;
62
- clique fora fecha. Um elemento dentro do popover com
63
- `data-fs-dismiss="popover"` fecha ao ser clicado (útil pra um botão "OK"
64
- no footer).
65
-
66
- ## API JS
67
-
68
- Auto-init via `data-fs="popover"`. `Popover.getInstance(el)` (`el` é o
69
- **gatilho**).
70
-
71
- | Método | Descrição |
72
- |---|---|
73
- | `show()` | Abre, posiciona, ativa fechamento por clique fora (só no trigger `click`). |
74
- | `hide()` | Fecha. |
75
- | `toggle()` | Alterna. |
76
- | `dispose()` | Fecha se aberto, remove todos os listeners, remove o elemento do popover do DOM. |
77
-
78
- | Evento (no gatilho) | Cancelável | Quando |
79
- |---|---|---|
80
- | `fs:popover:shown` | Não | Depois de abrir. |
81
- | `fs:popover:hidden` | Não | Depois de fechar. |
82
-
83
- ## Tokens
84
-
85
- `--fs-color-border`, `--fs-color-surface`, `--fs-color-subtle` (header),
86
- `--fs-color-text`, `--fs-radius-md`, `--fs-shadow-md`.
87
-
88
- ## Exemplo
89
-
90
- ```html
91
- <button type="button" class="fs-btn" data-fs="popover" data-fs-target="#confirmar-envio">
92
- Enviar
93
- </button>
94
- <div class="fs-popover" id="confirmar-envio">
95
- <div class="fs-popover-header">Confirmar envio?</div>
96
- <div class="fs-popover-body">Não será possível editar depois de enviado.</div>
97
- <div class="fs-popover-footer">
98
- <button type="button" class="fs-btn fs-btn-sm" data-fs-dismiss="popover">Cancelar</button>
99
- <button type="button" class="fs-btn fs-btn-primary fs-btn-sm">Confirmar</button>
100
- </div>
101
- </div>
102
- ```
103
-
104
- Mockup: [laboratório do componente](../../mockup/overlays-commands.html#popover),
105
- [`mockup/overlays-commands.html#hover-card`](../../mockup/overlays-commands.html#popover).
@@ -1,126 +0,0 @@
1
- # Spinner & Progress
2
-
3
- Dois indicadores de carregamento, 100% CSS: Spinner (indeterminado, giratório)
4
- e Progress (determinado, barra linear).
5
-
6
- ## Visão geral
7
-
8
- ```html
9
- <div class="fs-spinner" role="status" aria-label="Carregando"></div>
10
-
11
- <div class="fs-progress">
12
- <div class="fs-progress-bar" style="--fs-progress-value: 60;"></div>
13
- </div>
14
- ```
15
-
16
- ## Anatomia
17
-
18
- **Spinner**: um único elemento, `.fs-spinner` — um anel com trilho sutil e
19
- segmento ativo, girando; sem marcação interna.
20
-
21
- **Progress**: `.fs-progress` (trilho) > `.fs-progress-bar` (preenchimento
22
- — a largura é controlada pela custom property `--fs-progress-value`, de
23
- `0` a `100`, ou diretamente por `style="width: 60%"`).
24
-
25
- ## Variações
26
-
27
- **Spinner**:
28
- - Tamanho: `.fs-spinner-sm` (14px), `.fs-spinner-lg` (32px); sem sufixo =
29
- 20px.
30
- - Cor: `.fs-spinner-{primary|secondary|success|warning|danger|info}` — o
31
- spinner herda `currentColor` por padrão, então também responde a
32
- qualquer utilitário de cor de texto (`.fs-u-text-*`) se você não usar essas
33
- classes.
34
-
35
- **Progress**:
36
- - Altura: `.fs-progress-sm` (4px), `.fs-progress-lg` (16px); sem sufixo =
37
- 8px.
38
- - Cor da barra: `.fs-progress-bar-{cor}` — mesmas 6 cores de tema.
39
- - `.fs-progress-bar-striped` — faixas diagonais; some com
40
- `.fs-progress-bar-animated` pra elas se moverem continuamente.
41
- - Valor visual: use texto dentro de `.fs-progress-bar` apenas em
42
- `.fs-progress-lg`; nas barras compactas, exponha o valor por `aria-valuenow`
43
- e por um rótulo externo quando ele precisar ser visível.
44
- - Rótulo externo: `.fs-progress-meta` contém o nome da operação e
45
- `.fs-progress-value` para percentual, contagem ou duração.
46
- - Indeterminado: `.fs-progress-indeterminate` mostra deslocamento contínuo;
47
- omita `aria-valuenow` e use `aria-valuetext="Progresso indeterminado"`.
48
- - Finalização: `.fs-progress-complete` aplica `success`; `.fs-progress-error`
49
- aplica `danger`. Use `.fs-progress-status` para uma confirmação ou ação de
50
- recuperação fora da barra.
51
- - Meta: adicione `.fs-progress-marker` dentro do trilho e defina
52
- `--fs-progress-marker-value` (0–100). Explique a meta em texto externo.
53
- - Início perceptível: `.fs-progress-minimum` preserva ao menos 4px visíveis
54
- para valores reais acima de zero; `aria-valuenow` continua sendo a fonte de
55
- verdade.
56
- - Fluxo por etapas: componha [Stepper](stepper.md) para comunicar a etapa
57
- atual e uma `.fs-progress` para representar o avanço global. Não duplique
58
- ambos para o mesmo significado.
59
-
60
- ```html
61
- <div class="fs-spinner fs-spinner-lg fs-spinner-primary"></div>
62
-
63
- <div class="fs-progress fs-progress-lg">
64
- <div class="fs-progress-bar fs-progress-bar-success fs-progress-bar-striped fs-progress-bar-animated" style="--fs-progress-value: 40;"></div>
65
- </div>
66
- ```
67
-
68
- ## Estados
69
-
70
- Nenhum — ambos refletem o valor/presença que você controla (spinner:
71
- presente = carregando; progress: `--fs-progress-value` = progresso atual).
72
-
73
- ## A11y
74
-
75
- - Spinner: adicione `role="status"` + `aria-label` (ou um texto
76
- visualmente oculto dentro) — não é automático, o elemento é puramente
77
- visual por padrão.
78
- - Progress: para expor o valor a leitores de tela, adicione
79
- `role="progressbar"` + `aria-valuenow`/`aria-valuemin="0"`/
80
- `aria-valuemax="100"` **e um nome acessível** (`aria-label="Progresso: 60%"`
81
- ou `aria-labelledby` apontando pro rótulo visível) no `.fs-progress`
82
- (mantidos em sincronia com `--fs-progress-value` pela sua aplicação — o
83
- framework não injeta automaticamente). Sem nome acessível, o
84
- `role="progressbar"` é rejeitado por leitores de tela (gate `axe` no CI:
85
- regra `aria-progressbar-name`).
86
- - A animação de listras (`.fs-progress-bar-animated`), a barra indeterminada
87
- e a rotação do spinner desaceleram em `prefers-reduced-motion: reduce`, mas
88
- não param completamente para não parecerem travadas.
89
- - Para o indeterminado, não informe um valor numérico inexistente. O movimento
90
- reduz a velocidade em `prefers-reduced-motion`, mas continua ativo para não
91
- parecer uma interface travada.
92
-
93
- ## API JS
94
-
95
- Nenhuma — 100% CSS. Atualizar `--fs-progress-value` é responsabilidade da
96
- sua aplicação (ex.: `barEl.style.setProperty("--fs-progress-value", "75")`).
97
-
98
- ## Tokens
99
-
100
- Spinner: `--fs-color-{nome}` (variantes de cor). Progress:
101
- `--fs-color-subtle` (trilho), `--fs-color-primary`/`--fs-color-{nome}`
102
- (preenchimento), `--fs-progress-height`, `--fs-progress-track`,
103
- `--fs-progress-bar-bg` e `--fs-progress-radius`. O Spinner também expõe
104
- `--fs-spinner-size`, `--fs-spinner-stroke` e `--fs-spinner-duration` para
105
- ajustes locais.
106
-
107
- ## Exemplo
108
-
109
- ```html
110
- <div class="fs-spinner" role="status" aria-label="Carregando"></div>
111
-
112
- <div class="fs-progress" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100">
113
- <div class="fs-progress-bar" style="--fs-progress-value: 60;">60%</div>
114
- </div>
115
-
116
- <div class="fs-progress-meta"><span>Upload de anexos</span><span class="fs-progress-value">3 de 8 arquivos</span></div>
117
- <div class="fs-progress" role="progressbar" aria-label="Upload de anexos" aria-valuetext="3 de 8 arquivos enviados" aria-valuenow="38" aria-valuemin="0" aria-valuemax="100">
118
- <div class="fs-progress-bar" style="--fs-progress-value: 38"></div>
119
- </div>
120
-
121
- <div class="fs-progress fs-progress-indeterminate" role="progressbar" aria-label="Processando pagamento" aria-valuetext="Progresso indeterminado" aria-busy="true">
122
- <div class="fs-progress-bar"></div>
123
- </div>
124
- ```
125
-
126
- Mockup: [laboratório do componente](../../mockup/feedback-actions.html#progress).
@@ -1,70 +0,0 @@
1
- # Radio
2
-
3
- Radio button 100% CSS, mesma técnica do [Checkbox](checkbox.md) — sobre um
4
- `<input type="radio">` nativo. É a única exceção circular do framework
5
- além do [Spinner](progress.md), por decisão de design (anti-circular no
6
- resto de tudo).
7
-
8
- ## Visão geral
9
-
10
- ```html
11
- <div class="fs-radio">
12
- <input type="radio" name="periodo" class="fs-radio-input" id="dia" checked>
13
- <label for="dia" class="fs-radio-label">Dia</label>
14
- </div>
15
- <div class="fs-radio">
16
- <input type="radio" name="periodo" class="fs-radio-input" id="semana">
17
- <label for="semana" class="fs-radio-label">Semana</label>
18
- </div>
19
- ```
20
-
21
- Radios do mesmo grupo compartilham `name` — seleção exclusiva é
22
- comportamento nativo do `<input type="radio">`, sem JS.
23
-
24
- ## Anatomia
25
-
26
- `.fs-radio` (wrapper) > `.fs-radio-input` (oculto via clip) +
27
- `.fs-radio-label` (`<label for="...">`, desenha o círculo via `::before` e
28
- o ponto interno via `::after`).
29
-
30
- ## Variações
31
-
32
- Tamanho: `.fs-radio-sm`, `.fs-radio-lg` no wrapper.
33
-
34
- ## Estados
35
-
36
- - **checked**, **disabled**, validação (`.is-valid`/`.is-invalid`) e foco —
37
- mesmo padrão do [Checkbox](checkbox.md). Não existe `indeterminate` para
38
- radio.
39
-
40
- ## A11y
41
-
42
- - `<input type="radio">` nativo com `name` compartilhado — `ArrowUp`/
43
- `ArrowDown`/`ArrowLeft`/`ArrowRight` movem a seleção **dentro do grupo**
44
- automaticamente (comportamento do navegador, não do framework).
45
- `Tab`/`Shift+Tab` entram/saem do grupo de uma vez (o item selecionado, ou
46
- o primeiro se nenhum estiver selecionado, é o único no fluxo de tab).
47
- - Sempre associe `label` via `for`/`id`.
48
-
49
- ## API JS
50
-
51
- Nenhuma — 100% CSS.
52
-
53
- ## Tokens
54
-
55
- Mesmos do [Checkbox](checkbox.md) — sem tokens próprios.
56
-
57
- ## Exemplo
58
-
59
- ```html
60
- <div class="fs-radio">
61
- <input type="radio" name="plano" class="fs-radio-input" id="p1" checked>
62
- <label for="p1" class="fs-radio-label">Mensal</label>
63
- </div>
64
- <div class="fs-radio">
65
- <input type="radio" name="plano" class="fs-radio-input" id="p2">
66
- <label for="p2" class="fs-radio-label">Anual</label>
67
- </div>
68
- ```
69
-
70
- Mockup: [laboratório do componente](../../mockup/forms.html#check-radio-switch).
@@ -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).
@@ -1,13 +0,0 @@
1
- # Ratio
2
-
3
- ## Visão geral
4
-
5
- `.fs-ratio` cria frames de mídia responsivos sem depender da altura do viewport.
6
-
7
- ## Estados
8
-
9
- Escolha `.fs-ratio-1x1`, `.fs-ratio-4x3`, `.fs-ratio-16x9` ou `.fs-ratio-21x9`.
10
-
11
- ## A11y
12
-
13
- Mantenha texto alternativo em imagens e legendas ou título acessível em mídia incorporada.
@@ -1,13 +0,0 @@
1
- # Scrollspy
2
-
3
- ## Visão geral
4
-
5
- `data-fs-scrollspy` destaca o link da seção atualmente visível e pode ser usado em navegação lateral.
6
-
7
- ## Estados
8
-
9
- O módulo JS aplica `.is-active` e emite `fs:scrollspy:activate`.
10
-
11
- ## A11y
12
-
13
- Use uma navegação nomeada, mantenha foco visível e não remova a indicação textual do destino.
@@ -1,82 +0,0 @@
1
- # Segmented Control
2
-
3
- Grupo de botões com estado selecionado — alternativa compacta a radio
4
- buttons/tabs para poucas opções mutuamente exclusivas (ou não). 100% CSS,
5
- mesma técnica de input oculto + label irmã.
6
-
7
- ## Visão geral
8
-
9
- ```html
10
- <div class="fs-segmented-control">
11
- <div class="fs-segmented-item">
12
- <input type="radio" name="periodo" class="fs-segmented-input" id="p-dia" checked>
13
- <label for="p-dia" class="fs-segmented-label">Dia</label>
14
- </div>
15
- <div class="fs-segmented-item">
16
- <input type="radio" name="periodo" class="fs-segmented-input" id="p-semana">
17
- <label for="p-semana" class="fs-segmented-label">Semana</label>
18
- </div>
19
- <div class="fs-segmented-item">
20
- <input type="radio" name="periodo" class="fs-segmented-input" id="p-mes">
21
- <label for="p-mes" class="fs-segmented-label">Mês</label>
22
- </div>
23
- </div>
24
- ```
25
-
26
- ## Anatomia
27
-
28
- `.fs-segmented-control` (contêiner, borda externa única) >
29
- `.fs-segmented-item` (um por opção) > `.fs-segmented-input`
30
- (`<input>`, oculto via clip) + `.fs-segmented-label` (`<label for="...">`).
31
-
32
- ## Variações
33
-
34
- - **Exclusivo vs. inclusivo**: use `<input type="radio">` com o mesmo
35
- `name` (só uma opção selecionada por vez — como no exemplo) ou
36
- `<input type="checkbox">` (cada item seleciona/deseleciona
37
- independentemente).
38
- - **Tamanho**: `.fs-segmented-control-sm`, `.fs-segmented-control-lg`; sem
39
- sufixo = padrão (38px de altura).
40
-
41
- ```html
42
- <div class="fs-segmented-control fs-segmented-control-sm">...</div>
43
- ```
44
-
45
- ## Estados
46
-
47
- - **checked**: item selecionado ganha fundo/texto na cor primária.
48
- - **disabled**: no input — opacidade reduzida, sem interação.
49
- - **Foco**: anel sobre o item focado (`z-index` elevado pra não ficar
50
- parcialmente escondido pela borda do vizinho).
51
-
52
- ## A11y
53
-
54
- `<input>` nativo (radio ou checkbox) — toda a semântica de grupo (seleção
55
- exclusiva com radio, navegação por seta entre itens do mesmo `name`) vem
56
- do navegador, sem JS. Sempre associe `label` via `for`/`id`.
57
-
58
- ## API JS
59
-
60
- Nenhuma — 100% CSS.
61
-
62
- ## Tokens
63
-
64
- `--fs-color-border`, `--fs-color-surface`, `--fs-color-subtle` (hover),
65
- `--fs-color-primary` (selecionado), `--fs-radius-sm`.
66
-
67
- ## Exemplo
68
-
69
- ```html
70
- <div class="fs-segmented-control">
71
- <div class="fs-segmented-item">
72
- <input type="checkbox" class="fs-segmented-input" id="f-ativo" checked>
73
- <label for="f-ativo" class="fs-segmented-label">Ativos</label>
74
- </div>
75
- <div class="fs-segmented-item">
76
- <input type="checkbox" class="fs-segmented-input" id="f-arquivado">
77
- <label for="f-arquivado" class="fs-segmented-label">Arquivados</label>
78
- </div>
79
- </div>
80
- ```
81
-
82
- Mockup: [laboratório do componente](../../mockup/forms.html#segmented-control).
@@ -1,89 +0,0 @@
1
- # Select customizado
2
-
3
- Substitui a aparência do `<select>` nativo (impossível de estilizar
4
- consistentemente entre navegadores) por um [Dropdown](dropdown.md), mantendo
5
- o `<select>` real por baixo — sincronizado, escondido visualmente.
6
-
7
- ## Visão geral
8
-
9
- ```html
10
- <select class="fs-form-select" data-fs="select" id="pais">
11
- <option value="br">Brasil</option>
12
- <option value="pt">Portugal</option>
13
- <option value="us" disabled>Estados Unidos (indisponível)</option>
14
- </select>
15
- ```
16
-
17
- O JS constrói o dropdown customizado logo depois do `<select>` no DOM e
18
- esconde o original (`display: none` — continua no DOM, então
19
- `<select>`/`<option>` do seu HTML/backend seguem sendo a fonte da
20
- verdade).
21
-
22
- ## Anatomia
23
-
24
- Gerado automaticamente a partir do `<select>`: `.fs-dropdown.fs-form-select-dropdown`
25
- > `.fs-form-select` (botão-toggle, mesma aparência estática documentada em
26
- [Input](input.md#anatomia)) + `.fs-dropdown-menu` > um `.fs-dropdown-item`
27
- por `<option>`.
28
-
29
- ## Variações
30
-
31
- Tamanho: `data-size="sm"`/`"lg"` no `<select>` original — vira
32
- `.fs-form-select-sm`/`-lg` no toggle gerado.
33
-
34
- ```html
35
- <select class="fs-form-select" data-fs="select" data-size="sm">...</select>
36
- ```
37
-
38
- ## Estados
39
-
40
- - `<option disabled>` vira um item com `.is-disabled` no menu (não
41
- clicável).
42
- - `<select disabled>` desabilita o botão-toggle inteiro.
43
- - Item selecionado (`selectedIndex`) fica com `.is-active` no menu.
44
-
45
- ## A11y
46
-
47
- `aria-haspopup="listbox"` no toggle, `role="listbox"` no menu,
48
- `role="option"` + `aria-selected` em cada item — aplicados
49
- automaticamente. Navegação por teclado herdada do
50
- [Dropdown](dropdown.md) (`ArrowDown`/`ArrowUp` entre opções, `Escape`
51
- fecha). Selecionar uma opção dispara `change` no `<select>` original —
52
- formulários/validação que escutam esse evento continuam funcionando sem
53
- mudança.
54
-
55
- ## API JS
56
-
57
- Auto-init via `data-fs="select"` **no `<select>`**. `Select.getInstance(selectEl)`.
58
-
59
- | Método | Descrição |
60
- |---|---|
61
- | `show()` / `hide()` / `toggle()` | Delegam pro Dropdown interno. |
62
- | `dispose()` | Desmonta o dropdown gerado, restaura o `<select>` original visível. |
63
-
64
- | Evento (no `<select>` original) | Cancelável | Quando |
65
- |---|---|---|
66
- | `change` (nativo) | Não | Ao selecionar uma opção — mesmo evento que um `<select>` comum dispara. |
67
- | `fs:select:changed` | Não | Mesmo momento, com `event.detail.value` (o novo valor). |
68
-
69
- ## Tokens
70
-
71
- Os mesmos do [Dropdown](dropdown.md) e de
72
- [`.fs-form-select`](input.md) — sem tokens próprios.
73
-
74
- ## Exemplo
75
-
76
- ```html
77
- <select class="fs-form-select" data-fs="select" id="prioridade">
78
- <option value="baixa">Baixa</option>
79
- <option value="media" selected>Média</option>
80
- <option value="alta">Alta</option>
81
- </select>
82
- <script>
83
- document.getElementById("prioridade").addEventListener("fs:select:changed", (e) => {
84
- console.log("nova prioridade:", e.detail.value);
85
- });
86
- </script>
87
- ```
88
-
89
- Mockup: [laboratório do componente](../../mockup/forms.html#select).