@retrivora-ai/rag-engine 1.9.3 → 1.9.7
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 +59 -7
- package/dist/{ILLMProvider-Bw2A28nU.d.mts → ILLMProvider-Bhk6zJOK.d.mts} +43 -7
- package/dist/{ILLMProvider-Bw2A28nU.d.ts → ILLMProvider-Bhk6zJOK.d.ts} +43 -7
- package/dist/handlers/index.d.mts +2 -2
- package/dist/handlers/index.d.ts +2 -2
- package/dist/handlers/index.js +737 -237
- package/dist/handlers/index.mjs +736 -237
- package/dist/index-B9J_XEh0.d.ts +187 -0
- package/dist/index-BJ4cd-t5.d.mts +187 -0
- package/dist/{index-B70ZLkfG.d.mts → index-Bu7T6xgr.d.ts} +20 -3
- package/dist/{index-DVu-mkAM.d.ts → index-C3SVtPYg.d.mts} +20 -3
- package/dist/index.css +237 -10
- package/dist/index.d.mts +13 -5
- package/dist/index.d.ts +13 -5
- package/dist/index.js +365 -164
- package/dist/index.mjs +350 -158
- package/dist/server.d.mts +15 -94
- package/dist/server.d.ts +15 -94
- package/dist/server.js +850 -239
- package/dist/server.mjs +839 -238
- package/package.json +2 -4
- package/src/app/api/chat/route.ts +2 -2
- package/src/app/api/health/route.ts +3 -2
- package/src/app/api/ingest/route.ts +3 -2
- package/src/app/api/suggestions/route.ts +3 -2
- package/src/app/api/upload/route.ts +3 -2
- package/src/app/constants.tsx +168 -148
- package/src/app/layout.tsx +5 -18
- package/src/app/types.ts +17 -17
- package/src/components/ChatWidget.tsx +3 -1
- package/src/components/ChatWindow.tsx +5 -1
- package/src/components/DocViewer.tsx +71 -5
- package/src/components/Documentation.tsx +74 -11
- package/src/components/MessageBubble.tsx +39 -2
- package/src/components/ThinkingBlock.tsx +75 -0
- package/src/components/VisualizationRenderer.tsx +27 -1
- package/src/components/constants.tsx +275 -0
- package/src/config/RagConfig.ts +47 -0
- package/src/config/constants.ts +1 -0
- package/src/config/serverConfig.ts +25 -0
- package/src/core/ConfigResolver.ts +73 -22
- package/src/core/ConfigValidator.ts +2 -1
- package/src/core/Pipeline.ts +226 -68
- package/src/core/ProviderRegistry.ts +16 -7
- package/src/core/QueryProcessor.ts +38 -4
- package/src/core/Retrivora.ts +91 -0
- package/src/core/VectorPlugin.ts +62 -8
- package/src/exceptions/index.ts +111 -0
- package/src/handlers/index.ts +73 -0
- package/src/hooks/useRagChat.ts +30 -5
- package/src/index.ts +27 -1
- package/src/lib/plugin.ts +24 -0
- package/src/llm/LLMFactory.ts +8 -4
- package/src/llm/providers/AnthropicProvider.ts +70 -20
- package/src/llm/providers/GeminiProvider.ts +14 -15
- package/src/llm/providers/OllamaProvider.ts +13 -16
- package/src/llm/providers/OpenAIProvider.ts +9 -14
- package/src/llm/providers/UniversalLLMAdapter.ts +5 -5
- package/src/llm/utils.ts +46 -0
- package/src/providers/vectordb/MongoDBProvider.ts +9 -4
- package/src/providers/vectordb/MultiTablePostgresProvider.ts +45 -13
- package/src/rag/EntityExtractor.ts +2 -2
- package/src/rag/Reranker.ts +9 -16
- package/src/server.ts +30 -1
- package/src/types/chat.ts +9 -0
- package/src/types/props.ts +38 -1
- package/src/utils/UITransformer.ts +73 -4
- package/dist/DocumentChunker-Dh9TvmGG.d.mts +0 -45
- package/dist/DocumentChunker-Dh9TvmGG.d.ts +0 -45
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,27 +60,58 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
59
60
|
// src/index.ts
|
|
60
61
|
var index_exports = {};
|
|
61
62
|
__export(index_exports, {
|
|
63
|
+
AuthenticationException: () => AuthenticationException,
|
|
62
64
|
ChatWidget: () => ChatWidget,
|
|
63
65
|
ChatWindow: () => ChatWindow,
|
|
64
66
|
ConfigProvider: () => ConfigProvider,
|
|
67
|
+
ConfigurationException: () => ConfigurationException,
|
|
65
68
|
DocumentUpload: () => DocumentUpload,
|
|
69
|
+
EmbeddingFailedException: () => EmbeddingFailedException,
|
|
66
70
|
MessageBubble: () => MessageBubble,
|
|
67
71
|
ObservabilityPanel: () => ObservabilityPanel,
|
|
72
|
+
ProviderNotFoundException: () => ProviderNotFoundException,
|
|
73
|
+
RateLimitException: () => RateLimitException,
|
|
74
|
+
RetrievalException: () => RetrievalException,
|
|
75
|
+
RetrivoraError: () => RetrivoraError,
|
|
68
76
|
SourceCard: () => SourceCard,
|
|
69
77
|
addSynonyms: () => addSynonyms,
|
|
70
78
|
useConfig: () => useConfig,
|
|
71
79
|
useRagChat: () => useRagChat
|
|
72
80
|
});
|
|
73
81
|
module.exports = __toCommonJS(index_exports);
|
|
74
|
-
|
|
82
|
+
|
|
83
|
+
// #style-inject:#style-inject
|
|
84
|
+
function styleInject(css, { insertAt } = {}) {
|
|
85
|
+
if (!css || typeof document === "undefined") return;
|
|
86
|
+
const head = document.head || document.getElementsByTagName("head")[0];
|
|
87
|
+
const style = document.createElement("style");
|
|
88
|
+
style.type = "text/css";
|
|
89
|
+
if (insertAt === "top") {
|
|
90
|
+
if (head.firstChild) {
|
|
91
|
+
head.insertBefore(style, head.firstChild);
|
|
92
|
+
} else {
|
|
93
|
+
head.appendChild(style);
|
|
94
|
+
}
|
|
95
|
+
} else {
|
|
96
|
+
head.appendChild(style);
|
|
97
|
+
}
|
|
98
|
+
if (style.styleSheet) {
|
|
99
|
+
style.styleSheet.cssText = css;
|
|
100
|
+
} else {
|
|
101
|
+
style.appendChild(document.createTextNode(css));
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// src/index.css
|
|
106
|
+
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-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-yellow-500: oklch(79.5% 0.184 86.047);\n --color-green-500: oklch(72.3% 0.219 149.579);\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-200: oklch(89.4% 0.057 293.283);\n --color-violet-400: oklch(70.2% 0.183 293.541);\n --color-violet-500: oklch(60.6% 0.25 292.717);\n --color-violet-600: oklch(54.1% 0.281 293.009);\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-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-5xl: 3rem;\n --text-5xl--line-height: 1;\n --text-7xl: 4.5rem;\n --text-7xl--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-0 {\n inset: calc(var(--spacing) * 0);\n }\n .-top-40 {\n top: calc(var(--spacing) * -40);\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-40 {\n right: calc(var(--spacing) * -40);\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-4 {\n bottom: calc(var(--spacing) * -4);\n }\n .-bottom-40 {\n bottom: calc(var(--spacing) * -40);\n }\n .bottom-0 {\n bottom: calc(var(--spacing) * 0);\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-40 {\n left: calc(var(--spacing) * -40);\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 .isolate {\n isolation: isolate;\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-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-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-6 {\n margin-top: calc(var(--spacing) * 6);\n }\n .mt-8 {\n margin-top: calc(var(--spacing) * 8);\n }\n .mt-16 {\n margin-top: calc(var(--spacing) * 16);\n }\n .mt-24 {\n margin-top: calc(var(--spacing) * 24);\n }\n .mt-32 {\n margin-top: calc(var(--spacing) * 32);\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-6 {\n margin-bottom: calc(var(--spacing) * 6);\n }\n .mb-12 {\n margin-bottom: calc(var(--spacing) * 12);\n }\n .mb-16 {\n margin-bottom: calc(var(--spacing) * 16);\n }\n .mb-24 {\n margin-bottom: calc(var(--spacing) * 24);\n }\n .mb-32 {\n margin-bottom: calc(var(--spacing) * 32);\n }\n .ml-1 {\n margin-left: calc(var(--spacing) * 1);\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 {\n display: inline;\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-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-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-\\[600px\\] {\n height: 600px;\n }\n .h-\\[calc\\(100vh-3rem\\)\\] {\n height: calc(100vh - 3rem);\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-\\[440px\\] {\n min-height: 440px;\n }\n .min-h-\\[500px\\] {\n min-height: 500px;\n }\n .min-h-\\[560px\\] {\n min-height: 560px;\n }\n .min-h-screen {\n min-height: 100vh;\n }\n .w-0\\.5 {\n width: calc(var(--spacing) * 0.5);\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-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 .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-md {\n max-width: var(--container-md);\n }\n .max-w-none {\n max-width: none;\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\\/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-105 {\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 .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-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-end {\n justify-content: flex-end;\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-6 {\n gap: calc(var(--spacing) * 6);\n }\n .gap-8 {\n gap: calc(var(--spacing) * 8);\n }\n .gap-12 {\n gap: calc(var(--spacing) * 12);\n }\n .gap-16 {\n gap: calc(var(--spacing) * 16);\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-2\\.5 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 2.5) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 2.5) * 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 .space-y-12 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 12) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 12) * 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-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-4 {\n border-style: var(--tw-border-style);\n border-width: 4px;\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-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-50 {\n border-color: var(--color-slate-50);\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-300 {\n border-color: var(--color-slate-300);\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-t-transparent {\n border-top-color: transparent;\n }\n .bg-\\[\\#0f172a\\] {\n background-color: #0f172a;\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-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-green-500 {\n background-color: var(--color-green-500);\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-500\\/10 {\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 .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-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-500\\/5 {\n background-color: color-mix(in srgb, oklch(55.4% 0.046 257.417) 5%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-slate-500) 5%, transparent);\n }\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-transparent {\n background-color: transparent;\n }\n .bg-violet-500\\/10 {\n background-color: color-mix(in srgb, oklch(60.6% 0.25 292.717) 10%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-violet-500) 10%, transparent);\n }\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\\/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-yellow-500 {\n background-color: var(--color-yellow-500);\n }\n .bg-gradient-to-r {\n --tw-gradient-position: to right in oklab;\n background-image: linear-gradient(var(--tw-gradient-stops));\n }\n .from-indigo-500 {\n --tw-gradient-from: var(--color-indigo-500);\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 .via-indigo-600 {\n --tw-gradient-via: var(--color-indigo-600);\n --tw-gradient-via-stops:\n var(--tw-gradient-position),\n var(--tw-gradient-from) var(--tw-gradient-from-position),\n var(--tw-gradient-via) var(--tw-gradient-via-position),\n var(--tw-gradient-to) var(--tw-gradient-to-position);\n --tw-gradient-stops: var(--tw-gradient-via-stops);\n }\n .to-violet-600 {\n --tw-gradient-to: var(--color-violet-600);\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-6 {\n padding: calc(var(--spacing) * 6);\n }\n .p-8 {\n padding: calc(var(--spacing) * 8);\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-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-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-6 {\n padding-top: calc(var(--spacing) * 6);\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-6 {\n padding-bottom: calc(var(--spacing) * 6);\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-7xl {\n font-size: var(--text-7xl);\n line-height: var(--tw-leading, var(--text-7xl--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-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\\.2em\\] {\n --tw-tracking: 0.2em;\n letter-spacing: 0.2em;\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-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-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-50 {\n color: var(--color-indigo-50);\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-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-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-600 {\n color: var(--color-violet-600);\n }\n .text-white {\n color: var(--color-white);\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-15 {\n opacity: 15%;\n }\n .opacity-20 {\n opacity: 20%;\n }\n .opacity-40 {\n opacity: 40%;\n }\n .opacity-70 {\n opacity: 70%;\n }\n .opacity-100 {\n opacity: 100%;\n }\n .opacity-\\[0\\.1\\] {\n opacity: 0.1;\n }\n .opacity-\\[0\\.05\\] {\n opacity: 0.05;\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-\\[0_0_8px_rgba\\(99\\,102\\,241\\,0\\.5\\)\\] {\n --tw-shadow: 0 0 8px var(--tw-shadow-color, rgba(99,102,241,0.5));\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 .shadow-indigo-200 {\n --tw-shadow-color: oklch(87% 0.065 274.039);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-shadow-color: color-mix(in oklab, var(--color-indigo-200) var(--tw-shadow-alpha), transparent);\n }\n }\n .shadow-indigo-500\\/10 {\n --tw-shadow-color: color-mix(in srgb, oklch(58.5% 0.233 277.117) 10%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-shadow-color: color-mix(in oklab, color-mix(in oklab, var(--color-indigo-500) 10%, transparent) var(--tw-shadow-alpha), transparent);\n }\n }\n .shadow-indigo-500\\/20 {\n --tw-shadow-color: color-mix(in srgb, oklch(58.5% 0.233 277.117) 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-indigo-500) 20%, transparent) var(--tw-shadow-alpha), transparent);\n }\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-violet-500\\/20 {\n --tw-shadow-color: color-mix(in srgb, oklch(60.6% 0.25 292.717) 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-violet-500) 20%, transparent) var(--tw-shadow-alpha), transparent);\n }\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 {\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 opacity,\n box-shadow,\n transform,\n translate,\n scale,\n rotate,\n filter,\n -webkit-backdrop-filter,\n backdrop-filter,\n display,\n content-visibility,\n overlay,\n pointer-events;\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-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-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\\: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 .focus-within\\:border-slate-300 {\n &:focus-within {\n border-color: var(--color-slate-300);\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-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-indigo-500\\/50 {\n &:hover {\n @media (hover: hover) {\n border-color: color-mix(in srgb, oklch(58.5% 0.233 277.117) 50%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--color-indigo-500) 50%, transparent);\n }\n }\n }\n }\n .hover\\:border-indigo-700 {\n &:hover {\n @media (hover: hover) {\n border-color: var(--color-indigo-700);\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\\:bg-indigo-700 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--color-indigo-700);\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-500\\/10 {\n &:hover {\n @media (hover: hover) {\n background-color: color-mix(in srgb, oklch(55.4% 0.046 257.417) 10%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-slate-500) 10%, transparent);\n }\n }\n }\n }\n .hover\\:bg-white {\n &:hover {\n @media (hover: hover) {\n background-color: var(--color-white);\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-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-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\\:opacity-90 {\n &:hover {\n @media (hover: hover) {\n opacity: 90%;\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-indigo-500\\/5 {\n &:hover {\n @media (hover: hover) {\n --tw-shadow-color: color-mix(in srgb, oklch(58.5% 0.233 277.117) 5%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-shadow-color: color-mix(in oklab, color-mix(in oklab, var(--color-indigo-500) 5%, 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\\:block {\n @media (width >= 48rem) {\n display: block;\n }\n }\n .md\\:w-1\\/2 {\n @media (width >= 48rem) {\n width: calc(1 / 2 * 100%);\n }\n }\n .md\\:flex-row {\n @media (width >= 48rem) {\n flex-direction: row;\n }\n }\n .md\\:flex-row-reverse {\n @media (width >= 48rem) {\n flex-direction: row-reverse;\n }\n }\n .md\\:space-y-0 {\n @media (width >= 48rem) {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 0) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 0) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n }\n .md\\:text-7xl {\n @media (width >= 48rem) {\n font-size: var(--text-7xl);\n line-height: var(--tw-leading, var(--text-7xl--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\\:grid-cols-2 {\n @media (width >= 64rem) {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n }\n .lg\\:grid-cols-\\[280px_1fr\\] {\n @media (width >= 64rem) {\n grid-template-columns: 280px 1fr;\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-\\[\\#080811\\] {\n @media (prefers-color-scheme: dark) {\n border-color: #080811;\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-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-indigo-500\\/30 {\n @media (prefers-color-scheme: dark) {\n border-color: color-mix(in srgb, oklch(58.5% 0.233 277.117) 30%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--color-indigo-500) 30%, 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-violet-500\\/30 {\n @media (prefers-color-scheme: dark) {\n border-color: color-mix(in srgb, oklch(60.6% 0.25 292.717) 30%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--color-violet-500) 30%, 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-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-violet-500\\/10 {\n @media (prefers-color-scheme: dark) {\n background-color: color-mix(in srgb, oklch(60.6% 0.25 292.717) 10%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-violet-500) 10%, transparent);\n }\n }\n }\n .dark\\:bg-white {\n @media (prefers-color-scheme: dark) {\n background-color: var(--color-white);\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\\: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-indigo-400 {\n @media (prefers-color-scheme: dark) {\n color: var(--color-indigo-400);\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-slate-900 {\n @media (prefers-color-scheme: dark) {\n color: var(--color-slate-900);\n }\n }\n .dark\\:text-violet-400 {\n @media (prefers-color-scheme: dark) {\n color: var(--color-violet-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\\:opacity-\\[0\\.03\\] {\n @media (prefers-color-scheme: dark) {\n opacity: 0.03;\n }\n }\n .dark\\:shadow-lg {\n @media (prefers-color-scheme: dark) {\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 .dark\\:shadow-indigo-500\\/20 {\n @media (prefers-color-scheme: dark) {\n --tw-shadow-color: color-mix(in srgb, oklch(58.5% 0.233 277.117) 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-indigo-500) 20%, transparent) var(--tw-shadow-alpha), 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-indigo-500\\/30 {\n @media (prefers-color-scheme: dark) {\n &:hover {\n @media (hover: hover) {\n border-color: color-mix(in srgb, oklch(58.5% 0.233 277.117) 30%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--color-indigo-500) 30%, transparent);\n }\n }\n }\n }\n }\n .dark\\:hover\\:border-white\\/10 {\n @media (prefers-color-scheme: dark) {\n &:hover {\n @media (hover: hover) {\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 }\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-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\\/8 {\n @media (prefers-color-scheme: dark) {\n &:hover {\n @media (hover: hover) {\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 }\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-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');
|
|
75
107
|
|
|
76
108
|
// src/components/ChatWidget.tsx
|
|
77
|
-
var
|
|
78
|
-
var
|
|
109
|
+
var import_react13 = require("react");
|
|
110
|
+
var import_lucide_react9 = require("lucide-react");
|
|
79
111
|
|
|
80
112
|
// src/components/ChatWindow.tsx
|
|
81
|
-
var
|
|
82
|
-
var
|
|
113
|
+
var import_react12 = require("react");
|
|
114
|
+
var import_lucide_react8 = require("lucide-react");
|
|
83
115
|
|
|
84
116
|
// src/components/DocumentUpload.tsx
|
|
85
117
|
var import_react2 = require("react");
|
|
@@ -342,8 +374,8 @@ function DocumentUpload({ namespace, onUploadComplete, className = "" }) {
|
|
|
342
374
|
}
|
|
343
375
|
|
|
344
376
|
// src/components/MessageBubble.tsx
|
|
345
|
-
var
|
|
346
|
-
var
|
|
377
|
+
var import_react10 = __toESM(require("react"));
|
|
378
|
+
var import_lucide_react7 = require("lucide-react");
|
|
347
379
|
var import_react_markdown = __toESM(require("react-markdown"));
|
|
348
380
|
|
|
349
381
|
// src/components/SourceCard.tsx
|
|
@@ -803,6 +835,7 @@ function renderVisualization(type, data, onAddToCart, primaryColor, isStreaming)
|
|
|
803
835
|
return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(TableView, { data, isStreaming });
|
|
804
836
|
case "product_carousel":
|
|
805
837
|
case "carousel":
|
|
838
|
+
if (isStreaming) return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(CarouselSkeleton, {});
|
|
806
839
|
return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(CarouselView, { data, onAddToCart, primaryColor });
|
|
807
840
|
case "text":
|
|
808
841
|
default:
|
|
@@ -813,6 +846,26 @@ function renderVisualization(type, data, onAddToCart, primaryColor, isStreaming)
|
|
|
813
846
|
return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(TextView, { data: { content: "Unable to render the requested visualization." } });
|
|
814
847
|
}
|
|
815
848
|
}
|
|
849
|
+
function CarouselSkeleton() {
|
|
850
|
+
return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "w-full py-2", children: [
|
|
851
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "mb-3 h-4 w-36 rounded-full bg-slate-200 animate-pulse" }),
|
|
852
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "flex gap-3 overflow-hidden", children: Array.from({ length: 4 }).map((_, i) => /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
|
|
853
|
+
"div",
|
|
854
|
+
{
|
|
855
|
+
className: "flex-shrink-0 w-44 rounded-2xl border border-slate-200 bg-white shadow-sm overflow-hidden animate-pulse",
|
|
856
|
+
children: [
|
|
857
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "h-28 bg-slate-100" }),
|
|
858
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "p-3 space-y-2", children: [
|
|
859
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "h-3 w-28 rounded-full bg-slate-200" }),
|
|
860
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "h-3 w-16 rounded-full bg-slate-100" }),
|
|
861
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "h-3 w-20 rounded-full bg-emerald-100" })
|
|
862
|
+
] })
|
|
863
|
+
]
|
|
864
|
+
},
|
|
865
|
+
i
|
|
866
|
+
)) })
|
|
867
|
+
] });
|
|
868
|
+
}
|
|
816
869
|
function ChartSkeleton({ type }) {
|
|
817
870
|
if (type === "pie") {
|
|
818
871
|
return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "w-full mt-4 mb-2 animate-pulse", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "mx-auto w-40 h-40 rounded-full bg-slate-100 dark:bg-white/10" }) });
|
|
@@ -2203,8 +2256,54 @@ function normaliseChild(children) {
|
|
|
2203
2256
|
return children;
|
|
2204
2257
|
}
|
|
2205
2258
|
|
|
2206
|
-
// src/components/
|
|
2259
|
+
// src/components/ThinkingBlock.tsx
|
|
2260
|
+
var import_react9 = require("react");
|
|
2261
|
+
var import_lucide_react6 = require("lucide-react");
|
|
2207
2262
|
var import_jsx_runtime12 = require("react/jsx-runtime");
|
|
2263
|
+
function ThinkingBlock({ thinking, thinkingMs, isStreaming = false }) {
|
|
2264
|
+
const [isExpanded, setIsExpanded] = (0, import_react9.useState)(true);
|
|
2265
|
+
const containerRef = (0, import_react9.useRef)(null);
|
|
2266
|
+
(0, import_react9.useEffect)(() => {
|
|
2267
|
+
if (!isStreaming) {
|
|
2268
|
+
setIsExpanded(false);
|
|
2269
|
+
} else {
|
|
2270
|
+
setIsExpanded(true);
|
|
2271
|
+
}
|
|
2272
|
+
}, [isStreaming]);
|
|
2273
|
+
(0, import_react9.useEffect)(() => {
|
|
2274
|
+
if (isStreaming && isExpanded && containerRef.current) {
|
|
2275
|
+
containerRef.current.scrollTop = containerRef.current.scrollHeight;
|
|
2276
|
+
}
|
|
2277
|
+
}, [thinking, isStreaming, isExpanded]);
|
|
2278
|
+
const durationSec = thinkingMs ? (thinkingMs / 1e3).toFixed(1) : null;
|
|
2279
|
+
return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "w-full max-w-2xl my-1.5 border border-slate-200 dark:border-white/10 rounded-xl bg-slate-50/50 dark:bg-white/5 overflow-hidden transition-all duration-200", children: [
|
|
2280
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
|
|
2281
|
+
"button",
|
|
2282
|
+
{
|
|
2283
|
+
onClick: () => setIsExpanded(!isExpanded),
|
|
2284
|
+
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",
|
|
2285
|
+
children: [
|
|
2286
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
2287
|
+
isStreaming ? /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_lucide_react6.Loader2, { className: "w-3.5 h-3.5 animate-spin text-slate-400 dark:text-white/30" }) : /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_lucide_react6.Brain, { className: "w-3.5 h-3.5 text-slate-400 dark:text-white/40" }),
|
|
2288
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { children: isStreaming ? "Thinking..." : durationSec ? `Thought for ${durationSec}s` : "Thinking process" })
|
|
2289
|
+
] }),
|
|
2290
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { children: isExpanded ? /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_lucide_react6.ChevronDown, { className: "w-3.5 h-3.5 text-slate-400 dark:text-white/30" }) : /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_lucide_react6.ChevronRight, { className: "w-3.5 h-3.5 text-slate-400 dark:text-white/30" }) })
|
|
2291
|
+
]
|
|
2292
|
+
}
|
|
2293
|
+
),
|
|
2294
|
+
isExpanded && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
|
|
2295
|
+
"div",
|
|
2296
|
+
{
|
|
2297
|
+
ref: containerRef,
|
|
2298
|
+
className: "px-4 pb-3 pt-1 border-t border-slate-200 dark:border-white/10 text-xs font-mono leading-relaxed text-slate-600 dark:text-white/60 bg-slate-50/20 dark:bg-transparent max-h-60 overflow-y-auto whitespace-pre-wrap select-text break-words",
|
|
2299
|
+
children: thinking
|
|
2300
|
+
}
|
|
2301
|
+
)
|
|
2302
|
+
] });
|
|
2303
|
+
}
|
|
2304
|
+
|
|
2305
|
+
// src/components/MessageBubble.tsx
|
|
2306
|
+
var import_jsx_runtime13 = require("react/jsx-runtime");
|
|
2208
2307
|
function normalizePlusSeparatedLists(raw) {
|
|
2209
2308
|
return raw.split("\n").map((line) => {
|
|
2210
2309
|
const productListLine = /[—:]\s*\d+\s+\+\s+[A-Za-z]/.test(line) || /\b(products?|categories?|in stock|out of stock)\b/i.test(line);
|
|
@@ -2228,10 +2327,10 @@ function MessageBubble({
|
|
|
2228
2327
|
const isUser = message.role === "user";
|
|
2229
2328
|
const isCompact = viewportSize === "compact";
|
|
2230
2329
|
const isMedium = viewportSize === "medium";
|
|
2231
|
-
const [showSources, setShowSources] =
|
|
2232
|
-
const [showTrace, setShowTrace] =
|
|
2233
|
-
const [copied, setCopied] =
|
|
2234
|
-
const handleCopy =
|
|
2330
|
+
const [showSources, setShowSources] = import_react10.default.useState(false);
|
|
2331
|
+
const [showTrace, setShowTrace] = import_react10.default.useState(false);
|
|
2332
|
+
const [copied, setCopied] = import_react10.default.useState(false);
|
|
2333
|
+
const handleCopy = import_react10.default.useCallback(async () => {
|
|
2235
2334
|
try {
|
|
2236
2335
|
await navigator.clipboard.writeText(message.content);
|
|
2237
2336
|
setCopied(true);
|
|
@@ -2240,11 +2339,11 @@ function MessageBubble({
|
|
|
2240
2339
|
console.error("Failed to copy text:", err);
|
|
2241
2340
|
}
|
|
2242
2341
|
}, [message.content]);
|
|
2243
|
-
const structuredContent =
|
|
2342
|
+
const structuredContent = import_react10.default.useMemo(
|
|
2244
2343
|
() => isUser ? { payload: null, text: message.content } : extractStructuredPayload(message.content),
|
|
2245
2344
|
[isUser, message.content]
|
|
2246
2345
|
);
|
|
2247
|
-
const hasRichUI =
|
|
2346
|
+
const hasRichUI = import_react10.default.useMemo(() => {
|
|
2248
2347
|
if (message.uiTransformation) {
|
|
2249
2348
|
const type = message.uiTransformation.type;
|
|
2250
2349
|
if (type && !["text", "table"].includes(type)) return true;
|
|
@@ -2259,10 +2358,10 @@ function MessageBubble({
|
|
|
2259
2358
|
uiTransformationType && !["text", "product_carousel", "carousel"].includes(uiTransformationType)
|
|
2260
2359
|
);
|
|
2261
2360
|
const shouldRenderStructuredOnly = !isUser && hasRichUI && isLikelyUiOnlyMessage(structuredContent.text);
|
|
2262
|
-
const productsFromSources =
|
|
2361
|
+
const productsFromSources = import_react10.default.useMemo(() => {
|
|
2263
2362
|
return extractProductsFromSources(sources, isUser);
|
|
2264
2363
|
}, [sources, isUser]);
|
|
2265
|
-
const { productsFromContent, cleanContent } =
|
|
2364
|
+
const { productsFromContent, cleanContent } = import_react10.default.useMemo(() => {
|
|
2266
2365
|
if (isUser) {
|
|
2267
2366
|
return { productsFromContent: [], cleanContent: message.content };
|
|
2268
2367
|
}
|
|
@@ -2278,10 +2377,10 @@ function MessageBubble({
|
|
|
2278
2377
|
isStreaming
|
|
2279
2378
|
);
|
|
2280
2379
|
}, [message.content, isUser, structuredContent, productsFromSources, isStreaming]);
|
|
2281
|
-
const allProducts =
|
|
2380
|
+
const allProducts = import_react10.default.useMemo(() => {
|
|
2282
2381
|
return deduplicateProducts(productsFromSources, productsFromContent, message.content);
|
|
2283
2382
|
}, [productsFromSources, productsFromContent, message.content]);
|
|
2284
|
-
const processedMarkdown =
|
|
2383
|
+
const processedMarkdown = import_react10.default.useMemo(() => {
|
|
2285
2384
|
let raw = structuredContent.payload ? structuredContent.text : cleanContent || message.content;
|
|
2286
2385
|
raw = raw.replace(/\$\s*(\d+)(?!\.\d)/g, "$1");
|
|
2287
2386
|
raw = normalizePlusSeparatedLists(raw);
|
|
@@ -2312,41 +2411,49 @@ ${match.trim()}
|
|
|
2312
2411
|
}
|
|
2313
2412
|
return raw;
|
|
2314
2413
|
}, [cleanContent, message.content, isStreaming, structuredContent]);
|
|
2315
|
-
const markdownComponents =
|
|
2414
|
+
const markdownComponents = import_react10.default.useMemo(
|
|
2316
2415
|
() => createMarkdownComponents({ primaryColor, accentColor, isStreaming, onAddToCart, viewportSize }),
|
|
2317
2416
|
[primaryColor, accentColor, isStreaming, onAddToCart, viewportSize]
|
|
2318
2417
|
);
|
|
2319
|
-
return /* @__PURE__ */ (0,
|
|
2320
|
-
/* @__PURE__ */ (0,
|
|
2418
|
+
return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: `flex ${isCompact ? "gap-2" : "gap-3"} ${isUser ? "flex-row-reverse" : "flex-row"} items-start`, children: [
|
|
2419
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
2321
2420
|
"div",
|
|
2322
2421
|
{
|
|
2323
2422
|
className: `flex-shrink-0 ${isCompact ? "w-7 h-7" : "w-8 h-8"} rounded-full flex items-center justify-center shadow-lg ${isUser ? "text-white" : "bg-slate-100 dark:bg-white/10 text-slate-700 dark:text-white/80"}`,
|
|
2324
2423
|
style: isUser ? { background: `linear-gradient(135deg, ${primaryColor}, ${accentColor})` } : {},
|
|
2325
|
-
children: isUser ? /* @__PURE__ */ (0,
|
|
2424
|
+
children: isUser ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_lucide_react7.User, { className: `${isCompact ? "w-3.5 h-3.5" : "w-4 h-4"} text-white` }) : /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_lucide_react7.Bot, { className: `${isCompact ? "w-3.5 h-3.5" : "w-4 h-4"}` })
|
|
2326
2425
|
}
|
|
2327
2426
|
),
|
|
2328
|
-
/* @__PURE__ */ (0,
|
|
2329
|
-
/* @__PURE__ */ (0,
|
|
2427
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: `flex flex-col gap-1 min-w-0 ${isCompact ? "max-w-[94%]" : isMedium ? "max-w-[92%]" : "max-w-[90%]"} ${isUser ? "items-end" : "items-start"}`, children: [
|
|
2428
|
+
!isUser && message.thinking && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
2429
|
+
ThinkingBlock,
|
|
2430
|
+
{
|
|
2431
|
+
thinking: message.thinking,
|
|
2432
|
+
thinkingMs: message.thinkingMs,
|
|
2433
|
+
isStreaming: isStreaming && !message.content
|
|
2434
|
+
}
|
|
2435
|
+
),
|
|
2436
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
|
|
2330
2437
|
"div",
|
|
2331
2438
|
{
|
|
2332
2439
|
className: `relative group ${isCompact ? "px-3 py-2.5 text-[13px]" : "px-4 py-3 text-sm"} rounded-2xl leading-relaxed shadow-sm dark:shadow-lg ${isUser ? "text-white rounded-tr-sm" : "bg-white dark:bg-white/5 border border-slate-200 dark:border-white/10 text-slate-800 dark:text-white/90 rounded-tl-sm"}`,
|
|
2333
2440
|
style: isUser ? { background: `linear-gradient(135deg, ${primaryColor}, ${accentColor})` } : {},
|
|
2334
2441
|
children: [
|
|
2335
|
-
!isUser && !isStreaming && message.content && /* @__PURE__ */ (0,
|
|
2442
|
+
!isUser && !isStreaming && message.content && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
2336
2443
|
"button",
|
|
2337
2444
|
{
|
|
2338
2445
|
onClick: handleCopy,
|
|
2339
2446
|
className: `absolute top-2 right-2 p-1.5 rounded-lg border transition-all duration-200 cursor-pointer ${copied ? "bg-emerald-500/10 border-emerald-500/20 text-emerald-500 dark:text-emerald-400" : "bg-slate-500/5 hover:bg-slate-500/10 border-slate-200 dark:border-white/10 text-slate-400 dark:text-white/30 hover:text-slate-600 dark:hover:text-white/60"} opacity-0 group-hover:opacity-100 backdrop-blur-sm shadow-sm scale-95 group-hover:scale-100`,
|
|
2340
2447
|
title: copied ? "Copied!" : "Copy response",
|
|
2341
|
-
children: copied ? /* @__PURE__ */ (0,
|
|
2448
|
+
children: copied ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_lucide_react7.Check, { className: "w-3.5 h-3.5" }) : /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_lucide_react7.Copy, { className: "w-3.5 h-3.5" })
|
|
2342
2449
|
}
|
|
2343
2450
|
),
|
|
2344
|
-
isStreaming && !message.content ? /* @__PURE__ */ (0,
|
|
2345
|
-
/* @__PURE__ */ (0,
|
|
2346
|
-
/* @__PURE__ */ (0,
|
|
2347
|
-
/* @__PURE__ */ (0,
|
|
2348
|
-
] }) : /* @__PURE__ */ (0,
|
|
2349
|
-
!isUser && structuredContent.payload && /* @__PURE__ */ (0,
|
|
2451
|
+
isStreaming && !message.content ? /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("span", { className: "flex items-center gap-1 py-1", children: [
|
|
2452
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "w-1.5 h-1.5 rounded-full bg-slate-400 dark:bg-white/60 animate-bounce [animation-delay:0ms]" }),
|
|
2453
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "w-1.5 h-1.5 rounded-full bg-slate-400 dark:bg-white/60 animate-bounce [animation-delay:150ms]" }),
|
|
2454
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "w-1.5 h-1.5 rounded-full bg-slate-400 dark:bg-white/60 animate-bounce [animation-delay:300ms]" })
|
|
2455
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: `prose ${isCompact ? "prose-xs" : "prose-sm"} max-w-none break-words ${isUser ? "prose-invert" : "dark:prose-invert"}`, children: [
|
|
2456
|
+
!isUser && structuredContent.payload && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
2350
2457
|
UIDispatcher,
|
|
2351
2458
|
{
|
|
2352
2459
|
rawContent: structuredContent.payload,
|
|
@@ -2357,9 +2464,9 @@ ${match.trim()}
|
|
|
2357
2464
|
viewportSize
|
|
2358
2465
|
}
|
|
2359
2466
|
),
|
|
2360
|
-
!shouldRenderStructuredOnly && /* @__PURE__ */ (0,
|
|
2361
|
-
isStreaming && /* @__PURE__ */ (0,
|
|
2362
|
-
/* @__PURE__ */ (0,
|
|
2467
|
+
!shouldRenderStructuredOnly && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_react_markdown.default, { components: markdownComponents, children: processedMarkdown }),
|
|
2468
|
+
isStreaming && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("span", { className: "inline-flex items-center gap-1.5 ml-2 text-emerald-500 animate-pulse align-middle text-xs font-medium", children: [
|
|
2469
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
2363
2470
|
HourglassLoader_default,
|
|
2364
2471
|
{
|
|
2365
2472
|
size: 18,
|
|
@@ -2376,13 +2483,33 @@ ${match.trim()}
|
|
|
2376
2483
|
),
|
|
2377
2484
|
(() => {
|
|
2378
2485
|
var _a2, _b;
|
|
2379
|
-
if (isUser || structuredContent.payload
|
|
2486
|
+
if (isUser || structuredContent.payload) return null;
|
|
2487
|
+
if (isStreaming && !message.uiTransformation && sources && sources.length > 0) {
|
|
2488
|
+
const hasProductSource = sources.some(
|
|
2489
|
+
(s) => s.metadata && Object.keys(s.metadata).some(
|
|
2490
|
+
(k) => ["name", "title", "price", "brand", "image", "product", "sku", "category"].includes(k.toLowerCase())
|
|
2491
|
+
)
|
|
2492
|
+
);
|
|
2493
|
+
if (hasProductSource) {
|
|
2494
|
+
return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "w-full mt-3", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
2495
|
+
VisualizationRenderer,
|
|
2496
|
+
{
|
|
2497
|
+
data: { type: "product_carousel", title: "Recommended Products", description: "Loading...", data: [] },
|
|
2498
|
+
primaryColor,
|
|
2499
|
+
onAddToCart,
|
|
2500
|
+
className: "rounded-3xl border border-slate-200/60 dark:border-white/10 bg-white/90 dark:bg-slate-900/80 p-4",
|
|
2501
|
+
isStreaming: true
|
|
2502
|
+
}
|
|
2503
|
+
) });
|
|
2504
|
+
}
|
|
2505
|
+
}
|
|
2506
|
+
if (!message.uiTransformation) return null;
|
|
2380
2507
|
const ui = message.uiTransformation;
|
|
2381
2508
|
const textContent = (_b = (_a2 = ui.data) == null ? void 0 : _a2.content) != null ? _b : "";
|
|
2382
2509
|
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");
|
|
2383
2510
|
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()));
|
|
2384
2511
|
if (!shouldShow) return null;
|
|
2385
|
-
return /* @__PURE__ */ (0,
|
|
2512
|
+
return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "w-full mt-3", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
2386
2513
|
VisualizationRenderer,
|
|
2387
2514
|
{
|
|
2388
2515
|
data: ui,
|
|
@@ -2393,7 +2520,7 @@ ${match.trim()}
|
|
|
2393
2520
|
}
|
|
2394
2521
|
) });
|
|
2395
2522
|
})(),
|
|
2396
|
-
!isUser && !hasRichUI && !shouldSuppressProductCarousel && allProducts.length > 0 && /* @__PURE__ */ (0,
|
|
2523
|
+
!isUser && !hasRichUI && !shouldSuppressProductCarousel && allProducts.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "w-full mt-1", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
2397
2524
|
ProductCarousel,
|
|
2398
2525
|
{
|
|
2399
2526
|
products: allProducts,
|
|
@@ -2401,14 +2528,14 @@ ${match.trim()}
|
|
|
2401
2528
|
onAddToCart
|
|
2402
2529
|
}
|
|
2403
2530
|
) }),
|
|
2404
|
-
!isUser && /* @__PURE__ */ (0,
|
|
2405
|
-
sources && sources.length > 0 && /* @__PURE__ */ (0,
|
|
2531
|
+
!isUser && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "flex items-center gap-4 mt-1 w-full flex-wrap", children: [
|
|
2532
|
+
sources && sources.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
|
|
2406
2533
|
"button",
|
|
2407
2534
|
{
|
|
2408
2535
|
onClick: () => setShowSources((s) => !s),
|
|
2409
2536
|
className: "text-[11px] text-indigo-400 hover:text-indigo-300 transition-colors flex items-center gap-1",
|
|
2410
2537
|
children: [
|
|
2411
|
-
showSources ? /* @__PURE__ */ (0,
|
|
2538
|
+
showSources ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_lucide_react7.ChevronDown, { className: "w-3 h-3" }) : /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_lucide_react7.ChevronRight, { className: "w-3 h-3" }),
|
|
2412
2539
|
sources.length,
|
|
2413
2540
|
" source",
|
|
2414
2541
|
sources.length !== 1 ? "s" : "",
|
|
@@ -2416,31 +2543,31 @@ ${match.trim()}
|
|
|
2416
2543
|
]
|
|
2417
2544
|
}
|
|
2418
2545
|
),
|
|
2419
|
-
message.trace && /* @__PURE__ */ (0,
|
|
2546
|
+
message.trace && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
|
|
2420
2547
|
"button",
|
|
2421
2548
|
{
|
|
2422
2549
|
onClick: () => setShowTrace((t) => !t),
|
|
2423
2550
|
className: "text-[11px] text-emerald-500 hover:text-emerald-400 transition-colors flex items-center gap-1",
|
|
2424
2551
|
children: [
|
|
2425
|
-
/* @__PURE__ */ (0,
|
|
2552
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_lucide_react7.Activity, { className: "w-3 h-3" }),
|
|
2426
2553
|
showTrace ? "Hide Trace" : "Trace"
|
|
2427
2554
|
]
|
|
2428
2555
|
}
|
|
2429
2556
|
)
|
|
2430
2557
|
] }),
|
|
2431
|
-
/* @__PURE__ */ (0,
|
|
2432
|
-
showSources && sources && sources.length > 0 && /* @__PURE__ */ (0,
|
|
2433
|
-
showTrace && message.trace && /* @__PURE__ */ (0,
|
|
2558
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "w-full flex flex-col gap-2 min-w-0", children: [
|
|
2559
|
+
showSources && sources && sources.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "mt-1 flex flex-col gap-2", children: sources.map((src, i) => /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(SourceCard, { source: src, index: i }, src.id)) }),
|
|
2560
|
+
showTrace && message.trace && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(ObservabilityPanel, { trace: message.trace, primaryColor })
|
|
2434
2561
|
] })
|
|
2435
2562
|
] })
|
|
2436
2563
|
] });
|
|
2437
2564
|
}
|
|
2438
2565
|
|
|
2439
2566
|
// src/hooks/useRagChat.ts
|
|
2440
|
-
var
|
|
2567
|
+
var import_react11 = require("react");
|
|
2441
2568
|
|
|
2442
2569
|
// src/hooks/useStoredMessages.ts
|
|
2443
|
-
var
|
|
2570
|
+
var React11 = __toESM(require("react"));
|
|
2444
2571
|
function readStoredMessages(storageKey) {
|
|
2445
2572
|
if (typeof window === "undefined") {
|
|
2446
2573
|
return [];
|
|
@@ -2457,8 +2584,8 @@ function readStoredMessages(storageKey) {
|
|
|
2457
2584
|
}
|
|
2458
2585
|
}
|
|
2459
2586
|
function useStoredMessages(storageKey, persist) {
|
|
2460
|
-
const [messages, setMessages] =
|
|
2461
|
-
|
|
2587
|
+
const [messages, setMessages] = React11.useState(() => persist ? readStoredMessages(storageKey) : []);
|
|
2588
|
+
React11.useEffect(() => {
|
|
2462
2589
|
if (!persist || typeof window === "undefined") {
|
|
2463
2590
|
return;
|
|
2464
2591
|
}
|
|
@@ -2498,15 +2625,15 @@ function useRagChat(projectId, options = {}) {
|
|
|
2498
2625
|
} = options;
|
|
2499
2626
|
const storageKey = `rag_chat_${projectId}`;
|
|
2500
2627
|
const [messages, setMessages] = useStoredMessages(storageKey, persist);
|
|
2501
|
-
const [isLoading, setIsLoading] = (0,
|
|
2502
|
-
const [error, setError] = (0,
|
|
2503
|
-
const lastInputRef = (0,
|
|
2504
|
-
const messagesRef = (0,
|
|
2505
|
-
const abortControllerRef = (0,
|
|
2506
|
-
(0,
|
|
2628
|
+
const [isLoading, setIsLoading] = (0, import_react11.useState)(false);
|
|
2629
|
+
const [error, setError] = (0, import_react11.useState)(null);
|
|
2630
|
+
const lastInputRef = (0, import_react11.useRef)("");
|
|
2631
|
+
const messagesRef = (0, import_react11.useRef)(messages);
|
|
2632
|
+
const abortControllerRef = (0, import_react11.useRef)(null);
|
|
2633
|
+
(0, import_react11.useEffect)(() => {
|
|
2507
2634
|
messagesRef.current = messages;
|
|
2508
2635
|
}, [messages]);
|
|
2509
|
-
const sendMessage = (0,
|
|
2636
|
+
const sendMessage = (0, import_react11.useCallback)(
|
|
2510
2637
|
async (text, opts) => {
|
|
2511
2638
|
var _a, _b;
|
|
2512
2639
|
const trimmed = text.trim();
|
|
@@ -2532,7 +2659,9 @@ function useRagChat(projectId, options = {}) {
|
|
|
2532
2659
|
const history = messagesRef.current.map(({ role, content }) => ({ role, content }));
|
|
2533
2660
|
const response = await fetch(apiUrl, {
|
|
2534
2661
|
method: "POST",
|
|
2535
|
-
headers: {
|
|
2662
|
+
headers: __spreadValues({
|
|
2663
|
+
"Content-Type": "application/json"
|
|
2664
|
+
}, options.headers || {}),
|
|
2536
2665
|
signal: controller.signal,
|
|
2537
2666
|
body: JSON.stringify({
|
|
2538
2667
|
message: trimmed,
|
|
@@ -2550,18 +2679,25 @@ function useRagChat(projectId, options = {}) {
|
|
|
2550
2679
|
const reader = response.body.getReader();
|
|
2551
2680
|
const decoder = new TextDecoder();
|
|
2552
2681
|
let assistantContent = "";
|
|
2682
|
+
let thinkingContent = "";
|
|
2683
|
+
let thinkingMs;
|
|
2553
2684
|
let sources = [];
|
|
2554
2685
|
let uiTransformation = null;
|
|
2555
2686
|
let trace;
|
|
2556
2687
|
let buffer = "";
|
|
2557
2688
|
let pendingFlush = false;
|
|
2558
2689
|
const pendingContentRef = { current: "" };
|
|
2690
|
+
const pendingThinkingRef = { current: "" };
|
|
2559
2691
|
const flushTextUpdate = (msgId) => {
|
|
2560
2692
|
pendingFlush = false;
|
|
2561
2693
|
const snapshot = pendingContentRef.current;
|
|
2694
|
+
const thinkingSnapshot = pendingThinkingRef.current;
|
|
2562
2695
|
setMessages(
|
|
2563
2696
|
(prev) => prev.map(
|
|
2564
|
-
(msg) => msg.id === msgId ? __spreadProps(__spreadValues({}, msg), {
|
|
2697
|
+
(msg) => msg.id === msgId ? __spreadProps(__spreadValues({}, msg), {
|
|
2698
|
+
content: snapshot,
|
|
2699
|
+
thinking: thinkingSnapshot || void 0
|
|
2700
|
+
}) : msg
|
|
2565
2701
|
)
|
|
2566
2702
|
);
|
|
2567
2703
|
};
|
|
@@ -2595,8 +2731,13 @@ function useRagChat(projectId, options = {}) {
|
|
|
2595
2731
|
assistantContent += frame.text;
|
|
2596
2732
|
pendingContentRef.current = assistantContent;
|
|
2597
2733
|
scheduleFlush(assistantMessageId);
|
|
2734
|
+
} else if (frame.type === "thinking" && frame.text) {
|
|
2735
|
+
thinkingContent += frame.text;
|
|
2736
|
+
pendingThinkingRef.current = thinkingContent;
|
|
2737
|
+
scheduleFlush(assistantMessageId);
|
|
2598
2738
|
} else if (frame.type === "metadata") {
|
|
2599
2739
|
sources = (_a = frame.sources) != null ? _a : [];
|
|
2740
|
+
thinkingMs = frame.thinkingMs;
|
|
2600
2741
|
hasNonTextFrame = true;
|
|
2601
2742
|
} else if (frame.type === "ui_transformation") {
|
|
2602
2743
|
uiTransformation = frame.data;
|
|
@@ -2614,6 +2755,8 @@ function useRagChat(projectId, options = {}) {
|
|
|
2614
2755
|
(prev) => prev.map(
|
|
2615
2756
|
(msg) => msg.id === assistantMessageId ? __spreadProps(__spreadValues({}, msg), {
|
|
2616
2757
|
content: assistantContent,
|
|
2758
|
+
thinking: thinkingContent || void 0,
|
|
2759
|
+
thinkingMs,
|
|
2617
2760
|
sources: sources.length > 0 ? sources : msg.sources,
|
|
2618
2761
|
uiTransformation: uiTransformation || msg.uiTransformation
|
|
2619
2762
|
}) : msg
|
|
@@ -2624,8 +2767,11 @@ function useRagChat(projectId, options = {}) {
|
|
|
2624
2767
|
if (buffer.trim()) {
|
|
2625
2768
|
for (const frame of parseSseChunk(buffer)) {
|
|
2626
2769
|
if (frame.type === "text" && frame.text) assistantContent += frame.text;
|
|
2627
|
-
else if (frame.type === "
|
|
2628
|
-
else if (frame.type === "
|
|
2770
|
+
else if (frame.type === "thinking" && frame.text) thinkingContent += frame.text;
|
|
2771
|
+
else if (frame.type === "metadata") {
|
|
2772
|
+
sources = (_b = frame.sources) != null ? _b : [];
|
|
2773
|
+
thinkingMs = frame.thinkingMs;
|
|
2774
|
+
} else if (frame.type === "observability") trace = frame.data;
|
|
2629
2775
|
}
|
|
2630
2776
|
}
|
|
2631
2777
|
const finalMsg = {
|
|
@@ -2635,6 +2781,8 @@ function useRagChat(projectId, options = {}) {
|
|
|
2635
2781
|
sources: sources.length > 0 ? sources : void 0,
|
|
2636
2782
|
uiTransformation: uiTransformation != null ? uiTransformation : void 0,
|
|
2637
2783
|
trace,
|
|
2784
|
+
thinking: thinkingContent || void 0,
|
|
2785
|
+
thinkingMs,
|
|
2638
2786
|
createdAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
2639
2787
|
};
|
|
2640
2788
|
setMessages(
|
|
@@ -2656,12 +2804,12 @@ function useRagChat(projectId, options = {}) {
|
|
|
2656
2804
|
},
|
|
2657
2805
|
[apiUrl, isLoading, namespace, onError, onReply, projectId, setMessages]
|
|
2658
2806
|
);
|
|
2659
|
-
const clear = (0,
|
|
2807
|
+
const clear = (0, import_react11.useCallback)(() => {
|
|
2660
2808
|
setMessages([]);
|
|
2661
2809
|
setError(null);
|
|
2662
2810
|
if (persist) localStorage.removeItem(storageKey);
|
|
2663
2811
|
}, [persist, setMessages, storageKey]);
|
|
2664
|
-
const retry = (0,
|
|
2812
|
+
const retry = (0, import_react11.useCallback)(async () => {
|
|
2665
2813
|
if (lastInputRef.current) {
|
|
2666
2814
|
const latestMessage = messagesRef.current[messagesRef.current.length - 1];
|
|
2667
2815
|
await sendMessage(lastInputRef.current, {
|
|
@@ -2669,7 +2817,7 @@ function useRagChat(projectId, options = {}) {
|
|
|
2669
2817
|
});
|
|
2670
2818
|
}
|
|
2671
2819
|
}, [sendMessage]);
|
|
2672
|
-
const stop = (0,
|
|
2820
|
+
const stop = (0, import_react11.useCallback)(() => {
|
|
2673
2821
|
if (abortControllerRef.current) {
|
|
2674
2822
|
abortControllerRef.current.abort();
|
|
2675
2823
|
abortControllerRef.current = null;
|
|
@@ -2689,7 +2837,7 @@ function useRagChat(projectId, options = {}) {
|
|
|
2689
2837
|
}
|
|
2690
2838
|
|
|
2691
2839
|
// src/components/ChatWindow.tsx
|
|
2692
|
-
var
|
|
2840
|
+
var import_jsx_runtime14 = require("react/jsx-runtime");
|
|
2693
2841
|
function ChatWindow({
|
|
2694
2842
|
className = "",
|
|
2695
2843
|
style,
|
|
@@ -2700,25 +2848,29 @@ function ChatWindow({
|
|
|
2700
2848
|
isResized = false,
|
|
2701
2849
|
onMaximize,
|
|
2702
2850
|
isMaximized = false,
|
|
2703
|
-
onAddToCart
|
|
2851
|
+
onAddToCart,
|
|
2852
|
+
apiUrl,
|
|
2853
|
+
headers
|
|
2704
2854
|
}) {
|
|
2705
2855
|
var _a;
|
|
2706
2856
|
const { ui, projectId } = useConfig();
|
|
2707
|
-
const [input, setInput] = (0,
|
|
2708
|
-
const [mounted, setMounted] = (0,
|
|
2709
|
-
const [viewportSize, setViewportSize] = (0,
|
|
2710
|
-
const windowRef = (0,
|
|
2711
|
-
const bottomRef = (0,
|
|
2712
|
-
const inputRef = (0,
|
|
2857
|
+
const [input, setInput] = (0, import_react12.useState)("");
|
|
2858
|
+
const [mounted, setMounted] = (0, import_react12.useState)(false);
|
|
2859
|
+
const [viewportSize, setViewportSize] = (0, import_react12.useState)("large");
|
|
2860
|
+
const windowRef = (0, import_react12.useRef)(null);
|
|
2861
|
+
const bottomRef = (0, import_react12.useRef)(null);
|
|
2862
|
+
const inputRef = (0, import_react12.useRef)(null);
|
|
2713
2863
|
const { messages, send, clear, isLoading, error, stop } = useRagChat(projectId, {
|
|
2714
|
-
namespace: projectId
|
|
2864
|
+
namespace: projectId,
|
|
2865
|
+
apiUrl,
|
|
2866
|
+
headers
|
|
2715
2867
|
});
|
|
2716
|
-
const [suggestions, setSuggestions] = (0,
|
|
2717
|
-
const [isSuggesting, setIsSuggesting] = (0,
|
|
2718
|
-
const [isListening, setIsListening] = (0,
|
|
2719
|
-
const [isUploadModalOpen, setIsUploadModalOpen] = (0,
|
|
2720
|
-
const recognitionRef = (0,
|
|
2721
|
-
(0,
|
|
2868
|
+
const [suggestions, setSuggestions] = (0, import_react12.useState)([]);
|
|
2869
|
+
const [isSuggesting, setIsSuggesting] = (0, import_react12.useState)(false);
|
|
2870
|
+
const [isListening, setIsListening] = (0, import_react12.useState)(false);
|
|
2871
|
+
const [isUploadModalOpen, setIsUploadModalOpen] = (0, import_react12.useState)(false);
|
|
2872
|
+
const recognitionRef = (0, import_react12.useRef)(null);
|
|
2873
|
+
(0, import_react12.useEffect)(() => {
|
|
2722
2874
|
if (typeof window !== "undefined") {
|
|
2723
2875
|
const win = window;
|
|
2724
2876
|
const SpeechRecognition = win.SpeechRecognition || win.webkitSpeechRecognition;
|
|
@@ -2764,10 +2916,10 @@ function ChatWindow({
|
|
|
2764
2916
|
}
|
|
2765
2917
|
}
|
|
2766
2918
|
};
|
|
2767
|
-
(0,
|
|
2919
|
+
(0, import_react12.useEffect)(() => {
|
|
2768
2920
|
setMounted(true);
|
|
2769
2921
|
}, []);
|
|
2770
|
-
(0,
|
|
2922
|
+
(0, import_react12.useEffect)(() => {
|
|
2771
2923
|
const element = windowRef.current;
|
|
2772
2924
|
if (!element || typeof ResizeObserver === "undefined") return;
|
|
2773
2925
|
const resolveViewportSize = (width) => {
|
|
@@ -2783,13 +2935,13 @@ function ChatWindow({
|
|
|
2783
2935
|
observer.observe(element);
|
|
2784
2936
|
return () => observer.disconnect();
|
|
2785
2937
|
}, []);
|
|
2786
|
-
(0,
|
|
2938
|
+
(0, import_react12.useEffect)(() => {
|
|
2787
2939
|
var _a2;
|
|
2788
2940
|
if (messages.length > 0 || isLoading) {
|
|
2789
2941
|
(_a2 = bottomRef.current) == null ? void 0 : _a2.scrollIntoView({ behavior: "smooth" });
|
|
2790
2942
|
}
|
|
2791
2943
|
}, [messages, isLoading]);
|
|
2792
|
-
const sendMessage = (0,
|
|
2944
|
+
const sendMessage = (0, import_react12.useCallback)(async () => {
|
|
2793
2945
|
var _a2;
|
|
2794
2946
|
const text = input.trim();
|
|
2795
2947
|
if (!text || isLoading) return;
|
|
@@ -2819,7 +2971,7 @@ function ChatWindow({
|
|
|
2819
2971
|
const isEmpty = messages.length === 0;
|
|
2820
2972
|
const currentRadius = BORDER_RADIUS_MAP[ui.borderRadius || "xl"];
|
|
2821
2973
|
const isGlass = ui.visualStyle !== "solid";
|
|
2822
|
-
(0,
|
|
2974
|
+
(0, import_react12.useEffect)(() => {
|
|
2823
2975
|
if (input.trim().length < 3) {
|
|
2824
2976
|
return;
|
|
2825
2977
|
}
|
|
@@ -2843,85 +2995,85 @@ function ChatWindow({
|
|
|
2843
2995
|
}, 800);
|
|
2844
2996
|
return () => clearTimeout(timer);
|
|
2845
2997
|
}, [input, projectId]);
|
|
2846
|
-
return /* @__PURE__ */ (0,
|
|
2998
|
+
return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
|
|
2847
2999
|
"div",
|
|
2848
3000
|
{
|
|
2849
3001
|
ref: windowRef,
|
|
2850
3002
|
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}`,
|
|
2851
3003
|
style: __spreadValues({ "--primary": ui.primaryColor, "--accent": ui.accentColor }, style),
|
|
2852
3004
|
children: [
|
|
2853
|
-
onResizeStart && /* @__PURE__ */ (0,
|
|
3005
|
+
onResizeStart && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
2854
3006
|
"div",
|
|
2855
3007
|
{
|
|
2856
3008
|
onMouseDown: onResizeStart,
|
|
2857
3009
|
className: "absolute top-0 left-0 w-6 h-6 cursor-nw-resize z-[100] group flex items-start justify-start p-1",
|
|
2858
3010
|
title: "Drag to resize",
|
|
2859
|
-
children: /* @__PURE__ */ (0,
|
|
3011
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: "w-2.5 h-2.5 border-t-2 border-l-2 border-slate-300 dark:border-white/20 group-hover:border-slate-500 dark:group-hover:border-white/50 transition-colors rounded-tl-[2px]" })
|
|
2860
3012
|
}
|
|
2861
3013
|
),
|
|
2862
|
-
/* @__PURE__ */ (0,
|
|
3014
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
|
|
2863
3015
|
"div",
|
|
2864
3016
|
{
|
|
2865
3017
|
className: "flex items-center justify-between px-5 py-4 border-b border-slate-200 dark:border-white/10",
|
|
2866
3018
|
style: { background: `linear-gradient(135deg, ${ui.primaryColor}15, ${ui.accentColor}10)` },
|
|
2867
3019
|
children: [
|
|
2868
|
-
/* @__PURE__ */ (0,
|
|
3020
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "flex items-center gap-3", children: [
|
|
2869
3021
|
ui.logoUrl ? (
|
|
2870
3022
|
// eslint-disable-next-line @next/next/no-img-element
|
|
2871
|
-
/* @__PURE__ */ (0,
|
|
2872
|
-
) : /* @__PURE__ */ (0,
|
|
3023
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)("img", { src: ui.logoUrl, alt: "logo", className: "w-8 h-8 rounded-lg object-cover" })
|
|
3024
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
2873
3025
|
"div",
|
|
2874
3026
|
{
|
|
2875
3027
|
className: `w-9 h-9 flex items-center justify-center shadow-md ${ui.borderRadius === "full" ? "rounded-full" : "rounded-xl"}`,
|
|
2876
3028
|
style: { background: `linear-gradient(135deg, ${ui.primaryColor}, ${ui.accentColor})` },
|
|
2877
|
-
children: /* @__PURE__ */ (0,
|
|
3029
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react8.Bot, { className: "w-5 h-5 text-white" })
|
|
2878
3030
|
}
|
|
2879
3031
|
),
|
|
2880
|
-
/* @__PURE__ */ (0,
|
|
2881
|
-
/* @__PURE__ */ (0,
|
|
2882
|
-
ui.poweredBy && /* @__PURE__ */ (0,
|
|
3032
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { children: [
|
|
3033
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)("h2", { className: "text-slate-900 dark:text-white font-semibold text-sm leading-tight", children: ui.title }),
|
|
3034
|
+
ui.poweredBy && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("p", { className: "text-slate-500 dark:text-white/40 text-[11px] leading-tight", children: `Powered by ${ui.poweredBy}` })
|
|
2883
3035
|
] })
|
|
2884
3036
|
] }),
|
|
2885
|
-
/* @__PURE__ */ (0,
|
|
2886
|
-
/* @__PURE__ */ (0,
|
|
2887
|
-
/* @__PURE__ */ (0,
|
|
3037
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "flex items-center gap-1.5", children: [
|
|
3038
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("span", { className: "flex items-center gap-1 text-[10px] text-emerald-500 dark:text-emerald-400 mr-2", children: [
|
|
3039
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "w-1.5 h-1.5 rounded-full bg-emerald-500 dark:bg-emerald-400 animate-pulse" }),
|
|
2888
3040
|
"Online"
|
|
2889
3041
|
] }),
|
|
2890
|
-
/* @__PURE__ */ (0,
|
|
2891
|
-
mounted && messages.length > 0 && /* @__PURE__ */ (0,
|
|
3042
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "flex items-center bg-slate-100/50 dark:bg-white/5 rounded-lg p-0.5 border border-slate-200/50 dark:border-white/5", children: [
|
|
3043
|
+
mounted && messages.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
2892
3044
|
"button",
|
|
2893
3045
|
{
|
|
2894
3046
|
onClick: clearHistory,
|
|
2895
3047
|
title: "Clear conversation",
|
|
2896
3048
|
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",
|
|
2897
|
-
children: /* @__PURE__ */ (0,
|
|
3049
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react8.Trash2, { className: "w-3.5 h-3.5" })
|
|
2898
3050
|
}
|
|
2899
3051
|
),
|
|
2900
|
-
isResized && onResetResize && /* @__PURE__ */ (0,
|
|
3052
|
+
isResized && onResetResize && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
2901
3053
|
"button",
|
|
2902
3054
|
{
|
|
2903
3055
|
onClick: onResetResize,
|
|
2904
3056
|
title: "Reset to default size",
|
|
2905
3057
|
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",
|
|
2906
|
-
children: /* @__PURE__ */ (0,
|
|
3058
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react8.RotateCcw, { className: "w-3.5 h-3.5" })
|
|
2907
3059
|
}
|
|
2908
3060
|
),
|
|
2909
|
-
onMaximize && /* @__PURE__ */ (0,
|
|
3061
|
+
onMaximize && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
2910
3062
|
"button",
|
|
2911
3063
|
{
|
|
2912
3064
|
onClick: onMaximize,
|
|
2913
3065
|
title: isMaximized ? "Minimize" : "Maximize",
|
|
2914
3066
|
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",
|
|
2915
|
-
children: isMaximized ? /* @__PURE__ */ (0,
|
|
3067
|
+
children: isMaximized ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react8.Minimize2, { className: "w-3.5 h-3.5" }) : /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react8.Maximize2, { className: "w-3.5 h-3.5" })
|
|
2916
3068
|
}
|
|
2917
3069
|
),
|
|
2918
|
-
showClose && onClose && /* @__PURE__ */ (0,
|
|
3070
|
+
showClose && onClose && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
2919
3071
|
"button",
|
|
2920
3072
|
{
|
|
2921
3073
|
onClick: onClose,
|
|
2922
3074
|
title: "Close chat",
|
|
2923
3075
|
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",
|
|
2924
|
-
children: /* @__PURE__ */ (0,
|
|
3076
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react8.X, { className: "w-4 h-4" })
|
|
2925
3077
|
}
|
|
2926
3078
|
)
|
|
2927
3079
|
] })
|
|
@@ -2929,24 +3081,24 @@ function ChatWindow({
|
|
|
2929
3081
|
]
|
|
2930
3082
|
}
|
|
2931
3083
|
),
|
|
2932
|
-
/* @__PURE__ */ (0,
|
|
3084
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "flex-1 overflow-y-auto px-4 py-4 space-y-5 scrollbar-thin scrollbar-thumb-slate-200 dark:scrollbar-thumb-white/10 scrollbar-track-transparent min-h-0 bg-slate-50 dark:bg-transparent", children: [
|
|
2933
3085
|
!mounted || isEmpty ? (
|
|
2934
3086
|
/* Welcome state */
|
|
2935
|
-
/* @__PURE__ */ (0,
|
|
2936
|
-
/* @__PURE__ */ (0,
|
|
3087
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "h-full flex flex-col items-center justify-center text-center gap-4 px-6 py-12", children: [
|
|
3088
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
2937
3089
|
"div",
|
|
2938
3090
|
{
|
|
2939
3091
|
className: `w-16 h-16 flex items-center justify-center shadow-lg ${ui.borderRadius === "full" ? "rounded-full" : "rounded-2xl"}`,
|
|
2940
3092
|
style: { background: `linear-gradient(135deg, ${ui.primaryColor}, ${ui.accentColor})` },
|
|
2941
|
-
children: /* @__PURE__ */ (0,
|
|
3093
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react8.Sparkles, { className: "w-8 h-8 text-white" })
|
|
2942
3094
|
}
|
|
2943
3095
|
),
|
|
2944
|
-
/* @__PURE__ */ (0,
|
|
2945
|
-
/* @__PURE__ */ (0,
|
|
2946
|
-
/* @__PURE__ */ (0,
|
|
3096
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { children: [
|
|
3097
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)("p", { className: "text-slate-800 dark:text-white/80 font-medium leading-relaxed", children: ui.welcomeMessage }),
|
|
3098
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)("p", { className: "text-slate-500 dark:text-white/30 text-sm mt-2", children: "Ask a question to get started" })
|
|
2947
3099
|
] }),
|
|
2948
|
-
/* @__PURE__ */ (0,
|
|
2949
|
-
(suggestion) => /* @__PURE__ */ (0,
|
|
3100
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: "flex flex-wrap gap-2 justify-center mt-2", children: CHAT_SUGGESTIONS.map(
|
|
3101
|
+
(suggestion) => /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
2950
3102
|
"button",
|
|
2951
3103
|
{
|
|
2952
3104
|
onClick: () => {
|
|
@@ -2961,7 +3113,7 @@ function ChatWindow({
|
|
|
2961
3113
|
)
|
|
2962
3114
|
) })
|
|
2963
3115
|
] })
|
|
2964
|
-
) : messages.map((msg, index) => /* @__PURE__ */ (0,
|
|
3116
|
+
) : messages.map((msg, index) => /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
2965
3117
|
MessageBubble,
|
|
2966
3118
|
{
|
|
2967
3119
|
message: msg,
|
|
@@ -2974,7 +3126,7 @@ function ChatWindow({
|
|
|
2974
3126
|
},
|
|
2975
3127
|
msg.id
|
|
2976
3128
|
)),
|
|
2977
|
-
isLoading && ((_a = messages[messages.length - 1]) == null ? void 0 : _a.role) !== "assistant" && /* @__PURE__ */ (0,
|
|
3129
|
+
isLoading && ((_a = messages[messages.length - 1]) == null ? void 0 : _a.role) !== "assistant" && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
2978
3130
|
MessageBubble,
|
|
2979
3131
|
{
|
|
2980
3132
|
message: { id: "loading", role: "assistant", content: "", createdAt: (/* @__PURE__ */ new Date()).toISOString() },
|
|
@@ -2985,22 +3137,22 @@ function ChatWindow({
|
|
|
2985
3137
|
viewportSize
|
|
2986
3138
|
}
|
|
2987
3139
|
),
|
|
2988
|
-
error && /* @__PURE__ */ (0,
|
|
2989
|
-
/* @__PURE__ */ (0,
|
|
2990
|
-
/* @__PURE__ */ (0,
|
|
3140
|
+
error && /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "flex items-center gap-2 text-rose-500 dark:text-rose-400 text-sm bg-rose-50 dark:bg-rose-400/10 border border-rose-200 dark:border-rose-400/20 rounded-xl px-4 py-3", children: [
|
|
3141
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react8.TriangleAlert, { className: "w-4 h-4 flex-shrink-0" }),
|
|
3142
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { children: error })
|
|
2991
3143
|
] }),
|
|
2992
|
-
/* @__PURE__ */ (0,
|
|
3144
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { ref: bottomRef })
|
|
2993
3145
|
] }),
|
|
2994
|
-
isUploadModalOpen && /* @__PURE__ */ (0,
|
|
2995
|
-
/* @__PURE__ */ (0,
|
|
3146
|
+
isUploadModalOpen && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: "absolute inset-0 z-50 flex items-center justify-center p-4 bg-slate-900/50 backdrop-blur-sm rounded-inherit", children: /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "relative w-full max-w-md bg-white dark:bg-[#0f0f1a] rounded-2xl shadow-2xl overflow-hidden animate-in zoom-in-95 duration-200", children: [
|
|
3147
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
2996
3148
|
"button",
|
|
2997
3149
|
{
|
|
2998
3150
|
onClick: () => setIsUploadModalOpen(false),
|
|
2999
3151
|
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",
|
|
3000
|
-
children: /* @__PURE__ */ (0,
|
|
3152
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react8.X, { className: "w-5 h-5" })
|
|
3001
3153
|
}
|
|
3002
3154
|
),
|
|
3003
|
-
/* @__PURE__ */ (0,
|
|
3155
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
3004
3156
|
DocumentUpload,
|
|
3005
3157
|
{
|
|
3006
3158
|
namespace: projectId,
|
|
@@ -3008,9 +3160,9 @@ function ChatWindow({
|
|
|
3008
3160
|
}
|
|
3009
3161
|
)
|
|
3010
3162
|
] }) }),
|
|
3011
|
-
/* @__PURE__ */ (0,
|
|
3012
|
-
(suggestions.length > 0 || isSuggesting) && !isLoading && /* @__PURE__ */ (0,
|
|
3013
|
-
suggestions.map((suggestion) => /* @__PURE__ */ (0,
|
|
3163
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: `px-4 pb-4 pt-2 border-t border-slate-200 dark:border-white/10 ${isGlass ? "bg-transparent" : "bg-white dark:bg-[#0f0f1a]"}`, children: [
|
|
3164
|
+
(suggestions.length > 0 || isSuggesting) && !isLoading && /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "mb-3 flex flex-wrap gap-2 animate-in fade-in slide-in-from-bottom-2 duration-300", children: [
|
|
3165
|
+
suggestions.map((suggestion) => /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
|
|
3014
3166
|
"button",
|
|
3015
3167
|
{
|
|
3016
3168
|
onClick: () => {
|
|
@@ -3021,19 +3173,19 @@ function ChatWindow({
|
|
|
3021
3173
|
},
|
|
3022
3174
|
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",
|
|
3023
3175
|
children: [
|
|
3024
|
-
/* @__PURE__ */ (0,
|
|
3176
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react8.Sparkles, { className: "w-3 h-3 text-amber-400" }),
|
|
3025
3177
|
suggestion
|
|
3026
3178
|
]
|
|
3027
3179
|
},
|
|
3028
3180
|
suggestion
|
|
3029
3181
|
)),
|
|
3030
|
-
isSuggesting && suggestions.length === 0 && /* @__PURE__ */ (0,
|
|
3031
|
-
/* @__PURE__ */ (0,
|
|
3182
|
+
isSuggesting && suggestions.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "flex items-center gap-1.5 px-3 py-1.5 rounded-xl text-[11px] font-medium text-slate-400 dark:text-white/30 animate-pulse", children: [
|
|
3183
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react8.Sparkles, { className: "w-3 h-3" }),
|
|
3032
3184
|
"Thinking..."
|
|
3033
3185
|
] })
|
|
3034
3186
|
] }),
|
|
3035
|
-
/* @__PURE__ */ (0,
|
|
3036
|
-
/* @__PURE__ */ (0,
|
|
3187
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: `flex items-end gap-2 bg-slate-50 dark:bg-white/5 border border-slate-200 dark:border-white/10 p-2 focus-within:border-slate-300 dark:focus-within:border-white/20 transition-all ${ui.borderRadius === "full" ? "rounded-3xl" : "rounded-2xl"}`, children: [
|
|
3188
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
3037
3189
|
"textarea",
|
|
3038
3190
|
{
|
|
3039
3191
|
ref: inputRef,
|
|
@@ -3053,7 +3205,7 @@ function ChatWindow({
|
|
|
3053
3205
|
style: { scrollbarWidth: "none" }
|
|
3054
3206
|
}
|
|
3055
3207
|
),
|
|
3056
|
-
ui.enableVoiceInput !== false && /* @__PURE__ */ (0,
|
|
3208
|
+
ui.enableVoiceInput !== false && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
3057
3209
|
"button",
|
|
3058
3210
|
{
|
|
3059
3211
|
type: "button",
|
|
@@ -3061,28 +3213,28 @@ function ChatWindow({
|
|
|
3061
3213
|
disabled: isLoading,
|
|
3062
3214
|
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"}`,
|
|
3063
3215
|
title: isListening ? "Stop listening" : "Start voice input",
|
|
3064
|
-
children: isListening ? /* @__PURE__ */ (0,
|
|
3216
|
+
children: isListening ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react8.MicOff, { className: "w-4 h-4" }) : /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react8.Mic, { className: "w-4 h-4" })
|
|
3065
3217
|
}
|
|
3066
3218
|
),
|
|
3067
|
-
ui.allowUpload !== false && /* @__PURE__ */ (0,
|
|
3219
|
+
ui.allowUpload !== false && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
3068
3220
|
"button",
|
|
3069
3221
|
{
|
|
3070
3222
|
type: "button",
|
|
3071
3223
|
onClick: () => setIsUploadModalOpen(true),
|
|
3072
3224
|
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",
|
|
3073
3225
|
title: "Upload Document",
|
|
3074
|
-
children: /* @__PURE__ */ (0,
|
|
3226
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react8.Paperclip, { className: "w-4 h-4" })
|
|
3075
3227
|
}
|
|
3076
3228
|
),
|
|
3077
|
-
isLoading ? /* @__PURE__ */ (0,
|
|
3229
|
+
isLoading ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
3078
3230
|
"button",
|
|
3079
3231
|
{
|
|
3080
3232
|
onClick: stop,
|
|
3081
3233
|
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",
|
|
3082
3234
|
title: "Stop generating",
|
|
3083
|
-
children: /* @__PURE__ */ (0,
|
|
3235
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: "w-3.5 h-3.5 bg-white rounded-[2px]" })
|
|
3084
3236
|
}
|
|
3085
|
-
) : /* @__PURE__ */ (0,
|
|
3237
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
3086
3238
|
"button",
|
|
3087
3239
|
{
|
|
3088
3240
|
onClick: sendMessage,
|
|
@@ -3092,11 +3244,11 @@ function ChatWindow({
|
|
|
3092
3244
|
background: input.trim() ? `linear-gradient(135deg, ${ui.primaryColor}, ${ui.accentColor})` : "rgba(148, 163, 184, 0.2)"
|
|
3093
3245
|
// slate-400/20 for light mode disabled
|
|
3094
3246
|
},
|
|
3095
|
-
children: /* @__PURE__ */ (0,
|
|
3247
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react8.ArrowUp, { className: "w-4 h-4 text-white" })
|
|
3096
3248
|
}
|
|
3097
3249
|
)
|
|
3098
3250
|
] }),
|
|
3099
|
-
/* @__PURE__ */ (0,
|
|
3251
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)("p", { className: "text-center text-[10px] text-slate-400 dark:text-white/20 mt-2", children: "Press Enter to send \xB7 Shift+Enter for new line" })
|
|
3100
3252
|
] })
|
|
3101
3253
|
]
|
|
3102
3254
|
}
|
|
@@ -3104,7 +3256,7 @@ function ChatWindow({
|
|
|
3104
3256
|
}
|
|
3105
3257
|
|
|
3106
3258
|
// src/components/ChatWidget.tsx
|
|
3107
|
-
var
|
|
3259
|
+
var import_jsx_runtime15 = require("react/jsx-runtime");
|
|
3108
3260
|
var DEFAULT_DIMENSIONS = { width: 380, height: 600 };
|
|
3109
3261
|
var GEMINI_STYLES = `
|
|
3110
3262
|
@keyframes shapeshift {
|
|
@@ -3143,14 +3295,14 @@ var GEMINI_STYLES = `
|
|
|
3143
3295
|
--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);
|
|
3144
3296
|
}
|
|
3145
3297
|
`;
|
|
3146
|
-
function ChatWidget({ position = "bottom-right", onAddToCart }) {
|
|
3298
|
+
function ChatWidget({ position = "bottom-right", onAddToCart, apiUrl, headers }) {
|
|
3147
3299
|
const { ui } = useConfig();
|
|
3148
|
-
const [isOpen, setIsOpen] = (0,
|
|
3149
|
-
const [hasUnread, setHasUnread] = (0,
|
|
3150
|
-
const [dimensions, setDimensions] = (0,
|
|
3151
|
-
const [isResizing, setIsResizing] = (0,
|
|
3152
|
-
const [isMaximized, setIsMaximized] = (0,
|
|
3153
|
-
const [prevDimensions, setPrevDimensions] = (0,
|
|
3300
|
+
const [isOpen, setIsOpen] = (0, import_react13.useState)(false);
|
|
3301
|
+
const [hasUnread, setHasUnread] = (0, import_react13.useState)(false);
|
|
3302
|
+
const [dimensions, setDimensions] = (0, import_react13.useState)(DEFAULT_DIMENSIONS);
|
|
3303
|
+
const [isResizing, setIsResizing] = (0, import_react13.useState)(false);
|
|
3304
|
+
const [isMaximized, setIsMaximized] = (0, import_react13.useState)(false);
|
|
3305
|
+
const [prevDimensions, setPrevDimensions] = (0, import_react13.useState)(DEFAULT_DIMENSIONS);
|
|
3154
3306
|
if (ui.showWidget === false) return null;
|
|
3155
3307
|
const positionClass = position === "bottom-left" ? "bottom-6 left-6" : "bottom-6 right-6";
|
|
3156
3308
|
const windowPositionClass = position === "bottom-left" ? "bottom-20 left-6" : "bottom-20 right-6";
|
|
@@ -3199,9 +3351,9 @@ function ChatWidget({ position = "bottom-right", onAddToCart }) {
|
|
|
3199
3351
|
}
|
|
3200
3352
|
};
|
|
3201
3353
|
const isResized = dimensions.width !== DEFAULT_DIMENSIONS.width || dimensions.height !== DEFAULT_DIMENSIONS.height;
|
|
3202
|
-
return /* @__PURE__ */ (0,
|
|
3203
|
-
/* @__PURE__ */ (0,
|
|
3204
|
-
/* @__PURE__ */ (0,
|
|
3354
|
+
return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_jsx_runtime15.Fragment, { children: [
|
|
3355
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("style", { dangerouslySetInnerHTML: { __html: GEMINI_STYLES } }),
|
|
3356
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
|
|
3205
3357
|
"div",
|
|
3206
3358
|
{
|
|
3207
3359
|
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"}`,
|
|
@@ -3211,7 +3363,7 @@ function ChatWidget({ position = "bottom-right", onAddToCart }) {
|
|
|
3211
3363
|
maxHeight: "calc(100vh - 6rem)"
|
|
3212
3364
|
},
|
|
3213
3365
|
children: [
|
|
3214
|
-
/* @__PURE__ */ (0,
|
|
3366
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
3215
3367
|
ChatWindow,
|
|
3216
3368
|
{
|
|
3217
3369
|
className: "h-full relative z-10",
|
|
@@ -3222,10 +3374,12 @@ function ChatWidget({ position = "bottom-right", onAddToCart }) {
|
|
|
3222
3374
|
isResized,
|
|
3223
3375
|
onMaximize: ui.allowResize !== false ? handleMaximize : void 0,
|
|
3224
3376
|
isMaximized,
|
|
3225
|
-
onAddToCart
|
|
3377
|
+
onAddToCart,
|
|
3378
|
+
apiUrl,
|
|
3379
|
+
headers
|
|
3226
3380
|
}
|
|
3227
3381
|
),
|
|
3228
|
-
/* @__PURE__ */ (0,
|
|
3382
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
3229
3383
|
"div",
|
|
3230
3384
|
{
|
|
3231
3385
|
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"}`
|
|
@@ -3234,18 +3388,18 @@ function ChatWidget({ position = "bottom-right", onAddToCart }) {
|
|
|
3234
3388
|
]
|
|
3235
3389
|
}
|
|
3236
3390
|
),
|
|
3237
|
-
/* @__PURE__ */ (0,
|
|
3391
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
|
|
3238
3392
|
"button",
|
|
3239
3393
|
{
|
|
3240
3394
|
onClick: isOpen ? () => setIsOpen(false) : handleOpen,
|
|
3241
3395
|
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}`,
|
|
3242
3396
|
"aria-label": "Open chat",
|
|
3243
3397
|
children: [
|
|
3244
|
-
/* @__PURE__ */ (0,
|
|
3398
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
3245
3399
|
"div",
|
|
3246
3400
|
{
|
|
3247
3401
|
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]",
|
|
3248
|
-
children: /* @__PURE__ */ (0,
|
|
3402
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
3249
3403
|
"div",
|
|
3250
3404
|
{
|
|
3251
3405
|
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]",
|
|
@@ -3256,34 +3410,81 @@ function ChatWidget({ position = "bottom-right", onAddToCart }) {
|
|
|
3256
3410
|
)
|
|
3257
3411
|
}
|
|
3258
3412
|
),
|
|
3259
|
-
/* @__PURE__ */ (0,
|
|
3413
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
3260
3414
|
"span",
|
|
3261
3415
|
{
|
|
3262
3416
|
className: "absolute inset-0 rounded-full animate-ping opacity-20 pointer-events-none",
|
|
3263
3417
|
style: { background: ui.primaryColor }
|
|
3264
3418
|
}
|
|
3265
3419
|
),
|
|
3266
|
-
/* @__PURE__ */ (0,
|
|
3420
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
3267
3421
|
"span",
|
|
3268
3422
|
{
|
|
3269
3423
|
className: `relative z-10 transition-transform duration-300 ${isOpen ? "rotate-90 scale-90" : "rotate-0 scale-100"}`,
|
|
3270
|
-
children: isOpen ? /* @__PURE__ */ (0,
|
|
3424
|
+
children: isOpen ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_lucide_react9.X, { className: "w-6 h-6 text-white" }) : /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_lucide_react9.MessageSquare, { className: "w-6 h-6 text-white" })
|
|
3271
3425
|
}
|
|
3272
3426
|
),
|
|
3273
|
-
hasUnread && !isOpen && /* @__PURE__ */ (0,
|
|
3427
|
+
hasUnread && !isOpen && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: "absolute top-0 right-0 w-4 h-4 bg-rose-500 rounded-full border-2 border-white flex items-center justify-center text-[9px] font-bold text-white", children: "1" })
|
|
3274
3428
|
]
|
|
3275
3429
|
}
|
|
3276
3430
|
)
|
|
3277
3431
|
] });
|
|
3278
3432
|
}
|
|
3433
|
+
|
|
3434
|
+
// src/exceptions/index.ts
|
|
3435
|
+
var RetrivoraError = class extends Error {
|
|
3436
|
+
constructor(message, code, details) {
|
|
3437
|
+
super(message);
|
|
3438
|
+
this.name = new.target.name;
|
|
3439
|
+
this.code = code;
|
|
3440
|
+
this.details = details;
|
|
3441
|
+
}
|
|
3442
|
+
};
|
|
3443
|
+
var ProviderNotFoundException = class extends RetrivoraError {
|
|
3444
|
+
constructor(providerType, provider, details) {
|
|
3445
|
+
super(`Unsupported ${providerType} provider: ${provider}`, "PROVIDER_NOT_FOUND", details);
|
|
3446
|
+
}
|
|
3447
|
+
};
|
|
3448
|
+
var EmbeddingFailedException = class extends RetrivoraError {
|
|
3449
|
+
constructor(message = "Embedding generation failed", details) {
|
|
3450
|
+
super(message, "EMBEDDING_FAILED", details);
|
|
3451
|
+
}
|
|
3452
|
+
};
|
|
3453
|
+
var RetrievalException = class extends RetrivoraError {
|
|
3454
|
+
constructor(message = "Retrieval failed", details) {
|
|
3455
|
+
super(message, "RETRIEVAL_FAILED", details);
|
|
3456
|
+
}
|
|
3457
|
+
};
|
|
3458
|
+
var RateLimitException = class extends RetrivoraError {
|
|
3459
|
+
constructor(message = "Provider rate limit exceeded", details) {
|
|
3460
|
+
super(message, "RATE_LIMITED", details);
|
|
3461
|
+
}
|
|
3462
|
+
};
|
|
3463
|
+
var ConfigurationException = class extends RetrivoraError {
|
|
3464
|
+
constructor(message, details) {
|
|
3465
|
+
super(message, "CONFIGURATION_ERROR", details);
|
|
3466
|
+
}
|
|
3467
|
+
};
|
|
3468
|
+
var AuthenticationException = class extends RetrivoraError {
|
|
3469
|
+
constructor(message = "Provider authentication failed", details) {
|
|
3470
|
+
super(message, "AUTHENTICATION_ERROR", details);
|
|
3471
|
+
}
|
|
3472
|
+
};
|
|
3279
3473
|
// Annotate the CommonJS export names for ESM import in node:
|
|
3280
3474
|
0 && (module.exports = {
|
|
3475
|
+
AuthenticationException,
|
|
3281
3476
|
ChatWidget,
|
|
3282
3477
|
ChatWindow,
|
|
3283
3478
|
ConfigProvider,
|
|
3479
|
+
ConfigurationException,
|
|
3284
3480
|
DocumentUpload,
|
|
3481
|
+
EmbeddingFailedException,
|
|
3285
3482
|
MessageBubble,
|
|
3286
3483
|
ObservabilityPanel,
|
|
3484
|
+
ProviderNotFoundException,
|
|
3485
|
+
RateLimitException,
|
|
3486
|
+
RetrievalException,
|
|
3487
|
+
RetrivoraError,
|
|
3287
3488
|
SourceCard,
|
|
3288
3489
|
addSynonyms,
|
|
3289
3490
|
useConfig,
|