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,78 +0,0 @@
1
- # Collapse
2
-
3
- Expande/recolhe um painel com transição de altura animada — primitivo
4
- usado internamente por [Accordion](accordion.md); use direto quando quiser
5
- só um "mostrar mais" sem a semântica de grupo do Accordion.
6
-
7
- ## Visão geral
8
-
9
- ```html
10
- <button type="button" class="fs-btn" data-fs="collapse" data-fs-target="#detalhes">
11
- Ver detalhes
12
- </button>
13
- <div class="fs-collapse" id="detalhes">
14
- Conteúdo que expande/recolhe.
15
- </div>
16
- ```
17
-
18
- ## Anatomia
19
-
20
- Gatilho (`data-fs="collapse"` + `data-fs-target`) + `.fs-collapse`
21
- (precisa de `overflow: hidden`, já incluso na classe — não remova via CSS
22
- próprio, quebra a animação de altura).
23
-
24
- ## Variações
25
-
26
- Nenhuma — sem tamanho/cor; é um comportamento, não um estilo visual
27
- próprio (o conteúdo interno usa suas próprias classes).
28
-
29
- ## Estados
30
-
31
- Estado inicial definido por `aria-expanded` no gatilho: `"true"` começa
32
- aberto, ausente ou `"false"` começa fechado.
33
-
34
- ```html
35
- <button type="button" class="fs-btn" data-fs="collapse" data-fs-target="#painel" aria-expanded="true">
36
- Recolher
37
- </button>
38
- ```
39
-
40
- ## A11y
41
-
42
- `aria-controls`/`aria-expanded` no gatilho são sincronizados
43
- automaticamente pelo JS a cada `show()`/`hide()`.
44
- [`prefers-reduced-motion: reduce`](../guides/accessibility.md#prefers-reduced-motion)
45
- pula a animação e aplica o estado final direto.
46
-
47
- ## API JS
48
-
49
- Auto-init via `data-fs="collapse"` **no gatilho**. `Collapse.getInstance(triggerEl)`.
50
-
51
- | Método | Descrição |
52
- |---|---|
53
- | `show()` | Expande com animação de altura. |
54
- | `hide()` | Recolhe com animação de altura. |
55
- | `toggle()` | Alterna (é o que o clique no gatilho já faz). |
56
- | `dispose()` | Remove o listener de clique e desregistra a instância. |
57
-
58
- | Evento (no gatilho) | Cancelável | Quando |
59
- |---|---|---|
60
- | `fs:collapse:shown` | Não | Depois que a animação de expandir termina. |
61
- | `fs:collapse:hidden` | Não | Depois que a animação de recolher termina. |
62
-
63
- ## Tokens
64
-
65
- Nenhum próprio — o conteúdo interno usa suas próprias cores/espaçamento.
66
-
67
- ## Exemplo
68
-
69
- ```html
70
- <button type="button" class="fs-btn fs-btn-outline-secondary" data-fs="collapse" data-fs-target="#mais-info">
71
- Mais informações
72
- </button>
73
- <div class="fs-collapse" id="mais-info">
74
- <p class="fs-u-mt-2">Texto adicional que só aparece quando expandido.</p>
75
- </div>
76
- ```
77
-
78
- Mockup: [laboratório do componente](../../mockup/navigation-disclosure.html#collapse).
@@ -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).