@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.
Files changed (210) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/MIGRATION.md +96 -0
  3. package/README.md +221 -115
  4. package/dist/assets/favicon/apple-touch-icon.png +0 -0
  5. package/dist/assets/favicon/favicon-96x96.png +0 -0
  6. package/dist/assets/favicon/favicon.ico +0 -0
  7. package/dist/assets/favicon/favicon.svg +1 -0
  8. package/dist/assets/favicon/site.webmanifest +21 -0
  9. package/dist/assets/favicon/web-app-manifest-192x192.png +0 -0
  10. package/dist/assets/favicon/web-app-manifest-512x512.png +0 -0
  11. package/dist/base.css +38 -0
  12. package/dist/components/Accordion/Accordion.d.ts +13 -1
  13. package/dist/components/Accordion/Accordion.js +100 -52
  14. package/dist/components/Accordion/Accordion.js.map +1 -1
  15. package/dist/components/Alert/Alert.d.ts +17 -4
  16. package/dist/components/Alert/Alert.js +64 -20
  17. package/dist/components/Alert/Alert.js.map +1 -1
  18. package/dist/components/Avatar/Avatar.d.ts +12 -6
  19. package/dist/components/Avatar/Avatar.js +66 -0
  20. package/dist/components/Avatar/Avatar.js.map +1 -0
  21. package/dist/components/Badge/Badge.d.ts +11 -2
  22. package/dist/components/Badge/Badge.js +42 -30
  23. package/dist/components/Badge/Badge.js.map +1 -1
  24. package/dist/components/Breadcrumb/Breadcrumb.d.ts +5 -2
  25. package/dist/components/Breadcrumb/Breadcrumb.js +23 -16
  26. package/dist/components/Breadcrumb/Breadcrumb.js.map +1 -1
  27. package/dist/components/Button/Button.d.ts +10 -8
  28. package/dist/components/Button/Button.js +73 -114
  29. package/dist/components/Button/Button.js.map +1 -1
  30. package/dist/components/Card/Card.d.ts +33 -3
  31. package/dist/components/Card/Card.js +91 -30
  32. package/dist/components/Card/Card.js.map +1 -1
  33. package/dist/components/Checkbox/Checkbox.d.ts +4 -1
  34. package/dist/components/Checkbox/Checkbox.js +32 -31
  35. package/dist/components/Checkbox/Checkbox.js.map +1 -1
  36. package/dist/components/Chip/Chip.d.ts +7 -1
  37. package/dist/components/Chip/Chip.js +19 -9
  38. package/dist/components/Chip/Chip.js.map +1 -1
  39. package/dist/components/Combobox/Combobox.d.ts +10 -2
  40. package/dist/components/Combobox/Combobox.js +146 -133
  41. package/dist/components/Combobox/Combobox.js.map +1 -1
  42. package/dist/components/Divider/Divider.d.ts +7 -1
  43. package/dist/components/Divider/Divider.js +28 -12
  44. package/dist/components/Divider/Divider.js.map +1 -1
  45. package/dist/components/DropdownMenu/DropdownMenu.d.ts +33 -0
  46. package/dist/components/DropdownMenu/DropdownMenu.js +147 -0
  47. package/dist/components/DropdownMenu/DropdownMenu.js.map +1 -0
  48. package/dist/components/EmptyState/EmptyState.d.ts +7 -1
  49. package/dist/components/EmptyState/EmptyState.js +28 -19
  50. package/dist/components/EmptyState/EmptyState.js.map +1 -1
  51. package/dist/components/Field/Field.d.ts +21 -0
  52. package/dist/components/Field/Field.js +35 -0
  53. package/dist/components/Field/Field.js.map +1 -0
  54. package/dist/components/FileUpload/FileUpload.d.ts +9 -2
  55. package/dist/components/FileUpload/FileUpload.js +128 -102
  56. package/dist/components/FileUpload/FileUpload.js.map +1 -1
  57. package/dist/components/Footer/Footer.d.ts +19 -6
  58. package/dist/components/Footer/Footer.js +47 -115
  59. package/dist/components/Footer/Footer.js.map +1 -1
  60. package/dist/components/GlassPanel/GlassPanel.d.ts +18 -0
  61. package/dist/components/GlassPanel/GlassPanel.js +39 -0
  62. package/dist/components/GlassPanel/GlassPanel.js.map +1 -0
  63. package/dist/components/Header/Header.d.ts +25 -14
  64. package/dist/components/Header/Header.js +88 -148
  65. package/dist/components/Header/Header.js.map +1 -1
  66. package/dist/components/Highlight/Highlight.d.ts +13 -0
  67. package/dist/components/Highlight/Highlight.js +18 -0
  68. package/dist/components/Highlight/Highlight.js.map +1 -0
  69. package/dist/components/Icon/Icon.d.ts +21 -0
  70. package/dist/components/Icon/Icon.js +31 -0
  71. package/dist/components/Icon/Icon.js.map +1 -0
  72. package/dist/components/IconButton/IconButton.d.ts +12 -0
  73. package/dist/components/IconButton/IconButton.js +49 -0
  74. package/dist/components/IconButton/IconButton.js.map +1 -0
  75. package/dist/components/Input/Input.d.ts +3 -2
  76. package/dist/components/Input/Input.js +51 -69
  77. package/dist/components/Input/Input.js.map +1 -1
  78. package/dist/components/Layout/Layout.d.ts +2 -0
  79. package/dist/components/Layout/Layout.js +24 -18
  80. package/dist/components/Layout/Layout.js.map +1 -1
  81. package/dist/components/Logo/Logo.d.ts +27 -0
  82. package/dist/components/Logo/Logo.js +107 -0
  83. package/dist/components/Logo/Logo.js.map +1 -0
  84. package/dist/components/MiniCard/MiniCard.d.ts +21 -0
  85. package/dist/components/MiniCard/MiniCard.js +90 -0
  86. package/dist/components/MiniCard/MiniCard.js.map +1 -0
  87. package/dist/components/Modal/Modal.d.ts +16 -3
  88. package/dist/components/Modal/Modal.js +124 -93
  89. package/dist/components/Modal/Modal.js.map +1 -1
  90. package/dist/components/Navigation/Navigation.d.ts +1 -0
  91. package/dist/components/Navigation/Navigation.js +14 -14
  92. package/dist/components/Navigation/Navigation.js.map +1 -1
  93. package/dist/components/NumberInput/NumberInput.d.ts +5 -2
  94. package/dist/components/NumberInput/NumberInput.js +98 -128
  95. package/dist/components/NumberInput/NumberInput.js.map +1 -1
  96. package/dist/components/PageHeader/PageHeader.d.ts +8 -1
  97. package/dist/components/PageHeader/PageHeader.js +26 -25
  98. package/dist/components/PageHeader/PageHeader.js.map +1 -1
  99. package/dist/components/Pagination/Pagination.d.ts +15 -2
  100. package/dist/components/Pagination/Pagination.js +68 -34
  101. package/dist/components/Pagination/Pagination.js.map +1 -1
  102. package/dist/components/Paragraph/Paragraph.d.ts +8 -2
  103. package/dist/components/Paragraph/Paragraph.js +39 -36
  104. package/dist/components/Paragraph/Paragraph.js.map +1 -1
  105. package/dist/components/Popover/Popover.d.ts +12 -1
  106. package/dist/components/Popover/Popover.js +49 -37
  107. package/dist/components/Popover/Popover.js.map +1 -1
  108. package/dist/components/ProgressBar/ProgressBar.d.ts +12 -6
  109. package/dist/components/ProgressBar/ProgressBar.js +71 -0
  110. package/dist/components/ProgressBar/ProgressBar.js.map +1 -0
  111. package/dist/components/Radio/Radio.d.ts +2 -1
  112. package/dist/components/Radio/Radio.js +27 -31
  113. package/dist/components/Radio/Radio.js.map +1 -1
  114. package/dist/components/SectionHeader/SectionHeader.d.ts +6 -1
  115. package/dist/components/SectionHeader/SectionHeader.js +14 -12
  116. package/dist/components/SectionHeader/SectionHeader.js.map +1 -1
  117. package/dist/components/Select/Select.d.ts +6 -2
  118. package/dist/components/Select/Select.js +47 -35
  119. package/dist/components/Select/Select.js.map +1 -1
  120. package/dist/components/SideNav/SideNav.d.ts +55 -0
  121. package/dist/components/SideNav/SideNav.js +141 -0
  122. package/dist/components/SideNav/SideNav.js.map +1 -0
  123. package/dist/components/Skeleton/Skeleton.d.ts +12 -1
  124. package/dist/components/Skeleton/Skeleton.js +33 -18
  125. package/dist/components/Skeleton/Skeleton.js.map +1 -1
  126. package/dist/components/Spinner/Spinner.d.ts +11 -3
  127. package/dist/components/Spinner/Spinner.js +57 -0
  128. package/dist/components/Spinner/Spinner.js.map +1 -0
  129. package/dist/components/Stepper/Stepper.d.ts +1 -1
  130. package/dist/components/Stepper/Stepper.js +41 -53
  131. package/dist/components/Stepper/Stepper.js.map +1 -1
  132. package/dist/components/Subtitle/Subtitle.d.ts +9 -3
  133. package/dist/components/Subtitle/Subtitle.js +29 -35
  134. package/dist/components/Subtitle/Subtitle.js.map +1 -1
  135. package/dist/components/Switch/Switch.d.ts +2 -1
  136. package/dist/components/Switch/Switch.js +45 -33
  137. package/dist/components/Switch/Switch.js.map +1 -1
  138. package/dist/components/Table/Table.d.ts +19 -1
  139. package/dist/components/Table/Table.js +48 -11
  140. package/dist/components/Table/Table.js.map +1 -1
  141. package/dist/components/Tabs/Tabs.d.ts +16 -2
  142. package/dist/components/Tabs/Tabs.js +80 -44
  143. package/dist/components/Tabs/Tabs.js.map +1 -1
  144. package/dist/components/Tag/Tag.d.ts +8 -1
  145. package/dist/components/Tag/Tag.js +27 -12
  146. package/dist/components/Tag/Tag.js.map +1 -1
  147. package/dist/components/Textarea/Textarea.d.ts +3 -1
  148. package/dist/components/Textarea/Textarea.js +36 -40
  149. package/dist/components/Textarea/Textarea.js.map +1 -1
  150. package/dist/components/Title/Title.d.ts +9 -3
  151. package/dist/components/Title/Title.js +42 -42
  152. package/dist/components/Title/Title.js.map +1 -1
  153. package/dist/components/Toast/Toast.d.ts +39 -11
  154. package/dist/components/Toast/Toast.js +130 -76
  155. package/dist/components/Toast/Toast.js.map +1 -1
  156. package/dist/components/Tooltip/Tooltip.d.ts +12 -2
  157. package/dist/components/Tooltip/Tooltip.js +50 -32
  158. package/dist/components/Tooltip/Tooltip.js.map +1 -1
  159. package/dist/components/Typography/weight.d.ts +9 -0
  160. package/dist/components/Typography/weight.js +5 -0
  161. package/dist/components/Typography/weight.js.map +1 -0
  162. package/dist/fonts.css +8 -0
  163. package/dist/index.cjs +2 -0
  164. package/dist/index.cjs.map +1 -0
  165. package/dist/index.d.ts +55 -43
  166. package/dist/index.js +118 -83
  167. package/dist/index.js.map +1 -1
  168. package/dist/reset.css +9 -0
  169. package/dist/styles.css +1 -0
  170. package/dist/tailwind.css +153 -0
  171. package/dist/theme/ThemeProvider.d.ts +21 -3
  172. package/dist/theme/ThemeProvider.js +57 -18
  173. package/dist/theme/ThemeProvider.js.map +1 -1
  174. package/dist/theme/tokens.d.ts +43 -0
  175. package/dist/theme/tokens.js +39 -0
  176. package/dist/theme/tokens.js.map +1 -0
  177. package/dist/theme.css +296 -263
  178. package/dist/tokens.css +327 -0
  179. package/dist/utils/cn.d.ts +2 -2
  180. package/dist/utils/cn.js +19 -4
  181. package/dist/utils/cn.js.map +1 -1
  182. package/dist/utils/styles.d.ts +37 -0
  183. package/dist/utils/styles.js +35 -0
  184. package/dist/utils/styles.js.map +1 -0
  185. package/package.json +140 -117
  186. package/dist/components/Accordion/Accordion.stories.d.ts +0 -7
  187. package/dist/components/Alert/Alert.stories.d.ts +0 -8
  188. package/dist/components/Badge/Badge.stories.d.ts +0 -8
  189. package/dist/components/Breadcrumb/Breadcrumb.stories.d.ts +0 -8
  190. package/dist/components/Button/Button.stories.d.ts +0 -7
  191. package/dist/components/Card/Card.stories.d.ts +0 -8
  192. package/dist/components/Checkbox/Checkbox.stories.d.ts +0 -7
  193. package/dist/components/Combobox/Combobox.stories.d.ts +0 -9
  194. package/dist/components/Feedback/Feedback.stories.d.ts +0 -5
  195. package/dist/components/FileUpload/FileUpload.stories.d.ts +0 -10
  196. package/dist/components/Input/Input.stories.d.ts +0 -9
  197. package/dist/components/Modal/Modal.stories.d.ts +0 -8
  198. package/dist/components/NumberInput/NumberInput.stories.d.ts +0 -8
  199. package/dist/components/Pagination/Pagination.stories.d.ts +0 -8
  200. package/dist/components/Radio/Radio.stories.d.ts +0 -7
  201. package/dist/components/Select/Select.stories.d.ts +0 -8
  202. package/dist/components/Stepper/Stepper.stories.d.ts +0 -8
  203. package/dist/components/Switch/Switch.stories.d.ts +0 -8
  204. package/dist/components/Tabs/Tabs.stories.d.ts +0 -8
  205. package/dist/components/Textarea/Textarea.stories.d.ts +0 -7
  206. package/dist/components/Toast/Toast.stories.d.ts +0 -8
  207. package/dist/oficios-ui.css +0 -1
  208. package/dist/oficios-ui.umd.cjs +0 -2
  209. package/dist/oficios-ui.umd.cjs.map +0 -1
  210. 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
