@retrivora-ai/rag-engine 1.9.6 → 1.9.8

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 (62) hide show
  1. package/README.md +130 -113
  2. package/dist/{ILLMProvider-DNhyOYoK.d.mts → ILLMProvider-B8ROITYK.d.mts} +59 -8
  3. package/dist/{ILLMProvider-DNhyOYoK.d.ts → ILLMProvider-B8ROITYK.d.ts} +59 -8
  4. package/dist/handlers/index.d.mts +2 -2
  5. package/dist/handlers/index.d.ts +2 -2
  6. package/dist/handlers/index.js +2376 -489
  7. package/dist/handlers/index.mjs +2372 -489
  8. package/dist/{index-CjQdL0cX.d.ts → index-B8PbEFSY.d.mts} +17 -3
  9. package/dist/{index-CHL1jdYm.d.mts → index-BCPKUAVL.d.ts} +33 -41
  10. package/dist/{index-Hgbwl9X4.d.ts → index-CrxCy36A.d.mts} +33 -41
  11. package/dist/{index-C9v7-tWd.d.mts → index-DNvoi-sV.d.ts} +17 -3
  12. package/dist/index.css +695 -203
  13. package/dist/index.d.mts +37 -7
  14. package/dist/index.d.ts +37 -7
  15. package/dist/index.js +1197 -286
  16. package/dist/index.mjs +1221 -297
  17. package/dist/server.d.mts +62 -6
  18. package/dist/server.d.ts +62 -6
  19. package/dist/server.js +2526 -574
  20. package/dist/server.mjs +2517 -573
  21. package/package.json +12 -10
  22. package/src/app/constants.tsx +207 -212
  23. package/src/app/layout.tsx +4 -28
  24. package/src/app/types.ts +17 -17
  25. package/src/components/AmbientBackground.tsx +10 -10
  26. package/src/components/ArchitectureCard.tsx +43 -7
  27. package/src/components/ArchitectureCardsSection.tsx +37 -4
  28. package/src/components/ChatWidget.tsx +4 -1
  29. package/src/components/ChatWindow.tsx +9 -2
  30. package/src/components/CodeViewer.tsx +19 -14
  31. package/src/components/DocViewer.tsx +75 -15
  32. package/src/components/Documentation.tsx +111 -28
  33. package/src/components/Hero.tsx +103 -20
  34. package/src/components/Lifecycle.tsx +65 -25
  35. package/src/components/MarkdownComponents.tsx +44 -1
  36. package/src/components/MessageBubble.tsx +162 -50
  37. package/src/components/constants.tsx +279 -0
  38. package/src/config/RagConfig.ts +56 -10
  39. package/src/config/constants.ts +5 -0
  40. package/src/config/serverConfig.ts +15 -0
  41. package/src/core/ConfigResolver.ts +30 -25
  42. package/src/core/DatabaseStorage.ts +469 -0
  43. package/src/core/LicenseVerifier.ts +154 -0
  44. package/src/core/MultiAgentCoordinator.ts +239 -0
  45. package/src/core/Pipeline.ts +148 -16
  46. package/src/core/ProviderRegistry.ts +5 -5
  47. package/src/core/Retrivora.ts +52 -6
  48. package/src/core/VectorPlugin.ts +74 -11
  49. package/src/core/mcp.ts +261 -0
  50. package/src/exceptions/index.ts +52 -0
  51. package/src/handlers/index.ts +504 -47
  52. package/src/hooks/useRagChat.ts +100 -43
  53. package/src/hooks/useStoredMessages.ts +15 -4
  54. package/src/index.ts +7 -0
  55. package/src/llm/LLMFactory.ts +15 -6
  56. package/src/llm/providers/GroqProvider.ts +176 -0
  57. package/src/llm/providers/QwenProvider.ts +191 -0
  58. package/src/server.ts +23 -13
  59. package/src/types/chat.ts +16 -0
  60. package/src/types/props.ts +50 -1
  61. package/.env.example +0 -80
  62. package/LICENSE.txt +0 -21
package/dist/index.mjs CHANGED
@@ -1,3 +1,4 @@
1
+ "use client";
1
2
  var __defProp = Object.defineProperty;
2
3
  var __defProps = Object.defineProperties;
3
4
  var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
@@ -30,15 +31,37 @@ var __objRest = (source, exclude) => {
30
31
  return target;
31
32
  };
32
33
 
