@vertesia/ui 1.5.0 → 1.6.0-dev.20260918.061604Z

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 (336) hide show
  1. package/README.md +125 -0
  2. package/lib/boot/branding.d.ts +58 -0
  3. package/lib/boot/branding.d.ts.map +1 -0
  4. package/lib/boot/branding.js +62 -0
  5. package/lib/boot/branding.js.map +1 -0
  6. package/lib/boot/index.d.ts +27 -0
  7. package/lib/boot/index.d.ts.map +1 -0
  8. package/lib/boot/index.js +325 -0
  9. package/lib/boot/index.js.map +1 -0
  10. package/lib/boot/vite.d.ts +63 -0
  11. package/lib/boot/vite.d.ts.map +1 -0
  12. package/lib/boot/vite.js +108 -0
  13. package/lib/boot/vite.js.map +1 -0
  14. package/lib/core/components/shadcn/button.d.ts.map +1 -1
  15. package/lib/core/components/shadcn/button.js +1 -2
  16. package/lib/core/components/shadcn/button.js.map +1 -1
  17. package/lib/core/components/shadcn/filters/filter-styles.d.ts +1 -1
  18. package/lib/core/components/shadcn/filters/filter-styles.d.ts.map +1 -1
  19. package/lib/core/components/shadcn/filters/filter-styles.js +4 -4
  20. package/lib/core/components/shadcn/label.js +1 -1
  21. package/lib/core/components/shadcn/label.js.map +1 -1
  22. package/lib/env/index.d.ts +32 -1
  23. package/lib/env/index.d.ts.map +1 -1
  24. package/lib/env/index.js +55 -3
  25. package/lib/env/index.js.map +1 -1
  26. package/lib/features/agent/PayloadBuilder.d.ts +4 -0
  27. package/lib/features/agent/PayloadBuilder.d.ts.map +1 -1
  28. package/lib/features/agent/PayloadBuilder.js +6 -1
  29. package/lib/features/agent/PayloadBuilder.js.map +1 -1
  30. package/lib/features/agent/chat/AgentRunFeedback.d.ts +66 -0
  31. package/lib/features/agent/chat/AgentRunFeedback.d.ts.map +1 -0
  32. package/lib/features/agent/chat/AgentRunFeedback.js +298 -0
  33. package/lib/features/agent/chat/AgentRunFeedback.js.map +1 -0
  34. package/lib/features/agent/chat/ModernAgentConversation.d.ts.map +1 -1
  35. package/lib/features/agent/chat/ModernAgentConversation.js +7 -5
  36. package/lib/features/agent/chat/ModernAgentConversation.js.map +1 -1
  37. package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.d.ts +3 -1
  38. package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.d.ts.map +1 -1
  39. package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js +11 -10
  40. package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js.map +1 -1
  41. package/lib/features/agent/chat/ModernAgentOutput/Header.d.ts.map +1 -1
  42. package/lib/features/agent/chat/ModernAgentOutput/Header.js.map +1 -1
  43. package/lib/features/agent/chat/ModernAgentOutput/MessageItem.d.ts +3 -1
  44. package/lib/features/agent/chat/ModernAgentOutput/MessageItem.d.ts.map +1 -1
  45. package/lib/features/agent/chat/ModernAgentOutput/MessageItem.js +28 -7
  46. package/lib/features/agent/chat/ModernAgentOutput/MessageItem.js.map +1 -1
  47. package/lib/features/agent/chat/ModernAgentOutput/SummaryConversation.d.ts.map +1 -1
  48. package/lib/features/agent/chat/ModernAgentOutput/SummaryConversation.js +2 -0
  49. package/lib/features/agent/chat/ModernAgentOutput/SummaryConversation.js.map +1 -1
  50. package/lib/features/agent/chat/hooks/useAgentPlans.d.ts +1 -1
  51. package/lib/features/agent/chat/hooks/useAgentPlans.d.ts.map +1 -1
  52. package/lib/features/agent/chat/hooks/useAgentPlans.js +5 -5
  53. package/lib/features/agent/chat/hooks/useAgentPlans.js.map +1 -1
  54. package/lib/features/agent/chat/index.d.ts +1 -0
  55. package/lib/features/agent/chat/index.d.ts.map +1 -1
  56. package/lib/features/agent/chat/index.js +1 -0
  57. package/lib/features/agent/chat/index.js.map +1 -1
  58. package/lib/features/facets/AgentRunnerFacetsNav.d.ts +8 -0
  59. package/lib/features/facets/AgentRunnerFacetsNav.d.ts.map +1 -1
  60. package/lib/features/facets/AgentRunnerFacetsNav.js +12 -0
  61. package/lib/features/facets/AgentRunnerFacetsNav.js.map +1 -1
  62. package/lib/features/permissions/UserPermissionsProvider.d.ts +15 -1
  63. package/lib/features/permissions/UserPermissionsProvider.d.ts.map +1 -1
  64. package/lib/features/permissions/UserPermissionsProvider.js +20 -12
  65. package/lib/features/permissions/UserPermissionsProvider.js.map +1 -1
  66. package/lib/features/store/objects/search/DocumentSearchContext.d.ts.map +1 -1
  67. package/lib/features/store/objects/search/DocumentSearchContext.js +6 -1
  68. package/lib/features/store/objects/search/DocumentSearchContext.js.map +1 -1
  69. package/lib/features/store/objects/selection/SelectionActions.js +1 -1
  70. package/lib/features/store/objects/selection/SelectionActions.js.map +1 -1
  71. package/lib/features/store/types/TypeRegistry.d.ts +130 -0
  72. package/lib/features/store/types/TypeRegistry.d.ts.map +1 -1
  73. package/lib/features/store/types/search/ObjectTypeSearchContext.d.ts +130 -0
  74. package/lib/features/store/types/search/ObjectTypeSearchContext.d.ts.map +1 -1
  75. package/lib/i18n/index.d.ts +5 -4
  76. package/lib/i18n/index.d.ts.map +1 -1
  77. package/lib/i18n/index.js +16 -2
  78. package/lib/i18n/index.js.map +1 -1
  79. package/lib/i18n/locales/ar.json +30 -0
  80. package/lib/i18n/locales/de.json +30 -0
  81. package/lib/i18n/locales/en.json +30 -0
  82. package/lib/i18n/locales/es.json +30 -0
  83. package/lib/i18n/locales/fr.json +30 -0
  84. package/lib/i18n/locales/it.json +30 -0
  85. package/lib/i18n/locales/ja.json +30 -0
  86. package/lib/i18n/locales/ko.json +30 -0
  87. package/lib/i18n/locales/pt.json +30 -0
  88. package/lib/i18n/locales/ru.json +30 -0
  89. package/lib/i18n/locales/tr.json +30 -0
  90. package/lib/i18n/locales/zh-TW.json +30 -0
  91. package/lib/i18n/locales/zh.json +30 -0
  92. package/lib/layout/ErrorPage.js +1 -1
  93. package/lib/layout/ErrorPage.js.map +1 -1
  94. package/lib/layout/Navbar.d.ts.map +1 -1
  95. package/lib/layout/Navbar.js +3 -2
  96. package/lib/layout/Navbar.js.map +1 -1
  97. package/lib/session/UserSession.d.ts.map +1 -1
  98. package/lib/session/UserSession.js +2 -3
  99. package/lib/session/UserSession.js.map +1 -1
  100. package/lib/session/UserSessionProvider.d.ts +2 -1
  101. package/lib/session/UserSessionProvider.d.ts.map +1 -1
  102. package/lib/session/UserSessionProvider.js +13 -4
  103. package/lib/session/UserSessionProvider.js.map +1 -1
  104. package/lib/session/auth/composable.d.ts.map +1 -1
  105. package/lib/session/auth/composable.js +88 -3
  106. package/lib/session/auth/composable.js.map +1 -1
  107. package/lib/session/auth/domainRouting.d.ts +22 -12
  108. package/lib/session/auth/domainRouting.d.ts.map +1 -1
  109. package/lib/session/auth/domainRouting.js +35 -21
  110. package/lib/session/auth/domainRouting.js.map +1 -1
  111. package/lib/session/auth/firebase.d.ts.map +1 -1
  112. package/lib/session/auth/firebase.js +10 -0
  113. package/lib/session/auth/firebase.js.map +1 -1
  114. package/lib/session/auth/useAuthState.d.ts +9 -4
  115. package/lib/session/auth/useAuthState.d.ts.map +1 -1
  116. package/lib/session/auth/useAuthState.js +9 -4
  117. package/lib/session/auth/useAuthState.js.map +1 -1
  118. package/lib/session/index.d.ts.map +1 -1
  119. package/lib/session/index.js +3 -1
  120. package/lib/session/index.js.map +1 -1
  121. package/lib/shell/AuthScreenPreview.d.ts +12 -0
  122. package/lib/shell/AuthScreenPreview.d.ts.map +1 -0
  123. package/lib/shell/AuthScreenPreview.js +140 -0
  124. package/lib/shell/AuthScreenPreview.js.map +1 -0
  125. package/lib/shell/BrandedAuthScreens.d.ts +19 -0
  126. package/lib/shell/BrandedAuthScreens.d.ts.map +1 -0
  127. package/lib/shell/BrandedAuthScreens.js +64 -0
  128. package/lib/shell/BrandedAuthScreens.js.map +1 -0
  129. package/lib/shell/SplashScreen.d.ts +13 -2
  130. package/lib/shell/SplashScreen.d.ts.map +1 -1
  131. package/lib/shell/SplashScreen.js +20 -19
  132. package/lib/shell/SplashScreen.js.map +1 -1
  133. package/lib/shell/VertesiaShell.d.ts +15 -4
  134. package/lib/shell/VertesiaShell.d.ts.map +1 -1
  135. package/lib/shell/VertesiaShell.js +8 -3
  136. package/lib/shell/VertesiaShell.js.map +1 -1
  137. package/lib/shell/apps/StandaloneApp.js +5 -1
  138. package/lib/shell/apps/StandaloneApp.js.map +1 -1
  139. package/lib/shell/index.d.ts +6 -0
  140. package/lib/shell/index.d.ts.map +1 -1
  141. package/lib/shell/index.js +5 -0
  142. package/lib/shell/index.js.map +1 -1
  143. package/lib/shell/login/SignInAuthPending.js +1 -1
  144. package/lib/shell/login/SignInAuthPending.js.map +1 -1
  145. package/lib/shell/login/SignInEmailStep.d.ts.map +1 -1
  146. package/lib/shell/login/SignInEmailStep.js +2 -2
  147. package/lib/shell/login/SignInEmailStep.js.map +1 -1
  148. package/lib/shell/login/SignInFlow.d.ts +68 -0
  149. package/lib/shell/login/SignInFlow.d.ts.map +1 -0
  150. package/lib/shell/login/SignInFlow.js +108 -0
  151. package/lib/shell/login/SignInFlow.js.map +1 -0
  152. package/lib/shell/login/SignInIcons.d.ts +1 -1
  153. package/lib/shell/login/SignInIcons.d.ts.map +1 -1
  154. package/lib/shell/login/SignInPageShell.d.ts +13 -0
  155. package/lib/shell/login/SignInPageShell.d.ts.map +1 -0
  156. package/lib/shell/login/SignInPageShell.js +14 -0
  157. package/lib/shell/login/SignInPageShell.js.map +1 -0
  158. package/lib/shell/login/SignInPrimitives.d.ts +3 -3
  159. package/lib/shell/login/SignInPrimitives.d.ts.map +1 -1
  160. package/lib/shell/login/SignInPrimitives.js +13 -11
  161. package/lib/shell/login/SignInPrimitives.js.map +1 -1
  162. package/lib/shell/login/SignInRestrictedEnvStep.d.ts +5 -0
  163. package/lib/shell/login/SignInRestrictedEnvStep.d.ts.map +1 -1
  164. package/lib/shell/login/SignInRestrictedEnvStep.js +8 -4
  165. package/lib/shell/login/SignInRestrictedEnvStep.js.map +1 -1
  166. package/lib/shell/login/SigninScreen.d.ts +38 -3
  167. package/lib/shell/login/SigninScreen.d.ts.map +1 -1
  168. package/lib/shell/login/SigninScreen.js +33 -86
  169. package/lib/shell/login/SigninScreen.js.map +1 -1
  170. package/lib/shell/login/SignupForm.d.ts +3 -1
  171. package/lib/shell/login/SignupForm.d.ts.map +1 -1
  172. package/lib/shell/login/SignupForm.js +7 -3
  173. package/lib/shell/login/SignupForm.js.map +1 -1
  174. package/lib/shell/login/signInUtils.d.ts +12 -1
  175. package/lib/shell/login/signInUtils.d.ts.map +1 -1
  176. package/lib/shell/login/signInUtils.js +34 -11
  177. package/lib/shell/login/signInUtils.js.map +1 -1
  178. package/lib/vertesia-ui-boot.js +237 -0
  179. package/lib/vertesia-ui-boot.js.map +1 -0
  180. package/lib/vertesia-ui-core.js +88 -46
  181. package/lib/vertesia-ui-core.js.map +1 -1
  182. package/lib/vertesia-ui-env.js +1 -1
  183. package/lib/vertesia-ui-env.js.map +1 -1
  184. package/lib/vertesia-ui-features.js +350 -317
  185. package/lib/vertesia-ui-features.js.map +1 -1
  186. package/lib/vertesia-ui-i18n.B3NFclwl.chunk.js +5 -0
  187. package/lib/vertesia-ui-i18n.B3NFclwl.chunk.js.map +1 -0
  188. package/lib/vertesia-ui-i18n.BWSrNIxc.chunk.js +5 -0
  189. package/lib/vertesia-ui-i18n.BWSrNIxc.chunk.js.map +1 -0
  190. package/lib/vertesia-ui-i18n.BWvWeB1p.chunk.js +5 -0
  191. package/lib/vertesia-ui-i18n.BWvWeB1p.chunk.js.map +1 -0
  192. package/lib/vertesia-ui-i18n.BZCXvTC1.chunk.js +5 -0
  193. package/lib/vertesia-ui-i18n.BZCXvTC1.chunk.js.map +1 -0
  194. package/lib/vertesia-ui-i18n.BbJMvFZW.chunk.js +5 -0
  195. package/lib/vertesia-ui-i18n.BbJMvFZW.chunk.js.map +1 -0
  196. package/lib/vertesia-ui-i18n.CE5ldwpt.chunk.js +5 -0
  197. package/lib/vertesia-ui-i18n.CE5ldwpt.chunk.js.map +1 -0
  198. package/lib/vertesia-ui-i18n.CMC0IShY.chunk.js +5 -0
  199. package/lib/vertesia-ui-i18n.CMC0IShY.chunk.js.map +1 -0
  200. package/lib/vertesia-ui-i18n.CkcRqBKU.chunk.js +5 -0
  201. package/lib/vertesia-ui-i18n.CkcRqBKU.chunk.js.map +1 -0
  202. package/lib/vertesia-ui-i18n.D-Mq1sw_.chunk.js +5 -0
  203. package/lib/vertesia-ui-i18n.D-Mq1sw_.chunk.js.map +1 -0
  204. package/lib/vertesia-ui-i18n.DkK68-A-.chunk.js +5 -0
  205. package/lib/vertesia-ui-i18n.DkK68-A-.chunk.js.map +1 -0
  206. package/lib/vertesia-ui-i18n.XE_dcCg6.chunk.js +5 -0
  207. package/lib/vertesia-ui-i18n.XE_dcCg6.chunk.js.map +1 -0
  208. package/lib/vertesia-ui-i18n.js +2 -2
  209. package/lib/vertesia-ui-i18n.js.map +1 -1
  210. package/lib/vertesia-ui-i18n.qgNqMPvK.chunk.js +5 -0
  211. package/lib/vertesia-ui-i18n.qgNqMPvK.chunk.js.map +1 -0
  212. package/lib/vertesia-ui-layout.js +43 -19
  213. package/lib/vertesia-ui-layout.js.map +1 -1
  214. package/lib/vertesia-ui-rich-text.js +123 -74
  215. package/lib/vertesia-ui-rich-text.js.map +1 -1
  216. package/lib/vertesia-ui-router.js.map +1 -1
  217. package/lib/vertesia-ui-session.js +1 -1
  218. package/lib/vertesia-ui-session.js.map +1 -1
  219. package/lib/vertesia-ui-shell.js +87 -33
  220. package/lib/vertesia-ui-shell.js.map +1 -1
  221. package/lib/vertesia-ui-widgets.js +154 -98
  222. package/lib/vertesia-ui-widgets.js.map +1 -1
  223. package/lib/widgets/xml-viewer/hooks/useCollapsible.d.ts +1 -1
  224. package/llms.txt +6 -2
  225. package/package.json +45 -36
  226. package/src/__tests__/a11y.test.tsx +25 -0
  227. package/src/__tests__/theme.test.ts +91 -0
  228. package/src/boot/branding.test.ts +72 -0
  229. package/src/boot/branding.ts +108 -0
  230. package/src/boot/index.test.ts +216 -0
  231. package/src/boot/index.ts +356 -0
  232. package/src/boot/vite.test.ts +93 -0
  233. package/src/boot/vite.ts +118 -0
  234. package/src/core/components/shadcn/button.tsx +1 -2
  235. package/src/core/components/shadcn/filters/filter-styles.ts +4 -4
  236. package/src/core/components/shadcn/label.tsx +1 -1
  237. package/src/env/index.test.ts +127 -0
  238. package/src/env/index.ts +73 -3
  239. package/src/features/agent/PayloadBuilder.tsx +10 -1
  240. package/src/features/agent/chat/AgentRunFeedback.test.tsx +347 -0
  241. package/src/features/agent/chat/AgentRunFeedback.tsx +465 -0
  242. package/src/features/agent/chat/ModernAgentConversation.test.tsx +1 -1
  243. package/src/features/agent/chat/ModernAgentConversation.tsx +52 -47
  244. package/src/features/agent/chat/ModernAgentOutput/AllMessagesMixed.test.tsx +145 -0
  245. package/src/features/agent/chat/ModernAgentOutput/AllMessagesMixed.tsx +42 -24
  246. package/src/features/agent/chat/ModernAgentOutput/Header.tsx +4 -0
  247. package/src/features/agent/chat/ModernAgentOutput/MessageItem.tsx +38 -5
  248. package/src/features/agent/chat/ModernAgentOutput/SummaryConversation.ts +2 -0
  249. package/src/features/agent/chat/ModernAgentOutput/utils.test.ts +14 -0
  250. package/src/features/agent/chat/hooks/useAgentPlans.test.ts +52 -0
  251. package/src/features/agent/chat/hooks/useAgentPlans.ts +5 -5
  252. package/src/features/agent/chat/hooks/useFileProcessing.test.tsx +0 -5
  253. package/src/features/agent/chat/index.ts +6 -0
  254. package/src/features/facets/AgentRunnerFacetsNav.tsx +26 -0
  255. package/src/features/permissions/UserPermissionsProvider.test.tsx +50 -1
  256. package/src/features/permissions/UserPermissionsProvider.tsx +82 -44
  257. package/src/features/store/objects/search/DocumentSearchContext.ts +8 -3
  258. package/src/features/store/objects/selection/SelectionActions.tsx +4 -1
  259. package/src/i18n/index.tsx +25 -2
  260. package/src/i18n/locales/ar.json +30 -0
  261. package/src/i18n/locales/de.json +30 -0
  262. package/src/i18n/locales/en.json +30 -0
  263. package/src/i18n/locales/es.json +30 -0
  264. package/src/i18n/locales/fr.json +30 -0
  265. package/src/i18n/locales/it.json +30 -0
  266. package/src/i18n/locales/ja.json +30 -0
  267. package/src/i18n/locales/ko.json +30 -0
  268. package/src/i18n/locales/pt.json +30 -0
  269. package/src/i18n/locales/ru.json +30 -0
  270. package/src/i18n/locales/tr.json +30 -0
  271. package/src/i18n/locales/zh-TW.json +30 -0
  272. package/src/i18n/locales/zh.json +30 -0
  273. package/src/layout/ErrorPage.tsx +1 -1
  274. package/src/layout/Navbar.test.tsx +58 -0
  275. package/src/layout/Navbar.tsx +5 -2
  276. package/src/router/path.test.ts +5 -5
  277. package/src/session/UserSession.ts +2 -4
  278. package/src/session/UserSessionProvider.strict-mode.test.tsx +44 -0
  279. package/src/session/UserSessionProvider.test.ts +62 -1
  280. package/src/session/UserSessionProvider.tsx +12 -4
  281. package/src/session/auth/composable.renewal.test.ts +170 -0
  282. package/src/session/auth/composable.test.ts +23 -1
  283. package/src/session/auth/composable.ts +101 -2
  284. package/src/session/auth/domainRouting.test.ts +35 -65
  285. package/src/session/auth/domainRouting.ts +51 -34
  286. package/src/session/auth/firebase.test.ts +25 -0
  287. package/src/session/auth/firebase.ts +10 -0
  288. package/src/session/auth/useAuthState.ts +11 -4
  289. package/src/session/index.ts +3 -1
  290. package/src/shell/AuthScreenPreview.test.tsx +44 -0
  291. package/src/shell/AuthScreenPreview.tsx +228 -0
  292. package/src/shell/BrandedAuthScreens.test.tsx +181 -0
  293. package/src/shell/BrandedAuthScreens.tsx +117 -0
  294. package/src/shell/SplashScreen.test.tsx +37 -0
  295. package/src/shell/SplashScreen.tsx +44 -39
  296. package/src/shell/VertesiaShell.tsx +49 -22
  297. package/src/shell/apps/StandaloneApp.tsx +5 -1
  298. package/src/shell/index.tsx +6 -0
  299. package/src/shell/login/SignInAuthPending.tsx +3 -3
  300. package/src/shell/login/SignInEmailStep.test.tsx +32 -0
  301. package/src/shell/login/SignInEmailStep.tsx +13 -9
  302. package/src/shell/login/SignInFlow.tsx +213 -0
  303. package/src/shell/login/SignInPageShell.tsx +62 -0
  304. package/src/shell/login/SignInPrimitives.tsx +14 -11
  305. package/src/shell/login/SignInRestrictedEnvStep.tsx +19 -7
  306. package/src/shell/login/SigninScreen.test.tsx +104 -0
  307. package/src/shell/login/SigninScreen.tsx +115 -145
  308. package/src/shell/login/SignupForm.tsx +8 -3
  309. package/src/shell/login/signInUtils.ts +42 -9
  310. package/src/widgets/markdown/CollaborativeMarkdownRenderer.test.tsx +11 -3
  311. package/src/widgets/markdown/markdown.css +21 -21
  312. package/lib/vertesia-ui-i18n.BfN7iOHb.chunk.js +0 -5
  313. package/lib/vertesia-ui-i18n.BfN7iOHb.chunk.js.map +0 -1
  314. package/lib/vertesia-ui-i18n.BjH2zEZw.chunk.js +0 -5
  315. package/lib/vertesia-ui-i18n.BjH2zEZw.chunk.js.map +0 -1
  316. package/lib/vertesia-ui-i18n.BjSwAZXl.chunk.js +0 -5
  317. package/lib/vertesia-ui-i18n.BjSwAZXl.chunk.js.map +0 -1
  318. package/lib/vertesia-ui-i18n.C7PUm5Au.chunk.js +0 -5
  319. package/lib/vertesia-ui-i18n.C7PUm5Au.chunk.js.map +0 -1
  320. package/lib/vertesia-ui-i18n.CF_1mUS5.chunk.js +0 -5
  321. package/lib/vertesia-ui-i18n.CF_1mUS5.chunk.js.map +0 -1
  322. package/lib/vertesia-ui-i18n.ChfUl3_-.chunk.js +0 -5
  323. package/lib/vertesia-ui-i18n.ChfUl3_-.chunk.js.map +0 -1
  324. package/lib/vertesia-ui-i18n.D-Sk-5d1.chunk.js +0 -5
  325. package/lib/vertesia-ui-i18n.D-Sk-5d1.chunk.js.map +0 -1
  326. package/lib/vertesia-ui-i18n.D4rnu1_S.chunk.js +0 -5
  327. package/lib/vertesia-ui-i18n.D4rnu1_S.chunk.js.map +0 -1
  328. package/lib/vertesia-ui-i18n.DDf0-laK.chunk.js +0 -5
  329. package/lib/vertesia-ui-i18n.DDf0-laK.chunk.js.map +0 -1
  330. package/lib/vertesia-ui-i18n.DN79y06J.chunk.js +0 -5
  331. package/lib/vertesia-ui-i18n.DN79y06J.chunk.js.map +0 -1
  332. package/lib/vertesia-ui-i18n.DWLIciYQ.chunk.js +0 -5
  333. package/lib/vertesia-ui-i18n.DWLIciYQ.chunk.js.map +0 -1
  334. package/lib/vertesia-ui-i18n.DvF_YaAJ.chunk.js +0 -5
  335. package/lib/vertesia-ui-i18n.DvF_YaAJ.chunk.js.map +0 -1
  336. package/src/session/auth/authState.test.ts +0 -35
