xertica-ui 2.7.0 → 2.8.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 (228) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +19 -11
  3. package/bin/generate-tokens.ts +25 -9
  4. package/components/assistant/xertica-assistant/xertica-assistant.tsx +1 -1
  5. package/components/ui/button/button.test.tsx +2 -2
  6. package/components/ui/button/button.tsx +6 -6
  7. package/components/ui/card/card.tsx +14 -2
  8. package/components/ui/input/input.tsx +1 -1
  9. package/components/ui/input-otp/input-otp.tsx +1 -1
  10. package/components/ui/search/search.tsx +1 -1
  11. package/components/ui/select/select.tsx +2 -2
  12. package/components/ui/switch/switch.tsx +1 -1
  13. package/components/ui/textarea/textarea.tsx +1 -1
  14. package/contexts/BrandColorsContext.tsx +50 -2
  15. package/contexts/theme-data.ts +100 -3
  16. package/dist/AssistantChart-BFBJXVcm.js +3383 -0
  17. package/dist/AssistantChart-BTnE94FR.cjs +3551 -0
  18. package/dist/AssistantChart-BvccsQMx.cjs +3551 -0
  19. package/dist/AssistantChart-CkskcBVD.js +3383 -0
  20. package/dist/AssistantChart-CrPkO9ip.js +3383 -0
  21. package/dist/AssistantChart-DKz2O1R8.cjs +3551 -0
  22. package/dist/AssistantChart-DYL6UEvo.cjs +3551 -0
  23. package/dist/AssistantChart-keo-ogKi.js +3383 -0
  24. package/dist/AudioPlayer-AoU5MTiM.cjs +1282 -0
  25. package/dist/AudioPlayer-Bx1vrblm.js +1278 -0
  26. package/dist/AudioPlayer-D0-I6J3J.cjs +1282 -0
  27. package/dist/AudioPlayer-DIWX_Yg7.cjs +1282 -0
  28. package/dist/AudioPlayer-DrWJnS7c.js +1278 -0
  29. package/dist/AudioPlayer-_P-Z7pAK.js +1278 -0
  30. package/dist/BrandColorsContext-B25Bpr3b.cjs +819 -0
  31. package/dist/BrandColorsContext-BCieATdW.js +812 -0
  32. package/dist/BrandColorsContext-DP0DXAXS.js +824 -0
  33. package/dist/BrandColorsContext-DjpC9wR_.cjs +798 -0
  34. package/dist/BrandColorsContext-MpXFhte7.cjs +831 -0
  35. package/dist/BrandColorsContext-V3tOc-Zw.js +791 -0
  36. package/dist/CodeBlock-CK4rO6lM.js +221 -0
  37. package/dist/CodeBlock-CKXamfVd.cjs +223 -0
  38. package/dist/CodeBlock-CVmE7isS.cjs +223 -0
  39. package/dist/CodeBlock-D7i5-cMv.js +221 -0
  40. package/dist/CodeBlock-Dg56j2ut.cjs +223 -0
  41. package/dist/CodeBlock-Dt6nUQoo.js +221 -0
  42. package/dist/CustomTooltipContent-Bxynuq7T.js +33 -0
  43. package/dist/CustomTooltipContent-BzjOSA0P.cjs +54 -0
  44. package/dist/CustomTooltipContent-C-ZeCNsf.js +33 -0
  45. package/dist/CustomTooltipContent-CON_QrXm.cjs +54 -0
  46. package/dist/CustomTooltipContent-UR_n2QfW.js +33 -0
  47. package/dist/CustomTooltipContent-v1SXjoFn.cjs +54 -0
  48. package/dist/FeatureCard-4n_8a63v.cjs +497 -0
  49. package/dist/FeatureCard-BLiAWT3w.js +485 -0
  50. package/dist/FeatureCard-BXRW97Ef.cjs +497 -0
  51. package/dist/FeatureCard-CDgLlWE2.js +485 -0
  52. package/dist/FeatureCard-CgQ8lq-I.cjs +497 -0
  53. package/dist/FeatureCard-Cp8cVC6T.cjs +497 -0
  54. package/dist/FeatureCard-D0MwrTRP.js +485 -0
  55. package/dist/FeatureCard-uE5i0in_.js +485 -0
  56. package/dist/ImageWithFallback-BOh1FM3I.js +98 -0
  57. package/dist/ImageWithFallback-BQO7952C.js +98 -0
  58. package/dist/ImageWithFallback-BkMXHCvV.cjs +122 -0
  59. package/dist/ImageWithFallback-C72nwszA.cjs +122 -0
  60. package/dist/ImageWithFallback-CCUMDuEC.cjs +122 -0
  61. package/dist/ImageWithFallback-DQD5TTlY.js +98 -0
  62. package/dist/LanguageSelector-1XhM7R1i.cjs +48 -0
  63. package/dist/LanguageSelector-B3ZVNc55.js +46 -0
  64. package/dist/LanguageSelector-Cj6zl0CM.js +46 -0
  65. package/dist/LanguageSelector-DK1zD4VH.cjs +48 -0
  66. package/dist/LanguageSelector-DseCAa0p.cjs +48 -0
  67. package/dist/LanguageSelector-Du09anfM.js +46 -0
  68. package/dist/LanguageSelector-PZHlFfEs.cjs +48 -0
  69. package/dist/LanguageSelector-SB-NJSmx.js +46 -0
  70. package/dist/PasswordStrengthMeter-B3S6i_k4.cjs +179 -0
  71. package/dist/PasswordStrengthMeter-B8ky1nJI.js +173 -0
  72. package/dist/PasswordStrengthMeter-C5VEopH-.cjs +179 -0
  73. package/dist/PasswordStrengthMeter-CIm7_jNT.js +173 -0
  74. package/dist/PasswordStrengthMeter-DKSAbQzu.js +173 -0
  75. package/dist/PasswordStrengthMeter-DxLu54p-.cjs +179 -0
  76. package/dist/PasswordStrengthMeter-k-e9Pole.cjs +179 -0
  77. package/dist/PasswordStrengthMeter-pAi2viq5.js +173 -0
  78. package/dist/ThemeToggle-4pQbVkpK.js +215 -0
  79. package/dist/ThemeToggle-B6rIVLvC.cjs +219 -0
  80. package/dist/ThemeToggle-BUOTps5l.cjs +219 -0
  81. package/dist/ThemeToggle-CO5mPl6e.js +215 -0
  82. package/dist/ThemeToggle-DbZQ0JSV.cjs +219 -0
  83. package/dist/ThemeToggle-vLXEq2TS.js +215 -0
  84. package/dist/VerifyEmailPage-BTjI2c9n.js +2954 -0
  85. package/dist/VerifyEmailPage-CJGfDSOx.js +2954 -0
  86. package/dist/VerifyEmailPage-DOlZUNc0.cjs +2963 -0
  87. package/dist/VerifyEmailPage-DQPRl_RJ.js +2954 -0
  88. package/dist/VerifyEmailPage-DrdqMbLC.cjs +2963 -0
  89. package/dist/VerifyEmailPage-hyDfeCRa.cjs +2963 -0
  90. package/dist/VerifyEmailPage-kKSXl8vu.cjs +2963 -0
  91. package/dist/VerifyEmailPage-w4N-bDhU.js +2954 -0
  92. package/dist/XerticaOrbe-B9tegV1n.js +1925 -0
  93. package/dist/XerticaOrbe-BQ_NjwPS.cjs +1927 -0
  94. package/dist/XerticaOrbe-BdUX171Q.cjs +1927 -0
  95. package/dist/XerticaOrbe-BdlKXRHU.cjs +1927 -0
  96. package/dist/XerticaOrbe-CByPAFE5.js +1925 -0
  97. package/dist/XerticaOrbe-Ccu9eFMu.js +1925 -0
  98. package/dist/XerticaProvider-BVid1oqn.cjs +46 -0
  99. package/dist/XerticaProvider-Bz_YfNY4.js +44 -0
  100. package/dist/XerticaProvider-CtvYfRbZ.cjs +46 -0
  101. package/dist/XerticaProvider-DMiyExQS.js +44 -0
  102. package/dist/XerticaProvider-DP2lzKip.cjs +46 -0
  103. package/dist/XerticaProvider-De79hhgp.js +44 -0
  104. package/dist/XerticaProvider-Dkk1Vbsy.js +44 -0
  105. package/dist/XerticaProvider-EdzH9Nrw.cjs +46 -0
  106. package/dist/alert-dialog-9XYAn5z5.js +819 -0
  107. package/dist/alert-dialog-B281hud0.cjs +872 -0
  108. package/dist/alert-dialog-BVWbrcrw.cjs +872 -0
  109. package/dist/alert-dialog-B_Ko1xpu.js +819 -0
  110. package/dist/alert-dialog-CIxE8T-J.cjs +872 -0
  111. package/dist/alert-dialog-DW-_iPuf.js +819 -0
  112. package/dist/assistant.cjs.js +2 -2
  113. package/dist/assistant.es.js +2 -2
  114. package/dist/avatar-BJwIMbZ_.js +54 -0
  115. package/dist/avatar-C4Zh5fAJ.cjs +77 -0
  116. package/dist/avatar-CTEUKZUT.js +54 -0
  117. package/dist/avatar-D1bZhlhL.cjs +77 -0
  118. package/dist/avatar-DKIxHeKG.cjs +77 -0
  119. package/dist/avatar-v16eZC8p.js +54 -0
  120. package/dist/blocks.cjs.js +2 -2
  121. package/dist/blocks.es.js +2 -2
  122. package/dist/brand.cjs.js +4 -4
  123. package/dist/brand.es.js +4 -4
  124. package/dist/breadcrumb-B1mUiaWB.cjs +98 -0
  125. package/dist/breadcrumb-BIRgmem-.js +90 -0
  126. package/dist/breadcrumb-BSng-oUf.cjs +98 -0
  127. package/dist/breadcrumb-CES7furU.js +90 -0
  128. package/dist/breadcrumb-CP275kbF.cjs +98 -0
  129. package/dist/breadcrumb-D7hr1EvJ.js +90 -0
  130. package/dist/button-BYtQygX5.cjs +85 -0
  131. package/dist/button-BnAW-a_w.js +62 -0
  132. package/dist/button-CUPDQews.js +62 -0
  133. package/dist/button-DFa-rtPy.js +62 -0
  134. package/dist/button-DV1G6XrI.cjs +85 -0
  135. package/dist/button-Kd9Fj53S.cjs +85 -0
  136. package/dist/cli.js +94 -10
  137. package/dist/components/ui/card/card.d.ts +11 -1
  138. package/dist/contexts/theme-data.d.ts +15 -1
  139. package/dist/dropdown-menu-B9wTZ0uX.cjs +225 -0
  140. package/dist/dropdown-menu-BeBtZOrs.cjs +225 -0
  141. package/dist/dropdown-menu-D7mRDGis.js +190 -0
  142. package/dist/dropdown-menu-D8ZmqHB7.js +190 -0
  143. package/dist/dropdown-menu-_AWBeOts.cjs +225 -0
  144. package/dist/dropdown-menu-qGzLO_HO.js +190 -0
  145. package/dist/hooks.cjs.js +1 -1
  146. package/dist/hooks.es.js +1 -1
  147. package/dist/index.cjs.js +24 -24
  148. package/dist/index.es.js +24 -24
  149. package/dist/input-B53E6K8G.js +65 -0
  150. package/dist/input-B7Q7vcoG.cjs +91 -0
  151. package/dist/input-BysqLMK1.js +65 -0
  152. package/dist/input-CStdFsaH.cjs +91 -0
  153. package/dist/input-CXYth6nW.cjs +91 -0
  154. package/dist/input-CX_fWE2D.cjs +91 -0
  155. package/dist/input-CitUVnEn.js +65 -0
  156. package/dist/input-wkBYTp-B.js +65 -0
  157. package/dist/layout.cjs.js +1 -1
  158. package/dist/layout.es.js +1 -1
  159. package/dist/media.cjs.js +1 -1
  160. package/dist/media.es.js +1 -1
  161. package/dist/pages.cjs.js +1 -1
  162. package/dist/pages.es.js +1 -1
  163. package/dist/rich-text-editor-BHiRUzWZ.js +2894 -0
  164. package/dist/rich-text-editor-BWMRUMJ2.js +2894 -0
  165. package/dist/rich-text-editor-BoE6Ks5x.cjs +2968 -0
  166. package/dist/rich-text-editor-BzuEwR_X.js +2894 -0
  167. package/dist/rich-text-editor-CcopGbQ-.js +2894 -0
  168. package/dist/rich-text-editor-CmxSRJIi.cjs +2968 -0
  169. package/dist/rich-text-editor-DyYAu28v.cjs +2968 -0
  170. package/dist/rich-text-editor-JS_eMQCC.cjs +2968 -0
  171. package/dist/select-BNfFJwYp.js +130 -0
  172. package/dist/select-CN8IDjGB.js +130 -0
  173. package/dist/select-CwRzQHA7.cjs +161 -0
  174. package/dist/select-CwgD3nMD.js +130 -0
  175. package/dist/select-DEHUm_AC.cjs +161 -0
  176. package/dist/select-DJDgpVm3.cjs +161 -0
  177. package/dist/select-DSLWQLmo.cjs +161 -0
  178. package/dist/select-YFx0wCYT.js +130 -0
  179. package/dist/sidebar-BF7JEL7U.js +1151 -0
  180. package/dist/sidebar-Bjr2doX5.cjs +1154 -0
  181. package/dist/sidebar-CMrNCmhb.cjs +1154 -0
  182. package/dist/sidebar-CO9x8AVn.cjs +1154 -0
  183. package/dist/sidebar-Cn_KB4c6.js +1151 -0
  184. package/dist/sidebar-Db_C30ph.cjs +1154 -0
  185. package/dist/sidebar-miPHsRz4.js +1151 -0
  186. package/dist/sidebar-pZF8mLLu.js +1151 -0
  187. package/dist/skeleton-BX2XTjMO.cjs +87 -0
  188. package/dist/skeleton-BoLK0iV7.js +78 -0
  189. package/dist/skeleton-Bysq8yeB.js +79 -0
  190. package/dist/skeleton-C7nspYnC.cjs +87 -0
  191. package/dist/skeleton-DL4V5Vub.cjs +87 -0
  192. package/dist/skeleton-DSMhdqp1.js +78 -0
  193. package/dist/skeleton-DhJswvTW.cjs +88 -0
  194. package/dist/skeleton-DicUfozA.js +78 -0
  195. package/dist/slider-77T_Eqw4.js +56 -0
  196. package/dist/slider-B6puMLXS.cjs +78 -0
  197. package/dist/slider-B785N7lZ.js +56 -0
  198. package/dist/slider-C6yssKyZ.cjs +78 -0
  199. package/dist/slider-CKZO9gVh.cjs +78 -0
  200. package/dist/slider-Cn-ImSze.js +56 -0
  201. package/dist/tooltip-BiJVGob3.cjs +72 -0
  202. package/dist/tooltip-D2OPn-1v.cjs +72 -0
  203. package/dist/tooltip-DlCHQuh1.js +48 -0
  204. package/dist/tooltip-fQ2Va0G8.cjs +72 -0
  205. package/dist/tooltip-oAw00FX2.js +48 -0
  206. package/dist/tooltip-u147L0wD.js +48 -0
  207. package/dist/ui.cjs.js +13 -13
  208. package/dist/ui.es.js +13 -13
  209. package/dist/xertica-assistant-C2A0R94j.js +2173 -0
  210. package/dist/xertica-assistant-CSUprvTR.js +2173 -0
  211. package/dist/xertica-assistant-Caubm0HR.js +2173 -0
  212. package/dist/xertica-assistant-DEexPM2u.cjs +2180 -0
  213. package/dist/xertica-assistant-Dh1dmEx3.cjs +2180 -0
  214. package/dist/xertica-assistant-GGcyHEZG.cjs +2180 -0
  215. package/dist/xertica-assistant-USefPe2L.js +2173 -0
  216. package/dist/xertica-assistant-cwSHFwfv.cjs +2180 -0
  217. package/dist/xertica-ui.css +1 -1
  218. package/package.json +3 -2
  219. package/styles/xertica/base.css +38 -0
  220. package/styles/xertica/tokens.css +9 -0
  221. package/templates/src/app/App.tsx +5 -1
  222. package/templates/src/features/home/ui/HomeContent.tsx +12 -13
  223. package/templates/src/features/template/ui/TemplateContent.tsx +569 -26
  224. package/templates/src/locales/en/pages/templates.json +112 -4
  225. package/templates/src/locales/es/pages/templates.json +112 -4
  226. package/templates/src/locales/pt-BR/pages/templates.json +112 -4
  227. package/templates/src/styles/xertica/tokens.css +9 -0
  228. package/templates/vite.config.ts +25 -0