33
- // src/index.ts
34
- import "./index.css";
34
+ // #style-inject:#style-inject
35
+ function styleInject(css, { insertAt } = {}) {
36
+ if (!css || typeof document === "undefined") return;
37
+ const head = document.head || document.getElementsByTagName("head")[0];
38
+ const style = document.createElement("style");
39
+ style.type = "text/css";
40
+ if (insertAt === "top") {
41
+ if (head.firstChild) {
42
+ head.insertBefore(style, head.firstChild);
43
+ } else {
44
+ head.appendChild(style);
45
+ }
46
+ } else {
47
+ head.appendChild(style);
48
+ }
49
+ if (style.styleSheet) {
50
+ style.styleSheet.cssText = css;
51
+ } else {
52
+ style.appendChild(document.createTextNode(css));
53
+ }
54
+ }
55
+
56
+ // src/index.css
57
+ styleInject('/*! tailwindcss v4.3.0 | MIT License | https://tailwindcss.com */\n@layer properties;\n@layer theme, base, components, utilities;\n@layer theme {\n :root,\n :host {\n --font-sans:\n ui-sans-serif,\n system-ui,\n sans-serif,\n "Apple Color Emoji",\n "Segoe UI Emoji",\n "Segoe UI Symbol",\n "Noto Color Emoji";\n --font-mono:\n ui-monospace,\n SFMono-Regular,\n Menlo,\n Monaco,\n Consolas,\n "Liberation Mono",\n "Courier New",\n monospace;\n --color-red-50: oklch(97.1% 0.013 17.38);\n --color-red-100: oklch(93.6% 0.032 17.717);\n --color-red-200: oklch(88.5% 0.062 18.334);\n --color-red-400: oklch(70.4% 0.191 22.216);\n --color-red-500: oklch(63.7% 0.237 25.331);\n --color-red-600: oklch(57.7% 0.245 27.325);\n --color-amber-50: oklch(98.7% 0.022 95.277);\n --color-amber-100: oklch(96.2% 0.059 95.617);\n --color-amber-200: oklch(92.4% 0.12 95.746);\n --color-amber-400: oklch(82.8% 0.189 84.429);\n --color-amber-500: oklch(76.9% 0.188 70.08);\n --color-amber-600: oklch(66.6% 0.179 58.318);\n --color-emerald-50: oklch(97.9% 0.021 166.113);\n --color-emerald-100: oklch(95% 0.052 163.051);\n --color-emerald-200: oklch(90.5% 0.093 164.15);\n --color-emerald-300: oklch(84.5% 0.143 164.978);\n --color-emerald-400: oklch(76.5% 0.177 163.223);\n --color-emerald-500: oklch(69.6% 0.17 162.48);\n --color-emerald-600: oklch(59.6% 0.145 163.225);\n --color-emerald-700: oklch(50.8% 0.118 165.612);\n --color-blue-400: oklch(70.7% 0.165 254.624);\n --color-blue-500: oklch(62.3% 0.214 259.815);\n --color-indigo-50: oklch(96.2% 0.018 272.314);\n --color-indigo-100: oklch(93% 0.034 272.788);\n --color-indigo-200: oklch(87% 0.065 274.039);\n --color-indigo-300: oklch(78.5% 0.115 274.713);\n --color-indigo-400: oklch(67.3% 0.182 276.935);\n --color-indigo-500: oklch(58.5% 0.233 277.117);\n --color-indigo-600: oklch(51.1% 0.262 276.966);\n --color-indigo-700: oklch(45.7% 0.24 277.023);\n --color-violet-50: oklch(96.9% 0.016 293.756);\n --color-violet-200: oklch(89.4% 0.057 293.283);\n --color-violet-300: oklch(81.1% 0.111 293.571);\n --color-violet-500: oklch(60.6% 0.25 292.717);\n --color-violet-600: oklch(54.1% 0.281 293.009);\n --color-violet-700: oklch(49.1% 0.27 292.581);\n --color-rose-50: oklch(96.9% 0.015 12.422);\n --color-rose-100: oklch(94.1% 0.03 12.58);\n --color-rose-200: oklch(89.2% 0.058 10.001);\n --color-rose-400: oklch(71.2% 0.194 13.428);\n --color-rose-500: oklch(64.5% 0.246 16.439);\n --color-rose-600: oklch(58.6% 0.253 17.585);\n --color-slate-50: oklch(98.4% 0.003 247.858);\n --color-slate-100: oklch(96.8% 0.007 247.896);\n --color-slate-200: oklch(92.9% 0.013 255.508);\n --color-slate-300: oklch(86.9% 0.022 252.894);\n --color-slate-400: oklch(70.4% 0.04 256.788);\n --color-slate-500: oklch(55.4% 0.046 257.417);\n --color-slate-600: oklch(44.6% 0.043 257.281);\n --color-slate-700: oklch(37.2% 0.044 257.287);\n --color-slate-800: oklch(27.9% 0.041 260.031);\n --color-slate-900: oklch(20.8% 0.042 265.755);\n --color-slate-950: oklch(12.9% 0.042 264.695);\n --color-gray-500: oklch(55.1% 0.027 264.364);\n --color-black: #000;\n --color-white: #fff;\n --spacing: 0.25rem;\n --container-xs: 20rem;\n --container-md: 28rem;\n --container-lg: 32rem;\n --container-xl: 36rem;\n --container-2xl: 42rem;\n --container-5xl: 64rem;\n --container-6xl: 72rem;\n --text-xs: 0.75rem;\n --text-xs--line-height: calc(1 / 0.75);\n --text-sm: 0.875rem;\n --text-sm--line-height: calc(1.25 / 0.875);\n --text-base: 1rem;\n --text-base--line-height: calc(1.5 / 1);\n --text-lg: 1.125rem;\n --text-lg--line-height: calc(1.75 / 1.125);\n --text-xl: 1.25rem;\n --text-xl--line-height: calc(1.75 / 1.25);\n --text-2xl: 1.5rem;\n --text-2xl--line-height: calc(2 / 1.5);\n --text-3xl: 1.875rem;\n --text-3xl--line-height: calc(2.25 / 1.875);\n --text-4xl: 2.25rem;\n --text-4xl--line-height: calc(2.5 / 2.25);\n --text-5xl: 3rem;\n --text-5xl--line-height: 1;\n --text-6xl: 3.75rem;\n --text-6xl--line-height: 1;\n --text-7xl: 4.5rem;\n --text-7xl--line-height: 1;\n --text-8xl: 6rem;\n --text-8xl--line-height: 1;\n --font-weight-medium: 500;\n --font-weight-semibold: 600;\n --font-weight-bold: 700;\n --font-weight-extrabold: 800;\n --font-weight-black: 900;\n --tracking-tight: -0.025em;\n --tracking-wider: 0.05em;\n --tracking-widest: 0.1em;\n --leading-tight: 1.25;\n --leading-relaxed: 1.625;\n --radius-sm: 0.25rem;\n --radius-md: 0.375rem;\n --radius-lg: 0.5rem;\n --radius-xl: 0.75rem;\n --radius-2xl: 1rem;\n --radius-3xl: 1.5rem;\n --drop-shadow-2xl: 0 25px 25px rgb(0 0 0 / 0.15);\n --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);\n --animate-spin: spin 1s linear infinite;\n --animate-ping: ping 1s cubic-bezier(0, 0, 0.2, 1) infinite;\n --animate-pulse: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n --animate-bounce: bounce 1s infinite;\n --blur-sm: 8px;\n --blur-md: 12px;\n --blur-lg: 16px;\n --blur-xl: 24px;\n --blur-3xl: 64px;\n --default-transition-duration: 150ms;\n --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n --default-font-family: var(--font-sans);\n --default-mono-font-family: var(--font-mono);\n }\n}\n@layer base {\n *,\n ::after,\n ::before,\n ::backdrop,\n ::file-selector-button {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n border: 0 solid;\n }\n html,\n :host {\n line-height: 1.5;\n -webkit-text-size-adjust: 100%;\n tab-size: 4;\n font-family: var(--default-font-family, ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");\n font-feature-settings: var(--default-font-feature-settings, normal);\n font-variation-settings: var(--default-font-variation-settings, normal);\n -webkit-tap-highlight-color: transparent;\n }\n hr {\n height: 0;\n color: inherit;\n border-top-width: 1px;\n }\n abbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n }\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n font-size: inherit;\n font-weight: inherit;\n }\n a {\n color: inherit;\n -webkit-text-decoration: inherit;\n text-decoration: inherit;\n }\n b,\n strong {\n font-weight: bolder;\n }\n code,\n kbd,\n samp,\n pre {\n font-family: var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);\n font-feature-settings: var(--default-mono-font-feature-settings, normal);\n font-variation-settings: var(--default-mono-font-variation-settings, normal);\n font-size: 1em;\n }\n small {\n font-size: 80%;\n }\n sub,\n sup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n }\n sub {\n bottom: -0.25em;\n }\n sup {\n top: -0.5em;\n }\n table {\n text-indent: 0;\n border-color: inherit;\n border-collapse: collapse;\n }\n :-moz-focusring {\n outline: auto;\n }\n progress {\n vertical-align: baseline;\n }\n summary {\n display: list-item;\n }\n ol,\n ul,\n menu {\n list-style: none;\n }\n img,\n svg,\n video,\n canvas,\n audio,\n iframe,\n embed,\n object {\n display: block;\n vertical-align: middle;\n }\n img,\n video {\n max-width: 100%;\n height: auto;\n }\n button,\n input,\n select,\n optgroup,\n textarea,\n ::file-selector-button {\n font: inherit;\n font-feature-settings: inherit;\n font-variation-settings: inherit;\n letter-spacing: inherit;\n color: inherit;\n border-radius: 0;\n background-color: transparent;\n opacity: 1;\n }\n :where(select:is([multiple], [size])) optgroup {\n font-weight: bolder;\n }\n :where(select:is([multiple], [size])) optgroup option {\n padding-inline-start: 20px;\n }\n ::file-selector-button {\n margin-inline-end: 4px;\n }\n ::placeholder {\n opacity: 1;\n }\n @supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px) {\n ::placeholder {\n color: currentcolor;\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, currentcolor 50%, transparent);\n }\n }\n }\n textarea {\n resize: vertical;\n }\n ::-webkit-search-decoration {\n -webkit-appearance: none;\n }\n ::-webkit-date-and-time-value {\n min-height: 1lh;\n text-align: inherit;\n }\n ::-webkit-datetime-edit {\n display: inline-flex;\n }\n ::-webkit-datetime-edit-fields-wrapper {\n padding: 0;\n }\n ::-webkit-datetime-edit,\n ::-webkit-datetime-edit-year-field,\n ::-webkit-datetime-edit-month-field,\n ::-webkit-datetime-edit-day-field,\n ::-webkit-datetime-edit-hour-field,\n ::-webkit-datetime-edit-minute-field,\n ::-webkit-datetime-edit-second-field,\n ::-webkit-datetime-edit-millisecond-field,\n ::-webkit-datetime-edit-meridiem-field {\n padding-block: 0;\n }\n ::-webkit-calendar-picker-indicator {\n line-height: 1;\n }\n :-moz-ui-invalid {\n box-shadow: none;\n }\n button,\n input:where([type=button], [type=reset], [type=submit]),\n ::file-selector-button {\n appearance: button;\n }\n ::-webkit-inner-spin-button,\n ::-webkit-outer-spin-button {\n height: auto;\n }\n [hidden]:where(:not([hidden=until-found])) {\n display: none !important;\n }\n}\n@layer utilities {\n .pointer-events-auto {\n pointer-events: auto;\n }\n .pointer-events-none {\n pointer-events: none;\n }\n .absolute {\n position: absolute;\n }\n .fixed {\n position: fixed;\n }\n .relative {\n position: relative;\n }\n .static {\n position: static;\n }\n .sticky {\n position: sticky;\n }\n .-inset-3 {\n inset: calc(var(--spacing) * -3);\n }\n .inset-0 {\n inset: calc(var(--spacing) * 0);\n }\n .-top-8 {\n top: calc(var(--spacing) * -8);\n }\n .-top-20 {\n top: calc(var(--spacing) * -20);\n }\n .-top-24 {\n top: calc(var(--spacing) * -24);\n }\n .top-0 {\n top: calc(var(--spacing) * 0);\n }\n .top-1\\/2 {\n top: calc(1 / 2 * 100%);\n }\n .top-2 {\n top: calc(var(--spacing) * 2);\n }\n .top-4 {\n top: calc(var(--spacing) * 4);\n }\n .-right-2 {\n right: calc(var(--spacing) * -2);\n }\n .-right-4 {\n right: calc(var(--spacing) * -4);\n }\n .right-0 {\n right: calc(var(--spacing) * 0);\n }\n .right-2 {\n right: calc(var(--spacing) * 2);\n }\n .right-4 {\n right: calc(var(--spacing) * 4);\n }\n .right-5 {\n right: calc(var(--spacing) * 5);\n }\n .right-6 {\n right: calc(var(--spacing) * 6);\n }\n .-bottom-1\\.5 {\n bottom: calc(var(--spacing) * -1.5);\n }\n .-bottom-3 {\n bottom: calc(var(--spacing) * -3);\n }\n .-bottom-4 {\n bottom: calc(var(--spacing) * -4);\n }\n .bottom-6 {\n bottom: calc(var(--spacing) * 6);\n }\n .bottom-20 {\n bottom: calc(var(--spacing) * 20);\n }\n .-left-4 {\n left: calc(var(--spacing) * -4);\n }\n .-left-24 {\n left: calc(var(--spacing) * -24);\n }\n .left-0 {\n left: calc(var(--spacing) * 0);\n }\n .left-1\\/2 {\n left: calc(1 / 2 * 100%);\n }\n .left-2 {\n left: calc(var(--spacing) * 2);\n }\n .left-5 {\n left: calc(var(--spacing) * 5);\n }\n .left-6 {\n left: calc(var(--spacing) * 6);\n }\n .z-0 {\n z-index: 0;\n }\n .z-10 {\n z-index: 10;\n }\n .z-20 {\n z-index: 20;\n }\n .z-50 {\n z-index: 50;\n }\n .z-\\[100\\] {\n z-index: 100;\n }\n .z-\\[9998\\] {\n z-index: 9998;\n }\n .z-\\[9999\\] {\n z-index: 9999;\n }\n .container {\n width: 100%;\n @media (width >= 40rem) {\n max-width: 40rem;\n }\n @media (width >= 48rem) {\n max-width: 48rem;\n }\n @media (width >= 64rem) {\n max-width: 64rem;\n }\n @media (width >= 80rem) {\n max-width: 80rem;\n }\n @media (width >= 96rem) {\n max-width: 96rem;\n }\n }\n .mx-1 {\n margin-inline: calc(var(--spacing) * 1);\n }\n .mx-auto {\n margin-inline: auto;\n }\n .my-1\\.5 {\n margin-block: calc(var(--spacing) * 1.5);\n }\n .my-2 {\n margin-block: calc(var(--spacing) * 2);\n }\n .my-3 {\n margin-block: calc(var(--spacing) * 3);\n }\n .my-4 {\n margin-block: calc(var(--spacing) * 4);\n }\n .my-5 {\n margin-block: calc(var(--spacing) * 5);\n }\n .my-6 {\n margin-block: calc(var(--spacing) * 6);\n }\n .mt-0\\.5 {\n margin-top: calc(var(--spacing) * 0.5);\n }\n .mt-1 {\n margin-top: calc(var(--spacing) * 1);\n }\n .mt-1\\.5 {\n margin-top: calc(var(--spacing) * 1.5);\n }\n .mt-2 {\n margin-top: calc(var(--spacing) * 2);\n }\n .mt-3 {\n margin-top: calc(var(--spacing) * 3);\n }\n .mt-4 {\n margin-top: calc(var(--spacing) * 4);\n }\n .mt-5 {\n margin-top: calc(var(--spacing) * 5);\n }\n .mt-6 {\n margin-top: calc(var(--spacing) * 6);\n }\n .mt-8 {\n margin-top: calc(var(--spacing) * 8);\n }\n .mt-10 {\n margin-top: calc(var(--spacing) * 10);\n }\n .mt-14 {\n margin-top: calc(var(--spacing) * 14);\n }\n .mt-auto {\n margin-top: auto;\n }\n .mr-2 {\n margin-right: calc(var(--spacing) * 2);\n }\n .mb-0\\.5 {\n margin-bottom: calc(var(--spacing) * 0.5);\n }\n .mb-1 {\n margin-bottom: calc(var(--spacing) * 1);\n }\n .mb-1\\.5 {\n margin-bottom: calc(var(--spacing) * 1.5);\n }\n .mb-2 {\n margin-bottom: calc(var(--spacing) * 2);\n }\n .mb-3 {\n margin-bottom: calc(var(--spacing) * 3);\n }\n .mb-4 {\n margin-bottom: calc(var(--spacing) * 4);\n }\n .mb-5 {\n margin-bottom: calc(var(--spacing) * 5);\n }\n .mb-6 {\n margin-bottom: calc(var(--spacing) * 6);\n }\n .mb-12 {\n margin-bottom: calc(var(--spacing) * 12);\n }\n .mb-14 {\n margin-bottom: calc(var(--spacing) * 14);\n }\n .ml-1 {\n margin-left: calc(var(--spacing) * 1);\n }\n .ml-1\\.5 {\n margin-left: calc(var(--spacing) * 1.5);\n }\n .ml-2 {\n margin-left: calc(var(--spacing) * 2);\n }\n .ml-auto {\n margin-left: auto;\n }\n .line-clamp-1 {\n overflow: hidden;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 1;\n }\n .line-clamp-2 {\n overflow: hidden;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 2;\n }\n .\\!table {\n display: table !important;\n }\n .\\!table-cell {\n display: table-cell !important;\n }\n .\\!table-header-group {\n display: table-header-group !important;\n }\n .\\!table-row {\n display: table-row !important;\n }\n .\\!table-row-group {\n display: table-row-group !important;\n }\n .block {\n display: block;\n }\n .contents {\n display: contents;\n }\n .flex {\n display: flex;\n }\n .grid {\n display: grid;\n }\n .hidden {\n display: none;\n }\n .inline-block {\n display: inline-block;\n }\n .inline-flex {\n display: inline-flex;\n }\n .table {\n display: table;\n }\n .aspect-\\[4\\/3\\] {\n aspect-ratio: 4/3;\n }\n .aspect-square {\n aspect-ratio: 1 / 1;\n }\n .h-0\\.5 {\n height: calc(var(--spacing) * 0.5);\n }\n .h-1 {\n height: calc(var(--spacing) * 1);\n }\n .h-1\\.5 {\n height: calc(var(--spacing) * 1.5);\n }\n .h-2 {\n height: calc(var(--spacing) * 2);\n }\n .h-2\\.5 {\n height: calc(var(--spacing) * 2.5);\n }\n .h-3 {\n height: calc(var(--spacing) * 3);\n }\n .h-3\\.5 {\n height: calc(var(--spacing) * 3.5);\n }\n .h-4 {\n height: calc(var(--spacing) * 4);\n }\n .h-5 {\n height: calc(var(--spacing) * 5);\n }\n .h-6 {\n height: calc(var(--spacing) * 6);\n }\n .h-7 {\n height: calc(var(--spacing) * 7);\n }\n .h-8 {\n height: calc(var(--spacing) * 8);\n }\n .h-9 {\n height: calc(var(--spacing) * 9);\n }\n .h-10 {\n height: calc(var(--spacing) * 10);\n }\n .h-11 {\n height: calc(var(--spacing) * 11);\n }\n .h-12 {\n height: calc(var(--spacing) * 12);\n }\n .h-14 {\n height: calc(var(--spacing) * 14);\n }\n .h-16 {\n height: calc(var(--spacing) * 16);\n }\n .h-28 {\n height: calc(var(--spacing) * 28);\n }\n .h-32 {\n height: calc(var(--spacing) * 32);\n }\n .h-40 {\n height: calc(var(--spacing) * 40);\n }\n .h-\\[400\\%\\] {\n height: 400%;\n }\n .h-\\[480px\\] {\n height: 480px;\n }\n .h-\\[500px\\] {\n height: 500px;\n }\n .h-\\[600px\\] {\n height: 600px;\n }\n .h-full {\n height: 100%;\n }\n .max-h-24 {\n max-height: calc(var(--spacing) * 24);\n }\n .max-h-32 {\n max-height: calc(var(--spacing) * 32);\n }\n .max-h-40 {\n max-height: calc(var(--spacing) * 40);\n }\n .max-h-56 {\n max-height: calc(var(--spacing) * 56);\n }\n .max-h-60 {\n max-height: calc(var(--spacing) * 60);\n }\n .max-h-64 {\n max-height: calc(var(--spacing) * 64);\n }\n .max-h-\\[320px\\] {\n max-height: 320px;\n }\n .max-h-\\[400px\\] {\n max-height: 400px;\n }\n .max-h-\\[800px\\] {\n max-height: 800px;\n }\n .min-h-0 {\n min-height: calc(var(--spacing) * 0);\n }\n .min-h-\\[300px\\] {\n min-height: 300px;\n }\n .min-h-\\[400px\\] {\n min-height: 400px;\n }\n .min-h-\\[560px\\] {\n min-height: 560px;\n }\n .min-h-screen {\n min-height: 100vh;\n }\n .w-1\\.5 {\n width: calc(var(--spacing) * 1.5);\n }\n .w-2 {\n width: calc(var(--spacing) * 2);\n }\n .w-2\\.5 {\n width: calc(var(--spacing) * 2.5);\n }\n .w-3 {\n width: calc(var(--spacing) * 3);\n }\n .w-3\\.5 {\n width: calc(var(--spacing) * 3.5);\n }\n .w-4 {\n width: calc(var(--spacing) * 4);\n }\n .w-5 {\n width: calc(var(--spacing) * 5);\n }\n .w-6 {\n width: calc(var(--spacing) * 6);\n }\n .w-7 {\n width: calc(var(--spacing) * 7);\n }\n .w-8 {\n width: calc(var(--spacing) * 8);\n }\n .w-9 {\n width: calc(var(--spacing) * 9);\n }\n .w-10 {\n width: calc(var(--spacing) * 10);\n }\n .w-11 {\n width: calc(var(--spacing) * 11);\n }\n .w-12 {\n width: calc(var(--spacing) * 12);\n }\n .w-14 {\n width: calc(var(--spacing) * 14);\n }\n .w-16 {\n width: calc(var(--spacing) * 16);\n }\n .w-20 {\n width: calc(var(--spacing) * 20);\n }\n .w-28 {\n width: calc(var(--spacing) * 28);\n }\n .w-36 {\n width: calc(var(--spacing) * 36);\n }\n .w-40 {\n width: calc(var(--spacing) * 40);\n }\n .w-44 {\n width: calc(var(--spacing) * 44);\n }\n .w-\\[400\\%\\] {\n width: 400%;\n }\n .w-\\[500px\\] {\n width: 500px;\n }\n .w-\\[600px\\] {\n width: 600px;\n }\n .w-\\[min\\(88\\%\\,18rem\\)\\] {\n width: min(88%, 18rem);\n }\n .w-fit {\n width: fit-content;\n }\n .w-full {\n width: 100%;\n }\n .w-px {\n width: 1px;\n }\n .max-w-2xl {\n max-width: var(--container-2xl);\n }\n .max-w-5xl {\n max-width: var(--container-5xl);\n }\n .max-w-6xl {\n max-width: var(--container-6xl);\n }\n .max-w-\\[90\\%\\] {\n max-width: 90%;\n }\n .max-w-\\[92\\%\\] {\n max-width: 92%;\n }\n .max-w-\\[94\\%\\] {\n max-width: 94%;\n }\n .max-w-\\[calc\\(100vw-3rem\\)\\] {\n max-width: calc(100vw - 3rem);\n }\n .max-w-full {\n max-width: 100%;\n }\n .max-w-lg {\n max-width: var(--container-lg);\n }\n .max-w-md {\n max-width: var(--container-md);\n }\n .max-w-none {\n max-width: none;\n }\n .max-w-xl {\n max-width: var(--container-xl);\n }\n .max-w-xs {\n max-width: var(--container-xs);\n }\n .min-w-0 {\n min-width: calc(var(--spacing) * 0);\n }\n .min-w-\\[11rem\\] {\n min-width: 11rem;\n }\n .min-w-\\[400px\\] {\n min-width: 400px;\n }\n .flex-1 {\n flex: 1;\n }\n .flex-shrink-0 {\n flex-shrink: 0;\n }\n .shrink-0 {\n flex-shrink: 0;\n }\n .flex-grow {\n flex-grow: 1;\n }\n .border-collapse {\n border-collapse: collapse;\n }\n .-translate-x-1\\/2 {\n --tw-translate-x: calc(calc(1 / 2 * 100%) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .-translate-y-1 {\n --tw-translate-y: calc(var(--spacing) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .-translate-y-1\\/2 {\n --tw-translate-y: calc(calc(1 / 2 * 100%) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .translate-y-0 {\n --tw-translate-y: calc(var(--spacing) * 0);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .translate-y-4 {\n --tw-translate-y: calc(var(--spacing) * 4);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .scale-90 {\n --tw-scale-x: 90%;\n --tw-scale-y: 90%;\n --tw-scale-z: 90%;\n scale: var(--tw-scale-x) var(--tw-scale-y);\n }\n .scale-95 {\n --tw-scale-x: 95%;\n --tw-scale-y: 95%;\n --tw-scale-z: 95%;\n scale: var(--tw-scale-x) var(--tw-scale-y);\n }\n .scale-100 {\n --tw-scale-x: 100%;\n --tw-scale-y: 100%;\n --tw-scale-z: 100%;\n scale: var(--tw-scale-x) var(--tw-scale-y);\n }\n .scale-110 {\n --tw-scale-x: 110%;\n --tw-scale-y: 110%;\n --tw-scale-z: 110%;\n scale: var(--tw-scale-x) var(--tw-scale-y);\n }\n .scale-\\[1\\.03\\] {\n scale: 1.03;\n }\n .rotate-0 {\n rotate: 0deg;\n }\n .rotate-45 {\n rotate: 45deg;\n }\n .rotate-90 {\n rotate: 90deg;\n }\n .transform {\n transform: var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);\n }\n .animate-\\[pulse_1\\.2s_infinite\\] {\n animation: pulse 1.2s infinite;\n }\n .animate-bounce {\n animation: var(--animate-bounce);\n }\n .animate-ping {\n animation: var(--animate-ping);\n }\n .animate-pulse {\n animation: var(--animate-pulse);\n }\n .animate-spin {\n animation: var(--animate-spin);\n }\n .cursor-default {\n cursor: default;\n }\n .cursor-not-allowed {\n cursor: not-allowed;\n }\n .cursor-nw-resize {\n cursor: nw-resize;\n }\n .cursor-pointer {\n cursor: pointer;\n }\n .resize {\n resize: both;\n }\n .resize-none {\n resize: none;\n }\n .snap-x {\n scroll-snap-type: x var(--tw-scroll-snap-strictness);\n }\n .snap-mandatory {\n --tw-scroll-snap-strictness: mandatory;\n }\n .snap-start {\n scroll-snap-align: start;\n }\n .scrollbar-thin {\n scrollbar-width: thin;\n }\n .scrollbar-thumb-slate-200 {\n --tw-scrollbar-thumb: var(--color-slate-200);\n scrollbar-color: var(--tw-scrollbar-thumb) var(--tw-scrollbar-track);\n }\n .scrollbar-track-transparent {\n --tw-scrollbar-track: transparent;\n scrollbar-color: var(--tw-scrollbar-thumb) var(--tw-scrollbar-track);\n }\n .grid-cols-3 {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n }\n .flex-col {\n flex-direction: column;\n }\n .flex-row {\n flex-direction: row;\n }\n .flex-row-reverse {\n flex-direction: row-reverse;\n }\n .flex-wrap {\n flex-wrap: wrap;\n }\n .items-center {\n align-items: center;\n }\n .items-end {\n align-items: flex-end;\n }\n .items-start {\n align-items: flex-start;\n }\n .justify-between {\n justify-content: space-between;\n }\n .justify-center {\n justify-content: center;\n }\n .justify-start {\n justify-content: flex-start;\n }\n .gap-0\\.5 {\n gap: calc(var(--spacing) * 0.5);\n }\n .gap-1 {\n gap: calc(var(--spacing) * 1);\n }\n .gap-1\\.5 {\n gap: calc(var(--spacing) * 1.5);\n }\n .gap-2 {\n gap: calc(var(--spacing) * 2);\n }\n .gap-2\\.5 {\n gap: calc(var(--spacing) * 2.5);\n }\n .gap-3 {\n gap: calc(var(--spacing) * 3);\n }\n .gap-4 {\n gap: calc(var(--spacing) * 4);\n }\n .gap-5 {\n gap: calc(var(--spacing) * 5);\n }\n .gap-7 {\n gap: calc(var(--spacing) * 7);\n }\n .gap-8 {\n gap: calc(var(--spacing) * 8);\n }\n .gap-12 {\n gap: calc(var(--spacing) * 12);\n }\n .space-y-0\\.5 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 0.5) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 0.5) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .space-y-1 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .space-y-1\\.5 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .space-y-2 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .space-y-3 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .space-y-4 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .space-y-5 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .divide-y {\n :where(& > :not(:last-child)) {\n --tw-divide-y-reverse: 0;\n border-bottom-style: var(--tw-border-style);\n border-top-style: var(--tw-border-style);\n border-top-width: calc(1px * var(--tw-divide-y-reverse));\n border-bottom-width: calc(1px * calc(1 - var(--tw-divide-y-reverse)));\n }\n }\n .divide-slate-100 {\n :where(& > :not(:last-child)) {\n border-color: var(--color-slate-100);\n }\n }\n .self-center {\n align-self: center;\n }\n .truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .overflow-auto {\n overflow: auto;\n }\n .overflow-hidden {\n overflow: hidden;\n }\n .overflow-x-auto {\n overflow-x: auto;\n }\n .overflow-y-auto {\n overflow-y: auto;\n }\n .rounded {\n border-radius: 0.25rem;\n }\n .rounded-2xl {\n border-radius: var(--radius-2xl);\n }\n .rounded-3xl {\n border-radius: var(--radius-3xl);\n }\n .rounded-\\[2px\\] {\n border-radius: 2px;\n }\n .rounded-full {\n border-radius: calc(infinity * 1px);\n }\n .rounded-lg {\n border-radius: var(--radius-lg);\n }\n .rounded-md {\n border-radius: var(--radius-md);\n }\n .rounded-none {\n border-radius: 0;\n }\n .rounded-sm {\n border-radius: var(--radius-sm);\n }\n .rounded-xl {\n border-radius: var(--radius-xl);\n }\n .rounded-t-2xl {\n border-top-left-radius: var(--radius-2xl);\n border-top-right-radius: var(--radius-2xl);\n }\n .rounded-t-md {\n border-top-left-radius: var(--radius-md);\n border-top-right-radius: var(--radius-md);\n }\n .rounded-tl-\\[2px\\] {\n border-top-left-radius: 2px;\n }\n .rounded-tl-sm {\n border-top-left-radius: var(--radius-sm);\n }\n .rounded-tr-sm {\n border-top-right-radius: var(--radius-sm);\n }\n .border {\n border-style: var(--tw-border-style);\n border-width: 1px;\n }\n .border-2 {\n border-style: var(--tw-border-style);\n border-width: 2px;\n }\n .border-t {\n border-top-style: var(--tw-border-style);\n border-top-width: 1px;\n }\n .border-t-2 {\n border-top-style: var(--tw-border-style);\n border-top-width: 2px;\n }\n .border-r {\n border-right-style: var(--tw-border-style);\n border-right-width: 1px;\n }\n .border-b {\n border-bottom-style: var(--tw-border-style);\n border-bottom-width: 1px;\n }\n .border-b-2 {\n border-bottom-style: var(--tw-border-style);\n border-bottom-width: 2px;\n }\n .border-l-2 {\n border-left-style: var(--tw-border-style);\n border-left-width: 2px;\n }\n .border-dashed {\n --tw-border-style: dashed;\n border-style: dashed;\n }\n .border-amber-100 {\n border-color: var(--color-amber-100);\n }\n .border-amber-200 {\n border-color: var(--color-amber-200);\n }\n .border-emerald-100 {\n border-color: var(--color-emerald-100);\n }\n .border-emerald-200 {\n border-color: var(--color-emerald-200);\n }\n .border-emerald-500 {\n border-color: var(--color-emerald-500);\n }\n .border-emerald-500\\/20 {\n border-color: color-mix(in srgb, oklch(69.6% 0.17 162.48) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--color-emerald-500) 20%, transparent);\n }\n }\n .border-indigo-100 {\n border-color: var(--color-indigo-100);\n }\n .border-indigo-200 {\n border-color: var(--color-indigo-200);\n }\n .border-indigo-500 {\n border-color: var(--color-indigo-500);\n }\n .border-indigo-600 {\n border-color: var(--color-indigo-600);\n }\n .border-red-100 {\n border-color: var(--color-red-100);\n }\n .border-red-200 {\n border-color: var(--color-red-200);\n }\n .border-rose-100 {\n border-color: var(--color-rose-100);\n }\n .border-rose-200 {\n border-color: var(--color-rose-200);\n }\n .border-slate-100 {\n border-color: var(--color-slate-100);\n }\n .border-slate-200 {\n border-color: var(--color-slate-200);\n }\n .border-slate-200\\/50 {\n border-color: color-mix(in srgb, oklch(92.9% 0.013 255.508) 50%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--color-slate-200) 50%, transparent);\n }\n }\n .border-slate-200\\/60 {\n border-color: color-mix(in srgb, oklch(92.9% 0.013 255.508) 60%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--color-slate-200) 60%, transparent);\n }\n }\n .border-slate-200\\/80 {\n border-color: color-mix(in srgb, oklch(92.9% 0.013 255.508) 80%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--color-slate-200) 80%, transparent);\n }\n }\n .border-slate-300 {\n border-color: var(--color-slate-300);\n }\n .border-slate-800 {\n border-color: var(--color-slate-800);\n }\n .border-transparent {\n border-color: transparent;\n }\n .border-violet-200 {\n border-color: var(--color-violet-200);\n }\n .border-violet-600 {\n border-color: var(--color-violet-600);\n }\n .border-white {\n border-color: var(--color-white);\n }\n .border-white\\/5 {\n border-color: color-mix(in srgb, #fff 5%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--color-white) 5%, transparent);\n }\n }\n .border-white\\/8 {\n border-color: color-mix(in srgb, #fff 8%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--color-white) 8%, transparent);\n }\n }\n .border-t-transparent {\n border-top-color: transparent;\n }\n .bg-\\[\\#0d0d1a\\] {\n background-color: #0d0d1a;\n }\n .bg-\\[\\#080818\\] {\n background-color: #080818;\n }\n .bg-amber-50 {\n background-color: var(--color-amber-50);\n }\n .bg-amber-500 {\n background-color: var(--color-amber-500);\n }\n .bg-amber-500\\/80 {\n background-color: color-mix(in srgb, oklch(76.9% 0.188 70.08) 80%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-amber-500) 80%, transparent);\n }\n }\n .bg-emerald-50 {\n background-color: var(--color-emerald-50);\n }\n .bg-emerald-50\\/50 {\n background-color: color-mix(in srgb, oklch(97.9% 0.021 166.113) 50%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-emerald-50) 50%, transparent);\n }\n }\n .bg-emerald-100 {\n background-color: var(--color-emerald-100);\n }\n .bg-emerald-500 {\n background-color: var(--color-emerald-500);\n }\n .bg-emerald-500\\/10 {\n background-color: color-mix(in srgb, oklch(69.6% 0.17 162.48) 10%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-emerald-500) 10%, transparent);\n }\n }\n .bg-emerald-500\\/80 {\n background-color: color-mix(in srgb, oklch(69.6% 0.17 162.48) 80%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-emerald-500) 80%, transparent);\n }\n }\n .bg-indigo-50 {\n background-color: var(--color-indigo-50);\n }\n .bg-indigo-500 {\n background-color: var(--color-indigo-500);\n }\n .bg-indigo-600 {\n background-color: var(--color-indigo-600);\n }\n .bg-red-50 {\n background-color: var(--color-red-50);\n }\n .bg-red-500 {\n background-color: var(--color-red-500);\n }\n .bg-rose-50 {\n background-color: var(--color-rose-50);\n }\n .bg-rose-500 {\n background-color: var(--color-rose-500);\n }\n .bg-rose-500\\/80 {\n background-color: color-mix(in srgb, oklch(64.5% 0.246 16.439) 80%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-rose-500) 80%, transparent);\n }\n }\n .bg-slate-50 {\n background-color: var(--color-slate-50);\n }\n .bg-slate-50\\/20 {\n background-color: color-mix(in srgb, oklch(98.4% 0.003 247.858) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-slate-50) 20%, transparent);\n }\n }\n .bg-slate-50\\/50 {\n background-color: color-mix(in srgb, oklch(98.4% 0.003 247.858) 50%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-slate-50) 50%, transparent);\n }\n }\n .bg-slate-100 {\n background-color: var(--color-slate-100);\n }\n .bg-slate-100\\/50 {\n background-color: color-mix(in srgb, oklch(96.8% 0.007 247.896) 50%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-slate-100) 50%, transparent);\n }\n }\n .bg-slate-200 {\n background-color: var(--color-slate-200);\n }\n .bg-slate-400 {\n background-color: var(--color-slate-400);\n }\n .bg-slate-800 {\n background-color: var(--color-slate-800);\n }\n .bg-slate-900 {\n background-color: var(--color-slate-900);\n }\n .bg-slate-900\\/50 {\n background-color: color-mix(in srgb, oklch(20.8% 0.042 265.755) 50%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-slate-900) 50%, transparent);\n }\n }\n .bg-slate-900\\/90 {\n background-color: color-mix(in srgb, oklch(20.8% 0.042 265.755) 90%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-slate-900) 90%, transparent);\n }\n }\n .bg-slate-950 {\n background-color: var(--color-slate-950);\n }\n .bg-transparent {\n background-color: transparent;\n }\n .bg-violet-50 {\n background-color: var(--color-violet-50);\n }\n .bg-violet-600 {\n background-color: var(--color-violet-600);\n }\n .bg-white {\n background-color: var(--color-white);\n }\n .bg-white\\/20 {\n background-color: color-mix(in srgb, #fff 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-white) 20%, transparent);\n }\n }\n .bg-white\\/60 {\n background-color: color-mix(in srgb, #fff 60%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-white) 60%, transparent);\n }\n }\n .bg-white\\/80 {\n background-color: color-mix(in srgb, #fff 80%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-white) 80%, transparent);\n }\n }\n .bg-white\\/90 {\n background-color: color-mix(in srgb, #fff 90%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-white) 90%, transparent);\n }\n }\n .bg-gradient-to-br {\n --tw-gradient-position: to bottom right in oklab;\n background-image: linear-gradient(var(--tw-gradient-stops));\n }\n .from-slate-100 {\n --tw-gradient-from: var(--color-slate-100);\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n }\n .to-slate-200 {\n --tw-gradient-to: var(--color-slate-200);\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n }\n .bg-clip-text {\n background-clip: text;\n }\n .object-cover {\n object-fit: cover;\n }\n .p-0\\.5 {\n padding: calc(var(--spacing) * 0.5);\n }\n .p-1 {\n padding: calc(var(--spacing) * 1);\n }\n .p-1\\.5 {\n padding: calc(var(--spacing) * 1.5);\n }\n .p-2 {\n padding: calc(var(--spacing) * 2);\n }\n .p-2\\.5 {\n padding: calc(var(--spacing) * 2.5);\n }\n .p-3 {\n padding: calc(var(--spacing) * 3);\n }\n .p-4 {\n padding: calc(var(--spacing) * 4);\n }\n .p-5 {\n padding: calc(var(--spacing) * 5);\n }\n .p-6 {\n padding: calc(var(--spacing) * 6);\n }\n .p-8 {\n padding: calc(var(--spacing) * 8);\n }\n .p-10 {\n padding: calc(var(--spacing) * 10);\n }\n .px-1 {\n padding-inline: calc(var(--spacing) * 1);\n }\n .px-1\\.5 {\n padding-inline: calc(var(--spacing) * 1.5);\n }\n .px-2 {\n padding-inline: calc(var(--spacing) * 2);\n }\n .px-2\\.5 {\n padding-inline: calc(var(--spacing) * 2.5);\n }\n .px-3 {\n padding-inline: calc(var(--spacing) * 3);\n }\n .px-3\\.5 {\n padding-inline: calc(var(--spacing) * 3.5);\n }\n .px-4 {\n padding-inline: calc(var(--spacing) * 4);\n }\n .px-5 {\n padding-inline: calc(var(--spacing) * 5);\n }\n .px-6 {\n padding-inline: calc(var(--spacing) * 6);\n }\n .px-8 {\n padding-inline: calc(var(--spacing) * 8);\n }\n .py-0\\.5 {\n padding-block: calc(var(--spacing) * 0.5);\n }\n .py-1 {\n padding-block: calc(var(--spacing) * 1);\n }\n .py-1\\.5 {\n padding-block: calc(var(--spacing) * 1.5);\n }\n .py-2 {\n padding-block: calc(var(--spacing) * 2);\n }\n .py-2\\.5 {\n padding-block: calc(var(--spacing) * 2.5);\n }\n .py-3 {\n padding-block: calc(var(--spacing) * 3);\n }\n .py-3\\.5 {\n padding-block: calc(var(--spacing) * 3.5);\n }\n .py-4 {\n padding-block: calc(var(--spacing) * 4);\n }\n .py-5 {\n padding-block: calc(var(--spacing) * 5);\n }\n .py-12 {\n padding-block: calc(var(--spacing) * 12);\n }\n .pt-0\\.5 {\n padding-top: calc(var(--spacing) * 0.5);\n }\n .pt-1 {\n padding-top: calc(var(--spacing) * 1);\n }\n .pt-2 {\n padding-top: calc(var(--spacing) * 2);\n }\n .pt-4 {\n padding-top: calc(var(--spacing) * 4);\n }\n .pt-5 {\n padding-top: calc(var(--spacing) * 5);\n }\n .pr-1 {\n padding-right: calc(var(--spacing) * 1);\n }\n .pb-3 {\n padding-bottom: calc(var(--spacing) * 3);\n }\n .pb-4 {\n padding-bottom: calc(var(--spacing) * 4);\n }\n .pb-5 {\n padding-bottom: calc(var(--spacing) * 5);\n }\n .text-center {\n text-align: center;\n }\n .text-left {\n text-align: left;\n }\n .align-middle {\n vertical-align: middle;\n }\n .font-mono {\n font-family: var(--font-mono);\n }\n .text-2xl {\n font-size: var(--text-2xl);\n line-height: var(--tw-leading, var(--text-2xl--line-height));\n }\n .text-3xl {\n font-size: var(--text-3xl);\n line-height: var(--tw-leading, var(--text-3xl--line-height));\n }\n .text-5xl {\n font-size: var(--text-5xl);\n line-height: var(--tw-leading, var(--text-5xl--line-height));\n }\n .text-8xl {\n font-size: var(--text-8xl);\n line-height: var(--tw-leading, var(--text-8xl--line-height));\n }\n .text-base {\n font-size: var(--text-base);\n line-height: var(--tw-leading, var(--text-base--line-height));\n }\n .text-lg {\n font-size: var(--text-lg);\n line-height: var(--tw-leading, var(--text-lg--line-height));\n }\n .text-sm {\n font-size: var(--text-sm);\n line-height: var(--tw-leading, var(--text-sm--line-height));\n }\n .text-xl {\n font-size: var(--text-xl);\n line-height: var(--tw-leading, var(--text-xl--line-height));\n }\n .text-xs {\n font-size: var(--text-xs);\n line-height: var(--tw-leading, var(--text-xs--line-height));\n }\n .text-\\[8px\\] {\n font-size: 8px;\n }\n .text-\\[9px\\] {\n font-size: 9px;\n }\n .text-\\[10px\\] {\n font-size: 10px;\n }\n .text-\\[11px\\] {\n font-size: 11px;\n }\n .text-\\[12px\\] {\n font-size: 12px;\n }\n .text-\\[13px\\] {\n font-size: 13px;\n }\n .leading-\\[1\\.05\\] {\n --tw-leading: 1.05;\n line-height: 1.05;\n }\n .leading-none {\n --tw-leading: 1;\n line-height: 1;\n }\n .leading-relaxed {\n --tw-leading: var(--leading-relaxed);\n line-height: var(--leading-relaxed);\n }\n .leading-tight {\n --tw-leading: var(--leading-tight);\n line-height: var(--leading-tight);\n }\n .font-black {\n --tw-font-weight: var(--font-weight-black);\n font-weight: var(--font-weight-black);\n }\n .font-bold {\n --tw-font-weight: var(--font-weight-bold);\n font-weight: var(--font-weight-bold);\n }\n .font-extrabold {\n --tw-font-weight: var(--font-weight-extrabold);\n font-weight: var(--font-weight-extrabold);\n }\n .font-medium {\n --tw-font-weight: var(--font-weight-medium);\n font-weight: var(--font-weight-medium);\n }\n .font-semibold {\n --tw-font-weight: var(--font-weight-semibold);\n font-weight: var(--font-weight-semibold);\n }\n .tracking-\\[0\\.3em\\] {\n --tw-tracking: 0.3em;\n letter-spacing: 0.3em;\n }\n .tracking-\\[0\\.15em\\] {\n --tw-tracking: 0.15em;\n letter-spacing: 0.15em;\n }\n .tracking-\\[0\\.22em\\] {\n --tw-tracking: 0.22em;\n letter-spacing: 0.22em;\n }\n .tracking-tight {\n --tw-tracking: var(--tracking-tight);\n letter-spacing: var(--tracking-tight);\n }\n .tracking-wider {\n --tw-tracking: var(--tracking-wider);\n letter-spacing: var(--tracking-wider);\n }\n .tracking-widest {\n --tw-tracking: var(--tracking-widest);\n letter-spacing: var(--tracking-widest);\n }\n .break-words {\n overflow-wrap: break-word;\n }\n .whitespace-nowrap {\n white-space: nowrap;\n }\n .whitespace-pre {\n white-space: pre;\n }\n .whitespace-pre-line {\n white-space: pre-line;\n }\n .whitespace-pre-wrap {\n white-space: pre-wrap;\n }\n .text-amber-400 {\n color: var(--color-amber-400);\n }\n .text-amber-500 {\n color: var(--color-amber-500);\n }\n .text-amber-600 {\n color: var(--color-amber-600);\n }\n .text-emerald-400 {\n color: var(--color-emerald-400);\n }\n .text-emerald-500 {\n color: var(--color-emerald-500);\n }\n .text-emerald-500\\/70 {\n color: color-mix(in srgb, oklch(69.6% 0.17 162.48) 70%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--color-emerald-500) 70%, transparent);\n }\n }\n .text-emerald-600 {\n color: var(--color-emerald-600);\n }\n .text-emerald-700 {\n color: var(--color-emerald-700);\n }\n .text-gray-500 {\n color: var(--color-gray-500);\n }\n .text-indigo-200\\/85 {\n color: color-mix(in srgb, oklch(87% 0.065 274.039) 85%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--color-indigo-200) 85%, transparent);\n }\n }\n .text-indigo-400 {\n color: var(--color-indigo-400);\n }\n .text-indigo-500 {\n color: var(--color-indigo-500);\n }\n .text-indigo-600 {\n color: var(--color-indigo-600);\n }\n .text-indigo-700 {\n color: var(--color-indigo-700);\n }\n .text-red-500 {\n color: var(--color-red-500);\n }\n .text-red-600 {\n color: var(--color-red-600);\n }\n .text-rose-400 {\n color: var(--color-rose-400);\n }\n .text-rose-500 {\n color: var(--color-rose-500);\n }\n .text-rose-600 {\n color: var(--color-rose-600);\n }\n .text-slate-100 {\n color: var(--color-slate-100);\n }\n .text-slate-200 {\n color: var(--color-slate-200);\n }\n .text-slate-300 {\n color: var(--color-slate-300);\n }\n .text-slate-400 {\n color: var(--color-slate-400);\n }\n .text-slate-500 {\n color: var(--color-slate-500);\n }\n .text-slate-600 {\n color: var(--color-slate-600);\n }\n .text-slate-700 {\n color: var(--color-slate-700);\n }\n .text-slate-800 {\n color: var(--color-slate-800);\n }\n .text-slate-900 {\n color: var(--color-slate-900);\n }\n .text-transparent {\n color: transparent;\n }\n .text-violet-500 {\n color: var(--color-violet-500);\n }\n .text-violet-700 {\n color: var(--color-violet-700);\n }\n .text-white {\n color: var(--color-white);\n }\n .text-white\\/25 {\n color: color-mix(in srgb, #fff 25%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--color-white) 25%, transparent);\n }\n }\n .text-white\\/35 {\n color: color-mix(in srgb, #fff 35%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--color-white) 35%, transparent);\n }\n }\n .lowercase {\n text-transform: lowercase;\n }\n .uppercase {\n text-transform: uppercase;\n }\n .italic {\n font-style: italic;\n }\n .tabular-nums {\n --tw-numeric-spacing: tabular-nums;\n font-variant-numeric: var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,);\n }\n .antialiased {\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n }\n .placeholder-slate-400 {\n &::placeholder {\n color: var(--color-slate-400);\n }\n }\n .opacity-0 {\n opacity: 0%;\n }\n .opacity-20 {\n opacity: 20%;\n }\n .opacity-25 {\n opacity: 25%;\n }\n .opacity-30 {\n opacity: 30%;\n }\n .opacity-35 {\n opacity: 35%;\n }\n .opacity-40 {\n opacity: 40%;\n }\n .opacity-70 {\n opacity: 70%;\n }\n .opacity-80 {\n opacity: 80%;\n }\n .opacity-100 {\n opacity: 100%;\n }\n .opacity-\\[0\\.05\\] {\n opacity: 0.05;\n }\n .opacity-\\[0\\.025\\] {\n opacity: 0.025;\n }\n .shadow-2xl {\n --tw-shadow: 0 25px 50px -12px var(--tw-shadow-color, rgb(0 0 0 / 0.25));\n box-shadow:\n var(--tw-inset-shadow),\n var(--tw-inset-ring-shadow),\n var(--tw-ring-offset-shadow),\n var(--tw-ring-shadow),\n var(--tw-shadow);\n }\n .shadow-lg {\n --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow:\n var(--tw-inset-shadow),\n var(--tw-inset-ring-shadow),\n var(--tw-ring-offset-shadow),\n var(--tw-ring-shadow),\n var(--tw-shadow);\n }\n .shadow-md {\n --tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow:\n var(--tw-inset-shadow),\n var(--tw-inset-ring-shadow),\n var(--tw-ring-offset-shadow),\n var(--tw-ring-shadow),\n var(--tw-shadow);\n }\n .shadow-sm {\n --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow:\n var(--tw-inset-shadow),\n var(--tw-inset-ring-shadow),\n var(--tw-ring-offset-shadow),\n var(--tw-ring-shadow),\n var(--tw-shadow);\n }\n .shadow-xl {\n --tw-shadow: 0 20px 25px -5px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 8px 10px -6px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow:\n var(--tw-inset-shadow),\n var(--tw-inset-ring-shadow),\n var(--tw-ring-offset-shadow),\n var(--tw-ring-shadow),\n var(--tw-shadow);\n }\n .ring {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow:\n var(--tw-inset-shadow),\n var(--tw-inset-ring-shadow),\n var(--tw-ring-offset-shadow),\n var(--tw-ring-shadow),\n var(--tw-shadow);\n }\n .ring-1 {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow:\n var(--tw-inset-shadow),\n var(--tw-inset-ring-shadow),\n var(--tw-ring-offset-shadow),\n var(--tw-ring-shadow),\n var(--tw-shadow);\n }\n .ring-2 {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow:\n var(--tw-inset-shadow),\n var(--tw-inset-ring-shadow),\n var(--tw-ring-offset-shadow),\n var(--tw-ring-shadow),\n var(--tw-shadow);\n }\n .shadow-rose-500\\/20 {\n --tw-shadow-color: color-mix(in srgb, oklch(64.5% 0.246 16.439) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-shadow-color: color-mix(in oklab, color-mix(in oklab, var(--color-rose-500) 20%, transparent) var(--tw-shadow-alpha), transparent);\n }\n }\n .shadow-slate-200\\/80 {\n --tw-shadow-color: color-mix(in srgb, oklch(92.9% 0.013 255.508) 80%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-shadow-color: color-mix(in oklab, color-mix(in oklab, var(--color-slate-200) 80%, transparent) var(--tw-shadow-alpha), transparent);\n }\n }\n .ring-slate-200\\/80 {\n --tw-ring-color: color-mix(in srgb, oklch(92.9% 0.013 255.508) 80%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--color-slate-200) 80%, transparent);\n }\n }\n .ring-offset-1 {\n --tw-ring-offset-width: 1px;\n --tw-ring-offset-shadow: var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n }\n .ring-offset-transparent {\n --tw-ring-offset-color: transparent;\n }\n .blur-3xl {\n --tw-blur: blur(var(--blur-3xl));\n filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);\n }\n .blur-lg {\n --tw-blur: blur(var(--blur-lg));\n filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);\n }\n .drop-shadow-2xl {\n --tw-drop-shadow-size: drop-shadow(0 25px 25px var(--tw-drop-shadow-color, rgb(0 0 0 / 0.15)));\n --tw-drop-shadow: drop-shadow(var(--drop-shadow-2xl));\n filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);\n }\n .filter {\n filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);\n }\n .backdrop-blur-md {\n --tw-backdrop-blur: blur(var(--blur-md));\n -webkit-backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);\n backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);\n }\n .backdrop-blur-sm {\n --tw-backdrop-blur: blur(var(--blur-sm));\n -webkit-backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);\n backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);\n }\n .backdrop-blur-xl {\n --tw-backdrop-blur: blur(var(--blur-xl));\n -webkit-backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);\n backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);\n }\n .transition-all {\n transition-property: all;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-colors {\n transition-property:\n color,\n background-color,\n border-color,\n outline-color,\n text-decoration-color,\n fill,\n stroke,\n --tw-gradient-from,\n --tw-gradient-via,\n --tw-gradient-to;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-opacity {\n transition-property: opacity;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-shadow {\n transition-property: box-shadow;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-transform {\n transition-property:\n transform,\n translate,\n scale,\n rotate;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .duration-200 {\n --tw-duration: 200ms;\n transition-duration: 200ms;\n }\n .duration-300 {\n --tw-duration: 300ms;\n transition-duration: 300ms;\n }\n .duration-500 {\n --tw-duration: 500ms;\n transition-duration: 500ms;\n }\n .duration-700 {\n --tw-duration: 700ms;\n transition-duration: 700ms;\n }\n .ease-in-out {\n --tw-ease: var(--ease-in-out);\n transition-timing-function: var(--ease-in-out);\n }\n .outline-none {\n --tw-outline-style: none;\n outline-style: none;\n }\n .select-none {\n -webkit-user-select: none;\n user-select: none;\n }\n .select-text {\n -webkit-user-select: text;\n user-select: text;\n }\n .\\[animation-delay\\:0ms\\] {\n animation-delay: 0ms;\n }\n .\\[animation-delay\\:150ms\\] {\n animation-delay: 150ms;\n }\n .\\[animation-delay\\:300ms\\] {\n animation-delay: 300ms;\n }\n .group-hover\\:translate-x-1 {\n &:is(:where(.group):hover *) {\n @media (hover: hover) {\n --tw-translate-x: calc(var(--spacing) * 1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n }\n .group-hover\\:translate-y-0 {\n &:is(:where(.group):hover *) {\n @media (hover: hover) {\n --tw-translate-y: calc(var(--spacing) * 0);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n }\n .group-hover\\:scale-100 {\n &:is(:where(.group):hover *) {\n @media (hover: hover) {\n --tw-scale-x: 100%;\n --tw-scale-y: 100%;\n --tw-scale-z: 100%;\n scale: var(--tw-scale-x) var(--tw-scale-y);\n }\n }\n }\n .group-hover\\:scale-105 {\n &:is(:where(.group):hover *) {\n @media (hover: hover) {\n --tw-scale-x: 105%;\n --tw-scale-y: 105%;\n --tw-scale-z: 105%;\n scale: var(--tw-scale-x) var(--tw-scale-y);\n }\n }\n }\n .group-hover\\:scale-110 {\n &:is(:where(.group):hover *) {\n @media (hover: hover) {\n --tw-scale-x: 110%;\n --tw-scale-y: 110%;\n --tw-scale-z: 110%;\n scale: var(--tw-scale-x) var(--tw-scale-y);\n }\n }\n }\n .group-hover\\:animate-\\[gradientMove_3\\.5s_ease-in-out_infinite_alternate\\] {\n &:is(:where(.group):hover *) {\n @media (hover: hover) {\n animation: gradientMove 3.5s ease-in-out infinite alternate;\n }\n }\n }\n .group-hover\\:animate-\\[shapeshift_5s_ease-in-out_infinite_forwards\\] {\n &:is(:where(.group):hover *) {\n @media (hover: hover) {\n animation: shapeshift 5s ease-in-out infinite forwards;\n }\n }\n }\n .group-hover\\:rounded-none {\n &:is(:where(.group):hover *) {\n @media (hover: hover) {\n border-radius: 0;\n }\n }\n }\n .group-hover\\:border-slate-500 {\n &:is(:where(.group):hover *) {\n @media (hover: hover) {\n border-color: var(--color-slate-500);\n }\n }\n }\n .group-hover\\:text-indigo-600 {\n &:is(:where(.group):hover *) {\n @media (hover: hover) {\n color: var(--color-indigo-600);\n }\n }\n }\n .group-hover\\:opacity-80 {\n &:is(:where(.group):hover *) {\n @media (hover: hover) {\n opacity: 80%;\n }\n }\n }\n .group-hover\\:opacity-100 {\n &:is(:where(.group):hover *) {\n @media (hover: hover) {\n opacity: 100%;\n }\n }\n }\n .group-hover\\:opacity-\\[0\\.08\\] {\n &:is(:where(.group):hover *) {\n @media (hover: hover) {\n opacity: 0.08;\n }\n }\n }\n .focus-within\\:border-slate-300 {\n &:focus-within {\n border-color: var(--color-slate-300);\n }\n }\n .hover\\:-translate-y-0\\.5 {\n &:hover {\n @media (hover: hover) {\n --tw-translate-y: calc(var(--spacing) * -0.5);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n }\n .hover\\:-translate-y-1 {\n &:hover {\n @media (hover: hover) {\n --tw-translate-y: calc(var(--spacing) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n }\n .hover\\:scale-105 {\n &:hover {\n @media (hover: hover) {\n --tw-scale-x: 105%;\n --tw-scale-y: 105%;\n --tw-scale-z: 105%;\n scale: var(--tw-scale-x) var(--tw-scale-y);\n }\n }\n }\n .hover\\:scale-110 {\n &:hover {\n @media (hover: hover) {\n --tw-scale-x: 110%;\n --tw-scale-y: 110%;\n --tw-scale-z: 110%;\n scale: var(--tw-scale-x) var(--tw-scale-y);\n }\n }\n }\n .hover\\:scale-\\[1\\.01\\] {\n &:hover {\n @media (hover: hover) {\n scale: 1.01;\n }\n }\n }\n .hover\\:scale-\\[1\\.02\\] {\n &:hover {\n @media (hover: hover) {\n scale: 1.02;\n }\n }\n }\n .hover\\:border-emerald-200 {\n &:hover {\n @media (hover: hover) {\n border-color: var(--color-emerald-200);\n }\n }\n }\n .hover\\:border-indigo-200 {\n &:hover {\n @media (hover: hover) {\n border-color: var(--color-indigo-200);\n }\n }\n }\n .hover\\:border-indigo-300 {\n &:hover {\n @media (hover: hover) {\n border-color: var(--color-indigo-300);\n }\n }\n }\n .hover\\:border-rose-200 {\n &:hover {\n @media (hover: hover) {\n border-color: var(--color-rose-200);\n }\n }\n }\n .hover\\:border-slate-300 {\n &:hover {\n @media (hover: hover) {\n border-color: var(--color-slate-300);\n }\n }\n }\n .hover\\:border-slate-300\\/60 {\n &:hover {\n @media (hover: hover) {\n border-color: color-mix(in srgb, oklch(86.9% 0.022 252.894) 60%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--color-slate-300) 60%, transparent);\n }\n }\n }\n }\n .hover\\:border-slate-800 {\n &:hover {\n @media (hover: hover) {\n border-color: var(--color-slate-800);\n }\n }\n }\n .hover\\:border-violet-300 {\n &:hover {\n @media (hover: hover) {\n border-color: var(--color-violet-300);\n }\n }\n }\n .hover\\:bg-emerald-50 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--color-emerald-50);\n }\n }\n }\n .hover\\:bg-indigo-50 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--color-indigo-50);\n }\n }\n }\n .hover\\:bg-rose-50 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--color-rose-50);\n }\n }\n }\n .hover\\:bg-rose-600 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--color-rose-600);\n }\n }\n }\n .hover\\:bg-slate-50 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--color-slate-50);\n }\n }\n }\n .hover\\:bg-slate-50\\/60 {\n &:hover {\n @media (hover: hover) {\n background-color: color-mix(in srgb, oklch(98.4% 0.003 247.858) 60%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-slate-50) 60%, transparent);\n }\n }\n }\n }\n .hover\\:bg-slate-50\\/70 {\n &:hover {\n @media (hover: hover) {\n background-color: color-mix(in srgb, oklch(98.4% 0.003 247.858) 70%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-slate-50) 70%, transparent);\n }\n }\n }\n }\n .hover\\:bg-slate-100 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--color-slate-100);\n }\n }\n }\n .hover\\:bg-slate-200 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--color-slate-200);\n }\n }\n }\n .hover\\:bg-slate-800 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--color-slate-800);\n }\n }\n }\n .hover\\:bg-violet-50 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--color-violet-50);\n }\n }\n }\n .hover\\:bg-white {\n &:hover {\n @media (hover: hover) {\n background-color: var(--color-white);\n }\n }\n }\n .hover\\:bg-white\\/5 {\n &:hover {\n @media (hover: hover) {\n background-color: color-mix(in srgb, #fff 5%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-white) 5%, transparent);\n }\n }\n }\n }\n .hover\\:text-\\[\\#CB3837\\] {\n &:hover {\n @media (hover: hover) {\n color: #CB3837;\n }\n }\n }\n .hover\\:text-blue-500 {\n &:hover {\n @media (hover: hover) {\n color: var(--color-blue-500);\n }\n }\n }\n .hover\\:text-emerald-400 {\n &:hover {\n @media (hover: hover) {\n color: var(--color-emerald-400);\n }\n }\n }\n .hover\\:text-emerald-500 {\n &:hover {\n @media (hover: hover) {\n color: var(--color-emerald-500);\n }\n }\n }\n .hover\\:text-indigo-300 {\n &:hover {\n @media (hover: hover) {\n color: var(--color-indigo-300);\n }\n }\n }\n .hover\\:text-indigo-500 {\n &:hover {\n @media (hover: hover) {\n color: var(--color-indigo-500);\n }\n }\n }\n .hover\\:text-indigo-600 {\n &:hover {\n @media (hover: hover) {\n color: var(--color-indigo-600);\n }\n }\n }\n .hover\\:text-indigo-700 {\n &:hover {\n @media (hover: hover) {\n color: var(--color-indigo-700);\n }\n }\n }\n .hover\\:text-rose-500 {\n &:hover {\n @media (hover: hover) {\n color: var(--color-rose-500);\n }\n }\n }\n .hover\\:text-slate-600 {\n &:hover {\n @media (hover: hover) {\n color: var(--color-slate-600);\n }\n }\n }\n .hover\\:text-slate-900 {\n &:hover {\n @media (hover: hover) {\n color: var(--color-slate-900);\n }\n }\n }\n .hover\\:text-violet-700 {\n &:hover {\n @media (hover: hover) {\n color: var(--color-violet-700);\n }\n }\n }\n .hover\\:text-white\\/80 {\n &:hover {\n @media (hover: hover) {\n color: color-mix(in srgb, #fff 80%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--color-white) 80%, transparent);\n }\n }\n }\n }\n .hover\\:opacity-90 {\n &:hover {\n @media (hover: hover) {\n opacity: 90%;\n }\n }\n }\n .hover\\:shadow-lg {\n &:hover {\n @media (hover: hover) {\n --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow:\n var(--tw-inset-shadow),\n var(--tw-inset-ring-shadow),\n var(--tw-ring-offset-shadow),\n var(--tw-ring-shadow),\n var(--tw-shadow);\n }\n }\n }\n .hover\\:shadow-md {\n &:hover {\n @media (hover: hover) {\n --tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow:\n var(--tw-inset-shadow),\n var(--tw-inset-ring-shadow),\n var(--tw-ring-offset-shadow),\n var(--tw-ring-shadow),\n var(--tw-shadow);\n }\n }\n }\n .hover\\:shadow-xl {\n &:hover {\n @media (hover: hover) {\n --tw-shadow: 0 20px 25px -5px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 8px 10px -6px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow:\n var(--tw-inset-shadow),\n var(--tw-inset-ring-shadow),\n var(--tw-ring-offset-shadow),\n var(--tw-ring-shadow),\n var(--tw-shadow);\n }\n }\n }\n .hover\\:shadow-slate-200\\/80 {\n &:hover {\n @media (hover: hover) {\n --tw-shadow-color: color-mix(in srgb, oklch(92.9% 0.013 255.508) 80%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-shadow-color: color-mix(in oklab, color-mix(in oklab, var(--color-slate-200) 80%, transparent) var(--tw-shadow-alpha), transparent);\n }\n }\n }\n }\n .focus\\:border-emerald-500 {\n &:focus {\n border-color: var(--color-emerald-500);\n }\n }\n .active\\:scale-95 {\n &:active {\n --tw-scale-x: 95%;\n --tw-scale-y: 95%;\n --tw-scale-z: 95%;\n scale: var(--tw-scale-x) var(--tw-scale-y);\n }\n }\n .active\\:scale-\\[0\\.98\\] {\n &:active {\n scale: 0.98;\n }\n }\n .disabled\\:cursor-not-allowed {\n &:disabled {\n cursor: not-allowed;\n }\n }\n .disabled\\:opacity-30 {\n &:disabled {\n opacity: 30%;\n }\n }\n .disabled\\:opacity-50 {\n &:disabled {\n opacity: 50%;\n }\n }\n .disabled\\:hover\\:scale-100 {\n &:disabled {\n &:hover {\n @media (hover: hover) {\n --tw-scale-x: 100%;\n --tw-scale-y: 100%;\n --tw-scale-z: 100%;\n scale: var(--tw-scale-x) var(--tw-scale-y);\n }\n }\n }\n }\n .disabled\\:active\\:scale-100 {\n &:disabled {\n &:active {\n --tw-scale-x: 100%;\n --tw-scale-y: 100%;\n --tw-scale-z: 100%;\n scale: var(--tw-scale-x) var(--tw-scale-y);\n }\n }\n }\n .sm\\:grid-cols-2 {\n @media (width >= 40rem) {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n }\n .sm\\:grid-cols-3 {\n @media (width >= 40rem) {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n }\n }\n .sm\\:flex-nowrap {\n @media (width >= 40rem) {\n flex-wrap: nowrap;\n }\n }\n .md\\:text-4xl {\n @media (width >= 48rem) {\n font-size: var(--text-4xl);\n line-height: var(--tw-leading, var(--text-4xl--line-height));\n }\n }\n .md\\:text-6xl {\n @media (width >= 48rem) {\n font-size: var(--text-6xl);\n line-height: var(--tw-leading, var(--text-6xl--line-height));\n }\n }\n .md\\:text-xl {\n @media (width >= 48rem) {\n font-size: var(--text-xl);\n line-height: var(--tw-leading, var(--text-xl--line-height));\n }\n }\n .md\\:opacity-0 {\n @media (width >= 48rem) {\n opacity: 0%;\n }\n }\n .md\\:group-hover\\/carousel\\:opacity-100 {\n @media (width >= 48rem) {\n &:is(:where(.group\\/carousel):hover *) {\n @media (hover: hover) {\n opacity: 100%;\n }\n }\n }\n }\n .lg\\:sticky {\n @media (width >= 64rem) {\n position: sticky;\n }\n }\n .lg\\:top-6 {\n @media (width >= 64rem) {\n top: calc(var(--spacing) * 6);\n }\n }\n .lg\\:h-\\[calc\\(100vh-6rem\\)\\] {\n @media (width >= 64rem) {\n height: calc(100vh - 6rem);\n }\n }\n .lg\\:min-h-\\[520px\\] {\n @media (width >= 64rem) {\n min-height: 520px;\n }\n }\n .lg\\:grid-cols-2 {\n @media (width >= 64rem) {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n }\n .lg\\:grid-cols-4 {\n @media (width >= 64rem) {\n grid-template-columns: repeat(4, minmax(0, 1fr));\n }\n }\n .lg\\:grid-cols-\\[270px_1fr\\] {\n @media (width >= 64rem) {\n grid-template-columns: 270px 1fr;\n }\n }\n .xl\\:gap-16 {\n @media (width >= 80rem) {\n gap: calc(var(--spacing) * 16);\n }\n }\n .xl\\:text-7xl {\n @media (width >= 80rem) {\n font-size: var(--text-7xl);\n line-height: var(--tw-leading, var(--text-7xl--line-height));\n }\n }\n .dark\\:scrollbar-thumb-white\\/10 {\n @media (prefers-color-scheme: dark) {\n --tw-scrollbar-thumb: color-mix(in srgb, #fff 10%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-scrollbar-thumb: color-mix(in oklab, var(--color-white) 10%, transparent);\n }\n scrollbar-color: var(--tw-scrollbar-thumb) var(--tw-scrollbar-track);\n }\n }\n .dark\\:divide-white\\/5 {\n @media (prefers-color-scheme: dark) {\n :where(& > :not(:last-child)) {\n border-color: color-mix(in srgb, #fff 5%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--color-white) 5%, transparent);\n }\n }\n }\n }\n .dark\\:border-amber-400\\/20 {\n @media (prefers-color-scheme: dark) {\n border-color: color-mix(in srgb, oklch(82.8% 0.189 84.429) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--color-amber-400) 20%, transparent);\n }\n }\n }\n .dark\\:border-amber-500\\/20 {\n @media (prefers-color-scheme: dark) {\n border-color: color-mix(in srgb, oklch(76.9% 0.188 70.08) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--color-amber-500) 20%, transparent);\n }\n }\n }\n .dark\\:border-emerald-400\\/20 {\n @media (prefers-color-scheme: dark) {\n border-color: color-mix(in srgb, oklch(76.5% 0.177 163.223) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--color-emerald-400) 20%, transparent);\n }\n }\n }\n .dark\\:border-emerald-500\\/20 {\n @media (prefers-color-scheme: dark) {\n border-color: color-mix(in srgb, oklch(69.6% 0.17 162.48) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--color-emerald-500) 20%, transparent);\n }\n }\n }\n .dark\\:border-emerald-500\\/25 {\n @media (prefers-color-scheme: dark) {\n border-color: color-mix(in srgb, oklch(69.6% 0.17 162.48) 25%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--color-emerald-500) 25%, transparent);\n }\n }\n }\n .dark\\:border-indigo-500\\/20 {\n @media (prefers-color-scheme: dark) {\n border-color: color-mix(in srgb, oklch(58.5% 0.233 277.117) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--color-indigo-500) 20%, transparent);\n }\n }\n }\n .dark\\:border-red-500\\/20 {\n @media (prefers-color-scheme: dark) {\n border-color: color-mix(in srgb, oklch(63.7% 0.237 25.331) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--color-red-500) 20%, transparent);\n }\n }\n }\n .dark\\:border-rose-400\\/20 {\n @media (prefers-color-scheme: dark) {\n border-color: color-mix(in srgb, oklch(71.2% 0.194 13.428) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--color-rose-400) 20%, transparent);\n }\n }\n }\n .dark\\:border-rose-500\\/20 {\n @media (prefers-color-scheme: dark) {\n border-color: color-mix(in srgb, oklch(64.5% 0.246 16.439) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--color-rose-500) 20%, transparent);\n }\n }\n }\n .dark\\:border-rose-500\\/25 {\n @media (prefers-color-scheme: dark) {\n border-color: color-mix(in srgb, oklch(64.5% 0.246 16.439) 25%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--color-rose-500) 25%, transparent);\n }\n }\n }\n .dark\\:border-white\\/5 {\n @media (prefers-color-scheme: dark) {\n border-color: color-mix(in srgb, #fff 5%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--color-white) 5%, transparent);\n }\n }\n }\n .dark\\:border-white\\/8 {\n @media (prefers-color-scheme: dark) {\n border-color: color-mix(in srgb, #fff 8%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--color-white) 8%, transparent);\n }\n }\n }\n .dark\\:border-white\\/10 {\n @media (prefers-color-scheme: dark) {\n border-color: color-mix(in srgb, #fff 10%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--color-white) 10%, transparent);\n }\n }\n }\n .dark\\:border-white\\/20 {\n @media (prefers-color-scheme: dark) {\n border-color: color-mix(in srgb, #fff 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--color-white) 20%, transparent);\n }\n }\n }\n .dark\\:bg-\\[\\#0f0f1a\\] {\n @media (prefers-color-scheme: dark) {\n background-color: #0f0f1a;\n }\n }\n .dark\\:bg-\\[\\#0f0f1a\\]\\/90 {\n @media (prefers-color-scheme: dark) {\n background-color: color-mix(in oklab, #0f0f1a 90%, transparent);\n }\n }\n .dark\\:bg-\\[\\#080811\\] {\n @media (prefers-color-scheme: dark) {\n background-color: #080811;\n }\n }\n .dark\\:bg-\\[\\#080811\\]\\/80 {\n @media (prefers-color-scheme: dark) {\n background-color: color-mix(in oklab, #080811 80%, transparent);\n }\n }\n .dark\\:bg-amber-400\\/10 {\n @media (prefers-color-scheme: dark) {\n background-color: color-mix(in srgb, oklch(82.8% 0.189 84.429) 10%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-amber-400) 10%, transparent);\n }\n }\n }\n .dark\\:bg-amber-500\\/10 {\n @media (prefers-color-scheme: dark) {\n background-color: color-mix(in srgb, oklch(76.9% 0.188 70.08) 10%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-amber-500) 10%, transparent);\n }\n }\n }\n .dark\\:bg-black\\/30 {\n @media (prefers-color-scheme: dark) {\n background-color: color-mix(in srgb, #000 30%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-black) 30%, transparent);\n }\n }\n }\n .dark\\:bg-black\\/60 {\n @media (prefers-color-scheme: dark) {\n background-color: color-mix(in srgb, #000 60%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-black) 60%, transparent);\n }\n }\n }\n .dark\\:bg-emerald-400 {\n @media (prefers-color-scheme: dark) {\n background-color: var(--color-emerald-400);\n }\n }\n .dark\\:bg-emerald-400\\/10 {\n @media (prefers-color-scheme: dark) {\n background-color: color-mix(in srgb, oklch(76.5% 0.177 163.223) 10%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-emerald-400) 10%, transparent);\n }\n }\n }\n .dark\\:bg-emerald-500\\/5 {\n @media (prefers-color-scheme: dark) {\n background-color: color-mix(in srgb, oklch(69.6% 0.17 162.48) 5%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-emerald-500) 5%, transparent);\n }\n }\n }\n .dark\\:bg-emerald-500\\/10 {\n @media (prefers-color-scheme: dark) {\n background-color: color-mix(in srgb, oklch(69.6% 0.17 162.48) 10%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-emerald-500) 10%, transparent);\n }\n }\n }\n .dark\\:bg-indigo-400 {\n @media (prefers-color-scheme: dark) {\n background-color: var(--color-indigo-400);\n }\n }\n .dark\\:bg-indigo-500\\/10 {\n @media (prefers-color-scheme: dark) {\n background-color: color-mix(in srgb, oklch(58.5% 0.233 277.117) 10%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-indigo-500) 10%, transparent);\n }\n }\n }\n .dark\\:bg-red-500\\/10 {\n @media (prefers-color-scheme: dark) {\n background-color: color-mix(in srgb, oklch(63.7% 0.237 25.331) 10%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-red-500) 10%, transparent);\n }\n }\n }\n .dark\\:bg-rose-400\\/10 {\n @media (prefers-color-scheme: dark) {\n background-color: color-mix(in srgb, oklch(71.2% 0.194 13.428) 10%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-rose-400) 10%, transparent);\n }\n }\n }\n .dark\\:bg-rose-500\\/10 {\n @media (prefers-color-scheme: dark) {\n background-color: color-mix(in srgb, oklch(64.5% 0.246 16.439) 10%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-rose-500) 10%, transparent);\n }\n }\n }\n .dark\\:bg-slate-700 {\n @media (prefers-color-scheme: dark) {\n background-color: var(--color-slate-700);\n }\n }\n .dark\\:bg-slate-800 {\n @media (prefers-color-scheme: dark) {\n background-color: var(--color-slate-800);\n }\n }\n .dark\\:bg-slate-900 {\n @media (prefers-color-scheme: dark) {\n background-color: var(--color-slate-900);\n }\n }\n .dark\\:bg-slate-900\\/50 {\n @media (prefers-color-scheme: dark) {\n background-color: color-mix(in srgb, oklch(20.8% 0.042 265.755) 50%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-slate-900) 50%, transparent);\n }\n }\n }\n .dark\\:bg-slate-900\\/60 {\n @media (prefers-color-scheme: dark) {\n background-color: color-mix(in srgb, oklch(20.8% 0.042 265.755) 60%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-slate-900) 60%, transparent);\n }\n }\n }\n .dark\\:bg-slate-900\\/80 {\n @media (prefers-color-scheme: dark) {\n background-color: color-mix(in srgb, oklch(20.8% 0.042 265.755) 80%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-slate-900) 80%, transparent);\n }\n }\n }\n .dark\\:bg-slate-950 {\n @media (prefers-color-scheme: dark) {\n background-color: var(--color-slate-950);\n }\n }\n .dark\\:bg-transparent {\n @media (prefers-color-scheme: dark) {\n background-color: transparent;\n }\n }\n .dark\\:bg-white\\/3 {\n @media (prefers-color-scheme: dark) {\n background-color: color-mix(in srgb, #fff 3%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-white) 3%, transparent);\n }\n }\n }\n .dark\\:bg-white\\/5 {\n @media (prefers-color-scheme: dark) {\n background-color: color-mix(in srgb, #fff 5%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-white) 5%, transparent);\n }\n }\n }\n .dark\\:bg-white\\/8 {\n @media (prefers-color-scheme: dark) {\n background-color: color-mix(in srgb, #fff 8%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-white) 8%, transparent);\n }\n }\n }\n .dark\\:bg-white\\/10 {\n @media (prefers-color-scheme: dark) {\n background-color: color-mix(in srgb, #fff 10%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-white) 10%, transparent);\n }\n }\n }\n .dark\\:bg-white\\/60 {\n @media (prefers-color-scheme: dark) {\n background-color: color-mix(in srgb, #fff 60%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-white) 60%, transparent);\n }\n }\n }\n .dark\\:from-white\\/10 {\n @media (prefers-color-scheme: dark) {\n --tw-gradient-from: color-mix(in srgb, #fff 10%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-gradient-from: color-mix(in oklab, var(--color-white) 10%, transparent);\n }\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n }\n }\n .dark\\:to-white\\/5 {\n @media (prefers-color-scheme: dark) {\n --tw-gradient-to: color-mix(in srgb, #fff 5%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-gradient-to: color-mix(in oklab, var(--color-white) 5%, transparent);\n }\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n }\n }\n .dark\\:text-amber-400 {\n @media (prefers-color-scheme: dark) {\n color: var(--color-amber-400);\n }\n }\n .dark\\:text-emerald-300 {\n @media (prefers-color-scheme: dark) {\n color: var(--color-emerald-300);\n }\n }\n .dark\\:text-emerald-400 {\n @media (prefers-color-scheme: dark) {\n color: var(--color-emerald-400);\n }\n }\n .dark\\:text-emerald-500\\/50 {\n @media (prefers-color-scheme: dark) {\n color: color-mix(in srgb, oklch(69.6% 0.17 162.48) 50%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--color-emerald-500) 50%, transparent);\n }\n }\n }\n .dark\\:text-indigo-400 {\n @media (prefers-color-scheme: dark) {\n color: var(--color-indigo-400);\n }\n }\n .dark\\:text-indigo-400\\/70 {\n @media (prefers-color-scheme: dark) {\n color: color-mix(in srgb, oklch(67.3% 0.182 276.935) 70%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--color-indigo-400) 70%, transparent);\n }\n }\n }\n .dark\\:text-red-400 {\n @media (prefers-color-scheme: dark) {\n color: var(--color-red-400);\n }\n }\n .dark\\:text-rose-400 {\n @media (prefers-color-scheme: dark) {\n color: var(--color-rose-400);\n }\n }\n .dark\\:text-slate-300 {\n @media (prefers-color-scheme: dark) {\n color: var(--color-slate-300);\n }\n }\n .dark\\:text-slate-400 {\n @media (prefers-color-scheme: dark) {\n color: var(--color-slate-400);\n }\n }\n .dark\\:text-white {\n @media (prefers-color-scheme: dark) {\n color: var(--color-white);\n }\n }\n .dark\\:text-white\\/20 {\n @media (prefers-color-scheme: dark) {\n color: color-mix(in srgb, #fff 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--color-white) 20%, transparent);\n }\n }\n }\n .dark\\:text-white\\/30 {\n @media (prefers-color-scheme: dark) {\n color: color-mix(in srgb, #fff 30%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--color-white) 30%, transparent);\n }\n }\n }\n .dark\\:text-white\\/40 {\n @media (prefers-color-scheme: dark) {\n color: color-mix(in srgb, #fff 40%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--color-white) 40%, transparent);\n }\n }\n }\n .dark\\:text-white\\/50 {\n @media (prefers-color-scheme: dark) {\n color: color-mix(in srgb, #fff 50%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--color-white) 50%, transparent);\n }\n }\n }\n .dark\\:text-white\\/60 {\n @media (prefers-color-scheme: dark) {\n color: color-mix(in srgb, #fff 60%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--color-white) 60%, transparent);\n }\n }\n }\n .dark\\:text-white\\/70 {\n @media (prefers-color-scheme: dark) {\n color: color-mix(in srgb, #fff 70%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--color-white) 70%, transparent);\n }\n }\n }\n .dark\\:text-white\\/75 {\n @media (prefers-color-scheme: dark) {\n color: color-mix(in srgb, #fff 75%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--color-white) 75%, transparent);\n }\n }\n }\n .dark\\:text-white\\/80 {\n @media (prefers-color-scheme: dark) {\n color: color-mix(in srgb, #fff 80%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--color-white) 80%, transparent);\n }\n }\n }\n .dark\\:text-white\\/90 {\n @media (prefers-color-scheme: dark) {\n color: color-mix(in srgb, #fff 90%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--color-white) 90%, transparent);\n }\n }\n }\n .dark\\:placeholder-white\\/30 {\n @media (prefers-color-scheme: dark) {\n &::placeholder {\n color: color-mix(in srgb, #fff 30%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--color-white) 30%, transparent);\n }\n }\n }\n }\n .dark\\:ring-white\\/10 {\n @media (prefers-color-scheme: dark) {\n --tw-ring-color: color-mix(in srgb, #fff 10%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--color-white) 10%, transparent);\n }\n }\n }\n .dark\\:group-hover\\:border-white\\/50 {\n @media (prefers-color-scheme: dark) {\n &:is(:where(.group):hover *) {\n @media (hover: hover) {\n border-color: color-mix(in srgb, #fff 50%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--color-white) 50%, transparent);\n }\n }\n }\n }\n }\n .dark\\:focus-within\\:border-white\\/20 {\n @media (prefers-color-scheme: dark) {\n &:focus-within {\n border-color: color-mix(in srgb, #fff 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--color-white) 20%, transparent);\n }\n }\n }\n }\n .dark\\:hover\\:border-emerald-500\\/20 {\n @media (prefers-color-scheme: dark) {\n &:hover {\n @media (hover: hover) {\n border-color: color-mix(in srgb, oklch(69.6% 0.17 162.48) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--color-emerald-500) 20%, transparent);\n }\n }\n }\n }\n }\n .dark\\:hover\\:border-rose-500\\/20 {\n @media (prefers-color-scheme: dark) {\n &:hover {\n @media (hover: hover) {\n border-color: color-mix(in srgb, oklch(64.5% 0.246 16.439) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--color-rose-500) 20%, transparent);\n }\n }\n }\n }\n }\n .dark\\:hover\\:border-white\\/15 {\n @media (prefers-color-scheme: dark) {\n &:hover {\n @media (hover: hover) {\n border-color: color-mix(in srgb, #fff 15%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--color-white) 15%, transparent);\n }\n }\n }\n }\n }\n .dark\\:hover\\:border-white\\/20 {\n @media (prefers-color-scheme: dark) {\n &:hover {\n @media (hover: hover) {\n border-color: color-mix(in srgb, #fff 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--color-white) 20%, transparent);\n }\n }\n }\n }\n }\n .dark\\:hover\\:bg-emerald-500\\/10 {\n @media (prefers-color-scheme: dark) {\n &:hover {\n @media (hover: hover) {\n background-color: color-mix(in srgb, oklch(69.6% 0.17 162.48) 10%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-emerald-500) 10%, transparent);\n }\n }\n }\n }\n }\n .dark\\:hover\\:bg-rose-500\\/10 {\n @media (prefers-color-scheme: dark) {\n &:hover {\n @media (hover: hover) {\n background-color: color-mix(in srgb, oklch(64.5% 0.246 16.439) 10%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-rose-500) 10%, transparent);\n }\n }\n }\n }\n }\n .dark\\:hover\\:bg-white\\/5 {\n @media (prefers-color-scheme: dark) {\n &:hover {\n @media (hover: hover) {\n background-color: color-mix(in srgb, #fff 5%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-white) 5%, transparent);\n }\n }\n }\n }\n }\n .dark\\:hover\\:bg-white\\/10 {\n @media (prefers-color-scheme: dark) {\n &:hover {\n @media (hover: hover) {\n background-color: color-mix(in srgb, #fff 10%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-white) 10%, transparent);\n }\n }\n }\n }\n }\n .dark\\:hover\\:bg-white\\/20 {\n @media (prefers-color-scheme: dark) {\n &:hover {\n @media (hover: hover) {\n background-color: color-mix(in srgb, #fff 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-white) 20%, transparent);\n }\n }\n }\n }\n }\n .dark\\:hover\\:text-\\[\\#CB3837\\] {\n @media (prefers-color-scheme: dark) {\n &:hover {\n @media (hover: hover) {\n color: #CB3837;\n }\n }\n }\n }\n .dark\\:hover\\:text-blue-400 {\n @media (prefers-color-scheme: dark) {\n &:hover {\n @media (hover: hover) {\n color: var(--color-blue-400);\n }\n }\n }\n }\n .dark\\:hover\\:text-emerald-400 {\n @media (prefers-color-scheme: dark) {\n &:hover {\n @media (hover: hover) {\n color: var(--color-emerald-400);\n }\n }\n }\n }\n .dark\\:hover\\:text-indigo-300 {\n @media (prefers-color-scheme: dark) {\n &:hover {\n @media (hover: hover) {\n color: var(--color-indigo-300);\n }\n }\n }\n }\n .dark\\:hover\\:text-indigo-400 {\n @media (prefers-color-scheme: dark) {\n &:hover {\n @media (hover: hover) {\n color: var(--color-indigo-400);\n }\n }\n }\n }\n .dark\\:hover\\:text-rose-400 {\n @media (prefers-color-scheme: dark) {\n &:hover {\n @media (hover: hover) {\n color: var(--color-rose-400);\n }\n }\n }\n }\n .dark\\:hover\\:text-white\\/60 {\n @media (prefers-color-scheme: dark) {\n &:hover {\n @media (hover: hover) {\n color: color-mix(in srgb, #fff 60%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--color-white) 60%, transparent);\n }\n }\n }\n }\n }\n .dark\\:hover\\:text-white\\/70 {\n @media (prefers-color-scheme: dark) {\n &:hover {\n @media (hover: hover) {\n color: color-mix(in srgb, #fff 70%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--color-white) 70%, transparent);\n }\n }\n }\n }\n }\n .dark\\:hover\\:text-white\\/80 {\n @media (prefers-color-scheme: dark) {\n &:hover {\n @media (hover: hover) {\n color: color-mix(in srgb, #fff 80%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--color-white) 80%, transparent);\n }\n }\n }\n }\n }\n .dark\\:hover\\:text-white\\/90 {\n @media (prefers-color-scheme: dark) {\n &:hover {\n @media (hover: hover) {\n color: color-mix(in srgb, #fff 90%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--color-white) 90%, transparent);\n }\n }\n }\n }\n }\n}\n@layer base {\n :root {\n --star: shape(evenodd from 50% 24.787%, curve by 7.143% 18.016% with 0% 0% / 2.9725% 13.814%, curve by 17.882% 7.197% with 4.171% 4.2025% / 17.882% 7.197%, curve by -17.882% 8.6765% with 0% 0% / -13.711% 4.474%, curve by -7.143% 16.5365% with -4.1705% 4.202% / -7.143% 16.5365%, curve by -8.6115% -16.5365% with 0% 0% / -4.441% -12.3345%, curve by -16.4135% -8.6765% with -4.171% -4.2025% / -16.4135% -8.6765%, curve by 16.4135% -7.197% with 0% 0% / 12.2425% -2.9945%, curve by 8.6115% -18.016% with 4.1705% -4.202% / 8.6115% -18.016%, close);\n --flower: shape(evenodd from 17.9665% 82.0335%, curve by -12.349% -32.0335% with -13.239% -5.129% / -18.021% -15.402%, curve by -0.0275% -22.203% with -3.1825% -9.331% / -3.074% -16.6605%, curve by 12.3765% -9.8305% with 2.3835% -4.3365% / 6.565% -7.579%, curve by 32.0335% -12.349% with 5.129% -13.239% / 15.402% -18.021%, curve by 20.4535% -0.8665% with 8.3805% -2.858% / 15.1465% -3.062%, curve by 11.58% 13.2155% with 5.225% 2.161% / 9.0355% 6.6475%, curve by 12.349% 32.0335% with 13.239% 5.129% / 18.021% 15.402%, curve by 0.5715% 21.1275% with 2.9805% 8.7395% / 3.0745% 15.723%, curve by -12.9205% 10.906% with -2.26% 4.88% / -6.638% 8.472%, curve by -32.0335% 12.349% with -5.129% 13.239% / -15.402% 18.021%, curve by -21.1215% 0.5745% with -8.736% 2.9795% / -15.718% 3.0745%, curve by -10.912% -12.9235% with -4.883% -2.2595% / -8.477% -6.6385%, close);\n --hexagon: shape(evenodd from 6.47% 67.001%, curve by 0% -34.002% with -1.1735% -7.7% / -1.1735% -26.302%, curve by 7.0415% -12.1965% with 0.7075% -4.641% / 3.3765% -9.2635%, curve by 29.447% -17.001% with 6.0815% -4.8665% / 22.192% -14.1675%, curve by 14.083% 0% with 4.3725% -1.708% / 9.7105% -1.708%, curve by 29.447% 17.001% with 7.255% 2.8335% / 23.3655% 12.1345%, curve by 7.0415% 12.1965% with 3.665% 2.933% / 6.334% 7.5555%, curve by 0% 34.002% with 1.1735% 7.7% / 1.1735% 26.302%, curve by -7.0415% 12.1965% with -0.7075% 4.641% / -3.3765% 9.2635%, curve by -29.447% 17.001% with -6.0815% 4.8665% / -22.192% 14.1675%, curve by -14.083% 0% with -4.3725% 1.708% / -9.7105% 1.708%, curve by -29.447% -17.001% with -7.255% -2.8335% / -23.3655% -12.1345%, curve by -7.0415% -12.1965% with -3.665% -2.933% / -6.334% -7.5555%, close);\n --cylinder: shape(evenodd from 10.5845% 59.7305%, curve by 0% -19.461% with -0.113% -1.7525% / -0.11% -18.14%, curve by 10.098% -26.213% with 0.837% -10.0375% / 3.821% -19.2625%, curve by 29.3175% -13.0215% with 7.2175% -7.992% / 17.682% -13.0215%, curve by 19.5845% 5.185% with 7.1265% 0% / 13.8135% 1.887%, curve by 9.8595% 7.9775% with 3.7065% 2.1185% / 7.035% 4.8195%, curve by 9.9715% 26.072% with 6.2015% 6.933% / 9.4345% 16.082%, curve by 0% 19.461% with 0.074% 1.384% / 0.0745% 17.7715%, curve by -13.0065% 29.1155% with -0.511% 11.5345% / -5.021% 21.933%, curve by -26.409% 10.119% with -6.991% 6.288% / -16.254% 10.119%, curve by -20.945% -5.9995% with -7.6935% 0% / -14.8755% -2.199%, curve by -8.713% -7.404% with -3.255% -2.0385% / -6.1905% -4.537%, curve by -9.7575% -25.831% with -6.074% -6.9035% / -9.1205% -15.963%, close);\n --circle: shape(evenodd from 13.482% 79.505%, curve by -7.1945% -12.47% with -1.4985% -1.8575% / -6.328% -10.225%, curve by 0.0985% -33.8965% with -4.1645% -10.7945% / -4.1685% -23.0235%, curve by 6.9955% -12.101% with 1.72% -4.3825% / 4.0845% -8.458%, curve by 30.125% -17.119% with 7.339% -9.1825% / 18.4775% -15.5135%, curve by 13.4165% 0.095% with 4.432% -0.6105% / 8.9505% -0.5855%, curve by 29.364% 16.9% with 11.6215% 1.77% / 22.102% 7.9015%, curve by 7.176% 12.4145% with 3.002% 3.7195% / 5.453% 7.968%, curve by -0.0475% 33.8925% with 4.168% 10.756% / 4.2305% 22.942%, curve by -7.1135% 12.2825% with -1.74% 4.4535% / -4.1455% 8.592%, curve by -29.404% 16.9075% with -7.202% 8.954% / -18.019% 15.137%, curve by -14.19% -0.018% with -4.6635% 0.7255% / -9.4575% 0.7205%, curve by -29.226% -16.8875% with -11.573% -1.8065% / -21.9955% -7.9235%, close);\n --heart: shape(evenodd from 51.311% 83.603%, curve by -8.333% -20.508% with -14.104% -4.287% / -16.406% -16.185%, curve by -4.271% -37.41% with -5.419% -9.658% / -6.815% -22.733%, curve by 13.589% -33.586% with 3.982% -7.448% / 8.411% -15.994%, curve by 28.187% -21.985% with 4.029% -4.29% / 4.029% -4.29%, curve by 33.835% 0.721% with 9.618% 4.647% / 22.541% 9.618%, curve by 37.596% 21.304% with 3.306% 13.266% / 7.589% 24.251%, curve by 21.985% 43.613% with -4.208% 3.982% / -15.994% 8.411%, curve by 0.721% 37.596% with -7.448% 4.029% / -15.994% 8.411%, curve by -16.185% 28.187% with -9.658% 5.419% / -22.733% 6.815%, curve by -37.41% 4.271% with -4.29% 4.029% / -4.29% 4.029%, curve by -33.586% -13.589% with -7.448% 3.982% / -15.994% 8.411%, curve by -28.187% -32.094% with -4.029% 4.029% / -4.029% 4.029%, close);\n --spiral: shape(evenodd from 13.347% 30.885%, curve by 5.502% 18.447% with 11.052% 5.562% / 19.995% 9.169%, curve by -20.309% 16.907% with -7.146% -1.332% / -9.016% -2.812%, curve by -25.848% -13.087% with -7.017% -7.46% / -9.941% -15.041%, curve by 10.154% -25.731% with 2.473% -6.063% / 7.163% -10.656%, curve by 31.473% -7.963% with 8.814% 2.403% / 13.84% 8.748%, curve by 16.526% 20.487% with -4.058% 1.502% / -9.51% 3.304%, curve by 5.502% 18.447% with 11.052% 5.562% / 19.995% 9.169%, close);\n --sun: shape(evenodd from 12.758% 22.039%, curve by 2.2585% 27.561% with 4.517% 18.961% / 2.2585% 27.561%, curve by 3.187% -11.541% with 2.2585% -8.483% / 4.7615% -12.541%, curve by 31.034% 31.034% with 31.034% 31.034% / 31.034% 31.034%, curve by 33.825% -14.163% with 8.961% -7.455% / 13.585% -11.059%, curve by 19.814% -34.731% with 4.7615% -12.541% / 2.2585% -27.561%, curve by 33.825% -14.163% with 2.2585% -8.483% / 4.517% -18.961%, curve by 19.814% -34.731% with 0% 0% / -3.187% 11.541%, curve by 33.825% -14.163% with 8.961% -7.455% / 13.585% -11.059%, curve by 31.034% 31.034% with 31.034% 31.034% / 31.034% 31.034%, curve by 19.814% -34.731% with 4.7615% -12.541% / 2.2585% -27.561%, curve by 33.825% -14.163% with 2.2585% -8.483% / 4.517% -18.961%, close);\n --star2: shape(open from 28.947% 47.744%, curve by 24.042% -2.139% with 0% 0% / -24.042% 2.139%, curve by 4.208% -25.165% with 4.208% -25.165% / 4.208% -25.165%, curve by 2.341% -18.447% with 0% 0% / 1.888% -1.438%, curve by 32.355% 1.085% with 0% 0% / 25.984% 1.085%, curve by -4.655% 25.165% with 0% 0% / -4.655% 25.165%, curve by -4.208% -25.165% with -4.208% -25.165% / -4.208% -25.165%, curve by 2.566% -4.208% with 0% 0% / 2.072% -1.639%, curve by 30.069% 1.085% with 0% 0% / 24.156% 1.085%, curve by -2.791% 25.165% with 0% 0% / -2.791% 25.165%, curve by -4.208% -25.165% with -4.208% -25.165% / -4.208% -25.165%, curve by 2.116% -4.208% with 0% 0% / 1.659% -1.557%, close);\n --tri-star: shape(open from 25% 25%, curve by 25% 25% with 0% 0% / 25% 25%, close);\n }\n}\n@property --tw-translate-x { syntax: "*"; inherits: false; initial-value: 0; }\n@property --tw-translate-y { syntax: "*"; inherits: false; initial-value: 0; }\n@property --tw-translate-z { syntax: "*"; inherits: false; initial-value: 0; }\n@property --tw-scale-x { syntax: "*"; inherits: false; initial-value: 1; }\n@property --tw-scale-y { syntax: "*"; inherits: false; initial-value: 1; }\n@property --tw-scale-z { syntax: "*"; inherits: false; initial-value: 1; }\n@property --tw-rotate-x { syntax: "*"; inherits: false; }\n@property --tw-rotate-y { syntax: "*"; inherits: false; }\n@property --tw-rotate-z { syntax: "*"; inherits: false; }\n@property --tw-skew-x { syntax: "*"; inherits: false; }\n@property --tw-skew-y { syntax: "*"; inherits: false; }\n@property --tw-scroll-snap-strictness { syntax: "*"; inherits: false; initial-value: proximity; }\n@property --tw-scrollbar-thumb { syntax: "<color>"; inherits: false; initial-value: #0000; }\n@property --tw-scrollbar-track { syntax: "<color>"; inherits: false; initial-value: #0000; }\n@property --tw-space-y-reverse { syntax: "*"; inherits: false; initial-value: 0; }\n@property --tw-divide-y-reverse { syntax: "*"; inherits: false; initial-value: 0; }\n@property --tw-border-style { syntax: "*"; inherits: false; initial-value: solid; }\n@property --tw-gradient-position { syntax: "*"; inherits: false; }\n@property --tw-gradient-from { syntax: "<color>"; inherits: false; initial-value: #0000; }\n@property --tw-gradient-via { syntax: "<color>"; inherits: false; initial-value: #0000; }\n@property --tw-gradient-to { syntax: "<color>"; inherits: false; initial-value: #0000; }\n@property --tw-gradient-stops { syntax: "*"; inherits: false; }\n@property --tw-gradient-via-stops { syntax: "*"; inherits: false; }\n@property --tw-gradient-from-position { syntax: "<length-percentage>"; inherits: false; initial-value: 0%; }\n@property --tw-gradient-via-position { syntax: "<length-percentage>"; inherits: false; initial-value: 50%; }\n@property --tw-gradient-to-position { syntax: "<length-percentage>"; inherits: false; initial-value: 100%; }\n@property --tw-leading { syntax: "*"; inherits: false; }\n@property --tw-font-weight { syntax: "*"; inherits: false; }\n@property --tw-tracking { syntax: "*"; inherits: false; }\n@property --tw-ordinal { syntax: "*"; inherits: false; }\n@property --tw-slashed-zero { syntax: "*"; inherits: false; }\n@property --tw-numeric-figure { syntax: "*"; inherits: false; }\n@property --tw-numeric-spacing { syntax: "*"; inherits: false; }\n@property --tw-numeric-fraction { syntax: "*"; inherits: false; }\n@property --tw-shadow { syntax: "*"; inherits: false; initial-value: 0 0 #0000; }\n@property --tw-shadow-color { syntax: "*"; inherits: false; }\n@property --tw-shadow-alpha { syntax: "<percentage>"; inherits: false; initial-value: 100%; }\n@property --tw-inset-shadow { syntax: "*"; inherits: false; initial-value: 0 0 #0000; }\n@property --tw-inset-shadow-color { syntax: "*"; inherits: false; }\n@property --tw-inset-shadow-alpha { syntax: "<percentage>"; inherits: false; initial-value: 100%; }\n@property --tw-ring-color { syntax: "*"; inherits: false; }\n@property --tw-ring-shadow { syntax: "*"; inherits: false; initial-value: 0 0 #0000; }\n@property --tw-inset-ring-color { syntax: "*"; inherits: false; }\n@property --tw-inset-ring-shadow { syntax: "*"; inherits: false; initial-value: 0 0 #0000; }\n@property --tw-ring-inset { syntax: "*"; inherits: false; }\n@property --tw-ring-offset-width { syntax: "<length>"; inherits: false; initial-value: 0px; }\n@property --tw-ring-offset-color { syntax: "*"; inherits: false; initial-value: #fff; }\n@property --tw-ring-offset-shadow { syntax: "*"; inherits: false; initial-value: 0 0 #0000; }\n@property --tw-blur { syntax: "*"; inherits: false; }\n@property --tw-brightness { syntax: "*"; inherits: false; }\n@property --tw-contrast { syntax: "*"; inherits: false; }\n@property --tw-grayscale { syntax: "*"; inherits: false; }\n@property --tw-hue-rotate { syntax: "*"; inherits: false; }\n@property --tw-invert { syntax: "*"; inherits: false; }\n@property --tw-opacity { syntax: "*"; inherits: false; }\n@property --tw-saturate { syntax: "*"; inherits: false; }\n@property --tw-sepia { syntax: "*"; inherits: false; }\n@property --tw-drop-shadow { syntax: "*"; inherits: false; }\n@property --tw-drop-shadow-color { syntax: "*"; inherits: false; }\n@property --tw-drop-shadow-alpha { syntax: "<percentage>"; inherits: false; initial-value: 100%; }\n@property --tw-drop-shadow-size { syntax: "*"; inherits: false; }\n@property --tw-backdrop-blur { syntax: "*"; inherits: false; }\n@property --tw-backdrop-brightness { syntax: "*"; inherits: false; }\n@property --tw-backdrop-contrast { syntax: "*"; inherits: false; }\n@property --tw-backdrop-grayscale { syntax: "*"; inherits: false; }\n@property --tw-backdrop-hue-rotate { syntax: "*"; inherits: false; }\n@property --tw-backdrop-invert { syntax: "*"; inherits: false; }\n@property --tw-backdrop-opacity { syntax: "*"; inherits: false; }\n@property --tw-backdrop-saturate { syntax: "*"; inherits: false; }\n@property --tw-backdrop-sepia { syntax: "*"; inherits: false; }\n@property --tw-duration { syntax: "*"; inherits: false; }\n@property --tw-ease { syntax: "*"; inherits: false; }\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n@keyframes ping {\n 75%, 100% {\n transform: scale(2);\n opacity: 0;\n }\n}\n@keyframes pulse {\n 50% {\n opacity: 0.5;\n }\n}\n@keyframes bounce {\n 0%, 100% {\n transform: translateY(-25%);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 50% {\n transform: none;\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n}\n@keyframes shapeshift {\n 0% {\n clip-path: var(--circle);\n rotate: 0turn;\n }\n 25% {\n clip-path: var(--flower);\n }\n 50% {\n clip-path: var(--cylinder);\n }\n 75% {\n clip-path: var(--hexagon);\n }\n 100% {\n clip-path: var(--circle);\n rotate: 1turn;\n }\n 120% {\n clip-path: var(--flower);\n }\n 140% {\n clip-path: var(--cylinder);\n }\n 160% {\n clip-path: var(--hexagon);\n }\n 180% {\n clip-path: var(--circle);\n rotate: 1turn;\n }\n}\n@keyframes gradientMove {\n 0% {\n translate: 0 0;\n }\n 100% {\n translate: -75% -75%;\n }\n}\n@layer properties {\n @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) {\n *,\n ::before,\n ::after,\n ::backdrop {\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-translate-z: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-scale-z: 1;\n --tw-rotate-x: initial;\n --tw-rotate-y: initial;\n --tw-rotate-z: initial;\n --tw-skew-x: initial;\n --tw-skew-y: initial;\n --tw-scroll-snap-strictness: proximity;\n --tw-scrollbar-thumb: #0000;\n --tw-scrollbar-track: #0000;\n --tw-space-y-reverse: 0;\n --tw-divide-y-reverse: 0;\n --tw-border-style: solid;\n --tw-gradient-position: initial;\n --tw-gradient-from: #0000;\n --tw-gradient-via: #0000;\n --tw-gradient-to: #0000;\n --tw-gradient-stops: initial;\n --tw-gradient-via-stops: initial;\n --tw-gradient-from-position: 0%;\n --tw-gradient-via-position: 50%;\n --tw-gradient-to-position: 100%;\n --tw-leading: initial;\n --tw-font-weight: initial;\n --tw-tracking: initial;\n --tw-ordinal: initial;\n --tw-slashed-zero: initial;\n --tw-numeric-figure: initial;\n --tw-numeric-spacing: initial;\n --tw-numeric-fraction: initial;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-color: initial;\n --tw-shadow-alpha: 100%;\n --tw-inset-shadow: 0 0 #0000;\n --tw-inset-shadow-color: initial;\n --tw-inset-shadow-alpha: 100%;\n --tw-ring-color: initial;\n --tw-ring-shadow: 0 0 #0000;\n --tw-inset-ring-color: initial;\n --tw-inset-ring-shadow: 0 0 #0000;\n --tw-ring-inset: initial;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-blur: initial;\n --tw-brightness: initial;\n --tw-contrast: initial;\n --tw-grayscale: initial;\n --tw-hue-rotate: initial;\n --tw-invert: initial;\n --tw-opacity: initial;\n --tw-saturate: initial;\n --tw-sepia: initial;\n --tw-drop-shadow: initial;\n --tw-drop-shadow-color: initial;\n --tw-drop-shadow-alpha: 100%;\n --tw-drop-shadow-size: initial;\n --tw-backdrop-blur: initial;\n --tw-backdrop-brightness: initial;\n --tw-backdrop-contrast: initial;\n --tw-backdrop-grayscale: initial;\n --tw-backdrop-hue-rotate: initial;\n --tw-backdrop-invert: initial;\n --tw-backdrop-opacity: initial;\n --tw-backdrop-saturate: initial;\n --tw-backdrop-sepia: initial;\n --tw-duration: initial;\n --tw-ease: initial;\n }\n }\n}\n');
35
58
 
