@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.js CHANGED
@@ -1,4 +1,5 @@
1
1
  "use strict";
2
+ "use client";
2
3
  var __create = Object.create;
3
4
  var __defProp = Object.defineProperty;
4
5
  var __defProps = Object.defineProperties;
@@ -59,13 +60,18 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
59
60
  // src/index.ts
60
61
  var index_exports = {};
61
62
  __export(index_exports, {
63
+ AmbientBackground: () => AmbientBackground,
64
+ ArchitectureCardsSection: () => ArchitectureCardsSection,
62
65
  AuthenticationException: () => AuthenticationException,
63
66
  ChatWidget: () => ChatWidget,
64
67
  ChatWindow: () => ChatWindow,
65
68
  ConfigProvider: () => ConfigProvider,
66
69
  ConfigurationException: () => ConfigurationException,
67
70
  DocumentUpload: () => DocumentUpload,
71
+ Documentation: () => Documentation,
68
72
  EmbeddingFailedException: () => EmbeddingFailedException,
73
+ Hero: () => Hero,
74
+ Lifecycle: () => Lifecycle,
69
75
  MessageBubble: () => MessageBubble,
70
76
  ObservabilityPanel: () => ObservabilityPanel,
71
77
  ProviderNotFoundException: () => ProviderNotFoundException,
@@ -78,7 +84,31 @@ __export(index_exports, {
78
84
  useRagChat: () => useRagChat
79
85
  });
80
86
  module.exports = __toCommonJS(index_exports);
81
- var import_index = require("./index.css");
87
+
88
+ // #style-inject:#style-inject
89
+ function styleInject(css, { insertAt } = {}) {
90
+ if (!css || typeof document === "undefined") return;
91
+ const head = document.head || document.getElementsByTagName("head")[0];
92
+ const style = document.createElement("style");
93
+ style.type = "text/css";
94
+ if (insertAt === "top") {
95
+ if (head.firstChild) {
96
+ head.insertBefore(style, head.firstChild);
97
+ } else {
98
+ head.appendChild(style);
99
+ }
100
+ } else {
101
+ head.appendChild(style);
102
+ }
103
+ if (style.styleSheet) {
104
+ style.styleSheet.cssText = css;
105
+ } else {
106
+ style.appendChild(document.createTextNode(css));
107
+ }
108
+ }
109
+
110
+ // src/index.css
111
+ 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');
82
112
 
83
113
  // src/components/ChatWidget.tsx
84
114
  var import_react13 = require("react");
@@ -1461,86 +1491,6 @@ function ObservabilityPanel({ trace, primaryColor = "#6366f1" }) {
1461
1491
  ] });
1462
1492
  }
1463
1493
 
1464
- // src/components/HourglassLoader.tsx
1465
- var import_jsx_runtime9 = require("react/jsx-runtime");
1466
- var HourglassLoader = ({
1467
- size = 16,
1468
- primaryColor = "#10b981",
1469
- glow = false
1470
- }) => {
1471
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
1472
- "svg",
1473
- {
1474
- xmlns: "http://www.w3.org/2000/svg",
1475
- viewBox: "0 0 100 100",
1476
- preserveAspectRatio: "xMidYMid",
1477
- style: {
1478
- width: size,
1479
- height: size,
1480
- background: "transparent",
1481
- filter: glow ? `drop-shadow(0 0 4px ${primaryColor})` : "none"
1482
- },
1483
- children: /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("g", { children: [
1484
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
1485
- "animateTransform",
1486
- {
1487
- attributeName: "transform",
1488
- type: "rotate",
1489
- calcMode: "spline",
1490
- values: "0 50 50; 0 50 50; 180 50 50",
1491
- keyTimes: "0; 0.8; 1",
1492
- keySplines: "0 0 1 1; 0.4 0 0.2 1",
1493
- dur: "2s",
1494
- repeatCount: "indefinite"
1495
- }
1496
- ),
1497
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
1498
- "path",
1499
- {
1500
- 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",
1501
- fill: "none",
1502
- stroke: primaryColor,
1503
- strokeWidth: "5",
1504
- strokeLinejoin: "round",
1505
- strokeLinecap: "round"
1506
- }
1507
- ),
1508
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("path", { fill: primaryColor, children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
1509
- "animate",
1510
- {
1511
- attributeName: "d",
1512
- 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",
1513
- keyTimes: "0; 0.8; 1",
1514
- dur: "2s",
1515
- repeatCount: "indefinite"
1516
- }
1517
- ) }),
1518
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("path", { fill: primaryColor, children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
1519
- "animate",
1520
- {
1521
- attributeName: "d",
1522
- 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",
1523
- keyTimes: "0; 0.8; 1",
1524
- dur: "2s",
1525
- repeatCount: "indefinite"
1526
- }
1527
- ) }),
1528
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("line", { x1: "50", y1: "50", x2: "50", y2: "80", stroke: primaryColor, strokeWidth: "3", children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
1529
- "animate",
1530
- {
1531
- attributeName: "opacity",
1532
- values: "0; 1; 1; 0; 0",
1533
- keyTimes: "0; 0.1; 0.7; 0.8; 1",
1534
- dur: "2s",
1535
- repeatCount: "indefinite"
1536
- }
1537
- ) })
1538
- ] })
1539
- }
1540
- );
1541
- };
1542
- var HourglassLoader_default = HourglassLoader;
1543
-
1544
1494
  // src/utils/synonyms.ts
1545
1495
  var FIELD_SYNONYMS = {
1546
1496
  name: ["product", "item", "title", "label", "heading", "subject", "product name", "item name"],
@@ -1913,7 +1863,7 @@ var import_react8 = __toESM(require("react"));
1913
1863
 
1914
1864
  // src/components/UIDispatcher.tsx
1915
1865
  var import_react7 = __toESM(require("react"));
1916
- var import_jsx_runtime10 = require("react/jsx-runtime");
1866
+ var import_jsx_runtime9 = require("react/jsx-runtime");
1917
1867
  function normalizeTabularRows(rows, columns) {
1918
1868
  if (!Array.isArray(rows)) return [];
1919
1869
  const SYNONYMS = {
@@ -2027,13 +1977,13 @@ function UIDispatcher({ rawContent, primaryColor, accentColor, isStreaming, onAd
2027
1977
  }
2028
1978
  }, [rawContent, isStreaming]);
2029
1979
  if ("loading" in result) {
2030
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("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: [
2031
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "w-5 h-5 border-2 border-indigo-500 border-t-transparent rounded-full animate-spin" }),
2032
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("p", { className: "text-xs text-slate-500 font-medium italic", children: "Preparing view..." })
1980
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("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: [
1981
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: "w-5 h-5 border-2 border-indigo-500 border-t-transparent rounded-full animate-spin" }),
1982
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("p", { className: "text-xs text-slate-500 font-medium italic", children: "Preparing view..." })
2033
1983
  ] });
2034
1984
  }
2035
1985
  if ("error" in result) {
2036
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("pre", { className: "p-4 my-2 bg-slate-900 text-slate-100 rounded-lg text-[10px] overflow-auto max-h-40", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("code", { children: rawContent }) });
1986
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("pre", { className: "p-4 my-2 bg-slate-900 text-slate-100 rounded-lg text-[10px] overflow-auto max-h-40", children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("code", { children: rawContent }) });
2037
1987
  }
2038
1988
  const { config } = result;
2039
1989
  const isCompact = viewportSize === "compact";
