@blank-utils/llm 0.3.19 → 0.4.0
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/dist/{chunk-UGYWT6UB.js → chunk-PTPT4EPO.js} +123 -118
- package/dist/index.css +245 -403
- package/dist/index.js +1 -1
- package/dist/react/index.css +245 -403
- package/dist/react/index.js +1 -1
- package/package.json +1 -1
|
@@ -894,7 +894,7 @@ import { useRef as useRef3, useEffect as useEffect3, useState as useState3, useM
|
|
|
894
894
|
// src/react/chat-input.tsx
|
|
895
895
|
import "react";
|
|
896
896
|
import { useRef as useRef2, useEffect as useEffect2, useCallback as useCallback2, useState as useState2 } from "react";
|
|
897
|
-
import
|
|
897
|
+
import "lucide-react";
|
|
898
898
|
import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
899
899
|
function ChatInput({
|
|
900
900
|
value,
|
|
@@ -1006,7 +1006,7 @@ ${newText}` : newText);
|
|
|
1006
1006
|
return /* @__PURE__ */ jsxs2(
|
|
1007
1007
|
"div",
|
|
1008
1008
|
{
|
|
1009
|
-
className: `relative flex flex-col bg-
|
|
1009
|
+
className: `relative flex flex-col bg-transparent rounded-none transition-colors p-0 font-mono ${className}`,
|
|
1010
1010
|
onDragOver: (e) => {
|
|
1011
1011
|
e.preventDefault();
|
|
1012
1012
|
setIsDragging(true);
|
|
@@ -1014,10 +1014,7 @@ ${newText}` : newText);
|
|
|
1014
1014
|
onDragLeave: () => setIsDragging(false),
|
|
1015
1015
|
onDrop: handleDrop,
|
|
1016
1016
|
children: [
|
|
1017
|
-
isDragging && /* @__PURE__ */
|
|
1018
|
-
/* @__PURE__ */ jsx2(ImagePlus, { className: "w-8 h-8 text-black/50 dark:text-white/50 mb-4" }),
|
|
1019
|
-
/* @__PURE__ */ jsx2("span", { className: "text-black/50 dark:text-white/50 font-medium tracking-[0.2em] uppercase text-xs", children: "Drop file to attach" })
|
|
1020
|
-
] }),
|
|
1017
|
+
isDragging && /* @__PURE__ */ jsx2("div", { className: "absolute inset-x-0 inset-y-0 bg-current/90 flex flex-col items-center justify-center z-20 backdrop-blur-sm", children: /* @__PURE__ */ jsx2("span", { className: "text-black dark:text-white font-light tracking-[0.2em] uppercase text-xs", children: "DROP FILE TO ATTACH" }) }),
|
|
1021
1018
|
/* @__PURE__ */ jsx2(
|
|
1022
1019
|
"input",
|
|
1023
1020
|
{
|
|
@@ -1029,15 +1026,15 @@ ${newText}` : newText);
|
|
|
1029
1026
|
onChange: handleFileSelect
|
|
1030
1027
|
}
|
|
1031
1028
|
),
|
|
1032
|
-
images.length > 0 && /* @__PURE__ */ jsx2("div", { className: "flex flex-wrap gap-2 mb-
|
|
1033
|
-
/* @__PURE__ */ jsx2("img", { src: img.dataUrl, alt: "attachment", className: "w-full h-full object-cover grayscale
|
|
1029
|
+
images.length > 0 && /* @__PURE__ */ jsx2("div", { className: "flex flex-wrap gap-2 mb-6", children: images.map((img) => /* @__PURE__ */ jsxs2("div", { className: "relative w-16 h-16 overflow-hidden border border-current/20 rounded-none group select-none", children: [
|
|
1030
|
+
/* @__PURE__ */ jsx2("img", { src: img.dataUrl, alt: "attachment", className: "w-full h-full object-cover grayscale transition-all group-hover:grayscale-0" }),
|
|
1034
1031
|
/* @__PURE__ */ jsx2(
|
|
1035
1032
|
"button",
|
|
1036
1033
|
{
|
|
1037
1034
|
type: "button",
|
|
1038
|
-
className: "absolute top-0 right-0 w-
|
|
1035
|
+
className: "absolute top-0 right-0 w-5 h-5 bg-black/80 text-white flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity text-[8px]",
|
|
1039
1036
|
onClick: () => onImageRemove?.(img.id),
|
|
1040
|
-
children:
|
|
1037
|
+
children: "[X]"
|
|
1041
1038
|
}
|
|
1042
1039
|
)
|
|
1043
1040
|
] }, img.id)) }),
|
|
@@ -1052,40 +1049,37 @@ ${newText}` : newText);
|
|
|
1052
1049
|
placeholder,
|
|
1053
1050
|
disabled: disabled && !isGenerating,
|
|
1054
1051
|
rows: 1,
|
|
1055
|
-
className: "w-full min-h-[24px] max-h-[200px] resize-none border-none outline-none bg-transparent text-
|
|
1052
|
+
className: "w-full min-h-[24px] max-h-[200px] resize-none border-none outline-none bg-transparent text-current text-[13px] font-light font-mono leading-relaxed p-0 m-0 placeholder:text-current placeholder:opacity-30 placeholder:uppercase placeholder:tracking-[0.2em] scrollbar-none"
|
|
1056
1053
|
}
|
|
1057
1054
|
),
|
|
1058
|
-
/* @__PURE__ */ jsxs2("div", { className: "flex items-
|
|
1055
|
+
/* @__PURE__ */ jsxs2("div", { className: "flex items-center justify-between mt-6", children: [
|
|
1059
1056
|
/* @__PURE__ */ jsxs2("div", { className: "flex items-center gap-4", children: [
|
|
1060
|
-
modelSelector && /* @__PURE__ */ jsx2("div", {
|
|
1057
|
+
modelSelector && /* @__PURE__ */ jsx2("div", { children: modelSelector }),
|
|
1061
1058
|
/* @__PURE__ */ jsx2(
|
|
1062
1059
|
"button",
|
|
1063
1060
|
{
|
|
1064
1061
|
type: "button",
|
|
1065
|
-
className: "
|
|
1062
|
+
className: "text-[11px] uppercase tracking-[0.2em] text-current opacity-50 hover:opacity-100 transition-opacity font-light",
|
|
1066
1063
|
onClick: () => fileInputRef.current?.click(),
|
|
1067
1064
|
title: "Attach image or PDF (Ctrl+V to paste)",
|
|
1068
|
-
children:
|
|
1065
|
+
children: "[ FILE ]"
|
|
1069
1066
|
}
|
|
1070
1067
|
),
|
|
1071
1068
|
actions
|
|
1072
1069
|
] }),
|
|
1073
|
-
/* @__PURE__ */ jsx2("div", { className: "flex items-center gap-4", children: isGenerating ? /* @__PURE__ */
|
|
1070
|
+
/* @__PURE__ */ jsx2("div", { className: "flex items-center gap-4", children: isGenerating ? /* @__PURE__ */ jsx2(
|
|
1074
1071
|
"button",
|
|
1075
1072
|
{
|
|
1076
1073
|
type: "button",
|
|
1077
|
-
className: "
|
|
1074
|
+
className: "text-red-500 hover:opacity-70 font-light text-[11px] uppercase tracking-[0.2em] transition-opacity cursor-pointer",
|
|
1078
1075
|
onClick: onStop,
|
|
1079
|
-
children: [
|
|
1080
|
-
/* @__PURE__ */ jsx2(Square, { className: "w-2.5 h-2.5 fill-current" }),
|
|
1081
|
-
" [ STOP ]"
|
|
1082
|
-
]
|
|
1076
|
+
children: "[ STOP ]"
|
|
1083
1077
|
}
|
|
1084
1078
|
) : /* @__PURE__ */ jsx2(
|
|
1085
1079
|
"button",
|
|
1086
1080
|
{
|
|
1087
1081
|
type: "button",
|
|
1088
|
-
className: `
|
|
1082
|
+
className: `text-[11px] font-light uppercase tracking-[0.2em] transition-opacity ${canSend ? "text-current opacity-100 hover:opacity-70 cursor-pointer" : "text-current opacity-20 cursor-not-allowed"}`,
|
|
1089
1083
|
onClick: onSend,
|
|
1090
1084
|
disabled: !canSend,
|
|
1091
1085
|
children: "[ SEND ]"
|
|
@@ -1098,7 +1092,7 @@ ${newText}` : newText);
|
|
|
1098
1092
|
}
|
|
1099
1093
|
|
|
1100
1094
|
// src/react/components.tsx
|
|
1101
|
-
import {
|
|
1095
|
+
import { AlertCircle } from "lucide-react";
|
|
1102
1096
|
import { clsx } from "clsx";
|
|
1103
1097
|
import { twMerge } from "tailwind-merge";
|
|
1104
1098
|
import { Streamdown, parseMarkdownIntoBlocks } from "streamdown";
|
|
@@ -1163,20 +1157,20 @@ function isVisionModel2(modelId) {
|
|
|
1163
1157
|
return lower.includes("vl") || lower.includes("vision") || lower.includes("moondream");
|
|
1164
1158
|
}
|
|
1165
1159
|
var markdownComponents = {
|
|
1166
|
-
h1: ({ children }) => /* @__PURE__ */ jsx3("h1", { className: "text-
|
|
1167
|
-
h2: ({ children }) => /* @__PURE__ */ jsx3("h2", { className: "text-
|
|
1168
|
-
h3: ({ children }) => /* @__PURE__ */ jsx3("h3", { className: "text-
|
|
1169
|
-
h4: ({ children }) => /* @__PURE__ */ jsx3("h4", { className: "text-
|
|
1170
|
-
p: ({ children }) => /* @__PURE__ */ jsx3("p", { className: "leading-relaxed [&:not(:first-child)]:mt-
|
|
1171
|
-
ul: ({ children }) => /* @__PURE__ */ jsx3("ul", { className: "my-
|
|
1172
|
-
ol: ({ children }) => /* @__PURE__ */ jsx3("ol", { className: "my-
|
|
1160
|
+
h1: ({ children }) => /* @__PURE__ */ jsx3("h1", { className: "text-2xl font-light uppercase tracking-tight mt-6 mb-4 text-white border-b border-white/30 pb-2", children }),
|
|
1161
|
+
h2: ({ children }) => /* @__PURE__ */ jsx3("h2", { className: "text-xl font-light uppercase tracking-tight mt-6 mb-4 text-white border-b border-white/30 pb-2", children }),
|
|
1162
|
+
h3: ({ children }) => /* @__PURE__ */ jsx3("h3", { className: "text-lg font-light uppercase tracking-tight mt-4 mb-3 text-white", children }),
|
|
1163
|
+
h4: ({ children }) => /* @__PURE__ */ jsx3("h4", { className: "text-base font-light uppercase tracking-tight mt-4 mb-2 text-white", children }),
|
|
1164
|
+
p: ({ children }) => /* @__PURE__ */ jsx3("p", { className: "leading-relaxed [&:not(:first-child)]:mt-4 text-white/80 text-sm font-light font-mono", children }),
|
|
1165
|
+
ul: ({ children }) => /* @__PURE__ */ jsx3("ul", { className: "my-4 ml-6 list-square [&>li]:mt-2 text-white/80 font-mono text-sm font-light", children }),
|
|
1166
|
+
ol: ({ children }) => /* @__PURE__ */ jsx3("ol", { className: "my-4 ml-6 list-decimal [&>li]:mt-2 text-white/80 font-mono text-sm font-light", children }),
|
|
1173
1167
|
li: ({ children }) => /* @__PURE__ */ jsx3("li", { children }),
|
|
1174
|
-
blockquote: ({ children }) => /* @__PURE__ */ jsx3("blockquote", { className: "mt-
|
|
1175
|
-
a: ({ href, children }) => /* @__PURE__ */ jsx3("a", { href, className: "underline
|
|
1176
|
-
table: ({ children }) => /* @__PURE__ */ jsx3("div", { className: "my-
|
|
1177
|
-
tr: ({ children }) => /* @__PURE__ */ jsx3("tr", { className: "m-0 border-b border-
|
|
1178
|
-
th: ({ children }) => /* @__PURE__ */ jsx3("th", { className: "
|
|
1179
|
-
td: ({ children }) => /* @__PURE__ */ jsx3("td", { className: "px-4 py-
|
|
1168
|
+
blockquote: ({ children }) => /* @__PURE__ */ jsx3("blockquote", { className: "mt-4 border border-white/30 p-4 italic text-white/60 font-mono text-sm font-light bg-transparent", children }),
|
|
1169
|
+
a: ({ href, children }) => /* @__PURE__ */ jsx3("a", { href, className: "underline text-white hover:bg-white hover:text-black transition-colors", target: "_blank", rel: "noopener noreferrer", children }),
|
|
1170
|
+
table: ({ children }) => /* @__PURE__ */ jsx3("div", { className: "my-4 w-full overflow-y-auto border border-white/30", children: /* @__PURE__ */ jsx3("table", { className: "w-full text-sm font-mono font-light text-white", children }) }),
|
|
1171
|
+
tr: ({ children }) => /* @__PURE__ */ jsx3("tr", { className: "m-0 border-b border-white/30 p-0 hover:bg-white/5", children }),
|
|
1172
|
+
th: ({ children }) => /* @__PURE__ */ jsx3("th", { className: "border-r border-white/30 last:border-r-0 text-white/50 px-4 py-2 font-light uppercase text-left", children }),
|
|
1173
|
+
td: ({ children }) => /* @__PURE__ */ jsx3("td", { className: "border-r border-white/30 last:border-r-0 px-4 py-2 text-left text-white/80", children })
|
|
1180
1174
|
};
|
|
1181
1175
|
function ModelSelector({
|
|
1182
1176
|
currentModel,
|
|
@@ -1203,26 +1197,27 @@ function ModelSelector({
|
|
|
1203
1197
|
return label;
|
|
1204
1198
|
}, [currentModel]);
|
|
1205
1199
|
return /* @__PURE__ */ jsxs3("div", { className: "relative font-mono", ref, children: [
|
|
1206
|
-
/* @__PURE__ */
|
|
1200
|
+
/* @__PURE__ */ jsx3(
|
|
1207
1201
|
"button",
|
|
1208
1202
|
{
|
|
1209
1203
|
type: "button",
|
|
1210
|
-
className: "flex items-center gap-2 px-0 py-1.5 bg-transparent text-
|
|
1204
|
+
className: "flex items-center gap-2 px-0 py-1.5 bg-transparent text-current hover:opacity-70 text-[11px] font-light uppercase tracking-widest transition-opacity",
|
|
1211
1205
|
onClick: () => setIsOpen(!isOpen),
|
|
1212
|
-
children: [
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1206
|
+
children: /* @__PURE__ */ jsxs3("span", { children: [
|
|
1207
|
+
"[ ",
|
|
1208
|
+
displayModel,
|
|
1209
|
+
" ]"
|
|
1210
|
+
] })
|
|
1216
1211
|
}
|
|
1217
1212
|
),
|
|
1218
|
-
isOpen && /* @__PURE__ */ jsxs3("div", { className: "absolute top-[calc(100%+8px)] left-0 w-72 max-h-[300px] overflow-y-auto bg-
|
|
1219
|
-
/* @__PURE__ */ jsx3("div", { className: "px-3 py-2 text-[
|
|
1213
|
+
isOpen && /* @__PURE__ */ jsxs3("div", { className: "absolute top-[calc(100%+8px)] left-0 w-72 max-h-[300px] overflow-y-auto bg-black dark:bg-white border border-white/20 dark:border-black/20 z-50 p-2 scrollbar-none", children: [
|
|
1214
|
+
/* @__PURE__ */ jsx3("div", { className: "px-3 py-2 text-[10px] font-light text-current opacity-50 uppercase tracking-widest border-b border-white/10 dark:border-black/10 mb-1", children: "WebLLM" }),
|
|
1220
1215
|
Object.entries(WEBLLM_MODELS).map(([key, value]) => /* @__PURE__ */ jsxs3(
|
|
1221
1216
|
"button",
|
|
1222
1217
|
{
|
|
1223
1218
|
className: cn(
|
|
1224
|
-
"block w-full text-left px-3 py-2 text-[11px] uppercase tracking-widest truncate transition-colors",
|
|
1225
|
-
currentModel === value ? "bg-black
|
|
1219
|
+
"block w-full text-left px-3 py-2.5 text-[11px] font-light uppercase tracking-widest truncate transition-colors text-current",
|
|
1220
|
+
currentModel === value ? "bg-white text-black dark:bg-black dark:text-white" : "hover:bg-white/10 dark:hover:bg-black/10"
|
|
1226
1221
|
),
|
|
1227
1222
|
onClick: () => {
|
|
1228
1223
|
onSelect(value);
|
|
@@ -1231,18 +1226,18 @@ function ModelSelector({
|
|
|
1231
1226
|
children: [
|
|
1232
1227
|
key,
|
|
1233
1228
|
" ",
|
|
1234
|
-
isVisionModel2(value) && /* @__PURE__ */ jsx3("span", { className: "ml-2 text-[
|
|
1229
|
+
isVisionModel2(value) && /* @__PURE__ */ jsx3("span", { className: "ml-2 text-[9px] opacity-50", children: "[VISION]" })
|
|
1235
1230
|
]
|
|
1236
1231
|
},
|
|
1237
1232
|
key
|
|
1238
1233
|
)),
|
|
1239
|
-
/* @__PURE__ */ jsx3("div", { className: "px-3 py-2 text-[
|
|
1234
|
+
/* @__PURE__ */ jsx3("div", { className: "px-3 py-2 text-[10px] font-light opacity-50 uppercase tracking-widest mt-4 border-b border-white/10 dark:border-black/10 mb-1", children: "Transformers.js" }),
|
|
1240
1235
|
Object.entries(TRANSFORMERS_MODELS).map(([key, value]) => /* @__PURE__ */ jsxs3(
|
|
1241
1236
|
"button",
|
|
1242
1237
|
{
|
|
1243
1238
|
className: cn(
|
|
1244
|
-
"block w-full text-left px-3 py-2 text-[11px] uppercase tracking-widest truncate transition-colors",
|
|
1245
|
-
currentModel === value ? "bg-black
|
|
1239
|
+
"block w-full text-left px-3 py-2.5 text-[11px] font-light uppercase tracking-widest truncate transition-colors text-current",
|
|
1240
|
+
currentModel === value ? "bg-white text-black dark:bg-black dark:text-white" : "hover:bg-white/10 dark:hover:bg-black/10"
|
|
1246
1241
|
),
|
|
1247
1242
|
onClick: () => {
|
|
1248
1243
|
onSelect(value);
|
|
@@ -1251,7 +1246,7 @@ function ModelSelector({
|
|
|
1251
1246
|
children: [
|
|
1252
1247
|
key,
|
|
1253
1248
|
" ",
|
|
1254
|
-
isVisionModel2(value) && /* @__PURE__ */ jsx3("span", { className: "ml-2 text-[
|
|
1249
|
+
isVisionModel2(value) && /* @__PURE__ */ jsx3("span", { className: "ml-2 text-[9px] opacity-50", children: "[VISION]" })
|
|
1255
1250
|
]
|
|
1256
1251
|
},
|
|
1257
1252
|
key
|
|
@@ -1394,80 +1389,75 @@ ${systemPrompt}` : systemPrompt;
|
|
|
1394
1389
|
setStreamingText("");
|
|
1395
1390
|
}
|
|
1396
1391
|
};
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
|
|
1400
|
-
|
|
1392
|
+
const [localTheme, setLocalTheme] = useState3(theme || "dark");
|
|
1393
|
+
useEffect3(() => {
|
|
1394
|
+
if (theme) setLocalTheme(theme);
|
|
1395
|
+
}, [theme]);
|
|
1396
|
+
const toggleTheme = () => {
|
|
1397
|
+
setLocalTheme((prev) => prev === "dark" ? "light" : "dark");
|
|
1398
|
+
};
|
|
1399
|
+
return /* @__PURE__ */ jsxs3("div", { className: cn(
|
|
1400
|
+
"flex flex-col font-mono rounded-none overflow-hidden transition-colors duration-300",
|
|
1401
|
+
localTheme === "dark" ? "bg-black text-[#fafafa] dark" : "bg-[#fafafa] text-black",
|
|
1402
|
+
className
|
|
1403
|
+
), style: { maxHeight, height: "100%" }, children: [
|
|
1404
|
+
showHeader && /* @__PURE__ */ jsxs3("div", { className: "flex items-center justify-between px-6 py-6 bg-transparent border-b border-current/10", children: [
|
|
1405
|
+
/* @__PURE__ */ jsxs3("div", { className: "flex items-center gap-6", children: [
|
|
1406
|
+
/* @__PURE__ */ jsx3("span", { className: "text-[11px] font-light tracking-[0.2em] uppercase opacity-70", children: error ? "ERR" : isReady ? "RDY" : isLoading ? "LOD" : "IDL" }),
|
|
1407
|
+
onModelChange ? /* @__PURE__ */ jsx3(
|
|
1408
|
+
ModelSelector,
|
|
1409
|
+
{
|
|
1410
|
+
currentModel: modelId,
|
|
1411
|
+
onSelect: onModelChange
|
|
1412
|
+
}
|
|
1413
|
+
) : /* @__PURE__ */ jsx3("div", { className: "flex items-center gap-2", children: /* @__PURE__ */ jsxs3("span", { className: "text-[11px] font-light uppercase tracking-[0.2em]", children: [
|
|
1414
|
+
"[ ",
|
|
1415
|
+
modelId?.split("/").pop(),
|
|
1416
|
+
" ]"
|
|
1417
|
+
] }) })
|
|
1418
|
+
] }),
|
|
1419
|
+
/* @__PURE__ */ jsx3("div", { className: "flex items-center gap-6", children: /* @__PURE__ */ jsxs3(
|
|
1420
|
+
"button",
|
|
1401
1421
|
{
|
|
1402
|
-
|
|
1403
|
-
|
|
1422
|
+
onClick: toggleTheme,
|
|
1423
|
+
className: "text-[11px] tracking-[0.2em] uppercase font-light opacity-50 hover:opacity-100 transition-opacity",
|
|
1424
|
+
children: [
|
|
1425
|
+
"[ ",
|
|
1426
|
+
localTheme === "dark" ? "LIGHT" : "DARK",
|
|
1427
|
+
" ]"
|
|
1428
|
+
]
|
|
1404
1429
|
}
|
|
1405
|
-
)
|
|
1406
|
-
/* @__PURE__ */ jsx3("span", { className: "text-[10px] font-medium uppercase tracking-[0.2em] text-black dark:text-white", children: modelId?.split("/").pop() }),
|
|
1407
|
-
modelId && isVisionModel2(modelId) && /* @__PURE__ */ jsx3("span", { className: "text-[9px] font-medium uppercase tracking-[0.2em] text-black/40 dark:text-white/40", children: "VISION" })
|
|
1408
|
-
] }),
|
|
1409
|
-
/* @__PURE__ */ jsxs3("div", { className: "flex items-center gap-2 opacity-50", children: [
|
|
1410
|
-
/* @__PURE__ */ jsx3("span", { className: "text-[10px] font-medium tracking-[0.2em] uppercase", children: error ? "ERR" : isReady ? "RDY" : isLoading ? "LOD" : "IDL" }),
|
|
1411
|
-
/* @__PURE__ */ jsx3("div", { className: cn(
|
|
1412
|
-
"w-1.5 h-1.5",
|
|
1413
|
-
error ? "bg-red-500" : isReady ? "bg-black dark:bg-white" : "bg-black/20 dark:bg-white/20 animate-pulse"
|
|
1414
|
-
) })
|
|
1415
|
-
] })
|
|
1430
|
+
) })
|
|
1416
1431
|
] }),
|
|
1417
|
-
showProgress && isLoading && loadProgress && /* @__PURE__ */ jsxs3("div", { className: "px-6 py-4 border-b border-
|
|
1418
|
-
/* @__PURE__ */ jsxs3("div", { className: "flex justify-between items-center mb-2 font-mono uppercase tracking-[0.2em] text-[10px]
|
|
1419
|
-
/* @__PURE__ */ jsx3("span", { className: "truncate pr-4", children: loadProgress.status }),
|
|
1420
|
-
/* @__PURE__ */ jsxs3("span", { children: [
|
|
1432
|
+
showProgress && isLoading && loadProgress && /* @__PURE__ */ jsxs3("div", { className: "px-6 py-4 border-b border-current/10 bg-transparent", children: [
|
|
1433
|
+
/* @__PURE__ */ jsxs3("div", { className: "flex justify-between items-center mb-2 font-mono uppercase tracking-[0.2em] text-[10px]", children: [
|
|
1434
|
+
/* @__PURE__ */ jsx3("span", { className: "opacity-50 font-light truncate pr-4", children: loadProgress.status }),
|
|
1435
|
+
/* @__PURE__ */ jsxs3("span", { className: "font-light opacity-50", children: [
|
|
1421
1436
|
Math.round(loadProgress.progress),
|
|
1422
1437
|
"%"
|
|
1423
1438
|
] })
|
|
1424
1439
|
] }),
|
|
1425
|
-
/* @__PURE__ */ jsx3("div", { className: "h-[1px] w-full bg-
|
|
1440
|
+
/* @__PURE__ */ jsx3("div", { className: "h-[1px] w-full bg-current/10 rounded-none overflow-hidden relative", children: /* @__PURE__ */ jsx3(
|
|
1426
1441
|
"div",
|
|
1427
1442
|
{
|
|
1428
|
-
className: "h-full bg-
|
|
1443
|
+
className: "h-full bg-current transition-all duration-300 ease-out",
|
|
1429
1444
|
style: { width: `${Math.min(100, loadProgress.progress)}%` }
|
|
1430
1445
|
}
|
|
1431
1446
|
) })
|
|
1432
1447
|
] }),
|
|
1433
|
-
error && /* @__PURE__ */ jsxs3("div", { className: "
|
|
1434
|
-
/* @__PURE__ */ jsx3("span", { className: "
|
|
1435
|
-
/* @__PURE__ */ jsx3(
|
|
1436
|
-
"button",
|
|
1437
|
-
{
|
|
1438
|
-
className: "text-[10px] font-medium uppercase tracking-[0.2em] text-red-600 dark:text-red-400 hover:opacity-70 transition-opacity",
|
|
1439
|
-
onClick: reload,
|
|
1440
|
-
children: "[ REBOOT ]"
|
|
1441
|
-
}
|
|
1442
|
-
)
|
|
1448
|
+
error && /* @__PURE__ */ jsxs3("div", { className: "mx-6 mt-6 p-4 border border-red-500/30 text-red-500 bg-transparent flex justify-between items-center text-[10px] tracking-[0.2em] uppercase", children: [
|
|
1449
|
+
/* @__PURE__ */ jsx3("span", { className: "font-light", children: error.message }),
|
|
1450
|
+
/* @__PURE__ */ jsx3("button", { onClick: reload, className: "hover:opacity-70 transition-opacity", children: "[ REBOOT ]" })
|
|
1443
1451
|
] }),
|
|
1444
|
-
/* @__PURE__ */ jsxs3("div", { className: "flex-1 overflow-y-auto
|
|
1445
|
-
!isLoading && messages.length === 0 && !error && /* @__PURE__ */ jsxs3("div", { className: "flex-1 flex flex-col items-center justify-center text-center
|
|
1446
|
-
/* @__PURE__ */ jsx3("h3", { className: "text-sm font-
|
|
1447
|
-
/* @__PURE__ */ jsx3("p", { className: "
|
|
1452
|
+
/* @__PURE__ */ jsxs3("div", { className: "flex-1 overflow-y-auto p-6 flex flex-col gap-12 scrollbar-none", children: [
|
|
1453
|
+
!isLoading && messages.length === 0 && !error && /* @__PURE__ */ jsxs3("div", { className: "flex-1 flex flex-col items-center justify-center text-center p-8", children: [
|
|
1454
|
+
/* @__PURE__ */ jsx3("h3", { className: "text-sm font-light uppercase tracking-[0.3em] opacity-50 mb-4", children: "SYSTEM READY" }),
|
|
1455
|
+
/* @__PURE__ */ jsx3("p", { className: "opacity-30 max-w-sm uppercase text-[10px] leading-relaxed tracking-[0.2em] font-light", children: "MARKDOWN INTERPRETER ACTIVE. AWAITING INPUT." })
|
|
1448
1456
|
] }),
|
|
1449
|
-
messages.map((msg, i) => /* @__PURE__ */
|
|
1450
|
-
/* @__PURE__ */
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
" ]"
|
|
1454
|
-
] }),
|
|
1455
|
-
msg.role === "user" ? /* @__PURE__ */ jsxs3("div", { className: "text-black dark:text-white", children: [
|
|
1456
|
-
msg.images && msg.images.length > 0 && /* @__PURE__ */ jsx3("div", { className: "flex flex-wrap gap-2 mb-4", children: msg.images.map((img) => /* @__PURE__ */ jsx3("img", { src: img.dataUrl, className: "w-20 h-20 object-cover grayscale opacity-80", alt: "attachment" }, img.id)) }),
|
|
1457
|
-
/* @__PURE__ */ jsx3("div", { className: "prose prose-sm dark:prose-invert max-w-none font-mono font-light text-[13px] tracking-wide prose-pre:!bg-black/5 dark:prose-pre:!bg-white/5 prose-pre:!p-4 prose-pre:!rounded-none prose-pre:!border-none prose-img:!rounded-none prose-img:grayscale", children: /* @__PURE__ */ jsx3(
|
|
1458
|
-
Streamdown,
|
|
1459
|
-
{
|
|
1460
|
-
plugins: { code, mermaid, math },
|
|
1461
|
-
components: markdownComponents,
|
|
1462
|
-
animated: true,
|
|
1463
|
-
isAnimating: false,
|
|
1464
|
-
mermaid: mermaidOptions,
|
|
1465
|
-
controls: streamdownControls,
|
|
1466
|
-
parseMarkdownIntoBlocksFn: sanitizeMarkdownLanguageBlocks,
|
|
1467
|
-
children: msg.content
|
|
1468
|
-
}
|
|
1469
|
-
) })
|
|
1470
|
-
] }) : /* @__PURE__ */ jsx3("div", { className: "prose prose-sm dark:prose-invert max-w-none font-mono font-light text-[13px] tracking-wide prose-pre:!bg-black/5 dark:prose-pre:!bg-white/5 prose-pre:!p-4 prose-pre:!rounded-none prose-pre:!border-none prose-pre:!m-0 prose-img:!rounded-none prose-img:grayscale", children: /* @__PURE__ */ jsx3(
|
|
1457
|
+
messages.map((msg, i) => /* @__PURE__ */ jsx3("div", { className: "flex flex-col w-full", children: msg.role === "user" ? /* @__PURE__ */ jsxs3("div", { className: "bg-transparent text-current py-2 w-full", children: [
|
|
1458
|
+
/* @__PURE__ */ jsx3("div", { className: "mb-4 text-[10px] tracking-[0.2em] uppercase opacity-30", children: "USER" }),
|
|
1459
|
+
msg.images && msg.images.length > 0 && /* @__PURE__ */ jsx3("div", { className: "flex flex-wrap gap-3 mb-4", children: msg.images.map((img) => /* @__PURE__ */ jsx3("img", { src: img.dataUrl, className: "w-24 h-24 object-cover border border-current/20 grayscale", alt: "attachment" }, img.id)) }),
|
|
1460
|
+
/* @__PURE__ */ jsx3("div", { className: "prose prose-base dark:prose-invert max-w-none font-mono !text-current", children: /* @__PURE__ */ jsx3(
|
|
1471
1461
|
Streamdown,
|
|
1472
1462
|
{
|
|
1473
1463
|
plugins: { code, mermaid, math },
|
|
@@ -1480,10 +1470,25 @@ ${systemPrompt}` : systemPrompt;
|
|
|
1480
1470
|
children: msg.content
|
|
1481
1471
|
}
|
|
1482
1472
|
) })
|
|
1483
|
-
] },
|
|
1484
|
-
|
|
1485
|
-
/* @__PURE__ */ jsx3(
|
|
1486
|
-
|
|
1473
|
+
] }) : /* @__PURE__ */ jsxs3("div", { className: "prose prose-base dark:prose-invert max-w-none py-2 w-full min-w-0 font-mono bg-transparent mt-2 !text-current", children: [
|
|
1474
|
+
/* @__PURE__ */ jsx3("div", { className: "mb-4 text-[10px] tracking-[0.2em] uppercase opacity-30 text-current", children: "SYSTEM" }),
|
|
1475
|
+
/* @__PURE__ */ jsx3(
|
|
1476
|
+
Streamdown,
|
|
1477
|
+
{
|
|
1478
|
+
plugins: { code, mermaid, math },
|
|
1479
|
+
components: markdownComponents,
|
|
1480
|
+
animated: true,
|
|
1481
|
+
isAnimating: false,
|
|
1482
|
+
mermaid: mermaidOptions,
|
|
1483
|
+
controls: streamdownControls,
|
|
1484
|
+
parseMarkdownIntoBlocksFn: sanitizeMarkdownLanguageBlocks,
|
|
1485
|
+
children: msg.content
|
|
1486
|
+
}
|
|
1487
|
+
)
|
|
1488
|
+
] }) }, i)),
|
|
1489
|
+
streamingText && /* @__PURE__ */ jsx3("div", { className: "flex flex-col w-full mt-2", children: /* @__PURE__ */ jsxs3("div", { className: "prose prose-base dark:prose-invert max-w-none py-2 w-full min-w-0 font-mono bg-transparent !text-current", children: [
|
|
1490
|
+
/* @__PURE__ */ jsx3("div", { className: "mb-4 text-[10px] tracking-[0.2em] uppercase opacity-30 text-current animate-pulse", children: "SYSTEM GENERATING" }),
|
|
1491
|
+
/* @__PURE__ */ jsx3(
|
|
1487
1492
|
Streamdown,
|
|
1488
1493
|
{
|
|
1489
1494
|
plugins: { code, mermaid, math },
|
|
@@ -1496,11 +1501,11 @@ ${systemPrompt}` : systemPrompt;
|
|
|
1496
1501
|
caret: "block",
|
|
1497
1502
|
children: streamingText
|
|
1498
1503
|
}
|
|
1499
|
-
)
|
|
1500
|
-
] }),
|
|
1504
|
+
)
|
|
1505
|
+
] }) }),
|
|
1501
1506
|
/* @__PURE__ */ jsx3("div", { ref: messagesEndRef, className: "h-4" })
|
|
1502
1507
|
] }),
|
|
1503
|
-
/* @__PURE__ */ jsx3("div", { className: "p-
|
|
1508
|
+
/* @__PURE__ */ jsx3("div", { className: "p-6 bg-transparent", children: /* @__PURE__ */ jsx3(
|
|
1504
1509
|
ChatInput,
|
|
1505
1510
|
{
|
|
1506
1511
|
value: input,
|
|
@@ -1509,7 +1514,7 @@ ${systemPrompt}` : systemPrompt;
|
|
|
1509
1514
|
onStop: handleStop,
|
|
1510
1515
|
disabled: !isReady && !isLoading,
|
|
1511
1516
|
isGenerating,
|
|
1512
|
-
placeholder: isLoading ? "
|
|
1517
|
+
placeholder: isLoading ? "MODEL IS LOADING..." : "MESSAGE...",
|
|
1513
1518
|
actions: inputActions,
|
|
1514
1519
|
images,
|
|
1515
1520
|
onImageAdd: (img) => setImages((prev) => [...prev, img]),
|