36
59
  // src/components/ChatWidget.tsx
37
60
  import { useState as useState7 } from "react";
38
61
  import { MessageSquare, X as X3 } from "lucide-react";
39
62
 
40
63
  // src/components/ChatWindow.tsx
41
- import { useState as useState6, useRef as useRef5, useEffect as useEffect5, useCallback as useCallback2 } from "react";
64
+ import { useState as useState6, useRef as useRef6, useEffect as useEffect5, useCallback as useCallback2 } from "react";
42
65
  import {
43
66
  Bot as Bot2,
44
67
  Trash2,
@@ -316,7 +339,7 @@ function DocumentUpload({ namespace, onUploadComplete, className = "" }) {
316
339
 
317
340
  // src/components/MessageBubble.tsx
318
341
  import React10 from "react";
319
- import { Bot, User, ChevronDown as ChevronDown4, ChevronRight as ChevronRight4, Activity, Copy, Check } from "lucide-react";
342
+ import { Bot, User, ChevronDown as ChevronDown4, ChevronRight as ChevronRight4, Activity, Copy, Check, ThumbsUp, ThumbsDown, Clock as Clock2 } from "lucide-react";
320
343
  import ReactMarkdown from "react-markdown";
321
344
 
322
345
  // src/components/SourceCard.tsx
@@ -1473,86 +1496,6 @@ function ObservabilityPanel({ trace, primaryColor = "#6366f1" }) {
1473
1496
  ] });
