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.
- package/dist/css/components.css +561 -83
- package/dist/css/components.min.css +1 -1
- package/dist/css/fokus-components.css +561 -83
- package/dist/css/fokus-components.min.css +1 -1
- package/dist/css/fokus-rtl.css +697 -83
- package/dist/css/fokus-rtl.min.css +1 -1
- package/dist/css/fokus-utilities.css +136 -0
- package/dist/css/fokus-utilities.min.css +1 -1
- package/dist/css/fokus.css +996 -258
- package/dist/css/fokus.min.css +1 -1
- package/dist/css/forms.css +300 -176
- package/dist/css/forms.min.css +1 -1
- package/dist/css/helpers.css +136 -0
- package/dist/css/helpers.min.css +1 -1
- package/dist/js/fokus.js +270 -25
- package/dist/js/fokus.min.js +18 -18
- package/package.json +17 -15
- package/packages/fokus-components/scss/components/_alerts.scss +128 -6
- package/packages/fokus-components/scss/components/_badges.scss +26 -10
- package/packages/fokus-components/scss/components/_index.scss +1 -0
- package/packages/fokus-components/scss/components/_popover.scss +131 -21
- package/packages/fokus-components/scss/components/_responsive.scss +23 -0
- package/packages/fokus-components/scss/components/_tag.scss +37 -14
- package/packages/fokus-components/scss/components/_toasts.scss +156 -11
- package/packages/fokus-components/scss/components/_tooltips.scss +70 -18
- package/packages/fokus-components/scss/forms/_check-radio-switch.scss +313 -215
- package/packages/fokus-components/scss/forms/_forms.scss +16 -0
- package/packages/fokus-js/js/carousel.d.ts +4 -0
- package/packages/fokus-js/js/carousel.js +8 -0
- package/packages/fokus-js/js/core/positioning.js +18 -9
- package/packages/fokus-js/js/dropdown.d.ts +4 -0
- package/packages/fokus-js/js/dropdown.js +7 -0
- package/packages/fokus-js/js/popover.js +26 -1
- package/packages/fokus-js/js/tabs.d.ts +3 -0
- package/packages/fokus-js/js/tabs.js +5 -0
- package/packages/fokus-js/js/tag.js +17 -0
- package/packages/fokus-js/js/toast.js +77 -3
- package/packages/fokus-js/js/tooltip.d.ts +8 -1
- package/packages/fokus-js/js/tooltip.js +106 -13
- package/packages/fokus-utilities/scss/utilities/_api.scss +48 -0
- package/CHANGELOG.md +0 -910
- 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 -59
- package/docs/components/avatar.md +0 -13
- package/docs/components/badge.md +0 -82
- 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 -97
- 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 -105
- package/docs/components/progress.md +0 -126
- package/docs/components/radio.md +0 -70
- package/docs/components/range.md +0 -83
- package/docs/components/rating.md +0 -91
- package/docs/components/ratio.md +0 -13
- 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 -75
- package/docs/components/table.md +0 -90
- package/docs/components/tabs.md +0 -104
- package/docs/components/tag.md +0 -129
- package/docs/components/tile.md +0 -112
- package/docs/components/timeline.md +0 -78
- package/docs/components/toast.md +0 -95
- package/docs/components/tooltip.md +0 -77
- 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 -102
- 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 -50
- package/docs/reference/definitions.md +0 -864
- package/docs/reference/design-tokens.md +0 -194
- 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 -8
- 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 -41
- package/mockup/examples/badges-alerts.html +0 -77
- 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 -144
- 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/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 -105
- package/mockup/examples/theming.html +0 -68
- package/mockup/examples/tile.html +0 -107
- package/mockup/examples/timeline.html +0 -108
- 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/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,95 +0,0 @@
|
|
|
1
|
-
# Toast
|
|
2
|
-
|
|
3
|
-
Notificação temporária, empilhada num canto da tela, com dispensa manual
|
|
4
|
-
ou automática por tempo. Base do [Notification Center](notification-center.md).
|
|
5
|
-
|
|
6
|
-
## Visão geral
|
|
7
|
-
|
|
8
|
-
```html
|
|
9
|
-
<button type="button" class="fs-btn fs-btn-primary" id="btn-toast">Mostrar toast</button>
|
|
10
|
-
|
|
11
|
-
<div class="fs-toast-container">
|
|
12
|
-
<div class="fs-toast fs-toast-success" data-fs="toast" id="meuToast" data-delay="4000">
|
|
13
|
-
<div class="fs-toast-header">
|
|
14
|
-
<span>Sucesso</span>
|
|
15
|
-
<button type="button" class="fs-btn-close" data-fs-dismiss="toast" aria-label="Fechar"></button>
|
|
16
|
-
</div>
|
|
17
|
-
<div class="fs-toast-body">Operação concluída com sucesso.</div>
|
|
18
|
-
</div>
|
|
19
|
-
</div>
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
```js
|
|
23
|
-
document.getElementById("btn-toast").addEventListener("click", () => {
|
|
24
|
-
FokusStyles.Toast.getInstance(document.getElementById("meuToast")).show();
|
|
25
|
-
});
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
Ao contrário de Modal/Offcanvas, o Toast **não** abre sozinho ao clicar num
|
|
29
|
-
gatilho com `data-fs-target` — ele é mostrado programaticamente via
|
|
30
|
-
`.show()`, porque geralmente é disparado por um evento da sua aplicação
|
|
31
|
-
(sucesso de uma requisição, etc.), não diretamente por um clique.
|
|
32
|
-
|
|
33
|
-
## Anatomia
|
|
34
|
-
|
|
35
|
-
`.fs-toast-container` (posição fixa num canto — um só por página,
|
|
36
|
-
compartilhado por todos os toasts) > `.fs-toast` (`data-fs="toast"`) >
|
|
37
|
-
`.fs-toast-header` (título + `.fs-btn-close`) + `.fs-toast-body`.
|
|
38
|
-
|
|
39
|
-
## Variações
|
|
40
|
-
|
|
41
|
-
Cor: `.fs-toast-{primary|secondary|success|warning|danger|info}` no
|
|
42
|
-
`.fs-toast` — tinge só o header.
|
|
43
|
-
|
|
44
|
-
## Estados
|
|
45
|
-
|
|
46
|
-
`.is-open` — controlado pelo JS (o toast começa com `display: none`
|
|
47
|
-
inline até a primeira `show()`).
|
|
48
|
-
|
|
49
|
-
- `data-delay` (ms, padrão `4000`) — tempo até auto-esconder.
|
|
50
|
-
- `data-autohide="false"` — desativa o auto-esconder; só fecha pelo
|
|
51
|
-
`.fs-btn-close` ou `.hide()` programático.
|
|
52
|
-
|
|
53
|
-
## A11y
|
|
54
|
-
|
|
55
|
-
`role="status"` + `aria-live="polite"` aplicados automaticamente — leitor
|
|
56
|
-
de tela anuncia o conteúdo ao aparecer, sem interromper o que está sendo
|
|
57
|
-
lido (diferente de `aria-live="assertive"`, que interromperia).
|
|
58
|
-
|
|
59
|
-
## API JS
|
|
60
|
-
|
|
61
|
-
Auto-init via `data-fs="toast"` (registra a instância, mas **não** mostra
|
|
62
|
-
automaticamente). `Toast.getInstance(el)`.
|
|
63
|
-
|
|
64
|
-
| Método | Descrição |
|
|
65
|
-
|---|---|
|
|
66
|
-
| `show()` | Mostra (anima expansão), inicia o temporizador de auto-esconder se `autohide` estiver ativo. |
|
|
67
|
-
| `hide()` | Esconde (anima recolhimento), cancela o temporizador. |
|
|
68
|
-
| `toggle()` | Alterna. |
|
|
69
|
-
| `dispose()` | Cancela o temporizador, remove listeners, desregistra a instância. |
|
|
70
|
-
|
|
71
|
-
| Evento | Cancelável | Quando |
|
|
72
|
-
|---|---|---|
|
|
73
|
-
| `fs:toast:shown` | Não | Depois que a animação de mostrar termina. |
|
|
74
|
-
| `fs:toast:hidden` | Não | Depois que a animação de esconder termina (inclusive auto-hide). |
|
|
75
|
-
|
|
76
|
-
## Tokens
|
|
77
|
-
|
|
78
|
-
`--fs-color-border`, `--fs-color-surface`, `--fs-alert-{nome}-bg`/`-text`
|
|
79
|
-
(header colorido), `--fs-radius-md`, `--fs-shadow-md`.
|
|
80
|
-
|
|
81
|
-
## Exemplo
|
|
82
|
-
|
|
83
|
-
```html
|
|
84
|
-
<div class="fs-toast-container">
|
|
85
|
-
<div class="fs-toast fs-toast-danger" data-fs="toast" id="erroToast" data-autohide="false">
|
|
86
|
-
<div class="fs-toast-header">
|
|
87
|
-
<span>Erro</span>
|
|
88
|
-
<button type="button" class="fs-btn-close" data-fs-dismiss="toast" aria-label="Fechar"></button>
|
|
89
|
-
</div>
|
|
90
|
-
<div class="fs-toast-body">Falha ao salvar. Tente novamente.</div>
|
|
91
|
-
</div>
|
|
92
|
-
</div>
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
Mockup: [laboratório do componente](../../mockup/overlays-commands.html#toast).
|
|
@@ -1,77 +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.
|
|
29
|
-
|
|
30
|
-
```html
|
|
31
|
-
<button class="fs-btn" data-fs="tooltip" data-placement="right" title="Mais opções">⋮</button>
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
## Estados
|
|
35
|
-
|
|
36
|
-
`.is-open` — controlado pelo JS ao mostrar/esconder; não defina
|
|
37
|
-
manualmente.
|
|
38
|
-
|
|
39
|
-
## A11y
|
|
40
|
-
|
|
41
|
-
O JS aplica `aria-describedby` no elemento de referência, apontando pro
|
|
42
|
-
`id` do tooltip — leitor de tela anuncia o conteúdo ao focar o elemento.
|
|
43
|
-
Mostra em `mouseenter`/`focus`, esconde em `mouseleave`/`blur`/`Escape` —
|
|
44
|
-
funciona por mouse e por teclado igualmente (ao contrário do `title`
|
|
45
|
-
nativo, que só mostra no hover).
|
|
46
|
-
|
|
47
|
-
## API JS
|
|
48
|
-
|
|
49
|
-
Auto-init via `data-fs="tooltip"` **ou** instanciação manual
|
|
50
|
-
(`new FokusStyles.Tooltip(el, { title, placement })` — útil quando o texto vem
|
|
51
|
-
de outro lugar, não de um atributo estático; é assim que
|
|
52
|
-
[Breadcrumb](breadcrumb.md) anexa tooltips a labels truncados).
|
|
53
|
-
`Tooltip.getInstance(el)`.
|
|
54
|
-
|
|
55
|
-
| Método | Descrição |
|
|
56
|
-
|---|---|
|
|
57
|
-
| `show()` | Mostra o tooltip, posicionado relativo à referência. |
|
|
58
|
-
| `hide()` | Esconde. |
|
|
59
|
-
| `toggle()` | Alterna. |
|
|
60
|
-
| `dispose()` | Remove listeners, `aria-describedby` e o elemento do tooltip do DOM; desregistra a instância. |
|
|
61
|
-
|
|
62
|
-
| Evento (no elemento de referência) | Cancelável | Quando |
|
|
63
|
-
|---|---|---|
|
|
64
|
-
| `fs:tooltip:shown` | Não | Depois de mostrar. |
|
|
65
|
-
| `fs:tooltip:hidden` | Não | Depois de esconder. |
|
|
66
|
-
|
|
67
|
-
## Tokens
|
|
68
|
-
|
|
69
|
-
`--fs-tooltip-bg`, `--fs-tooltip-text`, `--fs-radius-sm`.
|
|
70
|
-
|
|
71
|
-
## Exemplo
|
|
72
|
-
|
|
73
|
-
```html
|
|
74
|
-
<button type="button" class="fs-btn-close" data-fs="tooltip" title="Fechar" aria-label="Fechar"></button>
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
Mockup: [laboratório do componente](../../mockup/overlays-commands.html#tooltip).
|
|
@@ -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).
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
# Contribuindo
|
|
2
|
-
|
|
3
|
-
O guia de contribuição vive na raiz do repositório —
|
|
4
|
-
[`CONTRIBUTING.md`](../../CONTRIBUTING.md) — para o GitHub linkar
|
|
5
|
-
automaticamente em issues/PRs. Cobre:
|
|
6
|
-
|
|
7
|
-
- Pré-requisitos e setup local.
|
|
8
|
-
- Scripts (`build`, `lint`, `test`, `test:visual`, `test:a11y`, `contrast`,
|
|
9
|
-
`size`, `docs:check`).
|
|
10
|
-
- Convenções de SCSS e o fluxo pra criar um componente novo.
|
|
11
|
-
- Contrato editorial: cada componente precisa manter implementação, exemplo,
|
|
12
|
-
documentação, testes e acessibilidade alinhados.
|
|
13
|
-
- Semver e política de depreciação.
|
|
14
|
-
- Checklist de Pull Request.
|
|
15
|
-
|
|
16
|
-
Ver também: [Código de Conduta](../../CODE_OF_CONDUCT.md),
|
|
17
|
-
[templates de issue](../../.github/ISSUE_TEMPLATE/) e o
|
|
18
|
-
[template de Pull Request](../../.github/PULL_REQUEST_TEMPLATE.md).
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
# Instalação
|
|
2
|
-
|
|
3
|
-
## Via npm
|
|
4
|
-
|
|
5
|
-
```bash
|
|
6
|
-
npm install fokus-styles
|
|
7
|
-
```
|
|
8
|
-
|
|
9
|
-
## Via CDN
|
|
10
|
-
|
|
11
|
-
Sem instalar nada, direto do jsDelivr ou unpkg:
|
|
12
|
-
|
|
13
|
-
```html
|
|
14
|
-
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/fokus-styles/dist/css/fokus.css">
|
|
15
|
-
<script src="https://cdn.jsdelivr.net/npm/fokus-styles/dist/js/fokus.js"></script>
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
Troque `fokus.css`/`fokus.js` por `fokus.min.css`/`fokus.min.js` para as
|
|
19
|
-
versões minificadas em produção.
|
|
20
|
-
|
|
21
|
-
## Fontes self-hosted
|
|
22
|
-
|
|
23
|
-
Plus Jakarta Sans (sans) e Source Code Pro (mono) são distribuídas à parte,
|
|
24
|
-
em `fonts.css`, para não forçar o download das fontes em quem prefere usar
|
|
25
|
-
as próprias. Inclua **antes** do CSS principal:
|
|
26
|
-
|
|
27
|
-
```html
|
|
28
|
-
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/fokus-styles/dist/css/fonts.css">
|
|
29
|
-
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/fokus-styles/dist/css/fokus.css">
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
Sem `fonts.css`, a tipografia cai no fallback `sans-serif`/`monospace` do
|
|
33
|
-
sistema — nada quebra, só muda a fonte.
|
|
34
|
-
|
|
35
|
-
## Distribuições disponíveis
|
|
36
|
-
|
|
37
|
-
O pacote publica o bundle completo (`fokus.css`) e distribuições granulares,
|
|
38
|
-
para quem não precisa do framework inteiro:
|
|
39
|
-
|
|
40
|
-
| Arquivo | Conteúdo |
|
|
41
|
-
|---|---|
|
|
42
|
-
| `dist/css/fokus.css` | Bundle completo: tokens, reset, layout, forms, components, utilities, tema escuro. |
|
|
43
|
-
| `dist/css/layout.css` | Só grid/containers (+ tokens/reset/tema). |
|
|
44
|
-
| `dist/css/forms.css` | Só formulários (+ tokens/reset/tema). |
|
|
45
|
-
| `dist/css/components.css` | Só componentes prontos (+ tokens/reset/tema). |
|
|
46
|
-
| `dist/css/helpers.css` | Só utilitários atômicos (+ tokens/reset/tema). |
|
|
47
|
-
| `dist/css/fonts.css` | Só os `@font-face` self-hosted (opcional, ver acima). |
|
|
48
|
-
| `dist/js/fokus.js` | Todo o JavaScript dos componentes interativos, IIFE global `FokusStyles`. |
|
|
49
|
-
|
|
50
|
-
Cada distribuição CSS granular já inclui tokens, reset e tema escuro
|
|
51
|
-
completos — pode ser usada isoladamente sem quebrar variáveis ou dark mode.
|
|
52
|
-
|
|
53
|
-
## Import via Sass
|
|
54
|
-
|
|
55
|
-
Para compilar com suas próprias variáveis Sass (sobrescrever antes de
|
|
56
|
-
compilar, em vez de sobrescrever CSS Custom Properties depois):
|
|
57
|
-
|
|
58
|
-
```scss
|
|
59
|
-
@use "fokus-styles/scss/fokus" with (
|
|
60
|
-
$radius-md: 10px
|
|
61
|
-
);
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
Ver [`docs/reference/scss-architecture.md`](../reference/scss-architecture.md)
|
|
65
|
-
para a lista completa de variáveis e a organização dos módulos.
|
|
66
|
-
|
|
67
|
-
## Próximo passo
|
|
68
|
-
|
|
69
|
-
[Formas de uso](usage.md) — como inicializar componentes interativos e a
|
|
70
|
-
convenção de nomenclatura de classes.
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
# Formas de uso
|
|
2
|
-
|
|
3
|
-
## Convenção de nomenclatura
|
|
4
|
-
|
|
5
|
-
| Prefixo | Papel | Exemplo |
|
|
6
|
-
|---|---|---|
|
|
7
|
-
| `.fs-*` | Componente (estrutura/aparência) | `.fs-btn`, `.fs-card`, `.fs-modal` |
|
|
8
|
-
| `.fs-u-*` | Utilitário atômico | `.fs-u-d-flex`, `.fs-u-mt-3`, `.fs-u-gx-2` |
|
|
9
|
-
| `.is-*` | Estado, controlado por você ou por JS | `.is-active`, `.is-disabled`, `.is-open` |
|
|
10
|
-
| `--fs-*` | Token CSS (Custom Property) | `--fs-color-primary`, `--fs-radius-md` |
|
|
11
|
-
| `data-fs` | Auto-init de componente interativo | `data-fs="modal"` |
|
|
12
|
-
| `data-fs-target`/`data-fs-dismiss` | Alvo/dispensa de componente interativo | `data-fs-target="#meuModal"` |
|
|
13
|
-
| `fs:*` | Evento DOM customizado disparado por um componente | `fs:modal:shown` |
|
|
14
|
-
|
|
15
|
-
Essa separação existe para o framework nunca colidir com classes de outras
|
|
16
|
-
bibliotecas/CSS na mesma página — ver
|
|
17
|
-
[`docs/reference/scss-architecture.md`](../reference/scss-architecture.md#cascade-layers-layer)
|
|
18
|
-
para como isso se reflete em cascade layers.
|
|
19
|
-
|
|
20
|
-
## Auto-init de componentes interativos
|
|
21
|
-
|
|
22
|
-
Todo componente que precisa de JavaScript se inicializa sozinho ao carregar
|
|
23
|
-
a página, a partir do atributo `data-fs="<nome>"` no elemento raiz — não é
|
|
24
|
-
preciso chamar `new FokusStyles.Algo(...)` manualmente:
|
|
25
|
-
|
|
26
|
-
```html
|
|
27
|
-
<button type="button" class="fs-btn" data-fs-target="#meuModal">Abrir</button>
|
|
28
|
-
|
|
29
|
-
<div class="fs-modal" data-fs="modal" id="meuModal">
|
|
30
|
-
<div class="fs-modal-dialog">
|
|
31
|
-
<div class="fs-modal-content">
|
|
32
|
-
<div class="fs-modal-body">Conteúdo.</div>
|
|
33
|
-
</div>
|
|
34
|
-
</div>
|
|
35
|
-
</div>
|
|
36
|
-
|
|
37
|
-
<script src="dist/js/fokus.js"></script>
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
O auto-init roda em `DOMContentLoaded` (ou imediatamente, se o script for
|
|
41
|
-
carregado depois que o DOM já terminou) e é idempotente — chamar de novo não
|
|
42
|
-
cria uma segunda instância no mesmo elemento.
|
|
43
|
-
|
|
44
|
-
## API comum aos componentes interativos
|
|
45
|
-
|
|
46
|
-
A maioria segue a mesma forma, acessível via `getInstance()`:
|
|
47
|
-
|
|
48
|
-
```js
|
|
49
|
-
const modal = FokusStyles.Modal.getInstance(document.getElementById("meuModal"));
|
|
50
|
-
modal.show();
|
|
51
|
-
modal.hide();
|
|
52
|
-
modal.toggle();
|
|
53
|
-
modal.dispose(); // remove listeners e o registro da instância
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
- `getInstance(el)` — retorna a instância já criada para aquele elemento
|
|
57
|
-
(`undefined` se não houver, ou se `data-fs` nunca esteve presente e você
|
|
58
|
-
precisa instanciar manualmente com `new FokusStyles.Nome(el)`).
|
|
59
|
-
- `show()`/`hide()`/`toggle()` — nem todo componente tem os três (ex.:
|
|
60
|
-
Tabs usa `show(tabEl)` para trocar a aba ativa; Tag só tem `dismiss()`).
|
|
61
|
-
Ver a página de cada componente em [Componentes](../README.md#componentes)
|
|
62
|
-
para a API exata.
|
|
63
|
-
- `dispose()` — remove os listeners e desregistra a instância; o elemento
|
|
64
|
-
em si não é removido do DOM (exceto onde a própria natureza do componente
|
|
65
|
-
implica remoção, como `Tag.dismiss()`).
|
|
66
|
-
|
|
67
|
-
Uma exceção à regra: **Alert Dialog** não usa `data-fs`/`getInstance()` — é
|
|
68
|
-
100% programático, via `FokusStyles.confirm({ title, message, ... })`, que
|
|
69
|
-
retorna uma Promise. Ver
|
|
70
|
-
[`../components/alert-dialog.md`](../components/alert-dialog.md).
|
|
71
|
-
|
|
72
|
-
## Eventos
|
|
73
|
-
|
|
74
|
-
Componentes disparam eventos DOM customizados, no padrão
|
|
75
|
-
`fs:<componente>:<ação>` (particípio: `shown`/`hidden`/`changed`...),
|
|
76
|
-
sempre com `bubbles: true` — escute no documento ou em qualquer ancestral:
|
|
77
|
-
|
|
78
|
-
```js
|
|
79
|
-
document.addEventListener("fs:modal:shown", (event) => {
|
|
80
|
-
console.log("modal aberto:", event.target);
|
|
81
|
-
});
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
Alguns eventos são **canceláveis** (`cancelable: true`) — chamar
|
|
85
|
-
`event.preventDefault()` no handler impede a ação (ex.: `fs:tag:dismissed`
|
|
86
|
-
cancela a remoção da tag). A documentação de cada componente lista quais
|
|
87
|
-
eventos existem e se são canceláveis.
|
|
88
|
-
|
|
89
|
-
## Import via ES modules
|
|
90
|
-
|
|
91
|
-
Além do bundle IIFE (`dist/js/fokus.js`, global `FokusStyles`), os módulos
|
|
92
|
-
individuais são importáveis via `fokus-styles/js/*`:
|
|
93
|
-
|
|
94
|
-
```js
|
|
95
|
-
import { Modal } from "fokus-styles/js/modal.js";
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
Útil para bundlers que fazem tree-shaking — importar só o que usa em vez do
|
|
99
|
-
JS inteiro.
|
|
100
|
-
|
|
101
|
-
## Próximo passo
|
|
102
|
-
|
|
103
|
-
[Componentes](../README.md#componentes) — catálogo completo, ou
|
|
104
|
-
[Theming](../guides/theming.md) para customizar cores/tipografia/raio sem
|
|
105
|
-
fork.
|