@sbkbs/ui 1.0.6 → 2.0.0-beta.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/CHANGELOG.md +57 -0
- package/MIGRATION.md +96 -0
- package/README.md +221 -115
- package/dist/assets/favicon/apple-touch-icon.png +0 -0
- package/dist/assets/favicon/favicon-96x96.png +0 -0
- package/dist/assets/favicon/favicon.ico +0 -0
- package/dist/assets/favicon/favicon.svg +1 -0
- package/dist/assets/favicon/site.webmanifest +21 -0
- package/dist/assets/favicon/web-app-manifest-192x192.png +0 -0
- package/dist/assets/favicon/web-app-manifest-512x512.png +0 -0
- package/dist/base.css +38 -0
- package/dist/components/Accordion/Accordion.d.ts +13 -1
- package/dist/components/Accordion/Accordion.js +100 -52
- package/dist/components/Accordion/Accordion.js.map +1 -1
- package/dist/components/Alert/Alert.d.ts +17 -4
- package/dist/components/Alert/Alert.js +64 -20
- package/dist/components/Alert/Alert.js.map +1 -1
- package/dist/components/Avatar/Avatar.d.ts +12 -6
- package/dist/components/Avatar/Avatar.js +66 -0
- package/dist/components/Avatar/Avatar.js.map +1 -0
- package/dist/components/Badge/Badge.d.ts +11 -2
- package/dist/components/Badge/Badge.js +42 -30
- package/dist/components/Badge/Badge.js.map +1 -1
- package/dist/components/Breadcrumb/Breadcrumb.d.ts +5 -2
- package/dist/components/Breadcrumb/Breadcrumb.js +23 -16
- package/dist/components/Breadcrumb/Breadcrumb.js.map +1 -1
- package/dist/components/Button/Button.d.ts +10 -8
- package/dist/components/Button/Button.js +73 -114
- package/dist/components/Button/Button.js.map +1 -1
- package/dist/components/Card/Card.d.ts +33 -3
- package/dist/components/Card/Card.js +91 -30
- package/dist/components/Card/Card.js.map +1 -1
- package/dist/components/Checkbox/Checkbox.d.ts +4 -1
- package/dist/components/Checkbox/Checkbox.js +32 -31
- package/dist/components/Checkbox/Checkbox.js.map +1 -1
- package/dist/components/Chip/Chip.d.ts +7 -1
- package/dist/components/Chip/Chip.js +19 -9
- package/dist/components/Chip/Chip.js.map +1 -1
- package/dist/components/Combobox/Combobox.d.ts +10 -2
- package/dist/components/Combobox/Combobox.js +146 -133
- package/dist/components/Combobox/Combobox.js.map +1 -1
- package/dist/components/Divider/Divider.d.ts +7 -1
- package/dist/components/Divider/Divider.js +28 -12
- package/dist/components/Divider/Divider.js.map +1 -1
- package/dist/components/DropdownMenu/DropdownMenu.d.ts +33 -0
- package/dist/components/DropdownMenu/DropdownMenu.js +147 -0
- package/dist/components/DropdownMenu/DropdownMenu.js.map +1 -0
- package/dist/components/EmptyState/EmptyState.d.ts +7 -1
- package/dist/components/EmptyState/EmptyState.js +28 -19
- package/dist/components/EmptyState/EmptyState.js.map +1 -1
- package/dist/components/Field/Field.d.ts +21 -0
- package/dist/components/Field/Field.js +35 -0
- package/dist/components/Field/Field.js.map +1 -0
- package/dist/components/FileUpload/FileUpload.d.ts +9 -2
- package/dist/components/FileUpload/FileUpload.js +128 -102
- package/dist/components/FileUpload/FileUpload.js.map +1 -1
- package/dist/components/Footer/Footer.d.ts +19 -6
- package/dist/components/Footer/Footer.js +47 -115
- package/dist/components/Footer/Footer.js.map +1 -1
- package/dist/components/GlassPanel/GlassPanel.d.ts +18 -0
- package/dist/components/GlassPanel/GlassPanel.js +39 -0
- package/dist/components/GlassPanel/GlassPanel.js.map +1 -0
- package/dist/components/Header/Header.d.ts +25 -14
- package/dist/components/Header/Header.js +88 -148
- package/dist/components/Header/Header.js.map +1 -1
- package/dist/components/Highlight/Highlight.d.ts +13 -0
- package/dist/components/Highlight/Highlight.js +18 -0
- package/dist/components/Highlight/Highlight.js.map +1 -0
- package/dist/components/Icon/Icon.d.ts +21 -0
- package/dist/components/Icon/Icon.js +31 -0
- package/dist/components/Icon/Icon.js.map +1 -0
- package/dist/components/IconButton/IconButton.d.ts +12 -0
- package/dist/components/IconButton/IconButton.js +49 -0
- package/dist/components/IconButton/IconButton.js.map +1 -0
- package/dist/components/Input/Input.d.ts +3 -2
- package/dist/components/Input/Input.js +51 -69
- package/dist/components/Input/Input.js.map +1 -1
- package/dist/components/Layout/Layout.d.ts +2 -0
- package/dist/components/Layout/Layout.js +24 -18
- package/dist/components/Layout/Layout.js.map +1 -1
- package/dist/components/Logo/Logo.d.ts +27 -0
- package/dist/components/Logo/Logo.js +107 -0
- package/dist/components/Logo/Logo.js.map +1 -0
- package/dist/components/MiniCard/MiniCard.d.ts +21 -0
- package/dist/components/MiniCard/MiniCard.js +90 -0
- package/dist/components/MiniCard/MiniCard.js.map +1 -0
- package/dist/components/Modal/Modal.d.ts +16 -3
- package/dist/components/Modal/Modal.js +124 -93
- package/dist/components/Modal/Modal.js.map +1 -1
- package/dist/components/Navigation/Navigation.d.ts +1 -0
- package/dist/components/Navigation/Navigation.js +14 -14
- package/dist/components/Navigation/Navigation.js.map +1 -1
- package/dist/components/NumberInput/NumberInput.d.ts +5 -2
- package/dist/components/NumberInput/NumberInput.js +98 -128
- package/dist/components/NumberInput/NumberInput.js.map +1 -1
- package/dist/components/PageHeader/PageHeader.d.ts +8 -1
- package/dist/components/PageHeader/PageHeader.js +26 -25
- package/dist/components/PageHeader/PageHeader.js.map +1 -1
- package/dist/components/Pagination/Pagination.d.ts +15 -2
- package/dist/components/Pagination/Pagination.js +68 -34
- package/dist/components/Pagination/Pagination.js.map +1 -1
- package/dist/components/Paragraph/Paragraph.d.ts +8 -2
- package/dist/components/Paragraph/Paragraph.js +39 -36
- package/dist/components/Paragraph/Paragraph.js.map +1 -1
- package/dist/components/Popover/Popover.d.ts +12 -1
- package/dist/components/Popover/Popover.js +49 -37
- package/dist/components/Popover/Popover.js.map +1 -1
- package/dist/components/ProgressBar/ProgressBar.d.ts +12 -6
- package/dist/components/ProgressBar/ProgressBar.js +71 -0
- package/dist/components/ProgressBar/ProgressBar.js.map +1 -0
- package/dist/components/Radio/Radio.d.ts +2 -1
- package/dist/components/Radio/Radio.js +27 -31
- package/dist/components/Radio/Radio.js.map +1 -1
- package/dist/components/SectionHeader/SectionHeader.d.ts +6 -1
- package/dist/components/SectionHeader/SectionHeader.js +14 -12
- package/dist/components/SectionHeader/SectionHeader.js.map +1 -1
- package/dist/components/Select/Select.d.ts +6 -2
- package/dist/components/Select/Select.js +47 -35
- package/dist/components/Select/Select.js.map +1 -1
- package/dist/components/SideNav/SideNav.d.ts +55 -0
- package/dist/components/SideNav/SideNav.js +141 -0
- package/dist/components/SideNav/SideNav.js.map +1 -0
- package/dist/components/Skeleton/Skeleton.d.ts +12 -1
- package/dist/components/Skeleton/Skeleton.js +33 -18
- package/dist/components/Skeleton/Skeleton.js.map +1 -1
- package/dist/components/Spinner/Spinner.d.ts +11 -3
- package/dist/components/Spinner/Spinner.js +57 -0
- package/dist/components/Spinner/Spinner.js.map +1 -0
- package/dist/components/Stepper/Stepper.d.ts +1 -1
- package/dist/components/Stepper/Stepper.js +41 -53
- package/dist/components/Stepper/Stepper.js.map +1 -1
- package/dist/components/Subtitle/Subtitle.d.ts +9 -3
- package/dist/components/Subtitle/Subtitle.js +29 -35
- package/dist/components/Subtitle/Subtitle.js.map +1 -1
- package/dist/components/Switch/Switch.d.ts +2 -1
- package/dist/components/Switch/Switch.js +45 -33
- package/dist/components/Switch/Switch.js.map +1 -1
- package/dist/components/Table/Table.d.ts +19 -1
- package/dist/components/Table/Table.js +48 -11
- package/dist/components/Table/Table.js.map +1 -1
- package/dist/components/Tabs/Tabs.d.ts +16 -2
- package/dist/components/Tabs/Tabs.js +80 -44
- package/dist/components/Tabs/Tabs.js.map +1 -1
- package/dist/components/Tag/Tag.d.ts +8 -1
- package/dist/components/Tag/Tag.js +27 -12
- package/dist/components/Tag/Tag.js.map +1 -1
- package/dist/components/Textarea/Textarea.d.ts +3 -1
- package/dist/components/Textarea/Textarea.js +36 -40
- package/dist/components/Textarea/Textarea.js.map +1 -1
- package/dist/components/Title/Title.d.ts +9 -3
- package/dist/components/Title/Title.js +42 -42
- package/dist/components/Title/Title.js.map +1 -1
- package/dist/components/Toast/Toast.d.ts +39 -11
- package/dist/components/Toast/Toast.js +130 -76
- package/dist/components/Toast/Toast.js.map +1 -1
- package/dist/components/Tooltip/Tooltip.d.ts +12 -2
- package/dist/components/Tooltip/Tooltip.js +50 -32
- package/dist/components/Tooltip/Tooltip.js.map +1 -1
- package/dist/components/Typography/weight.d.ts +9 -0
- package/dist/components/Typography/weight.js +5 -0
- package/dist/components/Typography/weight.js.map +1 -0
- package/dist/fonts.css +8 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +55 -43
- package/dist/index.js +118 -83
- package/dist/index.js.map +1 -1
- package/dist/reset.css +9 -0
- package/dist/styles.css +1 -0
- package/dist/tailwind.css +153 -0
- package/dist/theme/ThemeProvider.d.ts +21 -3
- package/dist/theme/ThemeProvider.js +57 -18
- package/dist/theme/ThemeProvider.js.map +1 -1
- package/dist/theme/tokens.d.ts +43 -0
- package/dist/theme/tokens.js +39 -0
- package/dist/theme/tokens.js.map +1 -0
- package/dist/theme.css +296 -263
- package/dist/tokens.css +327 -0
- package/dist/utils/cn.d.ts +2 -2
- package/dist/utils/cn.js +19 -4
- package/dist/utils/cn.js.map +1 -1
- package/dist/utils/styles.d.ts +37 -0
- package/dist/utils/styles.js +35 -0
- package/dist/utils/styles.js.map +1 -0
- package/package.json +140 -117
- package/dist/components/Accordion/Accordion.stories.d.ts +0 -7
- package/dist/components/Alert/Alert.stories.d.ts +0 -8
- package/dist/components/Badge/Badge.stories.d.ts +0 -8
- package/dist/components/Breadcrumb/Breadcrumb.stories.d.ts +0 -8
- package/dist/components/Button/Button.stories.d.ts +0 -7
- package/dist/components/Card/Card.stories.d.ts +0 -8
- package/dist/components/Checkbox/Checkbox.stories.d.ts +0 -7
- package/dist/components/Combobox/Combobox.stories.d.ts +0 -9
- package/dist/components/Feedback/Feedback.stories.d.ts +0 -5
- package/dist/components/FileUpload/FileUpload.stories.d.ts +0 -10
- package/dist/components/Input/Input.stories.d.ts +0 -9
- package/dist/components/Modal/Modal.stories.d.ts +0 -8
- package/dist/components/NumberInput/NumberInput.stories.d.ts +0 -8
- package/dist/components/Pagination/Pagination.stories.d.ts +0 -8
- package/dist/components/Radio/Radio.stories.d.ts +0 -7
- package/dist/components/Select/Select.stories.d.ts +0 -8
- package/dist/components/Stepper/Stepper.stories.d.ts +0 -8
- package/dist/components/Switch/Switch.stories.d.ts +0 -8
- package/dist/components/Tabs/Tabs.stories.d.ts +0 -8
- package/dist/components/Textarea/Textarea.stories.d.ts +0 -7
- package/dist/components/Toast/Toast.stories.d.ts +0 -8
- package/dist/oficios-ui.css +0 -1
- package/dist/oficios-ui.umd.cjs +0 -2
- package/dist/oficios-ui.umd.cjs.map +0 -1
- package/dist/sbk-icon.png +0 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## [2.0.0] - 2026-09-24
|
|
4
|
+
|
|
5
|
+
Alinhamento ao Brand Book SBK 2026. Contém mudanças incompatíveis: veja o [guia de migração](./MIGRATION.md).
|
|
6
|
+
|
|
7
|
+
### Breaking
|
|
8
|
+
|
|
9
|
+
- Paleta substituída pela oficial 2026 (Verde Escuro `#023631`, Ciano Escuro `#075056`, Off White `#ECEFF3`, Verde Claro `#0A5A52` e secundárias). Turquesa `#01B2AA`, paleta "O Criador" e gradiente turquesa removidos.
|
|
10
|
+
- Tema padrão SBK IA (primária Verde Claro). Tema institucional SBK via `data-brand="sbk"`.
|
|
11
|
+
- Tipografia restrita aos pesos 300 (corpo) e 600 (títulos). Sora removida.
|
|
12
|
+
- Componentes leem apenas tokens `--sbk-*`. Nomes da 1.x (`--md-*`, `--brand-*`, `--bg-*`, `--text-*`) permanecem como aliases deprecados.
|
|
13
|
+
- A lib não importa mais a fonte (use `@sbkbs/ui/fonts.css`) e não inclui mais o preflight do Tailwind no `styles.css`.
|
|
14
|
+
- `Button`: prop `palette` removida; `type="button"` por padrão; loading preserva a largura.
|
|
15
|
+
- `Title`: prop `gradient` removida; padrões de peso passam a 600 (títulos/subtítulos) e 300 (parágrafos).
|
|
16
|
+
- `Alert` informativo usa `role="status"`. `Modal` com `role="dialog"` no painel e renderizado em portal.
|
|
17
|
+
- Build CJS renomeado de `oficios-ui.umd.cjs` para `index.cjs`; CSS de `oficios-ui.css` para `styles.css` (os subpaths do `exports` continuam os mesmos).
|
|
18
|
+
|
|
19
|
+
### Added
|
|
20
|
+
|
|
21
|
+
- Arquitetura de estilos híbrida: tokens em CSS custom properties + preset Tailwind CSS v4 (`@sbkbs/ui/tailwind.css`), com namespace `sbk`.
|
|
22
|
+
- Novos entrypoints: `tokens.css`, `tailwind.css`, `base.css`, `fonts.css`, `reset.css`, `assets/favicon/*`.
|
|
23
|
+
- Tokens `--sbk-color-{success,warning,error,info}-fg` para texto e ícones de estado com contraste nos dois temas.
|
|
24
|
+
- Novos componentes: `Logo` (SVGs oficiais SBK e SBK IA, zona de respiro), `Icon` (lucide-react), `IconButton`, `MiniCard`, `GlassPanel`, `Highlight`, `SideNav`, `DropdownMenu`, `Field`, subcomponentes de `Card`.
|
|
25
|
+
- Exportados componentes que existiam sem export: `Avatar`, `Divider`, `ProgressBar`, `Spinner`.
|
|
26
|
+
- Superfície Liquid Glass (`sbk-glass`) com fallback para `prefers-reduced-transparency` e navegadores sem `backdrop-filter`; `variant="glass"` em Button, IconButton, Card, MiniCard, Header, Footer, SideNav, Modal, Popover, DropdownMenu e Toast.
|
|
27
|
+
- `ThemeProvider`: modo `system`, troca de marca (`setBrand`), `storageKey` configurável e acesso seguro ao `localStorage`.
|
|
28
|
+
- `ProgressBar` indeterminado; `Skeleton` de texto; `Spinner` com label visível.
|
|
29
|
+
- `Pagination` com reticências e variante `simple`; `Tabs` com variante `line` e modo controlado; `Accordion` com `type="multiple"`.
|
|
30
|
+
- `Toast`: ícones por tom, ação, posições, limite de itens e pausa do timer em hover/foco.
|
|
31
|
+
- Tokens em TypeScript: `sbkTokens` e `sbkChartPalette`.
|
|
32
|
+
- Favicons oficiais no playground, Storybook e pacote.
|
|
33
|
+
- Storybook com alternância de tema e marca na toolbar; stories para as peças novas e fundamentos.
|
|
34
|
+
|
|
35
|
+
### Fixed
|
|
36
|
+
|
|
37
|
+
- IDs gerados com `Math.random()` a cada render (Input, Select, Combobox e outros) substituídos por `useId`. O Combobox mudava de ID a cada tecla.
|
|
38
|
+
- `id="modal-title"` fixo colidia com múltiplos modais.
|
|
39
|
+
- Anel de foco azul fixo (`rgba(47,93,140)`) trocado pelo token de foco da marca.
|
|
40
|
+
- `public/` deixou de ser copiado para `dist/`.
|
|
41
|
+
- `.d.ts` dos stories deixou de ser publicado; classes usadas só em stories não entram mais no `styles.css`.
|
|
42
|
+
- Testes E2E (Playwright) atualizados para o playground atual. Os 9 que falhavam já falhavam na 1.0.6.
|
|
43
|
+
|
|
44
|
+
## [1.0.2] - 2026-03-24
|
|
45
|
+
|
|
46
|
+
### Added
|
|
47
|
+
|
|
48
|
+
- Playground modernizado com navegação, exemplos e blocos copiáveis.
|
|
49
|
+
- Novos componentes base (feedback, form e layout).
|
|
50
|
+
- Componentes avançados: tooltip, popover, tabs, accordion, toast, table e pagination.
|
|
51
|
+
- Setup inicial de testes com Vitest + Testing Library.
|
|
52
|
+
- Setup inicial de Storybook com addon de acessibilidade.
|
|
53
|
+
|
|
54
|
+
### Changed
|
|
55
|
+
|
|
56
|
+
- Migração de componentes para abordagem utilitária (Tailwind classes).
|
|
57
|
+
- Refinos de tema dark mode e contraste.
|
package/MIGRATION.md
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# Migração da 1.x para a 2.0
|
|
2
|
+
|
|
3
|
+
A 2.0 alinha a lib ao **Brand Book SBK 2026**. A mudança mais visível é a paleta: a turquesa `#01B2AA` sai e entram o Verde Claro `#0A5A52` (SBK IA) e o Verde Escuro `#023631` (SBK institucional). A maior parte das aplicações migra com os passos abaixo, sem reescrever telas.
|
|
4
|
+
|
|
5
|
+
## 1. Atualize o pacote e os imports de CSS
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @sbkbs/ui@^2
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
```diff
|
|
12
|
+
- import '@sbkbs/ui/theme.css';
|
|
13
|
+
+ import '@sbkbs/ui/styles.css';
|
|
14
|
+
+ import '@sbkbs/ui/fonts.css'; // a lib não carrega mais a fonte automaticamente
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
- `@sbkbs/ui/styles.css` continua sendo o arquivo principal. Agora ele inclui os tokens.
|
|
18
|
+
- `@sbkbs/ui/theme.css` continua existindo, como alias de `tokens.css`, para não quebrar imports antigos.
|
|
19
|
+
- **A fonte não é mais importada pela lib.** Importe `@sbkbs/ui/fonts.css` ou carregue Plus Jakarta Sans 300/600 por conta própria. Se o app tinha o comentário "a fonte vem da @sbkbs/ui", ajuste.
|
|
20
|
+
- O CSS da lib não inclui mais o preflight (reset) do Tailwind. Apps com Tailwind já têm esse reset. Apps sem Tailwind: importe `@sbkbs/ui/reset.css` antes do `styles.css`. Os componentes funcionam sem reset, mas o restante da página pode mudar se dependia dele.
|
|
21
|
+
|
|
22
|
+
## 2. Tokens: use os nomes novos
|
|
23
|
+
|
|
24
|
+
Os componentes da 2.0 leem apenas `--sbk-*`. Os nomes antigos continuam definidos como **aliases deprecados** (serão removidos na 3.0), apontando para os valores novos. Isso mantém funcionando o CSS da aplicação que **lê** essas variáveis.
|
|
25
|
+
|
|
26
|
+
**Sobrescrever um nome antigo não altera mais os componentes.** Por exemplo, `--md-primary: ...` no `theme.css` do app não muda mais o `Button`.
|
|
27
|
+
|
|
28
|
+
| 1.x | 2.0 |
|
|
29
|
+
| --- | --- |
|
|
30
|
+
| `--md-primary`, `--primary-color`, `--color-primary` | `--sbk-color-primary` |
|
|
31
|
+
| `--primary-color-hover` | `--sbk-color-primary-hover` |
|
|
32
|
+
| `--md-secondary` | `--sbk-color-secondary` |
|
|
33
|
+
| `--bg-page`, `--bg-primary` | `--sbk-color-bg` |
|
|
34
|
+
| `--bg-secondary`, `--bg-card`, `--md-surface` | `--sbk-color-surface` |
|
|
35
|
+
| `--bg-tertiary`, `--md-surface-container*` | `--sbk-color-surface-sunken` |
|
|
36
|
+
| `--bg-hover` | `--sbk-color-surface-hover` |
|
|
37
|
+
| `--text-primary`, `--md-on-surface` | `--sbk-color-fg` |
|
|
38
|
+
| `--text-secondary`, `--text-muted` | `--sbk-color-fg-muted` |
|
|
39
|
+
| `--border-color`, `--md-outline-variant` | `--sbk-color-line` |
|
|
40
|
+
| `--border-color-hover`, `--md-outline` | `--sbk-color-line-strong` |
|
|
41
|
+
| `--border-color-focus` | `--sbk-color-focus` |
|
|
42
|
+
| `--md-error`, `--error-color` | `--sbk-color-error` |
|
|
43
|
+
| `--success-color` / `--warning-color` / `--info-color` | `--sbk-color-success` / `-warning` / `-info` |
|
|
44
|
+
| `--border-radius-*` | `--sbk-radius-xs/sm/md/lg` (4/8/12/16 px) |
|
|
45
|
+
| `--shadow-*` | `--sbk-shadow-sm`, `--sbk-shadow-md` |
|
|
46
|
+
| `--font-primary` | `--sbk-font-family` |
|
|
47
|
+
| `--brand-verde-vibrante` | `--sbk-verde-claro` |
|
|
48
|
+
| `--brand-verde-profundo` | `--sbk-verde-escuro` |
|
|
49
|
+
| `--brand-grafite-azulado` | `--sbk-ciano-profundo` |
|
|
50
|
+
| `--brand-off-white-gelo` | `--sbk-off-white` |
|
|
51
|
+
| `--brand-cinza-medio`, `--brand-azul-acinzentado` | `--sbk-chumbo-leve` |
|
|
52
|
+
|
|
53
|
+
Removidos sem alias: paleta "O Criador" (`--brand-verde-lima`, `--brand-azul-lavanda` etc.), `--gradient-espectro-turquesa`, `--font-logo` (Sora) e as paletas de botão `data-button-palette`.
|
|
54
|
+
|
|
55
|
+
### Para apps com overrides próprios (ex.: Cadastro.IA)
|
|
56
|
+
|
|
57
|
+
Se o app mantém uma seção "Library overrides" que sobrescreve `--md-primary`, `--md-secondary` etc. para corrigir cores da 1.x, **apague essa seção**: as cores padrão da 2.0 já seguem o brand book. Se ainda precisar de um ajuste, sobrescreva o token novo:
|
|
58
|
+
|
|
59
|
+
```css
|
|
60
|
+
:root {
|
|
61
|
+
--sbk-color-primary: var(--sbk-verde-escuro);
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Atenção à colisão de nomes: se o app define as próprias variáveis `--sbk-verde-escuro`, `--sbk-branco` etc. com os valores antigos (`#1f3a3a`), elas vão sobrescrever as da lib. Remova essas definições e use as da lib.
|
|
66
|
+
|
|
67
|
+
## 3. Props que mudaram
|
|
68
|
+
|
|
69
|
+
| Componente | 1.x | 2.0 |
|
|
70
|
+
| --- | --- | --- |
|
|
71
|
+
| `Button` | `palette="verde-vibrante"` e demais paletas | Removido. Use `variant`: `primary`, `secondary`, `outline`, `ghost`, `link`, `inverse`, `glass`, `success`, `error`, `warning`, `info`, `neutral` |
|
|
72
|
+
| `Button` | `type` implícito `submit` | Padrão `type="button"`. Informe `type="submit"` nos formulários |
|
|
73
|
+
| `Button` | `isLoading` removia o texto | O texto fica invisível (preserva a largura) e o botão recebe `aria-busy` |
|
|
74
|
+
| `Title` | `gradient` | Removido (brand book: sem gradientes em texto) |
|
|
75
|
+
| `Title`, `Subtitle`, `Paragraph` | `weight`: `normal`, `medium`, `bold`, `extrabold` | Ainda aceitos, **deprecados**. São mapeados para `light` (300) ou `semibold` (600). Prefira `light` ou `semibold` |
|
|
76
|
+
| `Title` | padrão `weight="bold"` | padrão `semibold`, cor Verde Escuro (`color="heading"`) |
|
|
77
|
+
| `Subtitle` | padrão `weight="normal"` | padrão `semibold` (brand book: subtítulos em Seminegrito) |
|
|
78
|
+
| `Paragraph` | padrão `weight="normal"` (400) | padrão `light` (300) |
|
|
79
|
+
| `Alert` | sempre `role="alert"` | `info`/`success` usam `role="status"`; `warning`/`error` continuam `alert` |
|
|
80
|
+
| `Modal` | `role="dialog"` no overlay | `role="dialog"` no painel. Renderizado em portal no `<body>` |
|
|
81
|
+
| `NumberInput` | `value` string ou number | `value?: number \| null` |
|
|
82
|
+
| `Tooltip` | tooltip sempre no DOM | Sem mudança de API; agora com `side` `left`/`right` e atraso configurável |
|
|
83
|
+
| `Header` | fundo `#1F3A3A`, título em Sora | `variant`: `solid` (Verde Escuro), `light`, `glass`; logo oficial via `logoVariant` |
|
|
84
|
+
| `Footer` | cor do logo via JS | Cor via tokens (acompanha o tema sem JS). Novas props `links`, `copyright`, `variant` |
|
|
85
|
+
| `useTheme` | `{ theme, toggleTheme }` | Mesmos campos, mais `preference`, `setTheme`, `brand`, `setBrand` |
|
|
86
|
+
|
|
87
|
+
## 4. Checklist
|
|
88
|
+
|
|
89
|
+
- [ ] `npm install @sbkbs/ui@^2`
|
|
90
|
+
- [ ] Imports de CSS atualizados, incluindo a fonte
|
|
91
|
+
- [ ] Overrides de `--md-*`/`--brand-*` removidos ou trocados por `--sbk-*`
|
|
92
|
+
- [ ] Variáveis próprias `--sbk-*` com valores antigos removidas do app
|
|
93
|
+
- [ ] `palette` e `gradient` removidos dos usos de `Button` e `Title`
|
|
94
|
+
- [ ] Botões de submit com `type="submit"` explícito
|
|
95
|
+
- [ ] Testes que buscavam `role="alert"` em alertas informativos atualizados para `status`
|
|
96
|
+
- [ ] Revisão visual em claro e escuro
|
package/README.md
CHANGED
|
@@ -1,115 +1,221 @@
|
|
|
1
|
-
# @sbkbs/ui
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
```tsx
|
|
37
|
-
import { ThemeProvider } from '@sbkbs/ui';
|
|
38
|
-
|
|
39
|
-
root.render(
|
|
40
|
-
<ThemeProvider defaultTheme="
|
|
41
|
-
<App />
|
|
42
|
-
</ThemeProvider
|
|
43
|
-
);
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
<
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
1
|
+
# @sbkbs/ui
|
|
2
|
+
|
|
3
|
+
Design system da SBK para React, construído sobre o **Brand Book SBK 2026**: tokens de marca, 50+ componentes acessíveis, tema claro/escuro, temas SBK IA e SBK institucional, e superfície Liquid Glass opcional.
|
|
4
|
+
|
|
5
|
+
- Tokens em CSS custom properties (`--sbk-*`), usáveis com ou sem Tailwind
|
|
6
|
+
- Preset para Tailwind CSS v4 (`bg-sbk-primary`, `text-sbk-fg-muted`, `rounded-sbk-md`)
|
|
7
|
+
- CSS pré-compilado **sem reset global**: não interfere no CSS da sua aplicação
|
|
8
|
+
- Somente os pesos tipográficos da marca (300 e 600) e a paleta oficial
|
|
9
|
+
- Acessibilidade WCAG 2.1 AA: foco visível, navegação por teclado, ARIA e `prefers-reduced-motion`
|
|
10
|
+
- Ícones com [lucide-react](https://lucide.dev)
|
|
11
|
+
- ESM com tree-shaking + CJS, tipos TypeScript incluídos
|
|
12
|
+
|
|
13
|
+
> Vindo da 1.x? Leia o [guia de migração](./MIGRATION.md).
|
|
14
|
+
|
|
15
|
+
## Instalação
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install @sbkbs/ui
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Peer dependencies: `react` e `react-dom` 18 ou superior.
|
|
22
|
+
|
|
23
|
+
## Configuração
|
|
24
|
+
|
|
25
|
+
No entry da aplicação (ex.: `main.tsx`), importe o CSS **uma vez**:
|
|
26
|
+
|
|
27
|
+
```tsx
|
|
28
|
+
import '@sbkbs/ui/reset.css'; // apenas em apps SEM Tailwind (quem usa Tailwind já tem o preflight)
|
|
29
|
+
import '@sbkbs/ui/styles.css'; // obrigatório: tokens + estilos dos componentes
|
|
30
|
+
import '@sbkbs/ui/fonts.css'; // opcional: Plus Jakarta Sans 300/600 via Google Fonts
|
|
31
|
+
import '@sbkbs/ui/base.css'; // opcional: aplica fonte, fundo e pesos da marca ao documento
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Envolva a aplicação com o `ThemeProvider`:
|
|
35
|
+
|
|
36
|
+
```tsx
|
|
37
|
+
import { ThemeProvider } from '@sbkbs/ui';
|
|
38
|
+
|
|
39
|
+
root.render(
|
|
40
|
+
<ThemeProvider defaultTheme="system" defaultBrand="sbk-ia">
|
|
41
|
+
<App />
|
|
42
|
+
</ThemeProvider>,
|
|
43
|
+
);
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
| Arquivo | Conteúdo |
|
|
47
|
+
| --- | --- |
|
|
48
|
+
| `@sbkbs/ui/styles.css` | Tokens e estilos dos componentes (sem preflight) |
|
|
49
|
+
| `@sbkbs/ui/tokens.css` | Apenas as variáveis CSS |
|
|
50
|
+
| `@sbkbs/ui/tailwind.css` | Preset `@theme` para Tailwind CSS v4 |
|
|
51
|
+
| `@sbkbs/ui/base.css` | Estilos base opcionais do documento |
|
|
52
|
+
| `@sbkbs/ui/fonts.css` | Import da fonte oficial (pesos 300 e 600) |
|
|
53
|
+
| `@sbkbs/ui/reset.css` | Reset (preflight do Tailwind 4) para apps sem Tailwind |
|
|
54
|
+
| `@sbkbs/ui/assets/favicon/*` | Favicons e ícones de app oficiais |
|
|
55
|
+
|
|
56
|
+
### Fonte hospedada localmente
|
|
57
|
+
|
|
58
|
+
Se preferir não depender do Google Fonts, não importe `fonts.css` e use `@fontsource/plus-jakarta-sans` com os pesos 300 e 600.
|
|
59
|
+
|
|
60
|
+
### Com Tailwind CSS v4
|
|
61
|
+
|
|
62
|
+
Para usar os mesmos tokens nas classes da sua aplicação:
|
|
63
|
+
|
|
64
|
+
```css
|
|
65
|
+
/* index.css */
|
|
66
|
+
@import 'tailwindcss';
|
|
67
|
+
@import '@sbkbs/ui/tailwind.css';
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
```tsx
|
|
71
|
+
<div className="rounded-sbk-md bg-sbk-surface p-4 text-sbk-fg shadow-sbk-sm">
|
|
72
|
+
<h2 className="font-semibold text-sbk-fg-heading">Título</h2>
|
|
73
|
+
<p className="font-light text-sbk-fg-muted">Texto de apoio</p>
|
|
74
|
+
</div>
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
O preset não altera as cores, raios e sombras padrão do Tailwind: tudo da marca fica sob o namespace `sbk`.
|
|
78
|
+
|
|
79
|
+
Cores de estado em texto e ícones: use as variantes `-fg` (`text-sbk-error-fg`, `text-sbk-success-fg`), que ficam mais claras no tema escuro para manter o contraste. As cores base (`bg-sbk-error`) são para fundos com texto branco.
|
|
80
|
+
|
|
81
|
+
### Favicons
|
|
82
|
+
|
|
83
|
+
```html
|
|
84
|
+
<link rel="icon" type="image/png" href="/favicon-96x96.png" sizes="96x96" />
|
|
85
|
+
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
|
86
|
+
<link rel="shortcut icon" href="/favicon.ico" />
|
|
87
|
+
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
|
|
88
|
+
<link rel="manifest" href="/site.webmanifest" />
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Copie os arquivos de `node_modules/@sbkbs/ui/dist/assets/favicon/` para a pasta `public/` da aplicação e ajuste `name` e `short_name` no `site.webmanifest`.
|
|
92
|
+
|
|
93
|
+
## Temas
|
|
94
|
+
|
|
95
|
+
| Atributo no `<html>` | Efeito |
|
|
96
|
+
| --- | --- |
|
|
97
|
+
| (padrão) | SBK IA, produto digital: primária Verde Claro `#0A5A52` |
|
|
98
|
+
| `data-brand="sbk"` | SBK institucional: primária Verde Escuro `#023631` |
|
|
99
|
+
| `data-theme="dark"` | Modo escuro |
|
|
100
|
+
|
|
101
|
+
O `ThemeProvider` controla esses atributos:
|
|
102
|
+
|
|
103
|
+
```tsx
|
|
104
|
+
const { theme, preference, setTheme, toggleTheme, brand, setBrand } = useTheme();
|
|
105
|
+
setTheme('system'); // 'light' | 'dark' | 'system'
|
|
106
|
+
setBrand('sbk'); // 'sbk-ia' | 'sbk'
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Em SSR, defina `data-theme` no HTML inicial para evitar o flash de tema no primeiro paint.
|
|
110
|
+
|
|
111
|
+
## Componentes
|
|
112
|
+
|
|
113
|
+
| Categoria | Componentes |
|
|
114
|
+
| --- | --- |
|
|
115
|
+
| Marca e tipografia | `Logo`, `Title`, `Subtitle`, `Paragraph`, `Highlight`, `Icon` |
|
|
116
|
+
| Ações | `Button`, `IconButton`, `DropdownMenu` |
|
|
117
|
+
| Formulários | `Field`, `Input`, `NumberInput`, `Select`, `Combobox`, `Textarea`, `Checkbox`, `Radio`, `Switch`, `FileUpload` |
|
|
118
|
+
| Superfícies e dados | `Card` (+ `CardHeader`, `CardTitle`, `CardDescription`, `CardContent`, `CardFooter`), `MiniCard`, `GlassPanel`, `Table`, `Badge`, `Tag`, `Chip`, `Avatar`, `Divider`, `EmptyState` |
|
|
119
|
+
| Feedback e carregamento | `Alert`, `Toast`/`ToastProvider`/`useToast`, `Spinner`, `Skeleton`, `ProgressBar` |
|
|
120
|
+
| Overlays | `Modal`, `Popover`, `Tooltip`, `Accordion`, `Tabs` |
|
|
121
|
+
| Navegação e estrutura | `Header`, `Footer`, `SideNav`, `Sidebar`, `Topbar`, `Breadcrumb`, `Pagination`, `Stepper`, `PageHeader`, `SectionHeader`, `Container`, `Stack`, `Grid` |
|
|
122
|
+
| Utilidades | `cn`, `sbkTokens`, `sbkChartPalette`, `getInitials`, `getPageTokens` |
|
|
123
|
+
|
|
124
|
+
A documentação interativa de cada componente, com props e estados, está no Storybook (`npm run storybook`).
|
|
125
|
+
|
|
126
|
+
### Exemplos
|
|
127
|
+
|
|
128
|
+
```tsx
|
|
129
|
+
import { Save, Search } from 'lucide-react';
|
|
130
|
+
import { Button, IconButton, Input, MiniCard, useToast } from '@sbkbs/ui';
|
|
131
|
+
|
|
132
|
+
<Button leftIcon={<Save />} isLoading={saving}>Salvar</Button>
|
|
133
|
+
<Button variant="outline">Cancelar</Button>
|
|
134
|
+
<IconButton aria-label="Buscar"><Search /></IconButton>
|
|
135
|
+
|
|
136
|
+
<Input label="E-mail" error={errors.email} helperText="Usaremos para notificações" />
|
|
137
|
+
|
|
138
|
+
<MiniCard label="Documentos" value="1.284" delta="+12%" trend="up" />
|
|
139
|
+
|
|
140
|
+
const { pushToast } = useToast();
|
|
141
|
+
pushToast({ tone: 'success', title: 'Salvo', description: 'Alterações registradas.' });
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
Navegação lateral integrada ao React Router:
|
|
145
|
+
|
|
146
|
+
```tsx
|
|
147
|
+
import { NavLink } from 'react-router-dom';
|
|
148
|
+
import { SideNav } from '@sbkbs/ui';
|
|
149
|
+
|
|
150
|
+
<SideNav
|
|
151
|
+
activeId={currentId}
|
|
152
|
+
sections={[{ id: 'main', items: [{ id: 'docs', label: 'Documentos', href: '/docs' }] }]}
|
|
153
|
+
renderLink={({ href, ...props }) => <NavLink to={href} {...props} />}
|
|
154
|
+
/>;
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### Liquid Glass
|
|
158
|
+
|
|
159
|
+
Superfície translúcida inspirada no material da Apple, opcional e pensada para camadas sobre conteúdo:
|
|
160
|
+
|
|
161
|
+
```tsx
|
|
162
|
+
<GlassPanel strong blur="lg">...</GlassPanel>
|
|
163
|
+
<Header variant="glass" />
|
|
164
|
+
<Card variant="glass" />
|
|
165
|
+
<Modal variant="glass" />
|
|
166
|
+
<Button variant="glass" />
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
Em `prefers-reduced-transparency` ou em navegadores sem `backdrop-filter`, a superfície fica opaca automaticamente. Verifique o contraste do texto sobre o conteúdo de fundo.
|
|
170
|
+
|
|
171
|
+
## Regras da marca aplicadas pela lib
|
|
172
|
+
|
|
173
|
+
- Paleta oficial apenas, sempre via tokens. O build da lib não gera classes de cor fora da marca.
|
|
174
|
+
- Plus Jakarta Sans em dois pesos: 600 (títulos) e 300 (corpo). Fallback Calibri.
|
|
175
|
+
- Fundo Off White `#ECEFF3` ou branco.
|
|
176
|
+
- Cantos de 8 a 16 px em cards e blocos.
|
|
177
|
+
- Sombras leves, sem ornamentos, sem emojis na interface.
|
|
178
|
+
- Logo a partir dos SVGs oficiais, sem distorção, sombra ou gradiente.
|
|
179
|
+
|
|
180
|
+
Referência completa: [`docs/SBK_BRAND_GUIDE.md`](../docs/SBK_BRAND_GUIDE.md).
|
|
181
|
+
|
|
182
|
+
## Desenvolvimento
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
npm run storybook # documentação interativa (porta 6006)
|
|
186
|
+
npm run playground # vitrine com todos os componentes
|
|
187
|
+
npm run test # testes unitários (Vitest + Testing Library)
|
|
188
|
+
npm run test:visual # testes E2E de acessibilidade (Playwright)
|
|
189
|
+
npm run typecheck && npm run lint && npm run format:check
|
|
190
|
+
npm run build # gera dist/
|
|
191
|
+
npm run pack:check # confere o conteúdo do pacote antes de publicar
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
### Estrutura
|
|
195
|
+
|
|
196
|
+
```text
|
|
197
|
+
ui/src/
|
|
198
|
+
styles/ tokens.css, tailwind-theme.css (preset), core.css, lib.css, base.css, fonts.css
|
|
199
|
+
theme/ ThemeProvider, tokens.ts
|
|
200
|
+
utils/ cn, fragmentos de estilo compartilhados (foco, campos, escopo invertido)
|
|
201
|
+
components/ um diretório por componente: .tsx, .test.tsx, .stories.tsx
|
|
202
|
+
assets/ favicons oficiais
|
|
203
|
+
playground/ vitrine local
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
### Convenções
|
|
207
|
+
|
|
208
|
+
- Componentes consomem apenas tokens semânticos (`bg-sbk-primary`, `text-sbk-fg-muted`), nunca hex nem nomes legados.
|
|
209
|
+
- IDs de acessibilidade com `useId`, nunca `Math.random`.
|
|
210
|
+
- Todo elemento interativo usa o anel de foco padrão (`focusRing` em `utils/styles.ts`).
|
|
211
|
+
- Animações respeitam `motion-reduce`.
|
|
212
|
+
- Novo componente: exportar em `src/index.ts`, com teste e story.
|
|
213
|
+
|
|
214
|
+
### Publicação
|
|
215
|
+
|
|
216
|
+
O workflow `.github/workflows/release.yml` publica no npm com Changesets. Para uma nova versão:
|
|
217
|
+
|
|
218
|
+
```bash
|
|
219
|
+
npm run changeset # descreve a mudança e o tipo (patch/minor/major)
|
|
220
|
+
git commit && git push # o CI abre o PR de release; o merge publica
|
|
221
|
+
```
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="361" height="172" viewBox="0 0 361 172"><metadata><rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"><rdf:Description><dc:creator>RealFaviconGenerator</dc:creator><dc:source>https://realfavicongenerator.net</dc:source></rdf:Description></rdf:RDF></metadata><image width="361" height="172" xlink:href="data:image/png;base64,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"></image></svg>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "SBK",
|
|
3
|
+
"short_name": "SBK",
|
|
4
|
+
"icons": [
|
|
5
|
+
{
|
|
6
|
+
"src": "/web-app-manifest-192x192.png",
|
|
7
|
+
"sizes": "192x192",
|
|
8
|
+
"type": "image/png",
|
|
9
|
+
"purpose": "maskable"
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"src": "/web-app-manifest-512x512.png",
|
|
13
|
+
"sizes": "512x512",
|
|
14
|
+
"type": "image/png",
|
|
15
|
+
"purpose": "maskable"
|
|
16
|
+
}
|
|
17
|
+
],
|
|
18
|
+
"theme_color": "#023631",
|
|
19
|
+
"background_color": "#ECEFF3",
|
|
20
|
+
"display": "standalone"
|
|
21
|
+
}
|
|
Binary file
|
|
Binary file
|
package/dist/base.css
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/* ============================================================
|
|
2
|
+
@sbkbs/ui · Base opcional (import '@sbkbs/ui/base.css')
|
|
3
|
+
Aplica fonte, pesos e fundo da marca ao documento.
|
|
4
|
+
Especificidade zero (:where) para o app sobrescrever sem esforço.
|
|
5
|
+
============================================================ */
|
|
6
|
+
|
|
7
|
+
@layer base {
|
|
8
|
+
:where(html) {
|
|
9
|
+
font-family: var(--sbk-font-family);
|
|
10
|
+
-webkit-font-smoothing: antialiased;
|
|
11
|
+
-moz-osx-font-smoothing: grayscale;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
:where(body) {
|
|
15
|
+
margin: 0;
|
|
16
|
+
background-color: var(--sbk-color-bg);
|
|
17
|
+
color: var(--sbk-color-fg);
|
|
18
|
+
font-weight: var(--sbk-font-weight-body);
|
|
19
|
+
line-height: 1.5;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
:where(h1, h2, h3, h4, h5, h6, strong, b, th) {
|
|
23
|
+
font-weight: var(--sbk-font-weight-heading);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
:where(h1, h2, h3, h4, h5, h6) {
|
|
27
|
+
color: var(--sbk-color-fg-heading);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
@media (prefers-reduced-motion: reduce) {
|
|
31
|
+
:where(*, *::before, *::after) {
|
|
32
|
+
animation-duration: 0.01ms !important;
|
|
33
|
+
animation-iteration-count: 1 !important;
|
|
34
|
+
transition-duration: 0.01ms !important;
|
|
35
|
+
scroll-behavior: auto !important;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -1,11 +1,23 @@
|
|
|
1
1
|
import type React from 'react';
|
|
2
2
|
export interface AccordionItem {
|
|
3
3
|
content: React.ReactNode;
|
|
4
|
+
disabled?: boolean;
|
|
4
5
|
id: string;
|
|
5
6
|
title: React.ReactNode;
|
|
6
7
|
}
|
|
7
8
|
export interface AccordionProps {
|
|
9
|
+
className?: string;
|
|
10
|
+
/** Item aberto inicialmente (modo single). */
|
|
8
11
|
defaultOpenId?: string;
|
|
12
|
+
/** Itens abertos inicialmente (modo multiple). */
|
|
13
|
+
defaultOpenIds?: string[];
|
|
9
14
|
items: AccordionItem[];
|
|
15
|
+
/** `single`: um item aberto por vez. `multiple`: vários. Padrão: single. */
|
|
16
|
+
type?: 'single' | 'multiple';
|
|
17
|
+
/** `separated`: cards independentes. `flush`: lista contínua com divisórias. */
|
|
18
|
+
variant?: 'separated' | 'flush';
|
|
10
19
|
}
|
|
11
|
-
export declare const Accordion:
|
|
20
|
+
export declare const Accordion: {
|
|
21
|
+
({ items, defaultOpenId, defaultOpenIds, type, variant, className, }: AccordionProps): import("react/jsx-runtime").JSX.Element;
|
|
22
|
+
displayName: string;
|
|
23
|
+
};
|