fokus-styles 2.5.0 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/package.json +17 -15
  2. package/CHANGELOG.md +0 -940
  3. package/dist/css/components.css.map +0 -1
  4. package/dist/css/components.min.css.map +0 -1
  5. package/dist/css/fokus-components.css.map +0 -1
  6. package/dist/css/fokus-components.min.css.map +0 -1
  7. package/dist/css/fokus-core.css.map +0 -1
  8. package/dist/css/fokus-core.min.css.map +0 -1
  9. package/dist/css/fokus-dark.css.map +0 -1
  10. package/dist/css/fokus-dark.min.css.map +0 -1
  11. package/dist/css/fokus-rtl.css.map +0 -1
  12. package/dist/css/fokus-rtl.min.css.map +0 -1
  13. package/dist/css/fokus-utilities.css.map +0 -1
  14. package/dist/css/fokus-utilities.min.css.map +0 -1
  15. package/dist/css/fokus.css.map +0 -1
  16. package/dist/css/fokus.min.css.map +0 -1
  17. package/dist/css/fonts.css.map +0 -1
  18. package/dist/css/fonts.min.css.map +0 -1
  19. package/dist/css/forms.css.map +0 -1
  20. package/dist/css/forms.min.css.map +0 -1
  21. package/dist/css/helpers.css.map +0 -1
  22. package/dist/css/helpers.min.css.map +0 -1
  23. package/dist/css/layout.css.map +0 -1
  24. package/dist/css/layout.min.css.map +0 -1
  25. package/dist/js/fokus.js.map +0 -7
  26. package/dist/js/fokus.min.js.map +0 -7
  27. package/docs/README.md +0 -86
  28. package/docs/comparison.md +0 -124
  29. package/docs/components/accordion.md +0 -104
  30. package/docs/components/alert-dialog.md +0 -99
  31. package/docs/components/alert.md +0 -104
  32. package/docs/components/avatar.md +0 -13
  33. package/docs/components/badge.md +0 -101
  34. package/docs/components/breadcrumb.md +0 -93
  35. package/docs/components/button-group.md +0 -13
  36. package/docs/components/button.md +0 -98
  37. package/docs/components/card.md +0 -111
  38. package/docs/components/carousel.md +0 -167
  39. package/docs/components/checkbox.md +0 -110
  40. package/docs/components/close-button.md +0 -13
  41. package/docs/components/code.md +0 -13
  42. package/docs/components/collapse.md +0 -78
  43. package/docs/components/combobox.md +0 -123
  44. package/docs/components/command-palette.md +0 -131
  45. package/docs/components/datatable.md +0 -173
  46. package/docs/components/datepicker.md +0 -137
  47. package/docs/components/divider.md +0 -57
  48. package/docs/components/dropdown.md +0 -103
  49. package/docs/components/empty-state.md +0 -65
  50. package/docs/components/file-upload-advanced.md +0 -116
  51. package/docs/components/file-upload.md +0 -93
  52. package/docs/components/icon-link.md +0 -13
  53. package/docs/components/input-group.md +0 -73
  54. package/docs/components/input.md +0 -90
  55. package/docs/components/list-group.md +0 -13
  56. package/docs/components/modal.md +0 -120
  57. package/docs/components/navbar.md +0 -74
  58. package/docs/components/nested-menu.md +0 -90
  59. package/docs/components/notification-center.md +0 -116
  60. package/docs/components/offcanvas.md +0 -102
  61. package/docs/components/pagination.md +0 -145
  62. package/docs/components/placeholder.md +0 -13
  63. package/docs/components/popover.md +0 -118
  64. package/docs/components/progress.md +0 -126
  65. package/docs/components/radio.md +0 -80
  66. package/docs/components/range.md +0 -83
  67. package/docs/components/rating.md +0 -91
  68. package/docs/components/ratio.md +0 -13
  69. package/docs/components/responsive.md +0 -19
  70. package/docs/components/scrollspy.md +0 -13
  71. package/docs/components/segmented-control.md +0 -82
  72. package/docs/components/select.md +0 -89
  73. package/docs/components/skeleton.md +0 -70
  74. package/docs/components/stepper.md +0 -107
  75. package/docs/components/switch.md +0 -97
  76. package/docs/components/table.md +0 -90
  77. package/docs/components/tabs.md +0 -104
  78. package/docs/components/tag.md +0 -144
  79. package/docs/components/tile.md +0 -112
  80. package/docs/components/timeline.md +0 -78
  81. package/docs/components/toast.md +0 -108
  82. package/docs/components/tooltip.md +0 -113
  83. package/docs/components/tree-view.md +0 -118
  84. package/docs/contributing/contributing.md +0 -18
  85. package/docs/getting-started/installation.md +0 -70
  86. package/docs/getting-started/usage.md +0 -105
  87. package/docs/guides/accessibility.md +0 -109
  88. package/docs/guides/charts.md +0 -73
  89. package/docs/guides/dark-mode.md +0 -90
  90. package/docs/guides/icons.md +0 -99
  91. package/docs/guides/javascript-api.md +0 -9
  92. package/docs/guides/layout-advanced.md +0 -118
  93. package/docs/guides/migration-clarus-to-fokus.md +0 -48
  94. package/docs/guides/migration-external.md +0 -123
  95. package/docs/guides/migration-v1.md +0 -63
  96. package/docs/guides/print.md +0 -30
  97. package/docs/guides/rtl-and-system-preferences.md +0 -28
  98. package/docs/guides/theming.md +0 -140
  99. package/docs/guides/utility-api.md +0 -9
  100. package/docs/prompts/prompt-plan.md +0 -45
  101. package/docs/reference/accessibility-matrix.md +0 -77
  102. package/docs/reference/browser-support.md +0 -75
  103. package/docs/reference/contrast-report.md +0 -54
  104. package/docs/reference/definitions.md +0 -868
  105. package/docs/reference/design-tokens.md +0 -208
  106. package/docs/reference/scss-architecture.md +0 -227
  107. package/docs/reference/size-baseline.json +0 -34
  108. package/docs/reference/stability.md +0 -89
  109. package/docs/showcase.md +0 -25
  110. package/mockup/README.md +0 -41
  111. package/mockup/assets/carousel-planning.png +0 -0
  112. package/mockup/assets/carousel-workspace.png +0 -0
  113. package/mockup/assets/example-theme.css +0 -19
  114. package/mockup/assets/example-theme.js +0 -11
  115. package/mockup/assets/showcase-contracts.js +0 -84
  116. package/mockup/assets/showcase.css +0 -91
  117. package/mockup/assets/showcase.js +0 -724
  118. package/mockup/content-data.html +0 -9
  119. package/mockup/examples/accordion-tabs-toast.html +0 -149
  120. package/mockup/examples/alert-dialog.html +0 -84
  121. package/mockup/examples/alerts.html +0 -115
  122. package/mockup/examples/badges-alerts.html +0 -109
  123. package/mockup/examples/buttons.html +0 -58
  124. package/mockup/examples/cards.html +0 -132
  125. package/mockup/examples/carousel.html +0 -126
  126. package/mockup/examples/charts.html +0 -102
  127. package/mockup/examples/check-radio-switch.html +0 -620
  128. package/mockup/examples/collapse.html +0 -69
  129. package/mockup/examples/combobox.html +0 -60
  130. package/mockup/examples/command-palette.html +0 -64
  131. package/mockup/examples/datatable.html +0 -113
  132. package/mockup/examples/datepicker.html +0 -62
  133. package/mockup/examples/divider.html +0 -45
  134. package/mockup/examples/dropdown-tooltip.html +0 -77
  135. package/mockup/examples/empty-state.html +0 -56
  136. package/mockup/examples/file-drop.html +0 -74
  137. package/mockup/examples/file-upload-advanced.html +0 -68
  138. package/mockup/examples/forms-advanced.html +0 -77
  139. package/mockup/examples/hover-card.html +0 -86
  140. package/mockup/examples/icons.html +0 -157
  141. package/mockup/examples/input-group.html +0 -74
  142. package/mockup/examples/js-foundation.html +0 -215
  143. package/mockup/examples/layout.html +0 -134
  144. package/mockup/examples/modal-select.html +0 -127
  145. package/mockup/examples/nested-menu.html +0 -73
  146. package/mockup/examples/notification-center.html +0 -86
  147. package/mockup/examples/offcanvas-popover.html +0 -133
  148. package/mockup/examples/pagination-breadcrumbs.html +0 -92
  149. package/mockup/examples/popover.html +0 -81
  150. package/mockup/examples/range.html +0 -69
  151. package/mockup/examples/rating.html +0 -103
  152. package/mockup/examples/segmented-control.html +0 -96
  153. package/mockup/examples/skeletons.html +0 -82
  154. package/mockup/examples/spinner-progress.html +0 -130
  155. package/mockup/examples/stepper.html +0 -119
  156. package/mockup/examples/tables-navbar.html +0 -89
  157. package/mockup/examples/tag.html +0 -115
  158. package/mockup/examples/theming.html +0 -68
  159. package/mockup/examples/tile.html +0 -107
  160. package/mockup/examples/timeline.html +0 -108
  161. package/mockup/examples/toast.html +0 -113
  162. package/mockup/examples/tooltip.html +0 -68
  163. package/mockup/examples/tree-view.html +0 -68
  164. package/mockup/feedback-actions.html +0 -9
  165. package/mockup/forms.html +0 -13
  166. package/mockup/foundations.html +0 -7
  167. package/mockup/kitchen-sink.html +0 -696
  168. package/mockup/navigation-disclosure.html +0 -11
  169. package/mockup/overlays-commands.html +0 -12
  170. package/mockup/templates/README.md +0 -20
  171. package/mockup/templates/admin.html +0 -334
  172. package/mockup/templates/auth.html +0 -234
  173. package/mockup/templates/dashboard.html +0 -442
  174. package/mockup/templates/landing.html +0 -397
  175. package/packages/fokus-icons/package.json +0 -46
  176. package/scripts/migrate-fokus-map.json +0 -1366
  177. package/scripts/migrate-fokus.mjs +0 -97
