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