@@ -0,0 +1,819 @@
1
+ 'use strict';
2
+
3
+ const jsxRuntime = require('react/jsx-runtime');
4
+ const React = require('react');
5
+
6
+ const ApiKeyContext = React.createContext(void 0);
7
+ const readStorage = (key) => typeof window !== "undefined" ? window.localStorage?.getItem(key) : null;
8
+ const writeStorage = (key, value) => {
9
+ if (typeof window === "undefined") return;
10
+ window.localStorage?.setItem(key, value);
11
+ };
12
+ const removeStorage = (key) => {
13
+ if (typeof window === "undefined") return;
14
+ window.localStorage?.removeItem(key);
15
+ };
16
+ function ApiKeyProvider({
17
+ children,
18
+ initialApiKey,
19
+ initialGeminiApiKey,
20
+ initialGoogleMapsApiKey
21
+ }) {
22
+ const LEAKED_KEYS = [
23
+ "AIzaSyCMsAMytBeOK0Qd7RKFyA5IW9eWt2WTJg",
24
+ "AIzaSyAiYWEIEmx212Up9zfM8kqyMXB4jLs8gq0"
25
+ ];
26
+ const [apiKey, setApiKeyState] = React.useState(() => {
27
+ if (initialApiKey) return initialApiKey;
28
+ const saved = readStorage("xertica-api-key");
29
+ return saved || "";
30
+ });
31
+ const [geminiApiKey, setGeminiApiKeyState] = React.useState(() => {
32
+ if (initialGeminiApiKey) return initialGeminiApiKey;
33
+ const saved = readStorage("xertica-gemini-api-key");
34
+ if (saved && LEAKED_KEYS.includes(saved)) {
35
+ removeStorage("xertica-gemini-api-key");
36
+ return "";
37
+ }
38
+ return saved || "";
39
+ });
40
+ const [googleMapsApiKey, setGoogleMapsApiKeyState] = React.useState(() => {
41
+ if (initialGoogleMapsApiKey) return initialGoogleMapsApiKey;
42
+ const saved = readStorage("xertica-googlemaps-api-key");
43
+ return saved || "";
44
+ });
45
+ const [isApiKeyValid, setIsApiKeyValid] = React.useState(false);
46
+ const [isGoogleMapsKeyValid, setIsGoogleMapsKeyValid] = React.useState(false);
47
+ React.useEffect(() => {
48
+ if (initialApiKey !== void 0) {
49
+ setApiKeyState(initialApiKey.trim());
50
+ }
51
+ }, [initialApiKey]);
52
+ React.useEffect(() => {
53
+ if (initialGeminiApiKey !== void 0) {
54
+ setGeminiApiKeyState(initialGeminiApiKey.trim());
55
+ }
56
+ }, [initialGeminiApiKey]);
57
+ React.useEffect(() => {
58
+ if (initialGoogleMapsApiKey !== void 0) {
59
+ setGoogleMapsApiKeyState(initialGoogleMapsApiKey.trim());
60
+ }
61
+ }, [initialGoogleMapsApiKey]);
62
+ React.useEffect(() => {
63
+ if (apiKey) {
64
+ writeStorage("xertica-api-key", apiKey);
65
+ setIsApiKeyValid(apiKey.length > 0);
66
+ } else {
67
+ removeStorage("xertica-api-key");
68
+ setIsApiKeyValid(false);
69
+ }
70
+ }, [apiKey]);
71
+ React.useEffect(() => {
72
+ if (geminiApiKey) {
73
+ writeStorage("xertica-gemini-api-key", geminiApiKey);
74
+ setIsApiKeyValid(geminiApiKey.startsWith("AIzaSy") && geminiApiKey.length > 20);
75
+ } else {
76
+ removeStorage("xertica-gemini-api-key");
77
+ setIsApiKeyValid(false);
78
+ }
79
+ }, [geminiApiKey]);
80
+ React.useEffect(() => {
81
+ if (googleMapsApiKey) {
82
+ writeStorage("xertica-googlemaps-api-key", googleMapsApiKey);
83
+ setIsGoogleMapsKeyValid(
84
+ googleMapsApiKey.startsWith("AIzaSy") && googleMapsApiKey.length > 20
85
+ );
86
+ const reloadMaps = async () => {
87
+ if (googleMapsApiKey.length < 10) return;
88
+ try {
89
+ const { reloadGoogleMaps } = await Promise.resolve().then(() => require('./index-BQjx1Mdf.cjs'));
90
+ await reloadGoogleMaps(googleMapsApiKey);
91
+ console.log("[ApiKeyContext] Google Maps recarregado com sucesso");
92
+ } catch (error) {
93
+ console.error("[ApiKeyContext] Erro ao recarregar Google Maps:", error);
94
+ }
95
+ };
96
+ reloadMaps();
97
+ } else {
98
+ removeStorage("xertica-googlemaps-api-key");
99
+ setIsGoogleMapsKeyValid(false);
100
+ }
101
+ }, [googleMapsApiKey]);
102
+ const setApiKey = (key) => {
103
+ setApiKeyState(key.trim());
104
+ };
105
+ const setGeminiApiKey = (key) => {
106
+ setGeminiApiKeyState(key.trim());
107
+ };
108
+ const setGoogleMapsApiKey = (key) => {
109
+ setGoogleMapsApiKeyState(key.trim());
110
+ };
111
+ const reloadMapsApi = async () => {
112
+ if (!googleMapsApiKey || googleMapsApiKey.length < 10) {
113
+ return;
114
+ }
115
+ try {
116
+ const { reloadGoogleMaps } = await Promise.resolve().then(() => require('./index-BQjx1Mdf.cjs'));
117
+ await reloadGoogleMaps(googleMapsApiKey);
118
+ console.log("[ApiKeyContext] Google Maps recarregado manualmente");
119
+ } catch (error) {
120
+ console.error("[ApiKeyContext] Erro ao recarregar Google Maps:", error);
121
+ }
122
+ };
123
+ return /* @__PURE__ */ jsxRuntime.jsx(
124
+ ApiKeyContext.Provider,
125
+ {
126
+ value: {
127
+ apiKey,
128
+ setApiKey,
129
+ geminiApiKey,
130
+ setGeminiApiKey,
131
+ isApiKeyValid,
132
+ googleMapsApiKey,
133
+ setGoogleMapsApiKey,
134
+ isGoogleMapsKeyValid,
135
+ reloadMapsApi
136
+ },
137
+ children
138
+ }
139
+ );
140
+ }
141
+ function useApiKey() {
142
+ const context = React.useContext(ApiKeyContext);
143
+ if (!context) {
144
+ throw new Error("useApiKey must be used within ApiKeyProvider");
145
+ }
146
+ return context;
147
+ }
148
+
149
+ const AssistenteContext = React.createContext(void 0);
150
+ function AssistenteProvider({ children }) {
151
+ const [conversaAtual, setConversaAtual] = React.useState("1");
152
+ const [conversas, setConversas] = React.useState([
153
+ {
154
+ id: "1",
155
+ titulo: "Nova Conversa",
156
+ mensagens: [],
157
+ ultimaMensagem: "",
158
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
159
+ favorita: false
160
+ }
161
+ ]);
162
+ const [isTyping, setIsTyping] = React.useState(false);
163
+ const [abaSelecionada, setAbaSelecionada] = React.useState("chat");
164
+ const [editingDocument, setEditingDocument] = React.useState(
165
+ null
166
+ );
167
+ const [searchFilter, setSearchFilter] = React.useState("all");
168
+ const [savedSearches, setSavedSearches] = React.useState([]);
169
+ const historico = conversas.find((c) => c.id === conversaAtual)?.mensagens || [];
170
+ return /* @__PURE__ */ jsxRuntime.jsx(
171
+ AssistenteContext.Provider,
172
+ {
173
+ value: {
174
+ historico,
175
+ conversaAtual,
176
+ setConversaAtual,
177
+ conversas,
178
+ setConversas,
179
+ isTyping,
180
+ setIsTyping,
181
+ abaSelecionada,
182
+ setAbaSelecionada,
183
+ editingDocument,
184
+ setEditingDocument,
185
+ searchFilter,
186
+ setSearchFilter,
187
+ savedSearches,
188
+ setSavedSearches
189
+ },
190
+ children
191
+ }
192
+ );
193
+ }
194
+ function useAssistente() {
195
+ const context = React.useContext(AssistenteContext);
196
+ if (!context) {
197
+ throw new Error("useAssistente must be used within AssistenteProvider");
198
+ }
199
+ return context;
200
+ }
201
+
202
+ const colorThemes = [
203
+ {
204
+ id: "xertica-original",
205
+ name: "Xertica Classic",
206
+ description: "A identidade visual clássica da Xertica com o gradiente original",
207
+ colors: {
208
+ primary: "#2C275B",
209
+ primaryForeground: "#FFFFFF",
210
+ primaryLight: "#5B568F",
211
+ primaryDarkMode: "#72CDFD",
212
+ primaryForegroundDark: "#09090B",
213
+ sidebarLight: "#2C275B",
214
+ // Primary Color
215
+ sidebarDark: "#1a1928",
216
+ // Original Dark BG
217
+ darkBackground: "#05050d",
218
+ darkCard: "#0d0c16",
219
+ darkMuted: "#16151f",
220
+ darkBorder: "#252336",
221
+ gradientStart: "#FDB0F2",
222
+ gradientEnd: "#72CDFD",
223
+ gradientStartDark: "#7B4A7A",
224
+ gradientEndDark: "#3A5C7D",
225
+ chart1: "#2C275B",
226
+ chart2: "#047857",
227
+ chart3: "#B45309",
228
+ chart4: "#1D4ED8",
229
+ chart5: "#B91C1C"
230
+ },
231
+ preview: {
232
+ primary: "#2C275B",
233
+ secondary: "#FDB0F2",
234
+ accent: "#72CDFD"
235
+ }
236
+ },
237
+ {
238
+ id: "xertica",
239
+ name: "Xertica",
240
+ description: "A nova identidade visual da Xertica: papel quente, tintas vivas e botões em estilo serigrafia",
241
+ colors: {
242
+ // General-purpose brand accent (logo, links, radio buttons, focus rings,
243
+ // sidebar active state, badges, etc). Kept as Negro Xertica / Crema so it
244
+ // stays legible everywhere — yellow is reserved for buttonPrimaryBg below.
245
+ primary: "#1E1E1E",
246
+ // Negro Xertica
247
+ primaryForeground: "#FFFEF8",
248
+ // Marfim
249
+ primaryLight: "#1E1E1E",
250
+ primaryDarkMode: "#F2EDD8",
251
+ // Crema
252
+ primaryForegroundDark: "#1E1E1E",
253
+ sidebarLight: "#1E1E1E",
254
+ // Negro Xertica
255
+ sidebarDark: "#1E1E1E",
256
+ darkBackground: "#141311",
257
+ darkCard: "#1E1E1E",
258
+ darkMuted: "#26241f",
259
+ darkBorder: "#38352c",
260
+ gradientStart: "#1899AF",
261
+ // Celeste
262
+ gradientEnd: "#C45BAA",
263
+ // Magenta
264
+ gradientStartDark: "#126578",
265
+ gradientEndDark: "#8F3F7D",
266
+ chart1: "#3D63AC",
267
+ // Azul
268
+ chart2: "#1899AF",
269
+ // Celeste
270
+ chart3: "#FAF338",
271
+ // Amarillo
272
+ chart4: "#DE5B48",
273
+ // Rojo Coral
274
+ chart5: "#2E8B5A",
275
+ // Verde
276
+ backgroundLight: "#FFFEF8",
277
+ // Marfim
278
+ buttonRadius: "9999px",
279
+ buttonStrokeWidth: "2px",
280
+ buttonStrokeColor: "#1E1E1E",
281
+ buttonStrokeColorDark: "#F2EDD8",
282
+ // Crema
283
+ buttonSecondaryBg: "#1E1E1E",
284
+ buttonSecondaryBgDark: "#1E1E1E",
285
+ buttonSecondaryForeground: "#FFFEF8",
286
+ buttonSecondaryForegroundDark: "#FFFEF8",
287
+ // Amarillo stays vibrant, but only here — Button `default` variant and
288
+ // Switch's checked track, per the brand rule that yellow is the one
289
+ // accent allowed to dominate, and only in those two contexts.
290
+ buttonPrimaryBg: "#FAF338",
291
+ buttonPrimaryBgDark: "#FAF338",
292
+ buttonPrimaryForeground: "#1E1E1E",
293
+ buttonPrimaryForegroundDark: "#1E1E1E"
294
+ },
295
+ preview: {
296
+ primary: "#FAF338",
297
+ secondary: "#1E1E1E",
298
+ accent: "#1899AF"
299
+ }
300
+ },
301
+ {
302
+ id: "zinc",
303
+ name: "Zinc",
304
+ description: "Minimalista, sério e elegante (Escala de Cinza)",
305
+ colors: {
306
+ primary: "#18181B",
307
+ primaryForeground: "#FAFAFA",
308
+ primaryLight: "#E4E4E7",
309
+ primaryDarkMode: "#FAFAFA",
310
+ primaryForegroundDark: "#18181B",
311
+ sidebarLight: "#18181B",
312
+ // Primary Color
313
+ sidebarDark: "#09090B",
314
+ darkBackground: "#05050d",
315
+ darkCard: "#0d0c16",
316
+ darkMuted: "#16151f",
317
+ darkBorder: "#252336",
318
+ gradientStart: "#52525B",
319
+ gradientEnd: "#D4D4D8",
320
+ gradientStartDark: "#27272A",
321
+ gradientEndDark: "#52525B",
322
+ chart1: "#18181B",
323
+ chart2: "#52525B",
324
+ chart3: "#A1A1AA",
325
+ chart4: "#D4D4D8",
326
+ chart5: "#E4E4E7"
327
+ },
328
+ preview: {
329
+ primary: "#18181B",
330
+ secondary: "#52525B",
331
+ accent: "#E4E4E7"
332
+ }
333
+ },
334
+ {
335
+ id: "slate",
336
+ name: "Slate",
337
+ description: "Profissional com tons de azul acinzentado",
338
+ colors: {
339
+ primary: "#0F172A",
340
+ primaryForeground: "#F8FAFC",
341
+ primaryLight: "#CBD5E1",
342
+ primaryDarkMode: "#F8FAFC",
343
+ primaryForegroundDark: "#0F172A",
344
+ sidebarLight: "#0F172A",
345
+ // Primary Color
346
+ sidebarDark: "#020617",
347
+ darkBackground: "#05050d",
348
+ darkCard: "#0d0c16",
349
+ darkMuted: "#16151f",
350
+ darkBorder: "#252336",
351
+ gradientStart: "#475569",
352
+ gradientEnd: "#94A3B8",
353
+ gradientStartDark: "#1E293B",
354
+ gradientEndDark: "#475569",
355
+ chart1: "#0F172A",
356
+ chart2: "#475569",
357
+ chart3: "#94A3B8",
358
+ chart4: "#CBD5E1",
359
+ chart5: "#E2E8F0"
360
+ },
361
+ preview: {
362
+ primary: "#0F172A",
363
+ secondary: "#475569",
364
+ accent: "#94A3B8"
365
+ }
366
+ },
367
+ {
368
+ id: "blue",
369
+ name: "Blue",
370
+ description: "Confiável e seguro, padrão corporativo",
371
+ colors: {
372
+ primary: "#2563EB",
373
+ primaryForeground: "#FFFFFF",
374
+ primaryLight: "#DBEAFE",
375
+ primaryDarkMode: "#3B82F6",
376
+ primaryForegroundDark: "#FFFFFF",
377
+ sidebarLight: "#1E3A8A",
378
+ // Blue 900 (High Contrast Sidebar)
379
+ sidebarDark: "#172554",
380
+ darkBackground: "#03050f",
381
+ darkCard: "#080d18",
382
+ darkMuted: "#0f1422",
383
+ darkBorder: "#1a2440",
384
+ gradientStart: "#2563EB",
385
+ gradientEnd: "#60A5FA",
386
+ gradientStartDark: "#1D4ED8",
387
+ gradientEndDark: "#2563EB",
388
+ chart1: "#2563EB",
389
+ chart2: "#3B82F6",
390
+ chart3: "#60A5FA",
391
+ chart4: "#93C5FD",
392
+ chart5: "#BFDBFE"
393
+ },
394
+ preview: {
395
+ primary: "#2563EB",
396
+ secondary: "#60A5FA",
397
+ accent: "#DBEAFE"
398
+ }
399
+ },
400
+ {
401
+ id: "violet",
402
+ name: "Violet",
403
+ description: "Criativo e vibrante",
404
+ colors: {
405
+ primary: "#7C3AED",
406
+ primaryForeground: "#FFFFFF",
407
+ primaryLight: "#EDE9FE",
408
+ primaryDarkMode: "#8B5CF6",
409
+ primaryForegroundDark: "#FFFFFF",
410
+ sidebarLight: "#4C1D95",
411
+ // Violet 900 (High Contrast Sidebar)
412
+ sidebarDark: "#2E1065",
413
+ darkBackground: "#07040f",
414
+ darkCard: "#0e0a18",
415
+ darkMuted: "#150f21",
416
+ darkBorder: "#221838",
417
+ gradientStart: "#7C3AED",
418
+ gradientEnd: "#A78BFA",
419
+ gradientStartDark: "#5B21B6",
420
+ gradientEndDark: "#7C3AED",
421
+ chart1: "#7C3AED",
422
+ chart2: "#8B5CF6",
423
+ chart3: "#A78BFA",
424
+ chart4: "#C4B5FD",
425
+ chart5: "#DDD6FE"
426
+ },
427
+ preview: {
428
+ primary: "#7C3AED",
429
+ secondary: "#A78BFA",
430
+ accent: "#EDE9FE"
431
+ }
432
+ },
433
+ {
434
+ id: "rose",
435
+ name: "Rose",
436
+ description: "Elegante e suave",
437
+ colors: {
438
+ primary: "#BE123C",
439
+ // Rose 700 (Better text contrast for Primary)
440
+ primaryForeground: "#FFFFFF",
441
+ primaryLight: "#FFE4E6",
442
+ primaryDarkMode: "#F43F5E",
443
+ primaryForegroundDark: "#FFFFFF",
444
+ sidebarLight: "#881337",
445
+ // Rose 900 (High Contrast Sidebar)
446
+ sidebarDark: "#881337",
447
+ darkBackground: "#0f0305",
448
+ darkCard: "#180709",
449
+ darkMuted: "#200c0f",
450
+ darkBorder: "#3a1018",
451
+ gradientStart: "#E11D48",
452
+ gradientEnd: "#FB7185",
453
+ gradientStartDark: "#9F1239",
454
+ gradientEndDark: "#E11D48",
455
+ chart1: "#E11D48",
456
+ chart2: "#F43F5E",
457
+ chart3: "#FB7185",
458
+ chart4: "#FDA4AF",
459
+ chart5: "#FECDD3"
460
+ },
461
+ preview: {
462
+ primary: "#BE123C",
463
+ secondary: "#FB7185",
464
+ accent: "#FFE4E6"
465
+ }
466
+ },
467
+ {
468
+ id: "emerald",
469
+ name: "Emerald",
470
+ description: "Natural e equilibrado",
471
+ colors: {
472
+ primary: "#047857",
473
+ // Emerald 700 (Better text contrast for Primary)
474
+ primaryForeground: "#FFFFFF",
475
+ primaryLight: "#D1FAE5",
476
+ primaryDarkMode: "#10B981",
477
+ primaryForegroundDark: "#FFFFFF",
478
+ sidebarLight: "#064E3B",
479
+ // Emerald 900 (High Contrast Sidebar)
480
+ sidebarDark: "#064E3B",
481
+ darkBackground: "#030f08",
482
+ darkCard: "#07160c",
483
+ darkMuted: "#0c1e11",
484
+ darkBorder: "#143320",
485
+ gradientStart: "#059669",
486
+ gradientEnd: "#34D399",
487
+ gradientStartDark: "#064E3B",
488
+ gradientEndDark: "#059669",
489
+ chart1: "#059669",
490
+ chart2: "#10B981",
491
+ chart3: "#34D399",
492
+ chart4: "#6EE7B7",
493
+ chart5: "#A7F3D0"
494
+ },
495
+ preview: {
496
+ primary: "#047857",
497
+ secondary: "#34D399",
498
+ accent: "#D1FAE5"
499
+ }
500
+ },
501
+ {
502
+ id: "amber",
503
+ name: "Amber",
504
+ description: "Quente e energético",
505
+ colors: {
506
+ primary: "#B45309",
507
+ // Amber 700 (Better text contrast for Primary)
508
+ primaryForeground: "#FFFFFF",
509
+ primaryLight: "#FEF3C7",
510
+ primaryDarkMode: "#F59E0B",
511
+ primaryForegroundDark: "#FFFFFF",
512
+ sidebarLight: "#78350F",
513
+ // Amber 900 (High Contrast Sidebar)
514
+ sidebarDark: "#78350F",
515
+ darkBackground: "#0f0a03",
516
+ darkCard: "#181107",
517
+ darkMuted: "#20190d",
518
+ darkBorder: "#382e14",
519
+ gradientStart: "#D97706",
520
+ gradientEnd: "#FBBF24",
521
+ gradientStartDark: "#92400E",
522
+ gradientEndDark: "#D97706",
523
+ chart1: "#D97706",
524
+ chart2: "#F59E0B",
525
+ chart3: "#FBBF24",
526
+ chart4: "#FDE68A",
527
+ chart5: "#FEF3C7"
528
+ },
529
+ preview: {
530
+ primary: "#B45309",
531
+ secondary: "#FBBF24",
532
+ accent: "#FEF3C7"
533
+ }
534
+ },
535
+ {
536
+ id: "orange",
537
+ name: "Orange",
538
+ description: "Vibrante e amigável",
539
+ colors: {
540
+ primary: "#C2410C",
541
+ // Orange 700 (Better text contrast for Primary)
542
+ primaryForeground: "#FFFFFF",
543
+ primaryLight: "#FFEDD5",
544
+ primaryDarkMode: "#F97316",
545
+ primaryForegroundDark: "#FFFFFF",
546
+ sidebarLight: "#7C2D12",
547
+ // Orange 900 (High Contrast Sidebar)
548
+ sidebarDark: "#7C2D12",
549
+ darkBackground: "#0f0703",
550
+ darkCard: "#180e06",
551
+ darkMuted: "#20150a",
552
+ darkBorder: "#382512",
553
+ gradientStart: "#EA580C",
554
+ gradientEnd: "#FB923C",
555
+ gradientStartDark: "#9A3412",
556
+ gradientEndDark: "#EA580C",
557
+ chart1: "#EA580C",
558
+ chart2: "#F97316",
559
+ chart3: "#FB923C",
560
+ chart4: "#FDBA74",
561
+ chart5: "#FED7AA"
562
+ },
563
+ preview: {
564
+ primary: "#C2410C",
565
+ secondary: "#FB923C",
566
+ accent: "#FFEDD5"
567
+ }
568
+ }
569
+ ];
570
+
571
+ function hexToRgb(hex) {
572
+ const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
573
+ return result ? {
574
+ r: parseInt(result[1], 16),
575
+ g: parseInt(result[2], 16),
576
+ b: parseInt(result[3], 16)
577
+ } : null;
578
+ }
579
+
580
+ const BrandColorsContext = React.createContext(void 0);
581
+ const BrandColorsProvider = ({
582
+ children,
583
+ defaultTheme,
584
+ primaryColor,
585
+ useCustomTokens = false
586
+ }) => {
587
+ const [currentTheme, setCurrentTheme] = React.useState(() => {
588
+ if (primaryColor) return "custom";
589
+ return defaultTheme || "xertica-original";
590
+ });
591
+ const [radius, setRadius] = React.useState(0.5);
592
+ const [colors, setColors] = React.useState(() => {
593
+ if (primaryColor) {
594
+ return {
595
+ ...colorThemes[0].colors,
596
+ primary: primaryColor,
597
+ primaryDarkMode: primaryColor,
598
+ sidebarLight: primaryColor,
599
+ sidebarDark: primaryColor,
600
+ chart1: primaryColor
601
+ };
602
+ }
603
+ const theme = colorThemes.find((t) => t.id === currentTheme);
604
+ return theme?.colors || colorThemes[0].colors;
605
+ });
606
+ React.useEffect(() => {
607
+ if (primaryColor) {
608
+ setColors({
609
+ ...colorThemes[0].colors,
610
+ primary: primaryColor,
611
+ primaryDarkMode: primaryColor,
612
+ sidebarLight: primaryColor,
613
+ sidebarDark: primaryColor,
614
+ chart1: primaryColor
615
+ });
616
+ setCurrentTheme("custom");
617
+ return;
618
+ }
619
+ const theme = colorThemes.find((t) => t.id === currentTheme);
620
+ if (theme) {
621
+ setColors(theme.colors);
622
+ }
623
+ }, [currentTheme, primaryColor]);
624
+ const applyColors = React.useCallback(() => {
625
+ if (useCustomTokens) return;
626
+ if (typeof document === "undefined") return;
627
+ const root = document.documentElement;
628
+ const isDark = root.classList.contains("dark");
629
+ const primary = isDark ? colors.primaryDarkMode : colors.primary;
630
+ const primaryForeground = isDark ? colors.primaryForegroundDark : colors.primaryForeground;
631
+ const gradientStart = isDark ? colors.gradientStartDark : colors.gradientStart;
632
+ const gradientEnd = isDark ? colors.gradientEndDark : colors.gradientEnd;
633
+ const semantic = {
634
+ success: isDark ? "#4ade80" : "#047857",
635
+ // Green 400 / 700
636
+ warning: isDark ? "#fbbf24" : "#b45309",
637
+ // Amber 400 / 700
638
+ info: isDark ? "#60a5fa" : "#1d4ed8",
639
+ // Blue 400 / 700
640
+ destructive: isDark ? "#f87171" : "#b91c1c",
641
+ // Red 400 / 700
642
+ foreground: isDark ? "#050505" : "#ffffff"
643
+ };
644
+ const cssVars = [];
645
+ cssVars.push(`--primary: ${primary}`);
646
+ cssVars.push(`--primary-foreground: ${primaryForeground}`);
647
+ cssVars.push(`--success: ${semantic.success}`);
648
+ cssVars.push(`--success-foreground: ${semantic.foreground}`);
649
+ cssVars.push(`--warning: ${semantic.warning}`);
650
+ cssVars.push(`--warning-foreground: ${semantic.foreground}`);
651
+ cssVars.push(`--info: ${semantic.info}`);
652
+ cssVars.push(`--info-foreground: ${semantic.foreground}`);
653
+ cssVars.push(`--destructive: ${semantic.destructive}`);
654
+ cssVars.push(`--destructive-foreground: ${semantic.foreground}`);
655
+ const primaryRGB = hexToRgb(primary);
656
+ if (primaryRGB) {
657
+ cssVars.push(
658
+ `--ring: ${isDark ? colors.primaryDarkMode : `rgba(${primaryRGB.r}, ${primaryRGB.g}, ${primaryRGB.b}, 0.5)`}`
659
+ );
660
+ cssVars.push(`--xertica-primary: ${primary}`);
661
+ cssVars.push(
662
+ `--primary-light: rgba(${primaryRGB.r}, ${primaryRGB.g}, ${primaryRGB.b}, 0.15)`
663
+ );
664
+ cssVars.push(`--primary-light-foreground: ${primary}`);
665
+ }
666
+ cssVars.push(`--radius: ${radius}rem`);
667
+ cssVars.push(`--radius-button: ${colors.buttonRadius || "12px"}`);
668
+ cssVars.push(`--button-stroke-width: ${colors.buttonStrokeWidth || "0px"}`);
669
+ cssVars.push(`--chart-1: ${colors.chart1}`);
670
+ cssVars.push(`--chart-2: ${colors.chart2}`);
671
+ cssVars.push(`--chart-3: ${colors.chart3}`);
672
+ cssVars.push(`--chart-4: ${colors.chart4}`);
673
+ cssVars.push(`--chart-5: ${colors.chart5}`);
674
+ const sidebarBg = isDark ? colors.sidebarDark : colors.sidebarLight;
675
+ const isSidebarLight = sidebarBg.toLowerCase() === "#ffffff" || sidebarBg.toLowerCase() === "#f3f4f6" || sidebarBg.toLowerCase() === "#fafafa";
676
+ const sidebarFg = isSidebarLight ? "#0F172A" : "#FFFFFF";
677
+ cssVars.push(`--sidebar: ${sidebarBg}`);
678
+ cssVars.push(`--sidebar-foreground: ${sidebarFg}`);
679
+ if (primaryRGB) {
680
+ if (isSidebarLight) {
681
+ cssVars.push(
682
+ `--sidebar-accent: rgba(${primaryRGB.r}, ${primaryRGB.g}, ${primaryRGB.b}, 0.1)`
683
+ );
684
+ cssVars.push(`--sidebar-accent-foreground: ${primary}`);
685
+ cssVars.push(`--sidebar-border: rgba(0,0,0,0.1)`);
686
+ } else {
687
+ cssVars.push(`--sidebar-accent: rgba(255, 255, 255, 0.1)`);
688
+ cssVars.push(`--sidebar-accent-foreground: #FFFFFF`);
689
+ cssVars.push(`--sidebar-border: rgba(255,255,255,0.1)`);
690
+ }
691
+ cssVars.push(`--sidebar-ring: rgba(${primaryRGB.r}, ${primaryRGB.g}, ${primaryRGB.b}, 0.5)`);
692
+ }
693
+ if (!isSidebarLight) {
694
+ cssVars.push(`--sidebar-primary: #FFFFFF`);
695
+ cssVars.push(`--sidebar-primary-foreground: ${primary}`);
696
+ } else {
697
+ cssVars.push(`--sidebar-primary: ${primary}`);
698
+ cssVars.push(`--sidebar-primary-foreground: ${primaryForeground}`);
699
+ }
700
+ cssVars.push(
701
+ `--gradient-diagonal: linear-gradient(135deg, ${gradientStart} 0%, ${gradientEnd} 100%)`
702
+ );
703
+ const darkSurfaceVars = [];
704
+ if (colors.darkBackground) {
705
+ darkSurfaceVars.push(`--background: ${colors.darkBackground}`);
706
+ darkSurfaceVars.push(`--card: ${colors.darkCard}`);
707
+ darkSurfaceVars.push(`--popover: ${colors.darkCard}`);
708
+ darkSurfaceVars.push(`--secondary: ${colors.darkMuted}`);
709
+ darkSurfaceVars.push(`--muted: ${colors.darkMuted}`);
710
+ darkSurfaceVars.push(`--accent: ${colors.darkMuted}`);
711
+ darkSurfaceVars.push(`--border: ${colors.darkBorder}`);
712
+ darkSurfaceVars.push(`--input: ${colors.darkMuted}`);
713
+ darkSurfaceVars.push(`--input-background: ${colors.darkMuted}`);
714
+ }
715
+ const lightModeVars = [
716
+ `--button-stroke-color: ${colors.buttonStrokeColor || "transparent"}`,
717
+ `--button-secondary-bg: ${colors.buttonSecondaryBg || "var(--secondary)"}`,
718
+ `--button-secondary-foreground: ${colors.buttonSecondaryForeground || "var(--secondary-foreground)"}`,
719
+ `--button-primary-bg: ${colors.buttonPrimaryBg || "var(--primary)"}`,
720
+ `--button-primary-foreground: ${colors.buttonPrimaryForeground || "var(--primary-foreground)"}`
721
+ ];
722
+ if (colors.backgroundLight) {
723
+ lightModeVars.push(`--background: ${colors.backgroundLight}`);
724
+ }
725
+ darkSurfaceVars.push(
726
+ `--button-stroke-color: ${colors.buttonStrokeColorDark || colors.buttonStrokeColor || "transparent"}`
727
+ );
728
+ darkSurfaceVars.push(
729
+ `--button-secondary-bg: ${colors.buttonSecondaryBgDark || colors.buttonSecondaryBg || "var(--secondary)"}`
730
+ );
731
+ darkSurfaceVars.push(
732
+ `--button-secondary-foreground: ${colors.buttonSecondaryForegroundDark || colors.buttonSecondaryForeground || "var(--secondary-foreground)"}`
733
+ );
734
+ darkSurfaceVars.push(
735
+ `--button-primary-bg: ${colors.buttonPrimaryBgDark || colors.buttonPrimaryBg || "var(--primary)"}`
736
+ );
737
+ darkSurfaceVars.push(
738
+ `--button-primary-foreground: ${colors.buttonPrimaryForegroundDark || colors.buttonPrimaryForeground || "var(--primary-foreground)"}`
739
+ );
740
+ cssVars.forEach((declaration) => {
741
+ const eqIdx = declaration.indexOf(":");
742
+ if (eqIdx === -1) return;
743
+ const prop = declaration.substring(0, eqIdx).trim();
744
+ const val = declaration.substring(eqIdx + 1).trim();
745
+ root.style.setProperty(prop, val);
746
+ });
747
+ const styleId = "xertica-brand-colors-injection";
748
+ let styleEl = document.getElementById(styleId);
749
+ if (!styleEl) {
750
+ styleEl = document.createElement("style");
751
+ styleEl.id = styleId;
752
+ document.head.appendChild(styleEl);
753
+ } else {
754
+ document.head.appendChild(styleEl);
755
+ }
756
+ const lightModeBlock = `:root:not(.dark) {
757
+ ${lightModeVars.join(";\n ")};
758
+ }`;
759
+ const darkSurfaceBlock = darkSurfaceVars.length > 0 ? `
760
+ :root[data-mode='dark'], .dark {
761
+ ${darkSurfaceVars.join(";\n ")};
762
+ }` : "";
763
+ styleEl.innerHTML = `${lightModeBlock}${darkSurfaceBlock}`.trim();
764
+ }, [colors, currentTheme, radius, useCustomTokens]);
765
+ React.useEffect(() => {
766
+ applyColors();
767
+ }, [applyColors]);
768
+ React.useEffect(() => {
769
+ if (typeof document === "undefined" || typeof MutationObserver === "undefined") return;
770
+ const root = document.documentElement;
771
+ const observer = new MutationObserver((mutations) => {
772
+ mutations.forEach((mutation) => {
773
+ if (mutation.type === "attributes" && mutation.attributeName === "class") {
774
+ applyColors();
775
+ }
776
+ });
777
+ });
778
+ observer.observe(root, { attributes: true, attributeFilter: ["class"] });
779
+ return () => observer.disconnect();
780
+ }, [applyColors]);
781
+ const setTheme = (themeId) => {
782
+ setCurrentTheme(themeId);
783
+ };
784
+ const setBrandColor = (colorKey, value) => {
785
+ setColors((prev) => ({
786
+ ...prev,
787
+ [colorKey]: value
788
+ }));
789
+ };
790
+ return /* @__PURE__ */ jsxRuntime.jsx(
791
+ BrandColorsContext.Provider,
792
+ {
793
+ value: {
794
+ colors,
795
+ currentTheme,
796
+ themes: colorThemes,
797
+ setTheme,
798
+ setBrandColor,
799
+ radius,
800
+ setRadius
801
+ },
802
+ children
803
+ }
804
+ );
805
+ };
806
+ const useBrandColors = () => {
807
+ const context = React.useContext(BrandColorsContext);
808
+ if (context === void 0) {
809
+ throw new Error("useBrandColors must be used within a BrandColorsProvider");
810
+ }
811
+ return context;
812
+ };
813
+
814
+ exports.ApiKeyProvider = ApiKeyProvider;
815
+ exports.AssistenteProvider = AssistenteProvider;
816
+ exports.BrandColorsProvider = BrandColorsProvider;
817
+ exports.useApiKey = useApiKey;
818
+ exports.useAssistente = useAssistente;
819
+ exports.useBrandColors = useBrandColors;