@@ -2041,10 +1991,10 @@ function UIDispatcher({ rawContent, primaryColor, accentColor, isStreaming, onAd
2041
1991
  const hasDescription = typeof config.description === "string" && config.description.trim().length > 0;
2042
1992
  switch (config.view) {
2043
1993
  case "chart":
2044
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("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: [
2045
- config.title && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("h4", { className: `${isCompact ? "text-[11px] mb-3" : "text-xs mb-4"} font-semibold text-slate-500 px-2`, children: config.title }),
2046
- hasDescription && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("p", { className: `px-2 ${isCompact ? "text-xs" : "text-sm"} text-slate-500 dark:text-white/60`, children: config.description }),
2047
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1994
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("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: [
1995
+ config.title && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("h4", { className: `${isCompact ? "text-[11px] mb-3" : "text-xs mb-4"} font-semibold text-slate-500 px-2`, children: config.title }),
1996
+ hasDescription && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("p", { className: `px-2 ${isCompact ? "text-xs" : "text-sm"} text-slate-500 dark:text-white/60`, children: config.description }),
1997
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
2048
1998
  DynamicChart,
2049
1999
  {
2050
2000
  config: {
@@ -2060,7 +2010,7 @@ function UIDispatcher({ rawContent, primaryColor, accentColor, isStreaming, onAd
2060
2010
  isStreaming
2061
2011
  }
2062
2012
  ),
2063
- hasInsights && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "mt-4 flex flex-wrap gap-2 px-2", children: (_a = config.insights) == null ? void 0 : _a.map((insight, i) => /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
2013
+ hasInsights && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: "mt-4 flex flex-wrap gap-2 px-2", children: (_a = config.insights) == null ? void 0 : _a.map((insight, i) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
2064
2014
  "span",
2065
2015
  {
2066
2016
  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`,
@@ -2070,10 +2020,10 @@ function UIDispatcher({ rawContent, primaryColor, accentColor, isStreaming, onAd
2070
2020
  )) })
2071
2021
  ] });
2072
2022
  case "carousel":
2073
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "my-4", children: [
2074
- config.title && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("h4", { className: `${isCompact ? "mb-1.5 text-[11px]" : "mb-2 text-xs"} font-semibold text-slate-500`, children: config.title }),
2075
- hasDescription && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("p", { className: `mb-3 ${isCompact ? "text-xs" : "text-sm"} text-slate-500 dark:text-white/60`, children: config.description }),
2076
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(ProductCarousel, { products: config.data.map((item) => {
2023
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "my-4", children: [
2024
+ config.title && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("h4", { className: `${isCompact ? "mb-1.5 text-[11px]" : "mb-2 text-xs"} font-semibold text-slate-500`, children: config.title }),
2025
+ hasDescription && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("p", { className: `mb-3 ${isCompact ? "text-xs" : "text-sm"} text-slate-500 dark:text-white/60`, children: config.description }),
2026
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(ProductCarousel, { products: config.data.map((item) => {
2077
2027
  var _a2;
2078
2028
  return __spreadProps(__spreadValues({}, item), {
2079
2029
  image: (_a2 = item.image) != null ? _a2 : typeof resolveImage === "function" ? resolveImage(item) : void 0
@@ -2081,10 +2031,10 @@ function UIDispatcher({ rawContent, primaryColor, accentColor, isStreaming, onAd
2081
2031
  }), primaryColor, onAddToCart })
2082
2032
  ] });
2083
2033
  case "table":
2084
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("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: [
2085
- config.title && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("h4", { className: `${isCompact ? "text-[11px]" : "text-xs"} font-semibold text-slate-500 mb-2`, children: config.title }),
2086
- hasDescription && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("p", { className: `mb-3 ${isCompact ? "text-xs" : "text-sm"} text-slate-500 dark:text-white/60`, children: config.description }),
2087
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
2034
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("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: [
2035
+ config.title && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("h4", { className: `${isCompact ? "text-[11px]" : "text-xs"} font-semibold text-slate-500 mb-2`, children: config.title }),
2036
+ hasDescription && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("p", { className: `mb-3 ${isCompact ? "text-xs" : "text-sm"} text-slate-500 dark:text-white/60`, children: config.description }),
2037
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
2088
2038
  VisualizationRenderer,
2089
2039
  {
2090
2040
  data: {
@@ -2107,7 +2057,7 @@ function UIDispatcher({ rawContent, primaryColor, accentColor, isStreaming, onAd
2107
2057
  }
2108
2058
 
2109
2059
  // src/components/MarkdownComponents.tsx
2110
- var import_jsx_runtime11 = require("react/jsx-runtime");
2060
+ var import_jsx_runtime10 = require("react/jsx-runtime");
2111
2061
  function createMarkdownComponents({
2112
2062
  primaryColor,
2113
2063
  accentColor,
@@ -2122,12 +2072,12 @@ function createMarkdownComponents({
2122
2072
  table: (_a) => {
2123
2073
  var props = __objRest(_a, []);
2124
2074
  if (isStreaming) {
2125
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("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: [
2126
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "w-4 h-4 border-2 border-indigo-500 border-t-transparent rounded-full animate-spin" }),
2127
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("p", { className: "text-xs text-slate-500 font-medium italic animate-pulse", children: "Generating data table..." })
2075
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("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: [
2076
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "w-4 h-4 border-2 border-indigo-500 border-t-transparent rounded-full animate-spin" }),
2077
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("p", { className: "text-xs text-slate-500 font-medium italic animate-pulse", children: "Generating data table..." })
2128
2078
  ] });
2129
2079
  }
2130
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("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__ */ (0, import_jsx_runtime11.jsx)("div", { className: "overflow-x-auto", children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
2080
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("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__ */ (0, import_jsx_runtime10.jsx)("div", { className: "overflow-x-auto", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
2131
2081
  "table",
2132
2082
  __spreadValues({
2133
2083
  className: "!table w-full text-left border-collapse min-w-[400px] text-sm"
@@ -2136,7 +2086,7 @@ function createMarkdownComponents({
2136
2086
  },
2137
2087
  thead: (_b) => {
2138
2088
  var props = __objRest(_b, []);
2139
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
2089
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
2140
2090
  "thead",
2141
2091
  __spreadValues({
2142
2092
  className: "!table-header-group bg-slate-50 dark:bg-white/5 border-b border-slate-200 dark:border-white/10"
@@ -2145,11 +2095,11 @@ function createMarkdownComponents({
2145
2095
  },
2146
2096
  tbody: (_c) => {
2147
2097
  var props = __objRest(_c, []);
2148
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("tbody", __spreadValues({ className: "!table-row-group divide-y divide-slate-100 dark:divide-white/5" }, props));
2098
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("tbody", __spreadValues({ className: "!table-row-group divide-y divide-slate-100 dark:divide-white/5" }, props));
2149
2099
  },
2150
2100
  tr: (_d) => {
2151
2101
  var props = __objRest(_d, []);
2152
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
2102
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
2153
2103
  "tr",
2154
2104
  __spreadValues({
2155
2105
  className: "!table-row hover:bg-slate-50/70 dark:hover:bg-white/5 transition-colors"
@@ -2158,7 +2108,7 @@ function createMarkdownComponents({
2158
2108
  },
2159
2109
  th: (_e) => {
2160
2110
  var _f = _e, { children } = _f, props = __objRest(_f, ["children"]);
2161
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
2111
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
2162
2112
  "th",
2163
2113
  __spreadProps(__spreadValues({
2164
2114
  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"
@@ -2169,7 +2119,7 @@ function createMarkdownComponents({
2169
2119
  },
2170
2120
  td: (_g) => {
2171
2121
  var _h = _g, { children } = _h, props = __objRest(_h, ["children"]);
2172
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
2122
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
2173
2123
  "td",
2174
2124
  __spreadProps(__spreadValues({
2175
2125
  className: "!table-cell px-4 py-3 text-slate-600 dark:text-white/70 whitespace-nowrap text-sm"
@@ -2192,7 +2142,7 @@ function createMarkdownComponents({
2192
2142
  const lang = (_a = /language-(\w+)/.exec(className != null ? className : "")) == null ? void 0 : _a[1];
2193
2143
  if (!inline && (lang === "ui" || lang === "chart" || lang === "json")) {
2194
2144
  const content = String(children != null ? children : "").trim();
2195
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
2145
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
2196
2146
  UIDispatcher,
2197
2147
  {
2198
2148
  rawContent: content,
@@ -2207,7 +2157,7 @@ function createMarkdownComponents({
2207
2157
  if (!inline) {
2208
2158
  const content = String(children != null ? children : "").trim();
2209
2159
  if (content.startsWith("{") && content.endsWith("}")) {
2210
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
2160
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
2211
2161
  UIDispatcher,
2212
2162
  {
2213
2163
  rawContent: content,
@@ -2219,10 +2169,47 @@ function createMarkdownComponents({
2219
2169
  }
2220
2170
  );
2221
2171
  }
2172
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CodeBlock, { language: lang, children: content });
2222
2173
  }
2223
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("code", __spreadProps(__spreadValues({ className }, props), { children: typeof children === "string" || typeof children === "number" ? children : JSON.stringify(children) }));
2174
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("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) }));
2175
+ }
2176
+ };
2177
+ }
2178
+ function CodeBlock({ children, language }) {
2179
+ const [copied, setCopied] = import_react8.default.useState(false);
2180
+ const handleCopy = async () => {
2181
+ try {
2182
+ await navigator.clipboard.writeText(children);
2183
+ setCopied(true);
2184
+ setTimeout(() => setCopied(false), 2e3);
2185
+ } catch (e) {
2186
+ console.warn("Failed to copy code", e);
2224
2187
  }
2225
2188
  };
2189
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("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: [
2190
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("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: [
2191
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "font-mono lowercase", children: language || "code" }),
2192
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
2193
+ "button",
2194
+ {
2195
+ onClick: handleCopy,
2196
+ 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",
2197
+ type: "button",
2198
+ children: copied ? /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
2199
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("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__ */ (0, import_jsx_runtime10.jsx)("polyline", { points: "20 6 9 17 4 12" }) }),
2200
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "text-emerald-500", children: "Copied!" })
2201
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
2202
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("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: [
2203
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("rect", { x: "9", y: "9", width: "13", height: "13", rx: "2", ry: "2" }),
2204
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("path", { d: "M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" })
2205
+ ] }),
2206
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { children: "Copy" })
2207
+ ] })
2208
+ }
2209
+ )
2210
+ ] }),
2211
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "p-4 overflow-x-auto font-mono text-[11px] leading-relaxed text-slate-200 bg-slate-900/90 whitespace-pre", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("code", { children }) })
2212
+ ] });
2226
2213
  }
2227
2214
  function normaliseChild(children) {
2228
2215
  if (typeof children === "object" && children !== null && !Array.isArray(children) && !import_react8.default.isValidElement(children)) {
@@ -2234,7 +2221,7 @@ function normaliseChild(children) {
2234
2221
  // src/components/ThinkingBlock.tsx
2235
2222
  var import_react9 = require("react");
2236
2223
  var import_lucide_react6 = require("lucide-react");
2237
- var import_jsx_runtime12 = require("react/jsx-runtime");
2224
+ var import_jsx_runtime11 = require("react/jsx-runtime");
2238
2225
  function ThinkingBlock({ thinking, thinkingMs, isStreaming = false }) {
2239
2226
  const [isExpanded, setIsExpanded] = (0, import_react9.useState)(true);
2240
2227
  const containerRef = (0, import_react9.useRef)(null);
@@ -2251,22 +2238,22 @@ function ThinkingBlock({ thinking, thinkingMs, isStreaming = false }) {
2251
2238
  }
2252
2239
  }, [thinking, isStreaming, isExpanded]);
2253
2240
  const durationSec = thinkingMs ? (thinkingMs / 1e3).toFixed(1) : null;
2254
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("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: [
2255
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
2241
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("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: [
2242
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
2256
2243
  "button",
2257
2244
  {
2258
2245
  onClick: () => setIsExpanded(!isExpanded),
2259
2246
  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",
2260
2247
  children: [
2261
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "flex items-center gap-2", children: [
2262
- isStreaming ? /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_lucide_react6.Loader2, { className: "w-3.5 h-3.5 animate-spin text-slate-400 dark:text-white/30" }) : /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_lucide_react6.Brain, { className: "w-3.5 h-3.5 text-slate-400 dark:text-white/40" }),
2263
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { children: isStreaming ? "Thinking..." : durationSec ? `Thought for ${durationSec}s` : "Thinking process" })
2248
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "flex items-center gap-2", children: [
2249
+ isStreaming ? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_lucide_react6.Loader2, { className: "w-3.5 h-3.5 animate-spin text-slate-400 dark:text-white/30" }) : /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_lucide_react6.Brain, { className: "w-3.5 h-3.5 text-slate-400 dark:text-white/40" }),
2250
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { children: isStreaming ? "Thinking..." : durationSec ? `Thought for ${durationSec}s` : "Thinking process" })
2264
2251
  ] }),
2265
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { children: isExpanded ? /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_lucide_react6.ChevronDown, { className: "w-3.5 h-3.5 text-slate-400 dark:text-white/30" }) : /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_lucide_react6.ChevronRight, { className: "w-3.5 h-3.5 text-slate-400 dark:text-white/30" }) })
2252
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { children: isExpanded ? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_lucide_react6.ChevronDown, { className: "w-3.5 h-3.5 text-slate-400 dark:text-white/30" }) : /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_lucide_react6.ChevronRight, { className: "w-3.5 h-3.5 text-slate-400 dark:text-white/30" }) })
2266
2253
  ]
2267
2254
  }
2268
2255
  ),
2269
- isExpanded && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
2256
+ isExpanded && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
2270
2257
  "div",
2271
2258
  {
2272
2259
  ref: containerRef,
@@ -2278,7 +2265,7 @@ function ThinkingBlock({ thinking, thinkingMs, isStreaming = false }) {
2278
2265
  }
2279
2266
 
2280
2267
  // src/components/MessageBubble.tsx
2281
- var import_jsx_runtime13 = require("react/jsx-runtime");
2268
+ var import_jsx_runtime12 = require("react/jsx-runtime");
2282
2269
  function normalizePlusSeparatedLists(raw) {
2283
2270
  return raw.split("\n").map((line) => {
2284
2271
  const productListLine = /[—:]\s*\d+\s+\+\s+[A-Za-z]/.test(line) || /\b(products?|categories?|in stock|out of stock)\b/i.test(line);
@@ -2287,7 +2274,62 @@ function normalizePlusSeparatedLists(raw) {
2287
2274
  }).join("\n");
2288
2275
  }
2289
2276
  function stripLeakedAnswerWrappers2(raw) {
2290
- 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();
2277
+ 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();
2278
+ }
2279
+ function formatTime(isoString) {
2280
+ if (!isoString) return "";
2281
+ try {
2282
+ const d = new Date(isoString);
2283
+ return d.toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" });
2284
+ } catch (e) {
2285
+ return "";
2286
+ }
2287
+ }
2288
+ function FeedbackBar({ messageId, onFeedback, primaryColor }) {
2289
+ const [rating, setRating] = import_react10.default.useState(null);
2290
+ const [submitting, setSubmitting] = import_react10.default.useState(false);
2291
+ const handleRate = async (r) => {
2292
+ if (rating !== null || submitting) return;
2293
+ setSubmitting(true);
2294
+ setRating(r);
2295
+ try {
2296
+ await onFeedback(messageId, r);
2297
+ } catch (e) {
2298
+ } finally {
2299
+ setSubmitting(false);
2300
+ }
2301
+ };
2302
+ const isLocked = rating !== null;
2303
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "flex items-center gap-1", children: [
2304
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { className: "h-3 w-px bg-slate-200 dark:bg-white/10 mx-1" }),
2305
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
2306
+ "button",
2307
+ {
2308
+ onClick: () => handleRate("thumbs_up"),
2309
+ disabled: isLocked,
2310
+ title: rating === "thumbs_up" ? "You liked this" : "Good response",
2311
+ 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"}`,
2312
+ children: [
2313
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_lucide_react7.ThumbsUp, { className: "w-3 h-3" }),
2314
+ !isLocked && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("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" })
2315
+ ]
2316
+ }
2317
+ ),
2318
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
2319
+ "button",
2320
+ {
2321
+ onClick: () => handleRate("thumbs_down"),
2322
+ disabled: isLocked,
2323
+ title: rating === "thumbs_down" ? "You disliked this" : "Bad response",
2324
+ 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"}`,
2325
+ children: [
2326
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_lucide_react7.ThumbsDown, { className: "w-3 h-3" }),
2327
+ !isLocked && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("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" })
2328
+ ]
2329
+ }
2330
+ ),
2331
+ isLocked && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("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" })
2332
+ ] });
2291
2333
  }
2292
2334
  function MessageBubble({
2293
2335
  message,
@@ -2296,7 +2338,8 @@ function MessageBubble({
2296
2338
  primaryColor = "#6366f1",
2297
2339
  accentColor = "#8b5cf6",
2298
2340
  onAddToCart,
2299
- viewportSize = "large"
2341
+ viewportSize = "large",
2342
+ onFeedback
2300
2343
  }) {
2301
2344
  var _a;
2302
2345
  const isUser = message.role === "user";
@@ -2324,7 +2367,7 @@ function MessageBubble({
2324
2367
  if (type && !["text", "table"].includes(type)) return true;
2325
2368
  }
2326
2369
  if (structuredContent.payload) {
2327
- return /"?(?:view|type|chartType)"?\s*:\s*"?(?:chart|carousel|pie|bar|line|product_carousel)"?/i.test(structuredContent.payload);
2370
+ return /\"?(?:view|type|chartType)\"?\s*:\s*\"?(?:chart|carousel|pie|bar|line|product_carousel)\"?/i.test(structuredContent.payload);
2328
2371
  }
2329
2372
  return false;
2330
2373
  }, [message.uiTransformation, structuredContent.payload]);
@@ -2390,17 +2433,19 @@ ${match.trim()}
2390
2433
  () => createMarkdownComponents({ primaryColor, accentColor, isStreaming, onAddToCart, viewportSize }),
2391
2434
  [primaryColor, accentColor, isStreaming, onAddToCart, viewportSize]
2392
2435
  );
2393
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: `flex ${isCompact ? "gap-2" : "gap-3"} ${isUser ? "flex-row-reverse" : "flex-row"} items-start`, children: [
2394
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
2436
+ const timeLabel = formatTime(message.createdAt);
2437
+ const isCompleted = !isStreaming && message.content;
2438
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: `flex ${isCompact ? "gap-2" : "gap-3"} ${isUser ? "flex-row-reverse" : "flex-row"} items-start`, children: [
2439
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
2395
2440
  "div",
2396
2441
  {
2397
- 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"}`,
2442
+ 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" : ""}`,
2398
2443
  style: isUser ? { background: `linear-gradient(135deg, ${primaryColor}, ${accentColor})` } : {},
2399
- children: isUser ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_lucide_react7.User, { className: `${isCompact ? "w-3.5 h-3.5" : "w-4 h-4"} text-white` }) : /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_lucide_react7.Bot, { className: `${isCompact ? "w-3.5 h-3.5" : "w-4 h-4"}` })
2444
+ children: isUser ? /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_lucide_react7.User, { className: `${isCompact ? "w-3.5 h-3.5" : "w-4 h-4"} text-white` }) : /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_lucide_react7.Bot, { className: `${isCompact ? "w-3.5 h-3.5" : "w-4 h-4"}` })
2400
2445
  }