- Biblioteca de componentes UI e tema global para manter o mesmo padrão visual entre projetos SBK BS.
4
-
5
- ## Conteúdo
6
-
7
- - **Tema**: variáveis CSS (Material Design 3) light/dark + **Guia de marca SBK** (cores e tipografia Jakarta) em `theme/theme.css` + `ThemeProvider` React.
8
- - **Componentes**: `Button`, `Card`, `Input`, `Modal`, `Title`, `Subtitle`, `Paragraph`, `Header`, `Footer`.
9
- - **Paletas de botão**: escolha a cor do botão primary via prop `palette` ou `data-button-palette` no pai (`verde-vibrante`, `grafite-azulado`, etc.).
10
-
11
- ## Uso em outro projeto
12
-
13
- ### 1. Instalar no monorepo
14
-
15
- No `package.json` do app (ex.: frontend), adicione:
16
-
17
- ```json
18
- "dependencies": {
19
- "@sbkbs/ui": "^1.0.2"
20
- }
21
- ```
22
-
23
- Rode `npm install` na raiz do monorepo.
24
-
25
- ### 2. Tema (variáveis CSS)
26
-
27
- Os componentes usam variáveis CSS (`--md-surface`, `--primary-color`, etc.). O consumidor pode:
28
-
29
- - Usar o tema da lib: `import '@sbkbs/ui/theme.css';` no entry (ex.: `main.tsx`), ou
30
- - Definir as mesmas variáveis no próprio CSS do projeto (o frontend OFICIO.IA já tem `theme.css` próprio).
31
-
32
- ### 3. ThemeProvider (opcional)
33
-
34
- Para light/dark com toggle e persistência em `localStorage`:
35
-
36
- ```tsx
37
- import { ThemeProvider } from '@sbkbs/ui';
38
-
39
- root.render(
40
- <ThemeProvider defaultTheme="light">
41
- <App />
42
- </ThemeProvider>
43
- );
44
- ```
45
-
46
- ### 4. Componentes
47
-
48
- ```tsx
49
- import { Button, Card, Input, Modal, Title, Subtitle, Paragraph, Header, Footer } from '@sbkbs/ui';
50
-
51
- <Button variant="primary" size="md" palette="verde-vibrante">Salvar</Button>
52
- <Card variant="elevated" padding="lg" hoverable>...</Card>
53
- <Input label="E-mail" size="md" />
54
- <Modal isOpen={open} onClose={() => setOpen(false)} title="Título">...</Modal>
55
- <Title size="2xl" weight="bold">Título</Title>
56
- <Subtitle size="md" muted>Subtítulo</Subtitle>
57
- <Paragraph size="md">Texto.</Paragraph>
58
-
59
- <Header
60
- logoSrc="/logo.png"
61
- logoDarkSrc="/logo-dark.png"
62
- title="OFÍCIO.IA"
63
- subtitle="Subtítulo"
64
- onLogoClick={() => navigate('/home')}
65
- rightContent={<>
66
- <LanguageSelector />
67
- <ThemeToggle />
68
- <UserMenu />
69
- </>}
70
- />
71
- <Footer poweredByText="Powered by" logoSrc="/logo.png" logoFallbackText="SBK" />
72
- ```
73
-
74
- ### Guia de marca (tema)
75
-
76
- Cores disponíveis como variáveis CSS: `--brand-verde-vibrante`, `--brand-grafite-azulado`, `--brand-verde-profundo`, `--brand-azul-acinzentado`, `--brand-cinza-medio`, `--brand-cinza-escuro`, `--brand-off-white`, e paleta "O Criador" (`--brand-azul-intenso`, `--brand-verde-lima`, etc.). Tipografia: `--font-primary` / `--font-heading` = Plus Jakarta Sans (Google Fonts).
77
-
78
- Paletas de botão (prop `palette` ou `data-button-palette` no pai): `verde-vibrante` | `verde-profundo` | `grafite-azulado` | `azul-acinzentado` | `cinza-medio` | `cinza-escuro` | `off-white`.
79
-
80
- ## Compartilhar com outro projeto
81
-
82
- - **Mesmo monorepo:** adicione o app em `workspaces` e use `"@sbkbs/ui": "*"` nas dependências; depois `npm install` na raiz.
83
- - **Outro repositório:** use dependência por Git (`"@sbkbs/ui": "git+https://..."`) ou publique em um registry npm e instale com `npm install @sbkbs/ui`.
84
-
85
- Guia completo: [docs/COMPARTILHAR_LIB_UI.md](../docs/COMPARTILHAR_LIB_UI.md).
86
-
87
- ## Desenvolvimento
88
-
89
- - **Build**: `npm run build` dentro de `ui`.
90
- - **Watch**: `npm run dev` dentro de `ui`.
91
- - **Playground**: `npm run playground`
92
- - **Storybook**: `npm run storybook`
93
- - **Testes**: `npm run test`
94
-
95
- ## Estrutura
96
-
97
- ```
98
- ui/
99
- src/
100
- index.ts
101
- theme/
102
- theme.css
103
- ThemeProvider.tsx
104
- components/
105
- Button/
106
- Card/
107
- Input/
108
- Modal/
109
- Title/
110
- Subtitle/
111
- Paragraph/
112
- Header/
113
- Footer/
114
- dist/
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
@@ -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
+ }
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: React.FC<AccordionProps>;
20
+ export declare const Accordion: {
21
+ ({ items, defaultOpenId, defaultOpenIds, type, variant, className, }: AccordionProps): import("react/jsx-runtime").JSX.Element;
22
+ displayName: string;
23
+ };