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