2401
2446
  ),
2402
- /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("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: [
2403
- !isUser && message.thinking && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
2447
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("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: [
2448
+ !isUser && message.thinking && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
2404
2449
  ThinkingBlock,
2405
2450
  {
2406
2451
  thinking: message.thinking,
@@ -2408,27 +2453,27 @@ ${match.trim()}
2408
2453
  isStreaming: isStreaming && !message.content
2409
2454
  }
2410
2455
  ),
2411
- /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
2456
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
2412
2457
  "div",
2413
2458
  {
2414
- 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"}`,
2459
+ 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"}`,
2415
2460
  style: isUser ? { background: `linear-gradient(135deg, ${primaryColor}, ${accentColor})` } : {},
2416
2461
  children: [
2417
- !isUser && !isStreaming && message.content && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
2462
+ !isUser && isCompleted && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
2418
2463
  "button",
2419
2464
  {
2420
2465
  onClick: handleCopy,
2421
- 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`,
2466
+ 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`,
2422
2467
  title: copied ? "Copied!" : "Copy response",
2423
- children: copied ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_lucide_react7.Check, { className: "w-3.5 h-3.5" }) : /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_lucide_react7.Copy, { className: "w-3.5 h-3.5" })
2468
+ children: copied ? /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_lucide_react7.Check, { className: "w-3.5 h-3.5" }) : /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_lucide_react7.Copy, { className: "w-3.5 h-3.5" })
2424
2469
  }
2425
2470
  ),
2426
- isStreaming && !message.content ? /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("span", { className: "flex items-center gap-1 py-1", children: [
2427
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "w-1.5 h-1.5 rounded-full bg-slate-400 dark:bg-white/60 animate-bounce [animation-delay:0ms]" }),
2428
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "w-1.5 h-1.5 rounded-full bg-slate-400 dark:bg-white/60 animate-bounce [animation-delay:150ms]" }),
2429
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "w-1.5 h-1.5 rounded-full bg-slate-400 dark:bg-white/60 animate-bounce [animation-delay:300ms]" })
2430
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: `prose ${isCompact ? "prose-xs" : "prose-sm"} max-w-none break-words ${isUser ? "prose-invert" : "dark:prose-invert"}`, children: [
2431
- !isUser && structuredContent.payload && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
2471
+ isStreaming && !message.content ? /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("span", { className: "flex items-center gap-1 py-1", children: [
2472
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { className: "w-1.5 h-1.5 rounded-full bg-slate-400 dark:bg-white/60 animate-bounce [animation-delay:0ms]" }),
2473
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { className: "w-1.5 h-1.5 rounded-full bg-slate-400 dark:bg-white/60 animate-bounce [animation-delay:150ms]" }),
2474
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { className: "w-1.5 h-1.5 rounded-full bg-slate-400 dark:bg-white/60 animate-bounce [animation-delay:300ms]" })
2475
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: `prose ${isCompact ? "prose-xs" : "prose-sm"} max-w-none break-words ${isUser ? "prose-invert" : "dark:prose-invert"}`, children: [
2476
+ !isUser && structuredContent.payload && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
2432
2477
  UIDispatcher,
2433
2478
  {
2434
2479
  rawContent: structuredContent.payload,
@@ -2439,19 +2484,14 @@ ${match.trim()}
2439
2484
  viewportSize
2440
2485
  }
2441
2486
  ),
2442
- !shouldRenderStructuredOnly && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_react_markdown.default, { components: markdownComponents, children: processedMarkdown }),
2443
- isStreaming && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("span", { className: "inline-flex items-center gap-1.5 ml-2 text-emerald-500 animate-pulse align-middle text-xs font-medium", children: [
2444
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
2445
- HourglassLoader_default,
2446
- {
2447
- size: 18,
2448
- primaryColor,
2449
- accentColor,
2450
- glow: false
2451
- }
2452
- ),
2453
- "Thinking..."
2454
- ] })
2487
+ !shouldRenderStructuredOnly && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_markdown.default, { components: markdownComponents, children: processedMarkdown }),
2488
+ isStreaming && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
2489
+ "span",
2490
+ {
2491
+ className: "inline-block w-2.5 h-4 ml-1.5 animate-[pulse_1.2s_infinite] align-middle rounded-sm",
2492
+ style: { backgroundColor: primaryColor }
2493
+ }
2494
+ )
2455
2495
  ] })
2456
2496
  ]
2457
2497
  }
@@ -2466,7 +2506,7 @@ ${match.trim()}
2466
2506
  )
2467
2507
  );
2468
2508
  if (hasProductSource) {
2469
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "w-full mt-3", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
2509
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: "w-full mt-3", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
2470
2510
  VisualizationRenderer,
2471
2511
  {
2472
2512
  data: { type: "product_carousel", title: "Recommended Products", description: "Loading...", data: [] },
@@ -2484,7 +2524,7 @@ ${match.trim()}
2484
2524
  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");
2485
2525
  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()));
2486
2526
  if (!shouldShow) return null;
2487
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "w-full mt-3", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
2527
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: "w-full mt-3", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
2488
2528
  VisualizationRenderer,
2489
2529
  {
2490
2530
  data: ui,
@@ -2495,7 +2535,7 @@ ${match.trim()}
2495
2535
  }
2496
2536
  ) });
2497
2537
  })(),
2498
- !isUser && !hasRichUI && !shouldSuppressProductCarousel && allProducts.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "w-full mt-1", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
2538
+ !isUser && !hasRichUI && !shouldSuppressProductCarousel && allProducts.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: "w-full mt-1", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
2499
2539
  ProductCarousel,
2500
2540
  {
2501
2541
  products: allProducts,
@@ -2503,36 +2543,48 @@ ${match.trim()}
2503
2543
  onAddToCart
2504
2544
  }
2505
2545
  ) }),
2506
- !isUser && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "flex items-center gap-4 mt-1 w-full flex-wrap", children: [
2507
- sources && sources.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
2546
+ !isUser && /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: `flex items-center gap-3 mt-1.5 w-full flex-wrap ${isCompact ? "gap-2" : "gap-3"}`, children: [
2547
+ sources && sources.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
2508
2548
  "button",
2509
2549
  {
2510
2550
  onClick: () => setShowSources((s) => !s),
2511
- className: "text-[11px] text-indigo-400 hover:text-indigo-300 transition-colors flex items-center gap-1",
2551
+ 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",
2512
2552
  children: [
2513
- showSources ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_lucide_react7.ChevronDown, { className: "w-3 h-3" }) : /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_lucide_react7.ChevronRight, { className: "w-3 h-3" }),
2553
+ showSources ? /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_lucide_react7.ChevronDown, { className: "w-3 h-3" }) : /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_lucide_react7.ChevronRight, { className: "w-3 h-3" }),
2514
2554
  sources.length,
2515
2555
  " source",
2516
- sources.length !== 1 ? "s" : "",
2517
- " used"
2556
+ sources.length !== 1 ? "s" : ""
2518
2557
  ]
2519
2558
  }
2520
2559
  ),
2521
- message.trace && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
2560
+ message.trace && /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
2522
2561
  "button",
2523
2562
  {
2524
2563
  onClick: () => setShowTrace((t) => !t),
2525
- className: "text-[11px] text-emerald-500 hover:text-emerald-400 transition-colors flex items-center gap-1",
2564
+ 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",
2526
2565
  children: [
2527
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_lucide_react7.Activity, { className: "w-3 h-3" }),
2528
- showTrace ? "Hide Trace" : "Trace"
2566
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_lucide_react7.Activity, { className: "w-3 h-3" }),
2567
+ showTrace ? "Hide trace" : "Trace"
2529
2568
  ]
2530
2569
  }
2570
+ ),
2571
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: "flex-1" }),
2572
+ timeLabel && isCompleted && /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("span", { className: "flex items-center gap-1 text-[10px] text-slate-300 dark:text-white/20 font-medium select-none", children: [
2573
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_lucide_react7.Clock, { className: "w-2.5 h-2.5" }),
2574
+ timeLabel
2575
+ ] }),
2576
+ isCompleted && onFeedback && message.id && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
2577
+ FeedbackBar,
2578
+ {
2579
+ messageId: message.id,
2580
+ onFeedback,
2581
+ primaryColor
2582
+ }
2531
2583
  )
2532
2584
  ] }),
2533
- /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "w-full flex flex-col gap-2 min-w-0", children: [
2534
- showSources && sources && sources.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "mt-1 flex flex-col gap-2", children: sources.map((src, i) => /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(SourceCard, { source: src, index: i }, src.id)) }),
2535
- showTrace && message.trace && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(ObservabilityPanel, { trace: message.trace, primaryColor })
2585
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "w-full flex flex-col gap-2 min-w-0", children: [
2586
+ showSources && sources && sources.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: "mt-1 flex flex-col gap-2", children: sources.map((src, i) => /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(SourceCard, { source: src, index: i }, src.id)) }),
2587
+ showTrace && message.trace && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(ObservabilityPanel, { trace: message.trace, primaryColor })
2536
2588
  ] })
2537
2589
  ] })
2538
2590
  ] });
@@ -2559,9 +2611,19 @@ function readStoredMessages(storageKey) {
2559
2611
  }
2560
2612
  }