@@ -1,118 +0,0 @@
1
- # Popover
2
-
3
- Painel flutuante com conteúdo rico (header/body/footer, pode conter
4
- elementos interativos) — mesmo posicionamento do [Tooltip](tooltip.md),
5
- aparência de card de superfície em vez do chip escuro.
6
-
7
- ## Visão geral
8
-
9
- ```html
10
- <button type="button" class="fs-btn" data-fs="popover" data-fs-target="#meu-popover">
11
- Mais informações
12
- </button>
13
- <div class="fs-popover" id="meu-popover">
14
- <div class="fs-popover-header">Título</div>
15
- <div class="fs-popover-body">Conteúdo detalhado aqui.</div>
16
- </div>
17
- ```
18
-
19
- ## Anatomia
20
-
21
- Gatilho (qualquer elemento) + `.fs-popover` > `.fs-popover-header`
22
- (opcional) + `.fs-popover-body` + `.fs-popover-footer` (opcional). Slots
23
- aditivos incluem `.fs-popover-icon`, `.fs-popover-heading`,
24
- `.fs-popover-title`, `.fs-popover-meta`, `.fs-popover-text` e
25
- `.fs-popover-close`. A seta (`.fs-popover-arrow`) é posicionada junto ao painel.
26
-
27
- ## Variações
28
-
29
- - **Posicionamento**: `data-placement`/`data-align` no gatilho — mesma
30
- convenção do [Dropdown](dropdown.md).
31
- - **Gatilho**: `data-trigger` no elemento gatilho —
32
- `click` (padrão), `hover` (com pequeno atraso ao sair, pra dar tempo de
33
- mover o mouse até o popover), `focus` (mostra ao focar, some ao perder
34
- foco pra fora do trigger+popover), `manual` (você chama `show()`/`hide()`
35
- vocẽ mesmo, sem listener automático).
36
- - **Hover Card**: `.fs-popover-hover-card` — não é um componente
37
- separado, é este mesmo Popover com `data-trigger="hover"` e um
38
- modificador visual (mais largo, corpo em linha) pra conteúdo tipo
39
- avatar + bio.
40
-
41
- ```html
42
- <a href="#" data-fs="popover" data-fs-target="#hc-1" data-trigger="hover">@jorgewreis</a>
43
- <div class="fs-popover fs-popover-hover-card" id="hc-1">
44
- <div class="fs-popover-body">
45
- <img src="avatar.jpg" alt="" width="40" height="40">
46
- <div>
47
- <strong>Jorge Reis</strong>
48
- <p>Mantenedor do Fokus Styles.</p>
49
- </div>
50
- </div>
51
- </div>
52
- ```
53
-
54
- ## Estados
55
-
56
- `.is-open` — controlado pelo JS. Escape, clique externo (trigger click) e
57
- `data-fs-dismiss="popover"` fecham conforme o tipo de gatilho. Popover não é
58
- modal: não bloqueia scroll nem cria focus trap.
59
-
60
- ## A11y
61
-
62
- `role="dialog"` + `aria-modal="false"` no popover, `aria-controls`/
63
- `aria-expanded` no gatilho (JS aplica automaticamente). Com
64
- `data-trigger="click"` (padrão): `Escape` fecha e devolve foco ao gatilho;
65
- clique fora fecha. Um elemento dentro do popover com
66
- `data-fs-dismiss="popover"` fecha ao ser clicado (útil pra um botão "OK"
67
- no footer).
68
-
69
- Ao abrir outro Popover, o painel anterior é fechado para evitar sobreposição.
70
- O posicionamento testa alternativas quando o lado solicitado não cabe na
71
- viewport, e a seta acompanha o alinhamento do gatilho. Para conteúdo carregado
72
- de forma assíncrona, use `aria-busy="true"` e componha um `.fs-spinner` com
73
- texto de carregamento.
74
-
75
- ## API JS
76
-
77
- Auto-init via `data-fs="popover"`. `Popover.getInstance(el)` (`el` é o
78
- **gatilho**).
79
-
80
- | Método | Descrição |
81
- |---|---|
82
- | `show()` | Abre, posiciona, ativa fechamento por clique fora (só no trigger `click`). |
83
- | `hide()` | Fecha. |
84
- | `toggle()` | Alterna. |
85
- | `dispose()` | Fecha se aberto, remove todos os listeners, remove o elemento do popover do DOM. |
86
-
87
- | Evento (no gatilho) | Cancelável | Quando |
88
- |---|---|---|
89
- | `fs:popover:shown` | Não | Depois de abrir. |
90
- | `fs:popover:hidden` | Não | Depois de fechar. |
91
-
92
- ## Tokens
93
-
94
- `--fs-color-border`, `--fs-color-surface`, `--fs-color-subtle` (header),
95
- `--fs-color-text`, `--fs-radius-md`, `--fs-shadow-md` e os tokens locais
96
- `--fs-popover-width`, `--fs-popover-max-width`, `--fs-popover-padding-block`,
97
- `--fs-popover-padding-inline`, `--fs-popover-gap`, `--fs-popover-radius`,
98
- `--fs-popover-shadow`, `--fs-popover-icon-size`, `--fs-popover-heading-gap`,
99
- `--fs-popover-footer-gap`, `--fs-popover-arrow-size` e
100
- `--fs-popover-border-width`.
101
-
102
- ## Exemplo
103
-
104
- ```html
105
- <button type="button" class="fs-btn" data-fs="popover" data-fs-target="#confirmar-envio">
106
- Enviar
107
- </button>
108
- <div class="fs-popover" id="confirmar-envio">
109
- <div class="fs-popover-header">Confirmar envio?</div>
110
- <div class="fs-popover-body">Não será possível editar depois de enviado.</div>
111
- <div class="fs-popover-footer">
112
- <button type="button" class="fs-btn fs-btn-sm" data-fs-dismiss="popover">Cancelar</button>
113
- <button type="button" class="fs-btn fs-btn-primary fs-btn-sm">Confirmar</button>
114
- </div>
115
- </div>
116
- ```
117
-
118
- Mockup: [laboratório independente do componente](../../mockup/examples/popover.html).
@@ -1,126 +0,0 @@
1
- # Spinner & Progress
2
-
3
- Dois indicadores de carregamento, 100% CSS: Spinner (indeterminado, giratório)
4
- e Progress (determinado, barra linear).
5
-
6
- ## Visão geral
7
-
8
- ```html
9
- <div class="fs-spinner" role="status" aria-label="Carregando"></div>
10
-
11
- <div class="fs-progress">
12
- <div class="fs-progress-bar" style="--fs-progress-value: 60;"></div>
13
- </div>
14
- ```
15
-
16
- ## Anatomia
17
-
18
- **Spinner**: um único elemento, `.fs-spinner` — um anel com trilho sutil e
19
- segmento ativo, girando; sem marcação interna.
20
-
21
- **Progress**: `.fs-progress` (trilho) > `.fs-progress-bar` (preenchimento
22
- — a largura é controlada pela custom property `--fs-progress-value`, de
23
- `0` a `100`, ou diretamente por `style="width: 60%"`).
24
-
25
- ## Variações
26
-
27
- **Spinner**:
28
- - Tamanho: `.fs-spinner-sm` (14px), `.fs-spinner-lg` (32px); sem sufixo =
29
- 20px.
30
- - Cor: `.fs-spinner-{primary|secondary|success|warning|danger|info}` — o
31
- spinner herda `currentColor` por padrão, então também responde a
32
- qualquer utilitário de cor de texto (`.fs-u-text-*`) se você não usar essas
33
- classes.
34
-
35
- **Progress**:
36
- - Altura: `.fs-progress-sm` (4px), `.fs-progress-lg` (16px); sem sufixo =
37
- 8px.
38
- - Cor da barra: `.fs-progress-bar-{cor}` — mesmas 6 cores de tema.
39
- - `.fs-progress-bar-striped` — faixas diagonais; some com
40
- `.fs-progress-bar-animated` pra elas se moverem continuamente.
41
- - Valor visual: use texto dentro de `.fs-progress-bar` apenas em
42
- `.fs-progress-lg`; nas barras compactas, exponha o valor por `aria-valuenow`
43
- e por um rótulo externo quando ele precisar ser visível.
44
- - Rótulo externo: `.fs-progress-meta` contém o nome da operação e
45
- `.fs-progress-value` para percentual, contagem ou duração.
46
- - Indeterminado: `.fs-progress-indeterminate` mostra deslocamento contínuo;
47
- omita `aria-valuenow` e use `aria-valuetext="Progresso indeterminado"`.
48
- - Finalização: `.fs-progress-complete` aplica `success`; `.fs-progress-error`
49
- aplica `danger`. Use `.fs-progress-status` para uma confirmação ou ação de
50
- recuperação fora da barra.
51
- - Meta: adicione `.fs-progress-marker` dentro do trilho e defina
52
- `--fs-progress-marker-value` (0–100). Explique a meta em texto externo.
53
- - Início perceptível: `.fs-progress-minimum` preserva ao menos 4px visíveis
54
- para valores reais acima de zero; `aria-valuenow` continua sendo a fonte de
55
- verdade.
56
- - Fluxo por etapas: componha [Stepper](stepper.md) para comunicar a etapa
57
- atual e uma `.fs-progress` para representar o avanço global. Não duplique
58
- ambos para o mesmo significado.
59
-
60
- ```html
61
- <div class="fs-spinner fs-spinner-lg fs-spinner-primary"></div>
62
-
63
- <div class="fs-progress fs-progress-lg">
64
- <div class="fs-progress-bar fs-progress-bar-success fs-progress-bar-striped fs-progress-bar-animated" style="--fs-progress-value: 40;"></div>
65
- </div>
66
- ```
67
-
68
- ## Estados
69
-
70
- Nenhum — ambos refletem o valor/presença que você controla (spinner:
71
- presente = carregando; progress: `--fs-progress-value` = progresso atual).
72
-
73
- ## A11y
74
-
75
- - Spinner: adicione `role="status"` + `aria-label` (ou um texto
76
- visualmente oculto dentro) — não é automático, o elemento é puramente
77
- visual por padrão.
78
- - Progress: para expor o valor a leitores de tela, adicione
79
- `role="progressbar"` + `aria-valuenow`/`aria-valuemin="0"`/
80
- `aria-valuemax="100"` **e um nome acessível** (`aria-label="Progresso: 60%"`
81
- ou `aria-labelledby` apontando pro rótulo visível) no `.fs-progress`
82
- (mantidos em sincronia com `--fs-progress-value` pela sua aplicação — o
83
- framework não injeta automaticamente). Sem nome acessível, o
84
- `role="progressbar"` é rejeitado por leitores de tela (gate `axe` no CI:
85
- regra `aria-progressbar-name`).
86
- - A animação de listras (`.fs-progress-bar-animated`), a barra indeterminada
87
- e a rotação do spinner desaceleram em `prefers-reduced-motion: reduce`, mas
88
- não param completamente para não parecerem travadas.
89
- - Para o indeterminado, não informe um valor numérico inexistente. O movimento
90
- reduz a velocidade em `prefers-reduced-motion`, mas continua ativo para não
91
- parecer uma interface travada.
92
-
93
- ## API JS
94
-
95
- Nenhuma — 100% CSS. Atualizar `--fs-progress-value` é responsabilidade da
96
- sua aplicação (ex.: `barEl.style.setProperty("--fs-progress-value", "75")`).
97
-
98
- ## Tokens
99
-
100
- Spinner: `--fs-color-{nome}` (variantes de cor). Progress:
101
- `--fs-color-subtle` (trilho), `--fs-color-primary`/`--fs-color-{nome}`
102
- (preenchimento), `--fs-progress-height`, `--fs-progress-track`,
103
- `--fs-progress-bar-bg` e `--fs-progress-radius`. O Spinner também expõe
104
- `--fs-spinner-size`, `--fs-spinner-stroke` e `--fs-spinner-duration` para
105
- ajustes locais.
106
-
107
- ## Exemplo
108
-
109
- ```html
110
- <div class="fs-spinner" role="status" aria-label="Carregando"></div>
111
-
112
- <div class="fs-progress" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100">
113
- <div class="fs-progress-bar" style="--fs-progress-value: 60;">60%</div>
114
- </div>
115
-
116
- <div class="fs-progress-meta"><span>Upload de anexos</span><span class="fs-progress-value">3 de 8 arquivos</span></div>
117
- <div class="fs-progress" role="progressbar" aria-label="Upload de anexos" aria-valuetext="3 de 8 arquivos enviados" aria-valuenow="38" aria-valuemin="0" aria-valuemax="100">
118
- <div class="fs-progress-bar" style="--fs-progress-value: 38"></div>
119
- </div>
120
-
121
- <div class="fs-progress fs-progress-indeterminate" role="progressbar" aria-label="Processando pagamento" aria-valuetext="Progresso indeterminado" aria-busy="true">
122
- <div class="fs-progress-bar"></div>
123
- </div>
124
- ```
125
-
126
- Mockup: [laboratório do componente](../../mockup/feedback-actions.html#progress).
@@ -1,80 +0,0 @@
1
- # Radio
2
-
3
- Radio button 100% CSS, mesma técnica do [Checkbox](checkbox.md) — sobre um
4
- `<input type="radio">` nativo. É a única exceção circular do framework
5
- além do [Spinner](progress.md), por decisão de design (anti-circular no
6
- resto de tudo).
7
-
8
- ## Visão geral
9
-
10
- ```html
11
- <div class="fs-radio">
12
- <input type="radio" name="periodo" class="fs-radio-input" id="dia" checked>
13
- <label for="dia" class="fs-radio-label">Dia</label>
14
- </div>
15
- <div class="fs-radio">
16
- <input type="radio" name="periodo" class="fs-radio-input" id="semana">
17
- <label for="semana" class="fs-radio-label">Semana</label>
18
- </div>
19
- ```
20
-
21
- Radios do mesmo grupo compartilham `name` — seleção exclusiva é
22
- comportamento nativo do `<input type="radio">`, sem JS.
23
-
24
- ## Anatomia
25
-
26
- `.fs-radio` (wrapper) > `.fs-radio-input` (oculto via clip) +
27
- `.fs-radio-label` (`<label for="...">`, desenha o círculo via `::before` e
28
- o ponto interno via `::after`).
29
-
30
- ## Variações
31
-
32
- Tamanho: `.fs-radio-sm`, `.fs-radio-lg` no wrapper.
33
-
34
- ## Estados
35
-
36
- - **checked**, **disabled**, validação (`.is-valid`/`.is-invalid`) e foco —
37
- mesmo padrão do [Checkbox](checkbox.md). Não existe `indeterminate` para
38
- radio.
39
- - Hover e active também alteram a superfície do círculo vazio e selecionado.
40
- - O controle acompanha `dir="rtl"`, `prefers-reduced-motion` e
41
- `forced-colors: active`.
42
-
43
- ## A11y
44
-
45
- - `<input type="radio">` nativo com `name` compartilhado — `ArrowUp`/
46
- `ArrowDown`/`ArrowLeft`/`ArrowRight` movem a seleção **dentro do grupo**
47
- automaticamente (comportamento do navegador, não do framework).
48
- `Tab`/`Shift+Tab` entram/saem do grupo de uma vez (o item selecionado, ou
49
- o primeiro se nenhum estiver selecionado, é o único no fluxo de tab).
50
- - Sempre associe `label` via `for`/`id`.
51
- - Agrupe opções relacionadas com `fieldset`/`legend` e associe instruções ou
52
- erros por `aria-describedby`.
53
-
54
- ## API JS
55
-
56
- Nenhuma — 100% CSS.
57
-
58
- ## Tokens
59
-
60
- | Token | Fallback | Uso |
61
- |---|---|---|
62
- | `--fs-radio-size` | `18px` | Círculo externo |
63
- | `--fs-radio-dot-size` | `8px` | Ponto selecionado |
64
- | `--fs-radio-radius` | `50%` | Forma circular |
65
- | `--fs-radio-gap` | `--fs-space-2` | Distância até o texto |
66
-
67
- ## Exemplo
68
-
69
- ```html
70
- <div class="fs-radio">
71
- <input type="radio" name="plano" class="fs-radio-input" id="p1" checked>
72
- <label for="p1" class="fs-radio-label">Mensal</label>
73
- </div>
74
- <div class="fs-radio">
75
- <input type="radio" name="plano" class="fs-radio-input" id="p2">
76
- <label for="p2" class="fs-radio-label">Anual</label>
77
- </div>
78
- ```
79
-
80
- Mockup: [laboratório do componente](../../mockup/forms.html#check-radio-switch).
@@ -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,19 +0,0 @@
1
- # Responsive
2
-
3
- ## Visão geral
4
-
5
- Os utilitários `.fs-stack`, `.fs-cluster`, `.fs-stack-md-row` e
6
- `.fs-table-responsive` compõem layouts que se adaptam ao espaço disponível.
7
- O comportamento usa propriedades lógicas e funciona com `dir="rtl"`.
8
-
9
- ## Estados
10
-
11
- Em telas estreitas, grupos responsivos ocupam toda a largura e tabelas passam
12
- a permitir rolagem horizontal. O layout continua funcional em zoom de 200% e
13
- em orientação portrait ou landscape.
14
-
15
- ## A11y
16
-
17
- O componente não altera a ordem semântica do conteúdo. Para tabelas largas,
18
- mantenha uma legenda (`caption`) e forneça uma indicação textual quando a
19
- rolagem horizontal for necessária.
@@ -1,13 +0,0 @@
1
- # Scrollspy
2
-
3
- ## Visão geral
4
-
5
- `data-fs-scrollspy` destaca o link da seção atualmente visível e pode ser usado em navegação lateral.
6
-
7
- ## Estados
8
-
9
- O módulo JS aplica `.is-active` e emite `fs:scrollspy:activate`.
10
-
11
- ## A11y
12
-
13
- Use uma navegação nomeada, mantenha foco visível e não remova a indicação textual do destino.
@@ -1,82 +0,0 @@
1
- # Segmented Control
2
-
3
- Grupo de botões com estado selecionado — alternativa compacta a radio
4
- buttons/tabs para poucas opções mutuamente exclusivas (ou não). 100% CSS,
5
- mesma técnica de input oculto + label irmã.
6
-
7
- ## Visão geral
8
-
9
- ```html
10
- <div class="fs-segmented-control">
11
- <div class="fs-segmented-item">
12
- <input type="radio" name="periodo" class="fs-segmented-input" id="p-dia" checked>
13
- <label for="p-dia" class="fs-segmented-label">Dia</label>
14
- </div>
15
- <div class="fs-segmented-item">
16
- <input type="radio" name="periodo" class="fs-segmented-input" id="p-semana">
17
- <label for="p-semana" class="fs-segmented-label">Semana</label>
18
- </div>
19
- <div class="fs-segmented-item">
20
- <input type="radio" name="periodo" class="fs-segmented-input" id="p-mes">
21
- <label for="p-mes" class="fs-segmented-label">Mês</label>
22
- </div>
23
- </div>
24
- ```
25
-
26
- ## Anatomia
27
-
28
- `.fs-segmented-control` (contêiner, borda externa única) >
29
- `.fs-segmented-item` (um por opção) > `.fs-segmented-input`
30
- (`<input>`, oculto via clip) + `.fs-segmented-label` (`<label for="...">`).
31
-
32
- ## Variações
33
-
34
- - **Exclusivo vs. inclusivo**: use `<input type="radio">` com o mesmo
35
- `name` (só uma opção selecionada por vez — como no exemplo) ou
36
- `<input type="checkbox">` (cada item seleciona/deseleciona
37
- independentemente).
38
- - **Tamanho**: `.fs-segmented-control-sm`, `.fs-segmented-control-lg`; sem
39
- sufixo = padrão (38px de altura).
40
-
41
- ```html
42
- <div class="fs-segmented-control fs-segmented-control-sm">...</div>
43
- ```
44
-
45
- ## Estados
46
-
47
- - **checked**: item selecionado ganha fundo/texto na cor primária.
48
- - **disabled**: no input — opacidade reduzida, sem interação.
49
- - **Foco**: anel sobre o item focado (`z-index` elevado pra não ficar
50
- parcialmente escondido pela borda do vizinho).
51
-
52
- ## A11y
53
-
54
- `<input>` nativo (radio ou checkbox) — toda a semântica de grupo (seleção
55
- exclusiva com radio, navegação por seta entre itens do mesmo `name`) vem
56
- do navegador, sem JS. Sempre associe `label` via `for`/`id`.
57
-
58
- ## API JS
59
-
60
- Nenhuma — 100% CSS.
61
-
62
- ## Tokens
63
-
64
- `--fs-color-border`, `--fs-color-surface`, `--fs-color-subtle` (hover),
65
- `--fs-color-primary` (selecionado), `--fs-radius-sm`.
66
-
67
- ## Exemplo
68
-
69
- ```html
70
- <div class="fs-segmented-control">
71
- <div class="fs-segmented-item">
72
- <input type="checkbox" class="fs-segmented-input" id="f-ativo" checked>
73
- <label for="f-ativo" class="fs-segmented-label">Ativos</label>
74
- </div>
75
- <div class="fs-segmented-item">
76
- <input type="checkbox" class="fs-segmented-input" id="f-arquivado">
77
- <label for="f-arquivado" class="fs-segmented-label">Arquivados</label>
78
- </div>
79
- </div>
80
- ```
81
-
82
- Mockup: [laboratório do componente](../../mockup/forms.html#segmented-control).