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,144 +0,0 @@
1
- # Tag
2
-
3
- Badge dismissível — reusa [Badge](badge.md) e `.fs-btn-close`
4
- ([Button](button.md)) mais o JS mínimo pra remover do DOM ao clicar no "x".
5
-
6
- ## Visão geral
7
-
8
- ```html
9
- <span class="fs-badge fs-tag" data-fs="tag">
10
- Frontend
11
- <button type="button" class="fs-btn-close" data-fs-dismiss="tag" aria-label="Remover tag Frontend"></button>
12
- </span>
13
- ```
14
-
15
- ## Anatomia
16
-
17
- `.fs-badge.fs-tag` (mesmo elemento, duas classes — Tag é um refinamento de
18
- Badge, não um componente separado) contendo texto + `.fs-btn-close` com
19
- `data-fs-dismiss="tag"`.
20
-
21
- ## Variações
22
-
23
- - **Cor**: as mesmas de [Badge](badge.md) (`.fs-badge-{cor}`).
24
- - **Tamanho**: apenas o tamanho padrão. Tags são controles compactos de
25
- remoção; usar uma única densidade evita variações de alvo e de texto em
26
- filtros e formulários.
27
- - **Ícones**: envolva um SVG de `fokus-styles/icons` em `.fs-tag-icon` antes
28
- de `.fs-tag-label` para ícone inicial ou use `.fs-tag-icon-end` depois do
29
- texto para indicar um estado. O contêiner do ícone usa a mesma dimensão
30
- visual do botão de fechamento; `--fs-tag-icon-size`,
31
- `--fs-tag-icon-glyph-size`, `--fs-tag-icon-gap` e `--fs-tag-icon-color`
32
- permitem ajustes locais. O
33
- ícone é decorativo (`aria-hidden="true"`) quando o texto já descreve a tag;
34
- nunca use uma Tag somente com ícone como padrão.
35
- - **Texto longo**: use `.fs-tag-truncate` na tag e `.fs-tag-label` no texto.
36
- Defina `--fs-tag-max-inline-size` conforme o contexto; o texto integral
37
- continua no DOM e pode ser exposto em `title` como apoio visual.
38
- - **Agrupamento**: `.fs-tag-group` (flex + wrap) no contêiner pai,
39
- une tags lado a lado com separadores translúcidos; o botão de remoção só é
40
- revelado em hover ou foco, evitando ruído visual. A reserva simétrica de
41
- espaço para o botão mantém o texto visualmente centralizado; o fundo da tag
42
- inteira sinaliza o hover.
43
- - **Protegida**: `.fs-tag-protected` desativa interação com `pointer-events:
44
- none`; substitua o botão por `.fs-tag-lock` e o ícone `shield-check` de
45
- `fokus-styles/icons` quando a tag não puder ser removida.
46
- - **Overflow**: `.fs-tag-overflow` é um `<button>` compacto e transparente,
47
- sem borda, com o ícone `tags` em `primary` centralizado; ele representa tags
48
- não exibidas.
49
- Conecte-o a um popover ou a uma lista expandida e mantenha `aria-expanded`
50
- sincronizado com essa interface.
51
-
52
- O botão de fechamento usa `--fs-tag-close-size` e `--fs-tag-close-gap`, herda
53
- o raio do Badge e é a única ação de remoção. A Tag inteira não é um botão.
54
-
55
- ```html
56
- <div class="fs-tag-group">
57
- <span class="fs-badge fs-tag" data-fs="tag">Design<button type="button" class="fs-btn-close" data-fs-dismiss="tag" aria-label="Remover"></button></span>
58
- <span class="fs-badge fs-tag" data-fs="tag">Frontend<button type="button" class="fs-btn-close" data-fs-dismiss="tag" aria-label="Remover"></button></span>
59
- </div>
60
- ```
61
-
62
- ## Estados
63
-
64
- Botão de dispensa é transparente no repouso; tem hover (fundo sutil) e
65
- `:active` (leve "afundar", feedback tátil antes da remoção assíncrona). Ao
66
- receber foco pelo teclado, a tag inteira também recebe um anel de foco para
67
- ficar distinguível em agrupamentos densos.
68
-
69
- Para uma operação assíncrona, aplique `aria-busy="true"` e `.is-loading`, ou
70
- use `Tag.setLoading(true)`. Inclua um `.fs-spinner` depois de `.fs-tag-label`:
71
- o estado pendente usa fundo `warning`, texto e spinner pretos. O botão de
72
- remoção é desabilitado até que o estado seja removido.
73
-
74
- ## A11y
75
-
76
- - `.fs-btn-close` **precisa** de `aria-label` descritivo (ex.: "Remover tag
77
- Frontend", não só "Remover") — é um botão só-ícone.
78
- - A remoção só acontece ao clicar no botão de fechar, nunca ao clicar na
79
- tag inteira — evita remoção acidental.
80
- - Se o botão de fechar estiver focado quando a Tag for removida, o foco vai
81
- para a próxima Tag do mesmo grupo; se não houver, vai para a anterior.
82
- Remoções programáticas sem foco no botão não movem o foco.
83
- - Ícones com significado próprio precisam ser acompanhados por texto ou
84
- descrição acessível; não dependa apenas do desenho ou da cor.
85
- - Para tags truncadas, mantenha a string completa dentro de `.fs-tag-label`;
86
- ela continua disponível para tecnologias assistivas. `title` é apenas uma
87
- ajuda adicional para ponteiro.
88
- - O botão `.fs-tag-overflow` requer um nome acessível descritivo, como
89
- `aria-label="Mostrar mais 3 tags"`.
90
-
91
- ## API JS
92
-
93
- Auto-init via `data-fs="tag"`. `Tag.getInstance(el)`.
94
-
95
- | Método | Descrição |
96
- |---|---|
97
- | `dismiss()` | Dispara `fs:tag:dismissed` (cancelável); se não cancelado, remove o elemento do DOM e retorna `true`. Retorna `false` se estiver carregando ou se o evento for cancelado. |
98
- | `setLoading(loading)` | Alterna `.is-loading`, `aria-busy` e o estado desabilitado do botão de remoção. |
99
- | `dispose()` | Remove o listener de clique e desregistra a instância (não remove o elemento). |
100
-
101
- | Evento | Cancelável | Quando |
102
- |---|---|---|
103
- | `fs:tag:dismissed` | Sim | Antes de remover — `event.preventDefault()` cancela a remoção. |
104
-
105
- ## Tokens
106
-
107
- Usa os tokens de [Badge](badge.md) e expõe tokens locais para composição:
108
- `--fs-tag-icon-size`, `--fs-tag-icon-glyph-size`, `--fs-tag-icon-gap`, `--fs-tag-icon-color`,
109
- `--fs-tag-close-size` e `--fs-tag-close-gap`.
110
-
111
- ## Exemplo
112
-
113
- ```html
114
- <div class="fs-tag-group">
115
- <span class="fs-badge fs-badge-primary fs-tag" data-fs="tag">
116
- Urgente
117
- <button type="button" class="fs-btn-close" data-fs-dismiss="tag" aria-label="Remover tag Urgente"></button>
118
- </span>
119
- <span class="fs-badge fs-badge-danger fs-tag" data-fs="tag">
120
- Bloqueado
121
- <button type="button" class="fs-btn-close" data-fs-dismiss="tag" aria-label="Remover tag Bloqueado"></button>
122
- </span>
123
- </div>
124
- ```
125
-
126
- ```html
127
- <span class="fs-badge fs-tag fs-tag-truncate" style="--fs-tag-max-inline-size: 20rem;" data-fs="tag">
128
- <span class="fs-tag-icon" aria-hidden="true"><!-- SVG de fokus-styles/icons --></span>
129
- <span class="fs-tag-label">Revisão de acessibilidade e compatibilidade entre navegadores</span>
130
- <button type="button" class="fs-btn-close" data-fs-dismiss="tag" aria-label="Remover tag Revisão de acessibilidade e compatibilidade entre navegadores"></button>
131
- </span>
132
-
133
- <button type="button" class="fs-badge fs-tag fs-tag-overflow" aria-label="Mostrar mais 3 tags" aria-expanded="false">
134
- <svg class="fs-icon" aria-hidden="true"><!-- SVG tags de fokus-styles/icons --></svg>
135
- </button>
136
-
137
- <span class="fs-badge fs-tag is-loading" data-fs="tag" aria-busy="true">
138
- <span class="fs-tag-label">Salvando</span>
139
- <span class="fs-spinner" aria-hidden="true"></span>
140
- <button type="button" class="fs-btn-close" data-fs-dismiss="tag" aria-label="Remover tag Salvando" disabled></button>
141
- </span>
142
- ```
143
-
144
- Mockup: [laboratório do componente](../../mockup/feedback-actions.html#tag).
@@ -1,112 +0,0 @@
1
- # Tile
2
-
3
- Linha compacta ícone + título/subtítulo + ações, para listas de
4
- opções/configurações/itens (sinergia visual com
5
- [Notification Center](notification-center.md) e [Empty State](empty-state.md)).
6
-
7
- ## Visão geral
8
-
9
- ```html
10
- <div class="fs-tile">
11
- <div class="fs-tile-icon" aria-hidden="true">
12
- <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"><path d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z"/><path d="M14 2v5a1 1 0 0 0 1 1h5"/><path d="M10 9H8"/><path d="M16 13H8"/><path d="M16 17H8"/></svg>
13
- </div>
14
- <div class="fs-tile-body">
15
- <p class="fs-tile-title">Relatório mensal.pdf</p>
16
- <p class="fs-tile-subtitle">2.4 MB · Atualizado há 2h</p>
17
- </div>
18
- <div class="fs-tile-actions">
19
- <button type="button" class="fs-btn fs-btn-sm">Abrir</button>
20
- </div>
21
- </div>
22
- ```
23
-
24
- ## Anatomia
25
-
26
- `.fs-tile` > `.fs-tile-icon` (ícone SVG — [`fokus-styles/icons`](../guides/icons.md)
27
- recomendado — ou imagem, largura fixa) +
28
- `.fs-tile-body` (`.fs-tile-title` + `.fs-tile-subtitle`, opcional, ambos
29
- truncam com reticências se não couberem) + `.fs-tile-actions` (opcional —
30
- botões, switch, badge).
31
-
32
- ## Variações
33
-
34
- - **Ações à direita** (padrão) ou **embaixo**: adicione
35
- `.fs-tile-actions-bottom` no `.fs-tile` para `.fs-tile-actions` quebrar
36
- para uma segunda linha, alinhada à direita.
37
- - **Clicável**: `.fs-tile-clickable` + [`.fs-stretched-link`](card.md#fs-card-clickable)
38
- num link dentro do `.fs-tile-body` — o tile inteiro fica clicável/focável
39
- sem aninhar um `<a>` ao redor de tudo.
40
- - **Tamanho**: `.fs-tile-sm`, `.fs-tile-lg`; sem sufixo = padrão.
41
-
42
- ```html
43
- <div class="fs-tile fs-tile-actions-bottom">
44
- <div class="fs-tile-icon" aria-hidden="true">
45
- <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"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3"/><path d="M12 9v4"/><path d="M12 17h.01"/></svg>
46
- </div>
47
- <div class="fs-tile-body">
48
- <p class="fs-tile-title">Plano expira em 3 dias</p>
49
- </div>
50
- <div class="fs-tile-actions">
51
- <button type="button" class="fs-btn fs-btn-outline-secondary fs-btn-sm">Depois</button>
52
- <button type="button" class="fs-btn fs-btn-primary fs-btn-sm">Renovar</button>
53
- </div>
54
- </div>
55
-
56
- <div class="fs-tile fs-tile-clickable">
57
- <div class="fs-tile-icon" aria-hidden="true">
58
- <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"><path d="M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2"/><circle cx="12" cy="7" r="4"/></svg>
59
- </div>
60
- <div class="fs-tile-body">
61
- <p class="fs-tile-title"><a href="/perfil" class="fs-stretched-link">Jorge Reis</a></p>
62
- <p class="fs-tile-subtitle">Ver perfil</p>
63
- </div>
64
- </div>
65
- ```
66
-
67
- ## Estados
68
-
69
- Nenhum próprio — hover/focus da variante clicável reusa o mesmo padrão do
70
- [Card clicável](card.md#fs-card-clickable) (`:hover`/`:focus-within`, borda
71
- + sombra).
72
-
73
- ## A11y
74
-
75
- - Título/subtítulo truncados (`text-overflow: ellipsis`) escondem texto
76
- visualmente, mas o conteúdo continua no DOM/acessível — se o truncamento
77
- for crítico, considere `title="..."` no elemento pra tooltip nativo.
78
- - Na variante clicável, o link dentro de `.fs-tile-body` é o elemento
79
- focável real — o `::after` do stretched-link só expande a área de
80
- clique, não tira o foco do link.
81
-
82
- ## API JS
83
-
84
- Nenhuma — 100% CSS.
85
-
86
- ## Tokens
87
-
88
- Sem tokens de componente próprios — usa `--fs-color-border`,
89
- `--fs-color-surface`, `--fs-color-bg-subtle` (ícone), `--fs-color-text`,
90
- `--fs-color-muted`, `--fs-radius-md`, `--fs-shadow-sm` (hover clicável).
91
-
92
- ## Exemplo
93
-
94
- ```html
95
- <div class="fs-tile">
96
- <div class="fs-tile-icon" aria-hidden="true">
97
- <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"><path d="M12 22a1 1 0 0 1 0-20 10 9 0 0 1 10 9 5 5 0 0 1-5 5h-2.25a1.75 1.75 0 0 0-1.4 2.8l.3.4a1.75 1.75 0 0 1-1.4 2.8z"/><circle cx="13.5" cy="6.5" r=".5" fill="currentColor"/><circle cx="17.5" cy="10.5" r=".5" fill="currentColor"/><circle cx="6.5" cy="12.5" r=".5" fill="currentColor"/><circle cx="8.5" cy="7.5" r=".5" fill="currentColor"/></svg>
98
- </div>
99
- <div class="fs-tile-body">
100
- <p class="fs-tile-title">Tema escuro</p>
101
- <p class="fs-tile-subtitle">Alterna a aparência da interface</p>
102
- </div>
103
- <div class="fs-tile-actions">
104
- <div class="fs-switch">
105
- <input type="checkbox" class="fs-switch-input" id="tile-theme" checked aria-label="Ativar tema escuro">
106
- <label for="tile-theme" class="fs-switch-label"></label>
107
- </div>
108
- </div>
109
- </div>
110
- ```
111
-
112
- Mockup: [laboratório do componente](../../mockup/content-data.html#tile).
@@ -1,78 +0,0 @@
1
- # Timeline
2
-
3
- Linha do tempo de eventos — 100% CSS, com marcadores conectados e estados
4
- por item (pendente/ativo/concluído/falhou).
5
-
6
- ## Visão geral
7
-
8
- ```html
9
- <ol class="fs-timeline">
10
- <li class="fs-timeline-item fs-timeline-completed">
11
- <div class="fs-timeline-marker"></div>
12
- <div class="fs-timeline-content">
13
- <p class="fs-timeline-title">Pedido criado</p>
14
- <p class="fs-timeline-text">Seu pedido foi registrado.</p>
15
- <span class="fs-timeline-time">10:32</span>
16
- </div>
17
- </li>
18
- <li class="fs-timeline-item fs-timeline-active">
19
- <div class="fs-timeline-marker"></div>
20
- <div class="fs-timeline-content">
21
- <p class="fs-timeline-title">Em preparação</p>
22
- </div>
23
- </li>
24
- <li class="fs-timeline-item">
25
- <div class="fs-timeline-marker"></div>
26
- <div class="fs-timeline-content">
27
- <p class="fs-timeline-title">Enviado</p>
28
- </div>
29
- </li>
30
- </ol>
31
- ```
32
-
33
- ## Anatomia
34
-
35
- `<ol class="fs-timeline">` > `.fs-timeline-item` (um por evento) >
36
- `.fs-timeline-marker` (círculo) + `.fs-timeline-content` >
37
- `.fs-timeline-title` + `.fs-timeline-text` (opcional) +
38
- `.fs-timeline-time` (opcional). O conector entre marcadores é desenhado
39
- via `::before` — não insira manualmente.
40
-
41
- ## Variações
42
-
43
- `.fs-timeline-horizontal` no `<ol>` — inverte o eixo (itens em colunas,
44
- marcador no topo, conector na horizontal).
45
-
46
- ## Estados
47
-
48
- Cada `.fs-timeline-item` aceita uma destas classes (mesma lógica visual do
49
- [Stepper](stepper.md) — controle manual, sem JS):
50
-
51
- | Classe | Efeito |
52
- |---|---|
53
- | (nenhuma) | Pendente — marcador vazio, conector cinza. |
54
- | `.fs-timeline-active` | Em andamento — marcador preenchido na cor primária. |
55
- | `.fs-timeline-completed` | Concluído — marcador com check verde; o conector seguinte também fica verde (indica progresso). |
56
- | `.fs-timeline-failed` | Falhou — marcador e título em vermelho. |
57
-
58
- ## A11y
59
-
60
- Use `<ol>` (ordem cronológica importa) — já no exemplo. Sem JS, sem
61
- interação por teclado própria; se os itens forem clicáveis (ex.: expandir
62
- detalhes), essa interação é sua responsabilidade.
63
-
64
- ## API JS
65
-
66
- Nenhuma — 100% CSS. Estados são classes que você controla pela sua
67
- aplicação.
68
-
69
- ## Tokens
70
-
71
- `--fs-color-border` (conector/marcador padrão), `--fs-color-primary`
72
- (ativo), `--fs-color-success` (concluído), `--fs-color-danger` (falhou),
73
- `--fs-color-text`, `--fs-color-muted`.
74
-
75
- ## Exemplo
76
-
77
- Ver acima (Visão geral) — mockup completo com as duas orientações em
78
- [`mockup/content-data.html#timeline`](../../mockup/content-data.html#timeline).
@@ -1,108 +0,0 @@
1
- # Toast
2
-
3
- Notificação flutuante e temporária para confirmar uma ação não bloqueante.
4
- Para mensagens persistentes no contexto da página use [Alert](alert.md); para
5
- histórico e revisão posterior use [Notification Center](notification-center.md).
6
-
7
- ## Visão geral
8
-
9
- ```html
10
- <div class="fs-toast-container">
11
- <div class="fs-toast fs-toast-success" data-fs="toast" data-delay="4000">
12
- <div class="fs-toast-header">
13
- <span>Sucesso</span>
14
- <button type="button" class="fs-btn-close" data-fs-dismiss="toast" aria-label="Fechar"></button>
15
- </div>
16
- <div class="fs-toast-body">Operação concluída com sucesso.</div>
17
- </div>
18
- </div>
19
- ```
20
-
21
- O Toast é inicializado pelo atributo `data-fs="toast"`, mas só aparece quando
22
- `.show()` é chamado. O container é fixo, empilha mensagens e usa propriedades
23
- lógicas para funcionar em RTL e respeitar áreas seguras móveis.
24
-
25
- ## Anatomia
26
-
27
- `.fs-toast-container` contém um ou mais `.fs-toast`. Dentro dele, os slots
28
- opcionais são `.fs-toast-header`, `.fs-toast-icon`, `.fs-toast-heading`,
29
- `.fs-toast-title`, `.fs-toast-meta`, `.fs-toast-body`, `.fs-toast-actions`,
30
- `.fs-toast-link`, `.fs-toast-close` e `.fs-toast-progress`.
31
-
32
- ```html
33
- <div class="fs-toast fs-toast-success" data-fs="toast" data-delay="5000" data-toast-progress="true">
34
- <div class="fs-toast-header">
35
- <span class="fs-toast-icon" aria-hidden="true">✓</span>
36
- <div class="fs-toast-heading">
37
- <strong class="fs-toast-title">Arquivo salvo</strong>
38
- <span class="fs-toast-meta">Agora</span>
39
- </div>
40
- <button type="button" class="fs-btn-close fs-toast-close" data-fs-dismiss="toast" aria-label="Fechar aviso de arquivo salvo"></button>
41
- </div>
42
- <div class="fs-toast-body">O documento foi salvo com sucesso.</div>
43
- <div class="fs-toast-actions">
44
- <button type="button" class="fs-btn fs-btn-sm fs-btn-success">Desfazer</button>
45
- <a href="#detalhes" class="fs-toast-link">Ver detalhes</a>
46
- </div>
47
- <div class="fs-toast-progress" aria-hidden="true"></div>
48
- </div>
49
- ```
50
-
51
- O ícone é fornecido pelo consumidor e deve ser decorativo quando o texto já
52
- explicar o estado. Ações usam Button; o fechamento continua sendo o único
53
- controle obrigatório da dispensa.
54
-
55
- ## Variações e estados
56
-
57
- Variantes: `.fs-toast-primary`, `.fs-toast-secondary`, `.fs-toast-success`,
58
- `.fs-toast-warning`, `.fs-toast-danger` e `.fs-toast-info`.
59
-
60
- - `data-delay="4000"` define o tempo de auto-dismiss em milissegundos;
61
- - `data-autohide="false"` mantém o Toast aberto;
62
- - `data-toast-progress="true"` exibe a barra de tempo quando o auto-dismiss está ativo;
63
- - hover, foco e interação pausam o timer e a barra de progresso;
64
- - `prefers-reduced-motion` elimina a animação contínua do progresso.
65
-
66
- ## Estados
67
-
68
- O Toast começa oculto, entra em `.is-open` durante a exibição e pode ser
69
- pausado por hover ou foco. `hide()` e auto-dismiss cancelam o timer e ocultam
70
- o elemento sem transferir foco.
71
-
72
- ## A11y
73
-
74
- O JavaScript aplica `role="status"` e `aria-live="polite"`. O Toast não move
75
- foco automaticamente e não deve usar `aria-live="assertive"` por padrão.
76
- Botões de fechamento precisam de `aria-label` específico; links e ações devem
77
- ter nomes compreensíveis. Ícones decorativos usam `aria-hidden="true"` e não
78
- substituem texto.
79
-
80
- Use `data-autohide="false"` para erros que exigem ação. Não use Toast para
81
- decisões críticas, conteúdo extenso ou mensagens que precisam permanecer no
82
- contexto da região afetada.
83
-
84
- ## API JS
85
-
86
- ```js
87
- const toast = FokusStyles.Toast.getInstance(document.querySelector(".fs-toast"));
88
- toast.show();
89
- toast.hide();
90
- toast.toggle();
91
- toast.dispose();
92
- ```
93
-
94
- Eventos preservados: `fs:toast:shown` e `fs:toast:hidden`. O componente pausa
95
- o auto-dismiss durante hover e foco, sem transferir foco para outro Toast.
96
-
97
- ## Tokens
98
-
99
- Container: `--fs-toast-offset`, `--fs-toast-gap`, `--fs-toast-width` e
100
- `--fs-toast-max-width`. Instância: `--fs-toast-padding-block`,
101
- `--fs-toast-padding-inline`, `--fs-toast-gap`, `--fs-toast-radius`,
102
- `--fs-toast-shadow`, `--fs-toast-icon-size`, `--fs-toast-title-gap`,
103
- `--fs-toast-actions-gap`, `--fs-toast-border-width` e
104
- `--fs-toast-progress-height`.
105
-
106
- ## Mockup
107
-
108
- [Laboratório independente do Toast](../../mockup/examples/toast.html).
@@ -1,113 +0,0 @@
1
- # Tooltip
2
-
3
- Rótulo curto que aparece ao passar o mouse ou focar um elemento —
4
- substitui o `title` nativo do navegador (lento, sem estilo, inacessível a
5
- teclado em alguns navegadores).
6
-
7
- ## Visão geral
8
-
9
- ```html
10
- <button type="button" class="fs-btn" data-fs="tooltip" title="Copiar para a área de transferência">
11
- Copiar
12
- </button>
13
- ```
14
-
15
- O texto vem do atributo `title` (ou `data-title`) — o JS o remove do DOM
16
- na inicialização (pra não duplicar com o tooltip nativo do navegador) e o
17
- recria como conteúdo do tooltip.
18
-
19
- ## Anatomia
20
-
21
- Gerado inteiramente pelo JS: `.fs-tooltip` (`role="tooltip"`) >
22
- `.fs-tooltip-arrow` + `.fs-tooltip-inner` (texto). Não escreva essa
23
- marcação manualmente — só o elemento de referência com `title`/`data-fs="tooltip"`.
24
-
25
- ## Variações
26
-
27
- `data-placement` (`top` — padrão, `bottom`, `left`, `right`) no elemento
28
- de referência. Reposiciona automaticamente se não couber. A posição efetiva
29
- fica em `data-placement` no Tooltip gerado.
30
-
31
- Também são aceitos alinhamentos compostos, como `top-start`, `top-end`,
32
- `bottom-start`, `bottom-end`, `left-start` e `right-end`. A forma manual
33
- equivalente é `{ placement: "top", align: "start" }`. Use `data-offset` ou
34
- `offset` para controlar a distância entre o gatilho e a dica.
35
-
36
- ```html
37
- <button class="fs-btn" data-fs="tooltip" data-placement="right" title="Mais opções">⋮</button>
38
- ```
39
-
40
- ## Estados
41
-
42
- `.is-open` — controlado pelo JS ao mostrar/esconder; não defina
43
- manualmente.
44
-
45
- ### Delays e touch
46
-
47
- Use `data-show-delay` e `data-hide-delay` para evitar abertura acidental:
48
-
49
- ```html
50
- <button data-fs="tooltip" data-show-delay="300" data-hide-delay="100"
51
- title="Ajuda complementar">Ajuda</button>
52
- ```
53
-
54
- O Tooltip também responde a foco e ponteiro. Em touch, toque fora fecha a dica.
55
- Escape fecha sem mover o foco. Tooltips concorrentes são fechados quando uma
56
- nova dica é aberta.
57
-
58
- Sem configuração, a abertura é imediata; use `data-show-delay` para evitar
59
- aberturas acidentais em interações com ponteiro. O foco de teclado abre
60
- imediatamente. Elementos `disabled` não
61
- recebem foco nem eventos nativos: envolva-os em um elemento focável quando
62
- precisar explicar seu estado.
63
-
64
- ## A11y
65
-
66
- O JS aplica `aria-describedby` no elemento de referência, apontando pro
67
- `id` do tooltip — leitor de tela anuncia o conteúdo ao focar o elemento.
68
- Mostra em `mouseenter`/`focus`, esconde em `mouseleave`/`blur`/`Escape` —
69
- funciona por mouse e por teclado igualmente (ao contrário do `title`
70
- nativo, que só mostra no hover).
71
-
72
- ## API JS
73
-
74
- Auto-init via `data-fs="tooltip"` **ou** instanciação manual
75
- (`new FokusStyles.Tooltip(el, { title, placement })` — útil quando o texto vem
76
- de outro lugar, não de um atributo estático; é assim que
77
- [Breadcrumb](breadcrumb.md) anexa tooltips a labels truncados).
78
- `Tooltip.getInstance(el)`.
79
-
80
- | Método | Descrição |
81
- |---|---|
82
- | `show()` | Mostra o tooltip, posicionado relativo à referência. |
83
- | `hide()` | Esconde. |
84
- | `toggle()` | Alterna. |
85
- | `dispose()` | Remove listeners, `aria-describedby` e o elemento do tooltip do DOM; desregistra a instância. |
86
-
87
- | Evento (no elemento de referência) | Cancelável | Quando |
88
- |---|---|---|
89
- | `fs:tooltip:shown` | Não | Depois de mostrar. |
90
- | `fs:tooltip:hidden` | Não | Depois de esconder. |
91
-
92
- ## Tokens
93
-
94
- `--fs-tooltip-bg`, `--fs-tooltip-text`, `--fs-radius-sm`.
95
-
96
- O componente também expõe tokens locais como `--fs-tooltip-max-width`,
97
- `--fs-tooltip-padding-block`, `--fs-tooltip-padding-inline`,
98
- `--fs-tooltip-radius`, `--fs-tooltip-shadow` e `--fs-tooltip-arrow-size`.
99
- Eles podem ser sobrescritos por instância sem alterar tokens globais.
100
-
101
- ## Exemplo
102
-
103
- ```html
104
- <button type="button" class="fs-btn-close" data-fs="tooltip" title="Fechar" aria-label="Fechar"></button>
105
- ```
106
-
107
- O Tooltip não deve conter links ou botões e não substitui label, texto de erro
108
- ou instrução essencial; nesses casos use conteúdo visível ou Popover.
109
-
110
- Quando o gatilho já possui `aria-describedby`, o Tooltip acrescenta somente o
111
- próprio ID e restaura a lista original ao executar `dispose()`.
112
-
113
- Mockup: [laboratório independente do componente](../../mockup/examples/tooltip.html).
@@ -1,118 +0,0 @@
1
- # Tree View
2
-
3
- Lista hierárquica navegável (arquivos, categorias, organogramas), seguindo
4
- o padrão [WAI-ARIA Tree View](https://www.w3.org/WAI/ARIA/apg/patterns/treeview/).
5
- Marcação nativa `<ul>`/`<li>` aninhada — o JS só adiciona os papéis ARIA,
6
- o botão de expandir/colapsar e a navegação por teclado.
7
-
8
- ## Visão geral
9
-
10
- ```html
11
- <ul class="fs-tree" data-fs="tree-view">
12
- <li>
13
- <span class="fs-tree-label">src</span>
14
- <ul>
15
- <li><span class="fs-tree-label">index.js</span></li>
16
- <li>
17
- <span class="fs-tree-label">components</span>
18
- <ul>
19
- <li><span class="fs-tree-label">Button.js</span></li>
20
- </ul>
21
- </li>
22
- </ul>
23
- </li>
24
- <li><span class="fs-tree-label">README.md</span></li>
25
- </ul>
26
- ```
27
-
28
- Cada `<li>` precisa de um `<span class="fs-tree-label">` como filho direto
29
- (o texto do nó) — nós com filhos somam um `<ul>`/`<ol>` aninhado logo
30
- depois do label. O JS injeta automaticamente o `.fs-tree-toggle` (a seta)
31
- dentro do label de cada nó que tiver filhos; nós-folha não recebem seta.
32
-
33
- ## Anatomia
34
-
35
- `ul.fs-tree[role="tree"]` > `li[role="treeitem"]` (recursivo) >
36
- `span.fs-tree-label` (com `.fs-tree-toggle` auto-injetado se houver
37
- filhos) + opcionalmente `ul[role="group"]` (o próximo nível).
38
-
39
- ## Variações
40
-
41
- - `data-value` num `<li>` define o valor "de verdade" reportado em
42
- `fs:tree:selected` (`event.detail.value`); sem ele, o valor é o texto
43
- visível do nó.
44
- - `aria-expanded="true"` pré-existente num `<li>` com filhos abre esse
45
- ramo já expandido na renderização inicial (por padrão, todo ramo nasce
46
- colapsado).
47
-
48
- ## Estados
49
-
50
- - Colapsado (padrão) / expandido (`aria-expanded="true"` no `<li>`,
51
- `hidden` removido do `<ul>` filho) — alternado por clique na
52
- label/seta ou por teclado.
53
- - Selecionado: `aria-selected="true"` (só no nó mais recente; os demais
54
- voltam a `"false"`) — clicar num nó com filhos expande/colapsa **e**
55
- seleciona ao mesmo tempo (como um explorador de arquivos).
56
-
57
- ## A11y
58
-
59
- `role="tree"` na raiz, `role="treeitem"` em cada `<li>`, `role="group"` no
60
- `<ul>`/`<ol>` aninhado, `aria-expanded` nos nós com filhos. Roving
61
- `tabindex`: só o nó tabulável atual tem `tabindex="0"`; os demais (visíveis)
62
- ficam em `"-1"` — nós dentro de um ramo colapsado não são alcançáveis por
63
- Tab. `aria-selected` reflete a seleção atual.
64
-
65
- Teclado (com foco num nó da árvore):
66
- - `ArrowDown`/`ArrowUp`: move o foco pro próximo/anterior nó **visível**
67
- (não desce em ramos colapsados).
68
- - `ArrowRight`: nó fechado → expande (foco não se move); nó já aberto →
69
- move o foco pro primeiro filho; folha → sem efeito.
70
- - `ArrowLeft`: nó aberto → colapsa; nó fechado ou folha → move o foco pro
71
- nó pai.
72
- - `Home`/`End`: primeiro/último nó visível da árvore inteira.
73
- - `Enter`/`Espaço`: alterna expansão (se houver filhos) e seleciona o nó.
74
-
75
- ## API JS
76
-
77
- Auto-init via `data-fs="tree-view"` na raiz (`<ul>`/`<ol>`).
78
- `TreeView.getInstance(rootEl)`.
79
-
80
- | Método | Descrição |
81
- |---|---|
82
- | `expand(item)` | Expande o `<li>` informado (sem efeito se já expandido ou sem filhos). |
83
- | `collapse(item)` | Colapsa o `<li>` informado. |
84
- | `toggle(item)` | Alterna expandido/colapsado. |
85
- | `select(item)` | Marca `aria-selected="true"` no `<li>` informado (e `"false"` nos demais), dispara `fs:tree:selected`. |
86
- | `dispose()` | Remove listeners e desregistra a instância. |
87
-
88
- | Evento (na raiz) | Cancelável | Quando |
89
- |---|---|---|
90
- | `fs:tree:expanded` | Não | Após expandir um nó, com `event.detail.item`. |
91
- | `fs:tree:collapsed` | Não | Após colapsar um nó, com `event.detail.item`. |
92
- | `fs:tree:selected` | Não | Após selecionar um nó, com `event.detail.value`/`event.detail.item`. |
93
-
94
- ## Tokens
95
-
96
- `--fs-color-text`, `--fs-color-subtle` (hover da label),
97
- `--fs-color-primary` (nó selecionado, com `color-contrast()` pro texto),
98
- `--fs-radius-sm`.
99
-
100
- ## Exemplo
101
-
102
- ```html
103
- <ul class="fs-tree" data-fs="tree-view" aria-label="Arquivos do projeto">
104
- <li>
105
- <span class="fs-tree-label">src</span>
106
- <ul>
107
- <li><span class="fs-tree-label">index.js</span></li>
108
- </ul>
109
- </li>
110
- </ul>
111
- <script>
112
- document.querySelector(".fs-tree").addEventListener("fs:tree:selected", (e) => {
113
- console.log("selecionado:", e.detail.value);
114
- });
115
- </script>
116
- ```
117
-
118
- Mockup: [laboratório do componente](../../mockup/navigation-disclosure.html#tree-view).