2561
2613
  function useStoredMessages(storageKey, persist) {
2562
- const [messages, setMessages] = React11.useState(() => persist ? readStoredMessages(storageKey) : []);
2614
+ const [messages, setMessages] = React11.useState([]);
2615
+ const isLoaded = React11.useRef(false);
2563
2616
  React11.useEffect(() => {
2564
- if (!persist || typeof window === "undefined") {
2617
+ if (persist) {
2618
+ const loaded = readStoredMessages(storageKey);
2619
+ if (loaded.length > 0) {
2620
+ setMessages(loaded);
2621
+ }
2622
+ }
2623
+ isLoaded.current = true;
2624
+ }, [storageKey, persist]);
2625
+ React11.useEffect(() => {
2626
+ if (!isLoaded.current || !persist || typeof window === "undefined") {
2565
2627
  return;
2566
2628
  }
2567
2629
  if (messages.length === 0) {
@@ -2593,6 +2655,7 @@ function parseSseChunk(raw) {
2593
2655
  function useRagChat(projectId, options = {}) {
2594
2656
  const {
2595
2657
  apiUrl = "/api/chat",
2658
+ retrivoraApiBase = "/api/retrivora",
2596
2659
  namespace,
2597
2660
  persist = true,
2598
2661
  onReply,
@@ -2610,13 +2673,14 @@ function useRagChat(projectId, options = {}) {
2610
2673
  }, [messages]);
2611
2674
  const sendMessage = (0, import_react11.useCallback)(
2612
2675
  async (text, opts) => {
2613
- var _a, _b;
2676
+ var _a, _b, _c;
2614
2677
  const trimmed = text.trim();
2615
2678
  if (!trimmed || isLoading) return;
2616
2679
  lastInputRef.current = trimmed;
2680
+ 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()}`;
2617
2681
  if (!(opts == null ? void 0 : opts.skipUserMessage)) {
2618
2682
  const userMessage = {
2619
- id: `user_${Date.now()}`,
2683
+ id: userMsgId,
2620
2684
  role: "user",
2621
2685
  content: trimmed,
2622
2686
  createdAt: (/* @__PURE__ */ new Date()).toISOString()
@@ -2632,14 +2696,20 @@ function useRagChat(projectId, options = {}) {
2632
2696
  abortControllerRef.current = controller;
2633
2697
  try {
2634
2698
  const history = messagesRef.current.map(({ role, content }) => ({ role, content }));
2699
+ const assistantMessageId = `assistant_${Date.now()}`;
2635
2700
  const response = await fetch(apiUrl, {
2636
2701
  method: "POST",
2637
- headers: { "Content-Type": "application/json" },
2702
+ headers: __spreadValues({
2703
+ "Content-Type": "application/json"
2704
+ }, options.headers || {}),
2638
2705
  signal: controller.signal,
2639
2706
  body: JSON.stringify({
2640
2707
  message: trimmed,
2641
2708
  history,
2642
- namespace: namespace != null ? namespace : projectId
2709
+ namespace: namespace != null ? namespace : projectId,
2710
+ sessionId: options.sessionId || "default",
2711
+ messageId: assistantMessageId,
2712
+ userMessageId: userMsgId
2643
2713
  })
2644
2714
  });
2645
2715
  if (!response.ok) {
@@ -2680,7 +2750,6 @@ function useRagChat(projectId, options = {}) {
2680
2750
  requestAnimationFrame(() => flushTextUpdate(msgId));
2681
2751
  }
2682
2752
  };
2683
- const assistantMessageId = `assistant_${Date.now()}`;
2684
2753
  setMessages((prev) => [
2685
2754
  ...prev,
2686
2755
  {
@@ -2694,55 +2763,38 @@ function useRagChat(projectId, options = {}) {
2694
2763
  const { done, value } = await reader.read();
2695
2764
  if (done) break;
2696
2765
  buffer += decoder.decode(value, { stream: true });
2697
- const lastBoundary = buffer.lastIndexOf("\n\n");
2698
- if (lastBoundary === -1) continue;
2699
- const complete = buffer.slice(0, lastBoundary + 2);
2700
- buffer = buffer.slice(lastBoundary + 2);
2701
- let hasNonTextFrame = false;
2702
- for (const frame of parseSseChunk(complete)) {
2703
- if (frame.type === "text" && frame.text) {
2766
+ const frames = parseSseChunk(buffer);
2767
+ const lastIndex = buffer.lastIndexOf("\n\n");
2768
+ if (lastIndex !== -1) {
2769
+ buffer = buffer.slice(lastIndex + 2);
2770
+ }
2771
+ for (const frame of frames) {
2772
+ if (frame.type === "text") {
2704
2773
  assistantContent += frame.text;
2705
2774
  pendingContentRef.current = assistantContent;
2706
2775
  scheduleFlush(assistantMessageId);
2707
- } else if (frame.type === "thinking" && frame.text) {
2776
+ } else if (frame.type === "thinking") {
2708
2777
  thinkingContent += frame.text;
2709
2778
  pendingThinkingRef.current = thinkingContent;
2710
2779
  scheduleFlush(assistantMessageId);
2711
2780
  } else if (frame.type === "metadata") {
2712
- sources = (_a = frame.sources) != null ? _a : [];
2781
+ sources = (_b = frame.sources) != null ? _b : [];
2713
2782
  thinkingMs = frame.thinkingMs;
2714
- hasNonTextFrame = true;
2715
2783
  } else if (frame.type === "ui_transformation") {
2716
2784
  uiTransformation = frame.data;
2717
- hasNonTextFrame = true;
2718
2785
  } else if (frame.type === "observability") {
2719
2786
  trace = frame.data;
2720
- hasNonTextFrame = true;
2721
2787
  } else if (frame.type === "error") {
2722
- setError(frame.error || "Stream error");
2788
+ throw new Error(frame.error);
2723
2789
  }
2724
2790
  }
2725
- if (hasNonTextFrame) {
2726
- pendingFlush = false;
2727
- setMessages(
2728
- (prev) => prev.map(
2729
- (msg) => msg.id === assistantMessageId ? __spreadProps(__spreadValues({}, msg), {
2730
- content: assistantContent,
2731
- thinking: thinkingContent || void 0,
2732
- thinkingMs,
2733
- sources: sources.length > 0 ? sources : msg.sources,
2734
- uiTransformation: uiTransformation || msg.uiTransformation
2735
- }) : msg
2736
- )
2737
- );
2738
- }
2739
2791
  }
2740
2792
  if (buffer.trim()) {
2741
2793
  for (const frame of parseSseChunk(buffer)) {
2742
2794
  if (frame.type === "text" && frame.text) assistantContent += frame.text;
2743
2795
  else if (frame.type === "thinking" && frame.text) thinkingContent += frame.text;
2744
2796
  else if (frame.type === "metadata") {
2745
- sources = (_b = frame.sources) != null ? _b : [];
2797
+ sources = (_c = frame.sources) != null ? _c : [];
2746
2798
  thinkingMs = frame.thinkingMs;
2747
2799
  } else if (frame.type === "observability") trace = frame.data;
2748
2800
  }
@@ -2775,7 +2827,7 @@ function useRagChat(projectId, options = {}) {
2775
2827
  abortControllerRef.current = null;
2776
2828
  }
2777
2829
  },
2778
- [apiUrl, isLoading, namespace, onError, onReply, projectId, setMessages]
2830
+ [apiUrl, isLoading, namespace, onError, onReply, projectId, setMessages, options.headers, options.sessionId]
2779
2831
  );
2780
2832
  const clear = (0, import_react11.useCallback)(() => {
2781
2833
  setMessages([]);
@@ -2797,6 +2849,70 @@ function useRagChat(projectId, options = {}) {
2797
2849
  }
2798
2850
  setIsLoading(false);
2799
2851
  }, []);
2852
+ const loadHistory = (0, import_react11.useCallback)(async (sessionId) => {
2853
+ setIsLoading(true);
2854
+ setError(null);
2855
+ try {
2856
+ const res = await fetch(`${retrivoraApiBase}/history?sessionId=${encodeURIComponent(sessionId)}`);
2857
+ if (!res.ok) throw new Error(`Failed to load history: ${res.statusText}`);
2858
+ const data = await res.json();
2859
+ const loadedMessages = (data.history || []).map((msg) => ({
2860
+ id: msg.id,
2861
+ role: msg.role,
2862
+ content: msg.content,
2863
+ sources: msg.sources,
2864
+ uiTransformation: msg.uiTransformation,
2865
+ trace: msg.trace,
2866
+ createdAt: msg.createdAt
2867
+ }));
2868
+ setMessages(loadedMessages);
2869
+ } catch (err) {
2870
+ const msg = err instanceof Error ? err.message : "Failed to load history";
2871
+ setError(msg);
2872
+ onError == null ? void 0 : onError(msg);
2873
+ } finally {
2874
+ setIsLoading(false);
2875
+ }
2876
+ }, [retrivoraApiBase, onError, setMessages]);
2877
+ const clearHistory = (0, import_react11.useCallback)(async (sessionId) => {
2878
+ setIsLoading(true);
2879
+ setError(null);
2880
+ try {
2881
+ const res = await fetch(`${retrivoraApiBase}/history/clear`, {
2882
+ method: "POST",
2883
+ headers: { "Content-Type": "application/json" },
2884
+ body: JSON.stringify({ sessionId })
2885
+ });
2886
+ if (!res.ok) throw new Error(`Failed to clear history: ${res.statusText}`);
2887
+ setMessages([]);
2888
+ if (persist) localStorage.removeItem(storageKey);
2889
+ } catch (err) {
2890
+ const msg = err instanceof Error ? err.message : "Failed to clear history";
2891
+ setError(msg);
2892
+ onError == null ? void 0 : onError(msg);
2893
+ } finally {
2894
+ setIsLoading(false);
2895
+ }
2896
+ }, [retrivoraApiBase, onError, persist, setMessages, storageKey]);
2897
+ const submitFeedback = (0, import_react11.useCallback)(async (messageId, rating, comment) => {
2898
+ try {
2899
+ const res = await fetch(`${retrivoraApiBase}/feedback`, {
2900
+ method: "POST",
2901
+ headers: { "Content-Type": "application/json" },
2902
+ body: JSON.stringify({
2903
+ messageId,
2904
+ sessionId: options.sessionId || "default",
2905
+ rating,
2906
+ comment
2907
+ })
2908
+ });
2909
+ if (!res.ok) throw new Error(`Failed to submit feedback: ${res.statusText}`);
2910
+ } catch (err) {
2911
+ const msg = err instanceof Error ? err.message : "Failed to submit feedback";
2912
+ onError == null ? void 0 : onError(msg);
2913
+ throw err;
2914
+ }
2915
+ }, [retrivoraApiBase, onError, options.sessionId]);
2800
2916
  return {
2801
2917
  messages,
2802
2918
  isLoading,
@@ -2805,12 +2921,15 @@ function useRagChat(projectId, options = {}) {
2805
2921
  clear,
2806
2922
  retry,
2807
2923
  setMessages,
2808
- stop
2924
+ stop,
2925
+ loadHistory,
2926
+ clearHistory,
2927
+ submitFeedback
2809
2928
  };
2810
2929
  }
2811
2930
 
2812
2931
  // src/components/ChatWindow.tsx
2813
- var import_jsx_runtime14 = require("react/jsx-runtime");
2932
+ var import_jsx_runtime13 = require("react/jsx-runtime");
2814
2933
  function ChatWindow({
2815
2934
  className = "",
2816
2935
  style,
@@ -2821,7 +2940,10 @@ function ChatWindow({
2821
2940
  isResized = false,
2822
2941
  onMaximize,
2823
2942
  isMaximized = false,
2824
- onAddToCart
2943
+ onAddToCart,
2944
+ apiUrl,
2945
+ retrivoraApiBase,
2946
+ headers
2825
2947
  }) {
2826
2948
  var _a;
2827
2949
  const { ui, projectId } = useConfig();
@@ -2831,8 +2953,11 @@ function ChatWindow({
2831
2953
  const windowRef = (0, import_react12.useRef)(null);
2832
2954
  const bottomRef = (0, import_react12.useRef)(null);
2833
2955
  const inputRef = (0, import_react12.useRef)(null);
2834
- const { messages, send, clear, isLoading, error, stop } = useRagChat(projectId, {
2835
- namespace: projectId
2956
+ const { messages, send, clear, isLoading, error, stop, submitFeedback } = useRagChat(projectId, {
2957
+ namespace: projectId,
2958
+ apiUrl,
2959
+ retrivoraApiBase,
2960
+ headers
2836
2961
  });
2837
2962
  const [suggestions, setSuggestions] = (0, import_react12.useState)([]);
2838
2963
  const [isSuggesting, setIsSuggesting] = (0, import_react12.useState)(false);
@@ -2964,85 +3089,85 @@ function ChatWindow({
2964
3089
  }, 800);
2965
3090
  return () => clearTimeout(timer);
2966
3091
  }, [input, projectId]);
2967
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
3092
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
2968
3093
  "div",
2969
3094
  {
2970
3095
  ref: windowRef,
2971
3096
  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}`,
2972
3097
  style: __spreadValues({ "--primary": ui.primaryColor, "--accent": ui.accentColor }, style),
2973
3098
  children: [
2974
- onResizeStart && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
3099
+ onResizeStart && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
2975
3100
  "div",
2976
3101
  {
2977
3102
  onMouseDown: onResizeStart,
2978
3103
  className: "absolute top-0 left-0 w-6 h-6 cursor-nw-resize z-[100] group flex items-start justify-start p-1",
2979
3104
  title: "Drag to resize",
2980
- children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("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]" })
3105
+ children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("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]" })
2981
3106
  }
2982
3107
  ),
2983
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
3108
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
2984
3109
  "div",
2985
3110
  {
2986
3111
  className: "flex items-center justify-between px-5 py-4 border-b border-slate-200 dark:border-white/10",
2987
3112
  style: { background: `linear-gradient(135deg, ${ui.primaryColor}15, ${ui.accentColor}10)` },
2988
3113
  children: [
2989
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "flex items-center gap-3", children: [
3114
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "flex items-center gap-3", children: [
2990
3115
  ui.logoUrl ? (
2991
3116
  // eslint-disable-next-line @next/next/no-img-element
2992
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("img", { src: ui.logoUrl, alt: "logo", className: "w-8 h-8 rounded-lg object-cover" })
2993
- ) : /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
3117
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("img", { src: ui.logoUrl, alt: "logo", className: "w-8 h-8 rounded-lg object-cover" })
3118
+ ) : /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
2994
3119
  "div",
2995
3120
  {
2996
3121
  className: `w-9 h-9 flex items-center justify-center shadow-md ${ui.borderRadius === "full" ? "rounded-full" : "rounded-xl"}`,
2997
3122
  style: { background: `linear-gradient(135deg, ${ui.primaryColor}, ${ui.accentColor})` },
2998
- children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react8.Bot, { className: "w-5 h-5 text-white" })
3123
+ children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_lucide_react8.Bot, { className: "w-5 h-5 text-white" })
2999
3124
  }
3000
3125
  ),
3001
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { children: [
3002
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("h2", { className: "text-slate-900 dark:text-white font-semibold text-sm leading-tight", children: ui.title }),
3003
- ui.poweredBy && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("p", { className: "text-slate-500 dark:text-white/40 text-[11px] leading-tight", children: `Powered by ${ui.poweredBy}` })
3126
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { children: [
3127
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("h2", { className: "text-slate-900 dark:text-white font-semibold text-sm leading-tight", children: ui.title }),
3128
+ ui.poweredBy && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("p", { className: "text-slate-500 dark:text-white/40 text-[11px] leading-tight", children: `Powered by ${ui.poweredBy}` })
3004
3129
  ] })
3005
3130
  ] }),
3006
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "flex items-center gap-1.5", children: [
3007
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("span", { className: "flex items-center gap-1 text-[10px] text-emerald-500 dark:text-emerald-400 mr-2", children: [
3008
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "w-1.5 h-1.5 rounded-full bg-emerald-500 dark:bg-emerald-400 animate-pulse" }),
3131
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "flex items-center gap-1.5", children: [
3132
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("span", { className: "flex items-center gap-1 text-[10px] text-emerald-500 dark:text-emerald-400 mr-2", children: [
3133
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "w-1.5 h-1.5 rounded-full bg-emerald-500 dark:bg-emerald-400 animate-pulse" }),
3009
3134
  "Online"
3010
3135
  ] }),
3011
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("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: [
3012
- mounted && messages.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
3136
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("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: [
3137
+ mounted && messages.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
3013
3138
  "button",
3014
3139
  {
3015
3140
  onClick: clearHistory,
3016
3141
  title: "Clear conversation",
3017
3142
  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",
3018
- children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react8.Trash2, { className: "w-3.5 h-3.5" })
3143
+ children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_lucide_react8.Trash2, { className: "w-3.5 h-3.5" })
3019
3144
  }
3020
3145
  ),
3021
- isResized && onResetResize && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
3146
+ isResized && onResetResize && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
3022
3147
  "button",
3023
3148
  {
3024
3149
  onClick: onResetResize,
3025
3150
  title: "Reset to default size",
3026
3151
  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",
3027
- children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react8.RotateCcw, { className: "w-3.5 h-3.5" })
3152
+ children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_lucide_react8.RotateCcw, { className: "w-3.5 h-3.5" })
3028
3153
  }
3029
3154
  ),
3030
- onMaximize && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
3155
+ onMaximize && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
3031
3156
  "button",
3032
3157
  {
3033
3158
  onClick: onMaximize,
3034
3159
  title: isMaximized ? "Minimize" : "Maximize",
3035
3160
  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",
3036
- children: isMaximized ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react8.Minimize2, { className: "w-3.5 h-3.5" }) : /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react8.Maximize2, { className: "w-3.5 h-3.5" })
3161
+ children: isMaximized ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_lucide_react8.Minimize2, { className: "w-3.5 h-3.5" }) : /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_lucide_react8.Maximize2, { className: "w-3.5 h-3.5" })
3037
3162
  }