1474
1497
  }
1475
1498
 
1476
- // src/components/HourglassLoader.tsx
1477
- import { jsx as jsx9, jsxs as jsxs8 } from "react/jsx-runtime";
1478
- var HourglassLoader = ({
1479
- size = 16,
1480
- primaryColor = "#10b981",
1481
- glow = false
1482
- }) => {
1483
- return /* @__PURE__ */ jsx9(
1484
- "svg",
1485
- {
1486
- xmlns: "http://www.w3.org/2000/svg",
1487
- viewBox: "0 0 100 100",
1488
- preserveAspectRatio: "xMidYMid",
1489
- style: {
1490
- width: size,
1491
- height: size,
1492
- background: "transparent",
1493
- filter: glow ? `drop-shadow(0 0 4px ${primaryColor})` : "none"
1494
- },
1495
- children: /* @__PURE__ */ jsxs8("g", { children: [
1496
- /* @__PURE__ */ jsx9(
1497
- "animateTransform",
1498
- {
1499
- attributeName: "transform",
1500
- type: "rotate",
1501
- calcMode: "spline",
1502
- values: "0 50 50; 0 50 50; 180 50 50",
1503
- keyTimes: "0; 0.8; 1",
1504
- keySplines: "0 0 1 1; 0.4 0 0.2 1",
1505
- dur: "2s",
1506
- repeatCount: "indefinite"
1507
- }
1508
- ),
1509
- /* @__PURE__ */ jsx9(
1510
- "path",
1511
- {
1512
- d: "M 25 15 L 75 15 L 75 20 L 55 50 L 75 80 L 75 85 L 25 85 L 25 80 L 45 50 L 25 20 Z",
1513
- fill: "none",
1514
- stroke: primaryColor,
1515
- strokeWidth: "5",
1516
- strokeLinejoin: "round",
1517
- strokeLinecap: "round"
1518
- }
1519
- ),
1520
- /* @__PURE__ */ jsx9("path", { fill: primaryColor, children: /* @__PURE__ */ jsx9(
1521
- "animate",
1522
- {
1523
- attributeName: "d",
1524
- values: "M 30 20 L 70 20 L 50 50 L 50 50 Z; M 50 50 L 50 50 L 50 50 L 50 50 Z; M 50 50 L 50 50 L 50 50 L 50 50 Z",
1525
- keyTimes: "0; 0.8; 1",
1526
- dur: "2s",
1527
- repeatCount: "indefinite"
1528
- }
1529
- ) }),
1530
- /* @__PURE__ */ jsx9("path", { fill: primaryColor, children: /* @__PURE__ */ jsx9(
1531
- "animate",
1532
- {
1533
- attributeName: "d",
1534
- values: "M 30 80 L 70 80 L 70 80 L 30 80 Z; M 30 80 L 70 80 L 50 50 L 50 50 Z; M 30 80 L 70 80 L 50 50 L 50 50 Z",
1535
- keyTimes: "0; 0.8; 1",
1536
- dur: "2s",
1537
- repeatCount: "indefinite"
1538
- }
1539
- ) }),
1540
- /* @__PURE__ */ jsx9("line", { x1: "50", y1: "50", x2: "50", y2: "80", stroke: primaryColor, strokeWidth: "3", children: /* @__PURE__ */ jsx9(
1541
- "animate",
1542
- {
1543
- attributeName: "opacity",
1544
- values: "0; 1; 1; 0; 0",
1545
- keyTimes: "0; 0.1; 0.7; 0.8; 1",
1546
- dur: "2s",
1547
- repeatCount: "indefinite"
1548
- }
1549
- ) })
1550
- ] })
1551
- }
1552
- );
1553
- };
1554
- var HourglassLoader_default = HourglassLoader;
1555
-
1556
1499
  // src/utils/synonyms.ts
