@sbkbs/ui 2.0.0-beta.0 → 2.0.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 (64) hide show
  1. package/CHANGELOG.md +57 -57
  2. package/dist/assets/favicon/site.webmanifest +21 -21
  3. package/dist/base.css +38 -38
  4. package/dist/components/Accordion/Accordion.js.map +1 -1
  5. package/dist/components/Alert/Alert.js.map +1 -1
  6. package/dist/components/Avatar/Avatar.js.map +1 -1
  7. package/dist/components/Badge/Badge.js.map +1 -1
  8. package/dist/components/Breadcrumb/Breadcrumb.js.map +1 -1
  9. package/dist/components/Button/Button.js.map +1 -1
  10. package/dist/components/Card/Card.js.map +1 -1
  11. package/dist/components/Checkbox/Checkbox.js.map +1 -1
  12. package/dist/components/Chip/Chip.js.map +1 -1
  13. package/dist/components/Combobox/Combobox.js.map +1 -1
  14. package/dist/components/Divider/Divider.js.map +1 -1
  15. package/dist/components/DropdownMenu/DropdownMenu.js.map +1 -1
  16. package/dist/components/EmptyState/EmptyState.js.map +1 -1
  17. package/dist/components/Field/Field.js.map +1 -1
  18. package/dist/components/FileUpload/FileUpload.js.map +1 -1
  19. package/dist/components/Footer/Footer.js.map +1 -1
  20. package/dist/components/GlassPanel/GlassPanel.js.map +1 -1
  21. package/dist/components/Header/Header.js.map +1 -1
  22. package/dist/components/Highlight/Highlight.js.map +1 -1
  23. package/dist/components/Icon/Icon.js.map +1 -1
  24. package/dist/components/IconButton/IconButton.js.map +1 -1
  25. package/dist/components/Input/Input.js.map +1 -1
  26. package/dist/components/Layout/Layout.js.map +1 -1
  27. package/dist/components/Logo/Logo.js.map +1 -1
  28. package/dist/components/MiniCard/MiniCard.js.map +1 -1
  29. package/dist/components/Modal/Modal.js.map +1 -1
  30. package/dist/components/Navigation/Navigation.js.map +1 -1
  31. package/dist/components/NumberInput/NumberInput.js.map +1 -1
  32. package/dist/components/PageHeader/PageHeader.js.map +1 -1
  33. package/dist/components/Pagination/Pagination.js.map +1 -1
  34. package/dist/components/Paragraph/Paragraph.js.map +1 -1
  35. package/dist/components/Popover/Popover.js.map +1 -1
  36. package/dist/components/ProgressBar/ProgressBar.js.map +1 -1
  37. package/dist/components/Radio/Radio.js.map +1 -1
  38. package/dist/components/SectionHeader/SectionHeader.js.map +1 -1
  39. package/dist/components/Select/Select.js.map +1 -1
  40. package/dist/components/SideNav/SideNav.js.map +1 -1
  41. package/dist/components/Skeleton/Skeleton.js.map +1 -1
  42. package/dist/components/Spinner/Spinner.js.map +1 -1
  43. package/dist/components/Stepper/Stepper.js.map +1 -1
  44. package/dist/components/Subtitle/Subtitle.js.map +1 -1
  45. package/dist/components/Switch/Switch.js.map +1 -1
  46. package/dist/components/Table/Table.js.map +1 -1
  47. package/dist/components/Tabs/Tabs.js.map +1 -1
  48. package/dist/components/Tag/Tag.js.map +1 -1
  49. package/dist/components/Textarea/Textarea.js.map +1 -1
  50. package/dist/components/Title/Title.js.map +1 -1
  51. package/dist/components/Toast/Toast.js.map +1 -1
  52. package/dist/components/Tooltip/Tooltip.js.map +1 -1
  53. package/dist/components/Typography/weight.js.map +1 -1
  54. package/dist/fonts.css +8 -8
  55. package/dist/index.cjs.map +1 -1
  56. package/dist/reset.css +9 -9
  57. package/dist/tailwind.css +153 -153
  58. package/dist/theme/ThemeProvider.js.map +1 -1
  59. package/dist/theme/tokens.js.map +1 -1
  60. package/dist/theme.css +327 -327
  61. package/dist/tokens.css +327 -327
  62. package/dist/utils/cn.js.map +1 -1
  63. package/dist/utils/styles.js.map +1 -1
  64. package/package.json +1 -1