3038
3163
  ),
3039
- showClose && onClose && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
3164
+ showClose && onClose && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
3040
3165
  "button",
3041
3166
  {
3042
3167
  onClick: onClose,
3043
3168
  title: "Close chat",
3044
3169
  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",
3045
- children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react8.X, { className: "w-4 h-4" })
3170
+ children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_lucide_react8.X, { className: "w-4 h-4" })
3046
3171
  }
3047
3172
  )
3048
3173
  ] })
@@ -3050,24 +3175,24 @@ function ChatWindow({
3050
3175
  ]
3051
3176
  }
3052
3177
  ),
3053
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("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: [
3178
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("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: [
3054
3179
  !mounted || isEmpty ? (
3055
3180
  /* Welcome state */
3056
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "h-full flex flex-col items-center justify-center text-center gap-4 px-6 py-12", children: [
3057
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
3181
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "h-full flex flex-col items-center justify-center text-center gap-4 px-6 py-12", children: [
3182
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
3058
3183
  "div",
3059
3184
  {
3060
3185
  className: `w-16 h-16 flex items-center justify-center shadow-lg ${ui.borderRadius === "full" ? "rounded-full" : "rounded-2xl"}`,
3061
3186
  style: { background: `linear-gradient(135deg, ${ui.primaryColor}, ${ui.accentColor})` },
3062
- children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react8.Sparkles, { className: "w-8 h-8 text-white" })
3187
+ children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_lucide_react8.Sparkles, { className: "w-8 h-8 text-white" })
3063
3188
  }
3064
3189
  ),
3065
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { children: [
3066
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("p", { className: "text-slate-800 dark:text-white/80 font-medium leading-relaxed", children: ui.welcomeMessage }),
3067
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("p", { className: "text-slate-500 dark:text-white/30 text-sm mt-2", children: "Ask a question to get started" })
3190
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { children: [
3191
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("p", { className: "text-slate-800 dark:text-white/80 font-medium leading-relaxed", children: ui.welcomeMessage }),
3192
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("p", { className: "text-slate-500 dark:text-white/30 text-sm mt-2", children: "Ask a question to get started" })
3068
3193
  ] }),
3069
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: "flex flex-wrap gap-2 justify-center mt-2", children: CHAT_SUGGESTIONS.map(
3070
- (suggestion) => /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
3194
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "flex flex-wrap gap-2 justify-center mt-2", children: CHAT_SUGGESTIONS.map(
3195
+ (suggestion) => /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
3071
3196
  "button",
3072
3197
  {
3073
3198
  onClick: () => {
@@ -3082,7 +3207,7 @@ function ChatWindow({
3082
3207
  )
3083
3208
  ) })
3084
3209
  ] })
3085
- ) : messages.map((msg, index) => /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
3210
+ ) : messages.map((msg, index) => /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
3086
3211
  MessageBubble,
3087
3212
  {
3088
3213
  message: msg,
@@ -3091,11 +3216,12 @@ function ChatWindow({
3091
3216
  primaryColor: ui.primaryColor,
3092
3217
  accentColor: ui.accentColor,
3093
3218
  onAddToCart,
3094
- viewportSize
3219
+ viewportSize,
3220
+ onFeedback: submitFeedback
3095
3221
  },
3096
3222
  msg.id
3097
3223
  )),
3098
- isLoading && ((_a = messages[messages.length - 1]) == null ? void 0 : _a.role) !== "assistant" && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
3224
+ isLoading && ((_a = messages[messages.length - 1]) == null ? void 0 : _a.role) !== "assistant" && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
3099
3225
  MessageBubble,
3100
3226
  {
3101
3227
  message: { id: "loading", role: "assistant", content: "", createdAt: (/* @__PURE__ */ new Date()).toISOString() },
@@ -3106,22 +3232,22 @@ function ChatWindow({
3106
3232
  viewportSize
3107
3233
  }
3108
3234
  ),
3109
- error && /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("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: [
3110
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react8.TriangleAlert, { className: "w-4 h-4 flex-shrink-0" }),
3111
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { children: error })
3235
+ error && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("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: [
3236
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_lucide_react8.TriangleAlert, { className: "w-4 h-4 flex-shrink-0" }),
3237
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { children: error })
3112
3238
  ] }),
3113
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { ref: bottomRef })
3239
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { ref: bottomRef })
3114
3240
  ] }),
3115
- isUploadModalOpen && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("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__ */ (0, import_jsx_runtime14.jsxs)("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: [
3116
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
3241
+ isUploadModalOpen && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("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__ */ (0, import_jsx_runtime13.jsxs)("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: [
3242
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
3117
3243
  "button",
3118
3244
  {
3119
3245
  onClick: () => setIsUploadModalOpen(false),
3120
3246
  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",
3121
- children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react8.X, { className: "w-5 h-5" })
3247
+ children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_lucide_react8.X, { className: "w-5 h-5" })
3122
3248
  }
3123
3249
  ),
3124
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
3250
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
3125
3251
  DocumentUpload,
3126
3252
  {
3127
3253
  namespace: projectId,
@@ -3129,9 +3255,9 @@ function ChatWindow({
3129
3255
  }
3130
3256
  )
3131
3257
  ] }) }),
3132
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("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: [
3133
- (suggestions.length > 0 || isSuggesting) && !isLoading && /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "mb-3 flex flex-wrap gap-2 animate-in fade-in slide-in-from-bottom-2 duration-300", children: [
3134
- suggestions.map((suggestion) => /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
3258
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("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: [
3259
+ (suggestions.length > 0 || isSuggesting) && !isLoading && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "mb-3 flex flex-wrap gap-2 animate-in fade-in slide-in-from-bottom-2 duration-300", children: [
3260
+ suggestions.map((suggestion) => /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
3135
3261
  "button",
3136
3262
  {
3137
3263
  onClick: () => {
@@ -3142,19 +3268,19 @@ function ChatWindow({
3142
3268
  },
3143
3269
  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",
3144
3270
  children: [
3145
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react8.Sparkles, { className: "w-3 h-3 text-amber-400" }),
3271
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_lucide_react8.Sparkles, { className: "w-3 h-3 text-amber-400" }),
3146
3272
  suggestion
3147
3273
  ]
3148
3274
  },
3149
3275
  suggestion
3150
3276
  )),
3151
- isSuggesting && suggestions.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("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: [
3152
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react8.Sparkles, { className: "w-3 h-3" }),
3277
+ isSuggesting && suggestions.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("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: [
3278
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_lucide_react8.Sparkles, { className: "w-3 h-3" }),
3153
3279
  "Thinking..."
3154
3280
  ] })
3155
3281
  ] }),
3156
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("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: [
3157
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
3282
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("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: [
3283
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
3158
3284
  "textarea",
3159
3285
  {
3160
3286
  ref: inputRef,
@@ -3174,7 +3300,7 @@ function ChatWindow({
3174
3300
  style: { scrollbarWidth: "none" }
3175
3301
  }
3176
3302
  ),
3177
- ui.enableVoiceInput !== false && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
3303
+ ui.enableVoiceInput !== false && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
3178
3304
  "button",
3179
3305
  {
3180
3306
  type: "button",
@@ -3182,28 +3308,28 @@ function ChatWindow({
3182
3308
  disabled: isLoading,
3183
3309
  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"}`,
3184
3310
  title: isListening ? "Stop listening" : "Start voice input",
3185
- children: isListening ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react8.MicOff, { className: "w-4 h-4" }) : /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react8.Mic, { className: "w-4 h-4" })
3311
+ children: isListening ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_lucide_react8.MicOff, { className: "w-4 h-4" }) : /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_lucide_react8.Mic, { className: "w-4 h-4" })
3186
3312
  }
3187
3313
  ),
3188
- ui.allowUpload !== false && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
3314
+ ui.allowUpload !== false && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
3189
3315
  "button",
3190
3316
  {
3191
3317
  type: "button",
3192
3318
  onClick: () => setIsUploadModalOpen(true),
3193
3319
  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",
3194
3320
  title: "Upload Document",
3195
- children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react8.Paperclip, { className: "w-4 h-4" })
3321
+ children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_lucide_react8.Paperclip, { className: "w-4 h-4" })
3196
3322
  }
3197
3323
  ),
3198
- isLoading ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
3324
+ isLoading ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
3199
3325
  "button",
3200
3326
  {
3201
3327
  onClick: stop,
3202
3328
  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",
3203
3329
  title: "Stop generating",
3204
- children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: "w-3.5 h-3.5 bg-white rounded-[2px]" })
3330
+ children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "w-3.5 h-3.5 bg-white rounded-[2px]" })
3205
3331
  }
3206
- ) : /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
3332
+ ) : /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
3207
3333
  "button",
3208
3334
  {
3209
3335
  onClick: sendMessage,
@@ -3213,11 +3339,11 @@ function ChatWindow({
3213
3339
  background: input.trim() ? `linear-gradient(135deg, ${ui.primaryColor}, ${ui.accentColor})` : "rgba(148, 163, 184, 0.2)"
3214
3340
  // slate-400/20 for light mode disabled
3215
3341
  },
3216
- children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react8.ArrowUp, { className: "w-4 h-4 text-white" })
3342
+ children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_lucide_react8.ArrowUp, { className: "w-4 h-4 text-white" })
3217
3343
  }
3218
3344
  )
3219
3345
  ] }),
3220
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("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" })
3346
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("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" })
3221
3347
  ] })
3222
3348
  ]
3223
3349
  }
@@ -3225,7 +3351,7 @@ function ChatWindow({
3225
3351
  }
3226
3352
 
3227
3353
  // src/components/ChatWidget.tsx
3228
- var import_jsx_runtime15 = require("react/jsx-runtime");
3354
+ var import_jsx_runtime14 = require("react/jsx-runtime");
3229
3355
  var DEFAULT_DIMENSIONS = { width: 380, height: 600 };
3230
3356
  var GEMINI_STYLES = `
3231
3357
  @keyframes shapeshift {
@@ -3264,7 +3390,7 @@ var GEMINI_STYLES = `
3264
3390
  --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);
3265
3391
  }
3266
3392
  `;
3267
- function ChatWidget({ position = "bottom-right", onAddToCart }) {
3393
+ function ChatWidget({ position = "bottom-right", onAddToCart, apiUrl, retrivoraApiBase, headers }) {
3268
3394
  const { ui } = useConfig();
3269
3395
  const [isOpen, setIsOpen] = (0, import_react13.useState)(false);
3270
3396
  const [hasUnread, setHasUnread] = (0, import_react13.useState)(false);
@@ -3320,9 +3446,9 @@ function ChatWidget({ position = "bottom-right", onAddToCart }) {
3320
3446
  }
3321
3447
  };
3322
3448
  const isResized = dimensions.width !== DEFAULT_DIMENSIONS.width || dimensions.height !== DEFAULT_DIMENSIONS.height;
3323
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_jsx_runtime15.Fragment, { children: [
3324
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("style", { dangerouslySetInnerHTML: { __html: GEMINI_STYLES } }),
3325
- /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
3449
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_jsx_runtime14.Fragment, { children: [
3450
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("style", { dangerouslySetInnerHTML: { __html: GEMINI_STYLES } }),
3451
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
3326
3452
  "div",
3327
3453
  {
3328
3454
  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"}`,
@@ -3332,7 +3458,7 @@ function ChatWidget({ position = "bottom-right", onAddToCart }) {
3332
3458
  maxHeight: "calc(100vh - 6rem)"
3333
3459
  },
3334
3460
  children: [
3335
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
3461
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
3336
3462
  ChatWindow,
3337
3463
  {
3338
3464
  className: "h-full relative z-10",
@@ -3343,10 +3469,13 @@ function ChatWidget({ position = "bottom-right", onAddToCart }) {
3343
3469
  isResized,
3344
3470
  onMaximize: ui.allowResize !== false ? handleMaximize : void 0,
3345
3471
  isMaximized,
3346
- onAddToCart
3472
+ onAddToCart,
3473
+ apiUrl,
3474
+ retrivoraApiBase,
3475
+ headers
3347
3476
  }
3348
3477
  ),
3349
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
3478
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
3350
3479
  "div",
3351
3480
  {
3352
3481
  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"}`
@@ -3355,18 +3484,18 @@ function ChatWidget({ position = "bottom-right", onAddToCart }) {
3355
3484
  ]
3356
3485
  }
3357
3486
  ),
