xertica-ui 2.7.0 → 2.9.6

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 (480) hide show
  1. package/CHANGELOG.md +114 -0
  2. package/README.md +20 -12
  3. package/bin/cli.ts +327 -87
  4. package/bin/generate-tokens.ts +25 -9
  5. package/bin/language-config.ts +58 -18
  6. package/components/assistant/xertica-assistant/xertica-assistant.tsx +1 -1
  7. package/components/blocks/auth/AuthPageShell.tsx +63 -18
  8. package/components/blocks/auth/SocialLoginButtons.tsx +3 -3
  9. package/components/blocks/index.ts +1 -0
  10. package/components/blocks/marketing/CTASection.tsx +73 -0
  11. package/components/blocks/marketing/ComplianceBadgeRow.tsx +49 -0
  12. package/components/blocks/marketing/EvidenceTimeline.tsx +91 -0
  13. package/components/blocks/marketing/FeatureRow.tsx +78 -0
  14. package/components/blocks/marketing/Hero.tsx +125 -0
  15. package/components/blocks/marketing/HowItWorksSteps.tsx +90 -0
  16. package/components/blocks/marketing/LogoCloud.tsx +47 -0
  17. package/components/blocks/marketing/MarketingFooter.tsx +109 -0
  18. package/components/blocks/marketing/MarketingNavbar.tsx +192 -0
  19. package/components/blocks/marketing/PillBadge.tsx +96 -0
  20. package/components/blocks/marketing/SectionHeading.tsx +82 -0
  21. package/components/blocks/marketing/ServiceCardGrid.tsx +238 -0
  22. package/components/blocks/marketing/StatBand.tsx +99 -0
  23. package/components/blocks/marketing/TopAccentCards.tsx +91 -0
  24. package/components/blocks/marketing/index.ts +41 -0
  25. package/components/brand/index.ts +1 -0
  26. package/components/brand/isotype/Isotype.tsx +64 -0
  27. package/components/brand/isotype/IsotypeDiagonal.tsx +51 -0
  28. package/components/brand/isotype/IsotypeFrames.tsx +82 -0
  29. package/components/brand/isotype/IsotypeMini.tsx +65 -0
  30. package/components/brand/isotype/IsotypeTwist.tsx +68 -0
  31. package/components/brand/isotype/frame-variants.ts +20 -0
  32. package/components/brand/isotype/index.ts +9 -0
  33. package/components/brand/isotype/isotype-diagonal.mdx +52 -0
  34. package/components/brand/isotype/isotype-diagonal.stories.tsx +44 -0
  35. package/components/brand/isotype/isotype-diagonal.test.tsx +180 -0
  36. package/components/brand/isotype/isotype-frames.mdx +50 -0
  37. package/components/brand/isotype/isotype-frames.stories.tsx +63 -0
  38. package/components/brand/isotype/isotype-frames.test.tsx +92 -0
  39. package/components/brand/isotype/isotype-mini.mdx +61 -0
  40. package/components/brand/isotype/isotype-mini.stories.tsx +75 -0
  41. package/components/brand/isotype/isotype-mini.test.tsx +45 -0
  42. package/components/brand/isotype/isotype-twist.test.tsx +71 -0
  43. package/components/brand/isotype/isotype.mdx +61 -0
  44. package/components/brand/isotype/isotype.stories.tsx +74 -0
  45. package/components/brand/isotype/isotype.test.tsx +41 -0
  46. package/components/brand/isotype/mini-patterns.ts +50 -0
  47. package/components/brand/isotype/patterns.ts +83 -0
  48. package/components/brand/isotype/twist-variants.ts +20 -0
  49. package/components/pages/forgot-password-page/ForgotPasswordPage.tsx +3 -6
  50. package/components/pages/index.ts +1 -0
  51. package/components/pages/landing-page/LandingPage.tsx +360 -0
  52. package/components/pages/landing-page/index.ts +1 -0
  53. package/components/pages/login-page/LoginPage.tsx +3 -6
  54. package/components/pages/reset-password-page/ResetPasswordPage.tsx +1 -4
  55. package/components/pages/verify-email-page/VerifyEmailPage.tsx +2 -5
  56. package/components/ui/button/button.test.tsx +3 -3
  57. package/components/ui/button/button.tsx +5 -4
  58. package/components/ui/card/card.test.tsx +12 -0
  59. package/components/ui/card/card.tsx +16 -2
  60. package/components/ui/input/input.tsx +1 -1
  61. package/components/ui/input-otp/input-otp.tsx +1 -1
  62. package/components/ui/search/search.tsx +1 -1
  63. package/components/ui/select/select.tsx +2 -2
  64. package/components/ui/switch/switch.tsx +1 -1
  65. package/components/ui/textarea/textarea.tsx +1 -1
  66. package/contexts/BrandColorsContext.tsx +59 -7
  67. package/contexts/theme-data.ts +127 -3
  68. package/dist/AssistantChart-BFBJXVcm.js +3383 -0
  69. package/dist/AssistantChart-BTnE94FR.cjs +3551 -0
  70. package/dist/AssistantChart-BU48lxL2.js +3383 -0
  71. package/dist/AssistantChart-BvccsQMx.cjs +3551 -0
  72. package/dist/AssistantChart-CkskcBVD.js +3383 -0
  73. package/dist/AssistantChart-CoN6ga6Z.js +3383 -0
  74. package/dist/AssistantChart-CrPkO9ip.js +3383 -0
  75. package/dist/AssistantChart-DIRYJ7WY.js +3383 -0
  76. package/dist/AssistantChart-DKz2O1R8.cjs +3551 -0
  77. package/dist/AssistantChart-DOnY1ZlD.cjs +3551 -0
  78. package/dist/AssistantChart-DYL6UEvo.cjs +3551 -0
  79. package/dist/AssistantChart-DjM3qnp5.cjs +3551 -0
  80. package/dist/AssistantChart-hxPyE1S9.cjs +3551 -0
  81. package/dist/AssistantChart-keo-ogKi.js +3383 -0
  82. package/dist/AudioPlayer-AoU5MTiM.cjs +1282 -0
  83. package/dist/AudioPlayer-Bx1vrblm.js +1278 -0
  84. package/dist/AudioPlayer-CpihsbaD.js +1278 -0
  85. package/dist/AudioPlayer-CvGajzMC.cjs +1282 -0
  86. package/dist/AudioPlayer-CvHpFqDG.cjs +1282 -0
  87. package/dist/AudioPlayer-D0-I6J3J.cjs +1282 -0
  88. package/dist/AudioPlayer-D4S7GQou.js +1278 -0
  89. package/dist/AudioPlayer-DIWX_Yg7.cjs +1282 -0
  90. package/dist/AudioPlayer-DrWJnS7c.js +1278 -0
  91. package/dist/AudioPlayer-_P-Z7pAK.js +1278 -0
  92. package/dist/BrandColorsContext-B25Bpr3b.cjs +819 -0
  93. package/dist/BrandColorsContext-BCieATdW.js +812 -0
  94. package/dist/BrandColorsContext-BNKLUVcU.js +829 -0
  95. package/dist/BrandColorsContext-DNZGHItQ.cjs +836 -0
  96. package/dist/BrandColorsContext-DP0DXAXS.js +824 -0
  97. package/dist/BrandColorsContext-DjpC9wR_.cjs +798 -0
  98. package/dist/BrandColorsContext-MpXFhte7.cjs +831 -0
  99. package/dist/BrandColorsContext-Ug_TZ8yn.cjs +846 -0
  100. package/dist/BrandColorsContext-V3tOc-Zw.js +791 -0
  101. package/dist/BrandColorsContext-z0O2LlZz.js +839 -0
  102. package/dist/CodeBlock-BkaZf-R8.cjs +223 -0
  103. package/dist/CodeBlock-CK4rO6lM.js +221 -0
  104. package/dist/CodeBlock-CKXamfVd.cjs +223 -0
  105. package/dist/CodeBlock-CKu8LgbP.cjs +223 -0
  106. package/dist/CodeBlock-CVmE7isS.cjs +223 -0
  107. package/dist/CodeBlock-D7i5-cMv.js +221 -0
  108. package/dist/CodeBlock-Dg56j2ut.cjs +223 -0
  109. package/dist/CodeBlock-DiLS5LLI.js +221 -0
  110. package/dist/CodeBlock-Dt6nUQoo.js +221 -0
  111. package/dist/CodeBlock-zdylBGdZ.js +221 -0
  112. package/dist/CustomTooltipContent-BAR5qCQg.js +33 -0
  113. package/dist/CustomTooltipContent-Bxynuq7T.js +33 -0
  114. package/dist/CustomTooltipContent-BzjOSA0P.cjs +54 -0
  115. package/dist/CustomTooltipContent-C-ZeCNsf.js +33 -0
  116. package/dist/CustomTooltipContent-CBLHBxX8.cjs +54 -0
  117. package/dist/CustomTooltipContent-CON_QrXm.cjs +54 -0
  118. package/dist/CustomTooltipContent-CjWm3jjV.js +33 -0
  119. package/dist/CustomTooltipContent-DTV9MN9E.cjs +54 -0
  120. package/dist/CustomTooltipContent-UR_n2QfW.js +33 -0
  121. package/dist/CustomTooltipContent-v1SXjoFn.cjs +54 -0
  122. package/dist/EvidenceTimeline-DrRk4yqb.cjs +560 -0
  123. package/dist/EvidenceTimeline-l4MaV4C7.js +546 -0
  124. package/dist/FeatureCard-4n_8a63v.cjs +497 -0
  125. package/dist/FeatureCard-BLiAWT3w.js +485 -0
  126. package/dist/FeatureCard-BXRW97Ef.cjs +497 -0
  127. package/dist/FeatureCard-CDgLlWE2.js +485 -0
  128. package/dist/FeatureCard-CIbBHqeY.cjs +497 -0
  129. package/dist/FeatureCard-CgQ8lq-I.cjs +497 -0
  130. package/dist/FeatureCard-Cp8cVC6T.cjs +497 -0
  131. package/dist/FeatureCard-D0MwrTRP.js +485 -0
  132. package/dist/FeatureCard-DtoKPSfW.cjs +497 -0
  133. package/dist/FeatureCard-P4iEpBmB.js +485 -0
  134. package/dist/FeatureCard-e3f8bnF0.js +485 -0
  135. package/dist/FeatureCard-uE5i0in_.js +485 -0
  136. package/dist/ImageWithFallback-BOh1FM3I.js +98 -0
  137. package/dist/ImageWithFallback-BQO7952C.js +98 -0
  138. package/dist/ImageWithFallback-BkMXHCvV.cjs +122 -0
  139. package/dist/ImageWithFallback-C1ww9Hg3.cjs +122 -0
  140. package/dist/ImageWithFallback-C72nwszA.cjs +122 -0
  141. package/dist/ImageWithFallback-CBrkAEo3.cjs +122 -0
  142. package/dist/ImageWithFallback-CCUMDuEC.cjs +122 -0
  143. package/dist/ImageWithFallback-CGk5zPH-.js +98 -0
  144. package/dist/ImageWithFallback-CfnoFFSP.js +98 -0
  145. package/dist/ImageWithFallback-DQD5TTlY.js +98 -0
  146. package/dist/Isotype--fRZWwS6.js +85 -0
  147. package/dist/Isotype-0dpLqetB.js +85 -0
  148. package/dist/Isotype-B8XLEXSB.cjs +92 -0
  149. package/dist/Isotype-ChKwN7e-.cjs +91 -0
  150. package/dist/IsotypeDiagonal-CuPYPP4f.js +84 -0
  151. package/dist/IsotypeDiagonal-eNcOXRAc.cjs +91 -0
  152. package/dist/IsotypeDiagonal-oiwpXZhE.js +104 -0
  153. package/dist/IsotypeDiagonal-xMFoFXkb.cjs +109 -0
  154. package/dist/IsotypeFrames-BcWtyAWp.cjs +83 -0
  155. package/dist/IsotypeFrames-BnvSJKiH.cjs +73 -0
  156. package/dist/IsotypeFrames-iDRTRuIu.js +79 -0
  157. package/dist/IsotypeFrames-qoXOvOJt.js +69 -0
  158. package/dist/IsotypeMini-CQtWVo3h.js +126 -0
  159. package/dist/IsotypeMini-Cu_sW5yN.cjs +134 -0
  160. package/dist/IsotypeTwist-BTdNL4iV.js +106 -0
  161. package/dist/IsotypeTwist-DvsUgZs_.cjs +115 -0
  162. package/dist/LanguageContext-B1aOXO-K.js +1987 -0
  163. package/dist/LanguageContext-BP0k7AzI.js +1993 -0
  164. package/dist/LanguageContext-CChcIHIG.cjs +1998 -0
  165. package/dist/LanguageContext-ubC7TSs_.cjs +1992 -0
  166. package/dist/LanguageSelector-1XhM7R1i.cjs +48 -0
  167. package/dist/LanguageSelector-B3ZVNc55.js +46 -0
  168. package/dist/LanguageSelector-BLFPXGo8.cjs +48 -0
  169. package/dist/LanguageSelector-CYRzWkRZ.cjs +48 -0
  170. package/dist/LanguageSelector-Cj6zl0CM.js +46 -0
  171. package/dist/LanguageSelector-CyHjZgC4.cjs +48 -0
  172. package/dist/LanguageSelector-DE8lIySO.js +46 -0
  173. package/dist/LanguageSelector-DK1zD4VH.cjs +48 -0
  174. package/dist/LanguageSelector-DUr1hjBW.js +46 -0
  175. package/dist/LanguageSelector-DjbWIKWC.js +46 -0
  176. package/dist/LanguageSelector-DseCAa0p.cjs +48 -0
  177. package/dist/LanguageSelector-Du09anfM.js +46 -0
  178. package/dist/LanguageSelector-PZHlFfEs.cjs +48 -0
  179. package/dist/LanguageSelector-SB-NJSmx.js +46 -0
  180. package/dist/LogoCloud-C_uMKVNg.cjs +513 -0
  181. package/dist/LogoCloud-DJsMPNPh.js +500 -0
  182. package/dist/MarketingFooter-B_ycEdTJ.cjs +727 -0
  183. package/dist/MarketingFooter-Bhx-2Vlr.cjs +727 -0
  184. package/dist/MarketingFooter-Br1MGK9e.js +699 -0
  185. package/dist/MarketingFooter-BwE1vmeX.cjs +700 -0
  186. package/dist/MarketingFooter-CsZ1_xL9.js +709 -0
  187. package/dist/MarketingFooter-DCwf78Q4.cjs +716 -0
  188. package/dist/MarketingFooter-KH2r-OOL.js +709 -0
  189. package/dist/MarketingFooter-nB7G7gQ5.js +682 -0
  190. package/dist/PasswordStrengthMeter-B3S6i_k4.cjs +179 -0
  191. package/dist/PasswordStrengthMeter-B8ky1nJI.js +173 -0
  192. package/dist/PasswordStrengthMeter-C5VEopH-.cjs +179 -0
  193. package/dist/PasswordStrengthMeter-CIm7_jNT.js +173 -0
  194. package/dist/PasswordStrengthMeter-DKSAbQzu.js +173 -0
  195. package/dist/PasswordStrengthMeter-DxLu54p-.cjs +179 -0
  196. package/dist/PasswordStrengthMeter-k-e9Pole.cjs +179 -0
  197. package/dist/PasswordStrengthMeter-pAi2viq5.js +173 -0
  198. package/dist/SectionHeading-DEeOKcAd.cjs +857 -0
  199. package/dist/SectionHeading-DMNObcwm.js +838 -0
  200. package/dist/ThemeToggle--CGJjQJv.cjs +219 -0
  201. package/dist/ThemeToggle-4pQbVkpK.js +215 -0
  202. package/dist/ThemeToggle-B6rIVLvC.cjs +219 -0
  203. package/dist/ThemeToggle-BUOTps5l.cjs +219 -0
  204. package/dist/ThemeToggle-Bn_7Pmfe.js +215 -0
  205. package/dist/ThemeToggle-CO5mPl6e.js +215 -0
  206. package/dist/ThemeToggle-CoL8Ady7.js +215 -0
  207. package/dist/ThemeToggle-D2Wzm5bn.cjs +219 -0
  208. package/dist/ThemeToggle-DbZQ0JSV.cjs +219 -0
  209. package/dist/ThemeToggle-vLXEq2TS.js +215 -0
  210. package/dist/VerifyEmailPage-90lK6pP4.js +3258 -0
  211. package/dist/VerifyEmailPage-BJX1Rter.cjs +3320 -0
  212. package/dist/VerifyEmailPage-BSWvOgry.js +3310 -0
  213. package/dist/VerifyEmailPage-BTjI2c9n.js +2954 -0
  214. package/dist/VerifyEmailPage-CDqIkhx-.js +3224 -0
  215. package/dist/VerifyEmailPage-CJGfDSOx.js +2954 -0
  216. package/dist/VerifyEmailPage-Crxje3ZB.js +3323 -0
  217. package/dist/VerifyEmailPage-D2ShbuEN.cjs +3333 -0
  218. package/dist/VerifyEmailPage-DEBZXQ7c.cjs +3310 -0
  219. package/dist/VerifyEmailPage-DGaX-jZv.cjs +3268 -0
  220. package/dist/VerifyEmailPage-DOlZUNc0.cjs +2963 -0
  221. package/dist/VerifyEmailPage-DQPRl_RJ.js +2954 -0
  222. package/dist/VerifyEmailPage-DrdqMbLC.cjs +2963 -0
  223. package/dist/VerifyEmailPage-ZtOPkgOA.cjs +3234 -0
  224. package/dist/VerifyEmailPage-hyDfeCRa.cjs +2963 -0
  225. package/dist/VerifyEmailPage-kKSXl8vu.cjs +2963 -0
  226. package/dist/VerifyEmailPage-s927GSiR.js +3300 -0
  227. package/dist/VerifyEmailPage-w4N-bDhU.js +2954 -0
  228. package/dist/XerticaOrbe-B9tegV1n.js +1925 -0
  229. package/dist/XerticaOrbe-BHex09xs.js +1925 -0
  230. package/dist/XerticaOrbe-BKW3LJEz.js +1925 -0
  231. package/dist/XerticaOrbe-BQ_NjwPS.cjs +1927 -0
  232. package/dist/XerticaOrbe-BdUX171Q.cjs +1927 -0
  233. package/dist/XerticaOrbe-BdlKXRHU.cjs +1927 -0
  234. package/dist/XerticaOrbe-Br2i99U_.cjs +1927 -0
  235. package/dist/XerticaOrbe-CByPAFE5.js +1925 -0
  236. package/dist/XerticaOrbe-Ccu9eFMu.js +1925 -0
  237. package/dist/XerticaOrbe-kjFmuyx-.cjs +1927 -0
  238. package/dist/XerticaProvider-BVid1oqn.cjs +46 -0
  239. package/dist/XerticaProvider-Bi5lKC9N.js +44 -0
  240. package/dist/XerticaProvider-BrPMVhiv.js +44 -0
  241. package/dist/XerticaProvider-Bz_YfNY4.js +44 -0
  242. package/dist/XerticaProvider-CnX5kt5W.cjs +46 -0
  243. package/dist/XerticaProvider-CtvYfRbZ.cjs +46 -0
  244. package/dist/XerticaProvider-DEKNJTlN.js +44 -0
  245. package/dist/XerticaProvider-DMiyExQS.js +44 -0
  246. package/dist/XerticaProvider-DP2lzKip.cjs +46 -0
  247. package/dist/XerticaProvider-De79hhgp.js +44 -0
  248. package/dist/XerticaProvider-Dkk1Vbsy.js +44 -0
  249. package/dist/XerticaProvider-EdzH9Nrw.cjs +46 -0
  250. package/dist/XerticaProvider-X_wavDYA.cjs +46 -0
  251. package/dist/XerticaProvider-b3n_oL8w.cjs +46 -0
  252. package/dist/alert-dialog--qdlmB5i.cjs +872 -0
  253. package/dist/alert-dialog-9XYAn5z5.js +819 -0
  254. package/dist/alert-dialog-B281hud0.cjs +872 -0
  255. package/dist/alert-dialog-BVWbrcrw.cjs +872 -0
  256. package/dist/alert-dialog-B_Ko1xpu.js +819 -0
  257. package/dist/alert-dialog-C48TOdYU.cjs +872 -0
  258. package/dist/alert-dialog-CEPpnpXt.js +819 -0
  259. package/dist/alert-dialog-CIxE8T-J.cjs +872 -0
  260. package/dist/alert-dialog-DW-_iPuf.js +819 -0
  261. package/dist/alert-dialog-NjflitDa.js +819 -0
  262. package/dist/assistant.cjs.js +2 -2
  263. package/dist/assistant.es.js +2 -2
  264. package/dist/avatar-BJwIMbZ_.js +54 -0
  265. package/dist/avatar-C4Zh5fAJ.cjs +77 -0
  266. package/dist/avatar-CTEUKZUT.js +54 -0
  267. package/dist/avatar-CtEKgg7s.cjs +77 -0
  268. package/dist/avatar-D03MNQxs.js +54 -0
  269. package/dist/avatar-D1bZhlhL.cjs +77 -0
  270. package/dist/avatar-DKIxHeKG.cjs +77 -0
  271. package/dist/avatar-Df7KgSvs.js +54 -0
  272. package/dist/avatar-Gy0_Xu9i.cjs +77 -0
  273. package/dist/avatar-v16eZC8p.js +54 -0
  274. package/dist/blocks.cjs.js +33 -18
  275. package/dist/blocks.es.js +2 -2
  276. package/dist/brand.cjs.js +110 -4
  277. package/dist/brand.es.js +98 -4
  278. package/dist/breadcrumb-B1mUiaWB.cjs +98 -0
  279. package/dist/breadcrumb-BGO5PZPG.js +90 -0
  280. package/dist/breadcrumb-BIRgmem-.js +90 -0
  281. package/dist/breadcrumb-BSng-oUf.cjs +98 -0
  282. package/dist/breadcrumb-BvGAY4ne.cjs +98 -0
  283. package/dist/breadcrumb-CES7furU.js +90 -0
  284. package/dist/breadcrumb-CP275kbF.cjs +98 -0
  285. package/dist/breadcrumb-CU-punra.js +90 -0
  286. package/dist/breadcrumb-D7hr1EvJ.js +90 -0
  287. package/dist/breadcrumb-DjV9wfX1.cjs +98 -0
  288. package/dist/button-B05czY_8.js +62 -0
  289. package/dist/button-B3SE1liJ.js +62 -0
  290. package/dist/button-BMDlWZR8.cjs +85 -0
  291. package/dist/button-BYtQygX5.cjs +85 -0
  292. package/dist/button-BnAW-a_w.js +62 -0
  293. package/dist/button-CUPDQews.js +62 -0
  294. package/dist/button-DFa-rtPy.js +62 -0
  295. package/dist/button-DV1G6XrI.cjs +85 -0
  296. package/dist/button-DVhloDtr.cjs +85 -0
  297. package/dist/button-Kd9Fj53S.cjs +85 -0
  298. package/dist/cli.js +367 -65
  299. package/dist/components/blocks/auth/AuthPageShell.d.ts +21 -5
  300. package/dist/components/blocks/index.d.ts +1 -0
  301. package/dist/components/blocks/marketing/CTASection.d.ts +28 -0
  302. package/dist/components/blocks/marketing/ComplianceBadgeRow.d.ts +23 -0
  303. package/dist/components/blocks/marketing/EvidenceTimeline.d.ts +26 -0
  304. package/dist/components/blocks/marketing/FeatureRow.d.ts +25 -0
  305. package/dist/components/blocks/marketing/Hero.d.ts +35 -0
  306. package/dist/components/blocks/marketing/HowItWorksSteps.d.ts +29 -0
  307. package/dist/components/blocks/marketing/LogoCloud.d.ts +22 -0
  308. package/dist/components/blocks/marketing/MarketingFooter.d.ts +42 -0
  309. package/dist/components/blocks/marketing/MarketingNavbar.d.ts +47 -0
  310. package/dist/components/blocks/marketing/PillBadge.d.ts +21 -0
  311. package/dist/components/blocks/marketing/SectionHeading.d.ts +23 -0
  312. package/dist/components/blocks/marketing/ServiceCardGrid.d.ts +65 -0
  313. package/dist/components/blocks/marketing/StatBand.d.ts +25 -0
  314. package/dist/components/blocks/marketing/TopAccentCards.d.ts +29 -0
  315. package/dist/components/blocks/marketing/index.d.ts +28 -0
  316. package/dist/components/brand/index.d.ts +1 -0
  317. package/dist/components/brand/isotype/Isotype.d.ts +27 -0
  318. package/dist/components/brand/isotype/IsotypeDiagonal.d.ts +19 -0
  319. package/dist/components/brand/isotype/IsotypeFrames.d.ts +21 -0
  320. package/dist/components/brand/isotype/IsotypeMini.d.ts +26 -0
  321. package/dist/components/brand/isotype/IsotypeTwist.d.ts +22 -0
  322. package/dist/components/brand/isotype/frame-variants.d.ts +11 -0
  323. package/dist/components/brand/isotype/index.d.ts +9 -0
  324. package/dist/components/brand/isotype/mini-patterns.d.ts +25 -0
  325. package/dist/components/brand/isotype/patterns.d.ts +42 -0
  326. package/dist/components/brand/isotype/twist-variants.d.ts +11 -0
  327. package/dist/components/pages/forgot-password-page/ForgotPasswordPage.d.ts +2 -2
  328. package/dist/components/pages/index.d.ts +1 -0
  329. package/dist/components/pages/landing-page/LandingPage.d.ts +18 -0
  330. package/dist/components/pages/landing-page/index.d.ts +1 -0
  331. package/dist/components/pages/login-page/LoginPage.d.ts +2 -2
  332. package/dist/components/pages/verify-email-page/VerifyEmailPage.d.ts +1 -1
  333. package/dist/components/ui/card/card.d.ts +13 -1
  334. package/dist/contexts/theme-data.d.ts +21 -1
  335. package/dist/dropdown-menu-B9wTZ0uX.cjs +225 -0
  336. package/dist/dropdown-menu-BeBtZOrs.cjs +225 -0
  337. package/dist/dropdown-menu-ChQa9zW3.cjs +225 -0
  338. package/dist/dropdown-menu-D7mRDGis.js +190 -0
  339. package/dist/dropdown-menu-D8ZmqHB7.js +190 -0
  340. package/dist/dropdown-menu-DRvnsQAt.cjs +225 -0
  341. package/dist/dropdown-menu-DUk81i5Y.js +190 -0
  342. package/dist/dropdown-menu-NlUHhVmK.js +190 -0
  343. package/dist/dropdown-menu-_AWBeOts.cjs +225 -0
  344. package/dist/dropdown-menu-qGzLO_HO.js +190 -0
  345. package/dist/hooks.cjs.js +2 -2
  346. package/dist/hooks.es.js +2 -2
  347. package/dist/index.cjs.js +57 -41
  348. package/dist/index.es.js +25 -25
  349. package/dist/input-B53E6K8G.js +65 -0
  350. package/dist/input-B7Q7vcoG.cjs +91 -0
  351. package/dist/input-BysqLMK1.js +65 -0
  352. package/dist/input-CStdFsaH.cjs +91 -0
  353. package/dist/input-CXYth6nW.cjs +91 -0
  354. package/dist/input-CX_fWE2D.cjs +91 -0
  355. package/dist/input-CitUVnEn.js +65 -0
  356. package/dist/input-Csp_Metb.cjs +91 -0
  357. package/dist/input-DVRwGVLx.js +65 -0
  358. package/dist/input-Dqyj7Hdw.cjs +91 -0
  359. package/dist/input-dOgrFQ-3.js +65 -0
  360. package/dist/input-wkBYTp-B.js +65 -0
  361. package/dist/layout.cjs.js +1 -1
  362. package/dist/layout.es.js +1 -1
  363. package/dist/media.cjs.js +1 -1
  364. package/dist/media.es.js +1 -1
  365. package/dist/pages.cjs.js +2 -1
  366. package/dist/pages.es.js +1 -1
  367. package/dist/rich-text-editor-7K7UjLJN.cjs +2968 -0
  368. package/dist/rich-text-editor-B3jLP2bm.cjs +2968 -0
  369. package/dist/rich-text-editor-BHiRUzWZ.js +2894 -0
  370. package/dist/rich-text-editor-BWMRUMJ2.js +2894 -0
  371. package/dist/rich-text-editor-BntMVQsB.js +2894 -0
  372. package/dist/rich-text-editor-BoE6Ks5x.cjs +2968 -0
  373. package/dist/rich-text-editor-BzuEwR_X.js +2894 -0
  374. package/dist/rich-text-editor-CcopGbQ-.js +2894 -0
  375. package/dist/rich-text-editor-CmxSRJIi.cjs +2968 -0
  376. package/dist/rich-text-editor-Diz_onyB.js +2894 -0
  377. package/dist/rich-text-editor-DyYAu28v.cjs +2968 -0
  378. package/dist/rich-text-editor-JS_eMQCC.cjs +2968 -0
  379. package/dist/rich-text-editor-RWvK4hd3.cjs +2968 -0
  380. package/dist/rich-text-editor-gauEkzPM.js +2894 -0
  381. package/dist/select-B6PygS38.cjs +161 -0
  382. package/dist/select-BD763J5Y.cjs +161 -0
  383. package/dist/select-BNfFJwYp.js +130 -0
  384. package/dist/select-CN8IDjGB.js +130 -0
  385. package/dist/select-CwRzQHA7.cjs +161 -0
  386. package/dist/select-CwgD3nMD.js +130 -0
  387. package/dist/select-DEHUm_AC.cjs +161 -0
  388. package/dist/select-DJDgpVm3.cjs +161 -0
  389. package/dist/select-DSLWQLmo.cjs +161 -0
  390. package/dist/select-QJDKZITN.js +130 -0
  391. package/dist/select-YFx0wCYT.js +130 -0
  392. package/dist/select-q7aDfuPn.js +130 -0
  393. package/dist/sidebar-BF7JEL7U.js +1151 -0
  394. package/dist/sidebar-Bjr2doX5.cjs +1154 -0
  395. package/dist/sidebar-Bkk1YAsD.cjs +1154 -0
  396. package/dist/sidebar-CMrNCmhb.cjs +1154 -0
  397. package/dist/sidebar-CO9x8AVn.cjs +1154 -0
  398. package/dist/sidebar-Cn_KB4c6.js +1151 -0
  399. package/dist/sidebar-CuzYeOSz.cjs +1154 -0
  400. package/dist/sidebar-CwlW3LXE.js +1151 -0
  401. package/dist/sidebar-DNkf-Ug6.js +1151 -0
  402. package/dist/sidebar-DaS3fplw.cjs +1154 -0
  403. package/dist/sidebar-Db_C30ph.cjs +1154 -0
  404. package/dist/sidebar-FDCY42oP.js +1151 -0
  405. package/dist/sidebar-miPHsRz4.js +1151 -0
  406. package/dist/sidebar-pZF8mLLu.js +1151 -0
  407. package/dist/skeleton-BX2XTjMO.cjs +87 -0
  408. package/dist/skeleton-BoLK0iV7.js +78 -0
  409. package/dist/skeleton-BtBwJ39W.js +79 -0
  410. package/dist/skeleton-Bysq8yeB.js +79 -0
  411. package/dist/skeleton-C7nspYnC.cjs +87 -0
  412. package/dist/skeleton-CJyg0eJ1.cjs +88 -0
  413. package/dist/skeleton-D8WaauK0.cjs +88 -0
  414. package/dist/skeleton-DBYtjaZW.cjs +88 -0
  415. package/dist/skeleton-DL4V5Vub.cjs +87 -0
  416. package/dist/skeleton-DSMhdqp1.js +78 -0
  417. package/dist/skeleton-DY_lSFWf.js +79 -0
  418. package/dist/skeleton-Df65Ox10.js +79 -0
  419. package/dist/skeleton-DhJswvTW.cjs +88 -0
  420. package/dist/skeleton-DicUfozA.js +78 -0
  421. package/dist/slider-77T_Eqw4.js +56 -0
  422. package/dist/slider-B6puMLXS.cjs +78 -0
  423. package/dist/slider-B785N7lZ.js +56 -0
  424. package/dist/slider-BKV_vvsh.cjs +78 -0
  425. package/dist/slider-B_lUjFNa.cjs +78 -0
  426. package/dist/slider-C6yssKyZ.cjs +78 -0
  427. package/dist/slider-CKZO9gVh.cjs +78 -0
  428. package/dist/slider-Cn-ImSze.js +56 -0
  429. package/dist/slider-CtBpIaU4.js +56 -0
  430. package/dist/slider-KgWmSJbx.js +56 -0
  431. package/dist/tooltip-BPttuPxU.js +48 -0
  432. package/dist/tooltip-BiJVGob3.cjs +72 -0
  433. package/dist/tooltip-CIKRzQqE.cjs +72 -0
  434. package/dist/tooltip-CoDByjE_.cjs +72 -0
  435. package/dist/tooltip-D2OPn-1v.cjs +72 -0
  436. package/dist/tooltip-DlCHQuh1.js +48 -0
  437. package/dist/tooltip-_MAwsiOL.js +48 -0
  438. package/dist/tooltip-fQ2Va0G8.cjs +72 -0
  439. package/dist/tooltip-oAw00FX2.js +48 -0
  440. package/dist/tooltip-u147L0wD.js +48 -0
  441. package/dist/ui.cjs.js +13 -13
  442. package/dist/ui.es.js +13 -13
  443. package/dist/xertica-assistant-B1xAl2Vn.js +2173 -0
  444. package/dist/xertica-assistant-BBUMaUXw.js +2173 -0
  445. package/dist/xertica-assistant-C2A0R94j.js +2173 -0
  446. package/dist/xertica-assistant-CSUprvTR.js +2173 -0
  447. package/dist/xertica-assistant-CWuBwfzt.cjs +2180 -0
  448. package/dist/xertica-assistant-Caubm0HR.js +2173 -0
  449. package/dist/xertica-assistant-D2hlwiEP.js +2173 -0
  450. package/dist/xertica-assistant-DEexPM2u.cjs +2180 -0
  451. package/dist/xertica-assistant-DN2J_sQQ.cjs +2180 -0
  452. package/dist/xertica-assistant-DdYS6WXT.cjs +2180 -0
  453. package/dist/xertica-assistant-Dh1dmEx3.cjs +2180 -0
  454. package/dist/xertica-assistant-GGcyHEZG.cjs +2180 -0
  455. package/dist/xertica-assistant-USefPe2L.js +2173 -0
  456. package/dist/xertica-assistant-cwSHFwfv.cjs +2180 -0
  457. package/dist/xertica-ui.css +1 -1
  458. package/llms-compact.txt +1 -1
  459. package/llms.txt +1 -1
  460. package/package.json +3 -2
  461. package/styles/xertica/base.css +46 -0
  462. package/styles/xertica/tokens.css +10 -0
  463. package/templates/package.json +1 -1
  464. package/templates/src/app/App.tsx +5 -1
  465. package/templates/src/app/components/AuthGuard.tsx +6 -0
  466. package/templates/src/features/auth/ui/ForgotPasswordContent.tsx +1 -4
  467. package/templates/src/features/auth/ui/LoginContent.tsx +1 -4
  468. package/templates/src/features/auth/ui/ResetPasswordContent.tsx +1 -4
  469. package/templates/src/features/auth/ui/VerifyEmailContent.tsx +1 -4
  470. package/templates/src/features/home/ui/HomeContent.tsx +12 -13
  471. package/templates/src/features/template/ui/TemplateContent.tsx +569 -26
  472. package/templates/src/locales/en/pages/landing.json +175 -0
  473. package/templates/src/locales/en/pages/templates.json +112 -4
  474. package/templates/src/locales/es/pages/landing.json +175 -0
  475. package/templates/src/locales/es/pages/templates.json +112 -4
  476. package/templates/src/locales/pt-BR/pages/landing.json +175 -0
  477. package/templates/src/locales/pt-BR/pages/templates.json +112 -4
  478. package/templates/src/pages/LandingPage.tsx +3 -0
  479. package/templates/src/styles/xertica/tokens.css +10 -0
  480. package/templates/vite.config.ts +25 -0
