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.
- package/package.json +17 -15
- package/CHANGELOG.md +0 -940
- package/dist/css/components.css.map +0 -1
- package/dist/css/components.min.css.map +0 -1
- package/dist/css/fokus-components.css.map +0 -1
- package/dist/css/fokus-components.min.css.map +0 -1
- package/dist/css/fokus-core.css.map +0 -1
- package/dist/css/fokus-core.min.css.map +0 -1
- package/dist/css/fokus-dark.css.map +0 -1
- package/dist/css/fokus-dark.min.css.map +0 -1
- package/dist/css/fokus-rtl.css.map +0 -1
- package/dist/css/fokus-rtl.min.css.map +0 -1
- package/dist/css/fokus-utilities.css.map +0 -1
- package/dist/css/fokus-utilities.min.css.map +0 -1
- package/dist/css/fokus.css.map +0 -1
- package/dist/css/fokus.min.css.map +0 -1
- package/dist/css/fonts.css.map +0 -1
- package/dist/css/fonts.min.css.map +0 -1
- package/dist/css/forms.css.map +0 -1
- package/dist/css/forms.min.css.map +0 -1
- package/dist/css/helpers.css.map +0 -1
- package/dist/css/helpers.min.css.map +0 -1
- package/dist/css/layout.css.map +0 -1
- package/dist/css/layout.min.css.map +0 -1
- package/dist/js/fokus.js.map +0 -7
- package/dist/js/fokus.min.js.map +0 -7
- package/docs/README.md +0 -86
- package/docs/comparison.md +0 -124
- package/docs/components/accordion.md +0 -104
- package/docs/components/alert-dialog.md +0 -99
- package/docs/components/alert.md +0 -104
- package/docs/components/avatar.md +0 -13
- package/docs/components/badge.md +0 -101
- package/docs/components/breadcrumb.md +0 -93
- package/docs/components/button-group.md +0 -13
- package/docs/components/button.md +0 -98
- package/docs/components/card.md +0 -111
- package/docs/components/carousel.md +0 -167
- package/docs/components/checkbox.md +0 -110
- package/docs/components/close-button.md +0 -13
- package/docs/components/code.md +0 -13
- package/docs/components/collapse.md +0 -78
- package/docs/components/combobox.md +0 -123
- package/docs/components/command-palette.md +0 -131
- package/docs/components/datatable.md +0 -173
- package/docs/components/datepicker.md +0 -137
- package/docs/components/divider.md +0 -57
- package/docs/components/dropdown.md +0 -103
- package/docs/components/empty-state.md +0 -65
- package/docs/components/file-upload-advanced.md +0 -116
- package/docs/components/file-upload.md +0 -93
- package/docs/components/icon-link.md +0 -13
- package/docs/components/input-group.md +0 -73
- package/docs/components/input.md +0 -90
- package/docs/components/list-group.md +0 -13
- package/docs/components/modal.md +0 -120
- package/docs/components/navbar.md +0 -74
- package/docs/components/nested-menu.md +0 -90
- package/docs/components/notification-center.md +0 -116
- package/docs/components/offcanvas.md +0 -102
- package/docs/components/pagination.md +0 -145
- package/docs/components/placeholder.md +0 -13
- package/docs/components/popover.md +0 -118
- package/docs/components/progress.md +0 -126
- package/docs/components/radio.md +0 -80
- package/docs/components/range.md +0 -83
- package/docs/components/rating.md +0 -91
- package/docs/components/ratio.md +0 -13
- package/docs/components/responsive.md +0 -19
- package/docs/components/scrollspy.md +0 -13
- package/docs/components/segmented-control.md +0 -82
- package/docs/components/select.md +0 -89
- package/docs/components/skeleton.md +0 -70
- package/docs/components/stepper.md +0 -107
- package/docs/components/switch.md +0 -97
- package/docs/components/table.md +0 -90
- package/docs/components/tabs.md +0 -104
- package/docs/components/tag.md +0 -144
- package/docs/components/tile.md +0 -112
- package/docs/components/timeline.md +0 -78
- package/docs/components/toast.md +0 -108
- package/docs/components/tooltip.md +0 -113
- package/docs/components/tree-view.md +0 -118
- package/docs/contributing/contributing.md +0 -18
- package/docs/getting-started/installation.md +0 -70
- package/docs/getting-started/usage.md +0 -105
- package/docs/guides/accessibility.md +0 -109
- package/docs/guides/charts.md +0 -73
- package/docs/guides/dark-mode.md +0 -90
- package/docs/guides/icons.md +0 -99
- package/docs/guides/javascript-api.md +0 -9
- package/docs/guides/layout-advanced.md +0 -118
- package/docs/guides/migration-clarus-to-fokus.md +0 -48
- package/docs/guides/migration-external.md +0 -123
- package/docs/guides/migration-v1.md +0 -63
- package/docs/guides/print.md +0 -30
- package/docs/guides/rtl-and-system-preferences.md +0 -28
- package/docs/guides/theming.md +0 -140
- package/docs/guides/utility-api.md +0 -9
- package/docs/prompts/prompt-plan.md +0 -45
- package/docs/reference/accessibility-matrix.md +0 -77
- package/docs/reference/browser-support.md +0 -75
- package/docs/reference/contrast-report.md +0 -54
- package/docs/reference/definitions.md +0 -868
- package/docs/reference/design-tokens.md +0 -208
- package/docs/reference/scss-architecture.md +0 -227
- package/docs/reference/size-baseline.json +0 -34
- package/docs/reference/stability.md +0 -89
- package/docs/showcase.md +0 -25
- package/mockup/README.md +0 -41
- package/mockup/assets/carousel-planning.png +0 -0
- package/mockup/assets/carousel-workspace.png +0 -0
- package/mockup/assets/example-theme.css +0 -19
- package/mockup/assets/example-theme.js +0 -11
- package/mockup/assets/showcase-contracts.js +0 -84
- package/mockup/assets/showcase.css +0 -91
- package/mockup/assets/showcase.js +0 -724
- package/mockup/content-data.html +0 -9
- package/mockup/examples/accordion-tabs-toast.html +0 -149
- package/mockup/examples/alert-dialog.html +0 -84
- package/mockup/examples/alerts.html +0 -115
- package/mockup/examples/badges-alerts.html +0 -109
- package/mockup/examples/buttons.html +0 -58
- package/mockup/examples/cards.html +0 -132
- package/mockup/examples/carousel.html +0 -126
- package/mockup/examples/charts.html +0 -102
- package/mockup/examples/check-radio-switch.html +0 -620
- package/mockup/examples/collapse.html +0 -69
- package/mockup/examples/combobox.html +0 -60
- package/mockup/examples/command-palette.html +0 -64
- package/mockup/examples/datatable.html +0 -113
- package/mockup/examples/datepicker.html +0 -62
- package/mockup/examples/divider.html +0 -45
- package/mockup/examples/dropdown-tooltip.html +0 -77
- package/mockup/examples/empty-state.html +0 -56
- package/mockup/examples/file-drop.html +0 -74
- package/mockup/examples/file-upload-advanced.html +0 -68
- package/mockup/examples/forms-advanced.html +0 -77
- package/mockup/examples/hover-card.html +0 -86
- package/mockup/examples/icons.html +0 -157
- package/mockup/examples/input-group.html +0 -74
- package/mockup/examples/js-foundation.html +0 -215
- package/mockup/examples/layout.html +0 -134
- package/mockup/examples/modal-select.html +0 -127
- package/mockup/examples/nested-menu.html +0 -73
- package/mockup/examples/notification-center.html +0 -86
- package/mockup/examples/offcanvas-popover.html +0 -133
- package/mockup/examples/pagination-breadcrumbs.html +0 -92
- package/mockup/examples/popover.html +0 -81
- package/mockup/examples/range.html +0 -69
- package/mockup/examples/rating.html +0 -103
- package/mockup/examples/segmented-control.html +0 -96
- package/mockup/examples/skeletons.html +0 -82
- package/mockup/examples/spinner-progress.html +0 -130
- package/mockup/examples/stepper.html +0 -119
- package/mockup/examples/tables-navbar.html +0 -89
- package/mockup/examples/tag.html +0 -115
- package/mockup/examples/theming.html +0 -68
- package/mockup/examples/tile.html +0 -107
- package/mockup/examples/timeline.html +0 -108
- package/mockup/examples/toast.html +0 -113
- package/mockup/examples/tooltip.html +0 -68
- package/mockup/examples/tree-view.html +0 -68
- package/mockup/feedback-actions.html +0 -9
- package/mockup/forms.html +0 -13
- package/mockup/foundations.html +0 -7
- package/mockup/kitchen-sink.html +0 -696
- package/mockup/navigation-disclosure.html +0 -11
- package/mockup/overlays-commands.html +0 -12
- package/mockup/templates/README.md +0 -20
- package/mockup/templates/admin.html +0 -334
- package/mockup/templates/auth.html +0 -234
- package/mockup/templates/dashboard.html +0 -442
- package/mockup/templates/landing.html +0 -397
- package/packages/fokus-icons/package.json +0 -46
- package/scripts/migrate-fokus-map.json +0 -1366
- package/scripts/migrate-fokus.mjs +0 -97
package/docs/components/tag.md
DELETED
|
@@ -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).
|
package/docs/components/tile.md
DELETED
|
@@ -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).
|
package/docs/components/toast.md
DELETED
|
@@ -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).
|