3358
- /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
3487
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
3359
3488
  "button",
3360
3489
  {
3361
3490
  onClick: isOpen ? () => setIsOpen(false) : handleOpen,
3362
3491
  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}`,
3363
3492
  "aria-label": "Open chat",
3364
3493
  children: [
3365
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
3494
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
3366
3495
  "div",
3367
3496
  {
3368
3497
  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]",
3369
- children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
3498
+ children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
3370
3499
  "div",
3371
3500
  {
3372
3501
  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]",
@@ -3377,23 +3506,800 @@ function ChatWidget({ position = "bottom-right", onAddToCart }) {
3377
3506
  )
3378
3507
  }
3379
3508
  ),
3380
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
3509
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
3381
3510
  "span",
3382
3511
  {
3383
3512
  className: "absolute inset-0 rounded-full animate-ping opacity-20 pointer-events-none",
3384
3513
  style: { background: ui.primaryColor }
3385
3514
  }
3386
3515
  ),
3387
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
3516
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
3388
3517
  "span",
3389
3518
  {
3390
3519
  className: `relative z-10 transition-transform duration-300 ${isOpen ? "rotate-90 scale-90" : "rotate-0 scale-100"}`,
3391
- children: isOpen ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_lucide_react9.X, { className: "w-6 h-6 text-white" }) : /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_lucide_react9.MessageSquare, { className: "w-6 h-6 text-white" })
3520
+ children: isOpen ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react9.X, { className: "w-6 h-6 text-white" }) : /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react9.MessageSquare, { className: "w-6 h-6 text-white" })
3521
+ }
3522
+ ),
3523
+ hasUnread && !isOpen && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("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" })
3524
+ ]
3525
+ }
3526
+ )
3527
+ ] });
3528
+ }
3529
+
3530
+ // src/components/Hero.tsx
3531
+ var import_link = __toESM(require("next/link"));
3532
+
3533
+ // src/app/constants.tsx
3534
+ var import_lucide_react10 = require("lucide-react");
3535
+ var import_jsx_runtime15 = require("react/jsx-runtime");
3536
+ var LANDING_PAGE_CONTENT = {
3537
+ hero: {
3538
+ badge: "Dynamic & Universal Retrivora AI",
3539
+ title: "The Universal Bridge for Generative AI",
3540
+ subtitle: "Retrivora AI is a vendor-agnostic RAG engine that connects any Document to any LLM and Vector Database in minutes."
3541
+ },
3542
+ lifecycle: {
3543
+ title: "The RAG Lifecycle"
3544
+ },
3545
+ guide: {
3546
+ title: "Interactive Guide",
3547
+ subtitle: "Universal RAG integration for your Next.js applications in minutes."
3548
+ }
3549
+ };
3550
+ var VECTOR_DATABASES = [
3551
+ { Icon: import_lucide_react10.Zap, label: "Pinecone" },
3552
+ { Icon: import_lucide_react10.Database, label: "PostgreSQL" },
3553
+ { Icon: import_lucide_react10.Layers, label: "MongoDB" },
3554
+ { Icon: import_lucide_react10.Box, label: "Qdrant" },
3555
+ { Icon: import_lucide_react10.Search, label: "Milvus" },
3556
+ { Icon: import_lucide_react10.Package, label: "ChromaDB" },
3557
+ { Icon: import_lucide_react10.Activity, label: "Redis" },
3558
+ { Icon: import_lucide_react10.Hexagon, label: "Weaviate" }
3559
+ ];
3560
+ var AI_MODELS = [
3561
+ { Icon: import_lucide_react10.Rabbit, label: "Ollama" },
3562
+ { Icon: import_lucide_react10.Sparkles, label: "OpenAI" },
3563
+ { Icon: import_lucide_react10.Bot, label: "Anthropic" },
3564
+ { Icon: import_lucide_react10.Brain, label: "Gemini" },
3565
+ { Icon: import_lucide_react10.Cpu, label: "Groq" },
3566
+ { Icon: import_lucide_react10.Cloud, label: "Qwen" },
3567
+ { Icon: import_lucide_react10.Code, label: "Copilot" },
3568
+ { Icon: import_lucide_react10.Terminal, label: "LiteLLM" }
3569
+ ];
3570
+ var PIPELINE_STEPS = [
3571
+ {
3572
+ step: "01",
3573
+ Icon: import_lucide_react10.FileText,
3574
+ title: "Ingest",
3575
+ desc: "Universal support for PDF, DOCX, CSV, and JSON. Documents are parsed, chunked, and embedded.",
3576
+ colors: { from: "#10b981", to: "#14b8a6" }
3577
+ },
3578
+ {
3579
+ step: "02",
3580
+ Icon: import_lucide_react10.Search,
3581
+ title: "Retrieve",
3582
+ desc: "Queries are converted to vectors. Semantic search finds context across any configured Vector DB.",
3583
+ colors: { from: "#14b8a6", to: "#06b6d4" }
3584
+ },
3585
+ {
3586
+ step: "03",
3587
+ Icon: import_lucide_react10.Puzzle,
3588
+ title: "Augment",
3589
+ desc: "Retrieved context is injected into the LLM prompt with namespaced project isolation.",
3590
+ colors: { from: "#06b6d4", to: "#3b82f6" }
3591
+ },
3592
+ {
3593
+ step: "04",
3594
+ Icon: import_lucide_react10.MessageSquare,
3595
+ title: "Generate",
3596
+ desc: "Providers like OpenAI, Anthropic, or Gemini produce grounded, source-cited responses.",
3597
+ colors: { from: "#3b82f6", to: "#6366f1" }
3598
+ }
3599
+ ];
3600
+ var SNIPPETS = [
3601
+ {
3602
+ id: "npm-setup",
3603
+ title: "NPM Setup",
3604
+ language: "typescript",
3605
+ description: "How to install and import the client vs server components correctly in your application.",
3606
+ code: `// \u2500\u2500\u2500 TERMINAL / BASH \u2500\u2500\u2500
3607
+ // Run this command to install the package in your project:
3608
+ // npm install @retrivora-ai/rag-engine
3609
+
3610
+ // \u2500\u2500\u2500 SERVER API ROUTER (src/app/api/retrivora/[[...retrivora]]/route.ts) \u2500\u2500\u2500
3611
+ // Create a single catch-all file to handle all server endpoints dynamically:
3612
+ import { createRagHandler } from '@retrivora-ai/rag-engine/handlers';
3613
+
3614
+ export const { GET, POST } = createRagHandler();
3615
+
3616
+ // \u2500\u2500\u2500 CLIENT WIDGET (src/app/layout.tsx) \u2500\u2500\u2500
3617
+ // Import the React widget and config context (styles are auto-injected!):
3618
+ import { ConfigProvider, ChatWidget } from '@retrivora-ai/rag-engine';`
3619
+ },
3620
+ {
3621
+ id: "pipeline",
3622
+ title: "Pipeline API",
3623
+ language: "typescript",
3624
+ description: "Orchestrate the full RAG flow programmatically with the Pipeline class.",
3625
+ code: `import { Pipeline, getRagConfig } from '@retrivora-ai/rag-engine/server';
3626
+
3627
+ const config = getRagConfig();
3628
+ const pipeline = new Pipeline(config);
3629
+
3630
+ // Ingest documents
3631
+ await pipeline.ingest([{
3632
+ docId: 'doc-1',
3633
+ content: 'Retrivora AI simplifies RAG...',
3634
+ metadata: { source: 'docs' }
3635
+ }]);
3636
+
3637
+ // Ask a question
3638
+ const { reply, sources } = await pipeline.ask('How does Retrivora work?');`
3639
+ },
3640
+ {
3641
+ id: "handlers",
3642
+ title: "Route Handlers",
3643
+ language: "typescript",
3644
+ description: "Mount pre-built API endpoints. Configuration is automatically read from environment variables, or can be passed explicitly.",
3645
+ code: `// \u2500\u2500\u2500 OPTION A: ZERO CONFIG (Reads from environment variables) \u2500\u2500\u2500
3646
+ // src/app/api/chat/route.ts
3647
+ import { createStreamHandler } from '@retrivora-ai/rag-engine/handlers';
3648
+ export const POST = createStreamHandler();
3649
+
3650
+ // \u2500\u2500\u2500 OPTION B: EXPLICIT CONFIGURATION \u2500\u2500\u2500
3651
+ // src/app/api/chat/route.ts
3652
+ import { createStreamHandler } from '@retrivora-ai/rag-engine/handlers';
3653
+
3654
+ export const POST = createStreamHandler({
3655
+ vectorDb: {
3656
+ provider: 'pinecone',
3657
+ apiKey: process.env.CUSTOM_PINECONE_KEY,
3658
+ indexName: 'docs-index',
3659
+ },
3660
+ llm: {
3661
+ provider: 'openai',
3662
+ apiKey: process.env.CUSTOM_OPENAI_KEY,
3663
+ model: 'gpt-4o',
3664
+ }
3665
+ });`
3666
+ },
3667
+ {
3668
+ id: "ui",
3669
+ title: "React Components",
3670
+ language: "typescript",
3671
+ description: "Configure and embed themeable UI widgets using the ConfigProvider context.",
3672
+ code: `import { ConfigProvider, ChatWidget } from '@retrivora-ai/rag-engine';
3673
+
3674
+ export default function Layout({ children }) {
3675
+ return (
3676
+ <ConfigProvider config={{
3677
+ projectId: 'my-project-id',
3678
+ ui: {
3679
+ title: 'Retrivora Assistant',
3680
+ welcomeMessage: 'Hi! Ask me anything about our software.',
3681
+ primaryColor: '#4f46e5', // Custom primary brand color
3682
+ accentColor: '#8b5cf6', // Custom accent gradient color
3683
+ borderRadius: 'lg', // 'none' | 'sm' | 'md' | 'lg' | 'xl'
3684
+ allowUpload: true, // Toggle custom file uploading
3685
+ }
3686
+ }}>
3687
+ {children}
3688
+ <ChatWidget position="bottom-right" />
3689
+ </ConfigProvider>
3690
+ );
3691
+ }`
3692
+ },
3693
+ {
3694
+ id: "config",
3695
+ title: "Config Builder",
3696
+ language: "typescript",
3697
+ description: "Fluent, type-safe configuration builder for granular control over providers.",
3698
+ code: `import { ConfigBuilder } from '@retrivora-ai/rag-engine/server';
3699
+
3700
+ const config = new ConfigBuilder()
3701
+ .vectorDb('pinecone', { apiKey: '...', indexName: 'docs' })
3702
+ .llm('ollama', 'llama3.2')
3703
+ .embedding('ollama', 'nomic-embed-text')
3704
+ .build();`
3705
+ },
3706
+ {
3707
+ id: "env",
3708
+ title: "Environment",
3709
+ language: "bash",
3710
+ description: "The exact environment variable structure required for auto-configuration.",
3711
+ code: `# Project Identity
3712
+ RAG_PROJECT_ID=my-project
3713
+
3714
+ # Vector DB
3715
+ VECTOR_DB_PROVIDER=pinecone
3716
+ PINECONE_API_KEY=pcsk_...
3717
+ VECTOR_DB_INDEX=products
3718
+
3719
+ # AI Services
3720
+ LLM_PROVIDER=openai
3721
+ LLM_MODEL=gpt-4o
3722
+ OPENAI_API_KEY=sk-...`
3723
+ }
3724
+ ];
3725
+ var ARCHITECTURE_CARDS = [
3726
+ {
3727
+ icon: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_lucide_react10.Database, { className: "text-indigo-600" }),
3728
+ title: "Vector Store",
3729
+ description: "Universal support for Pinecone, PGVector, MongoDB, Milvus, Qdrant, and more.",
3730
+ badge: "Vector DB",
3731
+ badgeColor: "bg-indigo-50 dark:bg-indigo-500/10 text-indigo-600 dark:text-indigo-400 border-indigo-200 dark:border-indigo-500/20"
3732
+ },
3733
+ {
3734
+ icon: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_lucide_react10.Zap, { className: "text-amber-500" }),
3735
+ title: "Embeddings",
3736
+ description: "Seamlessly switch between OpenAI, Ollama, or custom embedding providers.",
3737
+ badge: "Models",
3738
+ badgeColor: "bg-amber-50 dark:bg-amber-500/10 text-amber-600 dark:text-amber-400 border-amber-200 dark:border-amber-500/20"
3739
+ },
3740
+ {
3741
+ icon: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_lucide_react10.Bot, { className: "text-emerald-500" }),
3742
+ title: "LLM Orchestration",
3743
+ description: "Optimized inference across OpenAI, Anthropic, Gemini, and local LLMs.",
3744
+ badge: "Inference",
3745
+ badgeColor: "bg-emerald-50 dark:bg-emerald-500/10 text-emerald-600 dark:text-emerald-400 border-emerald-200 dark:border-emerald-500/20"
3746
+ }
3747
+ ];
3748
+ var QUICK_START_STEPS = [
3749
+ { id: "npm-setup", text: "Install Package & CSS" },
3750
+ { id: "env", text: "Configure .env.local" },
3751
+ { id: "handlers", text: "Mount API Handlers" },
3752
+ { id: "ui", text: "Drop ChatWidget UI" }
3753
+ ];
3754
+ var ADVANCED_STEPS = [
3755
+ { id: "pipeline", text: "Programmatic SDK" },
3756
+ { id: "config", text: "Fluent Config Builder" }
3757
+ ];
3758
+ var API_ENDPOINTS = ["chat", "health", "ingest", "upload"];
3759
+
3760
+ // src/components/Hero.tsx
3761
+ var import_lucide_react11 = require("lucide-react");
3762
+ var import_jsx_runtime16 = require("react/jsx-runtime");
3763
+ function Hero() {
3764
+ const { ui } = useConfig();
3765
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: "grid lg:grid-cols-2 gap-12 xl:gap-16 items-start", children: [
3766
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: "flex flex-col gap-7 pt-4", children: [
3767
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
3768
+ "div",
3769
+ {
3770
+ className: "inline-flex items-center gap-2.5 px-4 py-2 rounded-full text-xs font-semibold border w-fit",
3771
+ style: {
3772
+ borderColor: `${ui.primaryColor}30`,
3773
+ color: ui.primaryColor,
3774
+ background: `${ui.primaryColor}08`
3775
+ },
3776
+ children: [
3777
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
3778
+ "span",
3779
+ {
3780
+ className: "w-2 h-2 rounded-full",
3781
+ style: { background: ui.primaryColor, animation: "pulseRing 2.5s ease-in-out infinite" }
3782
+ }
3783
+ ),
3784
+ LANDING_PAGE_CONTENT.hero.badge
3785
+ ]
3786
+ }
3787
+ ),
3788
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("h1", { className: "text-5xl md:text-6xl xl:text-7xl font-black text-slate-900 tracking-tight leading-[1.05]", children: [
3789
+ LANDING_PAGE_CONTENT.hero.title.split("for")[0],
3790
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("br", {}),
3791
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
3792
+ "span",
3793
+ {
3794
+ className: "text-transparent bg-clip-text",
3795
+ style: { backgroundImage: `linear-gradient(135deg, ${ui.primaryColor} 0%, ${ui.accentColor} 60%, #a855f7 100%)` },
3796
+ children: [
3797
+ "for ",
3798
+ LANDING_PAGE_CONTENT.hero.title.split("for")[1]
3799
+ ]
3800
+ }
3801
+ )
3802
+ ] }),
3803
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("p", { className: "text-lg md:text-xl text-slate-500 max-w-lg leading-relaxed", children: LANDING_PAGE_CONTENT.hero.subtitle }),
3804
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: "flex flex-col gap-4 border-t border-slate-100", children: [
3805
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: "flex flex-col gap-2.5", children: [
3806
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { className: "text-[10px] font-black text-slate-400 uppercase tracking-[0.22em] ml-1", children: "Vector Ecosystem" }),
3807
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { className: "flex flex-wrap gap-2", children: VECTOR_DATABASES.map(({ Icon, label }) => /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
3808
+ "span",
3809
+ {
3810
+ 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",
3811
+ children: [
3812
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Icon, { className: "w-3 h-3 transition-transform group-hover:scale-110", style: { color: ui.primaryColor } }),
3813
+ label
3814
+ ]
3815
+ },
3816
+ label
3817
+ )) })
3818
+ ] }),
3819
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: "flex flex-col gap-2.5", children: [
3820
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { className: "text-[10px] font-black text-slate-400 uppercase tracking-[0.22em] ml-1", children: "AI Model Garden" }),
3821
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { className: "flex flex-wrap gap-2", children: AI_MODELS.map(({ Icon, label }) => /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
3822
+ "span",
3823
+ {
3824
+ 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",
3825
+ children: [
3826
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Icon, { className: "w-3 h-3 transition-transform group-hover:scale-110", style: { color: ui.accentColor } }),
3827
+ label
3828
+ ]
3829
+ },
3830
+ label
3831
+ )) })
3832
+ ] })
3833
+ ] }),
3834
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { className: "flex flex-wrap items-center gap-3 mt-1", children: /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
3835
+ import_link.default,
3836
+ {
3837
+ href: "/register",
3838
+ 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",
3839
+ style: {
3840
+ background: `linear-gradient(135deg, ${ui.primaryColor}, ${ui.accentColor})`,
3841
+ boxShadow: `0 8px 24px -6px ${ui.primaryColor}45`
3842
+ },
3843
+ children: [
3844
+ "Get Started Free",
3845
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_lucide_react11.ArrowRight, { className: "h-4 w-4 transition-transform group-hover:translate-x-1" })
3846
+ ]
3847
+ }
3848
+ ) })
3849
+ ] }),
3850
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("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: [
3851
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
3852
+ "div",
3853
+ {
3854
+ className: "absolute -inset-3 rounded-3xl pointer-events-none",
3855
+ style: { background: `radial-gradient(ellipse at center, ${ui.primaryColor}12 0%, transparent 70%)` }
3856
+ }
3857
+ ),
3858
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { className: "relative h-full rounded-2xl overflow-hidden border border-slate-200 shadow-xl shadow-slate-200/80", children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(ChatWindow, { className: "w-full h-full" }) }),
3859
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("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: [
3860
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { className: "w-1.5 h-1.5 rounded-full bg-emerald-500 animate-pulse" }),
3861
+ "Live Retrivora demo \u2014 powered by this SDK"
3862
+ ] })
3863
+ ] })
3864
+ ] });
3865
+ }
3866
+
3867
+ // src/components/Lifecycle.tsx
3868
+ var import_jsx_runtime17 = require("react/jsx-runtime");
3869
+ function Lifecycle() {
3870
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "relative", children: [
3871
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "text-center mb-14", children: [
3872
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("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: [
3873
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "w-1.5 h-1.5 rounded-full bg-indigo-500 animate-pulse" }),
3874
+ "How It Works"
3875
+ ] }),
3876
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("h2", { className: "text-3xl md:text-4xl font-black text-slate-900 mb-4", children: LANDING_PAGE_CONTENT.lifecycle.title }),
3877
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("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." })
3878
+ ] }),
3879
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("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__ */ (0, import_jsx_runtime17.jsxs)(
3880
+ "div",
3881
+ {
3882
+ 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",
3883
+ children: [
3884
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
3885
+ "div",
3886
+ {
3887
+ className: "absolute top-0 left-0 right-0 h-0.5 rounded-t-2xl",
3888
+ style: { background: `linear-gradient(90deg, ${colors.from}, ${colors.to})` }
3889
+ }
3890
+ ),
3891
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
3892
+ "div",
3893
+ {
3894
+ 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",
3895
+ style: { color: colors.from },
3896
+ children: step
3392
3897
  }
3393
3898
  ),
3394
- hasUnread && !isOpen && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("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" })
3899
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
3900
+ "div",
3901
+ {
3902
+ 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",
3903
+ style: {
3904
+ background: `linear-gradient(135deg, ${colors.from}18, ${colors.to}10)`,
3905
+ border: `1px solid ${colors.from}25`
3906
+ },
3907
+ children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(Icon, { className: "w-5 h-5", style: { color: colors.from } })
3908
+ }
3909
+ ),
3910
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "relative z-10", children: [
3911
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
3912
+ "div",
3913
+ {
3914
+ className: "text-[10px] font-black uppercase tracking-widest mb-1.5",
3915
+ style: { color: colors.from },
3916
+ children: [
3917
+ "Step ",
3918
+ index + 1
3919
+ ]
3920
+ }
3921
+ ),
3922
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("h3", { className: "text-base font-bold text-slate-900 mb-2", children: title }),
3923
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("p", { className: "text-sm text-slate-500 leading-relaxed", children: desc })
3924
+ ] }),
3925
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
3926
+ "div",
3927
+ {
3928
+ className: "absolute inset-0 rounded-2xl opacity-0 group-hover:opacity-100 transition-opacity duration-500 pointer-events-none",
3929
+ style: { background: `radial-gradient(ellipse at 50% 0%, ${colors.from}07 0%, transparent 70%)` }
3930
+ }
3931
+ )
3932
+ ]
3933
+ },
3934
+ step
3935
+ )) })
3936
+ ] });
3937
+ }
3938
+
3939
+ // src/components/ArchitectureCardsSection.tsx
3940
+ var import_link2 = __toESM(require("next/link"));
3941
+
3942
+ // src/components/ArchitectureCard.tsx
3943
+ var import_lucide_react12 = require("lucide-react");
3944
+ var import_jsx_runtime18 = require("react/jsx-runtime");
3945
+ function ArchitectureCard({ icon, title, description, badge, badgeColor, gradientFrom = "#6366f1", gradientTo = "#8b5cf6" }) {
3946
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("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: [
3947
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
3948
+ "div",
3949
+ {
3950
+ className: "absolute top-0 left-0 right-0 h-0.5 rounded-t-2xl opacity-80 group-hover:opacity-100 transition-opacity",
3951
+ style: { background: `linear-gradient(90deg, ${gradientFrom}, ${gradientTo})` }
3952
+ }
3953
+ ),
3954
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "mb-5 flex items-center justify-between", children: [
3955
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
3956
+ "div",
3957
+ {
3958
+ className: "w-12 h-12 rounded-xl flex items-center justify-center text-2xl transition-transform duration-300 group-hover:scale-110",
3959
+ style: {
3960
+ background: `linear-gradient(135deg, ${gradientFrom}18, ${gradientTo}10)`,
3961
+ border: `1px solid ${gradientFrom}20`
3962
+ },
3963
+ children: icon
3964
+ }
3965
+ ),
3966
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { className: `rounded-full border px-3 py-1 text-[10px] font-bold uppercase tracking-wider ${badgeColor}`, children: badge })
3967
+ ] }),
3968
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("h3", { className: "mb-2 font-bold text-slate-900 text-base", children: title }),
3969
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { className: "text-sm text-slate-500 leading-relaxed", children: description }),
3970
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
3971
+ "div",
3972
+ {
3973
+ 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",
3974
+ style: { color: gradientFrom },
3975
+ children: [
3976
+ "Learn more ",
3977
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_lucide_react12.ArrowRight, { className: "h-3 w-3" })
3395
3978
  ]