@@ -0,0 +1,47 @@
1
+ import * as React from 'react';
2
+ import { ImageWithFallback } from '../../figma/ImageWithFallback';
3
+ import { cn } from '../../shared/utils';
4
+
5
+ export interface LogoCloudLogo {
6
+ src: string;
7
+ alt: string;
8
+ }
9
+
10
+ export interface LogoCloudProps extends React.HTMLAttributes<HTMLDivElement> {
11
+ title?: string;
12
+ logos: LogoCloudLogo[];
13
+ }
14
+
15
+ /**
16
+ * A "trusted by" row of partner or customer logos.
17
+ *
18
+ * @description
19
+ * Renders an optional centered, small uppercase muted title above a
20
+ * responsive, wrapping row of grayscale logos that colorize on hover.
21
+ *
22
+ * @ai-rules
23
+ * 1. Provide `logos` as an array of `{ src, alt }` — each is rendered with `ImageWithFallback`.
24
+ * 2. `title` is optional; omit it to render the logo row alone.
25
+ * 3. Logos are token-driven (grayscale/opacity via utilities) so they stay legible across all themes and dark mode.
26
+ */
27
+ export function LogoCloud({ title, logos, className, ...props }: LogoCloudProps) {
28
+ return (
29
+ <div className={cn('w-full text-center', className)} {...props}>
30
+ {title && (
31
+ <p className="mb-6 text-xs font-medium uppercase tracking-wider text-muted-foreground sm:mb-8">
32
+ {title}
33
+ </p>
34
+ )}
35
+ <div className="flex flex-wrap items-center justify-center gap-8 md:gap-12">
36
+ {logos.map((logo, index) => (
37
+ <ImageWithFallback
38
+ key={`${logo.alt}-${index}`}
39
+ src={logo.src}
40
+ alt={logo.alt}
41
+ className="h-6 w-auto object-contain grayscale opacity-60 transition-all hover:opacity-100 hover:grayscale-0 md:h-8"
42
+ />
43
+ ))}
44
+ </div>
45
+ </div>
46
+ );
47
+ }
@@ -0,0 +1,109 @@
1
+ import * as React from 'react';
2
+ import { cn } from '../../shared/utils';
3
+
4
+ /**
5
+ * A single link rendered inside a footer column or the legal links row.
6
+ */
7
+ export interface MarketingFooterLink {
8
+ label: string;
9
+ href: string;
10
+ }
11
+
12
+ /**
13
+ * A labeled group of links rendered as one column of the footer.
14
+ */
15
+ export interface MarketingFooterColumn {
16
+ heading: string;
17
+ links: MarketingFooterLink[];
18
+ }
19
+
20
+ export interface MarketingFooterProps {
21
+ /** Logo slot — pass a rendered logo element (e.g. `<XerticaLogo />`). */
22
+ logo: React.ReactNode;
23
+ /** Short description shown under the logo in the first column. */
24
+ tagline?: string;
25
+ /** Link columns rendered alongside the logo column. */
26
+ columns: MarketingFooterColumn[];
27
+ /** Small print links (Privacy, Terms, etc.) shown on the bottom row. */
28
+ legalLinks?: MarketingFooterLink[];
29
+ /** Copyright text shown on the bottom row. */
30
+ copyright?: string;
31
+ className?: string;
32
+ }
33
+
34
+ /** Maps logo column + link columns to a static grid-cols class so Tailwind's JIT scanner can find it (capped at 6). */
35
+ const gridColsClasses: Record<number, string> = {
36
+ 2: 'md:grid-cols-2',
37
+ 3: 'md:grid-cols-3',
38
+ 4: 'md:grid-cols-4',
39
+ 5: 'md:grid-cols-5',
40
+ 6: 'md:grid-cols-6',
41
+ };
42
+
43
+ /**
44
+ * Multi-column site footer for public marketing pages.
45
+ *
46
+ * @description
47
+ * Pairs with `MarketingNavbar` to bookend a marketing page: a logo/tagline
48
+ * cell followed by an arbitrary number of link columns, plus a bottom bar
49
+ * with copyright and legal links.
50
+ *
51
+ * @ai-rules
52
+ * 1. Pass the logo as a rendered node via the `logo` prop — do not couple this file to any specific logo component.
53
+ * 2. Pass at most 5 `columns` — the logo cell plus columns are capped at a 6-column desktop grid.
54
+ * 3. `legalLinks` and `copyright` are optional; the bottom row still renders with just whichever is provided.
55
+ */
56
+ export function MarketingFooter({
57
+ logo,
58
+ tagline,
59
+ columns,
60
+ legalLinks,
61
+ copyright,
62
+ className,
63
+ }: MarketingFooterProps) {
64
+ const resolvedCols = Math.min(Math.max(columns.length + 1, 2), 6);
65
+
66
+ return (
67
+ <footer className={cn('border-t border-border bg-card', className)}>
68
+ <div className="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
69
+ <div className={cn('grid grid-cols-2 gap-8 py-12', gridColsClasses[resolvedCols])}>
70
+ <div className="col-span-2 md:col-span-1">
71
+ <div className="flex items-center">{logo}</div>
72
+ {tagline && <p className="mt-3 max-w-xs text-sm text-muted-foreground">{tagline}</p>}
73
+ </div>
74
+
75
+ {columns.map(column => (
76
+ <div key={column.heading}>
77
+ <h3 className="mb-3 text-xs font-semibold uppercase tracking-wide text-foreground">{column.heading}</h3>
78
+ <ul className="space-y-2 text-sm text-muted-foreground">
79
+ {column.links.map(link => (
80
+ <li key={link.href}>
81
+ <a href={link.href} className="transition-colors hover:text-foreground">
82
+ {link.label}
83
+ </a>
84
+ </li>
85
+ ))}
86
+ </ul>
87
+ </div>
88
+ ))}
89
+ </div>
90
+
91
+ <div className="flex flex-col items-center justify-between gap-4 border-t border-border pt-6 pb-8 text-xs text-muted-foreground md:flex-row">
92
+ {copyright && <p>{copyright}</p>}
93
+
94
+ {legalLinks && legalLinks.length > 0 && (
95
+ <ul className="flex flex-wrap items-center gap-4">
96
+ {legalLinks.map(link => (
97
+ <li key={link.href}>
98
+ <a href={link.href} className="transition-colors hover:text-foreground">
99
+ {link.label}
100
+ </a>
101
+ </li>
102
+ ))}
103
+ </ul>
104
+ )}
105
+ </div>
106
+ </div>
107
+ </footer>
108
+ );
109
+ }
@@ -0,0 +1,192 @@
1
+ 'use client';
2
+
3
+ import * as React from 'react';
4
+ import { useState } from 'react';
5
+ import { Menu, X } from 'lucide-react';
6
+ import { Button } from '../../ui/button';
7
+ import { LanguageSelector } from '../../brand/language-selector';
8
+ import { cn } from '../../shared/utils';
9
+
10
+ /**
11
+ * A single navigation link rendered in the navbar.
12
+ */
13
+ export interface MarketingNavLink {
14
+ label: string;
15
+ href: string;
16
+ }
17
+
18
+ /**
19
+ * A call-to-action button rendered on the right side of the navbar.
20
+ */
21
+ export interface MarketingNavbarCta {
22
+ label: string;
23
+ href?: string;
24
+ onClick?: () => void;
25
+ }
26
+
27
+ export interface MarketingNavbarProps {
28
+ /** Logo slot — pass a rendered logo element (e.g. `<XerticaLogo />`). */
29
+ logo: React.ReactNode;
30
+ /** Primary navigation links, shown inline on desktop and stacked on mobile. */
31
+ links: MarketingNavLink[];
32
+ /** Primary call-to-action, rendered as a solid `Button`. */
33
+ cta?: MarketingNavbarCta;
34
+ /** Secondary call-to-action, rendered as an outline `Button`. */
35
+ secondaryCta?: MarketingNavbarCta;
36
+ /** Shows the design system's language selector. Defaults to `true` — `LanguageSelector` auto-hides itself when only one language is configured. */
37
+ showLanguageSelector?: boolean;
38
+ /** Accessible label for the mobile menu trigger when closed. */
39
+ openMenuLabel?: string;
40
+ /** Accessible label for the mobile menu trigger when open. */
41
+ closeMenuLabel?: string;
42
+ className?: string;
43
+ }
44
+
45
+ /**
46
+ * Sticky header for public marketing pages.
47
+ *
48
+ * @description
49
+ * Distinct from the app-shell `Header` (used inside the authenticated product layout):
50
+ * this navbar is for public-facing marketing sites, with a logo slot, inline nav links,
51
+ * and up to two CTA buttons. Collapses into a full-width dropdown panel on mobile.
52
+ *
53
+ * @ai-rules
54
+ * 1. Pass the logo as a rendered node via the `logo` prop — do not couple this file to any specific logo component.
55
+ * 2. Use `cta` for the primary action (solid button) and `secondaryCta` for a lower-emphasis action (outline button).
56
+ * 3. Each link/CTA needs either `href` (renders an `<a>`) or `onClick` — CTAs support both.
57
+ */
58
+ export function MarketingNavbar({
59
+ logo,
60
+ links,
61
+ cta,
62
+ secondaryCta,
63
+ showLanguageSelector = true,
64
+ openMenuLabel = 'Open menu',
65
+ closeMenuLabel = 'Close menu',
66
+ className,
67
+ }: MarketingNavbarProps) {
68
+ const [isOpen, setIsOpen] = useState(false);
69
+
70
+ const closeMenu = () => setIsOpen(false);
71
+
72
+ return (
73
+ <header
74
+ className={cn(
75
+ 'sticky top-0 z-50 w-full border-b border-border bg-card/80 backdrop-blur',
76
+ className
77
+ )}
78
+ >
79
+ <nav className="mx-auto flex h-16 max-w-7xl items-center justify-between gap-4 px-4 sm:px-6 lg:px-8">
80
+ {/* Logo */}
81
+ <div className="flex shrink-0 items-center">{logo}</div>
82
+
83
+ {/* Desktop nav links */}
84
+ <div className="hidden flex-1 items-center justify-center gap-8 md:flex">
85
+ {links.map(link => (
86
+ <a
87
+ key={link.href}
88
+ href={link.href}
89
+ className="text-sm font-medium text-muted-foreground transition-colors hover:text-foreground"
90
+ >
91
+ {link.label}
92
+ </a>
93
+ ))}
94
+ </div>
95
+
96
+ {/* Desktop CTAs */}
97
+ <div className="hidden shrink-0 items-center gap-3 md:flex">
98
+ {showLanguageSelector && <LanguageSelector variant="minimal" showIcon={false} />}
99
+ {secondaryCta && (
100
+ <Button
101
+ variant="outline"
102
+ asChild={!!secondaryCta.href}
103
+ onClick={secondaryCta.onClick}
104
+ >
105
+ {secondaryCta.href ? (
106
+ <a href={secondaryCta.href}>{secondaryCta.label}</a>
107
+ ) : (
108
+ secondaryCta.label
109
+ )}
110
+ </Button>
111
+ )}
112
+ {cta && (
113
+ <Button variant="secondary" asChild={!!cta.href} onClick={cta.onClick}>
114
+ {cta.href ? <a href={cta.href}>{cta.label}</a> : cta.label}
115
+ </Button>
116
+ )}
117
+ </div>
118
+
119
+ {/* Mobile menu trigger */}
120
+ <Button
121
+ variant="ghost"
122
+ size="icon"
123
+ className="md:hidden"
124
+ onClick={() => setIsOpen(prev => !prev)}
125
+ aria-label={isOpen ? closeMenuLabel : openMenuLabel}
126
+ aria-expanded={isOpen}
127
+ >
128
+ {isOpen ? <X className="size-5" /> : <Menu className="size-5" />}
129
+ </Button>
130
+ </nav>
131
+
132
+ {/* Mobile dropdown panel */}
133
+ {isOpen && (
134
+ <div className="border-t border-border bg-card/95 backdrop-blur md:hidden">
135
+ <div className="flex flex-col gap-1 px-4 py-4 sm:px-6">
136
+ {links.map(link => (
137
+ <a
138
+ key={link.href}
139
+ href={link.href}
140
+ onClick={closeMenu}
141
+ className="rounded-[var(--radius)] px-3 py-2 text-sm font-medium text-muted-foreground transition-colors hover:bg-accent hover:text-foreground"
142
+ >
143
+ {link.label}
144
+ </a>
145
+ ))}
146
+
147
+ {showLanguageSelector && (
148
+ <div className="mt-2 flex border-t border-border pt-4">
149
+ <LanguageSelector variant="minimal" showIcon={false} />
150
+ </div>
151
+ )}
152
+
153
+ {(secondaryCta || cta) && (
154
+ <div className="mt-2 flex flex-col gap-2 border-t border-border pt-4">
155
+ {secondaryCta && (
156
+ <Button
157
+ variant="outline"
158
+ className="w-full"
159
+ asChild={!!secondaryCta.href}
160
+ onClick={() => {
161
+ closeMenu();
162
+ secondaryCta.onClick?.();
163
+ }}
164
+ >
165
+ {secondaryCta.href ? (
166
+ <a href={secondaryCta.href}>{secondaryCta.label}</a>
167
+ ) : (
168
+ secondaryCta.label
169
+ )}
170
+ </Button>
171
+ )}
172
+ {cta && (
173
+ <Button
174
+ variant="secondary"
175
+ className="w-full"
176
+ asChild={!!cta.href}
177
+ onClick={() => {
178
+ closeMenu();
179
+ cta.onClick?.();
180
+ }}
181
+ >
182
+ {cta.href ? <a href={cta.href}>{cta.label}</a> : cta.label}
183
+ </Button>
184
+ )}
185
+ </div>
186
+ )}
187
+ </div>
188
+ </div>
189
+ )}
190
+ </header>
191
+ );
192
+ }
@@ -0,0 +1,96 @@
1
+ import * as React from 'react';
2
+ import { cn } from '../../shared/utils';
3
+
4
+ export type BlockColor =
5
+ | 'primary'
6
+ | 'chart-1'
7
+ | 'chart-2'
8
+ | 'chart-3'
9
+ | 'chart-4'
10
+ | 'chart-5'
11
+ | 'success'
12
+ | 'info'
13
+ | 'warning'
14
+ | 'destructive';
15
+
16
+ const colorTokens: Record<BlockColor, { border: string; tint: string; icon: string }> = {
17
+ primary: { border: 'border-primary', tint: 'bg-primary/5', icon: 'text-primary' },
18
+ 'chart-1': {
19
+ border: 'border-[var(--chart-1)]',
20
+ tint: 'bg-[var(--chart-1)]/5',
21
+ icon: 'text-[var(--chart-1)]',
22
+ },
23
+ 'chart-2': {
24
+ border: 'border-[var(--chart-2)]',
25
+ tint: 'bg-[var(--chart-2)]/5',
26
+ icon: 'text-[var(--chart-2)]',
27
+ },
28
+ 'chart-3': {
29
+ border: 'border-[var(--chart-3)]',
30
+ tint: 'bg-[var(--chart-3)]/5',
31
+ icon: 'text-[var(--chart-3)]',
32
+ },
33
+ 'chart-4': {
34
+ border: 'border-[var(--chart-4)]',
35
+ tint: 'bg-[var(--chart-4)]/5',
36
+ icon: 'text-[var(--chart-4)]',
37
+ },
38
+ 'chart-5': {
39
+ border: 'border-[var(--chart-5)]',
40
+ tint: 'bg-[var(--chart-5)]/5',
41
+ icon: 'text-[var(--chart-5)]',
42
+ },
43
+ success: { border: 'border-success', tint: 'bg-success/5', icon: 'text-success' },
44
+ info: { border: 'border-info', tint: 'bg-info/5', icon: 'text-info' },
45
+ warning: { border: 'border-warning', tint: 'bg-warning/5', icon: 'text-warning' },
46
+ destructive: { border: 'border-destructive', tint: 'bg-destructive/5', icon: 'text-destructive' },
47
+ };
48
+
49
+ export interface PillBadgeProps extends React.HTMLAttributes<HTMLSpanElement> {
50
+ children: React.ReactNode;
51
+ icon?: React.ReactNode;
52
+ color?: BlockColor;
53
+ }
54
+
55
+ /**
56
+ * Small outlined tag used as "eyebrow" text above marketing headlines.
57
+ *
58
+ * @description
59
+ * A compact, token-driven chip (e.g. "AI ADOPTION PLATFORM") that pairs an
60
+ * optional leading icon with short uppercase text, tinted via the shared
61
+ * color-chip palette so it reskins across all Xertica-ui themes.
62
+ *
63
+ * @ai-rules
64
+ * 1. Keep `children` short — this is an eyebrow label, not a paragraph.
65
+ * 2. Pass `icon` as a small lucide-react icon element; it is sized automatically.
66
+ * 3. Use `color` to match the section's accent; defaults to `primary`.
67
+ */
68
+ export function PillBadge({
69
+ children,
70
+ icon,
71
+ color = 'primary',
72
+ className,
73
+ ...props
74
+ }: PillBadgeProps) {
75
+ const { border, tint, icon: textColor } = colorTokens[color];
76
+
77
+ return (
78
+ <span
79
+ className={cn(
80
+ 'inline-flex items-center gap-1.5 rounded-full border px-3 py-1 text-xs font-semibold uppercase tracking-wide',
81
+ border,
82
+ tint,
83
+ textColor,
84
+ className
85
+ )}
86
+ {...props}
87
+ >
88
+ {icon && (
89
+ <span className="flex items-center [&>svg]:size-3.5" aria-hidden="true">
90
+ {icon}
91
+ </span>
92
+ )}
93
+ {children}
94
+ </span>
95
+ );
96
+ }
@@ -0,0 +1,82 @@
1
+ import * as React from 'react';
2
+ import { cn } from '../../shared/utils';
3
+
4
+ export type BlockColor =
5
+ | 'primary'
6
+ | 'chart-1'
7
+ | 'chart-2'
8
+ | 'chart-3'
9
+ | 'chart-4'
10
+ | 'chart-5'
11
+ | 'success'
12
+ | 'info'
13
+ | 'warning'
14
+ | 'destructive';
15
+
16
+ const colorTokens: Record<BlockColor, string> = {
17
+ primary: 'bg-primary',
18
+ 'chart-1': 'bg-[var(--chart-1)]',
19
+ 'chart-2': 'bg-[var(--chart-2)]',
20
+ 'chart-3': 'bg-[var(--chart-3)]',
21
+ 'chart-4': 'bg-[var(--chart-4)]',
22
+ 'chart-5': 'bg-[var(--chart-5)]',
23
+ success: 'bg-success',
24
+ info: 'bg-info',
25
+ warning: 'bg-warning',
26
+ destructive: 'bg-destructive',
27
+ };
28
+
29
+ export interface SectionHeadingProps {
30
+ title: string;
31
+ description?: string;
32
+ /** Use 'sidebar' when this heading sits on a `bg-sidebar` surface (e.g. Methodology). */
33
+ tone?: 'default' | 'sidebar';
34
+ /** Optional small colored bar rendered under the title. Omit for no bar. */
35
+ accentColor?: BlockColor;
36
+ className?: string;
37
+ }
38
+
39
+ /**
40
+ * Plain section header used to introduce a landing-page section.
41
+ *
42
+ * @description
43
+ * Renders the section title (and optional description), with an optional
44
+ * small colored bar under the title.
45
+ *
46
+ * @ai-rules
47
+ * 1. Use `tone="sidebar"` when this heading renders on a `bg-sidebar` surface — the default tone's tokens are not guaranteed to contrast there.
48
+ * 2. `accentColor` is optional — omit it for a plain title with no bar; when set, it maps to `colorTokens` and never hardcodes a color.
49
+ */
50
+ export function SectionHeading({
51
+ title,
52
+ description,
53
+ tone = 'default',
54
+ accentColor,
55
+ className,
56
+ }: SectionHeadingProps) {
57
+ const isSidebar = tone === 'sidebar';
58
+
59
+ return (
60
+ <div className={className}>
61
+ <h2 className={cn('text-2xl font-bold md:text-3xl', !isSidebar && 'text-foreground')}>
62
+ {title}
63
+ </h2>
64
+ {accentColor && (
65
+ <span
66
+ aria-hidden="true"
67
+ className={cn('mt-3 block h-1 w-10 rounded-full', colorTokens[accentColor])}
68
+ />
69
+ )}
70
+ {description && (
71
+ <p
72
+ className={cn(
73
+ 'mt-6 max-w-2xl text-base',
74
+ isSidebar ? 'text-sidebar-foreground/70' : 'text-muted-foreground'
75
+ )}
76
+ >
77
+ {description}
78
+ </p>
79
+ )}
80
+ </div>
81
+ );
82
+ }