1557
1500
  var FIELD_SYNONYMS = {
1558
1501
  name: ["product", "item", "title", "label", "heading", "subject", "product name", "item name"],
@@ -1925,7 +1868,7 @@ import React8 from "react";
1925
1868
 
1926
1869
  // src/components/UIDispatcher.tsx
1927
1870
  import React7 from "react";
1928
- import { jsx as jsx10, jsxs as jsxs9 } from "react/jsx-runtime";
1871
+ import { jsx as jsx9, jsxs as jsxs8 } from "react/jsx-runtime";
1929
1872
  function normalizeTabularRows(rows, columns) {
1930
1873
  if (!Array.isArray(rows)) return [];
1931
1874
  const SYNONYMS = {
@@ -2039,13 +1982,13 @@ function UIDispatcher({ rawContent, primaryColor, accentColor, isStreaming, onAd
2039
1982
  }
2040
1983
  }, [rawContent, isStreaming]);
2041
1984
  if ("loading" in result) {
2042
- return /* @__PURE__ */ jsxs9("div", { className: "my-4 p-8 bg-slate-50 dark:bg-white/5 rounded-xl border border-dashed border-slate-300 dark:border-white/10 flex flex-col items-center justify-center gap-3 animate-pulse", children: [
2043
- /* @__PURE__ */ jsx10("div", { className: "w-5 h-5 border-2 border-indigo-500 border-t-transparent rounded-full animate-spin" }),
2044
- /* @__PURE__ */ jsx10("p", { className: "text-xs text-slate-500 font-medium italic", children: "Preparing view..." })
1985
+ return /* @__PURE__ */ jsxs8("div", { className: "my-4 p-8 bg-slate-50 dark:bg-white/5 rounded-xl border border-dashed border-slate-300 dark:border-white/10 flex flex-col items-center justify-center gap-3 animate-pulse", children: [
1986
+ /* @__PURE__ */ jsx9("div", { className: "w-5 h-5 border-2 border-indigo-500 border-t-transparent rounded-full animate-spin" }),
1987
+ /* @__PURE__ */ jsx9("p", { className: "text-xs text-slate-500 font-medium italic", children: "Preparing view..." })
2045
1988
  ] });
2046
1989
  }
2047
1990
  if ("error" in result) {
2048
- return /* @__PURE__ */ jsx10("pre", { className: "p-4 my-2 bg-slate-900 text-slate-100 rounded-lg text-[10px] overflow-auto max-h-40", children: /* @__PURE__ */ jsx10("code", { children: rawContent }) });
1991
+ return /* @__PURE__ */ jsx9("pre", { className: "p-4 my-2 bg-slate-900 text-slate-100 rounded-lg text-[10px] overflow-auto max-h-40", children: /* @__PURE__ */ jsx9("code", { children: rawContent }) });
2049
1992
  }
2050
1993
  const { config } = result;
2051
1994
  const isCompact = viewportSize === "compact";
@@ -2053,10 +1996,10 @@ function UIDispatcher({ rawContent, primaryColor, accentColor, isStreaming, onAd
2053
1996
  const hasDescription = typeof config.description === "string" && config.description.trim().length > 0;
2054
1997
  switch (config.view) {
2055
1998
  case "chart":
2056
- return /* @__PURE__ */ jsxs9("div", { className: `${isCompact ? "my-4 p-3" : "my-6 p-4"} bg-white dark:bg-slate-900 rounded-2xl border border-slate-200 dark:border-white/10 shadow-sm overflow-hidden`, children: [
2057
- config.title && /* @__PURE__ */ jsx10("h4", { className: `${isCompact ? "text-[11px] mb-3" : "text-xs mb-4"} font-semibold text-slate-500 px-2`, children: config.title }),
2058
- hasDescription && /* @__PURE__ */ jsx10("p", { className: `px-2 ${isCompact ? "text-xs" : "text-sm"} text-slate-500 dark:text-white/60`, children: config.description }),
2059
- /* @__PURE__ */ jsx10(
1999
+ return /* @__PURE__ */ jsxs8("div", { className: `${isCompact ? "my-4 p-3" : "my-6 p-4"} bg-white dark:bg-slate-900 rounded-2xl border border-slate-200 dark:border-white/10 shadow-sm overflow-hidden`, children: [
2000
+ config.title && /* @__PURE__ */ jsx9("h4", { className: `${isCompact ? "text-[11px] mb-3" : "text-xs mb-4"} font-semibold text-slate-500 px-2`, children: config.title }),
2001
+ hasDescription && /* @__PURE__ */ jsx9("p", { className: `px-2 ${isCompact ? "text-xs" : "text-sm"} text-slate-500 dark:text-white/60`, children: config.description }),
2002
+ /* @__PURE__ */ jsx9(
2060
2003
  DynamicChart,
2061
2004
  {
2062
2005
  config: {
@@ -2072,7 +2015,7 @@ function UIDispatcher({ rawContent, primaryColor, accentColor, isStreaming, onAd
2072
2015
  isStreaming
2073
2016
  }
2074
2017
  ),
2075
- hasInsights && /* @__PURE__ */ jsx10("div", { className: "mt-4 flex flex-wrap gap-2 px-2", children: (_a = config.insights) == null ? void 0 : _a.map((insight, i) => /* @__PURE__ */ jsx10(
2018
+ hasInsights && /* @__PURE__ */ jsx9("div", { className: "mt-4 flex flex-wrap gap-2 px-2", children: (_a = config.insights) == null ? void 0 : _a.map((insight, i) => /* @__PURE__ */ jsx9(
2076
2019
  "span",
2077
2020
  {
2078
2021
  className: `rounded-full border border-emerald-200 bg-emerald-50 ${isCompact ? "px-2.5 py-1 text-[10px]" : "px-3 py-1 text-[11px]"} font-medium text-emerald-700 dark:border-emerald-500/20 dark:bg-emerald-500/10 dark:text-emerald-300`,
@@ -2082,10 +2025,10 @@ function UIDispatcher({ rawContent, primaryColor, accentColor, isStreaming, onAd
2082
2025
  )) })
2083
2026
  ] });
2084
2027
  case "carousel":
2085
- return /* @__PURE__ */ jsxs9("div", { className: "my-4", children: [
2086
- config.title && /* @__PURE__ */ jsx10("h4", { className: `${isCompact ? "mb-1.5 text-[11px]" : "mb-2 text-xs"} font-semibold text-slate-500`, children: config.title }),
2087
- hasDescription && /* @__PURE__ */ jsx10("p", { className: `mb-3 ${isCompact ? "text-xs" : "text-sm"} text-slate-500 dark:text-white/60`, children: config.description }),
2088
- /* @__PURE__ */ jsx10(ProductCarousel, { products: config.data.map((item) => {
2028
+ return /* @__PURE__ */ jsxs8("div", { className: "my-4", children: [
2029
+ config.title && /* @__PURE__ */ jsx9("h4", { className: `${isCompact ? "mb-1.5 text-[11px]" : "mb-2 text-xs"} font-semibold text-slate-500`, children: config.title }),
2030
+ hasDescription && /* @__PURE__ */ jsx9("p", { className: `mb-3 ${isCompact ? "text-xs" : "text-sm"} text-slate-500 dark:text-white/60`, children: config.description }),
2031
+ /* @__PURE__ */ jsx9(ProductCarousel, { products: config.data.map((item) => {
2089
2032
  var _a2;
2090
2033
  return __spreadProps(__spreadValues({}, item), {
2091
2034
  image: (_a2 = item.image) != null ? _a2 : typeof resolveImage === "function" ? resolveImage(item) : void 0
@@ -2093,10 +2036,10 @@ function UIDispatcher({ rawContent, primaryColor, accentColor, isStreaming, onAd
2093
2036
  }), primaryColor, onAddToCart })
2094
2037
  ] });
2095
2038
  case "table":
2096
- return /* @__PURE__ */ jsxs9("div", { className: `${isCompact ? "my-3 p-3 max-h-[320px]" : "my-4 p-4 max-h-[400px]"} bg-white dark:bg-slate-900 rounded-xl border border-slate-200 dark:border-white/10 shadow-sm overflow-auto`, children: [
2097
- config.title && /* @__PURE__ */ jsx10("h4", { className: `${isCompact ? "text-[11px]" : "text-xs"} font-semibold text-slate-500 mb-2`, children: config.title }),
2098
- hasDescription && /* @__PURE__ */ jsx10("p", { className: `mb-3 ${isCompact ? "text-xs" : "text-sm"} text-slate-500 dark:text-white/60`, children: config.description }),
2099
- /* @__PURE__ */ jsx10(
2039
+ return /* @__PURE__ */ jsxs8("div", { className: `${isCompact ? "my-3 p-3 max-h-[320px]" : "my-4 p-4 max-h-[400px]"} bg-white dark:bg-slate-900 rounded-xl border border-slate-200 dark:border-white/10 shadow-sm overflow-auto`, children: [
2040
+ config.title && /* @__PURE__ */ jsx9("h4", { className: `${isCompact ? "text-[11px]" : "text-xs"} font-semibold text-slate-500 mb-2`, children: config.title }),
2041
+ hasDescription && /* @__PURE__ */ jsx9("p", { className: `mb-3 ${isCompact ? "text-xs" : "text-sm"} text-slate-500 dark:text-white/60`, children: config.description }),
2042
+ /* @__PURE__ */ jsx9(
2100
2043
  VisualizationRenderer,
2101
2044
  {
2102
2045
  data: {
@@ -2119,7 +2062,7 @@ function UIDispatcher({ rawContent, primaryColor, accentColor, isStreaming, onAd
2119
2062
  }
2120
2063
 
2121
2064
  // src/components/MarkdownComponents.tsx
2122
- import { jsx as jsx11, jsxs as jsxs10 } from "react/jsx-runtime";
2065
+ import { Fragment as Fragment4, jsx as jsx10, jsxs as jsxs9 } from "react/jsx-runtime";
2123
2066
  function createMarkdownComponents({
2124
2067
  primaryColor,
2125
2068
  accentColor,
@@ -2134,12 +2077,12 @@ function createMarkdownComponents({
2134
2077
  table: (_a) => {
2135
2078
  var props = __objRest(_a, []);
2136
2079
  if (isStreaming) {
2137
- return /* @__PURE__ */ jsxs10("div", { className: "my-5 p-6 bg-slate-50 dark:bg-white/5 rounded-xl border border-dashed border-slate-300 dark:border-white/10 flex items-center justify-center gap-3 select-none", children: [
2138
- /* @__PURE__ */ jsx11("div", { className: "w-4 h-4 border-2 border-indigo-500 border-t-transparent rounded-full animate-spin" }),
2139
- /* @__PURE__ */ jsx11("p", { className: "text-xs text-slate-500 font-medium italic animate-pulse", children: "Generating data table..." })
2080
+ return /* @__PURE__ */ jsxs9("div", { className: "my-5 p-6 bg-slate-50 dark:bg-white/5 rounded-xl border border-dashed border-slate-300 dark:border-white/10 flex items-center justify-center gap-3 select-none", children: [
2081
+ /* @__PURE__ */ jsx10("div", { className: "w-4 h-4 border-2 border-indigo-500 border-t-transparent rounded-full animate-spin" }),
2082
+ /* @__PURE__ */ jsx10("p", { className: "text-xs text-slate-500 font-medium italic animate-pulse", children: "Generating data table..." })
2140
2083
  ] });
2141
2084
  }
2142
- return /* @__PURE__ */ jsx11("div", { className: "not-prose overflow-hidden my-5 rounded-xl border border-slate-200 dark:border-white/10 shadow-sm bg-white dark:bg-slate-900/50", children: /* @__PURE__ */ jsx11("div", { className: "overflow-x-auto", children: /* @__PURE__ */ jsx11(
2085
+ return /* @__PURE__ */ jsx10("div", { className: "not-prose overflow-hidden my-5 rounded-xl border border-slate-200 dark:border-white/10 shadow-sm bg-white dark:bg-slate-900/50", children: /* @__PURE__ */ jsx10("div", { className: "overflow-x-auto", children: /* @__PURE__ */ jsx10(
2143
2086
  "table",
2144
2087
  __spreadValues({
2145
2088
  className: "!table w-full text-left border-collapse min-w-[400px] text-sm"
@@ -2148,7 +2091,7 @@ function createMarkdownComponents({
2148
2091
  },
2149
2092
  thead: (_b) => {
2150
2093
  var props = __objRest(_b, []);
2151
- return /* @__PURE__ */ jsx11(
2094
+ return /* @__PURE__ */ jsx10(
2152
2095
  "thead",
2153
2096
  __spreadValues({
2154
2097
  className: "!table-header-group bg-slate-50 dark:bg-white/5 border-b border-slate-200 dark:border-white/10"
@@ -2157,11 +2100,11 @@ function createMarkdownComponents({
2157
2100
  },
2158
2101
  tbody: (_c) => {
2159
2102
  var props = __objRest(_c, []);
2160
- return /* @__PURE__ */ jsx11("tbody", __spreadValues({ className: "!table-row-group divide-y divide-slate-100 dark:divide-white/5" }, props));
2103
+ return /* @__PURE__ */ jsx10("tbody", __spreadValues({ className: "!table-row-group divide-y divide-slate-100 dark:divide-white/5" }, props));
2161
2104
  },
2162
2105
  tr: (_d) => {
2163
2106
  var props = __objRest(_d, []);
2164
- return /* @__PURE__ */ jsx11(
2107
+ return /* @__PURE__ */ jsx10(
2165
2108
  "tr",
2166
2109
  __spreadValues({
2167
2110
  className: "!table-row hover:bg-slate-50/70 dark:hover:bg-white/5 transition-colors"
@@ -2170,7 +2113,7 @@ function createMarkdownComponents({
2170
2113
  },
2171
2114
  th: (_e) => {
2172
2115
  var _f = _e, { children } = _f, props = __objRest(_f, ["children"]);
2173
- return /* @__PURE__ */ jsx11(
2116
+ return /* @__PURE__ */ jsx10(
2174
2117
  "th",
2175
2118
  __spreadProps(__spreadValues({
2176
2119
  className: "!table-cell px-4 py-3 font-bold text-slate-700 dark:text-white/90 whitespace-nowrap text-[11px] uppercase tracking-wider text-left"
@@ -2181,7 +2124,7 @@ function createMarkdownComponents({
2181
2124
  },
2182
2125
  td: (_g) => {
2183
2126
  var _h = _g, { children } = _h, props = __objRest(_h, ["children"]);
2184
- return /* @__PURE__ */ jsx11(
2127
+ return /* @__PURE__ */ jsx10(
2185
2128
  "td",
2186
2129
  __spreadProps(__spreadValues({
2187
2130
  className: "!table-cell px-4 py-3 text-slate-600 dark:text-white/70 whitespace-nowrap text-sm"
@@ -2204,7 +2147,7 @@ function createMarkdownComponents({
2204
2147
  const lang = (_a = /language-(\w+)/.exec(className != null ? className : "")) == null ? void 0 : _a[1];
2205
2148
  if (!inline && (lang === "ui" || lang === "chart" || lang === "json")) {
2206
2149
  const content = String(children != null ? children : "").trim();
2207
- return /* @__PURE__ */ jsx11(
2150
+ return /* @__PURE__ */ jsx10(
2208
2151
  UIDispatcher,
2209
2152
  {
2210
2153
  rawContent: content,
@@ -2219,7 +2162,7 @@ function createMarkdownComponents({
2219
2162
  if (!inline) {
2220
2163
  const content = String(children != null ? children : "").trim();
2221
2164
  if (content.startsWith("{") && content.endsWith("}")) {
2222
- return /* @__PURE__ */ jsx11(
2165
+ return /* @__PURE__ */ jsx10(
2223
2166
  UIDispatcher,
2224
2167
  {
2225
2168
  rawContent: content,
@@ -2231,10 +2174,47 @@ function createMarkdownComponents({
2231
2174
  }
2232
2175
  );
2233
2176
  }
2177
+ return /* @__PURE__ */ jsx10(CodeBlock, { language: lang, children: content });
2234
2178
  }
2235
- return /* @__PURE__ */ jsx11("code", __spreadProps(__spreadValues({ className }, props), { children: typeof children === "string" || typeof children === "number" ? children : JSON.stringify(children) }));
2179
+ return /* @__PURE__ */ jsx10("code", __spreadProps(__spreadValues({ className: "px-1.5 py-0.5 rounded bg-slate-100 dark:bg-white/10 text-rose-600 dark:text-rose-400 font-mono text-[11px]" }, props), { children: typeof children === "string" || typeof children === "number" ? children : JSON.stringify(children) }));
2180
+ }
2181
+ };
2182
+ }
2183
+ function CodeBlock({ children, language }) {
2184
+ const [copied, setCopied] = React8.useState(false);
2185
+ const handleCopy = async () => {
2186
+ try {
2187
+ await navigator.clipboard.writeText(children);
2188
+ setCopied(true);
2189
+ setTimeout(() => setCopied(false), 2e3);
2190
+ } catch (e) {
2191
+ console.warn("Failed to copy code", e);
2236
2192
  }
2237
2193
  };
2194
+ return /* @__PURE__ */ jsxs9("div", { className: "not-prose my-4 rounded-xl border border-slate-200 dark:border-white/10 overflow-hidden bg-slate-900 text-slate-100 shadow-lg select-text", children: [
2195
+ /* @__PURE__ */ jsxs9("div", { className: "flex items-center justify-between px-4 py-2 bg-slate-950 border-b border-slate-800 text-xs font-semibold text-slate-400 select-none", children: [
2196
+ /* @__PURE__ */ jsx10("span", { className: "font-mono lowercase", children: language || "code" }),
2197
+ /* @__PURE__ */ jsx10(
2198
+ "button",
2199
+ {
2200
+ onClick: handleCopy,
2201
+ className: "flex items-center gap-1.5 px-2 py-1 rounded hover:bg-slate-800 hover:text-slate-250 transition-colors cursor-pointer text-slate-400 border border-transparent hover:border-slate-800",
2202
+ type: "button",
2203
+ children: copied ? /* @__PURE__ */ jsxs9(Fragment4, { children: [
2204
+ /* @__PURE__ */ jsx10("svg", { xmlns: "http://www.w3.org/2000/svg", width: "12", height: "12", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "3", className: "text-emerald-500", children: /* @__PURE__ */ jsx10("polyline", { points: "20 6 9 17 4 12" }) }),
2205
+ /* @__PURE__ */ jsx10("span", { className: "text-emerald-500", children: "Copied!" })
2206
+ ] }) : /* @__PURE__ */ jsxs9(Fragment4, { children: [
2207
+ /* @__PURE__ */ jsxs9("svg", { xmlns: "http://www.w3.org/2000/svg", width: "12", height: "12", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", children: [
2208
+ /* @__PURE__ */ jsx10("rect", { x: "9", y: "9", width: "13", height: "13", rx: "2", ry: "2" }),
2209
+ /* @__PURE__ */ jsx10("path", { d: "M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" })
2210
+ ] }),
2211
+ /* @__PURE__ */ jsx10("span", { children: "Copy" })
2212
+ ] })
2213
+ }
2214
+ )
2215
+ ] }),
2216
+ /* @__PURE__ */ jsx10("div", { className: "p-4 overflow-x-auto font-mono text-[11px] leading-relaxed text-slate-200 bg-slate-900/90 whitespace-pre", children: /* @__PURE__ */ jsx10("code", { children }) })
2217
+ ] });
2238
2218
  }
2239
2219
  function normaliseChild(children) {
2240
2220
  if (typeof children === "object" && children !== null && !Array.isArray(children) && !React8.isValidElement(children)) {
@@ -2246,7 +2226,7 @@ function normaliseChild(children) {
2246
2226
  // src/components/ThinkingBlock.tsx
2247
2227
  import { useState as useState3, useEffect as useEffect2, useRef as useRef3 } from "react";
2248
2228
  import { Brain, ChevronDown as ChevronDown3, ChevronRight as ChevronRight3, Loader2 as Loader22 } from "lucide-react";
2249
- import { jsx as jsx12, jsxs as jsxs11 } from "react/jsx-runtime";
2229
+ import { jsx as jsx11, jsxs as jsxs10 } from "react/jsx-runtime";
2250
2230
  function ThinkingBlock({ thinking, thinkingMs, isStreaming = false }) {
2251
2231
  const [isExpanded, setIsExpanded] = useState3(true);
2252
2232
  const containerRef = useRef3(null);
@@ -2263,22 +2243,22 @@ function ThinkingBlock({ thinking, thinkingMs, isStreaming = false }) {
2263
2243
  }
2264
2244
  }, [thinking, isStreaming, isExpanded]);
2265
2245
  const durationSec = thinkingMs ? (thinkingMs / 1e3).toFixed(1) : null;
2266
- return /* @__PURE__ */ jsxs11("div", { className: "w-full max-w-2xl my-1.5 border border-slate-200 dark:border-white/10 rounded-xl bg-slate-50/50 dark:bg-white/5 overflow-hidden transition-all duration-200", children: [
2267
- /* @__PURE__ */ jsxs11(
2246
+ return /* @__PURE__ */ jsxs10("div", { className: "w-full max-w-2xl my-1.5 border border-slate-200 dark:border-white/10 rounded-xl bg-slate-50/50 dark:bg-white/5 overflow-hidden transition-all duration-200", children: [
2247
+ /* @__PURE__ */ jsxs10(
2268
2248
  "button",
2269
2249
  {
2270
2250
  onClick: () => setIsExpanded(!isExpanded),
2271
2251
  className: "w-full px-4 py-2.5 flex items-center justify-between text-xs font-medium text-slate-500 dark:text-white/40 hover:bg-slate-100 dark:hover:bg-white/10 transition-colors cursor-pointer select-none",
2272
2252
  children: [
2273
- /* @__PURE__ */ jsxs11("div", { className: "flex items-center gap-2", children: [
2274
- isStreaming ? /* @__PURE__ */ jsx12(Loader22, { className: "w-3.5 h-3.5 animate-spin text-slate-400 dark:text-white/30" }) : /* @__PURE__ */ jsx12(Brain, { className: "w-3.5 h-3.5 text-slate-400 dark:text-white/40" }),
2275
- /* @__PURE__ */ jsx12("span", { children: isStreaming ? "Thinking..." : durationSec ? `Thought for ${durationSec}s` : "Thinking process" })
2253
+ /* @__PURE__ */ jsxs10("div", { className: "flex items-center gap-2", children: [
2254
+ isStreaming ? /* @__PURE__ */ jsx11(Loader22, { className: "w-3.5 h-3.5 animate-spin text-slate-400 dark:text-white/30" }) : /* @__PURE__ */ jsx11(Brain, { className: "w-3.5 h-3.5 text-slate-400 dark:text-white/40" }),
2255
+ /* @__PURE__ */ jsx11("span", { children: isStreaming ? "Thinking..." : durationSec ? `Thought for ${durationSec}s` : "Thinking process" })
2276
2256
  ] }),
2277
- /* @__PURE__ */ jsx12("div", { children: isExpanded ? /* @__PURE__ */ jsx12(ChevronDown3, { className: "w-3.5 h-3.5 text-slate-400 dark:text-white/30" }) : /* @__PURE__ */ jsx12(ChevronRight3, { className: "w-3.5 h-3.5 text-slate-400 dark:text-white/30" }) })
2257
+ /* @__PURE__ */ jsx11("div", { children: isExpanded ? /* @__PURE__ */ jsx11(ChevronDown3, { className: "w-3.5 h-3.5 text-slate-400 dark:text-white/30" }) : /* @__PURE__ */ jsx11(ChevronRight3, { className: "w-3.5 h-3.5 text-slate-400 dark:text-white/30" }) })
2278
2258
  ]
2279
2259
  }
2280
2260
  ),
2281
- isExpanded && /* @__PURE__ */ jsx12(
2261
+ isExpanded && /* @__PURE__ */ jsx11(
2282
2262
  "div",
2283
2263
  {
2284
2264
  ref: containerRef,
@@ -2290,7 +2270,7 @@ function ThinkingBlock({ thinking, thinkingMs, isStreaming = false }) {
2290
2270
  }
2291
2271
 
2292
2272
  // src/components/MessageBubble.tsx
2293
- import { jsx as jsx13, jsxs as jsxs12 } from "react/jsx-runtime";
2273
+ import { jsx as jsx12, jsxs as jsxs11 } from "react/jsx-runtime";
2294
2274
  function normalizePlusSeparatedLists(raw) {
2295
2275
  return raw.split("\n").map((line) => {
2296
2276
  const productListLine = /[—:]\s*\d+\s+\+\s+[A-Za-z]/.test(line) || /\b(products?|categories?|in stock|out of stock)\b/i.test(line);
@@ -2299,7 +2279,62 @@ function normalizePlusSeparatedLists(raw) {
2299
2279
  }).join("\n");
2300
2280
  }
2301
2281
  function stripLeakedAnswerWrappers2(raw) {
2302
- return raw.replace(/<prose\s+answer(?:\s+in\s+[^>]*)?>\s*([\s\S]*?)\s*<\/prose>/gi, "$1").replace(/<\/?prose(?:\s+answer)?[^>]*>/gi, "").replace(/\n{3,}/g, "\n\n").trim();
2282
+ return raw.replace(/<prose\s+answer(?:\s+in\s+[^>]*)?>[\s\S]*?<\/prose>/gi, "$1").replace(/<\/?prose(?:\s+answer)?[^>]*>/gi, "").replace(/\n{3,}/g, "\n\n").trim();
2283
+ }
2284
+ function formatTime(isoString) {
2285
+ if (!isoString) return "";
2286
+ try {
2287
+ const d = new Date(isoString);
2288
+ return d.toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" });
2289
+ } catch (e) {
2290
+ return "";
2291
+ }
2292
+ }
2293
+ function FeedbackBar({ messageId, onFeedback, primaryColor }) {
2294
+ const [rating, setRating] = React10.useState(null);
2295
+ const [submitting, setSubmitting] = React10.useState(false);
2296
+ const handleRate = async (r) => {
2297
+ if (rating !== null || submitting) return;
2298
+ setSubmitting(true);
2299
+ setRating(r);
2300
+ try {
2301
+ await onFeedback(messageId, r);
2302
+ } catch (e) {
2303
+ } finally {
2304
+ setSubmitting(false);
2305
+ }
2306
+ };
2307
+ const isLocked = rating !== null;
2308
+ return /* @__PURE__ */ jsxs11("div", { className: "flex items-center gap-1", children: [
2309
+ /* @__PURE__ */ jsx12("span", { className: "h-3 w-px bg-slate-200 dark:bg-white/10 mx-1" }),
2310
+ /* @__PURE__ */ jsxs11(
2311
+ "button",
2312
+ {
2313
+ onClick: () => handleRate("thumbs_up"),
2314
+ disabled: isLocked,
2315
+ title: rating === "thumbs_up" ? "You liked this" : "Good response",
2316
+ className: `group relative flex items-center justify-center w-6 h-6 rounded-lg transition-all duration-200 cursor-pointer border ${rating === "thumbs_up" ? "bg-emerald-50 dark:bg-emerald-500/10 border-emerald-200 dark:border-emerald-500/25 text-emerald-600 dark:text-emerald-400 scale-110" : rating === "thumbs_down" ? "opacity-30 border-transparent text-slate-300 dark:text-white/20 cursor-not-allowed" : "border-transparent text-slate-300 dark:text-white/20 hover:text-emerald-500 dark:hover:text-emerald-400 hover:bg-emerald-50 dark:hover:bg-emerald-500/10 hover:border-emerald-200 dark:hover:border-emerald-500/20 hover:scale-110"}`,
2317
+ children: [
2318
+ /* @__PURE__ */ jsx12(ThumbsUp, { className: "w-3 h-3" }),
2319
+ !isLocked && /* @__PURE__ */ jsx12("span", { className: "absolute -top-8 left-1/2 -translate-x-1/2 px-2 py-1 text-[10px] font-medium bg-slate-800 dark:bg-slate-700 text-white rounded-lg opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none whitespace-nowrap shadow-lg z-10", children: "Good response" })
2320
+ ]
2321
+ }
2322
+ ),
2323
+ /* @__PURE__ */ jsxs11(
2324
+ "button",
2325
+ {
2326
+ onClick: () => handleRate("thumbs_down"),
2327
+ disabled: isLocked,
2328
+ title: rating === "thumbs_down" ? "You disliked this" : "Bad response",
2329
+ className: `group relative flex items-center justify-center w-6 h-6 rounded-lg transition-all duration-200 cursor-pointer border ${rating === "thumbs_down" ? "bg-rose-50 dark:bg-rose-500/10 border-rose-200 dark:border-rose-500/25 text-rose-600 dark:text-rose-400 scale-110" : rating === "thumbs_up" ? "opacity-30 border-transparent text-slate-300 dark:text-white/20 cursor-not-allowed" : "border-transparent text-slate-300 dark:text-white/20 hover:text-rose-500 dark:hover:text-rose-400 hover:bg-rose-50 dark:hover:bg-rose-500/10 hover:border-rose-200 dark:hover:border-rose-500/20 hover:scale-110"}`,
2330
+ children: [
2331
+ /* @__PURE__ */ jsx12(ThumbsDown, { className: "w-3 h-3" }),
2332
+ !isLocked && /* @__PURE__ */ jsx12("span", { className: "absolute -top-8 left-1/2 -translate-x-1/2 px-2 py-1 text-[10px] font-medium bg-slate-800 dark:bg-slate-700 text-white rounded-lg opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none whitespace-nowrap shadow-lg z-10", children: "Bad response" })
2333
+ ]
2334
+ }
2335
+ ),
2336
+ isLocked && /* @__PURE__ */ jsx12("span", { className: `ml-1 text-[10px] font-semibold px-2 py-0.5 rounded-full border transition-all duration-300 ${rating === "thumbs_up" ? "text-emerald-600 dark:text-emerald-400 bg-emerald-50 dark:bg-emerald-500/10 border-emerald-200 dark:border-emerald-500/20" : "text-rose-600 dark:text-rose-400 bg-rose-50 dark:bg-rose-500/10 border-rose-200 dark:border-rose-500/20"}`, children: rating === "thumbs_up" ? "Helpful" : "Not helpful" })
2337
+ ] });
2303
2338
  }
2304
2339
  function MessageBubble({
2305
2340
  message,
@@ -2308,7 +2343,8 @@ function MessageBubble({
2308
2343
  primaryColor = "#6366f1",
2309
2344
  accentColor = "#8b5cf6",
2310
2345
  onAddToCart,
2311
- viewportSize = "large"
2346
+ viewportSize = "large",
2347
+ onFeedback
2312
2348
  }) {
2313
2349
  var _a;
2314
2350
  const isUser = message.role === "user";
@@ -2336,7 +2372,7 @@ function MessageBubble({
2336
2372
  if (type && !["text", "table"].includes(type)) return true;
2337
2373
  }
2338
2374
  if (structuredContent.payload) {
2339
- return /"?(?:view|type|chartType)"?\s*:\s*"?(?:chart|carousel|pie|bar|line|product_carousel)"?/i.test(structuredContent.payload);
2375
+ return /\"?(?:view|type|chartType)\"?\s*:\s*\"?(?:chart|carousel|pie|bar|line|product_carousel)\"?/i.test(structuredContent.payload);
2340
2376
  }
2341
2377
  return false;
2342
2378
  }, [message.uiTransformation, structuredContent.payload]);
@@ -2402,17 +2438,19 @@ ${match.trim()}
2402
2438
  () => createMarkdownComponents({ primaryColor, accentColor, isStreaming, onAddToCart, viewportSize }),
2403
2439
  [primaryColor, accentColor, isStreaming, onAddToCart, viewportSize]
2404
2440
  );
2405
- return /* @__PURE__ */ jsxs12("div", { className: `flex ${isCompact ? "gap-2" : "gap-3"} ${isUser ? "flex-row-reverse" : "flex-row"} items-start`, children: [
2406
- /* @__PURE__ */ jsx13(
2441
+ const timeLabel = formatTime(message.createdAt);
2442
+ const isCompleted = !isStreaming && message.content;
2443
+ return /* @__PURE__ */ jsxs11("div", { className: `flex ${isCompact ? "gap-2" : "gap-3"} ${isUser ? "flex-row-reverse" : "flex-row"} items-start`, children: [
2444
+ /* @__PURE__ */ jsx12(
2407
2445
  "div",
2408
2446
  {
2409
- className: `flex-shrink-0 ${isCompact ? "w-7 h-7" : "w-8 h-8"} rounded-full flex items-center justify-center shadow-lg ${isUser ? "text-white" : "bg-slate-100 dark:bg-white/10 text-slate-700 dark:text-white/80"}`,
2447
+ className: `flex-shrink-0 ${isCompact ? "w-7 h-7" : "w-8 h-8"} rounded-full flex items-center justify-center shadow-md transition-all duration-300 ${isUser ? "text-white" : "bg-gradient-to-br from-slate-100 to-slate-200 dark:from-white/10 dark:to-white/5 text-slate-600 dark:text-white/70 ring-1 ring-slate-200/80 dark:ring-white/10"} ${isStreaming && !isUser ? "ring-2 ring-offset-1 ring-offset-transparent animate-pulse" : ""}`,
2410
2448
  style: isUser ? { background: `linear-gradient(135deg, ${primaryColor}, ${accentColor})` } : {},
2411
- children: isUser ? /* @__PURE__ */ jsx13(User, { className: `${isCompact ? "w-3.5 h-3.5" : "w-4 h-4"} text-white` }) : /* @__PURE__ */ jsx13(Bot, { className: `${isCompact ? "w-3.5 h-3.5" : "w-4 h-4"}` })
2449
+ children: isUser ? /* @__PURE__ */ jsx12(User, { className: `${isCompact ? "w-3.5 h-3.5" : "w-4 h-4"} text-white` }) : /* @__PURE__ */ jsx12(Bot, { className: `${isCompact ? "w-3.5 h-3.5" : "w-4 h-4"}` })
2412
2450
  }
2413
2451
  ),
2414
- /* @__PURE__ */ jsxs12("div", { className: `flex flex-col gap-1 min-w-0 ${isCompact ? "max-w-[94%]" : isMedium ? "max-w-[92%]" : "max-w-[90%]"} ${isUser ? "items-end" : "items-start"}`, children: [
2415
- !isUser && message.thinking && /* @__PURE__ */ jsx13(
2452
+ /* @__PURE__ */ jsxs11("div", { className: `flex flex-col gap-1 min-w-0 ${isCompact ? "max-w-[94%]" : isMedium ? "max-w-[92%]" : "max-w-[90%]"} ${isUser ? "items-end" : "items-start"}`, children: [
2453
+ !isUser && message.thinking && /* @__PURE__ */ jsx12(
2416
2454
  ThinkingBlock,
2417
2455
  {
2418
2456
  thinking: message.thinking,
@@ -2420,27 +2458,27 @@ ${match.trim()}
2420
2458
  isStreaming: isStreaming && !message.content
2421
2459
  }
2422
2460
  ),
2423
- /* @__PURE__ */ jsxs12(
2461
+ /* @__PURE__ */ jsxs11(
2424
2462
  "div",
2425
2463
  {
2426
- className: `relative group ${isCompact ? "px-3 py-2.5 text-[13px]" : "px-4 py-3 text-sm"} rounded-2xl leading-relaxed shadow-sm dark:shadow-lg ${isUser ? "text-white rounded-tr-sm" : "bg-white dark:bg-white/5 border border-slate-200 dark:border-white/10 text-slate-800 dark:text-white/90 rounded-tl-sm"}`,
2464
+ className: `relative group ${isCompact ? "px-3 py-2.5 text-[13px]" : "px-4 py-3 text-sm"} rounded-2xl leading-relaxed transition-shadow duration-200 ${isUser ? "text-white rounded-tr-sm shadow-md hover:shadow-lg" : "bg-white dark:bg-white/5 border border-slate-200/80 dark:border-white/10 text-slate-800 dark:text-white/90 rounded-tl-sm shadow-sm hover:shadow-md hover:border-slate-300/60 dark:hover:border-white/15"}`,
2427
2465
  style: isUser ? { background: `linear-gradient(135deg, ${primaryColor}, ${accentColor})` } : {},
2428
2466
  children: [
2429
- !isUser && !isStreaming && message.content && /* @__PURE__ */ jsx13(
2467
+ !isUser && isCompleted && /* @__PURE__ */ jsx12(
2430
2468
  "button",
2431
2469
  {
2432
2470
  onClick: handleCopy,
2433
- className: `absolute top-2 right-2 p-1.5 rounded-lg border transition-all duration-200 cursor-pointer ${copied ? "bg-emerald-500/10 border-emerald-500/20 text-emerald-500 dark:text-emerald-400" : "bg-slate-500/5 hover:bg-slate-500/10 border-slate-200 dark:border-white/10 text-slate-400 dark:text-white/30 hover:text-slate-600 dark:hover:text-white/60"} opacity-0 group-hover:opacity-100 backdrop-blur-sm shadow-sm scale-95 group-hover:scale-100`,
2471
+ className: `absolute top-2 right-2 p-1.5 rounded-lg border transition-all duration-200 cursor-pointer ${copied ? "bg-emerald-500/10 border-emerald-500/20 text-emerald-500 dark:text-emerald-400" : "bg-white/60 dark:bg-white/5 hover:bg-white dark:hover:bg-white/10 border-slate-200/60 dark:border-white/10 text-slate-300 dark:text-white/20 hover:text-slate-600 dark:hover:text-white/60 hover:border-slate-300 dark:hover:border-white/20"} opacity-0 group-hover:opacity-100 backdrop-blur-sm shadow-sm scale-95 group-hover:scale-100`,
2434
2472
  title: copied ? "Copied!" : "Copy response",
2435
- children: copied ? /* @__PURE__ */ jsx13(Check, { className: "w-3.5 h-3.5" }) : /* @__PURE__ */ jsx13(Copy, { className: "w-3.5 h-3.5" })
2473
+ children: copied ? /* @__PURE__ */ jsx12(Check, { className: "w-3.5 h-3.5" }) : /* @__PURE__ */ jsx12(Copy, { className: "w-3.5 h-3.5" })
2436
2474
  }
2437
2475
  ),
2438
- isStreaming && !message.content ? /* @__PURE__ */ jsxs12("span", { className: "flex items-center gap-1 py-1", children: [
2439
- /* @__PURE__ */ jsx13("span", { className: "w-1.5 h-1.5 rounded-full bg-slate-400 dark:bg-white/60 animate-bounce [animation-delay:0ms]" }),
2440
- /* @__PURE__ */ jsx13("span", { className: "w-1.5 h-1.5 rounded-full bg-slate-400 dark:bg-white/60 animate-bounce [animation-delay:150ms]" }),
2441
- /* @__PURE__ */ jsx13("span", { className: "w-1.5 h-1.5 rounded-full bg-slate-400 dark:bg-white/60 animate-bounce [animation-delay:300ms]" })
2442
- ] }) : /* @__PURE__ */ jsxs12("div", { className: `prose ${isCompact ? "prose-xs" : "prose-sm"} max-w-none break-words ${isUser ? "prose-invert" : "dark:prose-invert"}`, children: [
2443
- !isUser && structuredContent.payload && /* @__PURE__ */ jsx13(
2476
+ isStreaming && !message.content ? /* @__PURE__ */ jsxs11("span", { className: "flex items-center gap-1 py-1", children: [
2477
+ /* @__PURE__ */ jsx12("span", { className: "w-1.5 h-1.5 rounded-full bg-slate-400 dark:bg-white/60 animate-bounce [animation-delay:0ms]" }),
2478
+ /* @__PURE__ */ jsx12("span", { className: "w-1.5 h-1.5 rounded-full bg-slate-400 dark:bg-white/60 animate-bounce [animation-delay:150ms]" }),
2479
+ /* @__PURE__ */ jsx12("span", { className: "w-1.5 h-1.5 rounded-full bg-slate-400 dark:bg-white/60 animate-bounce [animation-delay:300ms]" })
2480
+ ] }) : /* @__PURE__ */ jsxs11("div", { className: `prose ${isCompact ? "prose-xs" : "prose-sm"} max-w-none break-words ${isUser ? "prose-invert" : "dark:prose-invert"}`, children: [
2481
+ !isUser && structuredContent.payload && /* @__PURE__ */ jsx12(
2444
2482
  UIDispatcher,
2445
2483
  {
2446
2484
  rawContent: structuredContent.payload,
@@ -2451,19 +2489,14 @@ ${match.trim()}
2451
2489
  viewportSize
2452
2490
  }
2453
2491
  ),
2454
- !shouldRenderStructuredOnly && /* @__PURE__ */ jsx13(ReactMarkdown, { components: markdownComponents, children: processedMarkdown }),
2455
- isStreaming && /* @__PURE__ */ jsxs12("span", { className: "inline-flex items-center gap-1.5 ml-2 text-emerald-500 animate-pulse align-middle text-xs font-medium", children: [
2456
- /* @__PURE__ */ jsx13(
2457
- HourglassLoader_default,
2458
- {
2459
- size: 18,
2460
- primaryColor,
2461
- accentColor,
2462
- glow: false
2463
- }
2464
- ),
2465
- "Thinking..."
2466
- ] })
2492
+ !shouldRenderStructuredOnly && /* @__PURE__ */ jsx12(ReactMarkdown, { components: markdownComponents, children: processedMarkdown }),
2493
+ isStreaming && /* @__PURE__ */ jsx12(
2494
+ "span",
2495
+ {
2496
+ className: "inline-block w-2.5 h-4 ml-1.5 animate-[pulse_1.2s_infinite] align-middle rounded-sm",
2497
+ style: { backgroundColor: primaryColor }
2498
+ }
2499
+ )
2467
2500
  ] })
2468
2501
  ]
2469
2502
  }
@@ -2478,7 +2511,7 @@ ${match.trim()}
2478
2511
  )
2479
2512
  );
2480
2513
  if (hasProductSource) {
2481
- return /* @__PURE__ */ jsx13("div", { className: "w-full mt-3", children: /* @__PURE__ */ jsx13(
2514
+ return /* @__PURE__ */ jsx12("div", { className: "w-full mt-3", children: /* @__PURE__ */ jsx12(
2482
2515
  VisualizationRenderer,
2483
2516
  {
2484
2517
  data: { type: "product_carousel", title: "Recommended Products", description: "Loading...", data: [] },
@@ -2496,7 +2529,7 @@ ${match.trim()}
2496
2529
  const isNegativeOrFallbackText = textContent.toLowerCase().includes("cannot answer") || textContent.toLowerCase().includes("no relevant data") || textContent.toLowerCase().includes("no data available") || typeof ui.title === "string" && ui.title.toLowerCase().includes("no data") || typeof ui.description === "string" && ui.description.toLowerCase().includes("no relevant data");
2497
2530
  const shouldShow = !isNegativeOrFallbackText && (ui.type === "table" || !["text", "table"].includes(ui.type) || ui.type === "text" && !hasRichUI && allProducts.length === 0 && textContent && !processedMarkdown.toLowerCase().includes(textContent.trim().toLowerCase()));
2498
2531
  if (!shouldShow) return null;
2499
- return /* @__PURE__ */ jsx13("div", { className: "w-full mt-3", children: /* @__PURE__ */ jsx13(
2532
+ return /* @__PURE__ */ jsx12("div", { className: "w-full mt-3", children: /* @__PURE__ */ jsx12(
2500
2533
  VisualizationRenderer,
2501
2534
  {
2502
2535
  data: ui,
@@ -2507,7 +2540,7 @@ ${match.trim()}
2507
2540
  }
2508
2541
  ) });
2509
2542
  })(),
2510
- !isUser && !hasRichUI && !shouldSuppressProductCarousel && allProducts.length > 0 && /* @__PURE__ */ jsx13("div", { className: "w-full mt-1", children: /* @__PURE__ */ jsx13(
2543
+ !isUser && !hasRichUI && !shouldSuppressProductCarousel && allProducts.length > 0 && /* @__PURE__ */ jsx12("div", { className: "w-full mt-1", children: /* @__PURE__ */ jsx12(
2511
2544
  ProductCarousel,
2512
2545
  {
2513
2546
  products: allProducts,
@@ -2515,43 +2548,55 @@ ${match.trim()}
2515
2548
  onAddToCart
2516
2549
  }
2517
2550
  ) }),
2518
- !isUser && /* @__PURE__ */ jsxs12("div", { className: "flex items-center gap-4 mt-1 w-full flex-wrap", children: [
2519
- sources && sources.length > 0 && /* @__PURE__ */ jsxs12(
2551
+ !isUser && /* @__PURE__ */ jsxs11("div", { className: `flex items-center gap-3 mt-1.5 w-full flex-wrap ${isCompact ? "gap-2" : "gap-3"}`, children: [
2552
+ sources && sources.length > 0 && /* @__PURE__ */ jsxs11(
2520
2553
  "button",
2521
2554
  {
2522
2555
  onClick: () => setShowSources((s) => !s),
2523
- className: "text-[11px] text-indigo-400 hover:text-indigo-300 transition-colors flex items-center gap-1",
2556
+ className: "text-[11px] text-indigo-400 hover:text-indigo-300 dark:text-indigo-400/70 dark:hover:text-indigo-300 transition-colors flex items-center gap-1 font-medium",
2524
2557
  children: [
2525
- showSources ? /* @__PURE__ */ jsx13(ChevronDown4, { className: "w-3 h-3" }) : /* @__PURE__ */ jsx13(ChevronRight4, { className: "w-3 h-3" }),
2558
+ showSources ? /* @__PURE__ */ jsx12(ChevronDown4, { className: "w-3 h-3" }) : /* @__PURE__ */ jsx12(ChevronRight4, { className: "w-3 h-3" }),
2526
2559
  sources.length,
2527
2560
  " source",
2528
- sources.length !== 1 ? "s" : "",
2529
- " used"
2561
+ sources.length !== 1 ? "s" : ""
2530
2562
  ]
2531
2563
  }
2532
2564
  ),
2533
- message.trace && /* @__PURE__ */ jsxs12(
2565
+ message.trace && /* @__PURE__ */ jsxs11(
2534
2566
  "button",
2535
2567
  {
2536
2568
  onClick: () => setShowTrace((t) => !t),
2537
- className: "text-[11px] text-emerald-500 hover:text-emerald-400 transition-colors flex items-center gap-1",
2569
+ className: "text-[11px] text-emerald-500/70 hover:text-emerald-400 dark:text-emerald-500/50 dark:hover:text-emerald-400 transition-colors flex items-center gap-1 font-medium",
2538
2570
  children: [
2539
- /* @__PURE__ */ jsx13(Activity, { className: "w-3 h-3" }),
2540
- showTrace ? "Hide Trace" : "Trace"
2571
+ /* @__PURE__ */ jsx12(Activity, { className: "w-3 h-3" }),
2572
+ showTrace ? "Hide trace" : "Trace"
2541
2573
  ]
2542
2574
  }
2575
+ ),
2576
+ /* @__PURE__ */ jsx12("div", { className: "flex-1" }),
2577
+ timeLabel && isCompleted && /* @__PURE__ */ jsxs11("span", { className: "flex items-center gap-1 text-[10px] text-slate-300 dark:text-white/20 font-medium select-none", children: [
2578
+ /* @__PURE__ */ jsx12(Clock2, { className: "w-2.5 h-2.5" }),
2579
+ timeLabel
2580
+ ] }),
2581
+ isCompleted && onFeedback && message.id && /* @__PURE__ */ jsx12(
2582
+ FeedbackBar,
2583
+ {
2584
+ messageId: message.id,
2585
+ onFeedback,
2586
+ primaryColor
2587
+ }
2543
2588
  )
2544
2589
  ] }),
2545
- /* @__PURE__ */ jsxs12("div", { className: "w-full flex flex-col gap-2 min-w-0", children: [
2546
- showSources && sources && sources.length > 0 && /* @__PURE__ */ jsx13("div", { className: "mt-1 flex flex-col gap-2", children: sources.map((src, i) => /* @__PURE__ */ jsx13(SourceCard, { source: src, index: i }, src.id)) }),
2547
- showTrace && message.trace && /* @__PURE__ */ jsx13(ObservabilityPanel, { trace: message.trace, primaryColor })
2590
+ /* @__PURE__ */ jsxs11("div", { className: "w-full flex flex-col gap-2 min-w-0", children: [
2591
+ showSources && sources && sources.length > 0 && /* @__PURE__ */ jsx12("div", { className: "mt-1 flex flex-col gap-2", children: sources.map((src, i) => /* @__PURE__ */ jsx12(SourceCard, { source: src, index: i }, src.id)) }),
2592
+ showTrace && message.trace && /* @__PURE__ */ jsx12(ObservabilityPanel, { trace: message.trace, primaryColor })
2548
2593
  ] })
2549
2594
  ] })
2550
2595
  ] });
2551
2596
  }
2552
2597
 
2553
2598
  // src/hooks/useRagChat.ts
2554
- import { useState as useState5, useCallback, useRef as useRef4, useEffect as useEffect4 } from "react";
2599
+ import { useState as useState5, useCallback, useRef as useRef5, useEffect as useEffect4 } from "react";
2555
2600
 
2556
2601
  // src/hooks/useStoredMessages.ts
2557
2602
  import * as React11 from "react";
@@ -2571,9 +2616,19 @@ function readStoredMessages(storageKey) {
2571
2616
  }
2572
2617
  }
2573
2618
  function useStoredMessages(storageKey, persist) {
2574
- const [messages, setMessages] = React11.useState(() => persist ? readStoredMessages(storageKey) : []);
2619
+ const [messages, setMessages] = React11.useState([]);
2620
+ const isLoaded = React11.useRef(false);
2621
+ React11.useEffect(() => {
2622
+ if (persist) {
2623
+ const loaded = readStoredMessages(storageKey);
2624
+ if (loaded.length > 0) {
2625
+ setMessages(loaded);
2626
+ }
2627
+ }
2628
+ isLoaded.current = true;
2629
+ }, [storageKey, persist]);
2575
2630
  React11.useEffect(() => {
2576
- if (!persist || typeof window === "undefined") {
2631
+ if (!isLoaded.current || !persist || typeof window === "undefined") {
2577
2632
  return;
2578
2633
  }
2579
2634
  if (messages.length === 0) {
@@ -2605,6 +2660,7 @@ function parseSseChunk(raw) {
2605
2660
  function useRagChat(projectId, options = {}) {
2606
2661
  const {
2607
2662
  apiUrl = "/api/chat",
2663
+ retrivoraApiBase = "/api/retrivora",
2608
2664
  namespace,
2609
2665
  persist = true,
2610
2666
  onReply,
@@ -2614,21 +2670,22 @@ function useRagChat(projectId, options = {}) {
2614
2670
  const [messages, setMessages] = useStoredMessages(storageKey, persist);
2615
2671
  const [isLoading, setIsLoading] = useState5(false);
2616
2672
  const [error, setError] = useState5(null);
2617
- const lastInputRef = useRef4("");
2618
- const messagesRef = useRef4(messages);
2619
- const abortControllerRef = useRef4(null);
2673
+ const lastInputRef = useRef5("");
2674
+ const messagesRef = useRef5(messages);
2675
+ const abortControllerRef = useRef5(null);
2620
2676
  useEffect4(() => {
2621
2677
  messagesRef.current = messages;
2622
2678
  }, [messages]);
2623
2679
  const sendMessage = useCallback(
2624
2680
  async (text, opts) => {
2625
- var _a, _b;
2681
+ var _a, _b, _c;
2626
2682
  const trimmed = text.trim();
2627
2683
  if (!trimmed || isLoading) return;
2628
2684
  lastInputRef.current = trimmed;
2685
+ const userMsgId = (opts == null ? void 0 : opts.skipUserMessage) ? ((_a = messagesRef.current.filter((m) => m.role === "user").pop()) == null ? void 0 : _a.id) || `user_${Date.now()}` : `user_${Date.now()}`;
2629
2686
  if (!(opts == null ? void 0 : opts.skipUserMessage)) {
2630
2687
  const userMessage = {
2631
- id: `user_${Date.now()}`,
2688
+ id: userMsgId,
2632
2689
  role: "user",
2633
2690
  content: trimmed,
2634
2691
  createdAt: (/* @__PURE__ */ new Date()).toISOString()
@@ -2644,14 +2701,20 @@ function useRagChat(projectId, options = {}) {
2644
2701
  abortControllerRef.current = controller;
2645
2702
  try {
2646
2703
  const history = messagesRef.current.map(({ role, content }) => ({ role, content }));
2704
+ const assistantMessageId = `assistant_${Date.now()}`;
2647
2705
  const response = await fetch(apiUrl, {
2648
2706
  method: "POST",
2649
- headers: { "Content-Type": "application/json" },
2707
+ headers: __spreadValues({
2708
+ "Content-Type": "application/json"
2709
+ }, options.headers || {}),
2650
2710
  signal: controller.signal,
2651
2711
  body: JSON.stringify({
2652
2712
  message: trimmed,
2653
2713
  history,
2654
- namespace: namespace != null ? namespace : projectId
2714
+ namespace: namespace != null ? namespace : projectId,
2715
+ sessionId: options.sessionId || "default",
2716
+ messageId: assistantMessageId,
2717
+ userMessageId: userMsgId
2655
2718
  })
2656
2719
  });
2657
2720
  if (!response.ok) {
@@ -2692,7 +2755,6 @@ function useRagChat(projectId, options = {}) {
2692
2755
  requestAnimationFrame(() => flushTextUpdate(msgId));
2693
2756
  }
2694
2757
  };
2695
- const assistantMessageId = `assistant_${Date.now()}`;
2696
2758
  setMessages((prev) => [
2697
2759
  ...prev,
2698
2760
  {
@@ -2706,55 +2768,38 @@ function useRagChat(projectId, options = {}) {
2706
2768
  const { done, value } = await reader.read();
2707
2769
  if (done) break;
2708
2770
  buffer += decoder.decode(value, { stream: true });
2709
- const lastBoundary = buffer.lastIndexOf("\n\n");
2710
- if (lastBoundary === -1) continue;
2711
- const complete = buffer.slice(0, lastBoundary + 2);
2712
- buffer = buffer.slice(lastBoundary + 2);
2713
- let hasNonTextFrame = false;
2714
- for (const frame of parseSseChunk(complete)) {
2715
- if (frame.type === "text" && frame.text) {
2771
+ const frames = parseSseChunk(buffer);
2772
+ const lastIndex = buffer.lastIndexOf("\n\n");
2773
+ if (lastIndex !== -1) {
2774
+ buffer = buffer.slice(lastIndex + 2);
2775
+ }
2776
+ for (const frame of frames) {
2777
+ if (frame.type === "text") {
2716
2778
  assistantContent += frame.text;
2717
2779
  pendingContentRef.current = assistantContent;
2718
2780
  scheduleFlush(assistantMessageId);
2719
- } else if (frame.type === "thinking" && frame.text) {
2781
+ } else if (frame.type === "thinking") {
2720
2782
  thinkingContent += frame.text;
2721
2783
  pendingThinkingRef.current = thinkingContent;
2722
2784
  scheduleFlush(assistantMessageId);
2723
2785
  } else if (frame.type === "metadata") {
2724
- sources = (_a = frame.sources) != null ? _a : [];
2786
+ sources = (_b = frame.sources) != null ? _b : [];
2725
2787
  thinkingMs = frame.thinkingMs;
2726
- hasNonTextFrame = true;
2727
2788
  } else if (frame.type === "ui_transformation") {
2728
2789
  uiTransformation = frame.data;
2729
- hasNonTextFrame = true;
2730
2790
  } else if (frame.type === "observability") {
2731
2791
  trace = frame.data;
2732
- hasNonTextFrame = true;
2733
2792
  } else if (frame.type === "error") {
2734
- setError(frame.error || "Stream error");
2793
+ throw new Error(frame.error);
2735
2794
  }
2736
2795
  }
2737
- if (hasNonTextFrame) {
2738
- pendingFlush = false;
2739
- setMessages(
2740
- (prev) => prev.map(
2741
- (msg) => msg.id === assistantMessageId ? __spreadProps(__spreadValues({}, msg), {
2742
- content: assistantContent,
2743
- thinking: thinkingContent || void 0,
2744
- thinkingMs,
2745
- sources: sources.length > 0 ? sources : msg.sources,
2746
- uiTransformation: uiTransformation || msg.uiTransformation
2747
- }) : msg
2748
- )
2749
- );
2750
- }
2751
2796
  }
2752
2797
  if (buffer.trim()) {
2753
2798
  for (const frame of parseSseChunk(buffer)) {
2754
2799
  if (frame.type === "text" && frame.text) assistantContent += frame.text;
2755
2800
  else if (frame.type === "thinking" && frame.text) thinkingContent += frame.text;
2756
2801
  else if (frame.type === "metadata") {
2757
- sources = (_b = frame.sources) != null ? _b : [];
2802
+ sources = (_c = frame.sources) != null ? _c : [];
2758
2803
  thinkingMs = frame.thinkingMs;
2759
2804
  } else if (frame.type === "observability") trace = frame.data;
2760
2805
  }
@@ -2787,7 +2832,7 @@ function useRagChat(projectId, options = {}) {
2787
2832
  abortControllerRef.current = null;
2788
2833
  }
2789
2834
  },
2790
- [apiUrl, isLoading, namespace, onError, onReply, projectId, setMessages]
2835
+ [apiUrl, isLoading, namespace, onError, onReply, projectId, setMessages, options.headers, options.sessionId]
2791
2836
  );
2792
2837
  const clear = useCallback(() => {
2793
2838
  setMessages([]);
@@ -2809,6 +2854,70 @@ function useRagChat(projectId, options = {}) {
2809
2854
  }
2810
2855
  setIsLoading(false);
2811
2856
  }, []);
2857
+ const loadHistory = useCallback(async (sessionId) => {
2858
+ setIsLoading(true);
2859
+ setError(null);
2860
+ try {
2861
+ const res = await fetch(`${retrivoraApiBase}/history?sessionId=${encodeURIComponent(sessionId)}`);
2862
+ if (!res.ok) throw new Error(`Failed to load history: ${res.statusText}`);
2863
+ const data = await res.json();
2864
+ const loadedMessages = (data.history || []).map((msg) => ({
2865
+ id: msg.id,
2866
+ role: msg.role,
2867
+ content: msg.content,
2868
+ sources: msg.sources,
2869
+ uiTransformation: msg.uiTransformation,
2870
+ trace: msg.trace,
2871
+ createdAt: msg.createdAt
2872
+ }));
2873
+ setMessages(loadedMessages);
2874
+ } catch (err) {
2875
+ const msg = err instanceof Error ? err.message : "Failed to load history";
2876
+ setError(msg);
2877
+ onError == null ? void 0 : onError(msg);
2878
+ } finally {
2879
+ setIsLoading(false);
2880
+ }
2881
+ }, [retrivoraApiBase, onError, setMessages]);
2882
+ const clearHistory = useCallback(async (sessionId) => {
2883
+ setIsLoading(true);
2884
+ setError(null);
2885
+ try {
2886
+ const res = await fetch(`${retrivoraApiBase}/history/clear`, {
2887
+ method: "POST",
2888
+ headers: { "Content-Type": "application/json" },
2889
+ body: JSON.stringify({ sessionId })
2890
+ });
2891
+ if (!res.ok) throw new Error(`Failed to clear history: ${res.statusText}`);
2892
+ setMessages([]);
2893
+ if (persist) localStorage.removeItem(storageKey);
2894
+ } catch (err) {
2895
+ const msg = err instanceof Error ? err.message : "Failed to clear history";
2896
+ setError(msg);
2897
+ onError == null ? void 0 : onError(msg);
2898
+ } finally {
2899
+ setIsLoading(false);
2900
+ }
2901
+ }, [retrivoraApiBase, onError, persist, setMessages, storageKey]);
2902
+ const submitFeedback = useCallback(async (messageId, rating, comment) => {
2903
+ try {
2904
+ const res = await fetch(`${retrivoraApiBase}/feedback`, {
2905
+ method: "POST",
2906
+ headers: { "Content-Type": "application/json" },
2907
+ body: JSON.stringify({
2908
+ messageId,
2909
+ sessionId: options.sessionId || "default",
2910
+ rating,
2911
+ comment
2912
+ })
2913
+ });
2914
+ if (!res.ok) throw new Error(`Failed to submit feedback: ${res.statusText}`);
2915
+ } catch (err) {
2916
+ const msg = err instanceof Error ? err.message : "Failed to submit feedback";
2917
+ onError == null ? void 0 : onError(msg);
2918
+ throw err;
2919
+ }
2920
+ }, [retrivoraApiBase, onError, options.sessionId]);
2812
2921
  return {
2813
2922
  messages,
2814
2923
  isLoading,
@@ -2817,12 +2926,15 @@ function useRagChat(projectId, options = {}) {
2817
2926
  clear,
2818
2927
  retry,
2819
2928
  setMessages,
2820
- stop
2929
+ stop,
2930
+ loadHistory,
2931
+ clearHistory,
2932
+ submitFeedback
2821
2933
  };
2822
2934
  }
2823
2935
 
2824
2936
  // src/components/ChatWindow.tsx
2825
- import { jsx as jsx14, jsxs as jsxs13 } from "react/jsx-runtime";
2937
+ import { jsx as jsx13, jsxs as jsxs12 } from "react/jsx-runtime";
2826
2938
  function ChatWindow({
2827
2939
  className = "",
2828
2940
  style,
@@ -2833,24 +2945,30 @@ function ChatWindow({
2833
2945
  isResized = false,
2834
2946
  onMaximize,
2835
2947
  isMaximized = false,
2836
- onAddToCart
2948
+ onAddToCart,
2949
+ apiUrl,
2950
+ retrivoraApiBase,
2951
+ headers
2837
2952
  }) {
2838
2953
  var _a;
2839
2954
  const { ui, projectId } = useConfig();
2840
2955
  const [input, setInput] = useState6("");
2841
2956
  const [mounted, setMounted] = useState6(false);
2842
2957
  const [viewportSize, setViewportSize] = useState6("large");
2843
- const windowRef = useRef5(null);
2844
- const bottomRef = useRef5(null);
2845
- const inputRef = useRef5(null);
2846
- const { messages, send, clear, isLoading, error, stop } = useRagChat(projectId, {
2847
- namespace: projectId
2958
+ const windowRef = useRef6(null);
2959
+ const bottomRef = useRef6(null);
2960
+ const inputRef = useRef6(null);
2961
+ const { messages, send, clear, isLoading, error, stop, submitFeedback } = useRagChat(projectId, {
2962
+ namespace: projectId,
2963
+ apiUrl,
2964
+ retrivoraApiBase,
2965
+ headers
2848
2966
  });
2849
2967
  const [suggestions, setSuggestions] = useState6([]);
2850
2968
  const [isSuggesting, setIsSuggesting] = useState6(false);
2851
2969
  const [isListening, setIsListening] = useState6(false);
2852
2970
  const [isUploadModalOpen, setIsUploadModalOpen] = useState6(false);
2853
- const recognitionRef = useRef5(null);
2971
+ const recognitionRef = useRef6(null);
2854
2972
  useEffect5(() => {
2855
2973
  if (typeof window !== "undefined") {
2856
2974
  const win = window;
@@ -2976,85 +3094,85 @@ function ChatWindow({
2976
3094
  }, 800);
2977
3095
  return () => clearTimeout(timer);
2978
3096
  }, [input, projectId]);
2979
- return /* @__PURE__ */ jsxs13(
3097
+ return /* @__PURE__ */ jsxs12(
2980
3098
  "div",
2981
3099
  {
2982
3100
  ref: windowRef,
2983
3101
  className: `relative flex flex-col border border-slate-200 dark:border-white/10 shadow-2xl transition-all duration-300 ${currentRadius} ${isGlass ? "bg-white/90 dark:bg-[#0f0f1a]/90 backdrop-blur-xl" : "bg-white dark:bg-[#0f0f1a]"} ${className}`,
2984
3102
  style: __spreadValues({ "--primary": ui.primaryColor, "--accent": ui.accentColor }, style),
2985
3103
  children: [
2986
- onResizeStart && /* @__PURE__ */ jsx14(
3104
+ onResizeStart && /* @__PURE__ */ jsx13(
2987
3105
  "div",
2988
3106
  {
2989
3107
  onMouseDown: onResizeStart,
2990
3108
  className: "absolute top-0 left-0 w-6 h-6 cursor-nw-resize z-[100] group flex items-start justify-start p-1",
2991
3109
  title: "Drag to resize",
2992
- children: /* @__PURE__ */ jsx14("div", { className: "w-2.5 h-2.5 border-t-2 border-l-2 border-slate-300 dark:border-white/20 group-hover:border-slate-500 dark:group-hover:border-white/50 transition-colors rounded-tl-[2px]" })
3110
+ children: /* @__PURE__ */ jsx13("div", { className: "w-2.5 h-2.5 border-t-2 border-l-2 border-slate-300 dark:border-white/20 group-hover:border-slate-500 dark:group-hover:border-white/50 transition-colors rounded-tl-[2px]" })
2993
3111
  }
2994
3112
  ),
2995
- /* @__PURE__ */ jsxs13(
3113
+ /* @__PURE__ */ jsxs12(
2996
3114
  "div",
2997
3115
  {
2998
3116
  className: "flex items-center justify-between px-5 py-4 border-b border-slate-200 dark:border-white/10",
2999
3117
  style: { background: `linear-gradient(135deg, ${ui.primaryColor}15, ${ui.accentColor}10)` },
3000
3118
  children: [
3001
- /* @__PURE__ */ jsxs13("div", { className: "flex items-center gap-3", children: [
3119
+ /* @__PURE__ */ jsxs12("div", { className: "flex items-center gap-3", children: [
3002
3120
  ui.logoUrl ? (
3003
3121
  // eslint-disable-next-line @next/next/no-img-element
3004
- /* @__PURE__ */ jsx14("img", { src: ui.logoUrl, alt: "logo", className: "w-8 h-8 rounded-lg object-cover" })
3005
- ) : /* @__PURE__ */ jsx14(
3122
+ /* @__PURE__ */ jsx13("img", { src: ui.logoUrl, alt: "logo", className: "w-8 h-8 rounded-lg object-cover" })
3123
+ ) : /* @__PURE__ */ jsx13(
3006
3124
  "div",
3007
3125
  {
3008
3126
  className: `w-9 h-9 flex items-center justify-center shadow-md ${ui.borderRadius === "full" ? "rounded-full" : "rounded-xl"}`,
3009
3127
  style: { background: `linear-gradient(135deg, ${ui.primaryColor}, ${ui.accentColor})` },
3010
- children: /* @__PURE__ */ jsx14(Bot2, { className: "w-5 h-5 text-white" })
3128
+ children: /* @__PURE__ */ jsx13(Bot2, { className: "w-5 h-5 text-white" })
3011
3129
  }
3012
3130
  ),
3013
- /* @__PURE__ */ jsxs13("div", { children: [
3014
- /* @__PURE__ */ jsx14("h2", { className: "text-slate-900 dark:text-white font-semibold text-sm leading-tight", children: ui.title }),
3015
- ui.poweredBy && /* @__PURE__ */ jsx14("p", { className: "text-slate-500 dark:text-white/40 text-[11px] leading-tight", children: `Powered by ${ui.poweredBy}` })
3131
+ /* @__PURE__ */ jsxs12("div", { children: [
3132
+ /* @__PURE__ */ jsx13("h2", { className: "text-slate-900 dark:text-white font-semibold text-sm leading-tight", children: ui.title }),
3133
+ ui.poweredBy && /* @__PURE__ */ jsx13("p", { className: "text-slate-500 dark:text-white/40 text-[11px] leading-tight", children: `Powered by ${ui.poweredBy}` })
3016
3134
  ] })
3017
3135
  ] }),
3018
- /* @__PURE__ */ jsxs13("div", { className: "flex items-center gap-1.5", children: [
3019
- /* @__PURE__ */ jsxs13("span", { className: "flex items-center gap-1 text-[10px] text-emerald-500 dark:text-emerald-400 mr-2", children: [
3020
- /* @__PURE__ */ jsx14("span", { className: "w-1.5 h-1.5 rounded-full bg-emerald-500 dark:bg-emerald-400 animate-pulse" }),
3136
+ /* @__PURE__ */ jsxs12("div", { className: "flex items-center gap-1.5", children: [
3137
+ /* @__PURE__ */ jsxs12("span", { className: "flex items-center gap-1 text-[10px] text-emerald-500 dark:text-emerald-400 mr-2", children: [
3138
+ /* @__PURE__ */ jsx13("span", { className: "w-1.5 h-1.5 rounded-full bg-emerald-500 dark:bg-emerald-400 animate-pulse" }),
3021
3139
  "Online"
3022
3140
  ] }),
3023
- /* @__PURE__ */ jsxs13("div", { className: "flex items-center bg-slate-100/50 dark:bg-white/5 rounded-lg p-0.5 border border-slate-200/50 dark:border-white/5", children: [
3024
- mounted && messages.length > 0 && /* @__PURE__ */ jsx14(
3141
+ /* @__PURE__ */ jsxs12("div", { className: "flex items-center bg-slate-100/50 dark:bg-white/5 rounded-lg p-0.5 border border-slate-200/50 dark:border-white/5", children: [
3142
+ mounted && messages.length > 0 && /* @__PURE__ */ jsx13(
3025
3143
  "button",
3026
3144
  {
3027
3145
  onClick: clearHistory,
3028
3146
  title: "Clear conversation",
3029
3147
  className: "w-7 h-7 rounded-md flex items-center justify-center text-slate-400 hover:text-rose-500 dark:text-white/40 dark:hover:text-rose-400 hover:bg-white dark:hover:bg-white/10 transition-all cursor-pointer",
3030
- children: /* @__PURE__ */ jsx14(Trash2, { className: "w-3.5 h-3.5" })
3148
+ children: /* @__PURE__ */ jsx13(Trash2, { className: "w-3.5 h-3.5" })
3031
3149
  }
3032
3150
  ),
3033
- isResized && onResetResize && /* @__PURE__ */ jsx14(
3151
+ isResized && onResetResize && /* @__PURE__ */ jsx13(
3034
3152
  "button",
3035
3153
  {
3036
3154
  onClick: onResetResize,
3037
3155
  title: "Reset to default size",
3038
3156
  className: "w-7 h-7 rounded-md flex items-center justify-center text-slate-400 hover:text-blue-500 dark:text-white/40 dark:hover:text-blue-400 hover:bg-white dark:hover:bg-white/10 transition-all cursor-pointer",
3039
- children: /* @__PURE__ */ jsx14(RotateCcw, { className: "w-3.5 h-3.5" })
3157
+ children: /* @__PURE__ */ jsx13(RotateCcw, { className: "w-3.5 h-3.5" })
3040
3158
  }
3041
3159
  ),
3042
- onMaximize && /* @__PURE__ */ jsx14(
3160
+ onMaximize && /* @__PURE__ */ jsx13(
3043
3161
  "button",
3044
3162
  {
3045
3163
  onClick: onMaximize,
3046
3164
  title: isMaximized ? "Minimize" : "Maximize",
3047
3165
  className: "w-7 h-7 rounded-md flex items-center justify-center text-slate-400 hover:text-blue-500 dark:text-white/40 dark:hover:text-blue-400 hover:bg-white dark:hover:bg-white/10 transition-all cursor-pointer",
3048
- children: isMaximized ? /* @__PURE__ */ jsx14(Minimize2, { className: "w-3.5 h-3.5" }) : /* @__PURE__ */ jsx14(Maximize2, { className: "w-3.5 h-3.5" })
3166
+ children: isMaximized ? /* @__PURE__ */ jsx13(Minimize2, { className: "w-3.5 h-3.5" }) : /* @__PURE__ */ jsx13(Maximize2, { className: "w-3.5 h-3.5" })
3049
3167
  }
3050
3168
  ),
3051
- showClose && onClose && /* @__PURE__ */ jsx14(
3169
+ showClose && onClose && /* @__PURE__ */ jsx13(
3052
3170
  "button",
3053
3171
  {
3054
3172
  onClick: onClose,
3055
3173
  title: "Close chat",
3056
3174
  className: "w-7 h-7 rounded-md flex items-center justify-center text-slate-400 hover:text-slate-600 dark:text-white/40 dark:hover:text-white/70 hover:bg-white dark:hover:bg-white/10 transition-all cursor-pointer",
3057
- children: /* @__PURE__ */ jsx14(X2, { className: "w-4 h-4" })
3175
+ children: /* @__PURE__ */ jsx13(X2, { className: "w-4 h-4" })
3058
3176
  }
3059
3177
  )
3060
3178
  ] })
@@ -3062,24 +3180,24 @@ function ChatWindow({
3062
3180
  ]
3063
3181
  }
3064
3182
  ),
3065
- /* @__PURE__ */ jsxs13("div", { className: "flex-1 overflow-y-auto px-4 py-4 space-y-5 scrollbar-thin scrollbar-thumb-slate-200 dark:scrollbar-thumb-white/10 scrollbar-track-transparent min-h-0 bg-slate-50 dark:bg-transparent", children: [
3183
+ /* @__PURE__ */ jsxs12("div", { className: "flex-1 overflow-y-auto px-4 py-4 space-y-5 scrollbar-thin scrollbar-thumb-slate-200 dark:scrollbar-thumb-white/10 scrollbar-track-transparent min-h-0 bg-slate-50 dark:bg-transparent", children: [
3066
3184
  !mounted || isEmpty ? (
3067
3185
  /* Welcome state */
3068
- /* @__PURE__ */ jsxs13("div", { className: "h-full flex flex-col items-center justify-center text-center gap-4 px-6 py-12", children: [
3069
- /* @__PURE__ */ jsx14(
3186
+ /* @__PURE__ */ jsxs12("div", { className: "h-full flex flex-col items-center justify-center text-center gap-4 px-6 py-12", children: [
3187
+ /* @__PURE__ */ jsx13(
3070
3188
  "div",
3071
3189
  {
3072
3190
  className: `w-16 h-16 flex items-center justify-center shadow-lg ${ui.borderRadius === "full" ? "rounded-full" : "rounded-2xl"}`,
3073
3191
  style: { background: `linear-gradient(135deg, ${ui.primaryColor}, ${ui.accentColor})` },
3074
- children: /* @__PURE__ */ jsx14(Sparkles, { className: "w-8 h-8 text-white" })
3192
+ children: /* @__PURE__ */ jsx13(Sparkles, { className: "w-8 h-8 text-white" })
3075
3193
  }
3076
3194
  ),
3077
- /* @__PURE__ */ jsxs13("div", { children: [
3078
- /* @__PURE__ */ jsx14("p", { className: "text-slate-800 dark:text-white/80 font-medium leading-relaxed", children: ui.welcomeMessage }),
3079
- /* @__PURE__ */ jsx14("p", { className: "text-slate-500 dark:text-white/30 text-sm mt-2", children: "Ask a question to get started" })
3195
+ /* @__PURE__ */ jsxs12("div", { children: [
3196
+ /* @__PURE__ */ jsx13("p", { className: "text-slate-800 dark:text-white/80 font-medium leading-relaxed", children: ui.welcomeMessage }),
3197
+ /* @__PURE__ */ jsx13("p", { className: "text-slate-500 dark:text-white/30 text-sm mt-2", children: "Ask a question to get started" })
3080
3198
  ] }),
3081
- /* @__PURE__ */ jsx14("div", { className: "flex flex-wrap gap-2 justify-center mt-2", children: CHAT_SUGGESTIONS.map(
3082
- (suggestion) => /* @__PURE__ */ jsx14(
3199
+ /* @__PURE__ */ jsx13("div", { className: "flex flex-wrap gap-2 justify-center mt-2", children: CHAT_SUGGESTIONS.map(
3200
+ (suggestion) => /* @__PURE__ */ jsx13(
3083
3201
  "button",
3084
3202
  {
3085
3203
  onClick: () => {
@@ -3094,7 +3212,7 @@ function ChatWindow({
3094
3212
  )
3095
3213
  ) })
3096
3214
  ] })
3097
- ) : messages.map((msg, index) => /* @__PURE__ */ jsx14(
3215
+ ) : messages.map((msg, index) => /* @__PURE__ */ jsx13(
3098
3216
  MessageBubble,
3099
3217
  {
3100
3218
  message: msg,
@@ -3103,11 +3221,12 @@ function ChatWindow({
3103
3221
  primaryColor: ui.primaryColor,
3104
3222
  accentColor: ui.accentColor,
3105
3223
  onAddToCart,
3106
- viewportSize
3224
+ viewportSize,
3225
+ onFeedback: submitFeedback
3107
3226
  },
3108
3227
  msg.id
3109
3228
  )),
3110
- isLoading && ((_a = messages[messages.length - 1]) == null ? void 0 : _a.role) !== "assistant" && /* @__PURE__ */ jsx14(
3229
+ isLoading && ((_a = messages[messages.length - 1]) == null ? void 0 : _a.role) !== "assistant" && /* @__PURE__ */ jsx13(
3111
3230
  MessageBubble,
3112
3231
  {
3113
3232
  message: { id: "loading", role: "assistant", content: "", createdAt: (/* @__PURE__ */ new Date()).toISOString() },
@@ -3118,22 +3237,22 @@ function ChatWindow({
3118
3237
  viewportSize
3119
3238
  }
3120
3239
  ),
3121
- error && /* @__PURE__ */ jsxs13("div", { className: "flex items-center gap-2 text-rose-500 dark:text-rose-400 text-sm bg-rose-50 dark:bg-rose-400/10 border border-rose-200 dark:border-rose-400/20 rounded-xl px-4 py-3", children: [
3122
- /* @__PURE__ */ jsx14(TriangleAlert, { className: "w-4 h-4 flex-shrink-0" }),
3123
- /* @__PURE__ */ jsx14("span", { children: error })
3240
+ error && /* @__PURE__ */ jsxs12("div", { className: "flex items-center gap-2 text-rose-500 dark:text-rose-400 text-sm bg-rose-50 dark:bg-rose-400/10 border border-rose-200 dark:border-rose-400/20 rounded-xl px-4 py-3", children: [
3241
+ /* @__PURE__ */ jsx13(TriangleAlert, { className: "w-4 h-4 flex-shrink-0" }),
3242
+ /* @__PURE__ */ jsx13("span", { children: error })
3124
3243
  ] }),
3125
- /* @__PURE__ */ jsx14("div", { ref: bottomRef })
3244
+ /* @__PURE__ */ jsx13("div", { ref: bottomRef })
3126
3245
  ] }),
3127
- isUploadModalOpen && /* @__PURE__ */ jsx14("div", { className: "absolute inset-0 z-50 flex items-center justify-center p-4 bg-slate-900/50 backdrop-blur-sm rounded-inherit", children: /* @__PURE__ */ jsxs13("div", { className: "relative w-full max-w-md bg-white dark:bg-[#0f0f1a] rounded-2xl shadow-2xl overflow-hidden animate-in zoom-in-95 duration-200", children: [
3128
- /* @__PURE__ */ jsx14(
3246
+ isUploadModalOpen && /* @__PURE__ */ jsx13("div", { className: "absolute inset-0 z-50 flex items-center justify-center p-4 bg-slate-900/50 backdrop-blur-sm rounded-inherit", children: /* @__PURE__ */ jsxs12("div", { className: "relative w-full max-w-md bg-white dark:bg-[#0f0f1a] rounded-2xl shadow-2xl overflow-hidden animate-in zoom-in-95 duration-200", children: [
3247
+ /* @__PURE__ */ jsx13(
3129
3248
  "button",
3130
3249
  {
3131
3250
  onClick: () => setIsUploadModalOpen(false),
3132
3251
  className: "absolute top-4 right-4 p-1.5 rounded-lg text-slate-400 hover:text-slate-600 hover:bg-slate-100 dark:hover:text-white/80 dark:hover:bg-white/10 transition-colors z-10",
3133
- children: /* @__PURE__ */ jsx14(X2, { className: "w-5 h-5" })
3252
+ children: /* @__PURE__ */ jsx13(X2, { className: "w-5 h-5" })
3134
3253
  }
3135
3254
  ),
3136
- /* @__PURE__ */ jsx14(
3255
+ /* @__PURE__ */ jsx13(
3137
3256
  DocumentUpload,
3138
3257
  {
3139
3258
  namespace: projectId,
@@ -3141,9 +3260,9 @@ function ChatWindow({
3141
3260
  }
3142
3261
  )
3143
3262
  ] }) }),
3144
- /* @__PURE__ */ jsxs13("div", { className: `px-4 pb-4 pt-2 border-t border-slate-200 dark:border-white/10 ${isGlass ? "bg-transparent" : "bg-white dark:bg-[#0f0f1a]"}`, children: [
3145
- (suggestions.length > 0 || isSuggesting) && !isLoading && /* @__PURE__ */ jsxs13("div", { className: "mb-3 flex flex-wrap gap-2 animate-in fade-in slide-in-from-bottom-2 duration-300", children: [
3146
- suggestions.map((suggestion) => /* @__PURE__ */ jsxs13(
3263
+ /* @__PURE__ */ jsxs12("div", { className: `px-4 pb-4 pt-2 border-t border-slate-200 dark:border-white/10 ${isGlass ? "bg-transparent" : "bg-white dark:bg-[#0f0f1a]"}`, children: [
3264
+ (suggestions.length > 0 || isSuggesting) && !isLoading && /* @__PURE__ */ jsxs12("div", { className: "mb-3 flex flex-wrap gap-2 animate-in fade-in slide-in-from-bottom-2 duration-300", children: [
3265
+ suggestions.map((suggestion) => /* @__PURE__ */ jsxs12(
3147
3266
  "button",
3148
3267
  {
3149
3268
  onClick: () => {
@@ -3154,19 +3273,19 @@ function ChatWindow({
3154
3273
  },
3155
3274
  className: "flex items-center gap-1.5 px-3 py-1.5 rounded-xl text-[11px] font-medium bg-white dark:bg-white/5 border border-slate-200 dark:border-white/10 text-slate-600 dark:text-white/60 hover:text-slate-900 dark:hover:text-white/90 hover:border-slate-300 dark:hover:border-white/20 transition-all shadow-sm cursor-pointer group",
3156
3275
  children: [
3157
- /* @__PURE__ */ jsx14(Sparkles, { className: "w-3 h-3 text-amber-400" }),
3276
+ /* @__PURE__ */ jsx13(Sparkles, { className: "w-3 h-3 text-amber-400" }),
3158
3277
  suggestion
3159
3278
  ]
3160
3279
  },
3161
3280
  suggestion
3162
3281
  )),
3163
- isSuggesting && suggestions.length === 0 && /* @__PURE__ */ jsxs13("div", { className: "flex items-center gap-1.5 px-3 py-1.5 rounded-xl text-[11px] font-medium text-slate-400 dark:text-white/30 animate-pulse", children: [
3164
- /* @__PURE__ */ jsx14(Sparkles, { className: "w-3 h-3" }),
3282
+ isSuggesting && suggestions.length === 0 && /* @__PURE__ */ jsxs12("div", { className: "flex items-center gap-1.5 px-3 py-1.5 rounded-xl text-[11px] font-medium text-slate-400 dark:text-white/30 animate-pulse", children: [
3283
+ /* @__PURE__ */ jsx13(Sparkles, { className: "w-3 h-3" }),
3165
3284
  "Thinking..."
3166
3285
  ] })
3167
3286
  ] }),
3168
- /* @__PURE__ */ jsxs13("div", { className: `flex items-end gap-2 bg-slate-50 dark:bg-white/5 border border-slate-200 dark:border-white/10 p-2 focus-within:border-slate-300 dark:focus-within:border-white/20 transition-all ${ui.borderRadius === "full" ? "rounded-3xl" : "rounded-2xl"}`, children: [
3169
- /* @__PURE__ */ jsx14(
3287
+ /* @__PURE__ */ jsxs12("div", { className: `flex items-end gap-2 bg-slate-50 dark:bg-white/5 border border-slate-200 dark:border-white/10 p-2 focus-within:border-slate-300 dark:focus-within:border-white/20 transition-all ${ui.borderRadius === "full" ? "rounded-3xl" : "rounded-2xl"}`, children: [
3288
+ /* @__PURE__ */ jsx13(
3170
3289
  "textarea",
3171
3290
  {
3172
3291
  ref: inputRef,
@@ -3186,7 +3305,7 @@ function ChatWindow({
3186
3305
  style: { scrollbarWidth: "none" }
3187
3306
  }
3188
3307
  ),
3189
- ui.enableVoiceInput !== false && /* @__PURE__ */ jsx14(
3308
+ ui.enableVoiceInput !== false && /* @__PURE__ */ jsx13(
3190
3309
  "button",
3191
3310
  {
3192
3311
  type: "button",
@@ -3194,28 +3313,28 @@ function ChatWindow({
3194
3313
  disabled: isLoading,
3195
3314
  className: `flex-shrink-0 w-9 h-9 rounded-xl flex items-center justify-center transition-all hover:scale-105 active:scale-95 disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:scale-100 disabled:active:scale-100 ${isListening ? "bg-rose-500 text-white animate-pulse shadow-md shadow-rose-500/20" : "text-slate-400 dark:text-white/40 hover:bg-slate-200 dark:hover:bg-white/10"}`,
3196
3315
  title: isListening ? "Stop listening" : "Start voice input",
3197
- children: isListening ? /* @__PURE__ */ jsx14(MicOff, { className: "w-4 h-4" }) : /* @__PURE__ */ jsx14(Mic, { className: "w-4 h-4" })
3316
+ children: isListening ? /* @__PURE__ */ jsx13(MicOff, { className: "w-4 h-4" }) : /* @__PURE__ */ jsx13(Mic, { className: "w-4 h-4" })
3198
3317
  }
3199
3318
  ),
3200
- ui.allowUpload !== false && /* @__PURE__ */ jsx14(
3319
+ ui.allowUpload !== false && /* @__PURE__ */ jsx13(
3201
3320
  "button",
3202
3321
  {
3203
3322
  type: "button",
3204
3323
  onClick: () => setIsUploadModalOpen(true),
3205
3324
  className: "flex-shrink-0 w-9 h-9 rounded-xl flex items-center justify-center transition-all hover:scale-105 active:scale-95 text-slate-400 dark:text-white/40 hover:bg-slate-200 dark:hover:bg-white/10",
3206
3325
  title: "Upload Document",
3207
- children: /* @__PURE__ */ jsx14(Paperclip, { className: "w-4 h-4" })
3326
+ children: /* @__PURE__ */ jsx13(Paperclip, { className: "w-4 h-4" })
3208
3327
  }
3209
3328
  ),
3210
- isLoading ? /* @__PURE__ */ jsx14(
3329
+ isLoading ? /* @__PURE__ */ jsx13(
3211
3330
  "button",
3212
3331
  {
3213
3332
  onClick: stop,
3214
3333
  className: "flex-shrink-0 w-9 h-9 rounded-xl flex items-center justify-center transition-all hover:scale-105 active:scale-95 shadow-md bg-rose-500 hover:bg-rose-600 text-white cursor-pointer",
3215
3334
  title: "Stop generating",
3216
- children: /* @__PURE__ */ jsx14("div", { className: "w-3.5 h-3.5 bg-white rounded-[2px]" })
3335
+ children: /* @__PURE__ */ jsx13("div", { className: "w-3.5 h-3.5 bg-white rounded-[2px]" })
3217
3336
  }
3218
- ) : /* @__PURE__ */ jsx14(
3337
+ ) : /* @__PURE__ */ jsx13(
3219
3338
  "button",
3220
3339
  {
3221
3340
  onClick: sendMessage,
@@ -3225,11 +3344,11 @@ function ChatWindow({
3225
3344
  background: input.trim() ? `linear-gradient(135deg, ${ui.primaryColor}, ${ui.accentColor})` : "rgba(148, 163, 184, 0.2)"
3226
3345
  // slate-400/20 for light mode disabled
3227
3346
  },
3228
- children: /* @__PURE__ */ jsx14(ArrowUp, { className: "w-4 h-4 text-white" })
3347
+ children: /* @__PURE__ */ jsx13(ArrowUp, { className: "w-4 h-4 text-white" })
3229
3348
  }
3230
3349
  )
3231
3350
  ] }),
3232
- /* @__PURE__ */ jsx14("p", { className: "text-center text-[10px] text-slate-400 dark:text-white/20 mt-2", children: "Press Enter to send \xB7 Shift+Enter for new line" })
3351
+ /* @__PURE__ */ jsx13("p", { className: "text-center text-[10px] text-slate-400 dark:text-white/20 mt-2", children: "Press Enter to send \xB7 Shift+Enter for new line" })
3233
3352
  ] })
3234
3353
  ]
3235
3354
  }
@@ -3237,7 +3356,7 @@ function ChatWindow({
3237
3356
  }
3238
3357
 
3239
3358
  // src/components/ChatWidget.tsx
3240
- import { Fragment as Fragment4, jsx as jsx15, jsxs as jsxs14 } from "react/jsx-runtime";
3359
+ import { Fragment as Fragment5, jsx as jsx14, jsxs as jsxs13 } from "react/jsx-runtime";
3241
3360
  var DEFAULT_DIMENSIONS = { width: 380, height: 600 };
3242
3361
  var GEMINI_STYLES = `
3243
3362
  @keyframes shapeshift {
@@ -3276,7 +3395,7 @@ var GEMINI_STYLES = `
3276
3395
  --circle: shape(evenodd from 13.482% 79.505%, curve by -7.1945% -12.47% with -1.4985% -1.8575% / -6.328% -10.225%, curve by 0.0985% -33.8965% with -4.1645% -10.7945% / -4.1685% -23.0235%, curve by 6.9955% -12.101% with 1.72% -4.3825% / 4.0845% -8.458%, curve by 30.125% -17.119% with 7.339% -9.1825% / 18.4775% -15.5135%, curve by 13.4165% 0.095% with 4.432% -0.6105% / 8.9505% -0.5855%, curve by 29.364% 16.9% with 11.6215% 1.77% / 22.102% 7.9015%, curve by 7.176% 12.4145% with 3.002% 3.7195% / 5.453% 7.968%, curve by -0.0475% 33.8925% with 4.168% 10.756% / 4.2305% 22.942%, curve by -7.1135% 12.2825% with -1.74% 4.4535% / -4.1455% 8.592%, curve by -29.404% 16.9075% with -7.202% 8.954% / -18.019% 15.137%, curve by -14.19% -0.018% with -4.6635% 0.7255% / -9.4575% 0.7205%, curve by -29.226% -16.8875% with -11.573% -1.8065% / -21.9955% -7.9235%, close);
3277
3396
  }
3278
3397
  `;
3279
- function ChatWidget({ position = "bottom-right", onAddToCart }) {
3398
+ function ChatWidget({ position = "bottom-right", onAddToCart, apiUrl, retrivoraApiBase, headers }) {
3280
3399
  const { ui } = useConfig();
3281
3400
  const [isOpen, setIsOpen] = useState7(false);
3282
3401
  const [hasUnread, setHasUnread] = useState7(false);
@@ -3332,9 +3451,9 @@ function ChatWidget({ position = "bottom-right", onAddToCart }) {
3332
3451
  }
3333
3452
  };
3334
3453
  const isResized = dimensions.width !== DEFAULT_DIMENSIONS.width || dimensions.height !== DEFAULT_DIMENSIONS.height;
3335
- return /* @__PURE__ */ jsxs14(Fragment4, { children: [
3336
- /* @__PURE__ */ jsx15("style", { dangerouslySetInnerHTML: { __html: GEMINI_STYLES } }),
3337
- /* @__PURE__ */ jsxs14(
3454
+ return /* @__PURE__ */ jsxs13(Fragment5, { children: [
3455
+ /* @__PURE__ */ jsx14("style", { dangerouslySetInnerHTML: { __html: GEMINI_STYLES } }),
3456
+ /* @__PURE__ */ jsxs13(
3338
3457
  "div",
3339
3458
  {
3340
3459
  className: `fixed z-[9998] max-w-[calc(100vw-3rem)] ease-in-out ${windowPositionClass} ${isOpen ? "opacity-100 translate-y-0 pointer-events-auto" : "opacity-0 translate-y-4 pointer-events-none"} ${isResizing ? "" : "transition-all duration-300"}`,
@@ -3344,7 +3463,7 @@ function ChatWidget({ position = "bottom-right", onAddToCart }) {
3344
3463
  maxHeight: "calc(100vh - 6rem)"
3345
3464
  },
3346
3465
  children: [
3347
- /* @__PURE__ */ jsx15(
3466
+ /* @__PURE__ */ jsx14(
3348
3467
  ChatWindow,
3349
3468
  {
3350
3469
  className: "h-full relative z-10",
@@ -3355,10 +3474,13 @@ function ChatWidget({ position = "bottom-right", onAddToCart }) {
3355
3474
  isResized,
3356
3475
  onMaximize: ui.allowResize !== false ? handleMaximize : void 0,
3357
3476
  isMaximized,
3358
- onAddToCart
3477
+ onAddToCart,
3478
+ apiUrl,
3479
+ retrivoraApiBase,
3480
+ headers
3359
3481
  }
3360
3482
  ),
3361
- /* @__PURE__ */ jsx15(
3483
+ /* @__PURE__ */ jsx14(
3362
3484
  "div",
3363
3485
  {
3364
3486
  className: `absolute -bottom-1.5 w-4 h-4 rotate-45 border-r border-b border-slate-200 dark:border-white/10 z-0 ${ui.visualStyle === "solid" ? "bg-white dark:bg-[#0f0f1a]" : "bg-white/90 dark:bg-[#0f0f1a]/90 backdrop-blur-xl"} ${position === "bottom-left" ? "left-5" : "right-5"}`
@@ -3367,18 +3489,18 @@ function ChatWidget({ position = "bottom-right", onAddToCart }) {
3367
3489
  ]
3368
3490
  }
3369
3491
  ),
3370
- /* @__PURE__ */ jsxs14(
3492
+ /* @__PURE__ */ jsxs13(
3371
3493
  "button",
3372
3494
  {
3373
3495
  onClick: isOpen ? () => setIsOpen(false) : handleOpen,
3374
3496
  className: `group fixed z-[9999] w-14 h-14 drop-shadow-2xl flex items-center justify-center transition-all duration-300 cursor-pointer hover:scale-110 active:scale-95 ${positionClass}`,
3375
3497
  "aria-label": "Open chat",
3376
3498
  children: [
3377
- /* @__PURE__ */ jsx15(
3499
+ /* @__PURE__ */ jsx14(
3378
3500
  "div",
3379
3501
  {
3380
3502
  className: "absolute inset-0 transition-all duration-300 overflow-hidden rounded-full group-hover:rounded-none group-hover:animate-[shapeshift_5s_ease-in-out_infinite_forwards]",
3381
- children: /* @__PURE__ */ jsx15(
3503
+ children: /* @__PURE__ */ jsx14(
3382
3504
  "div",
3383
3505
  {
3384
3506
  className: "absolute top-0 left-0 w-[400%] h-[400%] transition-transform duration-300 group-hover:animate-[gradientMove_3.5s_ease-in-out_infinite_alternate]",
@@ -3389,27 +3511,824 @@ function ChatWidget({ position = "bottom-right", onAddToCart }) {
3389
3511
  )
3390
3512
  }
3391
3513
  ),
3392
- /* @__PURE__ */ jsx15(
3514
+ /* @__PURE__ */ jsx14(
3393
3515
  "span",
3394
3516
  {
3395
3517
  className: "absolute inset-0 rounded-full animate-ping opacity-20 pointer-events-none",
3396
3518
  style: { background: ui.primaryColor }
3397
3519
  }
3398
3520
  ),
3399
- /* @__PURE__ */ jsx15(
3521
+ /* @__PURE__ */ jsx14(
3400
3522
  "span",
3401
3523
  {
3402
3524
  className: `relative z-10 transition-transform duration-300 ${isOpen ? "rotate-90 scale-90" : "rotate-0 scale-100"}`,
3403
- children: isOpen ? /* @__PURE__ */ jsx15(X3, { className: "w-6 h-6 text-white" }) : /* @__PURE__ */ jsx15(MessageSquare, { className: "w-6 h-6 text-white" })
3525
+ children: isOpen ? /* @__PURE__ */ jsx14(X3, { className: "w-6 h-6 text-white" }) : /* @__PURE__ */ jsx14(MessageSquare, { className: "w-6 h-6 text-white" })
3404
3526
  }
3405
3527
  ),
3406
- hasUnread && !isOpen && /* @__PURE__ */ jsx15("span", { className: "absolute top-0 right-0 w-4 h-4 bg-rose-500 rounded-full border-2 border-white flex items-center justify-center text-[9px] font-bold text-white", children: "1" })
3528
+ hasUnread && !isOpen && /* @__PURE__ */ jsx14("span", { className: "absolute top-0 right-0 w-4 h-4 bg-rose-500 rounded-full border-2 border-white flex items-center justify-center text-[9px] font-bold text-white", children: "1" })
3407
3529
  ]
3408
3530
  }
3409
3531
  )
3410
3532
  ] });
3411
3533
  }
3412
3534
 
3535
+ // src/components/Hero.tsx
3536
+ import Link from "next/link";
3537
+
3538
+ // src/app/constants.tsx
3539
+ import {
3540
+ Zap as Zap2,
3541
+ Database,
3542
+ Layers as Layers2,
3543
+ Search,
3544
+ Box,
3545
+ Package,
3546
+ Activity as Activity2,
3547
+ Hexagon,
3548
+ Sparkles as Sparkles2,
3549
+ Bot as Bot3,
3550
+ Brain as Brain2,
3551
+ Rabbit,
3552
+ Code,
3553
+ Terminal,
3554
+ FileText as FileText2,
3555
+ Puzzle,
3556
+ MessageSquare as MessageSquare2,
3557
+ Cpu as Cpu2,
3558
+ Cloud
3559
+ } from "lucide-react";
3560
+ import { jsx as jsx15 } from "react/jsx-runtime";
3561
+ var LANDING_PAGE_CONTENT = {
3562
+ hero: {
3563
+ badge: "Dynamic & Universal Retrivora AI",
3564
+ title: "The Universal Bridge for Generative AI",
3565
+ subtitle: "Retrivora AI is a vendor-agnostic RAG engine that connects any Document to any LLM and Vector Database in minutes."
3566
+ },
3567
+ lifecycle: {
3568
+ title: "The RAG Lifecycle"
3569
+ },
3570
+ guide: {
3571
+ title: "Interactive Guide",
3572
+ subtitle: "Universal RAG integration for your Next.js applications in minutes."
3573
+ }
3574
+ };
3575
+ var VECTOR_DATABASES = [
3576
+ { Icon: Zap2, label: "Pinecone" },
3577
+ { Icon: Database, label: "PostgreSQL" },
3578
+ { Icon: Layers2, label: "MongoDB" },
3579
+ { Icon: Box, label: "Qdrant" },
3580
+ { Icon: Search, label: "Milvus" },
3581
+ { Icon: Package, label: "ChromaDB" },
3582
+ { Icon: Activity2, label: "Redis" },
3583
+ { Icon: Hexagon, label: "Weaviate" }
3584
+ ];
3585
+ var AI_MODELS = [
3586
+ { Icon: Rabbit, label: "Ollama" },
3587
+ { Icon: Sparkles2, label: "OpenAI" },
3588
+ { Icon: Bot3, label: "Anthropic" },
3589
+ { Icon: Brain2, label: "Gemini" },
3590
+ { Icon: Cpu2, label: "Groq" },
3591
+ { Icon: Cloud, label: "Qwen" },
3592
+ { Icon: Code, label: "Copilot" },
3593
+ { Icon: Terminal, label: "LiteLLM" }
3594
+ ];
3595
+ var PIPELINE_STEPS = [
3596
+ {
3597
+ step: "01",
3598
+ Icon: FileText2,
3599
+ title: "Ingest",
3600
+ desc: "Universal support for PDF, DOCX, CSV, and JSON. Documents are parsed, chunked, and embedded.",
3601
+ colors: { from: "#10b981", to: "#14b8a6" }
3602
+ },
3603
+ {
3604
+ step: "02",
3605
+ Icon: Search,
3606
+ title: "Retrieve",
3607
+ desc: "Queries are converted to vectors. Semantic search finds context across any configured Vector DB.",
3608
+ colors: { from: "#14b8a6", to: "#06b6d4" }
3609
+ },
3610
+ {
3611
+ step: "03",
3612
+ Icon: Puzzle,
3613
+ title: "Augment",
3614
+ desc: "Retrieved context is injected into the LLM prompt with namespaced project isolation.",
3615
+ colors: { from: "#06b6d4", to: "#3b82f6" }
3616
+ },
3617
+ {
3618
+ step: "04",
3619
+ Icon: MessageSquare2,
3620
+ title: "Generate",
3621
+ desc: "Providers like OpenAI, Anthropic, or Gemini produce grounded, source-cited responses.",
3622
+ colors: { from: "#3b82f6", to: "#6366f1" }
3623
+ }
3624
+ ];
3625
+ var SNIPPETS = [
3626
+ {
3627
+ id: "npm-setup",
3628
+ title: "NPM Setup",
3629
+ language: "typescript",
3630
+ description: "How to install and import the client vs server components correctly in your application.",
3631
+ code: `// \u2500\u2500\u2500 TERMINAL / BASH \u2500\u2500\u2500
3632
+ // Run this command to install the package in your project:
3633
+ // npm install @retrivora-ai/rag-engine
3634
+
3635
+ // \u2500\u2500\u2500 SERVER API ROUTER (src/app/api/retrivora/[[...retrivora]]/route.ts) \u2500\u2500\u2500
3636
+ // Create a single catch-all file to handle all server endpoints dynamically:
3637
+ import { createRagHandler } from '@retrivora-ai/rag-engine/handlers';
3638
+
3639
+ export const { GET, POST } = createRagHandler();
3640
+
3641
+ // \u2500\u2500\u2500 CLIENT WIDGET (src/app/layout.tsx) \u2500\u2500\u2500
3642
+ // Import the React widget and config context (styles are auto-injected!):
3643
+ import { ConfigProvider, ChatWidget } from '@retrivora-ai/rag-engine';`
3644
+ },
3645
+ {
3646
+ id: "pipeline",
3647
+ title: "Pipeline API",
3648
+ language: "typescript",
3649
+ description: "Orchestrate the full RAG flow programmatically with the Pipeline class.",
3650
+ code: `import { Pipeline, getRagConfig } from '@retrivora-ai/rag-engine/server';
3651
+
3652
+ const config = getRagConfig();
3653
+ const pipeline = new Pipeline(config);
3654
+
3655
+ // Ingest documents
3656
+ await pipeline.ingest([{
3657
+ docId: 'doc-1',
3658
+ content: 'Retrivora AI simplifies RAG...',
3659
+ metadata: { source: 'docs' }
3660
+ }]);
3661
+
3662
+ // Ask a question
3663
+ const { reply, sources } = await pipeline.ask('How does Retrivora work?');`
3664
+ },
3665
+ {
3666
+ id: "handlers",
3667
+ title: "Route Handlers",
3668
+ language: "typescript",
3669
+ description: "Mount pre-built API endpoints. Configuration is automatically read from environment variables, or can be passed explicitly.",
3670
+ code: `// \u2500\u2500\u2500 OPTION A: ZERO CONFIG (Reads from environment variables) \u2500\u2500\u2500
3671
+ // src/app/api/chat/route.ts
3672
+ import { createStreamHandler } from '@retrivora-ai/rag-engine/handlers';
3673
+ export const POST = createStreamHandler();
3674
+
3675
+ // \u2500\u2500\u2500 OPTION B: EXPLICIT CONFIGURATION \u2500\u2500\u2500
3676
+ // src/app/api/chat/route.ts
3677
+ import { createStreamHandler } from '@retrivora-ai/rag-engine/handlers';
3678
+
3679
+ export const POST = createStreamHandler({
3680
+ vectorDb: {
3681
+ provider: 'pinecone',
3682
+ apiKey: process.env.CUSTOM_PINECONE_KEY,
3683
+ indexName: 'docs-index',
3684
+ },
3685
+ llm: {
3686
+ provider: 'openai',
3687
+ apiKey: process.env.CUSTOM_OPENAI_KEY,
3688
+ model: 'gpt-4o',
3689
+ }
3690
+ });`
3691
+ },
3692
+ {
3693
+ id: "ui",
3694
+ title: "React Components",
3695
+ language: "typescript",
3696
+ description: "Configure and embed themeable UI widgets using the ConfigProvider context.",
3697
+ code: `import { ConfigProvider, ChatWidget } from '@retrivora-ai/rag-engine';
3698
+
3699
+ export default function Layout({ children }) {
3700
+ return (
3701
+ <ConfigProvider config={{
3702
+ projectId: 'my-project-id',
3703
+ ui: {
3704
+ title: 'Retrivora Assistant',
3705
+ welcomeMessage: 'Hi! Ask me anything about our software.',
3706
+ primaryColor: '#4f46e5', // Custom primary brand color
3707
+ accentColor: '#8b5cf6', // Custom accent gradient color
3708
+ borderRadius: 'lg', // 'none' | 'sm' | 'md' | 'lg' | 'xl'
3709
+ allowUpload: true, // Toggle custom file uploading
3710
+ }
3711
+ }}>
3712
+ {children}
3713
+ <ChatWidget position="bottom-right" />
3714
+ </ConfigProvider>
3715
+ );
3716
+ }`
3717
+ },
3718
+ {
3719
+ id: "config",
3720
+ title: "Config Builder",
3721
+ language: "typescript",
3722
+ description: "Fluent, type-safe configuration builder for granular control over providers.",
3723
+ code: `import { ConfigBuilder } from '@retrivora-ai/rag-engine/server';
3724
+
3725
+ const config = new ConfigBuilder()
3726
+ .vectorDb('pinecone', { apiKey: '...', indexName: 'docs' })
3727
+ .llm('ollama', 'llama3.2')
3728
+ .embedding('ollama', 'nomic-embed-text')
3729
+ .build();`
3730
+ },
3731
+ {
3732
+ id: "env",
3733
+ title: "Environment",
3734
+ language: "bash",
3735
+ description: "The exact environment variable structure required for auto-configuration.",
3736
+ code: `# Project Identity
3737
+ RAG_PROJECT_ID=my-project
3738
+
3739
+ # Vector DB
3740
+ VECTOR_DB_PROVIDER=pinecone
3741
+ PINECONE_API_KEY=pcsk_...
3742
+ VECTOR_DB_INDEX=products
3743
+
3744
+ # AI Services
3745
+ LLM_PROVIDER=openai
3746
+ LLM_MODEL=gpt-4o
3747
+ OPENAI_API_KEY=sk-...`
3748
+ }
3749
+ ];
3750
+ var ARCHITECTURE_CARDS = [
3751
+ {
3752
+ icon: /* @__PURE__ */ jsx15(Database, { className: "text-indigo-600" }),
3753
+ title: "Vector Store",
3754
+ description: "Universal support for Pinecone, PGVector, MongoDB, Milvus, Qdrant, and more.",
3755
+ badge: "Vector DB",
3756
+ badgeColor: "bg-indigo-50 dark:bg-indigo-500/10 text-indigo-600 dark:text-indigo-400 border-indigo-200 dark:border-indigo-500/20"
3757
+ },
3758
+ {
3759
+ icon: /* @__PURE__ */ jsx15(Zap2, { className: "text-amber-500" }),
3760
+ title: "Embeddings",
3761
+ description: "Seamlessly switch between OpenAI, Ollama, or custom embedding providers.",
3762
+ badge: "Models",
3763
+ badgeColor: "bg-amber-50 dark:bg-amber-500/10 text-amber-600 dark:text-amber-400 border-amber-200 dark:border-amber-500/20"
3764
+ },
3765
+ {
3766
+ icon: /* @__PURE__ */ jsx15(Bot3, { className: "text-emerald-500" }),
3767
+ title: "LLM Orchestration",
3768
+ description: "Optimized inference across OpenAI, Anthropic, Gemini, and local LLMs.",
3769
+ badge: "Inference",
3770
+ badgeColor: "bg-emerald-50 dark:bg-emerald-500/10 text-emerald-600 dark:text-emerald-400 border-emerald-200 dark:border-emerald-500/20"
3771
+ }
3772
+ ];
3773
+ var QUICK_START_STEPS = [
3774
+ { id: "npm-setup", text: "Install Package & CSS" },
3775
+ { id: "env", text: "Configure .env.local" },
3776
+ { id: "handlers", text: "Mount API Handlers" },
3777
+ { id: "ui", text: "Drop ChatWidget UI" }
3778
+ ];
3779
+ var ADVANCED_STEPS = [
3780
+ { id: "pipeline", text: "Programmatic SDK" },
3781
+ { id: "config", text: "Fluent Config Builder" }
3782
+ ];
3783
+ var API_ENDPOINTS = ["chat", "health", "ingest", "upload"];
3784
+
3785
+ // src/components/Hero.tsx
3786
+ import { ArrowRight } from "lucide-react";
3787
+ import { jsx as jsx16, jsxs as jsxs14 } from "react/jsx-runtime";
3788
+ function Hero() {
3789
+ const { ui } = useConfig();
3790
+ return /* @__PURE__ */ jsxs14("div", { className: "grid lg:grid-cols-2 gap-12 xl:gap-16 items-start", children: [
3791
+ /* @__PURE__ */ jsxs14("div", { className: "flex flex-col gap-7 pt-4", children: [
3792
+ /* @__PURE__ */ jsxs14(
3793
+ "div",
3794
+ {
3795
+ className: "inline-flex items-center gap-2.5 px-4 py-2 rounded-full text-xs font-semibold border w-fit",
3796
+ style: {
3797
+ borderColor: `${ui.primaryColor}30`,
3798
+ color: ui.primaryColor,
3799
+ background: `${ui.primaryColor}08`
3800
+ },
3801
+ children: [
3802
+ /* @__PURE__ */ jsx16(
3803
+ "span",
3804
+ {
3805
+ className: "w-2 h-2 rounded-full",
3806
+ style: { background: ui.primaryColor, animation: "pulseRing 2.5s ease-in-out infinite" }
3807
+ }
3808
+ ),
3809
+ LANDING_PAGE_CONTENT.hero.badge
3810
+ ]
3811
+ }
3812
+ ),
3813
+ /* @__PURE__ */ jsxs14("h1", { className: "text-5xl md:text-6xl xl:text-7xl font-black text-slate-900 tracking-tight leading-[1.05]", children: [
3814
+ LANDING_PAGE_CONTENT.hero.title.split("for")[0],
3815
+ /* @__PURE__ */ jsx16("br", {}),
3816
+ /* @__PURE__ */ jsxs14(
3817
+ "span",
3818
+ {
3819
+ className: "text-transparent bg-clip-text",
3820
+ style: { backgroundImage: `linear-gradient(135deg, ${ui.primaryColor} 0%, ${ui.accentColor} 60%, #a855f7 100%)` },
3821
+ children: [
3822
+ "for ",
3823
+ LANDING_PAGE_CONTENT.hero.title.split("for")[1]
3824
+ ]
3825
+ }
3826
+ )
3827
+ ] }),
3828
+ /* @__PURE__ */ jsx16("p", { className: "text-lg md:text-xl text-slate-500 max-w-lg leading-relaxed", children: LANDING_PAGE_CONTENT.hero.subtitle }),
3829
+ /* @__PURE__ */ jsxs14("div", { className: "flex flex-col gap-4 border-t border-slate-100", children: [
3830
+ /* @__PURE__ */ jsxs14("div", { className: "flex flex-col gap-2.5", children: [
3831
+ /* @__PURE__ */ jsx16("span", { className: "text-[10px] font-black text-slate-400 uppercase tracking-[0.22em] ml-1", children: "Vector Ecosystem" }),
3832
+ /* @__PURE__ */ jsx16("div", { className: "flex flex-wrap gap-2", children: VECTOR_DATABASES.map(({ Icon, label }) => /* @__PURE__ */ jsxs14(
3833
+ "span",
3834
+ {
3835
+ className: "flex items-center gap-1.5 px-3 py-1.5 rounded-lg bg-white border border-slate-200 text-slate-600 text-[11px] font-semibold hover:border-indigo-300 hover:bg-indigo-50 hover:text-indigo-700 transition-all cursor-default group shadow-sm",
3836
+ children: [
3837
+ /* @__PURE__ */ jsx16(Icon, { className: "w-3 h-3 transition-transform group-hover:scale-110", style: { color: ui.primaryColor } }),
3838
+ label
3839
+ ]
3840
+ },
3841
+ label
3842
+ )) })
3843
+ ] }),
3844
+ /* @__PURE__ */ jsxs14("div", { className: "flex flex-col gap-2.5", children: [
3845
+ /* @__PURE__ */ jsx16("span", { className: "text-[10px] font-black text-slate-400 uppercase tracking-[0.22em] ml-1", children: "AI Model Garden" }),
3846
+ /* @__PURE__ */ jsx16("div", { className: "flex flex-wrap gap-2", children: AI_MODELS.map(({ Icon, label }) => /* @__PURE__ */ jsxs14(
3847
+ "span",
3848
+ {
3849
+ className: "flex items-center gap-1.5 px-3 py-1.5 rounded-lg bg-white border border-slate-200 text-slate-600 text-[11px] font-semibold hover:border-violet-300 hover:bg-violet-50 hover:text-violet-700 transition-all cursor-default group shadow-sm",
3850
+ children: [
3851
+ /* @__PURE__ */ jsx16(Icon, { className: "w-3 h-3 transition-transform group-hover:scale-110", style: { color: ui.accentColor } }),
3852
+ label
3853
+ ]
3854
+ },
3855
+ label
3856
+ )) })
3857
+ ] })
3858
+ ] }),
3859
+ /* @__PURE__ */ jsx16("div", { className: "flex flex-wrap items-center gap-3 mt-1", children: /* @__PURE__ */ jsxs14(
3860
+ Link,
3861
+ {
3862
+ href: "/register",
3863
+ className: "group flex items-center gap-2 px-6 py-3.5 rounded-xl text-sm font-bold text-white transition-all duration-200 shadow-lg hover:-translate-y-0.5",
3864
+ style: {
3865
+ background: `linear-gradient(135deg, ${ui.primaryColor}, ${ui.accentColor})`,
3866
+ boxShadow: `0 8px 24px -6px ${ui.primaryColor}45`
3867
+ },
3868
+ children: [
3869
+ "Get Started Free",
3870
+ /* @__PURE__ */ jsx16(ArrowRight, { className: "h-4 w-4 transition-transform group-hover:translate-x-1" })
3871
+ ]
3872
+ }
3873
+ ) })
3874
+ ] }),
3875
+ /* @__PURE__ */ jsxs14("div", { className: "relative lg:sticky lg:top-6 h-[480px] lg:h-[calc(100vh-6rem)] min-h-[400px] lg:min-h-[520px] max-h-[800px]", children: [
3876
+ /* @__PURE__ */ jsx16(
3877
+ "div",
3878
+ {
3879
+ className: "absolute -inset-3 rounded-3xl pointer-events-none",
3880
+ style: { background: `radial-gradient(ellipse at center, ${ui.primaryColor}12 0%, transparent 70%)` }
3881
+ }
3882
+ ),
3883
+ /* @__PURE__ */ jsx16("div", { className: "relative h-full rounded-2xl overflow-hidden border border-slate-200 shadow-xl shadow-slate-200/80", children: /* @__PURE__ */ jsx16(ChatWindow, { className: "w-full h-full" }) }),
3884
+ /* @__PURE__ */ jsxs14("div", { className: "absolute -bottom-3 left-1/2 -translate-x-1/2 flex items-center gap-1.5 px-3.5 py-1.5 bg-white border border-slate-200 rounded-full text-[10px] font-semibold text-slate-500 shadow-md whitespace-nowrap", children: [
3885
+ /* @__PURE__ */ jsx16("span", { className: "w-1.5 h-1.5 rounded-full bg-emerald-500 animate-pulse" }),
3886
+ "Live Retrivora demo \u2014 powered by this SDK"
3887
+ ] })
3888
+ ] })
3889
+ ] });
3890
+ }
3891
+
3892
+ // src/components/Lifecycle.tsx
3893
+ import { jsx as jsx17, jsxs as jsxs15 } from "react/jsx-runtime";
3894
+ function Lifecycle() {
3895
+ return /* @__PURE__ */ jsxs15("div", { className: "relative", children: [
3896
+ /* @__PURE__ */ jsxs15("div", { className: "text-center mb-14", children: [
3897
+ /* @__PURE__ */ jsxs15("span", { className: "inline-flex items-center gap-2 px-3 py-1.5 rounded-full bg-indigo-50 border border-indigo-100 text-[10px] font-bold uppercase tracking-widest text-indigo-600 mb-5", children: [
3898
+ /* @__PURE__ */ jsx17("span", { className: "w-1.5 h-1.5 rounded-full bg-indigo-500 animate-pulse" }),
3899
+ "How It Works"
3900
+ ] }),
3901
+ /* @__PURE__ */ jsx17("h2", { className: "text-3xl md:text-4xl font-black text-slate-900 mb-4", children: LANDING_PAGE_CONTENT.lifecycle.title }),
3902
+ /* @__PURE__ */ jsx17("p", { className: "text-slate-500 max-w-lg mx-auto text-base leading-relaxed", children: "Four composable stages from raw documents to grounded AI responses." })
3903
+ ] }),
3904
+ /* @__PURE__ */ jsx17("div", { className: "grid sm:grid-cols-2 lg:grid-cols-4 gap-5 max-w-6xl mx-auto", children: PIPELINE_STEPS.map(({ step, Icon, title, desc, colors }, index) => /* @__PURE__ */ jsxs15(
3905
+ "div",
3906
+ {
3907
+ className: "group relative bg-white rounded-2xl border border-slate-200 p-6 transition-all duration-300 hover:-translate-y-1 hover:shadow-lg hover:shadow-slate-200/80 overflow-hidden cursor-default",
3908
+ children: [
3909
+ /* @__PURE__ */ jsx17(
3910
+ "div",
3911
+ {
3912
+ className: "absolute top-0 left-0 right-0 h-0.5 rounded-t-2xl",
3913
+ style: { background: `linear-gradient(90deg, ${colors.from}, ${colors.to})` }
3914
+ }
3915
+ ),
3916
+ /* @__PURE__ */ jsx17(
3917
+ "div",
3918
+ {
3919
+ className: "absolute -right-2 -bottom-4 text-8xl font-black opacity-[0.05] select-none pointer-events-none group-hover:opacity-[0.08] transition-opacity",
3920
+ style: { color: colors.from },
3921
+ children: step
3922
+ }
3923
+ ),
3924
+ /* @__PURE__ */ jsx17(
3925
+ "div",
3926
+ {
3927
+ className: "relative z-10 w-11 h-11 rounded-xl flex items-center justify-center mb-5 transition-transform duration-300 group-hover:scale-105",
3928
+ style: {
3929
+ background: `linear-gradient(135deg, ${colors.from}18, ${colors.to}10)`,
3930
+ border: `1px solid ${colors.from}25`
3931
+ },
3932
+ children: /* @__PURE__ */ jsx17(Icon, { className: "w-5 h-5", style: { color: colors.from } })
3933
+ }
3934
+ ),
3935
+ /* @__PURE__ */ jsxs15("div", { className: "relative z-10", children: [
3936
+ /* @__PURE__ */ jsxs15(
3937
+ "div",
3938
+ {
3939
+ className: "text-[10px] font-black uppercase tracking-widest mb-1.5",
3940
+ style: { color: colors.from },
3941
+ children: [
3942
+ "Step ",
3943
+ index + 1
3944
+ ]
3945
+ }
3946
+ ),
3947
+ /* @__PURE__ */ jsx17("h3", { className: "text-base font-bold text-slate-900 mb-2", children: title }),
3948
+ /* @__PURE__ */ jsx17("p", { className: "text-sm text-slate-500 leading-relaxed", children: desc })
3949
+ ] }),
3950
+ /* @__PURE__ */ jsx17(
3951
+ "div",
3952
+ {
3953
+ className: "absolute inset-0 rounded-2xl opacity-0 group-hover:opacity-100 transition-opacity duration-500 pointer-events-none",
3954
+ style: { background: `radial-gradient(ellipse at 50% 0%, ${colors.from}07 0%, transparent 70%)` }
3955
+ }
3956
+ )
3957
+ ]
3958
+ },
3959
+ step
3960
+ )) })
3961
+ ] });
3962
+ }
3963
+
3964
+ // src/components/ArchitectureCardsSection.tsx
3965
+ import Link2 from "next/link";
3966
+
3967
+ // src/components/ArchitectureCard.tsx
3968
+ import { ArrowRight as ArrowRight2 } from "lucide-react";
3969
+ import { jsx as jsx18, jsxs as jsxs16 } from "react/jsx-runtime";
3970
+ function ArchitectureCard({ icon, title, description, badge, badgeColor, gradientFrom = "#6366f1", gradientTo = "#8b5cf6" }) {
3971
+ return /* @__PURE__ */ jsxs16("div", { className: "group relative bg-white rounded-2xl border border-slate-200 p-6 transition-all duration-300 hover:-translate-y-1 hover:shadow-xl hover:shadow-slate-200/80 overflow-hidden cursor-default", children: [
3972
+ /* @__PURE__ */ jsx18(
3973
+ "div",
3974
+ {
3975
+ className: "absolute top-0 left-0 right-0 h-0.5 rounded-t-2xl opacity-80 group-hover:opacity-100 transition-opacity",
3976
+ style: { background: `linear-gradient(90deg, ${gradientFrom}, ${gradientTo})` }
3977
+ }
3978
+ ),
3979
+ /* @__PURE__ */ jsxs16("div", { className: "mb-5 flex items-center justify-between", children: [
3980
+ /* @__PURE__ */ jsx18(
3981
+ "div",
3982
+ {
3983
+ className: "w-12 h-12 rounded-xl flex items-center justify-center text-2xl transition-transform duration-300 group-hover:scale-110",
3984
+ style: {
3985
+ background: `linear-gradient(135deg, ${gradientFrom}18, ${gradientTo}10)`,
3986
+ border: `1px solid ${gradientFrom}20`
3987
+ },
3988
+ children: icon
3989
+ }
3990
+ ),
3991
+ /* @__PURE__ */ jsx18("span", { className: `rounded-full border px-3 py-1 text-[10px] font-bold uppercase tracking-wider ${badgeColor}`, children: badge })
3992
+ ] }),
3993
+ /* @__PURE__ */ jsx18("h3", { className: "mb-2 font-bold text-slate-900 text-base", children: title }),
3994
+ /* @__PURE__ */ jsx18("p", { className: "text-sm text-slate-500 leading-relaxed", children: description }),
3995
+ /* @__PURE__ */ jsxs16(
3996
+ "div",
3997
+ {
3998
+ className: "mt-5 flex items-center gap-1 text-[11px] font-semibold opacity-0 group-hover:opacity-100 transition-all duration-300 -translate-y-1 group-hover:translate-y-0",
3999
+ style: { color: gradientFrom },
4000
+ children: [
4001
+ "Learn more ",
4002
+ /* @__PURE__ */ jsx18(ArrowRight2, { className: "h-3 w-3" })
4003
+ ]
4004
+ }
4005
+ ),
4006
+ /* @__PURE__ */ jsx18(
4007
+ "div",
4008
+ {
4009
+ className: "absolute inset-0 rounded-2xl opacity-0 group-hover:opacity-100 transition-opacity duration-500 pointer-events-none",
4010
+ style: { background: `radial-gradient(ellipse at 50% 0%, ${gradientFrom}05 0%, transparent 70%)` }
4011
+ }
4012
+ )
4013
+ ] });
4014
+ }
4015
+
4016
+ // src/components/ArchitectureCardsSection.tsx
4017
+ import { ArrowRight as ArrowRight3 } from "lucide-react";
4018
+ import { jsx as jsx19, jsxs as jsxs17 } from "react/jsx-runtime";
4019
+ var CARD_GRADIENTS = [
4020
+ { from: "#6366f1", to: "#8b5cf6" },
4021
+ { from: "#f59e0b", to: "#f97316" },
4022
+ { from: "#10b981", to: "#06b6d4" }
4023
+ ];
4024
+ function ArchitectureCardsSection() {
4025
+ return /* @__PURE__ */ jsxs17("div", { className: "relative", children: [
4026
+ /* @__PURE__ */ jsxs17("div", { className: "text-center mb-12", children: [
4027
+ /* @__PURE__ */ jsx19("h2", { className: "text-3xl md:text-4xl font-black text-slate-900 mb-4", children: "Built for every layer of the stack" }),
4028
+ /* @__PURE__ */ jsx19("p", { className: "text-slate-500 max-w-xl mx-auto text-base leading-relaxed", children: "Swap providers without rewriting a single line of business logic." })
4029
+ ] }),
4030
+ /* @__PURE__ */ jsx19("div", { className: "grid gap-5 sm:grid-cols-3 max-w-5xl mx-auto", children: ARCHITECTURE_CARDS.map((card, i) => {
4031
+ var _a, _b;
4032
+ return /* @__PURE__ */ jsx19(
4033
+ ArchitectureCard,
4034
+ __spreadProps(__spreadValues({}, card), {
4035
+ gradientFrom: (_a = CARD_GRADIENTS[i]) == null ? void 0 : _a.from,
4036
+ gradientTo: (_b = CARD_GRADIENTS[i]) == null ? void 0 : _b.to
4037
+ }),
4038
+ i
4039
+ );
4040
+ }) }),
4041
+ /* @__PURE__ */ jsx19("div", { className: "mt-10 text-center", children: /* @__PURE__ */ jsxs17(
4042
+ Link2,
4043
+ {
4044
+ href: "/features",
4045
+ className: "inline-flex items-center gap-2 px-6 py-3 rounded-xl text-sm font-semibold text-slate-600 hover:text-indigo-600 border border-slate-200 hover:border-indigo-200 bg-white hover:bg-indigo-50 transition-all shadow-sm",
4046
+ children: [
4047
+ "Explore all features ",
4048
+ /* @__PURE__ */ jsx19(ArrowRight3, { className: "h-4 w-4" })
4049
+ ]
4050
+ }
4051
+ ) })
4052
+ ] });
4053
+ }
4054
+
4055
+ // src/components/Documentation.tsx
4056
+ import React15 from "react";
4057
+ import { FileText as FileText3, Zap as Zap4, Package as Package3, ExternalLink as ExternalLink2, Code as Code2 } from "lucide-react";
4058
+
4059
+ // src/components/CodeViewer.tsx
4060
+ import React14 from "react";
4061
+ import { Check as Check2, Copy as Copy2 } from "lucide-react";
4062
+ import { Fragment as Fragment6, jsx as jsx20, jsxs as jsxs18 } from "react/jsx-runtime";
4063
+ function CodeViewer({ snippet }) {
4064
+ const [copied, setCopied] = React14.useState(false);
4065
+ const handleCopy = () => {
4066
+ navigator.clipboard.writeText(snippet.code);
4067
+ setCopied(true);
4068
+ setTimeout(() => setCopied(false), 2e3);
4069
+ };
4070
+ return /* @__PURE__ */ jsxs18("div", { className: "flex flex-col rounded-2xl border border-white/8 overflow-hidden min-h-[300px] shadow-xl", children: [
4071
+ /* @__PURE__ */ jsxs18("div", { className: "flex items-center justify-between px-5 py-3 border-b border-white/5 bg-[#0d0d1a]", children: [
4072
+ /* @__PURE__ */ jsxs18("div", { className: "flex items-center gap-4", children: [
4073
+ /* @__PURE__ */ jsxs18("div", { className: "flex gap-1.5", children: [
4074
+ /* @__PURE__ */ jsx20("div", { className: "w-2.5 h-2.5 rounded-full bg-rose-500/80" }),
4075
+ /* @__PURE__ */ jsx20("div", { className: "w-2.5 h-2.5 rounded-full bg-amber-500/80" }),
4076
+ /* @__PURE__ */ jsx20("div", { className: "w-2.5 h-2.5 rounded-full bg-emerald-500/80" })
4077
+ ] }),
4078
+ /* @__PURE__ */ jsx20("span", { className: "text-[10px] font-mono text-white/25 uppercase tracking-widest", children: snippet.language })
4079
+ ] }),
4080
+ /* @__PURE__ */ jsx20(
4081
+ "button",
4082
+ {
4083
+ onClick: handleCopy,
4084
+ className: "flex items-center gap-1.5 px-2.5 py-1 rounded-lg text-[10px] font-bold text-white/35 hover:text-white/80 hover:bg-white/5 transition-all active:scale-95",
4085
+ children: copied ? /* @__PURE__ */ jsxs18(Fragment6, { children: [
4086
+ /* @__PURE__ */ jsx20(Check2, { size: 12, className: "text-emerald-400" }),
4087
+ /* @__PURE__ */ jsx20("span", { className: "text-emerald-400", children: "Copied!" })
4088
+ ] }) : /* @__PURE__ */ jsxs18(Fragment6, { children: [
4089
+ /* @__PURE__ */ jsx20(Copy2, { size: 12 }),
4090
+ "Copy Code"
4091
+ ] })
4092
+ }
4093
+ )
4094
+ ] }),
4095
+ /* @__PURE__ */ jsx20("div", { className: "p-6 font-mono text-[12px] leading-relaxed overflow-auto flex-grow bg-[#080818]", children: /* @__PURE__ */ jsx20("pre", { className: "whitespace-pre text-indigo-200/85", children: /* @__PURE__ */ jsx20("code", { children: snippet.code }) }) })
4096
+ ] });
4097
+ }
4098
+
4099
+ // src/components/DocViewer.tsx
4100
+ import { ArrowLeft, ArrowRight as ArrowRight4 } from "lucide-react";
4101
+ import { jsx as jsx21, jsxs as jsxs19 } from "react/jsx-runtime";
4102
+ function DocViewer({ activeSnippet, setActiveSnippet }) {
4103
+ const currentIndex = SNIPPETS.findIndex((s) => s.id === activeSnippet.id);
4104
+ const totalSteps = SNIPPETS.length;
4105
+ const isFirst = currentIndex === 0;
4106
+ const isLast = currentIndex === totalSteps - 1;
4107
+ const handlePrev = () => {
4108
+ if (!isFirst) setActiveSnippet(SNIPPETS[currentIndex - 1]);
4109
+ };
4110
+ const handleNext = () => {
4111
+ if (!isLast) setActiveSnippet(SNIPPETS[currentIndex + 1]);
4112
+ };
4113
+ const progressPercent = Math.round((currentIndex + 1) / totalSteps * 100);
4114
+ return /* @__PURE__ */ jsxs19("div", { className: "flex flex-col h-full p-6 gap-5", children: [
4115
+ /* @__PURE__ */ jsx21("div", { className: "flex flex-wrap gap-1.5 border-b border-slate-100 pb-5", children: SNIPPETS.map((snippet) => /* @__PURE__ */ jsx21(
4116
+ "button",
4117
+ {
4118
+ onClick: () => setActiveSnippet(snippet),
4119
+ className: `px-4 py-1.5 rounded-lg text-[10px] font-bold uppercase tracking-wider transition-all border ${activeSnippet.id === snippet.id ? "bg-indigo-600 text-white border-indigo-600 shadow-sm scale-[1.03]" : "bg-slate-50 border-slate-200 text-slate-500 hover:text-indigo-600 hover:border-indigo-200 hover:bg-indigo-50"}`,
4120
+ children: snippet.title
4121
+ },
4122
+ snippet.id
4123
+ )) }),
4124
+ /* @__PURE__ */ jsx21("div", { className: "bg-slate-100 rounded-full h-1.5 overflow-hidden", children: /* @__PURE__ */ jsx21(
4125
+ "div",
4126
+ {
4127
+ className: "h-full rounded-full transition-all duration-500",
4128
+ style: {
4129
+ width: `${progressPercent}%`,
4130
+ background: "linear-gradient(90deg, #4f46e5, #7c3aed)",
4131
+ boxShadow: "0 0 6px rgba(79, 102, 241, 0.4)"
4132
+ }
4133
+ }
4134
+ ) }),
4135
+ /* @__PURE__ */ jsxs19("div", { className: "flex-grow flex flex-col gap-5", children: [
4136
+ /* @__PURE__ */ jsxs19("div", { className: "flex items-start justify-between gap-4 flex-wrap sm:flex-nowrap", children: [
4137
+ /* @__PURE__ */ jsxs19("div", { children: [
4138
+ /* @__PURE__ */ jsxs19("h3", { className: "text-lg font-bold text-slate-900 mb-1.5 flex items-center gap-3", children: [
4139
+ activeSnippet.title,
4140
+ /* @__PURE__ */ jsxs19("span", { className: "text-[9px] font-extrabold uppercase px-2 py-0.5 rounded bg-indigo-50 border border-indigo-100 text-indigo-600", children: [
4141
+ "Step ",
4142
+ currentIndex + 1,
4143
+ " of ",
4144
+ totalSteps
4145
+ ] })
4146
+ ] }),
4147
+ /* @__PURE__ */ jsx21("p", { className: "text-xs text-slate-500 leading-relaxed italic", children: activeSnippet.description })
4148
+ ] }),
4149
+ /* @__PURE__ */ jsxs19("span", { className: "text-xs font-mono font-bold text-indigo-600 self-center shrink-0", children: [
4150
+ progressPercent,
4151
+ "% Complete"
4152
+ ] })
4153
+ ] }),
4154
+ /* @__PURE__ */ jsx21(CodeViewer, { snippet: activeSnippet }),
4155
+ /* @__PURE__ */ jsxs19("div", { className: "flex items-center justify-between border-t border-slate-100 pt-5 mt-auto", children: [
4156
+ /* @__PURE__ */ jsxs19(
4157
+ "button",
4158
+ {
4159
+ onClick: handlePrev,
4160
+ disabled: isFirst,
4161
+ className: `flex items-center gap-2 px-5 py-2.5 rounded-xl text-xs font-bold transition-all border ${isFirst ? "opacity-35 cursor-not-allowed border-slate-100 text-slate-300 bg-slate-50" : "bg-white border-slate-200 text-slate-600 hover:border-slate-300 hover:bg-slate-50 active:scale-95"}`,
4162
+ children: [
4163
+ /* @__PURE__ */ jsx21(ArrowLeft, { size: 13 }),
4164
+ " Previous Step"
4165
+ ]
4166
+ }
4167
+ ),
4168
+ /* @__PURE__ */ jsxs19(
4169
+ "button",
4170
+ {
4171
+ onClick: handleNext,
4172
+ disabled: isLast,
4173
+ className: `flex items-center gap-2 px-6 py-2.5 rounded-xl text-xs font-bold transition-all border ${isLast ? "opacity-35 cursor-not-allowed border-slate-100 text-slate-300 bg-slate-50" : "text-white border-transparent shadow-md active:scale-95 hover:-translate-y-0.5"}`,
4174
+ style: !isLast ? { background: "linear-gradient(135deg, #4f46e5, #7c3aed)", boxShadow: "0 4px 14px -4px rgba(79,70,229,0.35)" } : {},
4175
+ children: [
4176
+ isLast ? "Complete!" : "Next Step",
4177
+ " ",
4178
+ /* @__PURE__ */ jsx21(ArrowRight4, { size: 13 })
4179
+ ]
4180
+ }
4181
+ )
4182
+ ] })
4183
+ ] })
4184
+ ] });
4185
+ }
4186
+
4187
+ // src/components/Documentation.tsx
4188
+ import { jsx as jsx22, jsxs as jsxs20 } from "react/jsx-runtime";
4189
+ function Documentation() {
4190
+ const [activeSnippet, setActiveSnippet] = React15.useState(SNIPPETS[0]);
4191
+ return /* @__PURE__ */ jsxs20("div", { className: "max-w-6xl mx-auto", children: [
4192
+ /* @__PURE__ */ jsxs20("div", { className: "text-center mb-14", children: [
4193
+ /* @__PURE__ */ jsxs20("span", { className: "inline-flex items-center gap-2 px-3 py-1.5 rounded-full bg-indigo-50 border border-indigo-100 text-[10px] font-bold uppercase tracking-widest text-indigo-600 mb-5", children: [
4194
+ /* @__PURE__ */ jsx22("span", { className: "w-1.5 h-1.5 rounded-full bg-indigo-500 animate-pulse" }),
4195
+ "Developer Guide"
4196
+ ] }),
4197
+ /* @__PURE__ */ jsx22("h2", { className: "text-3xl md:text-4xl font-black text-slate-900 mb-4", children: LANDING_PAGE_CONTENT.guide.title }),
4198
+ /* @__PURE__ */ jsx22("p", { className: "text-slate-500 max-w-xl mx-auto text-base leading-relaxed", children: LANDING_PAGE_CONTENT.guide.subtitle })
4199
+ ] }),
4200
+ /* @__PURE__ */ jsxs20("div", { className: "w-full grid gap-8 lg:grid-cols-[270px_1fr] items-start", children: [
4201
+ /* @__PURE__ */ jsxs20("aside", { className: "flex flex-col gap-5", children: [
4202
+ /* @__PURE__ */ jsxs20("section", { children: [
4203
+ /* @__PURE__ */ jsxs20("h2", { className: "mb-3 text-[10px] font-black text-slate-400 uppercase tracking-[0.3em] flex items-center gap-2", children: [
4204
+ /* @__PURE__ */ jsx22(FileText3, { size: 12, className: "text-indigo-500" }),
4205
+ " Quick Start"
4206
+ ] }),
4207
+ /* @__PURE__ */ jsx22("ol", { className: "space-y-1", children: QUICK_START_STEPS.map((step, i) => {
4208
+ const isActive = activeSnippet.id === step.id;
4209
+ return /* @__PURE__ */ jsx22("li", { children: /* @__PURE__ */ jsxs20(
4210
+ "button",
4211
+ {
4212
+ onClick: () => {
4213
+ const s = SNIPPETS.find((s2) => s2.id === step.id);
4214
+ if (s) setActiveSnippet(s);
4215
+ },
4216
+ className: `w-full flex items-start gap-3 p-3 rounded-xl border text-left transition-all active:scale-[0.98] ${isActive ? "bg-indigo-50 border-indigo-200 shadow-sm" : "bg-white border-slate-200 hover:border-slate-300 hover:bg-slate-50"}`,
4217
+ children: [
4218
+ /* @__PURE__ */ jsx22("span", { className: `flex h-6 w-6 shrink-0 items-center justify-center rounded-lg font-mono text-[10px] font-bold border transition-all ${isActive ? "bg-indigo-600 text-white border-indigo-600 shadow-sm" : "bg-slate-100 text-slate-500 border-slate-200"}`, children: i + 1 }),
4219
+ /* @__PURE__ */ jsxs20("div", { className: "pt-0.5", children: [
4220
+ /* @__PURE__ */ jsx22("span", { className: `text-xs font-semibold block ${isActive ? "text-indigo-700 font-bold" : "text-slate-700"}`, children: step.text }),
4221
+ /* @__PURE__ */ jsxs20("span", { className: "text-[9px] text-slate-400 block mt-0.5", children: [
4222
+ "Step ",
4223
+ i + 1
4224
+ ] })
4225
+ ] })
4226
+ ]
4227
+ }
4228
+ ) }, step.id);
4229
+ }) })
4230
+ ] }),
4231
+ /* @__PURE__ */ jsxs20("section", { children: [
4232
+ /* @__PURE__ */ jsxs20("h2", { className: "mb-3 text-[10px] font-black text-slate-400 uppercase tracking-[0.3em] flex items-center gap-2", children: [
4233
+ /* @__PURE__ */ jsx22(Code2, { size: 12, className: "text-violet-500" }),
4234
+ " Advanced Options"
4235
+ ] }),
4236
+ /* @__PURE__ */ jsx22("ol", { className: "space-y-1", children: ADVANCED_STEPS.map((step, i) => {
4237
+ const isActive = activeSnippet.id === step.id;
4238
+ return /* @__PURE__ */ jsx22("li", { children: /* @__PURE__ */ jsxs20(
4239
+ "button",
4240
+ {
4241
+ onClick: () => {
4242
+ const s = SNIPPETS.find((s2) => s2.id === step.id);
4243
+ if (s) setActiveSnippet(s);
4244
+ },
4245
+ className: `w-full flex items-start gap-3 p-3 rounded-xl border text-left transition-all active:scale-[0.98] ${isActive ? "bg-violet-50 border-violet-200 shadow-sm" : "bg-white border-slate-200 hover:border-slate-300 hover:bg-slate-50"}`,
4246
+ children: [
4247
+ /* @__PURE__ */ jsx22("span", { className: `flex h-6 w-6 shrink-0 items-center justify-center rounded-lg font-mono text-[10px] font-bold border transition-all ${isActive ? "bg-violet-600 text-white border-violet-600 shadow-sm" : "bg-slate-100 text-slate-500 border-slate-200"}`, children: i + 5 }),
4248
+ /* @__PURE__ */ jsxs20("div", { className: "pt-0.5", children: [
4249
+ /* @__PURE__ */ jsx22("span", { className: `text-xs font-semibold block ${isActive ? "text-violet-700 font-bold" : "text-slate-700"}`, children: step.text }),
4250
+ /* @__PURE__ */ jsx22("span", { className: "text-[9px] text-slate-400 block mt-0.5", children: "Extension" })
4251
+ ] })
4252
+ ]
4253
+ }
4254
+ ) }, step.id);
4255
+ }) })
4256
+ ] }),
4257
+ /* @__PURE__ */ jsxs20("section", { className: "rounded-2xl border border-slate-200 bg-white p-5 shadow-sm", children: [
4258
+ /* @__PURE__ */ jsxs20("h2", { className: "mb-4 text-[10px] font-black text-slate-400 uppercase tracking-[0.3em] flex items-center gap-2", children: [
4259
+ /* @__PURE__ */ jsx22(Zap4, { size: 12, className: "text-indigo-500" }),
4260
+ " API Endpoints"
4261
+ ] }),
4262
+ /* @__PURE__ */ jsx22("div", { className: "grid gap-2", children: API_ENDPOINTS.map((slug) => /* @__PURE__ */ jsxs20(
4263
+ "div",
4264
+ {
4265
+ className: "flex items-center justify-between p-2.5 rounded-lg bg-slate-50 border border-slate-100 hover:border-indigo-200 hover:bg-indigo-50 transition-all group",
4266
+ children: [
4267
+ /* @__PURE__ */ jsxs20("span", { className: "text-[10px] font-mono text-slate-500 group-hover:text-indigo-600 transition-colors", children: [
4268
+ "/api/",
4269
+ slug
4270
+ ] }),
4271
+ /* @__PURE__ */ jsx22("span", { className: "text-[8px] font-bold text-indigo-600 bg-indigo-50 px-1.5 py-0.5 rounded border border-indigo-100", children: "POST" })
4272
+ ]
4273
+ },
4274
+ slug
4275
+ )) })
4276
+ ] })
4277
+ ] }),
4278
+ /* @__PURE__ */ jsx22("section", { className: "flex flex-col h-full min-h-[560px]", children: /* @__PURE__ */ jsx22("div", { className: "rounded-2xl border border-slate-200 bg-white overflow-hidden h-full shadow-sm", children: /* @__PURE__ */ jsx22(DocViewer, { activeSnippet, setActiveSnippet }) }) })
4279
+ ] }),
4280
+ /* @__PURE__ */ jsx22("div", { className: "mt-14 text-center", children: /* @__PURE__ */ jsxs20(
4281
+ "a",
4282
+ {
4283
+ href: "https://www.npmjs.com/package/@retrivora-ai/rag-engine",
4284
+ target: "_blank",
4285
+ rel: "noreferrer",
4286
+ className: "inline-flex items-center gap-3 px-8 py-4 rounded-2xl text-white font-bold text-sm shadow-lg transition-all hover:-translate-y-0.5",
4287
+ style: {
4288
+ background: "linear-gradient(135deg, #4f46e5, #7c3aed)",
4289
+ boxShadow: "0 8px 24px -6px rgba(79, 70, 229, 0.35)"
4290
+ },
4291
+ children: [
4292
+ /* @__PURE__ */ jsx22(Package3, { className: "w-5 h-5" }),
4293
+ "Get Started on NPM",
4294
+ /* @__PURE__ */ jsx22(ExternalLink2, { className: "w-4 h-4" })
4295
+ ]
4296
+ }
4297
+ ) })
4298
+ ] });
4299
+ }
4300
+
4301
+ // src/components/AmbientBackground.tsx
4302
+ import { jsx as jsx23, jsxs as jsxs21 } from "react/jsx-runtime";
4303
+ function AmbientBackground() {
4304
+ return /* @__PURE__ */ jsxs21("div", { className: "absolute inset-0 overflow-hidden pointer-events-none", children: [
4305
+ /* @__PURE__ */ jsx23(
4306
+ "div",
4307
+ {
4308
+ className: "absolute -top-24 -left-24 w-[600px] h-[600px] rounded-full opacity-25 blur-3xl",
4309
+ style: { background: "radial-gradient(circle, #c7d2fe 0%, #a5b4fc 40%, transparent 70%)" }
4310
+ }
4311
+ ),
4312
+ /* @__PURE__ */ jsx23(
4313
+ "div",
4314
+ {
4315
+ className: "absolute -top-20 right-0 w-[500px] h-[500px] rounded-full opacity-20 blur-3xl",
4316
+ style: { background: "radial-gradient(circle, #ddd6fe 0%, #c4b5fd 50%, transparent 70%)" }
4317
+ }
4318
+ ),
4319
+ /* @__PURE__ */ jsx23(
4320
+ "div",
4321
+ {
4322
+ className: "absolute inset-0 opacity-[0.025]",
4323
+ style: {
4324
+ backgroundImage: "linear-gradient(#6366f1 1px, transparent 1px), linear-gradient(90deg, #6366f1 1px, transparent 1px)",
4325
+ backgroundSize: "56px 56px"
4326
+ }
4327
+ }
4328
+ )
4329
+ ] });
4330
+ }
4331
+
3413
4332
  // src/exceptions/index.ts
3414
4333
  var RetrivoraError = class extends Error {
3415
4334
  constructor(message, code, details) {
@@ -3450,13 +4369,18 @@ var AuthenticationException = class extends RetrivoraError {
3450
4369
  }
3451
4370
  };
3452
4371
  export {
4372
+ AmbientBackground,
4373
+ ArchitectureCardsSection,
3453
4374
  AuthenticationException,
3454
4375
  ChatWidget,
3455
4376
  ChatWindow,
3456
4377
  ConfigProvider,
3457
4378
  ConfigurationException,
3458
4379
  DocumentUpload,
4380
+ Documentation,
3459
4381
  EmbeddingFailedException,
4382
+ Hero,
4383
+ Lifecycle,
3460
4384
  MessageBubble,
3461
4385
  ObservabilityPanel,
3462
4386
  ProviderNotFoundException,