package/dist/reset.css CHANGED
@@ -1,9 +1,9 @@
1
- /* ============================================================
2
- @sbkbs/ui · Reset opcional (import '@sbkbs/ui/reset.css')
3
- Preflight do Tailwind CSS v4 na camada base.
4
- Apps com Tailwind já têm este reset: não importe duas vezes.
5
- Apps sem Tailwind: importe antes de styles.css para um ponto de partida consistente.
6
- ============================================================ */
7
-
8
- @layer theme, base, components, utilities;
9
- @import 'tailwindcss/preflight.css' layer(base);
1
+ /* ============================================================
2
+ @sbkbs/ui · Reset opcional (import '@sbkbs/ui/reset.css')
3
+ Preflight do Tailwind CSS v4 na camada base.
4
+ Apps com Tailwind já têm este reset: não importe duas vezes.
5
+ Apps sem Tailwind: importe antes de styles.css para um ponto de partida consistente.
6
+ ============================================================ */
7
+
8
+ @layer theme, base, components, utilities;
9
+ @import 'tailwindcss/preflight.css' layer(base);
package/dist/tailwind.css CHANGED
@@ -1,153 +1,153 @@
1
- /* ============================================================
2
- @sbkbs/ui · Preset Tailwind CSS v4
3
- Mapeia os tokens (--sbk-*) para utilitários com namespace "sbk":
4
- bg-sbk-primary, text-sbk-fg-muted, border-sbk-line,
5
- rounded-sbk-md, shadow-sbk-sm, font-sbk, sbk-glass
6
-
7
- Uso em app com Tailwind 4:
8
- @import 'tailwindcss';
9
- @import '@sbkbs/ui/tailwind.css';
10
- Requer os tokens carregados (@sbkbs/ui/styles.css ou @sbkbs/ui/tokens.css).
11
- ============================================================ */
12
-
13
- @theme inline {
14
- /* Paleta oficial */
15
- --color-sbk-verde-escuro: var(--sbk-verde-escuro);
16
- --color-sbk-ciano-escuro: var(--sbk-ciano-escuro);
17
- --color-sbk-off-white: var(--sbk-off-white);
18
- --color-sbk-verde-claro: var(--sbk-verde-claro);
19
- --color-sbk-verde-profundo: var(--sbk-verde-profundo);
20
- --color-sbk-ciano: var(--sbk-ciano);
21
- --color-sbk-ciano-profundo: var(--sbk-ciano-profundo);
22
- --color-sbk-chumbo-leve: var(--sbk-chumbo-leve);
23
- --color-sbk-preto: var(--sbk-preto);
24
- --color-sbk-branco: var(--sbk-branco);
25
-
26
- /* Semânticos */
27
- --color-sbk-bg: var(--sbk-color-bg);
28
- --color-sbk-surface: var(--sbk-color-surface);
29
- --color-sbk-surface-sunken: var(--sbk-color-surface-sunken);
30
- --color-sbk-surface-hover: var(--sbk-color-surface-hover);
31
- --color-sbk-surface-inverse: var(--sbk-color-surface-inverse);
32
- --color-sbk-overlay: var(--sbk-color-overlay);
33
- --color-sbk-fg: var(--sbk-color-fg);
34
- --color-sbk-fg-heading: var(--sbk-color-fg-heading);
35
- --color-sbk-fg-muted: var(--sbk-color-fg-muted);
36
- --color-sbk-fg-inverse: var(--sbk-color-fg-inverse);
37
- --color-sbk-line: var(--sbk-color-line);
38
- --color-sbk-line-strong: var(--sbk-color-line-strong);
39
- --color-sbk-primary: var(--sbk-color-primary);
40
- --color-sbk-primary-hover: var(--sbk-color-primary-hover);
41
- --color-sbk-on-primary: var(--sbk-color-on-primary);
42
- --color-sbk-primary-subtle: var(--sbk-color-primary-subtle);
43
- --color-sbk-secondary: var(--sbk-color-secondary);
44
- --color-sbk-secondary-hover: var(--sbk-color-secondary-hover);
45
- --color-sbk-on-secondary: var(--sbk-color-on-secondary);
46
- --color-sbk-accent: var(--sbk-color-accent);
47
- --color-sbk-highlight-bg: var(--sbk-color-highlight-bg);
48
- --color-sbk-highlight-fg: var(--sbk-color-highlight-fg);
49
- --color-sbk-focus: var(--sbk-color-focus);
50
- --color-sbk-success: var(--sbk-color-success);
51
- --color-sbk-success-subtle: var(--sbk-color-success-subtle);
52
- --color-sbk-warning: var(--sbk-color-warning);
53
- --color-sbk-warning-subtle: var(--sbk-color-warning-subtle);
54
- --color-sbk-error: var(--sbk-color-error);
55
- --color-sbk-error-subtle: var(--sbk-color-error-subtle);
56
- --color-sbk-info: var(--sbk-color-info);
57
- --color-sbk-info-subtle: var(--sbk-color-info-subtle);
58
- --color-sbk-on-state: var(--sbk-color-on-state);
59
- --color-sbk-success-fg: var(--sbk-color-success-fg);
60
- --color-sbk-warning-fg: var(--sbk-color-warning-fg);
61
- --color-sbk-error-fg: var(--sbk-color-error-fg);
62
- --color-sbk-info-fg: var(--sbk-color-info-fg);
63
-
64
- /* Tipografia */
65
- --font-sbk: var(--sbk-font-family);
66
-
67
- /* Raio e sombra */
68
- --radius-sbk-xs: var(--sbk-radius-xs);
69
- --radius-sbk-sm: var(--sbk-radius-sm);
70
- --radius-sbk-md: var(--sbk-radius-md);
71
- --radius-sbk-lg: var(--sbk-radius-lg);
72
- --shadow-sbk-sm: var(--sbk-shadow-sm);
73
- --shadow-sbk-md: var(--sbk-shadow-md);
74
- --shadow-sbk-glass: var(--sbk-glass-shadow);
75
- }
76
-
77
- /* Animações */
78
- @theme {
79
- --animate-sbk-indeterminate: sbk-indeterminate 1.4s var(--sbk-easing-standard) infinite;
80
- --animate-sbk-fade-in: sbk-fade-in var(--sbk-duration-normal) var(--sbk-easing-standard);
81
- --animate-sbk-scale-in: sbk-scale-in var(--sbk-duration-normal) var(--sbk-easing-standard);
82
-
83
- @keyframes sbk-indeterminate {
84
- 0% {
85
- transform: translateX(-100%);
86
- }
87
- 100% {
88
- transform: translateX(250%);
89
- }
90
- }
91
- @keyframes sbk-fade-in {
92
- from {
93
- opacity: 0;
94
- }
95
- to {
96
- opacity: 1;
97
- }
98
- }
99
- @keyframes sbk-scale-in {
100
- from {
101
- opacity: 0;
102
- transform: scale(0.97);
103
- }
104
- to {
105
- opacity: 1;
106
- transform: scale(1);
107
- }
108
- }
109
- }
110
-
111
- /* Superfície Liquid Glass */
112
- @utility sbk-glass {
113
- background-color: var(--sbk-glass-bg);
114
- background-image:
115
- linear-gradient(
116
- 160deg,
117
- color-mix(in srgb, var(--sbk-glass-highlight) 40%, transparent) 0%,
118
- transparent 45%
119
- ),
120
- linear-gradient(var(--sbk-glass-tint), var(--sbk-glass-tint));
121
- -webkit-backdrop-filter: blur(var(--sbk-glass-blur)) saturate(var(--sbk-glass-saturate));
122
- backdrop-filter: blur(var(--sbk-glass-blur)) saturate(var(--sbk-glass-saturate));
123
- border: 1px solid var(--sbk-glass-border);
124
- box-shadow:
125
- inset 0 1px 0 var(--sbk-glass-highlight),
126
- inset 0 -1px 0 color-mix(in srgb, var(--sbk-glass-highlight) 30%, transparent),
127
- var(--sbk-glass-shadow);
128
-
129
- @supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
130
- background-color: var(--sbk-glass-fallback);
131
- }
132
-
133
- @media (prefers-reduced-transparency: reduce) {
134
- background-color: var(--sbk-glass-fallback);
135
- background-image: none;
136
- -webkit-backdrop-filter: none;
137
- backdrop-filter: none;
138
- }
139
-
140
- @media (forced-colors: active) {
141
- border-color: CanvasText;
142
- }
143
- }
144
-
145
- @utility sbk-glass-strong {
146
- background-color: var(--sbk-glass-bg-strong);
147
- }
148
-
149
- /* Anel de foco padrão da lib */
150
- @utility sbk-focus-ring {
151
- outline: 2px solid var(--sbk-color-focus);
152
- outline-offset: 2px;
153
- }
1
+ /* ============================================================
2
+ @sbkbs/ui · Preset Tailwind CSS v4
3
+ Mapeia os tokens (--sbk-*) para utilitários com namespace "sbk":
4
+ bg-sbk-primary, text-sbk-fg-muted, border-sbk-line,
5
+ rounded-sbk-md, shadow-sbk-sm, font-sbk, sbk-glass
6
+
7
+ Uso em app com Tailwind 4:
8
+ @import 'tailwindcss';
9
+ @import '@sbkbs/ui/tailwind.css';
10
+ Requer os tokens carregados (@sbkbs/ui/styles.css ou @sbkbs/ui/tokens.css).
11
+ ============================================================ */
12
+
13
+ @theme inline {
14
+ /* Paleta oficial */
15
+ --color-sbk-verde-escuro: var(--sbk-verde-escuro);
16
+ --color-sbk-ciano-escuro: var(--sbk-ciano-escuro);
17
+ --color-sbk-off-white: var(--sbk-off-white);
18
+ --color-sbk-verde-claro: var(--sbk-verde-claro);
19
+ --color-sbk-verde-profundo: var(--sbk-verde-profundo);
20
+ --color-sbk-ciano: var(--sbk-ciano);
21
+ --color-sbk-ciano-profundo: var(--sbk-ciano-profundo);
22
+ --color-sbk-chumbo-leve: var(--sbk-chumbo-leve);
23
+ --color-sbk-preto: var(--sbk-preto);
24
+ --color-sbk-branco: var(--sbk-branco);
25
+
26
+ /* Semânticos */
27
+ --color-sbk-bg: var(--sbk-color-bg);
28
+ --color-sbk-surface: var(--sbk-color-surface);
29
+ --color-sbk-surface-sunken: var(--sbk-color-surface-sunken);
30
+ --color-sbk-surface-hover: var(--sbk-color-surface-hover);
31
+ --color-sbk-surface-inverse: var(--sbk-color-surface-inverse);
32
+ --color-sbk-overlay: var(--sbk-color-overlay);
33
+ --color-sbk-fg: var(--sbk-color-fg);
34
+ --color-sbk-fg-heading: var(--sbk-color-fg-heading);
35
+ --color-sbk-fg-muted: var(--sbk-color-fg-muted);
36
+ --color-sbk-fg-inverse: var(--sbk-color-fg-inverse);
37
+ --color-sbk-line: var(--sbk-color-line);
38
+ --color-sbk-line-strong: var(--sbk-color-line-strong);
39
+ --color-sbk-primary: var(--sbk-color-primary);
40
+ --color-sbk-primary-hover: var(--sbk-color-primary-hover);
41
+ --color-sbk-on-primary: var(--sbk-color-on-primary);
42
+ --color-sbk-primary-subtle: var(--sbk-color-primary-subtle);
43
+ --color-sbk-secondary: var(--sbk-color-secondary);
44
+ --color-sbk-secondary-hover: var(--sbk-color-secondary-hover);
45
+ --color-sbk-on-secondary: var(--sbk-color-on-secondary);
46
+ --color-sbk-accent: var(--sbk-color-accent);
47
+ --color-sbk-highlight-bg: var(--sbk-color-highlight-bg);
48
+ --color-sbk-highlight-fg: var(--sbk-color-highlight-fg);
49
+ --color-sbk-focus: var(--sbk-color-focus);
50
+ --color-sbk-success: var(--sbk-color-success);
51
+ --color-sbk-success-subtle: var(--sbk-color-success-subtle);
52
+ --color-sbk-warning: var(--sbk-color-warning);
53
+ --color-sbk-warning-subtle: var(--sbk-color-warning-subtle);
54
+ --color-sbk-error: var(--sbk-color-error);
55
+ --color-sbk-error-subtle: var(--sbk-color-error-subtle);
56
+ --color-sbk-info: var(--sbk-color-info);
57
+ --color-sbk-info-subtle: var(--sbk-color-info-subtle);
58
+ --color-sbk-on-state: var(--sbk-color-on-state);
59
+ --color-sbk-success-fg: var(--sbk-color-success-fg);
60
+ --color-sbk-warning-fg: var(--sbk-color-warning-fg);
61
+ --color-sbk-error-fg: var(--sbk-color-error-fg);
62
+ --color-sbk-info-fg: var(--sbk-color-info-fg);
63
+
64
+ /* Tipografia */
65
+ --font-sbk: var(--sbk-font-family);
66
+
67
+ /* Raio e sombra */
68
+ --radius-sbk-xs: var(--sbk-radius-xs);
69
+ --radius-sbk-sm: var(--sbk-radius-sm);
70
+ --radius-sbk-md: var(--sbk-radius-md);
71
+ --radius-sbk-lg: var(--sbk-radius-lg);
72
+ --shadow-sbk-sm: var(--sbk-shadow-sm);
73
+ --shadow-sbk-md: var(--sbk-shadow-md);
74
+ --shadow-sbk-glass: var(--sbk-glass-shadow);
75
+ }
76
+
77
+ /* Animações */
78
+ @theme {
79
+ --animate-sbk-indeterminate: sbk-indeterminate 1.4s var(--sbk-easing-standard) infinite;
80
+ --animate-sbk-fade-in: sbk-fade-in var(--sbk-duration-normal) var(--sbk-easing-standard);
81
+ --animate-sbk-scale-in: sbk-scale-in var(--sbk-duration-normal) var(--sbk-easing-standard);
82
+
83
+ @keyframes sbk-indeterminate {
84
+ 0% {
85
+ transform: translateX(-100%);
86
+ }
87
+ 100% {
88
+ transform: translateX(250%);
89
+ }
90
+ }
91
+ @keyframes sbk-fade-in {
92
+ from {
93
+ opacity: 0;
94
+ }
95
+ to {
96
+ opacity: 1;
97
+ }
98
+ }
99
+ @keyframes sbk-scale-in {
100
+ from {
101
+ opacity: 0;
102
+ transform: scale(0.97);
103
+ }
104
+ to {
105
+ opacity: 1;
106
+ transform: scale(1);
107
+ }
108
+ }
109
+ }
110
+
111
+ /* Superfície Liquid Glass */
112
+ @utility sbk-glass {
113
+ background-color: var(--sbk-glass-bg);
114
+ background-image:
115
+ linear-gradient(
116
+ 160deg,
117
+ color-mix(in srgb, var(--sbk-glass-highlight) 40%, transparent) 0%,
118
+ transparent 45%
119
+ ),
120
+ linear-gradient(var(--sbk-glass-tint), var(--sbk-glass-tint));
121
+ -webkit-backdrop-filter: blur(var(--sbk-glass-blur)) saturate(var(--sbk-glass-saturate));
122
+ backdrop-filter: blur(var(--sbk-glass-blur)) saturate(var(--sbk-glass-saturate));
123
+ border: 1px solid var(--sbk-glass-border);
124
+ box-shadow:
125
+ inset 0 1px 0 var(--sbk-glass-highlight),
126
+ inset 0 -1px 0 color-mix(in srgb, var(--sbk-glass-highlight) 30%, transparent),
127
+ var(--sbk-glass-shadow);
128
+
129
+ @supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
130
+ background-color: var(--sbk-glass-fallback);
131
+ }
132
+
133
+ @media (prefers-reduced-transparency: reduce) {
134
+ background-color: var(--sbk-glass-fallback);
135
+ background-image: none;
136
+ -webkit-backdrop-filter: none;
137
+ backdrop-filter: none;
138
+ }
139
+
140
+ @media (forced-colors: active) {
141
+ border-color: CanvasText;
142
+ }
143
+ }
144
+
145
+ @utility sbk-glass-strong {
146
+ background-color: var(--sbk-glass-bg-strong);
147
+ }
148
+
149
+ /* Anel de foco padrão da lib */
150
+ @utility sbk-focus-ring {
151
+ outline: 2px solid var(--sbk-color-focus);
152
+ outline-offset: 2px;
153
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"ThemeProvider.js","sources":["../../src/theme/ThemeProvider.tsx"],"sourcesContent":["import {\n createContext,\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from 'react';\n\n/** Tema efetivamente aplicado. */\nexport type Theme = 'light' | 'dark';\n/** Preferência do usuário: `system` segue prefers-color-scheme. */\nexport type ThemePreference = Theme | 'system';\n/** `sbk-ia`: produto digital (padrão). `sbk`: institucional (marca-mãe). */\nexport type Brand = 'sbk-ia' | 'sbk';\n\ninterface ThemeContextType {\n brand: Brand;\n /** Preferência escolhida (pode ser `system`). */\n preference: ThemePreference;\n setBrand: (brand: Brand) => void;\n setTheme: (preference: ThemePreference) => void;\n /** Tema efetivo (`light` ou `dark`), já resolvido quando a preferência é `system`. */\n theme: Theme;\n toggleTheme: () => void;\n}\n\nconst ThemeContext = createContext<ThemeContextType | undefined>(undefined);\n\nexport const useTheme = (): ThemeContextType => {\n const context = useContext(ThemeContext);\n if (!context) throw new Error('useTheme deve ser usado dentro de ThemeProvider');\n return context;\n};\n\nexport interface ThemeProviderProps {\n children: ReactNode;\n defaultBrand?: Brand;\n defaultTheme?: ThemePreference;\n /** Chave no localStorage. `null` desativa a persistência. Padrão: \"theme\". */\n storageKey?: string | null;\n}\n\nconst readStorage = (key: string | null): ThemePreference | null => {\n if (!key || typeof window === 'undefined') return null;\n try {\n const value = window.localStorage.getItem(key);\n return value === 'light' || value === 'dark' || value === 'system' ? value : null;\n } catch {\n return null;\n }\n};\n\nconst systemTheme = (): Theme =>\n typeof window !== 'undefined' && window.matchMedia?.('(prefers-color-scheme: dark)').matches\n ? 'dark'\n : 'light';\n\n/**\n * Aplica `data-theme` e `data-brand` no <html>. Os tokens da lib reagem a esses atributos.\n * Para evitar flash no primeiro paint em SSR, defina os atributos no HTML inicial.\n */\nexport const ThemeProvider = ({\n children,\n defaultTheme = 'light',\n defaultBrand = 'sbk-ia',\n storageKey = 'theme',\n}: ThemeProviderProps) => {\n const [preference, setPreference] = useState<ThemePreference>(\n () => readStorage(storageKey) ?? defaultTheme,\n );\n const [brand, setBrand] = useState<Brand>(defaultBrand);\n const [system, setSystem] = useState<Theme>(systemTheme);\n const theme: Theme = preference === 'system' ? system : preference;\n\n useEffect(() => {\n if (preference !== 'system' || typeof window === 'undefined' || !window.matchMedia) return;\n const mql = window.matchMedia('(prefers-color-scheme: dark)');\n const onChange = () => setSystem(mql.matches ? 'dark' : 'light');\n onChange();\n mql.addEventListener?.('change', onChange);\n return () => mql.removeEventListener?.('change', onChange);\n }, [preference]);\n\n useEffect(() => {\n const root = document.documentElement;\n root.setAttribute('data-theme', theme);\n root.style.colorScheme = theme;\n }, [theme]);\n\n useEffect(() => {\n const root = document.documentElement;\n if (brand === 'sbk') root.setAttribute('data-brand', 'sbk');\n else root.removeAttribute('data-brand');\n }, [brand]);\n\n useEffect(() => {\n if (!storageKey) return;\n try {\n window.localStorage.setItem(storageKey, preference);\n } catch {\n /* armazenamento indisponível (modo privado): ignora */\n }\n }, [preference, storageKey]);\n\n const toggleTheme = useCallback(\n () => setPreference(theme === 'dark' ? 'light' : 'dark'),\n [theme],\n );\n\n const value = useMemo(\n () => ({ theme, preference, setTheme: setPreference, toggleTheme, brand, setBrand }),\n [theme, preference, toggleTheme, brand],\n );\n\n return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>;\n};\n"],"names":["ThemeContext","createContext","useTheme","context","useContext","readStorage","key","value","systemTheme","_a","ThemeProvider","children","defaultTheme","defaultBrand","storageKey","preference","setPreference","useState","brand","setBrand","system","setSystem","theme","useEffect","mql","onChange","root","toggleTheme","useCallback","useMemo","jsx"],"mappings":";;AA4BA,MAAMA,IAAeC,EAA4C,MAAS,GAE7DC,IAAW,MAAwB;AAC9C,QAAMC,IAAUC,EAAWJ,CAAY;AACvC,MAAI,CAACG,EAAS,OAAM,IAAI,MAAM,iDAAiD;AAC/E,SAAOA;AACT,GAUME,IAAc,CAACC,MAA+C;AAClE,MAAI,CAACA,KAAO,OAAO,SAAW,IAAa,QAAO;AAClD,MAAI;AACF,UAAMC,IAAQ,OAAO,aAAa,QAAQD,CAAG;AAC7C,WAAOC,MAAU,WAAWA,MAAU,UAAUA,MAAU,WAAWA,IAAQ;AAAA,EAC/E,QAAQ;AACN,WAAO;AAAA,EACT;AACF,GAEMC,IAAc,MAAA;;AAClB,gBAAO,SAAW,SAAeC,IAAA,OAAO,eAAP,QAAAA,EAAA,aAAoB,gCAAgC,WACjF,SACA;AAAA,GAMOC,IAAgB,CAAC;AAAA,EAC5B,UAAAC;AAAA,EACA,cAAAC,IAAe;AAAA,EACf,cAAAC,IAAe;AAAA,EACf,YAAAC,IAAa;AACf,MAA0B;AACxB,QAAM,CAACC,GAAYC,CAAa,IAAIC;AAAA,IAClC,MAAMZ,EAAYS,CAAU,KAAKF;AAAA,EAAA,GAE7B,CAACM,GAAOC,CAAQ,IAAIF,EAAgBJ,CAAY,GAChD,CAACO,GAAQC,CAAS,IAAIJ,EAAgBT,CAAW,GACjDc,IAAeP,MAAe,WAAWK,IAASL;AAExD,EAAAQ,EAAU,MAAM;;AACd,QAAIR,MAAe,YAAY,OAAO,SAAW,OAAe,CAAC,OAAO,WAAY;AACpF,UAAMS,IAAM,OAAO,WAAW,8BAA8B,GACtDC,IAAW,MAAMJ,EAAUG,EAAI,UAAU,SAAS,OAAO;AAC/D,WAAAC,EAAA,IACAhB,IAAAe,EAAI,qBAAJ,QAAAf,EAAA,KAAAe,GAAuB,UAAUC,IAC1B;;AAAM,cAAAhB,IAAAe,EAAI,wBAAJ,gBAAAf,EAAA,KAAAe,GAA0B,UAAUC;AAAA;AAAA,EACnD,GAAG,CAACV,CAAU,CAAC,GAEfQ,EAAU,MAAM;AACd,UAAMG,IAAO,SAAS;AACtB,IAAAA,EAAK,aAAa,cAAcJ,CAAK,GACrCI,EAAK,MAAM,cAAcJ;AAAA,EAC3B,GAAG,CAACA,CAAK,CAAC,GAEVC,EAAU,MAAM;AACd,UAAMG,IAAO,SAAS;AACtB,IAAIR,MAAU,QAAOQ,EAAK,aAAa,cAAc,KAAK,IACrDA,EAAK,gBAAgB,YAAY;AAAA,EACxC,GAAG,CAACR,CAAK,CAAC,GAEVK,EAAU,MAAM;AACd,QAAKT;AACL,UAAI;AACF,eAAO,aAAa,QAAQA,GAAYC,CAAU;AAAA,MACpD,QAAQ;AAAA,MAER;AAAA,EACF,GAAG,CAACA,GAAYD,CAAU,CAAC;AAE3B,QAAMa,IAAcC;AAAA,IAClB,MAAMZ,EAAcM,MAAU,SAAS,UAAU,MAAM;AAAA,IACvD,CAACA,CAAK;AAAA,EAAA,GAGFf,IAAQsB;AAAA,IACZ,OAAO,EAAE,OAAAP,GAAO,YAAAP,GAAY,UAAUC,GAAe,aAAAW,GAAa,OAAAT,GAAO,UAAAC;IACzE,CAACG,GAAOP,GAAYY,GAAaT,CAAK;AAAA,EAAA;AAGxC,SAAO,gBAAAY,EAAC9B,EAAa,UAAb,EAAsB,OAAAO,GAAe,UAAAI,EAAA,CAAS;AACxD;"}
1
+ {"version":3,"file":"ThemeProvider.js","sources":["../../src/theme/ThemeProvider.tsx"],"sourcesContent":["import {\r\n createContext,\r\n type ReactNode,\r\n useCallback,\r\n useContext,\r\n useEffect,\r\n useMemo,\r\n useState,\r\n} from 'react';\r\n\r\n/** Tema efetivamente aplicado. */\r\nexport type Theme = 'light' | 'dark';\r\n/** Preferência do usuário: `system` segue prefers-color-scheme. */\r\nexport type ThemePreference = Theme | 'system';\r\n/** `sbk-ia`: produto digital (padrão). `sbk`: institucional (marca-mãe). */\r\nexport type Brand = 'sbk-ia' | 'sbk';\r\n\r\ninterface ThemeContextType {\r\n brand: Brand;\r\n /** Preferência escolhida (pode ser `system`). */\r\n preference: ThemePreference;\r\n setBrand: (brand: Brand) => void;\r\n setTheme: (preference: ThemePreference) => void;\r\n /** Tema efetivo (`light` ou `dark`), já resolvido quando a preferência é `system`. */\r\n theme: Theme;\r\n toggleTheme: () => void;\r\n}\r\n\r\nconst ThemeContext = createContext<ThemeContextType | undefined>(undefined);\r\n\r\nexport const useTheme = (): ThemeContextType => {\r\n const context = useContext(ThemeContext);\r\n if (!context) throw new Error('useTheme deve ser usado dentro de ThemeProvider');\r\n return context;\r\n};\r\n\r\nexport interface ThemeProviderProps {\r\n children: ReactNode;\r\n defaultBrand?: Brand;\r\n defaultTheme?: ThemePreference;\r\n /** Chave no localStorage. `null` desativa a persistência. Padrão: \"theme\". */\r\n storageKey?: string | null;\r\n}\r\n\r\nconst readStorage = (key: string | null): ThemePreference | null => {\r\n if (!key || typeof window === 'undefined') return null;\r\n try {\r\n const value = window.localStorage.getItem(key);\r\n return value === 'light' || value === 'dark' || value === 'system' ? value : null;\r\n } catch {\r\n return null;\r\n }\r\n};\r\n\r\nconst systemTheme = (): Theme =>\r\n typeof window !== 'undefined' && window.matchMedia?.('(prefers-color-scheme: dark)').matches\r\n ? 'dark'\r\n : 'light';\r\n\r\n/**\r\n * Aplica `data-theme` e `data-brand` no <html>. Os tokens da lib reagem a esses atributos.\r\n * Para evitar flash no primeiro paint em SSR, defina os atributos no HTML inicial.\r\n */\r\nexport const ThemeProvider = ({\r\n children,\r\n defaultTheme = 'light',\r\n defaultBrand = 'sbk-ia',\r\n storageKey = 'theme',\r\n}: ThemeProviderProps) => {\r\n const [preference, setPreference] = useState<ThemePreference>(\r\n () => readStorage(storageKey) ?? defaultTheme,\r\n );\r\n const [brand, setBrand] = useState<Brand>(defaultBrand);\r\n const [system, setSystem] = useState<Theme>(systemTheme);\r\n const theme: Theme = preference === 'system' ? system : preference;\r\n\r\n useEffect(() => {\r\n if (preference !== 'system' || typeof window === 'undefined' || !window.matchMedia) return;\r\n const mql = window.matchMedia('(prefers-color-scheme: dark)');\r\n const onChange = () => setSystem(mql.matches ? 'dark' : 'light');\r\n onChange();\r\n mql.addEventListener?.('change', onChange);\r\n return () => mql.removeEventListener?.('change', onChange);\r\n }, [preference]);\r\n\r\n useEffect(() => {\r\n const root = document.documentElement;\r\n root.setAttribute('data-theme', theme);\r\n root.style.colorScheme = theme;\r\n }, [theme]);\r\n\r\n useEffect(() => {\r\n const root = document.documentElement;\r\n if (brand === 'sbk') root.setAttribute('data-brand', 'sbk');\r\n else root.removeAttribute('data-brand');\r\n }, [brand]);\r\n\r\n useEffect(() => {\r\n if (!storageKey) return;\r\n try {\r\n window.localStorage.setItem(storageKey, preference);\r\n } catch {\r\n /* armazenamento indisponível (modo privado): ignora */\r\n }\r\n }, [preference, storageKey]);\r\n\r\n const toggleTheme = useCallback(\r\n () => setPreference(theme === 'dark' ? 'light' : 'dark'),\r\n [theme],\r\n );\r\n\r\n const value = useMemo(\r\n () => ({ theme, preference, setTheme: setPreference, toggleTheme, brand, setBrand }),\r\n [theme, preference, toggleTheme, brand],\r\n );\r\n\r\n return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>;\r\n};\r\n"],"names":["ThemeContext","createContext","useTheme","context","useContext","readStorage","key","value","systemTheme","_a","ThemeProvider","children","defaultTheme","defaultBrand","storageKey","preference","setPreference","useState","brand","setBrand","system","setSystem","theme","useEffect","mql","onChange","root","toggleTheme","useCallback","useMemo","jsx"],"mappings":";;AA4BA,MAAMA,IAAeC,EAA4C,MAAS,GAE7DC,IAAW,MAAwB;AAC9C,QAAMC,IAAUC,EAAWJ,CAAY;AACvC,MAAI,CAACG,EAAS,OAAM,IAAI,MAAM,iDAAiD;AAC/E,SAAOA;AACT,GAUME,IAAc,CAACC,MAA+C;AAClE,MAAI,CAACA,KAAO,OAAO,SAAW,IAAa,QAAO;AAClD,MAAI;AACF,UAAMC,IAAQ,OAAO,aAAa,QAAQD,CAAG;AAC7C,WAAOC,MAAU,WAAWA,MAAU,UAAUA,MAAU,WAAWA,IAAQ;AAAA,EAC/E,QAAQ;AACN,WAAO;AAAA,EACT;AACF,GAEMC,IAAc,MAAA;;AAClB,gBAAO,SAAW,SAAeC,IAAA,OAAO,eAAP,QAAAA,EAAA,aAAoB,gCAAgC,WACjF,SACA;AAAA,GAMOC,IAAgB,CAAC;AAAA,EAC5B,UAAAC;AAAA,EACA,cAAAC,IAAe;AAAA,EACf,cAAAC,IAAe;AAAA,EACf,YAAAC,IAAa;AACf,MAA0B;AACxB,QAAM,CAACC,GAAYC,CAAa,IAAIC;AAAA,IAClC,MAAMZ,EAAYS,CAAU,KAAKF;AAAA,EAAA,GAE7B,CAACM,GAAOC,CAAQ,IAAIF,EAAgBJ,CAAY,GAChD,CAACO,GAAQC,CAAS,IAAIJ,EAAgBT,CAAW,GACjDc,IAAeP,MAAe,WAAWK,IAASL;AAExD,EAAAQ,EAAU,MAAM;;AACd,QAAIR,MAAe,YAAY,OAAO,SAAW,OAAe,CAAC,OAAO,WAAY;AACpF,UAAMS,IAAM,OAAO,WAAW,8BAA8B,GACtDC,IAAW,MAAMJ,EAAUG,EAAI,UAAU,SAAS,OAAO;AAC/D,WAAAC,EAAA,IACAhB,IAAAe,EAAI,qBAAJ,QAAAf,EAAA,KAAAe,GAAuB,UAAUC,IAC1B;;AAAM,cAAAhB,IAAAe,EAAI,wBAAJ,gBAAAf,EAAA,KAAAe,GAA0B,UAAUC;AAAA;AAAA,EACnD,GAAG,CAACV,CAAU,CAAC,GAEfQ,EAAU,MAAM;AACd,UAAMG,IAAO,SAAS;AACtB,IAAAA,EAAK,aAAa,cAAcJ,CAAK,GACrCI,EAAK,MAAM,cAAcJ;AAAA,EAC3B,GAAG,CAACA,CAAK,CAAC,GAEVC,EAAU,MAAM;AACd,UAAMG,IAAO,SAAS;AACtB,IAAIR,MAAU,QAAOQ,EAAK,aAAa,cAAc,KAAK,IACrDA,EAAK,gBAAgB,YAAY;AAAA,EACxC,GAAG,CAACR,CAAK,CAAC,GAEVK,EAAU,MAAM;AACd,QAAKT;AACL,UAAI;AACF,eAAO,aAAa,QAAQA,GAAYC,CAAU;AAAA,MACpD,QAAQ;AAAA,MAER;AAAA,EACF,GAAG,CAACA,GAAYD,CAAU,CAAC;AAE3B,QAAMa,IAAcC;AAAA,IAClB,MAAMZ,EAAcM,MAAU,SAAS,UAAU,MAAM;AAAA,IACvD,CAACA,CAAK;AAAA,EAAA,GAGFf,IAAQsB;AAAA,IACZ,OAAO,EAAE,OAAAP,GAAO,YAAAP,GAAY,UAAUC,GAAe,aAAAW,GAAa,OAAAT,GAAO,UAAAC;IACzE,CAACG,GAAOP,GAAYY,GAAaT,CAAK;AAAA,EAAA;AAGxC,SAAO,gBAAAY,EAAC9B,EAAa,UAAb,EAAsB,OAAAO,GAAe,UAAAI,EAAA,CAAS;AACxD;"}
@@ -1 +1 @@
1
- {"version":3,"file":"tokens.js","sources":["../../src/theme/tokens.ts"],"sourcesContent":["/**\n * Tokens da marca SBK (Brand Book 2026) para uso em JS/TS:\n * gráficos, canvas, e-mails, geração de PDF ou qualquer lugar sem CSS custom properties.\n * Em componentes React prefira as classes/variáveis CSS, que reagem a tema e marca.\n */\nexport const sbkTokens = {\n color: {\n verdeEscuro: '#023631',\n cianoEscuro: '#075056',\n offWhite: '#ECEFF3',\n verdeClaro: '#0A5A52',\n verdeProfundo: '#012824',\n ciano: '#2A7C79',\n cianoProfundo: '#0E4442',\n chumboLeve: '#4A545E',\n preto: '#000000',\n branco: '#FFFFFF',\n },\n /** Proposta pendente de aprovação da marca. */\n state: {\n sucesso: '#1D6B43',\n alerta: '#B45309',\n erro: '#B42318',\n info: '#075056',\n },\n font: {\n family: '\"Plus Jakarta Sans\", Calibri, system-ui, sans-serif',\n weight: { heading: 600, body: 300 },\n },\n radius: { xs: 4, sm: 8, md: 12, lg: 16 },\n cardLayerOpacity: [0.9, 0.75, 0.6],\n} as const;\n\n/** Paleta ordenada para séries de gráficos (do mais escuro ao mais claro, dentro do espectro verde/ciano). */\nexport const sbkChartPalette = [\n sbkTokens.color.verdeEscuro,\n sbkTokens.color.ciano,\n sbkTokens.color.cianoEscuro,\n sbkTokens.color.verdeClaro,\n sbkTokens.color.chumboLeve,\n sbkTokens.color.cianoProfundo,\n] as const;\n\nexport type SbkTokens = typeof sbkTokens;\n"],"names":["sbkTokens","sbkChartPalette"],"mappings":"AAKO,MAAMA,IAAY;AAAA,EACvB,OAAO;AAAA,IACL,aAAa;AAAA,IACb,aAAa;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,OAAO;AAAA,IACP,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,QAAQ;AAAA,EAAA;AAAA;AAAA,EAGV,OAAO;AAAA,IACL,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER,MAAM;AAAA,IACJ,QAAQ;AAAA,IACR,QAAQ,EAAE,SAAS,KAAK,MAAM,IAAA;AAAA,EAAI;AAAA,EAEpC,QAAQ,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAA;AAAA,EACpC,kBAAkB,CAAC,KAAK,MAAM,GAAG;AACnC,GAGaC,IAAkB;AAAA,EAC7BD,EAAU,MAAM;AAAA,EAChBA,EAAU,MAAM;AAAA,EAChBA,EAAU,MAAM;AAAA,EAChBA,EAAU,MAAM;AAAA,EAChBA,EAAU,MAAM;AAAA,EAChBA,EAAU,MAAM;AAClB;"}
1
+ {"version":3,"file":"tokens.js","sources":["../../src/theme/tokens.ts"],"sourcesContent":["/**\r\n * Tokens da marca SBK (Brand Book 2026) para uso em JS/TS:\r\n * gráficos, canvas, e-mails, geração de PDF ou qualquer lugar sem CSS custom properties.\r\n * Em componentes React prefira as classes/variáveis CSS, que reagem a tema e marca.\r\n */\r\nexport const sbkTokens = {\r\n color: {\r\n verdeEscuro: '#023631',\r\n cianoEscuro: '#075056',\r\n offWhite: '#ECEFF3',\r\n verdeClaro: '#0A5A52',\r\n verdeProfundo: '#012824',\r\n ciano: '#2A7C79',\r\n cianoProfundo: '#0E4442',\r\n chumboLeve: '#4A545E',\r\n preto: '#000000',\r\n branco: '#FFFFFF',\r\n },\r\n /** Proposta pendente de aprovação da marca. */\r\n state: {\r\n sucesso: '#1D6B43',\r\n alerta: '#B45309',\r\n erro: '#B42318',\r\n info: '#075056',\r\n },\r\n font: {\r\n family: '\"Plus Jakarta Sans\", Calibri, system-ui, sans-serif',\r\n weight: { heading: 600, body: 300 },\r\n },\r\n radius: { xs: 4, sm: 8, md: 12, lg: 16 },\r\n cardLayerOpacity: [0.9, 0.75, 0.6],\r\n} as const;\r\n\r\n/** Paleta ordenada para séries de gráficos (do mais escuro ao mais claro, dentro do espectro verde/ciano). */\r\nexport const sbkChartPalette = [\r\n sbkTokens.color.verdeEscuro,\r\n sbkTokens.color.ciano,\r\n sbkTokens.color.cianoEscuro,\r\n sbkTokens.color.verdeClaro,\r\n sbkTokens.color.chumboLeve,\r\n sbkTokens.color.cianoProfundo,\r\n] as const;\r\n\r\nexport type SbkTokens = typeof sbkTokens;\r\n"],"names":["sbkTokens","sbkChartPalette"],"mappings":"AAKO,MAAMA,IAAY;AAAA,EACvB,OAAO;AAAA,IACL,aAAa;AAAA,IACb,aAAa;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,OAAO;AAAA,IACP,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,QAAQ;AAAA,EAAA;AAAA;AAAA,EAGV,OAAO;AAAA,IACL,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER,MAAM;AAAA,IACJ,QAAQ;AAAA,IACR,QAAQ,EAAE,SAAS,KAAK,MAAM,IAAA;AAAA,EAAI;AAAA,EAEpC,QAAQ,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAA;AAAA,EACpC,kBAAkB,CAAC,KAAK,MAAM,GAAG;AACnC,GAGaC,IAAkB;AAAA,EAC7BD,EAAU,MAAM;AAAA,EAChBA,EAAU,MAAM;AAAA,EAChBA,EAAU,MAAM;AAAA,EAChBA,EAAU,MAAM;AAAA,EAChBA,EAAU,MAAM;AAAA,EAChBA,EAAU,MAAM;AAClB;"}