3396
3979
  }
3980
+ ),
3981
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
3982
+ "div",
3983
+ {
3984
+ className: "absolute inset-0 rounded-2xl opacity-0 group-hover:opacity-100 transition-opacity duration-500 pointer-events-none",
3985
+ style: { background: `radial-gradient(ellipse at 50% 0%, ${gradientFrom}05 0%, transparent 70%)` }
3986
+ }
3987
+ )
3988
+ ] });
3989
+ }
3990
+
3991
+ // src/components/ArchitectureCardsSection.tsx
3992
+ var import_lucide_react13 = require("lucide-react");
3993
+ var import_jsx_runtime19 = require("react/jsx-runtime");
3994
+ var CARD_GRADIENTS = [
3995
+ { from: "#6366f1", to: "#8b5cf6" },
3996
+ { from: "#f59e0b", to: "#f97316" },
3997
+ { from: "#10b981", to: "#06b6d4" }
3998
+ ];
3999
+ function ArchitectureCardsSection() {
4000
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "relative", children: [
4001
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "text-center mb-12", children: [
4002
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("h2", { className: "text-3xl md:text-4xl font-black text-slate-900 mb-4", children: "Built for every layer of the stack" }),
4003
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("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." })
4004
+ ] }),
4005
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: "grid gap-5 sm:grid-cols-3 max-w-5xl mx-auto", children: ARCHITECTURE_CARDS.map((card, i) => {
4006
+ var _a, _b;
4007
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
4008
+ ArchitectureCard,
4009
+ __spreadProps(__spreadValues({}, card), {
4010
+ gradientFrom: (_a = CARD_GRADIENTS[i]) == null ? void 0 : _a.from,
4011
+ gradientTo: (_b = CARD_GRADIENTS[i]) == null ? void 0 : _b.to
4012
+ }),
4013
+ i
4014
+ );
4015
+ }) }),
4016
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: "mt-10 text-center", children: /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(
4017
+ import_link2.default,
4018
+ {
4019
+ href: "/features",
4020
+ 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",
4021
+ children: [
4022
+ "Explore all features ",
4023
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_lucide_react13.ArrowRight, { className: "h-4 w-4" })
4024
+ ]
4025
+ }
4026
+ ) })
4027
+ ] });
4028
+ }
4029
+
4030
+ // src/components/Documentation.tsx
4031
+ var import_react15 = __toESM(require("react"));
4032
+ var import_lucide_react16 = require("lucide-react");
4033
+
4034
+ // src/components/CodeViewer.tsx
4035
+ var import_react14 = __toESM(require("react"));
4036
+ var import_lucide_react14 = require("lucide-react");
4037
+ var import_jsx_runtime20 = require("react/jsx-runtime");
4038
+ function CodeViewer({ snippet }) {
4039
+ const [copied, setCopied] = import_react14.default.useState(false);
4040
+ const handleCopy = () => {
4041
+ navigator.clipboard.writeText(snippet.code);
4042
+ setCopied(true);
4043
+ setTimeout(() => setCopied(false), 2e3);
4044
+ };
4045
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: "flex flex-col rounded-2xl border border-white/8 overflow-hidden min-h-[300px] shadow-xl", children: [
4046
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: "flex items-center justify-between px-5 py-3 border-b border-white/5 bg-[#0d0d1a]", children: [
4047
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: "flex items-center gap-4", children: [
4048
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: "flex gap-1.5", children: [
4049
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: "w-2.5 h-2.5 rounded-full bg-rose-500/80" }),
4050
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: "w-2.5 h-2.5 rounded-full bg-amber-500/80" }),
4051
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: "w-2.5 h-2.5 rounded-full bg-emerald-500/80" })
4052
+ ] }),
4053
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { className: "text-[10px] font-mono text-white/25 uppercase tracking-widest", children: snippet.language })
4054
+ ] }),
4055
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
4056
+ "button",
4057
+ {
4058
+ onClick: handleCopy,
4059
+ 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",
4060
+ children: copied ? /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_jsx_runtime20.Fragment, { children: [
4061
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_lucide_react14.Check, { size: 12, className: "text-emerald-400" }),
4062
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { className: "text-emerald-400", children: "Copied!" })
4063
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_jsx_runtime20.Fragment, { children: [
4064
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_lucide_react14.Copy, { size: 12 }),
4065
+ "Copy Code"
4066
+ ] })
4067
+ }
4068
+ )
4069
+ ] }),
4070
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: "p-6 font-mono text-[12px] leading-relaxed overflow-auto flex-grow bg-[#080818]", children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("pre", { className: "whitespace-pre text-indigo-200/85", children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("code", { children: snippet.code }) }) })
4071
+ ] });
4072
+ }
4073
+
4074
+ // src/components/DocViewer.tsx
4075
+ var import_lucide_react15 = require("lucide-react");
4076
+ var import_jsx_runtime21 = require("react/jsx-runtime");
4077
+ function DocViewer({ activeSnippet, setActiveSnippet }) {
4078
+ const currentIndex = SNIPPETS.findIndex((s) => s.id === activeSnippet.id);
4079
+ const totalSteps = SNIPPETS.length;
4080
+ const isFirst = currentIndex === 0;
4081
+ const isLast = currentIndex === totalSteps - 1;
4082
+ const handlePrev = () => {
4083
+ if (!isFirst) setActiveSnippet(SNIPPETS[currentIndex - 1]);
4084
+ };
4085
+ const handleNext = () => {
4086
+ if (!isLast) setActiveSnippet(SNIPPETS[currentIndex + 1]);
4087
+ };
4088
+ const progressPercent = Math.round((currentIndex + 1) / totalSteps * 100);
4089
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "flex flex-col h-full p-6 gap-5", children: [
4090
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { className: "flex flex-wrap gap-1.5 border-b border-slate-100 pb-5", children: SNIPPETS.map((snippet) => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
4091
+ "button",
4092
+ {
4093
+ onClick: () => setActiveSnippet(snippet),
4094
+ 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"}`,
4095
+ children: snippet.title
4096
+ },
4097
+ snippet.id
4098
+ )) }),
4099
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { className: "bg-slate-100 rounded-full h-1.5 overflow-hidden", children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
4100
+ "div",
4101
+ {
4102
+ className: "h-full rounded-full transition-all duration-500",
4103
+ style: {
4104
+ width: `${progressPercent}%`,
4105
+ background: "linear-gradient(90deg, #4f46e5, #7c3aed)",
4106
+ boxShadow: "0 0 6px rgba(79, 102, 241, 0.4)"
4107
+ }
4108
+ }
4109
+ ) }),
4110
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "flex-grow flex flex-col gap-5", children: [
4111
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "flex items-start justify-between gap-4 flex-wrap sm:flex-nowrap", children: [
4112
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { children: [
4113
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("h3", { className: "text-lg font-bold text-slate-900 mb-1.5 flex items-center gap-3", children: [
4114
+ activeSnippet.title,
4115
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("span", { className: "text-[9px] font-extrabold uppercase px-2 py-0.5 rounded bg-indigo-50 border border-indigo-100 text-indigo-600", children: [
4116
+ "Step ",
4117
+ currentIndex + 1,
4118
+ " of ",
4119
+ totalSteps
4120
+ ] })
4121
+ ] }),
4122
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("p", { className: "text-xs text-slate-500 leading-relaxed italic", children: activeSnippet.description })
4123
+ ] }),
4124
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("span", { className: "text-xs font-mono font-bold text-indigo-600 self-center shrink-0", children: [
4125
+ progressPercent,
4126
+ "% Complete"
4127
+ ] })
4128
+ ] }),
4129
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(CodeViewer, { snippet: activeSnippet }),
4130
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "flex items-center justify-between border-t border-slate-100 pt-5 mt-auto", children: [
4131
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
4132
+ "button",
4133
+ {
4134
+ onClick: handlePrev,
4135
+ disabled: isFirst,
4136
+ 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"}`,
4137
+ children: [
4138
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_lucide_react15.ArrowLeft, { size: 13 }),
4139
+ " Previous Step"
4140
+ ]
4141
+ }
4142
+ ),
4143
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
4144
+ "button",
4145
+ {
4146
+ onClick: handleNext,
4147
+ disabled: isLast,
4148
+ 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"}`,
4149
+ style: !isLast ? { background: "linear-gradient(135deg, #4f46e5, #7c3aed)", boxShadow: "0 4px 14px -4px rgba(79,70,229,0.35)" } : {},
4150
+ children: [
4151
+ isLast ? "Complete!" : "Next Step",
4152
+ " ",
4153
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_lucide_react15.ArrowRight, { size: 13 })
4154
+ ]
4155
+ }
4156
+ )
4157
+ ] })
4158
+ ] })
4159
+ ] });
4160
+ }
4161
+
4162
+ // src/components/Documentation.tsx
4163
+ var import_jsx_runtime22 = require("react/jsx-runtime");
4164
+ function Documentation() {
4165
+ const [activeSnippet, setActiveSnippet] = import_react15.default.useState(SNIPPETS[0]);
4166
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "max-w-6xl mx-auto", children: [
4167
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "text-center mb-14", children: [
4168
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("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: [
4169
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("span", { className: "w-1.5 h-1.5 rounded-full bg-indigo-500 animate-pulse" }),
4170
+ "Developer Guide"
4171
+ ] }),
4172
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("h2", { className: "text-3xl md:text-4xl font-black text-slate-900 mb-4", children: LANDING_PAGE_CONTENT.guide.title }),
4173
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("p", { className: "text-slate-500 max-w-xl mx-auto text-base leading-relaxed", children: LANDING_PAGE_CONTENT.guide.subtitle })
4174
+ ] }),
4175
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "w-full grid gap-8 lg:grid-cols-[270px_1fr] items-start", children: [
4176
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("aside", { className: "flex flex-col gap-5", children: [
4177
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("section", { children: [
4178
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("h2", { className: "mb-3 text-[10px] font-black text-slate-400 uppercase tracking-[0.3em] flex items-center gap-2", children: [
4179
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_lucide_react16.FileText, { size: 12, className: "text-indigo-500" }),
4180
+ " Quick Start"
4181
+ ] }),
4182
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("ol", { className: "space-y-1", children: QUICK_START_STEPS.map((step, i) => {
4183
+ const isActive = activeSnippet.id === step.id;
4184
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
4185
+ "button",
4186
+ {
4187
+ onClick: () => {
4188
+ const s = SNIPPETS.find((s2) => s2.id === step.id);
4189
+ if (s) setActiveSnippet(s);
4190
+ },
4191
+ 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"}`,
4192
+ children: [
4193
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("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 }),
4194
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "pt-0.5", children: [
4195
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("span", { className: `text-xs font-semibold block ${isActive ? "text-indigo-700 font-bold" : "text-slate-700"}`, children: step.text }),
4196
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("span", { className: "text-[9px] text-slate-400 block mt-0.5", children: [
4197
+ "Step ",
4198
+ i + 1
4199
+ ] })
4200
+ ] })
4201
+ ]
4202
+ }
4203
+ ) }, step.id);
4204
+ }) })
4205
+ ] }),
4206
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("section", { children: [
4207
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("h2", { className: "mb-3 text-[10px] font-black text-slate-400 uppercase tracking-[0.3em] flex items-center gap-2", children: [
4208
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_lucide_react16.Code, { size: 12, className: "text-violet-500" }),
4209
+ " Advanced Options"
4210
+ ] }),
4211
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("ol", { className: "space-y-1", children: ADVANCED_STEPS.map((step, i) => {
4212
+ const isActive = activeSnippet.id === step.id;
4213
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
4214
+ "button",
4215
+ {
4216
+ onClick: () => {
4217
+ const s = SNIPPETS.find((s2) => s2.id === step.id);
4218
+ if (s) setActiveSnippet(s);
4219
+ },
4220
+ 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"}`,
4221
+ children: [
4222
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("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 }),
4223
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "pt-0.5", children: [
4224
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("span", { className: `text-xs font-semibold block ${isActive ? "text-violet-700 font-bold" : "text-slate-700"}`, children: step.text }),
4225
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("span", { className: "text-[9px] text-slate-400 block mt-0.5", children: "Extension" })
4226
+ ] })
4227
+ ]
4228
+ }
4229
+ ) }, step.id);
4230
+ }) })
4231
+ ] }),
4232
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("section", { className: "rounded-2xl border border-slate-200 bg-white p-5 shadow-sm", children: [
4233
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("h2", { className: "mb-4 text-[10px] font-black text-slate-400 uppercase tracking-[0.3em] flex items-center gap-2", children: [
4234
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_lucide_react16.Zap, { size: 12, className: "text-indigo-500" }),
4235
+ " API Endpoints"
4236
+ ] }),
4237
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "grid gap-2", children: API_ENDPOINTS.map((slug) => /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
4238
+ "div",
4239
+ {
4240
+ 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",
4241
+ children: [
4242
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("span", { className: "text-[10px] font-mono text-slate-500 group-hover:text-indigo-600 transition-colors", children: [
4243
+ "/api/",
4244
+ slug
4245
+ ] }),
4246
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("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" })
4247
+ ]
4248
+ },
4249
+ slug
4250
+ )) })
4251
+ ] })
4252
+ ] }),
4253
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("section", { className: "flex flex-col h-full min-h-[560px]", children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "rounded-2xl border border-slate-200 bg-white overflow-hidden h-full shadow-sm", children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(DocViewer, { activeSnippet, setActiveSnippet }) }) })
4254
+ ] }),
4255
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "mt-14 text-center", children: /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
4256
+ "a",
4257
+ {
4258
+ href: "https://www.npmjs.com/package/@retrivora-ai/rag-engine",
4259
+ target: "_blank",
4260
+ rel: "noreferrer",
4261
+ 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",
4262
+ style: {
4263
+ background: "linear-gradient(135deg, #4f46e5, #7c3aed)",
4264
+ boxShadow: "0 8px 24px -6px rgba(79, 70, 229, 0.35)"
4265
+ },
4266
+ children: [
4267
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_lucide_react16.Package, { className: "w-5 h-5" }),
4268
+ "Get Started on NPM",
4269
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_lucide_react16.ExternalLink, { className: "w-4 h-4" })
4270
+ ]
4271
+ }
4272
+ ) })
4273
+ ] });
4274
+ }
4275
+
4276
+ // src/components/AmbientBackground.tsx
4277
+ var import_jsx_runtime23 = require("react/jsx-runtime");
4278
+ function AmbientBackground() {
4279
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "absolute inset-0 overflow-hidden pointer-events-none", children: [
4280
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
4281
+ "div",
4282
+ {
4283
+ className: "absolute -top-24 -left-24 w-[600px] h-[600px] rounded-full opacity-25 blur-3xl",
4284
+ style: { background: "radial-gradient(circle, #c7d2fe 0%, #a5b4fc 40%, transparent 70%)" }
4285
+ }
4286
+ ),
4287
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
4288
+ "div",
4289
+ {
4290
+ className: "absolute -top-20 right-0 w-[500px] h-[500px] rounded-full opacity-20 blur-3xl",
4291
+ style: { background: "radial-gradient(circle, #ddd6fe 0%, #c4b5fd 50%, transparent 70%)" }
4292
+ }
4293
+ ),
4294
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
4295
+ "div",
4296
+ {
4297
+ className: "absolute inset-0 opacity-[0.025]",
4298
+ style: {
4299
+ backgroundImage: "linear-gradient(#6366f1 1px, transparent 1px), linear-gradient(90deg, #6366f1 1px, transparent 1px)",
4300
+ backgroundSize: "56px 56px"
4301
+ }
4302
+ }
3397
4303
  )
3398
4304
  ] });
3399
4305
  }
@@ -3439,13 +4345,18 @@ var AuthenticationException = class extends RetrivoraError {
3439
4345
  };
3440
4346
  // Annotate the CommonJS export names for ESM import in node:
3441
4347
  0 && (module.exports = {
4348
+ AmbientBackground,
4349
+ ArchitectureCardsSection,
3442
4350
  AuthenticationException,
3443
4351
  ChatWidget,
3444
4352
  ChatWindow,
3445
4353
  ConfigProvider,
3446
4354
  ConfigurationException,
3447
4355
  DocumentUpload,
4356
+ Documentation,
3448
4357
  EmbeddingFailedException,
4358
+ Hero,
4359
+ Lifecycle,
3449
4360
  MessageBubble,
3450
4361
  ObservabilityPanel,
3451
4362
  ProviderNotFoundException,