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,120 +0,0 @@
1
- # Modal
2
-
3
- Diálogo sobreposto à página inteira, com focus trap, `Escape` e clique
4
- fora pra fechar. Base do [Alert Dialog](alert-dialog.md).
5
-
6
- ## Visão geral
7
-
8
- ```html
9
- <button type="button" class="fs-btn fs-btn-primary" data-fs="modal" data-fs-target="#meuModal">
10
- Abrir modal
11
- </button>
12
-
13
- <div class="fs-modal" id="meuModal">
14
- <div class="fs-modal-dialog">
15
- <div class="fs-modal-content">
16
- <div class="fs-modal-header">
17
- <h3 class="fs-modal-title">Título</h3>
18
- <button type="button" class="fs-btn-close" data-fs-dismiss="modal" aria-label="Fechar"></button>
19
- </div>
20
- <div class="fs-modal-body">Conteúdo do modal.</div>
21
- <div class="fs-modal-footer">
22
- <button type="button" class="fs-btn" data-fs-dismiss="modal">Cancelar</button>
23
- <button type="button" class="fs-btn fs-btn-primary">Confirmar</button>
24
- </div>
25
- </div>
26
- </div>
27
- </div>
28
- ```
29
-
30
- `data-fs` vai no **gatilho** (o botão que abre), não no `.fs-modal` — ao
31
- contrário da maioria dos outros componentes.
32
-
33
- ## Anatomia
34
-
35
- Gatilho (`data-fs="modal"` + `data-fs-target`) + `.fs-modal` (overlay de
36
- tela cheia, centraliza o conteúdo) > `.fs-modal-dialog` (limita a largura)
37
- > `.fs-modal-content` (card visual) > `.fs-modal-header` (título +
38
- `.fs-btn-close`, opcional) + `.fs-modal-body` (rola internamente se o
39
- conteúdo for maior que a viewport) + `.fs-modal-footer` (ações, opcional).
40
-
41
- ## Variações
42
-
43
- Tamanho do diálogo: `.fs-modal-sm` (320px), `.fs-modal-lg` (720px) em
44
- `.fs-modal-dialog`; sem sufixo = 480px (padrão).
45
-
46
- ```html
47
- <div class="fs-modal-dialog fs-modal-lg">...</div>
48
- ```
49
-
50
- ## Estados
51
-
52
- `.is-open` no `.fs-modal` — controlado pelo JS.
53
-
54
- **Backdrop estático** (`data-backdrop="static"` no `.fs-modal`): desativa
55
- fechamento por `Escape` e clique fora — só um `data-fs-dismiss="modal"`
56
- explícito fecha. Use para fluxos que exigem uma decisão explícita.
57
-
58
- ```html
59
- <div class="fs-modal" id="modalCritico" data-backdrop="static">...</div>
60
- ```
61
-
62
- ## A11y
63
-
64
- Use `.fs-modal-sm`, `.fs-modal-lg`, `.fs-modal-xl`, `.fs-modal-fullscreen` e
65
- `.fs-modal-scrollable` conforme o fluxo. Em telas menores o diálogo respeita safe areas.
66
-
67
- Ao inicializar, o componente controla `aria-hidden` e, quando encontra
68
- `.fs-modal-title`, cria automaticamente o vínculo `aria-labelledby`. Um
69
- `id` existente no título é preservado.
70
-
71
- `role="dialog"` + `aria-modal="true"` aplicados automaticamente. Ao abrir:
72
- foco preso dentro do `.fs-modal-dialog` (`Tab`/`Shift+Tab` ciclam só entre
73
- os elementos focáveis internos), primeiro elemento focável recebe foco,
74
- scroll da página é bloqueado. Ao fechar: foco volta pro gatilho que abriu.
75
-
76
- ## API JS
77
-
78
- Auto-init via `data-fs="modal"` **no gatilho**. `Modal.getInstance(triggerEl)`.
79
-
80
- | Método | Descrição |
81
- |---|---|
82
- | `show()` | Abre, trava o scroll, ativa o focus trap. |
83
- | `hide()` | Fecha, libera o scroll, devolve o foco ao gatilho. |
84
- | `toggle()` | Alterna. |
85
- | `dispose()` | Fecha se aberto, remove listeners, desregistra a instância. |
86
-
87
- | Evento (no gatilho) | Cancelável | Quando |
88
- |---|---|---|
89
- | `fs:modal:shown` | Não | Depois de abrir. |
90
- | `fs:modal:hidden` | Não | Depois de fechar (inclusive via Escape/clique fora). |
91
-
92
- ## Tokens
93
-
94
- `--fs-color-surface`, `--fs-color-text`, `--fs-color-border`,
95
- `--fs-radius-md`, `--fs-shadow-lg`.
96
-
97
- ## Exemplo
98
-
99
- ```html
100
- <button type="button" class="fs-btn fs-btn-danger" data-fs="modal" data-fs-target="#confirmarExclusao">
101
- Excluir
102
- </button>
103
- <div class="fs-modal" id="confirmarExclusao">
104
- <div class="fs-modal-dialog fs-modal-sm">
105
- <div class="fs-modal-content">
106
- <div class="fs-modal-body">
107
- <h3 class="fs-modal-title">Excluir item?</h3>
108
- <p>Essa ação não pode ser desfeita.</p>
109
- </div>
110
- <div class="fs-modal-footer">
111
- <button type="button" class="fs-btn" data-fs-dismiss="modal">Cancelar</button>
112
- <button type="button" class="fs-btn fs-btn-danger">Excluir</button>
113
- </div>
114
- </div>
115
- </div>
116
- </div>
117
- ```
118
-
119
- Para o mesmo padrão sem escrever HTML, ver [Alert Dialog](alert-dialog.md)
120
- (`FokusStyles.confirm()`). Mockup: [laboratório do componente](../../mockup/overlays-commands.html#modal).
@@ -1,74 +0,0 @@
1
- # Navbar
2
-
3
- Barra de navegação horizontal estática — marca de um lado, links do outro.
4
- Versão "crua": sem collapse/hambúrguer próprio para mobile e sem dropdown
5
- embutido; para um menu suspenso dentro da navbar, combine com
6
- [Dropdown](dropdown.md).
7
-
8
- ## Visão geral
9
-
10
- ```html
11
- <nav class="fs-navbar">
12
- <a href="#" class="fs-navbar-brand">Minha Marca</a>
13
- <ul class="fs-navbar-nav">
14
- <li><a href="#" class="fs-nav-link is-active">Início</a></li>
15
- <li><a href="#" class="fs-nav-link">Produtos</a></li>
16
- <li><a href="#" class="fs-nav-link is-disabled">Em breve</a></li>
17
- </ul>
18
- </nav>
19
- ```
20
-
21
- ## Anatomia
22
-
23
- `.fs-navbar` (flex, `justify-content: space-between`, quebra linha se não
24
- houver espaço) > `.fs-navbar-brand` (nome/logo) + `.fs-navbar-nav`
25
- (`<ul>` sem marcadores) > `<li>` > `.fs-nav-link`.
26
-
27
- `.fs-nav-link` é compartilhado com [Tabs](tabs.md) — o mesmo estilo de
28
- link de navegação serve pros dois contextos.
29
-
30
- ## Variações
31
-
32
- Nenhuma variação de cor/tamanho — a navbar é sempre o mesmo visual; a
33
- composição (o que vai dentro) que muda.
34
-
35
- ## Estados
36
-
37
- - `.fs-nav-link.is-active` — destaque de cor primária + peso de fonte
38
- maior.
39
- - `.fs-nav-link.is-disabled` — cor muted, não clicável.
40
-
41
- ## A11y
42
-
43
- O padrão responsivo usa `.fs-navbar-toggler`, `.fs-navbar-collapse` e `data-fs-target`.
44
- Mantenha `aria-expanded` e um nome acessível no botão.
45
-
46
- - Use `<nav>` como elemento raiz (já no exemplo) — landmark de navegação
47
- pra leitores de tela.
48
- - Se houver mais de uma navbar na página, diferencie com
49
- `aria-label="Navegação principal"` (ou similar) em cada `<nav>`.
50
-
51
- ## API JS
52
-
53
- Nenhuma — 100% CSS.
54
-
55
- ## Tokens
56
-
57
- `--fs-color-border` (borda inferior), `--fs-color-surface` (fundo),
58
- `--fs-color-text`, `--fs-color-primary` (ativo), `--fs-color-muted`
59
- (desabilitado), `--fs-radius-sm` (hover do link).
60
-
61
- ## Exemplo
62
-
63
- ```html
64
- <nav class="fs-navbar" aria-label="Navegação principal">
65
- <a href="#" class="fs-navbar-brand">FokusStyles</a>
66
- <ul class="fs-navbar-nav">
67
- <li><a href="#" class="fs-nav-link is-active">Dashboard</a></li>
68
- <li><a href="#" class="fs-nav-link">Relatórios</a></li>
69
- <li><a href="#" class="fs-nav-link">Configurações</a></li>
70
- </ul>
71
- </nav>
72
- ```
73
-
74
- Mockup: [laboratório do componente](../../mockup/navigation-disclosure.html#navbar).
@@ -1,90 +0,0 @@
1
- # Nested Menu
2
-
3
- [Dropdown](dropdown.md) com submenus recursivos, quantos níveis quiser.
4
- Reusa `.fs-dropdown-menu`/`.fs-dropdown-item` sem reestilizar — só adiciona
5
- o posicionamento em cascata e a navegação por nível. Componente próprio
6
- (não é o Dropdown com opção extra) porque a navegação por teclado é por
7
- nível, não linear sobre todos os itens.
8
-
9
- ## Visão geral
10
-
11
- ```html
12
- <button type="button" class="fs-btn fs-dropdown-toggle" data-fs="nested-menu" data-fs-target="#menu">
13
- Arquivo
14
- </button>
15
- <div class="fs-dropdown-menu" id="menu">
16
- <a href="#" class="fs-dropdown-item">Novo</a>
17
- <div class="fs-dropdown-submenu">
18
- <a href="#" class="fs-dropdown-item fs-dropdown-item-submenu">Exportar</a>
19
- <div class="fs-dropdown-menu">
20
- <a href="#" class="fs-dropdown-item">PDF</a>
21
- <a href="#" class="fs-dropdown-item">CSV</a>
22
- </div>
23
- </div>
24
- <a href="#" class="fs-dropdown-item">Fechar</a>
25
- </div>
26
- ```
27
-
28
- ## Anatomia
29
-
30
- Gatilho + `.fs-dropdown-menu` (raiz) — cada submenu é
31
- `.fs-dropdown-submenu` (âncora de posicionamento) envolvendo um
32
- `.fs-dropdown-item.fs-dropdown-item-submenu` (o item que abre, com seta
33
- lateral) seguido de outro `.fs-dropdown-menu` (o submenu em si, mesmo
34
- padrão recursivamente).
35
-
36
- ## Variações
37
-
38
- Mesmas de [Dropdown](dropdown.md) no gatilho raiz (`data-placement`,
39
- `data-align`). Submenus não têm variação própria — abrem sempre à direita
40
- do item pai, com flip automático para a esquerda se não couber (a classe
41
- `.fs-dropdown-submenu-left` é aplicada/removida pelo JS, não escreva
42
- manualmente).
43
-
44
- ## Estados
45
-
46
- `.is-open` em cada `.fs-dropdown-menu` (raiz e submenus, independentes).
47
- Só um submenu por nível fica aberto por vez — abrir um fecha os irmãos do
48
- mesmo nível.
49
-
50
- Abertura por **hover** é 100% CSS (`:hover` no `.fs-dropdown-submenu`);
51
- por **clique/teclado** é controlada pelo JS, coexistindo sem conflito
52
- (passar o mouse fecha ramos abertos por teclado que não estão no caminho
53
- do hover).
54
-
55
- ## A11y
56
-
57
- `role="menu"` em todo nível, `aria-haspopup="menu"` + `aria-expanded` em
58
- todo item que abre submenu (sincronizados automaticamente). Teclado (com
59
- foco num item do menu): `ArrowDown`/`ArrowUp` navegam no nível atual,
60
- `ArrowRight` abre o submenu do item focado e move o foco pro primeiro item
61
- dele, `ArrowLeft` fecha o submenu atual e devolve o foco ao item pai,
62
- `Escape` fecha só o nível atual (se estiver num submenu) ou o menu inteiro
63
- (se estiver na raiz), `Enter`/`Space` num item com submenu alterna
64
- abrir/fechar.
65
-
66
- ## API JS
67
-
68
- Auto-init via `data-fs="nested-menu"`. `NestedMenu.getInstance(el)` (`el`
69
- é o gatilho).
70
-
71
- | Método | Descrição |
72
- |---|---|
73
- | `show()` | Abre o menu raiz, posiciona, foca o primeiro item. |
74
- | `hide()` | Fecha o menu raiz e todos os submenus abertos. |
75
- | `toggle()` | Alterna. |
76
- | `dispose()` | Fecha se aberto, remove todos os listeners, desregistra a instância. |
77
-
78
- | Evento (no gatilho) | Cancelável | Quando |
79
- |---|---|---|
80
- | `fs:nested-menu:shown` | Não | Depois de abrir o menu raiz. |
81
- | `fs:nested-menu:hidden` | Não | Depois de fechar o menu raiz (fecha todos os submenus junto). |
82
-
83
- ## Tokens
84
-
85
- Mesmos do [Dropdown](dropdown.md) — sem tokens próprios.
86
-
87
- ## Exemplo
88
-
89
- Ver acima (Visão geral) — mockup com múltiplos níveis em
90
- [laboratório do componente](../../mockup/navigation-disclosure.html#nested-menu).
@@ -1,116 +0,0 @@
1
- # Notification Center
2
-
3
- Orquestra múltiplas instâncias de [Toast](toast.md) e mantém um histórico
4
- com painel de notificações e contador de não-lidas — não introduz um
5
- elemento visual novo, compõe o que já existe.
6
-
7
- ## Visão geral
8
-
9
- ```html
10
- <button type="button" class="fs-btn" data-fs="notification-center" data-fs-target="#painel-notif" aria-label="Notificações">
11
- <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="M10.268 21a2 2 0 0 0 3.464 0"/><path d="M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326"/></svg>
12
- <span class="fs-notification-badge" hidden>0</span>
13
- </button>
14
-
15
- <div class="fs-notification-center" id="painel-notif">
16
- <div class="fs-notification-center-header">
17
- <span class="fs-notification-center-title">Notificações</span>
18
- <button type="button" class="fs-btn fs-btn-sm" data-notification="clear">Limpar tudo</button>
19
- </div>
20
- <ul class="fs-notification-list"></ul>
21
- <p class="fs-notification-empty">Nenhuma notificação.</p>
22
- </div>
23
- ```
24
-
25
- ```js
26
- const center = FokusStyles.NotificationCenter.getInstance(document.querySelector('[data-fs="notification-center"]'));
27
- center.push({ title: "Sucesso", body: "Arquivo salvo.", variant: "success" });
28
- ```
29
-
30
- ## Anatomia
31
-
32
- Gatilho (`data-fs="notification-center"` + `data-fs-target`, com
33
- `.fs-notification-badge` opcional dentro) + `.fs-notification-center`
34
- (painel) > `.fs-notification-center-header` (título + botão "limpar tudo",
35
- via `data-notification="clear"`) + `.fs-notification-list` (`<ul>`,
36
- preenchida dinamicamente) + `.fs-notification-empty` (mostrado/escondido
37
- automaticamente conforme o histórico). O `.fs-toast-container` é criado
38
- automaticamente se não existir um na página (ou aponte pra um existente
39
- com `data-toast-container="#seletor"`).
40
-
41
- ## Variações
42
-
43
- Cor por item de notificação: `.fs-notification-item-{nome}` (borda
44
- esquerda colorida) — aplicada automaticamente a partir do `variant`
45
- passado em `push()`.
46
-
47
- ## Estados
48
-
49
- - `.fs-notification-item-unread` — aplicada automaticamente aos itens
50
- ainda não lidos (some ao abrir o painel — abrir marca tudo como lido).
51
- - Persistência: `data-storage="local"` + `data-storage-key="..."` no
52
- gatilho grava o histórico em `localStorage` (sobrevive a reload); padrão
53
- é `"memory"` (perde ao recarregar a página).
54
-
55
- ```html
56
- <button data-fs="notification-center" data-fs-target="#painel" data-storage="local" data-storage-key="minhas-notificacoes" aria-label="Notificações">
57
- <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="M10.268 21a2 2 0 0 0 3.464 0"/><path d="M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326"/></svg>
58
- </button>
59
- ```
60
-
61
- ## A11y
62
-
63
- `aria-haspopup="dialog"` + `aria-expanded` no gatilho, `role="region"` +
64
- `aria-label="Notificações"` no painel (aplicados automaticamente, a menos
65
- que você já tenha definido `aria-label` próprio). `Escape` fecha e devolve
66
- foco ao gatilho; clique fora fecha.
67
-
68
- ## API JS
69
-
70
- Auto-init via `data-fs="notification-center"` **no gatilho**.
71
- `NotificationCenter.getInstance(triggerEl)`.
72
-
73
- | Método | Descrição |
74
- |---|---|
75
- | `push({ title, body, variant, autohide, delay })` | Empilha um toast na hora e registra a notificação no histórico. Retorna o `id` do registro. |
76
- | `remove(id)` | Remove uma notificação específica do histórico. |
77
- | `clear()` | Remove todo o histórico. |
78
- | `getAll()` | Retorna uma cópia do histórico atual (array de registros). |
79
- | `open()` / `close()` / `toggle()` | Abrem/fecham o painel (abrir marca tudo como lido). |
80
- | `dispose()` | Fecha se aberto, remove listeners, desregistra a instância. |
81
-
82
- | Evento (no gatilho) | Cancelável | Quando |
83
- |---|---|---|
84
- | `fs:notification:pushed` | Não | Depois de `push()` — `event.detail.record` traz o registro criado. |
85
- | `fs:notification:opened` / `-closed` | Não | Depois de abrir/fechar o painel. |
86
- | `fs:notification:cleared` | Não | Depois de `clear()`. |
87
-
88
- ## Tokens
89
-
90
- `--fs-color-border`, `--fs-color-surface`, `--fs-color-subtle` (item não
91
- lido), `--fs-color-danger` (badge de contagem), `--fs-color-{nome}` (borda
92
- por variante), `--fs-radius-md`, `--fs-shadow-md`.
93
-
94
- ## Exemplo
95
-
96
- ```html
97
- <button type="button" class="fs-btn" data-fs="notification-center" data-fs-target="#nc" id="nc-trigger" aria-label="Notificações">
98
- <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="M10.268 21a2 2 0 0 0 3.464 0"/><path d="M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326"/></svg>
99
- <span class="fs-notification-badge" hidden>0</span>
100
- </button>
101
- <div class="fs-notification-center" id="nc">
102
- <div class="fs-notification-center-header">
103
- <span class="fs-notification-center-title">Notificações</span>
104
- <button type="button" class="fs-btn fs-btn-sm" data-notification="clear">Limpar tudo</button>
105
- </div>
106
- <ul class="fs-notification-list"></ul>
107
- <p class="fs-notification-empty">Nenhuma notificação.</p>
108
- </div>
109
- <script>
110
- document.getElementById("nc-trigger").addEventListener("fs:notification:pushed", (e) => {
111
- console.log("nova notificação:", e.detail.record);
112
- });
113
- </script>
114
- ```
115
-
116
- Mockup: [laboratório do componente](../../mockup/overlays-commands.html#notification-center).
@@ -1,102 +0,0 @@
1
- # Offcanvas
2
-
3
- Painel deslizante de qualquer borda da tela (menu lateral mobile, carrinho,
4
- filtros) — mesmo focus trap/`Escape`/clique-fora do [Modal](modal.md), mas
5
- não cobre a tela inteira.
6
-
7
- ## Visão geral
8
-
9
- ```html
10
- <button type="button" class="fs-btn" data-fs="offcanvas" data-fs-target="#meuPainel">
11
- Abrir menu
12
- </button>
13
-
14
- <div class="fs-offcanvas fs-offcanvas-start" id="meuPainel">
15
- <div class="fs-offcanvas-header">
16
- <h3 class="fs-offcanvas-title">Menu</h3>
17
- <button type="button" class="fs-btn-close" data-fs-dismiss="offcanvas" aria-label="Fechar"></button>
18
- </div>
19
- <div class="fs-offcanvas-body">Conteúdo do painel.</div>
20
- </div>
21
- ```
22
-
23
- `data-fs` vai no gatilho, como no Modal.
24
-
25
- ## Anatomia
26
-
27
- Gatilho + `.fs-offcanvas` (painel, `position: fixed`, fora da viewport até
28
- abrir) > `.fs-offcanvas-header` (título + `.fs-btn-close`, opcional) +
29
- `.fs-offcanvas-body` (rola internamente) + `.fs-offcanvas-footer`
30
- (opcional). Um `.fs-offcanvas-backdrop` é criado/removido dinamicamente
31
- pelo JS a cada abertura (não escreva no HTML).
32
-
33
- ## Variações
34
-
35
- Borda de entrada — obrigatório escolher uma:
36
-
37
- - `.fs-offcanvas-start` — esquerda, 320px de largura.
38
- - `.fs-offcanvas-end` — direita, 320px de largura.
39
- - `.fs-offcanvas-top` — topo, 40vh de altura.
40
- - `.fs-offcanvas-bottom` — base, 40vh de altura.
41
-
42
- ## Estados
43
-
44
- `.is-open` — controlado pelo JS, anima via `transform`/`transition`
45
- (desativada automaticamente sob `prefers-reduced-motion: reduce`).
46
-
47
- **Backdrop**: `data-backdrop="false"` no `.fs-offcanvas` remove o
48
- backdrop (painel some, mas o resto da página continua interativa por
49
- baixo); `data-backdrop="static"` mantém o backdrop mas desativa
50
- `Escape`/clique-fora (só `data-fs-dismiss="offcanvas"` fecha) — mesma
51
- semântica do Modal.
52
-
53
- ## A11y
54
-
55
- Ao inicializar, o componente controla `aria-hidden` e, quando encontra
56
- `.fs-offcanvas-title`, cria automaticamente o vínculo `aria-labelledby`. Um
57
- `id` existente no título é preservado.
58
-
59
- `role="dialog"` + `aria-modal="true"` aplicados automaticamente. Foco
60
- preso dentro do painel enquanto aberto, movido pro primeiro elemento
61
- focável (com um pequeno atraso técnico pra garantir que a transição de
62
- `visibility` já rodou — o painel usa `visibility: hidden` em vez de
63
- `display: none` pra poder animar). Ao fechar, foco volta pro gatilho.
64
-
65
- ## API JS
66
-
67
- Auto-init via `data-fs="offcanvas"` **no gatilho**. `Offcanvas.getInstance(triggerEl)`.
68
-
69
- | Método | Descrição |
70
- |---|---|
71
- | `show()` | Abre, cria o backdrop (se aplicável), trava scroll, ativa focus trap. |
72
- | `hide()` | Fecha, remove o backdrop, libera scroll, devolve foco ao gatilho. |
73
- | `toggle()` | Alterna. |
74
- | `dispose()` | Fecha se aberto, remove listeners, desregistra a instância. |
75
-
76
- | Evento (no gatilho) | Cancelável | Quando |
77
- |---|---|---|
78
- | `fs:offcanvas:shown` | Não | Depois de abrir. |
79
- | `fs:offcanvas:hidden` | Não | Depois de fechar. |
80
-
81
- ## Tokens
82
-
83
- `--fs-color-surface`, `--fs-color-text`, `--fs-color-border`,
84
- `--fs-shadow-lg`.
85
-
86
- ## Exemplo
87
-
88
- ```html
89
- <button type="button" class="fs-btn" data-fs="offcanvas" data-fs-target="#filtros">Filtros</button>
90
- <div class="fs-offcanvas fs-offcanvas-end" id="filtros" data-backdrop="static">
91
- <div class="fs-offcanvas-header">
92
- <h3 class="fs-offcanvas-title">Filtros</h3>
93
- <button type="button" class="fs-btn-close" data-fs-dismiss="offcanvas" aria-label="Fechar"></button>
94
- </div>
95
- <div class="fs-offcanvas-body">...</div>
96
- <div class="fs-offcanvas-footer">
97
- <button type="button" class="fs-btn fs-btn-primary" data-fs-dismiss="offcanvas">Aplicar</button>
98
- </div>
99
- </div>
100
- ```
101
-
102
- Mockup: [laboratório do componente](../../mockup/overlays-commands.html#offcanvas).
@@ -1,145 +0,0 @@
1
- # Pagination
2
-
3
- Navegação entre páginas de uma listagem — sem JavaScript próprio; qual
4
- página está ativa/desabilitada é responsabilidade da sua aplicação (você
5
- adiciona/remove `.is-active`/`.is-disabled` conforme o estado atual). Os
6
- ícones de anterior/próxima/reticências usam o pacote
7
- [`fokus-styles/icons`](../guides/icons.md) (Lucide) — veja lá se quiser trocar
8
- por outro conjunto.
9
-
10
- ## Visão geral
11
-
12
- ```html
13
- <ul class="fs-pagination">
14
- <li class="fs-page-item is-disabled">
15
- <a href="#" class="fs-page-link" aria-label="Anterior">
16
- <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="m15 18-6-6 6-6"/></svg>
17
- </a>
18
- </li>
19
- <li class="fs-page-item"><a href="#" class="fs-page-link">1</a></li>
20
- <li class="fs-page-item is-active"><a href="#" class="fs-page-link">2</a></li>
21
- <li class="fs-page-item"><a href="#" class="fs-page-link">3</a></li>
22
- <li class="fs-page-item">
23
- <a href="#" class="fs-page-link" aria-label="Próxima">
24
- <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="m9 18 6-6-6-6"/></svg>
25
- </a>
26
- </li>
27
- </ul>
28
- ```
29
-
30
- ## Anatomia
31
-
32
- `<ul class="fs-pagination">` > `<li class="fs-page-item">` >
33
- `<a class="fs-page-link">` — marcação de lista nativa, `<ul>`/`<li>`. Nos
34
- itens de anterior/próxima só com ícone (sem texto visível), o `<a>` precisa
35
- de `aria-label` (`"Anterior"`/`"Próxima"`) já que o SVG é `aria-hidden`.
36
-
37
- ## Variações
38
-
39
- - **Bordered**: `.fs-pagination-bordered` — itens colados (sem gap), borda
40
- fundida entre eles (técnica de margin negativo do
41
- [Input Group](input-group.md)), cantos arredondados só nas pontas.
42
- - **Tamanho**: `.fs-pagination-sm`, `.fs-pagination-lg`; sem sufixo =
43
- padrão (32px).
44
- - **Prev/next descritivo**: `.fs-page-link-text` no item de anterior/
45
- próxima, pra ícone + texto (`"Anterior"`/`"Próxima"`) em vez de só o
46
- ícone — só ajusta o `gap`/padding, o `.fs-page-link` já acomoda largura
47
- variável. Com texto visível, dispensa o `aria-label` (o link já tem
48
- nome acessível pelo próprio texto).
49
- - **Reticências** (intervalo de páginas omitido, ex. `1 2 3 … 8 9 10`):
50
- `.fs-page-item.is-disabled` com um `<span>` (não `<a>` — não é uma ação)
51
- contendo o ícone `ellipsis`, `aria-hidden="true"` no item inteiro
52
- (não comunica nada de acionável a leitores de tela).
53
-
54
- ```html
55
- <ul class="fs-pagination fs-pagination-bordered fs-pagination-sm">
56
- <li class="fs-page-item"><a href="#" class="fs-page-link">1</a></li>
57
- <li class="fs-page-item is-active"><a href="#" class="fs-page-link">2</a></li>
58
- </ul>
59
-
60
- <ul class="fs-pagination">
61
- <li class="fs-page-item">
62
- <a href="#" class="fs-page-link fs-page-link-text">
63
- <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="m15 18-6-6 6-6"/></svg>
64
- Anterior
65
- </a>
66
- </li>
67
- <li class="fs-page-item">
68
- <a href="#" class="fs-page-link fs-page-link-text">
69
- Próxima
70
- <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="m9 18 6-6-6-6"/></svg>
71
- </a>
72
- </li>
73
- </ul>
74
-
75
- <ul class="fs-pagination">
76
- <li class="fs-page-item"><a href="#" class="fs-page-link">1</a></li>
77
- <li class="fs-page-item"><a href="#" class="fs-page-link">2</a></li>
78
- <li class="fs-page-item"><a href="#" class="fs-page-link">3</a></li>
79
- <li class="fs-page-item is-disabled" aria-hidden="true">
80
- <span class="fs-page-link">
81
- <svg class="fs-icon" 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"><circle cx="12" cy="12" r="1"/><circle cx="19" cy="12" r="1"/><circle cx="5" cy="12" r="1"/></svg>
82
- </span>
83
- </li>
84
- <li class="fs-page-item"><a href="#" class="fs-page-link">8</a></li>
85
- <li class="fs-page-item"><a href="#" class="fs-page-link">9</a></li>
86
- <li class="fs-page-item"><a href="#" class="fs-page-link">10</a></li>
87
- </ul>
88
- ```
89
-
90
- ## Estados
91
-
92
- - `.fs-page-item.is-active .fs-page-link` — fundo/borda na cor primária.
93
- - `.fs-page-item.is-disabled .fs-page-link` — opacidade reduzida,
94
- `pointer-events: none` (não clicável, não focável por mouse; ainda é
95
- focável por teclado como um link comum — considere `aria-disabled="true"`
96
- e remover do fluxo de tab se precisar bloquear totalmente). No item de
97
- reticências (sem `<a>`), isso não se aplica — ele nunca é focável.
98
-
99
- ## A11y
100
-
101
- Envolva a paginação em `.fs-pagination-scroll` quando houver muitos itens. Use `nav`
102
- nomeado, `aria-current="page"` e desabilite controles sem destino real.
103
-
104
- - Envolva a lista num `<nav aria-label="Paginação">` — o elemento `<nav>`
105
- não é gerado pelo framework, adicione no seu HTML.
106
- - Marque a página atual com `aria-current="page"` no link ativo, além de
107
- `.is-active` (a classe é só visual).
108
- - Ícone sozinho (sem texto) precisa de `aria-label` no `<a>` pai; ícone +
109
- texto visível não precisa (o texto já nomeia o link) — só marque o SVG
110
- como `aria-hidden="true"` nos dois casos, pra não duplicar o nome
111
- acessível.
112
-
113
- ## API JS
114
-
115
- Nenhuma — 100% CSS. Ativar/desativar itens é feito pela sua aplicação.
116
-
117
- ## Tokens
118
-
119
- Usa `--fs-color-border`, `--fs-color-surface`, `--fs-color-subtle`
120
- (hover), `--fs-color-primary` (ativo), `--fs-color-muted` (desabilitado),
121
- `--fs-radius-sm`.
122
-
123
- ## Exemplo
124
-
125
- ```html
126
- <nav aria-label="Paginação">
127
- <ul class="fs-pagination fs-pagination-bordered">
128
- <li class="fs-page-item is-disabled">
129
- <a href="#" class="fs-page-link" aria-label="Anterior">
130
- <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="m15 18-6-6 6-6"/></svg>
131
- </a>
132
- </li>
133
- <li class="fs-page-item"><a href="#" class="fs-page-link">1</a></li>
134
- <li class="fs-page-item is-active"><a href="#" class="fs-page-link" aria-current="page">2</a></li>
135
- <li class="fs-page-item"><a href="#" class="fs-page-link">3</a></li>
136
- <li class="fs-page-item">
137
- <a href="#" class="fs-page-link" aria-label="Próxima">
138
- <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="m9 18 6-6-6-6"/></svg>
139
- </a>
140
- </li>
141
- </ul>
142
- </nav>
143
- ```
144
-
145
- Mockup: [laboratório do componente](../../mockup/navigation-disclosure.html#pagination).
@@ -1,13 +0,0 @@
1
- # Placeholder
2
-
3
- ## Visão geral
4
-
5
- `.fs-placeholder` representa conteúdo ainda carregando e é visualmente distinto de Skeleton.
6
-
7
- ## Estados
8
-
9
- Use `.fs-placeholder-glow`, `.fs-placeholder-wave` ou `.fs-placeholder-btn` conforme o formato.
10
-
11
- ## A11y
12
-
13
- Anuncie carregamento com `aria-busy="true"` no contêiner e uma região live quando necessário.