@lastbrain/ai-ui-react 1.0.10 → 1.0.12
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/components/AiImageButton.d.ts.map +1 -1
- package/dist/components/AiImageButton.js +5 -2
- package/dist/components/AiInput.d.ts.map +1 -1
- package/dist/components/AiInput.js +20 -7
- package/dist/components/AiPromptPanel.d.ts +14 -1
- package/dist/components/AiPromptPanel.d.ts.map +1 -1
- package/dist/components/AiPromptPanel.js +516 -64
- package/dist/components/AiSelect.d.ts.map +1 -1
- package/dist/components/AiSelect.js +4 -1
- package/dist/components/AiSettingsButton.d.ts.map +1 -1
- package/dist/components/AiSettingsButton.js +1 -1
- package/dist/components/AiStatusButton.d.ts.map +1 -1
- package/dist/components/AiStatusButton.js +225 -38
- package/dist/components/AiTextarea.d.ts.map +1 -1
- package/dist/components/AiTextarea.js +35 -8
- package/dist/components/UsageToast.d.ts +14 -0
- package/dist/components/UsageToast.d.ts.map +1 -0
- package/dist/components/UsageToast.js +144 -0
- package/dist/examples/AiImageGenerator.d.ts +34 -0
- package/dist/examples/AiImageGenerator.d.ts.map +1 -0
- package/dist/examples/AiImageGenerator.js +85 -0
- package/dist/examples/AiPromptPanelAdvanced.d.ts +20 -0
- package/dist/examples/AiPromptPanelAdvanced.d.ts.map +1 -0
- package/dist/examples/AiPromptPanelAdvanced.js +222 -0
- package/dist/examples/ExternalIntegration.d.ts +2 -0
- package/dist/examples/ExternalIntegration.d.ts.map +1 -0
- package/dist/examples/ExternalIntegration.js +2 -0
- package/dist/hooks/useAiStatus.d.ts.map +1 -1
- package/dist/hooks/useAiStatus.js +3 -0
- package/dist/hooks/useModelManagement.d.ts +32 -0
- package/dist/hooks/useModelManagement.d.ts.map +1 -0
- package/dist/hooks/useModelManagement.js +135 -0
- package/dist/hooks/usePrompts.d.ts +1 -0
- package/dist/hooks/usePrompts.d.ts.map +1 -1
- package/dist/hooks/usePrompts.js +0 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/styles/inline.d.ts.map +1 -1
- package/dist/styles/inline.js +129 -63
- package/dist/utils/modelManagement.d.ts +29 -0
- package/dist/utils/modelManagement.d.ts.map +1 -0
- package/dist/utils/modelManagement.js +80 -0
- package/package.json +3 -2
- package/src/components/AiImageButton.tsx +13 -2
- package/src/components/AiInput.tsx +35 -27
- package/src/components/AiPromptPanel.tsx +1000 -143
- package/src/components/AiSelect.tsx +11 -0
- package/src/components/AiSettingsButton.tsx +4 -2
- package/src/components/AiStatusButton.tsx +424 -163
- package/src/components/AiTextarea.tsx +55 -28
- package/src/components/UsageToast.tsx +182 -0
- package/src/examples/AiImageGenerator.tsx +214 -0
- package/src/examples/AiPromptPanelAdvanced.tsx +381 -0
- package/src/examples/ExternalIntegration.ts +55 -0
- package/src/hooks/useAiStatus.ts +4 -0
- package/src/hooks/useModelManagement.ts +210 -0
- package/src/hooks/usePrompts.ts +1 -1
- package/src/index.ts +8 -0
- package/src/styles/inline.ts +139 -64
- package/src/utils/modelManagement.ts +130 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AiImageButton.d.ts","sourceRoot":"","sources":["../../src/components/AiImageButton.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAY,KAAK,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"AiImageButton.d.ts","sourceRoot":"","sources":["../../src/components/AiImageButton.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAY,KAAK,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAM5C,MAAM,WAAW,kBACf,SACE,IAAI,CAAC,WAAW,EAAE,SAAS,GAAG,MAAM,CAAC,EACrC,oBAAoB,CAAC,iBAAiB,CAAC;IACzC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,MAAM,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;CAC7B;AAED,wBAAgB,aAAa,CAAC,EAC5B,OAAO,EACP,QAAQ,EACR,MAAgB,EAChB,OAAO,EACP,KAAK,EACL,MAAM,EACN,OAAO,EACP,OAAO,EACP,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,GAAG,WAAW,EACf,EAAE,kBAAkB,2CAmEpB"}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { jsx as _jsx,
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { useState } from "react";
|
|
4
4
|
import { useAiCallImage } from "../hooks/useAiCallImage";
|
|
5
5
|
import { useAiModels } from "../hooks/useAiModels";
|
|
6
6
|
import { AiPromptPanel } from "./AiPromptPanel";
|
|
7
|
+
import { UsageToast, useUsageToast } from "./UsageToast";
|
|
7
8
|
export function AiImageButton({ baseUrl, apiKeyId, uiMode = "modal", context, model, prompt, onImage, onToast, disabled, className, children, ...buttonProps }) {
|
|
8
9
|
const [isOpen, setIsOpen] = useState(false);
|
|
10
|
+
const { showUsageToast, toastData, toastKey, clearToast } = useUsageToast();
|
|
9
11
|
const { models } = useAiModels({ baseUrl, apiKeyId });
|
|
10
12
|
const { generateImage, loading } = useAiCallImage({ baseUrl, apiKeyId });
|
|
11
13
|
const handleOpenPanel = () => {
|
|
@@ -23,6 +25,7 @@ export function AiImageButton({ baseUrl, apiKeyId, uiMode = "modal", context, mo
|
|
|
23
25
|
if (result.url) {
|
|
24
26
|
onImage?.(result.url);
|
|
25
27
|
onToast?.({ type: "success", message: "Image generated successfully" });
|
|
28
|
+
showUsageToast(result);
|
|
26
29
|
}
|
|
27
30
|
}
|
|
28
31
|
catch (error) {
|
|
@@ -32,5 +35,5 @@ export function AiImageButton({ baseUrl, apiKeyId, uiMode = "modal", context, mo
|
|
|
32
35
|
setIsOpen(false);
|
|
33
36
|
}
|
|
34
37
|
};
|
|
35
|
-
return (_jsxs(
|
|
38
|
+
return (_jsxs("div", { style: { position: "relative", display: "inline-block" }, children: [_jsx("button", { ...buttonProps, onClick: handleOpenPanel, disabled: disabled || loading, className: className, "data-ai-image-button": true, children: loading ? "Generating..." : children || "Generate Image" }), isOpen && (_jsx(AiPromptPanel, { isOpen: isOpen, onClose: handleClosePanel, onSubmit: handleSubmit, uiMode: uiMode, models: models?.filter((m) => m.type === "image") || [] })), Boolean(toastData) && (_jsx(UsageToast, { result: toastData, position: "bottom-right", onComplete: clearToast }, toastKey))] }));
|
|
36
39
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AiInput.d.ts","sourceRoot":"","sources":["../../src/components/AiInput.tsx"],"names":[],"mappings":"AAEA,OAAc,EAAoB,KAAK,mBAAmB,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"AiInput.d.ts","sourceRoot":"","sources":["../../src/components/AiInput.tsx"],"names":[],"mappings":"AAEA,OAAc,EAAoB,KAAK,mBAAmB,EAAE,MAAM,OAAO,CAAC;AAE1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAO5C,MAAM,WAAW,YACf,SACE,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,EACzB,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,SAAS,CAAC;IACxD,MAAM,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;CAC7B;AAED,wBAAgB,OAAO,CAAC,EACtB,OAAO,EACP,QAAQ,EACR,MAAgB,EAChB,OAAO,EACP,KAAK,EACL,MAAM,EACN,QAAgB,EAChB,OAAO,EACP,OAAO,EACP,QAAQ,EACR,SAAS,EACT,GAAG,UAAU,EACd,EAAE,YAAY,2CAyKd"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { useState, useRef } from "react";
|
|
4
|
+
import { Sparkles } from "lucide-react";
|
|
4
5
|
import { useAiCallText } from "../hooks/useAiCallText";
|
|
5
6
|
import { useAiModels } from "../hooks/useAiModels";
|
|
6
7
|
import { AiPromptPanel } from "./AiPromptPanel";
|
|
8
|
+
import { UsageToast, useUsageToast } from "./UsageToast";
|
|
7
9
|
import { aiStyles } from "../styles/inline";
|
|
8
10
|
export function AiInput({ baseUrl, apiKeyId, uiMode = "modal", context, model, prompt, editMode = false, onValue, onToast, disabled, className, ...inputProps }) {
|
|
9
11
|
const [isOpen, setIsOpen] = useState(false);
|
|
@@ -11,6 +13,7 @@ export function AiInput({ baseUrl, apiKeyId, uiMode = "modal", context, model, p
|
|
|
11
13
|
const [isFocused, setIsFocused] = useState(false);
|
|
12
14
|
const [isButtonHovered, setIsButtonHovered] = useState(false);
|
|
13
15
|
const inputRef = useRef(null);
|
|
16
|
+
const { showUsageToast, toastData, toastKey, clearToast } = useUsageToast();
|
|
14
17
|
const { models } = useAiModels({ baseUrl, apiKeyId });
|
|
15
18
|
const { generateText, loading } = useAiCallText({ baseUrl, apiKeyId });
|
|
16
19
|
const hasConfiguration = Boolean(model && prompt);
|
|
@@ -22,11 +25,16 @@ export function AiInput({ baseUrl, apiKeyId, uiMode = "modal", context, model, p
|
|
|
22
25
|
};
|
|
23
26
|
const handleSubmit = async (selectedModel, selectedPrompt, promptId) => {
|
|
24
27
|
try {
|
|
28
|
+
const resolvedContext = inputValue || context || undefined;
|
|
29
|
+
const hasContext = Boolean(resolvedContext && String(resolvedContext).trim());
|
|
30
|
+
const promptWithContext = hasContext
|
|
31
|
+
? `${selectedPrompt}\n\nTexte:\n${String(resolvedContext)}`
|
|
32
|
+
: selectedPrompt;
|
|
25
33
|
const result = await generateText({
|
|
26
34
|
model: selectedModel,
|
|
27
|
-
prompt:
|
|
28
|
-
context:
|
|
29
|
-
actionType: "autocomplete",
|
|
35
|
+
prompt: promptWithContext,
|
|
36
|
+
context: resolvedContext,
|
|
37
|
+
actionType: hasContext ? "generate-text" : "autocomplete",
|
|
30
38
|
});
|
|
31
39
|
if (result.text) {
|
|
32
40
|
setInputValue(result.text);
|
|
@@ -48,11 +56,16 @@ export function AiInput({ baseUrl, apiKeyId, uiMode = "modal", context, model, p
|
|
|
48
56
|
if (!model || !prompt)
|
|
49
57
|
return;
|
|
50
58
|
try {
|
|
59
|
+
const resolvedContext = inputValue || context || undefined;
|
|
60
|
+
const hasContext = Boolean(resolvedContext && String(resolvedContext).trim());
|
|
61
|
+
const promptWithContext = hasContext
|
|
62
|
+
? `${prompt}\n\nTexte:\n${String(resolvedContext)}`
|
|
63
|
+
: prompt;
|
|
51
64
|
const result = await generateText({
|
|
52
65
|
model,
|
|
53
|
-
prompt,
|
|
54
|
-
context:
|
|
55
|
-
actionType: "autocomplete",
|
|
66
|
+
prompt: promptWithContext,
|
|
67
|
+
context: resolvedContext,
|
|
68
|
+
actionType: hasContext ? "generate-text" : "autocomplete",
|
|
56
69
|
});
|
|
57
70
|
if (result.text) {
|
|
58
71
|
setInputValue(result.text);
|
|
@@ -87,5 +100,5 @@ export function AiInput({ baseUrl, apiKeyId, uiMode = "modal", context, model, p
|
|
|
87
100
|
...(disabled || loading
|
|
88
101
|
? { opacity: 0.5, cursor: "not-allowed" }
|
|
89
102
|
: {}),
|
|
90
|
-
}, onClick: hasConfiguration ? handleQuickGenerate : handleOpenPanel, onMouseEnter: () => setIsButtonHovered(true), onMouseLeave: () => setIsButtonHovered(false), disabled: disabled || loading, type: "button", title: hasConfiguration ? "Generate with AI" : "Setup AI", children: loading ? (_jsx("svg", { style: aiStyles.spinner, width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", children: _jsx("path", { d: "M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83" }) })) :
|
|
103
|
+
}, onClick: hasConfiguration ? handleQuickGenerate : handleOpenPanel, onMouseEnter: () => setIsButtonHovered(true), onMouseLeave: () => setIsButtonHovered(false), disabled: disabled || loading, type: "button", title: hasConfiguration ? "Generate with AI" : "Setup AI", children: loading ? (_jsx("svg", { style: aiStyles.spinner, width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", children: _jsx("path", { d: "M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83" }) })) : (_jsx(Sparkles, { size: 16 })) }), isOpen && (_jsx(AiPromptPanel, { isOpen: isOpen, onClose: handleClosePanel, onSubmit: handleSubmit, uiMode: uiMode, models: models || [], sourceText: inputValue || undefined, apiKey: apiKeyId, baseUrl: baseUrl, enableModelManagement: true })), Boolean(toastData) && (_jsx(UsageToast, { result: toastData, position: "bottom-right", onComplete: clearToast }, toastKey))] }));
|
|
91
104
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type ReactNode } from "react";
|
|
2
2
|
import type { ModelRef } from "@lastbrain/ai-ui-core";
|
|
3
3
|
import type { UiMode } from "../types";
|
|
4
|
+
import { type AIModel } from "../hooks/useModelManagement";
|
|
4
5
|
export interface AiPromptPanelProps {
|
|
5
6
|
isOpen: boolean;
|
|
6
7
|
onClose: () => void;
|
|
@@ -9,6 +10,12 @@ export interface AiPromptPanelProps {
|
|
|
9
10
|
models?: ModelRef[];
|
|
10
11
|
sourceText?: string;
|
|
11
12
|
children?: (props: AiPromptPanelRenderProps) => ReactNode;
|
|
13
|
+
enableModelManagement?: boolean;
|
|
14
|
+
availableModels?: AIModel[];
|
|
15
|
+
userModels?: string[];
|
|
16
|
+
onModelToggle?: (modelId: string, isActive: boolean) => Promise<void>;
|
|
17
|
+
apiKey?: string;
|
|
18
|
+
baseUrl?: string;
|
|
12
19
|
}
|
|
13
20
|
export interface AiPromptPanelRenderProps {
|
|
14
21
|
models?: ModelRef[];
|
|
@@ -19,6 +26,12 @@ export interface AiPromptPanelRenderProps {
|
|
|
19
26
|
sourceText?: string;
|
|
20
27
|
handleSubmit: () => void;
|
|
21
28
|
handleClose: () => void;
|
|
29
|
+
enableModelManagement?: boolean;
|
|
30
|
+
availableModels?: AIModel[];
|
|
31
|
+
userModels?: string[];
|
|
32
|
+
showAllModels?: boolean;
|
|
33
|
+
setShowAllModels?: (show: boolean) => void;
|
|
34
|
+
onModelToggle?: (modelId: string, isActive: boolean) => Promise<void>;
|
|
22
35
|
}
|
|
23
|
-
export declare function AiPromptPanel({ isOpen, onClose, onSubmit, uiMode, models, sourceText, children, }: AiPromptPanelProps): import("react/jsx-runtime").JSX.Element | null;
|
|
36
|
+
export declare function AiPromptPanel({ isOpen, onClose, onSubmit, uiMode: _uiMode, models, sourceText, children, enableModelManagement, availableModels, userModels, onModelToggle, apiKey, baseUrl, }: AiPromptPanelProps): import("react/jsx-runtime").JSX.Element | null;
|
|
24
37
|
//# sourceMappingURL=AiPromptPanel.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AiPromptPanel.d.ts","sourceRoot":"","sources":["../../src/components/AiPromptPanel.tsx"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"AiPromptPanel.d.ts","sourceRoot":"","sources":["../../src/components/AiPromptPanel.tsx"],"names":[],"mappings":"AAEA,OAAO,EAKL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAOvC,OAAO,EAAsB,KAAK,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAE/E,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,wBAAwB,KAAK,SAAS,CAAC;IAE1D,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,eAAe,CAAC,EAAE,OAAO,EAAE,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,IAAI,CAAC;IAExB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,eAAe,CAAC,EAAE,OAAO,EAAE,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvE;AAED,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,OAAO,EACP,QAAQ,EACR,MAAM,EAAE,OAAiB,EACzB,MAAW,EACX,UAAU,EACV,QAAQ,EACR,qBAA6B,EAC7B,eAAoB,EACpB,UAAe,EACf,aAAa,EACb,MAAM,EACN,OAAO,GACR,EAAE,kBAAkB,kDAmpCpB"}
|