@@ -1,8 +1,8 @@
1
1
  export declare function useCollapsible(level: number): {
2
2
  collapsed: boolean;
3
3
  buttonProps: {
4
- role?: undefined;
5
4
  onClick?: undefined;
5
+ role?: undefined;
6
6
  style?: undefined;
7
7
  } | {
8
8
  onClick: () => void;
package/llms.txt CHANGED
@@ -505,8 +505,12 @@ Semantic Tailwind classes and approved lucide-react icon guidance for Vertesia a
505
505
 
506
506
  ### Notes
507
507
 
508
- - Examples: `text-success`, `bg-attention`, `border-destructive`, `bg-mixer-muted/30`.
509
- - Avoid hardcoded color values in application UI.
508
+ - Examples: `text-success-foreground`, `bg-attention`, `border-destructive-foreground`, `bg-mixer-muted/30`.
509
+ - Pages: `bg-background text-foreground`; cards: `bg-card text-card-foreground` (white in light mode).
510
+ - Reserve `bg-muted` for subdued sections; muted text uses `text-muted-foreground`.
511
+ - Primary buttons pair `bg-primary text-primary-foreground`; prefer `<Button>` without color overrides.
512
+ - Base names are surfaces; `-foreground` names are text/icons. `/50` changes opacity of the named token.
513
+ - Avoid hardcoded gray/black/white app surfaces and manual dark-mode surface overrides.
510
514
 
511
515
  # Key Rules
512
516
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vertesia/ui",
3
- "version": "1.5.0",
3
+ "version": "1.6.0-dev.20260918.061604Z",
4
4
  "description": "Vertesia UI components and and hooks",
5
5
  "type": "module",
6
6
  "main": "./lib/index.js",
@@ -45,38 +45,43 @@
45
45
  "@radix-ui/react-switch": "^1.3.7",
46
46
  "@radix-ui/react-tabs": "^1.1.21",
47
47
  "@radix-ui/react-tooltip": "^1.2.16",
48
+ "@vertesia/client": "1.6.0-dev.20260918.061604Z",
49
+ "@vertesia/common": "1.6.0-dev.20260918.061604Z",
50
+ "@vertesia/fusion-ux": "1.6.0-dev.20260918.061604Z",
51
+ "@vertesia/json": "1.6.0-dev.20260918.061604Z",
52
+ "@vertesia/rich-text": "1.6.0-dev.20260918.061604Z",
48
53
  "ajv": "^8.20.0",
49
54
  "ajv-formats": "^3.0.1",
50
55
  "aria-hidden": "^1.2.6",
51
56
  "class-variance-authority": "^0.7.1",
52
57
  "clsx": "^2.1.1",
53
58
  "cmdk": "^1.1.1",
54
- "dayjs": "^1.11.21",
59
+ "dayjs": "^1.11.23",
55
60
  "debounce": "^3.0.0",
56
- "dompurify": "^3.4.13",
57
- "fast-xml-parser": "^5.10.1",
58
- "firebase": "^12.17.1",
59
- "framer-motion": "^12.43.0",
60
- "i18next": "^26.3.6",
61
+ "dompurify": "^3.4.15",
62
+ "fast-xml-parser": "^5.11.1",
63
+ "firebase": "^12.18.0",
64
+ "framer-motion": "^13.2.0",
65
+ "i18next": "^26.4.2",
61
66
  "jwt-decode": "^4.0.0",
62
- "katex": "^0.18.4",
67
+ "katex": "^0.18.7",
63
68
  "lodash-es": "^4.18.1",
64
- "lucide-react": "^1.31.0",
65
- "mermaid": "^11.16.1",
69
+ "lucide-react": "^1.42.0",
70
+ "mermaid": "^11.17.2",
66
71
  "monaco-editor": "^0.56.0",
67
- "motion": "^12.43.0",
68
- "papaparse": "^5.5.4",
69
- "react": "19.2.7",
72
+ "motion": "^13.2.0",
73
+ "papaparse": "^5.7.0",
74
+ "react": "19.2.8",
70
75
  "react-calendar": "^6.0.1",
71
76
  "react-date-picker": "^12.1.0",
72
- "react-dom": "19.2.7",
73
- "react-error-boundary": "^6.1.3",
74
- "react-i18next": "^17.0.11",
77
+ "react-dom": "19.2.8",
78
+ "react-error-boundary": "^6.1.5",
79
+ "react-i18next": "^17.0.13",
75
80
  "react-markdown": "^10.1.0",
76
- "react-pdf": "^10.4.1",
81
+ "react-pdf": "^10.5.0",
77
82
  "react-remove-scroll": "^2.7.2",
78
83
  "react-remove-scroll-bar": "^2.3.8",
79
- "react-resizable-panels": "^4.12.3",
84
+ "react-resizable-panels": "^4.12.4",
80
85
  "react-style-singleton": "^2.2.3",
81
86
  "react-vega": "^8.0.0",
82
87
  "rehype-katex": "^7.0.1",
@@ -89,34 +94,30 @@
89
94
  "tailwind-merge": "^3.6.0",
90
95
  "ts-md5": "^2.0.1",
91
96
  "unist-util-visit": "^5.1.0",
92
- "vega": "^6.3.1",
93
- "vega-embed": "^7.1.0",
94
- "vega-lite": "^6.4.3",
95
- "@vertesia/fusion-ux": "1.5.0",
96
- "@vertesia/common": "1.5.0",
97
- "@vertesia/json": "1.5.0",
98
- "@vertesia/rich-text": "1.5.0",
99
- "@vertesia/client": "1.5.0"
97
+ "vega": "^6.4.0",
98
+ "vega-embed": "^7.2.0",
99
+ "vega-lite": "^6.4.3"
100
100
  },
101
101
  "devDependencies": {
102
- "@testing-library/react": "^16.3.2",
103
- "@testing-library/user-event": "^14.6.4",
102
+ "@testing-library/react": "^16.3.3",
103
+ "@testing-library/user-event": "^14.6.7",
104
104
  "@types/hast": "^3.0.5",
105
105
  "@types/lodash-es": "^4.17.12",
106
106
  "@types/node": "^24.13.3",
107
107
  "@types/papaparse": "^5.5.2",
108
- "@types/react": "19.2.17",
109
- "@types/react-dom": "19.2.3",
108
+ "@types/react": "19.2.18",
109
+ "@types/react-dom": "19.2.7",
110
+ "@vertesia/tsconfig": "0.1.0",
110
111
  "axe-core": "^4.13.0",
111
112
  "culori": "^4.0.2",
112
- "i18next-cli": "^1.69.0",
113
+ "i18next-cli": "^1.73.1",
113
114
  "jsdom": "^30.0.1",
114
- "rolldown": "1.2.4",
115
+ "rolldown": "1.2.8",
116
+ "tailwindcss": "^4.3.3",
115
117
  "typescript": "7.0.2",
116
- "vitest": "^4.1.10",
118
+ "vitest": "5.0.0",
117
119
  "vitest-axe": "^0.1.0",
118
- "wcag-contrast": "^3.0.0",
119
- "@vertesia/tsconfig": "0.1.0"
120
+ "wcag-contrast": "^3.0.0"
120
121
  },
121
122
  "exports": {
122
123
  "./styles.css": "./src/css/index.css",
@@ -133,6 +134,10 @@
133
134
  "./css/typography.css": "./src/css/typography.css",
134
135
  "./css/custom-tooltips.css": "./src/css/custom-tooltips.css",
135
136
  "./css/base.css": "./src/css/base.css",
137
+ "./boot": {
138
+ "types": "./lib/boot/index.d.ts",
139
+ "default": "./lib/boot/index.js"
140
+ },
136
141
  "./router": {
137
142
  "types": "./lib/router/index.d.ts",
138
143
  "default": "./lib/router/index.js"
@@ -172,6 +177,10 @@
172
177
  "./i18n": {
173
178
  "types": "./lib/i18n/index.d.ts",
174
179
  "default": "./lib/i18n/index.js"
180
+ },
181
+ "./boot/vite": {
182
+ "types": "./lib/boot/vite.d.ts",
183
+ "default": "./lib/boot/vite.js"
175
184
  }
176
185
  },
177
186
  "repository": {
@@ -179,7 +188,7 @@
179
188
  "url": "https://github.com/vertesia/composableai.git",
180
189
  "directory": "packages/ui"
181
190
  },
182
- "gitHead": "3485742020066ab1fd3292487cf3a9577b5e4d91",
191
+ "gitHead": "ea552337206e77c256478b76e19b4235e70bf769",
183
192
  "scripts": {
184
193
  "clean:lib": "rimraf ./lib ./tsconfig.tsbuildinfo",
185
194
  "clean": "rimraf ./node_modules ./lib ./tsconfig.tsbuildinfo",
@@ -26,6 +26,31 @@ describe('@vertesia/ui accessibility (axe)', () => {
26
26
  expect(await axe(container)).toHaveNoViolations();
27
27
  });
28
28
 
29
+ it('Button resolves custom color overrides without conflicting variant colors', () => {
30
+ const { container } = renderWithProviders(
31
+ <div>
32
+ <Button>Save</Button>
33
+ <Button className="bg-info text-info">Custom action</Button>
34
+ <Button variant="outline">Cancel</Button>
35
+ </div>,
36
+ );
37
+ const [primary, custom, outline] = container.querySelectorAll('button');
38
+ // The primary variant is the solid brand pair: `bg-primary` is the dark blue surface and
39
+ // `text-primary` resolves `--primary-foreground` (white) on top of it. Both halves use the
40
+ // bare token name -- `text-primary-foreground` is the pre-rename spelling and must not return.
41
+ expect(primary.classList.contains('bg-primary')).toBe(true);
42
+ expect(primary.classList.contains('text-primary')).toBe(true);
43
+ expect(primary.classList.contains('text-primary-foreground')).toBe(false);
44
+ // A className color override replaces the variant's pair outright, leaving no primary remnant.
45
+ expect(custom.classList.contains('bg-info')).toBe(true);
46
+ expect(custom.classList.contains('text-info')).toBe(true);
47
+ expect(custom.classList.contains('bg-primary')).toBe(false);
48
+ expect(custom.classList.contains('text-primary')).toBe(false);
49
+ // The outline variant sets a surface but no semantic ink, so it inherits the page foreground.
50
+ expect(outline.classList.contains('bg-background')).toBe(true);
51
+ expect(outline.classList.contains('text-primary')).toBe(false);
52
+ });
53
+
29
54
  it('Button defaults to type="button" but does not inject type when asChild', async () => {
30
55
  const { container } = renderWithProviders(
31
56
  <div>
@@ -0,0 +1,91 @@
1
+ // @vitest-environment node
2
+ /**
3
+ * Token contract gate. The three assertions here are convention-agnostic:
4
+ * every exposed --color-* resolves, every binding is emitted, and utilities stay
5
+ * bound to the alias so scoped overrides work.
6
+ *
7
+ * The surface/foreground pairing assertions that shipped with the -foreground
8
+ * convention were removed with it; re-add equivalents for `bg-X` -> --color-X-background.
9
+ */
10
+ import { readFileSync } from 'node:fs';
11
+ import { fileURLToPath } from 'node:url';
12
+ import { compile } from 'tailwindcss';
13
+ import { beforeAll, describe, expect, it } from 'vitest';
14
+
15
+ const readCss = (name: string) => readFileSync(new URL(`../css/${name}.css`, import.meta.url), 'utf8');
16
+ const colorCss = readCss('color');
17
+ const themeCss = readCss('theme');
18
+ let build: (classes: string[]) => string;
19
+ let source: string;
20
+
21
+ beforeAll(async () => {
22
+ const tailwindTheme = readFileSync(fileURLToPath(import.meta.resolve('tailwindcss/theme.css')), 'utf8');
23
+ source = `${tailwindTheme}\n${colorCss}\n${themeCss}\n${readCss('utilities')}\n@tailwind utilities;`;
24
+ ({ build } = await compile(source));
25
+ });
26
+
27
+ function declarations(block: string): Map<string, string> {
28
+ return new Map([...block.matchAll(/(--[\w-]+)\s*:\s*([^;]+);/g)].map((m) => [m[1], m[2].trim()]));
29
+ }
30
+
31
+ function resolve(name: string, tokens: Map<string, string>, seen = new Set<string>()): string {
32
+ if (seen.has(name)) throw new Error(`Cyclic theme token: ${name}`);
33
+ const value = tokens.get(name);
34
+ if (!value) throw new Error(`Undefined theme token: ${name}`);
35
+ const next = new Set(seen).add(name);
36
+ return value.replace(/var\((--[\w-]+)\)/g, (_, ref: string) => resolve(ref, tokens, next));
37
+ }
38
+
39
+ function rule(css: string, className: string): string {
40
+ const selector = `.${className.replaceAll('/', '\\/')} {`;
41
+ const start = css.indexOf(selector);
42
+ expect(start, `Missing utility ${className}`).toBeGreaterThanOrEqual(0);
43
+ let depth = 1;
44
+ let end = start + selector.length;
45
+ while (depth && end < css.length) {
46
+ if (css[end] === '{') depth++;
47
+ if (css[end] === '}') depth--;
48
+ end++;
49
+ }
50
+ return css.slice(start + selector.length, end - 1);
51
+ }
52
+
53
+ describe('theme utility contract', () => {
54
+ for (const mode of [':root', '.dark']) {
55
+ it(`resolves every exposed color in ${mode}`, () => {
56
+ const root = colorCss.match(/:root\s*\{([^}]+)\}/)?.[1] ?? '';
57
+ const dark = colorCss.match(/\.dark\s*\{([^}]+)\}/)?.[1] ?? '';
58
+ const tokens = declarations(`${root}\n${mode === '.dark' ? dark : ''}\n${themeCss}`);
59
+ for (const name of tokens.keys()) {
60
+ if (name.startsWith('--color-')) {
61
+ expect(resolve(name, tokens), name).not.toContain('var(');
62
+ }
63
+ }
64
+ });
65
+ }
66
+
67
+ it('emits every color binding even without utility or stylesheet consumers', async () => {
68
+ const fresh = await compile(source);
69
+ const emitted = declarations(fresh.build([]));
70
+ for (const [name, value] of declarations(themeCss)) {
71
+ if (name.startsWith('--color-')) {
72
+ expect(emitted.get(name), name).toBe(value);
73
+ }
74
+ }
75
+ });
76
+
77
+ it('keeps utilities bound to color aliases so scoped overrides take effect', () => {
78
+ const classes = [
79
+ 'bg-sidebar',
80
+ 'text-sidebar-foreground',
81
+ 'bg-sidebar-accent',
82
+ 'text-sidebar-accent-foreground',
83
+ 'border-sidebar-border',
84
+ ];
85
+ const css = build(classes);
86
+ for (const className of classes) {
87
+ const token = className.replace(/^(bg|text|border)-/, '--color-');
88
+ expect(rule(css, className)).toContain(`var(${token})`);
89
+ }
90
+ });
91
+ });
@@ -0,0 +1,72 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { brandedBootOptions, renderBrandStyles } from './branding.js';
3
+ import { injectBootScreenHtml, renderDefaultBootContent } from './index.js';
4
+
5
+ describe('shared app branding', () => {
6
+ it('escapes brand copy and logos in first paint and keeps recovery controls', () => {
7
+ const options = brandedBootOptions({
8
+ name: '<script>alert(1)</script>',
9
+ loadingIcon: { light: 'logo.svg" onerror="bad' },
10
+ copy: { loading: 'A & B' },
11
+ });
12
+ const root = document.createElement('div');
13
+ root.innerHTML = renderDefaultBootContent(options);
14
+ expect(root.querySelector('script')).toBeNull();
15
+ expect(root.querySelector('img')?.getAttribute('onerror')).toBeNull();
16
+ expect(root.querySelector('h1')).toBeNull();
17
+ expect(root.querySelector('[data-boot-reload]')?.className).toBe('vboot-btn');
18
+ expect(root.querySelector('#loading-slow-notice')?.className).toBe('vboot-slow');
19
+ expect(root.querySelector('#loading-slow-notice p')).toBeTruthy();
20
+ expect(root.querySelector<HTMLElement>('#loading-slow-reload')?.style.display).toBe('none');
21
+ const html = injectBootScreenHtml('<html><head></head><body><div id="root"></div></body></html>', options);
22
+ expect(html).not.toContain('<script>alert(1)</script>');
23
+ });
24
+
25
+ it('scopes React colors and keeps decorative accents separate from button text', () => {
26
+ const css = renderBrandStyles(
27
+ { name: 'Test', colors: { light: { accent: '#ff6200' }, dark: { background: '#161d26' } } },
28
+ '[data-vbrand="one"]',
29
+ );
30
+ expect(css).toContain('[data-vbrand="one"] {');
31
+ expect(css).not.toContain('display:');
32
+ expect(css).not.toContain('padding:');
33
+ expect(css).toContain('--info:#ff6200');
34
+ expect(css).toContain('--color-background:#161d26');
35
+ expect(renderDefaultBootContent(brandedBootOptions({ name: 'Test' }))).toBe(renderDefaultBootContent());
36
+ expect(css).not.toContain('.vbrand {');
37
+ });
38
+
39
+ it('shares custom animation and keyframes between React and boot, and supports static logos', () => {
40
+ const brand = {
41
+ name: 'Test',
42
+ loadingIcon: {
43
+ light: 'icon.svg',
44
+ animation: 'example-dim 2s ease-in-out infinite',
45
+ keyframes: '@keyframes example-dim { 50% { opacity: 0.35; } }',
46
+ },
47
+ };
48
+ for (const css of [renderBrandStyles(brand), brandedBootOptions(brand).styles]) {
49
+ expect(css).toContain('--vertesia-loading-animation:example-dim 2s ease-in-out infinite;');
50
+ expect(css).toContain('--vertesia-loading-pulse-animation:none;');
51
+ expect(css).toContain(brand.loadingIcon.keyframes);
52
+ }
53
+ expect(renderBrandStyles({ name: 'Default' })).not.toContain('--vertesia-loading-animation:');
54
+ expect(renderBrandStyles({ ...brand, loadingIcon: { light: 'icon.svg', animation: 'none' } })).toContain(
55
+ '--vertesia-loading-animation:none;',
56
+ );
57
+ expect(() =>
58
+ renderBrandStyles({ ...brand, loadingIcon: { light: 'icon.svg', animation: 'none;}body{}' } }),
59
+ ).toThrow('Invalid loading icon animation');
60
+ expect(() =>
61
+ renderBrandStyles({ ...brand, loadingIcon: { light: 'icon.svg', keyframes: '</style>' } }),
62
+ ).toThrow('Invalid loading icon keyframes');
63
+ });
64
+
65
+ it('rejects CSS declaration injection and escapes font names', () => {
66
+ expect(() =>
67
+ renderBrandStyles({ name: 'Test', colors: { light: { background: 'red;}body{display:none' } } }),
68
+ ).toThrow('Invalid branding color');
69
+ const css = renderBrandStyles({ name: 'Test', font: { family: '</style>', regular: 'font.woff2' } });
70
+ expect(css).not.toContain('</style>');
71
+ });
72
+ });
@@ -0,0 +1,108 @@
1
+ /** Data-only branding shared by the build-time boot screen and the React shell. */
2
+ export interface AppBranding {
3
+ name: string;
4
+ title?: string;
5
+ logo?: { light: string; dark?: string; alt?: string };
6
+ favicon?: string;
7
+ /** Small icon used by the existing loading layouts. */
8
+ loadingIcon?: {
9
+ light: string;
10
+ dark?: string;
11
+ /** CSS animation shorthand for boot and auth loading. Use 'none' for a static logo. */
12
+ animation?: string;
13
+ /** Trusted app-authored @keyframes CSS, shared by boot and React. Use app-specific names. */
14
+ keyframes?: string;
15
+ };
16
+ font?: { family: string; regular: string; bold?: string };
17
+ colors?: { light?: BrandColors; dark?: BrandColors };
18
+ copy?: {
19
+ welcome?: string;
20
+ emailPlaceholder?: string;
21
+ loading?: string;
22
+ slowLoading?: string;
23
+ reload?: string;
24
+ footer?: string;
25
+ /** Optional auth./signup. translation overrides, local to this shell. */
26
+ translations?: Record<string, string>;
27
+ };
28
+ /** File paths in source configuration; trusted HTML/CSS content after build-time resolution. */
29
+ boot?: { html?: string; styles?: string };
30
+ }
31
+
32
+ export interface BrandColors {
33
+ background?: string;
34
+ foreground?: string;
35
+ /** Decorative accents, focus indicators, and spinners; never used as body text. */
36
+ accent?: string;
37
+ button?: string;
38
+ buttonText?: string;
39
+ }
40
+
41
+ export function defineAppBranding(branding: AppBranding): AppBranding {
42
+ return branding;
43
+ }
44
+
45
+ export function escapeBrandHtml(value: string): string {
46
+ return value.replace(
47
+ /[&<>"']/g,
48
+ (char) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' })[char] ?? char,
49
+ );
50
+ }
51
+
52
+ function cssString(value: string): string {
53
+ return JSON.stringify(value).replace(/</g, '\\3c ');
54
+ }
55
+
56
+ function colorDeclarations(colors?: BrandColors): string {
57
+ const variables: Record<keyof BrandColors, string[]> = {
58
+ background: ['--background', '--color-background', '--vb-bg'],
59
+ foreground: ['--foreground', '--color-foreground', '--vb-fg'],
60
+ accent: ['--info', '--info-foreground', '--color-info', '--color-info-foreground'],
61
+ button: ['--primary', '--color-primary', '--vb-primary', '--auth-button'],
62
+ buttonText: ['--primary-foreground', '--color-primary-foreground', '--vb-primary-fg', '--auth-button-text'],
63
+ };
64
+ return Object.entries(colors ?? {})
65
+ .map(([key, value]) => {
66
+ if (!Object.hasOwn(variables, key) || /[;{}<>]/.test(value))
67
+ throw new Error(`Invalid branding color: ${key}`);
68
+ return variables[key as keyof BrandColors].map((name) => `${name}:${value};`).join('');
69
+ })
70
+ .join('');
71
+ }
72
+
73
+ /** Theme tokens only: branding must never replace the shared page layout. */
74
+ export function renderBrandStyles(brand: AppBranding, selector = '.vbrand'): string {
75
+ const animation = brand.loadingIcon?.animation;
76
+ const keyframes = brand.loadingIcon?.keyframes ?? '';
77
+ if (animation !== undefined && /[;{}<>]/.test(animation)) throw new Error('Invalid loading icon animation');
78
+ if (/[<>]/.test(keyframes)) throw new Error('Invalid loading icon keyframes');
79
+ const motion =
80
+ animation === undefined
81
+ ? ''
82
+ : `--vertesia-loading-animation:${animation};--vertesia-loading-pulse-animation:none;`;
83
+ const font = brand.font;
84
+ const faces = font
85
+ ? `@font-face { font-family:${cssString(font.family)};src:url(${cssString(font.regular)});font-weight:400;font-display:swap; }
86
+ ${font.bold ? `@font-face { font-family:${cssString(font.family)};src:url(${cssString(font.bold)});font-weight:700;font-display:swap; }` : ''}`
87
+ : '';
88
+ return `${faces}
89
+ ${keyframes}
90
+ ${selector} { ${motion}${colorDeclarations(brand.colors?.light)}${font ? `font-family:${cssString(font.family)};` : ''} }
91
+ .dark ${selector},${selector}.vboot-dark { ${colorDeclarations(brand.colors?.dark)} }
92
+ `;
93
+ }
94
+
95
+ export function brandedBootOptions(brand: AppBranding): import('./index.js').BootScreenOptions {
96
+ return {
97
+ iconSrc: brand.loadingIcon?.light,
98
+ darkIconSrc: brand.loadingIcon?.dark,
99
+ loadingLabel: brand.copy?.loading,
100
+ slowLoadingLabel: brand.copy?.slowLoading,
101
+ reloadLabel: brand.copy?.reload,
102
+ html: brand.boot?.html,
103
+ styles: `${renderBrandStyles(brand, '#loading-indicator')}
104
+ ${brand.colors?.light?.background ? `:root{--vertesia-boot-background:${brand.colors.light.background}}` : ''}
105
+ ${brand.colors?.dark?.background ? `:root.dark{--vertesia-boot-background:${brand.colors.dark.background}}` : ''}
106
+ ${brand.boot?.styles ?? ''}`,
107
+ };
108
+ }