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,123 +0,0 @@
1
- # Combobox / Autocomplete
2
-
3
- Um `<input>` de texto com uma listbox de sugestões que filtra conforme o
4
- usuário digita — diferente do [Select](select.md) (que troca a aparência
5
- de um `<select>` inteiro), o Combobox é sempre texto livre com sugestões,
6
- seguindo o padrão [WAI-ARIA Combobox (List Autocomplete)](https://www.w3.org/WAI/ARIA/apg/patterns/combobox/).
7
- Reusa `packages/fokus-js/js/core/positioning.js` (mesmo posicionamento do [Dropdown](dropdown.md))
8
- e a classe `.fs-dropdown-menu`/`.fs-dropdown-item` para a listbox flutuante.
9
-
10
- ## Visão geral
11
-
12
- ```html
13
- <div class="fs-combobox">
14
- <input type="text" class="fs-form-control" data-fs="combobox" data-fs-target="#lista-frameworks" placeholder="Buscar framework…">
15
- </div>
16
- <ul class="fs-dropdown-menu fs-combobox-listbox" id="lista-frameworks">
17
- <li class="fs-dropdown-item" data-value="bootstrap">Bootstrap</li>
18
- <li class="fs-dropdown-item" data-value="tailwind">Tailwind CSS</li>
19
- <li class="fs-dropdown-item is-disabled" data-fs-empty hidden>Nenhum resultado encontrado.</li>
20
- </ul>
21
- ```
22
-
23
- O JS reanexa a listbox a `document.body` (igual ao Dropdown/Select — evita
24
- recorte por `overflow: hidden` de um ancestral) e a posiciona relativa ao
25
- input. O item com `data-fs-empty` é opcional, mas recomendado: o
26
- componente alterna a visibilidade dele automaticamente quando nenhuma
27
- opção corresponde à busca — o texto dele é escrito por você (o framework
28
- não injeta texto/idioma).
29
-
30
- ## Anatomia
31
-
32
- `.fs-combobox` (wrapper posicionador) > `input[role="combobox"]` +
33
- `.fs-dropdown-menu.fs-combobox-listbox[role="listbox"]` > um ou mais
34
- `.fs-dropdown-item[role="option"]`.
35
-
36
- ## Variações
37
-
38
- - `data-value` em cada `.fs-dropdown-item` define o valor "de verdade"
39
- (`instance.value`); sem ele, o valor é o texto visível do item.
40
- - Item desabilitado: `.fs-dropdown-item.is-disabled` — ignorado por
41
- teclado, mouse e pelo filtro de "opções selecionáveis".
42
- - Item de "sem resultados": `.fs-dropdown-item.is-disabled[data-fs-empty]`,
43
- `hidden` por padrão — visibilidade alternada automaticamente pelo JS.
44
-
45
- ## Estados
46
-
47
- - Digitar filtra as opções por substring (case-insensitive) — as que não
48
- correspondem recebem o atributo `hidden` (removidas da árvore de
49
- acessibilidade junto, não só visualmente).
50
- - Campo vazio mostra a lista completa (sem filtro).
51
- - Opção destacada durante a navegação por teclado: `.is-active` (visual
52
- idêntico ao item ativo do Dropdown/Select).
53
- - Opção escolhida: `aria-selected="true"` (só nela; as demais voltam a
54
- `"false"`).
55
-
56
- ## A11y
57
-
58
- `role="combobox"` + `aria-autocomplete="list"` + `aria-controls` +
59
- `aria-expanded` no input, `role="listbox"` na lista, `role="option"` +
60
- `aria-selected` em cada item — todos aplicados automaticamente, com `id`
61
- gerado para quem não tiver um. O foco **nunca sai do input**: a opção
62
- destacada é comunicada via `aria-activedescendant` (não `focus()`), como o
63
- padrão ARIA de combobox exige — por isso as opções não são elementos
64
- focáveis (`<li>`/`<div>`, não `<button>`).
65
-
66
- Teclado (com foco no input):
67
- - `ArrowDown`/`ArrowUp`: abre a listbox (se fechada) ou move o destaque
68
- entre as opções selecionáveis, com wrap.
69
- - `Home`/`End`: vai pra primeira/última opção selecionável (listbox
70
- aberta).
71
- - `Enter`: seleciona a opção destacada (se houver e a listbox estiver
72
- aberta) — preenche o input, fecha a listbox.
73
- - `Escape`: fecha a listbox **sem** alterar o valor do input.
74
-
75
- ## API JS
76
-
77
- Auto-init via `data-fs="combobox"` **no `<input>`**, com `data-fs-target`
78
- apontando pro seletor da listbox (convenção idêntica ao Dropdown).
79
- `Combobox.getInstance(inputEl)`.
80
-
81
- | Método | Descrição |
82
- |---|---|
83
- | `show()` | Abre a listbox e posiciona relativa ao input. |
84
- | `hide()` | Fecha a listbox, limpa o destaque e `aria-activedescendant`. |
85
- | `toggle()` | Alterna. |
86
- | `dispose()` | Fecha se aberto, remove listeners, desregistra a instância. |
87
-
88
- | Propriedade | Descrição |
89
- |---|---|
90
- | `value` | Valor da opção selecionada (`data-value` do item, ou o texto visível se não houver). `null` até a primeira seleção. |
91
-
92
- | Evento (no input) | Cancelável | Quando |
93
- |---|---|---|
94
- | `change` (nativo) | Não | Ao selecionar uma opção (clique ou `Enter`). |
95
- | `fs:combobox:changed` | Não | Mesmo momento, com `event.detail.value`/`event.detail.label`. |
96
- | `fs:combobox:shown` | Não | Depois de abrir a listbox. |
97
- | `fs:combobox:hidden` | Não | Depois de fechar. |
98
-
99
- ## Tokens
100
-
101
- Os mesmos do [Dropdown](dropdown.md) (`.fs-dropdown-menu`/`.fs-dropdown-item`)
102
- e de [`.fs-form-control`](input.md) — sem tokens próprios. `.fs-combobox-listbox`
103
- soma `max-height: 240px` + scroll interno para listas longas.
104
-
105
- ## Exemplo
106
-
107
- ```html
108
- <div class="fs-combobox">
109
- <input type="text" class="fs-form-control" id="cidade" data-fs="combobox" data-fs-target="#cidade-lista" placeholder="Buscar cidade…">
110
- </div>
111
- <ul class="fs-dropdown-menu fs-combobox-listbox" id="cidade-lista">
112
- <li class="fs-dropdown-item" data-value="sp">São Paulo</li>
113
- <li class="fs-dropdown-item" data-value="rj">Rio de Janeiro</li>
114
- <li class="fs-dropdown-item is-disabled" data-fs-empty hidden>Nenhuma cidade encontrada.</li>
115
- </ul>
116
- <script>
117
- document.getElementById("cidade").addEventListener("fs:combobox:changed", (e) => {
118
- console.log("cidade escolhida:", e.detail.value);
119
- });
120
- </script>
121
- ```
122
-
123
- Mockup: [laboratório do componente](../../mockup/forms.html#combobox).
@@ -1,131 +0,0 @@
1
- # Command Palette
2
-
3
- Um diálogo de busca/comandos disparado por um botão ou por um atalho de
4
- teclado global (ex.: `Ctrl+K`/`Cmd+K`) — combina o overlay/focus trap do
5
- [Modal](modal.md) com o filtro/navegação por teclado do [Combobox](combobox.md).
6
- Reusa `.fs-dropdown-item`/`.is-active`/`.is-disabled` (mesmas classes do
7
- [Dropdown](dropdown.md)) para os itens da lista de comandos.
8
-
9
- ## Visão geral
10
-
11
- ```html
12
- <button type="button" class="fs-btn" data-fs="command-palette" data-fs-target="#paleta" data-fs-shortcut="mod+k">
13
- Comandos (Ctrl+K)
14
- </button>
15
-
16
- <div class="fs-command-palette" id="paleta">
17
- <div class="fs-command-palette-dialog">
18
- <input type="text" class="fs-command-palette-input" placeholder="Digite um comando…">
19
- <ul class="fs-command-palette-list">
20
- <li class="fs-dropdown-item" data-value="new-file">Novo arquivo</li>
21
- <li class="fs-dropdown-item" data-value="open-settings">Abrir configurações</li>
22
- <li class="fs-dropdown-item is-disabled" data-fs-empty hidden>Nenhum comando encontrado.</li>
23
- </ul>
24
- </div>
25
- </div>
26
- ```
27
-
28
- Auto-init em `data-fs="command-palette"` **no botão gatilho**, com
29
- `data-fs-target` apontando pro painel (convenção idêntica ao Modal). O
30
- painel não precisa estar pré-posicionado — é um overlay de tela cheia,
31
- como o Modal. `data-fs-shortcut="mod+k"` é opcional: quando presente,
32
- registra um atalho de teclado global (`mod` = Ctrl no Windows/Linux, Cmd
33
- no Mac) que abre/fecha o painel de qualquer lugar da página, sem precisar
34
- clicar no botão.
35
-
36
- ## Anatomia
37
-
38
- `.fs-command-palette[role="dialog"]` > `.fs-command-palette-dialog` >
39
- `input.fs-command-palette-input[role="combobox"]` +
40
- `ul.fs-command-palette-list[role="listbox"]` > um ou mais
41
- `li.fs-dropdown-item[role="option"]`.
42
-
43
- ## Variações
44
-
45
- - `data-value` em cada `.fs-dropdown-item` define o valor "de verdade"
46
- (`event.detail.value` no evento de seleção); sem ele, o valor é o texto
47
- visível do item.
48
- - Item desabilitado: `.fs-dropdown-item.is-disabled` — ignorado por
49
- teclado, mouse e pelo filtro.
50
- - Item de "sem resultados": `.fs-dropdown-item.is-disabled[data-fs-empty]`,
51
- `hidden` por padrão — visibilidade alternada automaticamente pelo JS.
52
- - `.fs-dropdown-header` agrupa comandos por seção, igual ao Dropdown.
53
- - `data-fs-shortcut="mod+k"` (ou `options.shortcut` no construtor): aceita
54
- combinações com `mod`/`shift`/`alt` + uma tecla, ex. `"mod+shift+p"`.
55
-
56
- ## Estados
57
-
58
- - Ao abrir, o input é limpo e a lista completa (sem filtro) é exibida.
59
- - Digitar filtra os itens por substring (case-insensitive) — os que não
60
- correspondem recebem o atributo `hidden`.
61
- - Primeiro item selecionável sempre começa destacado (`.is-active`),
62
- pronto pra `Enter` imediato.
63
- - Selecionar um item fecha o painel e devolve o foco ao gatilho.
64
-
65
- ## A11y
66
-
67
- `role="dialog"` + `aria-modal="true"` no painel, `role="combobox"` +
68
- `aria-autocomplete="list"` + `aria-controls`/`aria-expanded` no input,
69
- `role="listbox"` na lista, `role="option"` + `aria-selected` em cada item.
70
- Foco preso dentro do diálogo (`packages/fokus-js/js/core/focus.js`, mesmo mecanismo do
71
- Modal) enquanto aberto; scroll da página travado
72
- (`packages/fokus-js/js/core/overlay.js#lockScroll`). O foco **nunca sai do input** — a opção
73
- destacada é comunicada via `aria-activedescendant`, como no Combobox.
74
-
75
- Teclado (com foco no input, painel aberto):
76
- - `ArrowDown`/`ArrowUp`: move o destaque entre os comandos visíveis, com
77
- wrap.
78
- - `Enter`: executa o comando destacado — dispara `fs:command-palette:selected`
79
- e fecha.
80
- - `Escape`: fecha o painel sem selecionar nada.
81
- - `Tab`/`Shift+Tab`: preso dentro do diálogo (focus trap).
82
-
83
- ## API JS
84
-
85
- Auto-init via `data-fs="command-palette"` no botão gatilho, com
86
- `data-fs-target` apontando pro painel. `CommandPalette.getInstance(triggerEl)`.
87
-
88
- | Método | Descrição |
89
- |---|---|
90
- | `show()` | Abre o painel, limpa o filtro e foca o input. |
91
- | `hide()` | Fecha o painel, libera o scroll, devolve o foco ao gatilho. |
92
- | `toggle()` | Alterna. |
93
- | `dispose()` | Fecha se aberto, remove listeners (incluindo o atalho global, se houver), desregistra a instância. |
94
-
95
- | Evento (no gatilho) | Cancelável | Quando |
96
- |---|---|---|
97
- | `fs:command-palette:selected` | Não | Ao selecionar um comando (clique ou `Enter`), com `event.detail.value`/`event.detail.label`. |
98
- | `fs:command-palette:shown` | Não | Depois de abrir o painel. |
99
- | `fs:command-palette:hidden` | Não | Depois de fechar. |
100
-
101
- ## Tokens
102
-
103
- Os mesmos do [Modal](modal.md) (backdrop, `--fs-radius-md`,
104
- `--fs-shadow-lg`) e do [Dropdown](dropdown.md) para os itens — sem tokens
105
- próprios de cor.
106
-
107
- ## Exemplo
108
-
109
- ```html
110
- <button type="button" class="fs-btn" id="abrir-paleta" data-fs="command-palette" data-fs-target="#paleta-exemplo" data-fs-shortcut="mod+k">
111
- Comandos (Ctrl+K)
112
- </button>
113
-
114
- <div class="fs-command-palette" id="paleta-exemplo">
115
- <div class="fs-command-palette-dialog">
116
- <input type="text" class="fs-command-palette-input" placeholder="Digite um comando…">
117
- <ul class="fs-command-palette-list">
118
- <li class="fs-dropdown-item" data-value="new-file">Novo arquivo</li>
119
- <li class="fs-dropdown-item" data-value="open-settings">Abrir configurações</li>
120
- <li class="fs-dropdown-item is-disabled" data-fs-empty hidden>Nenhum comando encontrado.</li>
121
- </ul>
122
- </div>
123
- </div>
124
- <script>
125
- document.getElementById("abrir-paleta").addEventListener("fs:command-palette:selected", (e) => {
126
- console.log("comando executado:", e.detail.value);
127
- });
128
- </script>
129
- ```
130
-
131
- Mockup: [laboratório do componente](../../mockup/overlays-commands.html#command-palette).
@@ -1,173 +0,0 @@
1
- # DataTable
2
-
3
- Camada JS opcional sobre uma [Table](table.md) comum: ordenação por coluna,
4
- filtro por texto e paginação client-side, tudo sobre a marcação `<table>`
5
- semântica já existente — sem framework de dados, sem dependência externa.
6
- Reusa `.fs-table` para a tabela, `.fs-pagination`/`.fs-page-link` para o
7
- paginador (mesmas classes do [Pagination](pagination.md)) e
8
- `.fs-empty-state` para a lista vazia.
9
-
10
- ## Visão geral
11
-
12
- ```html
13
- <div class="fs-datatable" data-fs="datatable" data-fs-page-size="5">
14
- <div class="fs-datatable-toolbar">
15
- <input type="search" class="fs-form-control" data-fs-datatable-filter placeholder="Filtrar…">
16
- </div>
17
- <table class="fs-table fs-table-striped fs-table-hover">
18
- <thead>
19
- <tr>
20
- <th scope="col" data-fs-sort="name">Nome</th>
21
- <th scope="col" data-fs-sort="age">Idade</th>
22
- </tr>
23
- </thead>
24
- <tbody>
25
- <tr><td>Ana</td><td>35</td></tr>
26
- <tr><td>Bruno</td><td>19</td></tr>
27
- </tbody>
28
- </table>
29
- <div class="fs-empty-state" data-fs-datatable-empty hidden>
30
- <p class="fs-empty-state-title">Nenhum resultado encontrado.</p>
31
- </div>
32
- </div>
33
- ```
34
-
35
- Auto-init em `data-fs="datatable"`, colocado no `<div>` que envolve
36
- toolbar/tabela/estados — não no `<table>` diretamente. O JS lê as linhas de
37
- `<tbody>` uma vez na inicialização; se a tabela for repovoada por fora
38
- (ex.: resposta de uma API), chame `instance.refresh()`.
39
-
40
- ## Anatomia
41
-
42
- `.fs-datatable[data-fs="datatable"]` > opcionalmente `.fs-datatable-toolbar`
43
- (com `input[data-fs-datatable-filter]`) + `table.fs-table` (com
44
- `th[data-fs-sort]` no `<thead>`) + opcionalmente
45
- `[data-fs-datatable-empty]`/`[data-fs-datatable-loading]`/`[data-fs-datatable-error]`
46
- + `nav[data-fs-datatable-pagination]` (criado automaticamente se ausente).
47
-
48
- ## Variações
49
-
50
- - `data-fs-sort="chave"` num `<th>` o torna ordenável — o JS envolve o
51
- conteúdo existente num `<button class="fs-datatable-sort-btn">`
52
- automaticamente (não escreva o botão você mesmo).
53
- - `data-fs-sort-type="number"`, `"currency"` ou `"date"` no `<th>` ativa
54
- comparação tipada; sem o atributo, a ordenação usa texto. Combine com
55
- `data-fs-sort-value` quando o valor exibido for formatado.
56
- - `data-fs-sort-value` numa `<td>` define o valor usado pra ordenar aquela
57
- célula, se for diferente do texto exibido (ex.: data ISO por trás de um
58
- texto formatado, número por trás de um texto com símbolo).
59
- - `data-fs-page-size="N"` no elemento raiz define quantas linhas por
60
- página (padrão: 10).
61
- - `[data-fs-datatable-filter]` — um `<input>` (dentro do elemento raiz)
62
- que filtra por substring em qualquer célula da linha, case-insensitive.
63
- - `[data-fs-datatable-empty]` — bloco (tipicamente `.fs-empty-state`)
64
- mostrado no lugar da tabela quando o filtro não encontra nenhuma linha.
65
- - `[data-fs-datatable-loading]` / `[data-fs-datatable-error]` — blocos
66
- mostrados via `setLoading()`/`setError()` (ver API JS); nenhum dos dois é
67
- obrigatório.
68
- - `[data-fs-datatable-pagination]` — se você quiser controlar onde o
69
- paginador aparece, forneça o elemento; senão o JS cria um `<nav>` e
70
- anexa ao final do elemento raiz.
71
-
72
- ## Estados
73
-
74
- - **Vazio**: filtro sem correspondências — tabela ocultada,
75
- `[data-fs-datatable-empty]` exibido (se fornecido; sem ele, a tabela só
76
- fica com zero linhas visíveis).
77
- - **Carregando**: acionado por `instance.setLoading(true)` — tabela e
78
- paginador ocultados, `[data-fs-datatable-loading]` exibido (tipicamente
79
- linhas `.fs-skeleton-text`).
80
- - **Erro**: acionado por `instance.setError("mensagem")` — tabela e
81
- paginador ocultados, `[data-fs-datatable-error]` exibido, com o texto
82
- escrito em `[data-fs-datatable-error-message]` dentro dele (se existir).
83
- - Paginação: o `<nav>` só é exibido quando há mais de uma página.
84
-
85
- ## A11y
86
-
87
- `aria-sort` (`"none"`/`"ascending"`/`"descending"`) em cada `<th>`
88
- ordenável, atualizado a cada clique — o botão interno recebe o clique/foco
89
- (padrão recomendado pelo
90
- [WAI-ARIA Table Sort](https://www.w3.org/WAI/ARIA/apg/patterns/table/examples/sortable-table/),
91
- `aria-sort` no `th`, ativação num elemento focável dentro dele). Células de
92
- dados usam roving `tabindex` (uma célula visível por vez com `tabindex="0"`,
93
- as demais `-1"`) pra navegação em grade sem tornar cada célula uma parada
94
- extra no Tab da página.
95
-
96
- Teclado (com foco numa célula do corpo da tabela):
97
- - `ArrowRight`/`ArrowLeft`/`ArrowUp`/`ArrowDown`: move o foco pra célula
98
- vizinha (não cruza limites da página visível).
99
- - `Home`/`End`: primeira/última célula da linha atual.
100
- - `Ctrl+Home`/`Ctrl+End`: primeira célula da tabela / última célula da
101
- última linha visível.
102
-
103
- Teclado (com foco no botão de ordenação do cabeçalho): `Enter`/`Espaço`
104
- ativam nativamente (é um `<button>`), ciclando
105
- ascendente → descendente → nenhuma.
106
-
107
- ## API JS
108
-
109
- Auto-init via `data-fs="datatable"` no elemento raiz.
110
- `DataTable.getInstance(rootEl)`.
111
-
112
- | Método | Descrição |
113
- |---|---|
114
- | `sort(key, direction)` | Ordena pela coluna com `data-fs-sort="key"`. `direction`: `"asc"` \| `"desc"` \| `"none"`. |
115
- | `filter(query)` | Filtra por substring (aplica também no input, se houver um). |
116
- | `goToPage(page)` | Navega pra página (1-indexado, com clamp nos limites). |
117
- | `refresh()` | Relê as linhas de `<tbody>` do zero — use após repovoar a tabela por fora. |
118
- | `setLoading(bool)` | Alterna o estado de carregamento. |
119
- | `setError(mensagem \| null)` | Mostra (com mensagem) ou limpa (`null`) o estado de erro. |
120
- | `dispose()` | Remove listeners e desregistra a instância. |
121
-
122
- | Propriedade | Descrição |
123
- |---|---|
124
- | `sortKey` / `sortDirection` | Coluna e direção de ordenação atuais (`sortDirection`: `"asc"` \| `"desc"` \| `"none"`). |
125
- | `filterQuery` | Texto de filtro atual. |
126
- | `currentPage` / `pageCount` | Página atual e total de páginas (considerando o filtro). |
127
- | `rowCount` | Quantidade de linhas que correspondem ao filtro atual. |
128
- | `pageSize` | Linhas por página (lido de `data-fs-page-size`, ou 10). |
129
-
130
- | Evento (no elemento raiz) | Cancelável | Quando |
131
- |---|---|---|
132
- | `fs:datatable:sorted` | Não | Após ordenar, com `detail.key`/`detail.direction`. |
133
- | `fs:datatable:filtered` | Não | Após filtrar, com `detail.query`/`detail.matched`. |
134
- | `fs:datatable:paged` | Não | Após trocar de página, com `detail.page`/`detail.pageCount`. |
135
-
136
- ## Tokens
137
-
138
- Reusa os tokens de [Table](table.md) e [Pagination](pagination.md) — sem
139
- tokens próprios de cor. `.fs-datatable-sort-btn` usa
140
- `var(--fs-color-muted)`/`var(--fs-color-text)` pro indicador de direção
141
- (↕/↑/↓).
142
-
143
- ## Exemplo
144
-
145
- ```html
146
- <div class="fs-datatable" data-fs="datatable" data-fs-page-size="3">
147
- <div class="fs-datatable-toolbar">
148
- <input type="search" class="fs-form-control" data-fs-datatable-filter placeholder="Filtrar por nome ou status…">
149
- </div>
150
- <table class="fs-table fs-table-striped">
151
- <thead>
152
- <tr>
153
- <th scope="col" data-fs-sort="name">Nome</th>
154
- <th scope="col" data-fs-sort="status">Status</th>
155
- </tr>
156
- </thead>
157
- <tbody>
158
- <tr><td>Ana</td><td>Ativo</td></tr>
159
- <tr><td>Bruno</td><td>Inativo</td></tr>
160
- </tbody>
161
- </table>
162
- <div class="fs-empty-state" data-fs-datatable-empty hidden>
163
- <p class="fs-empty-state-title">Nenhum resultado encontrado.</p>
164
- </div>
165
- </div>
166
- <script>
167
- document.querySelector(".fs-datatable").addEventListener("fs:datatable:sorted", (e) => {
168
- console.log("ordenado por", e.detail.key, e.detail.direction);
169
- });
170
- </script>
171
- ```
172
-
173
- Mockup: [laboratório do componente](../../mockup/content-data.html#datatable).
@@ -1,137 +0,0 @@
1
- # Datepicker / Timepicker
2
-
3
- Duas abordagens complementares: **CSS-only**
4
- (`<input type="date">`/`<input type="time">` nativo, só estilizado) para
5
- quem quer o seletor do próprio sistema operacional/navegador, e um
6
- **Datepicker JS customizado** (`.fs-datepicker`) para quando o design
7
- precisa de controle total sobre a aparência do calendário — os nativos não
8
- podem ser restilizados além de cor/borda/fonte do campo (o popup em si é
9
- chrome do navegador, fora do alcance de CSS).
10
-
11
- ## Visão geral
12
-
13
- ### CSS-only (`<input type="date">`/`"time"`)
14
-
15
- ```html
16
- <input type="date" class="fs-form-control">
17
- <input type="time" class="fs-form-control">
18
- ```
19
-
20
- Herdam `.fs-form-control` normalmente (borda, fundo, foco). A única
21
- correção específica do framework é o indicador nativo (ícone de
22
- calendário/relógio) no tema escuro — por padrão o navegador desenha um
23
- ícone escuro fixo, invisível sobre `--fs-color-surface` escuro; o FokusStyles
24
- aplica `filter: invert(1)` nele sob `[data-theme="dark"]`.
25
-
26
- ### Datepicker customizado (JS)
27
-
28
- ```html
29
- <div class="fs-datepicker">
30
- <input type="text" class="fs-form-control" data-fs="datepicker" data-fs-target="#dp-entrega" placeholder="dd/mm/aaaa">
31
- </div>
32
- <div id="dp-entrega"></div>
33
- ```
34
-
35
- O elemento apontado por `data-fs-target` é o painel do calendário — fica
36
- vazio no HTML, o JS constrói o cabeçalho (mês/ano + navegação) e a grade de
37
- dias dinamicamente a cada abertura/troca de mês. Se o `<input>` já tiver um
38
- valor em `dd/mm/aaaa` (formato de exibição, pt-BR), o Datepicker abre no mês
39
- correspondente com o dia já marcado como selecionado.
40
-
41
- ## Anatomia
42
-
43
- `.fs-datepicker` (wrapper posicionador) > `input[role="combobox"]` +
44
- `.fs-datepicker-panel` (reanexado a `document.body`, posicionado via
45
- `packages/fokus-js/js/core/positioning.js`) > `.fs-datepicker-header` (`.fs-datepicker-nav` ×2 +
46
- `.fs-datepicker-title`) + `.fs-datepicker-grid[role="grid"]` (uma
47
- `.fs-datepicker-week[role="row"]` por semana, cada uma com 7
48
- `.fs-datepicker-day[role="gridcell"]`).
49
-
50
- ## Variações
51
-
52
- - Dias fora do mês corrente (preenchendo a primeira/última semana):
53
- `.fs-datepicker-day.is-outside`.
54
- - Sem suporte a `min`/`max` (intervalo de datas permitido) nesta versão —
55
- todo dia é selecionável.
56
-
57
- ## Estados
58
-
59
- - `.is-today`: contorno sutil no dia atual.
60
- - `.is-selected`: preenchimento sólido na cor de ação primária (mesmo
61
- `color-contrast()` dos demais preenchimentos sólidos do framework).
62
- - `:disabled`: dia desabilitado (não gerado automaticamente hoje — para uso
63
- manual caso você desabilite dias específicos via JS próprio).
64
-
65
- ## A11y
66
-
67
- Segue o padrão [WAI-ARIA Date Picker Dialog](https://www.w3.org/WAI/ARIA/apg/patterns/dialog-modal/examples/datepicker-dialog/)
68
- adaptado (sem o modal — o painel é um popup não-modal, mesma filosofia do
69
- [Combobox](combobox.md)/[Dropdown](dropdown.md)):
70
-
71
- - `role="combobox"` + `aria-haspopup="grid"` + `aria-expanded` +
72
- `aria-controls` no input — `aria-expanded` só é permitido em roles como
73
- `combobox`/`button`, por isso o `role="combobox"` é necessário mesmo o
74
- input não filtrando nada (diferente do Combobox de verdade).
75
- - `role="grid"`/`role="row"`/`role="gridcell"` na grade — ao contrário do
76
- Combobox, os dias **são** focáveis de verdade (roving `tabindex`: só o
77
- dia selecionado/hoje/primeiro do mês tem `tabindex="0"`).
78
- - Teclado (com o painel aberto):
79
- - `ArrowDown`/`ArrowUp` com foco no input: abre o painel (se fechado) e
80
- move o foco pro dia tabável — sem isso, as setas não teriam efeito
81
- nenhum vindas do input.
82
- - `ArrowRight`/`ArrowLeft`: dia seguinte/anterior (cruza mês).
83
- - `ArrowDown`/`ArrowUp` com foco num dia: mesma semana, ±7 dias.
84
- - `Home`/`End`: primeiro/último dia da semana atual.
85
- - `PageDown`/`PageUp`: mês seguinte/anterior. `Shift+PageDown`/
86
- `Shift+PageUp`: ano seguinte/anterior.
87
- - `Enter`/`Space`: seleciona o dia com foco.
88
- - `Escape`: fecha o painel sem alterar o valor do input, devolve o foco
89
- a ele.
90
- - Título do mês/ano (`aria-live="polite"`) anuncia a troca ao navegar.
91
-
92
- ## API JS
93
-
94
- Auto-init via `data-fs="datepicker"` **no `<input>`**, com `data-fs-target`
95
- apontando pro painel (convenção idêntica ao Dropdown/Combobox).
96
- `Datepicker.getInstance(inputEl)`.
97
-
98
- | Método | Descrição |
99
- |---|---|
100
- | `show()` | Abre o painel, renderiza o mês do valor atual (ou o mês corrente). |
101
- | `hide()` | Fecha o painel. |
102
- | `toggle()` | Alterna. |
103
- | `dispose()` | Fecha se aberto, remove listeners, desregistra a instância. |
104
-
105
- | Propriedade | Descrição |
106
- |---|---|
107
- | `value` | Data selecionada em ISO (`aaaa-mm-dd`), `null` até a primeira seleção. |
108
-
109
- | Evento (no input) | Cancelável | Quando |
110
- |---|---|---|
111
- | `change` (nativo) | Não | Ao selecionar um dia (clique ou `Enter`/`Space`). |
112
- | `fs:datepicker:changed` | Não | Mesmo momento, com `event.detail.value` (ISO) e `event.detail.date` (`Date`). |
113
- | `fs:datepicker:shown` | Não | Depois de abrir o painel. |
114
- | `fs:datepicker:hidden` | Não | Depois de fechar. |
115
-
116
- ## Tokens
117
-
118
- Reusa `--fs-color-border`/`-surface`/`-text`/`-muted`/`-primary`,
119
- `--fs-radius-sm`/`-md` e `--fs-shadow-md` — sem tokens próprios.
120
-
121
- ## Exemplo
122
-
123
- ```html
124
- <div class="fs-datepicker">
125
- <input type="text" class="fs-form-control" id="entrega" data-fs="datepicker" data-fs-target="#entrega-painel" placeholder="dd/mm/aaaa">
126
- </div>
127
- <div id="entrega-painel"></div>
128
- <script>
129
- document.getElementById("entrega").addEventListener("fs:datepicker:changed", (e) => {
130
- console.log("data escolhida:", e.detail.value); // "2026-07-20"
131
- });
132
- </script>
133
- ```
134
-
135
- Mockup: [laboratório do componente](../../mockup/forms.html#datepicker) (inclui o
136
- Datepicker customizado e os `<input type="date">`/`"time"` nativos lado a
137
- lado).
@@ -1,57 +0,0 @@
1
- # Divider
2
-
3
- Linha divisória, 100% CSS — traço simples ou com rótulo centralizado.
4
-
5
- ## Visão geral
6
-
7
- ```html
8
- <hr class="fs-divider">
9
-
10
- <div class="fs-divider"><span class="fs-divider-label">ou</span></div>
11
- ```
12
-
13
- ## Anatomia
14
-
15
- Duas formas, conforme o elemento:
16
-
17
- - `<hr class="fs-divider">` — traço simples, uma linha (`<hr>` não aceita
18
- filhos).
19
- - `<div class="fs-divider">` com `.fs-divider-label` dentro — texto
20
- centralizado, flanqueado por duas linhas desenhadas via
21
- `::before`/`::after` (precisa ser `<div>`, não `<hr>`, por causa do
22
- filho).
23
-
24
- ## Variações
25
-
26
- Nenhuma — sem cor, tamanho ou orientação alternativa.
27
-
28
- ## Estados
29
-
30
- Nenhum — elemento estático.
31
-
32
- ## A11y
33
-
34
- `<hr>` já tem `role="separator"` implícito. Na variante com `<div>`, se a
35
- separação for só visual (não estrutural), não precisa de role extra; se
36
- divide seções de conteúdo distintas, considere `role="separator"`
37
- explícito.
38
-
39
- ## API JS
40
-
41
- Nenhuma — 100% CSS.
42
-
43
- ## Tokens
44
-
45
- `--fs-color-border`, `--fs-color-muted` (texto do label).
46
-
47
- ## Exemplo
48
-
49
- ```html
50
- <p>Conteúdo acima.</p>
51
- <hr class="fs-divider">
52
- <p>Conteúdo abaixo.</p>
53
-
54
- <div class="fs-divider"><span class="fs-divider-label">ou entre com</span></div>
55
- ```
56
-
57
- Mockup: [laboratório do componente](../../mockup/foundations.html#divider).