@lastbrain/ai-ui-react 1.0.31 → 1.0.33

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.
@@ -1 +1 @@
1
- {"version":3,"file":"AiContextButton.d.ts","sourceRoot":"","sources":["../../src/components/AiContextButton.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAY,KAAK,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAE5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAU5C,MAAM,WAAW,oBACf,SACE,IAAI,CAAC,WAAW,EAAE,SAAS,GAAG,MAAM,CAAC,EACrC,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,SAAS,GAAG,UAAU,CAAC;IAEvE,WAAW,EAAE,GAAG,CAAC;IACjB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,EAAE,CACT,MAAM,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,KAC7C,IAAI,CAAC;IACV,MAAM,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,eAAe,CAAC,EAC9B,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,YAAY,EACtB,MAAgB,EAChB,WAAW,EACX,kBAAyC,EACzC,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,gBAA0C,EAC1C,YAAY,EACZ,aAAa,EACb,OAAO,EAAE,QAAQ,EACjB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,OAAO,EACf,GAAG,WAAW,EACf,EAAE,oBAAoB,2CAyftB"}
1
+ {"version":3,"file":"AiContextButton.d.ts","sourceRoot":"","sources":["../../src/components/AiContextButton.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAY,KAAK,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAE5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAU5C,MAAM,WAAW,oBACf,SACE,IAAI,CAAC,WAAW,EAAE,SAAS,GAAG,MAAM,CAAC,EACrC,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,SAAS,GAAG,UAAU,CAAC;IAEvE,WAAW,EAAE,GAAG,CAAC;IACjB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,EAAE,CACT,MAAM,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,KAC7C,IAAI,CAAC;IACV,MAAM,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,eAAe,CAAC,EAC9B,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,YAAY,EACtB,MAAgB,EAChB,WAAW,EACX,kBAAyC,EACzC,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,gBAA0C,EAC1C,YAAY,EACZ,aAAa,EACb,OAAO,EAAE,QAAQ,EACjB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,OAAO,EACf,GAAG,WAAW,EACf,EAAE,oBAAoB,2CA6ftB"}
@@ -20,7 +20,11 @@ export function AiContextButton({ baseUrl: propBaseUrl, apiKeyId: propApiKeyId,
20
20
  const aiContext = useAiContext();
21
21
  const baseUrl = propBaseUrl ?? aiContext.baseUrl;
22
22
  const apiKeyId = propApiKeyId ?? aiContext.apiKeyId;
23
- const { models, loading: modelsLoading } = useAiModels({ baseUrl, apiKeyId });
23
+ // Utiliser les valeurs résolues pour les hooks
24
+ const { models, loading: modelsLoading } = useAiModels({
25
+ baseUrl,
26
+ apiKeyId,
27
+ });
24
28
  const { generateText: callText, loading } = useAiCallText({
25
29
  baseUrl,
26
30
  apiKeyId,
@@ -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;AAS5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAU5C,MAAM,WAAW,kBACf,SACE,IAAI,CAAC,WAAW,EAAE,SAAS,GAAG,MAAM,CAAC,EACrC,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,SAAS,GAAG,UAAU,CAAC;IACvE,OAAO,CAAC,EAAE,CACR,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,KAC7C,IAAI,CAAC;IACV,MAAM,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC5B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,aAAa,CAAC,EAC5B,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,YAAY,EACtB,MAAgB,EAChB,OAAO,EAAE,QAAQ,EACjB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,OAAO,EACf,OAAO,EACP,OAAO,EACP,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,aAAoB,EACpB,WAAW,EACX,YAAY,EACZ,aAAa,EACb,GAAG,WAAW,EACf,EAAE,kBAAkB,2CAiZpB"}
1
+ {"version":3,"file":"AiImageButton.d.ts","sourceRoot":"","sources":["../../src/components/AiImageButton.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAY,KAAK,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAE5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAU5C,MAAM,WAAW,kBACf,SACE,IAAI,CAAC,WAAW,EAAE,SAAS,GAAG,MAAM,CAAC,EACrC,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,SAAS,GAAG,UAAU,CAAC;IACvE,OAAO,CAAC,EAAE,CACR,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,KAC7C,IAAI,CAAC;IACV,MAAM,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC5B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,aAAa,CAAC,EAC5B,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,YAAY,EACtB,MAAgB,EAChB,OAAO,EAAE,QAAQ,EACjB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,OAAO,EACf,OAAO,EACP,OAAO,EACP,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,aAAoB,EACpB,WAAW,EACX,YAAY,EACZ,aAAa,EACb,GAAG,WAAW,EACf,EAAE,kBAAkB,2CAkXpB"}
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { useState } from "react";
4
- import { ImageIcon, Loader2, Download, Copy, ExternalLink, X, } from "lucide-react";
4
+ import { ImageIcon, Loader2, Download, ExternalLink, X } from "lucide-react";
5
5
  import { useAiCallImage } from "../hooks/useAiCallImage";
6
6
  import { useAiModels } from "../hooks/useAiModels";
7
7
  import { AiPromptPanel } from "./AiPromptPanel";
@@ -36,20 +36,6 @@ export function AiImageButton({ baseUrl: propBaseUrl, apiKeyId: propApiKeyId, ui
36
36
  link.download = `ai-image-${generatedImage.requestId}.png`;
37
37
  link.click();
38
38
  };
39
- const handleCopyUrl = async () => {
40
- if (!generatedImage)
41
- return;
42
- try {
43
- await navigator.clipboard.writeText(generatedImage.url);
44
- onToast?.({
45
- type: "success",
46
- message: "URL copiée dans le presse-papier",
47
- });
48
- }
49
- catch (_error) {
50
- onToast?.({ type: "error", message: "Erreur lors de la copie" });
51
- }
52
- };
53
39
  const handleSave = async () => {
54
40
  if (!generatedImage || !onImageSave)
55
41
  return;
@@ -231,27 +217,21 @@ export function AiImageButton({ baseUrl: propBaseUrl, apiKeyId: propApiKeyId, ui
231
217
  maxHeight: "200px",
232
218
  objectFit: "contain",
233
219
  display: "block",
234
- } }) }), _jsxs("div", { className: "flex items-center gap-2 flex-wrap", children: [_jsxs("button", { onClick: handleDownload, className: "flex items-center gap-1 px-3 py-2 text-xs font-medium rounded-lg transition-colors", style: getThemeStyles().actionButton, onMouseEnter: (e) => {
235
- e.currentTarget.style.backgroundColor =
236
- getThemeStyles().actionButton.hoverBackground;
237
- e.currentTarget.style.color =
238
- getThemeStyles().actionButton.hoverColor;
239
- }, onMouseLeave: (e) => {
240
- e.currentTarget.style.backgroundColor =
241
- getThemeStyles().actionButton.backgroundColor;
242
- e.currentTarget.style.color =
243
- getThemeStyles().actionButton.color;
244
- }, title: "T\u00E9l\u00E9charger l'image", children: [_jsx(Download, { size: 14 }), "T\u00E9l\u00E9charger"] }), _jsxs("button", { onClick: handleCopyUrl, className: "flex items-center gap-1 px-3 py-2 text-xs font-medium rounded-lg transition-colors", style: getThemeStyles().actionButton, onMouseEnter: (e) => {
245
- e.currentTarget.style.backgroundColor =
246
- getThemeStyles().actionButton.hoverBackground;
247
- e.currentTarget.style.color =
248
- getThemeStyles().actionButton.hoverColor;
220
+ } }) }), _jsxs("div", { className: "flex items-center gap-2 flex-wrap", children: [_jsxs("button", { onClick: handleDownload, className: "flex items-center gap-2 px-4 py-2.5 text-sm font-semibold rounded-lg transition-all shadow-sm", style: {
221
+ backgroundColor: "#10b981",
222
+ color: "white",
223
+ border: "none",
224
+ cursor: "pointer",
225
+ }, onMouseEnter: (e) => {
226
+ e.currentTarget.style.backgroundColor = "#059669";
227
+ e.currentTarget.style.transform = "translateY(-1px)";
228
+ e.currentTarget.style.boxShadow =
229
+ "0 4px 12px rgba(16, 185, 129, 0.3)";
249
230
  }, onMouseLeave: (e) => {
250
- e.currentTarget.style.backgroundColor =
251
- getThemeStyles().actionButton.backgroundColor;
252
- e.currentTarget.style.color =
253
- getThemeStyles().actionButton.color;
254
- }, title: "Copier l'URL", children: [_jsx(Copy, { size: 14 }), "Copier URL"] }), onImageSave && (_jsxs("button", { onClick: handleSave, className: "flex items-center gap-1 px-3 py-2 text-xs font-medium text-white bg-blue-600 hover:bg-blue-700 rounded-lg transition-colors", title: "Sauvegarder en base", children: [_jsx(ExternalLink, { size: 14 }), "Sauvegarder"] }))] }), _jsx("div", { className: "mt-3 pt-3 text-xs", style: {
231
+ e.currentTarget.style.backgroundColor = "#10b981";
232
+ e.currentTarget.style.transform = "translateY(0)";
233
+ e.currentTarget.style.boxShadow = "";
234
+ }, title: "T\u00E9l\u00E9charger l'image", children: [_jsx(Download, { size: 16 }), "T\u00E9l\u00E9charger l'image"] }), onImageSave && (_jsxs("button", { onClick: handleSave, className: "flex items-center gap-1 px-3 py-2 text-xs font-medium text-white bg-blue-600 hover:bg-blue-700 rounded-lg transition-colors", title: "Sauvegarder en base", children: [_jsx(ExternalLink, { size: 14 }), "Sauvegarder"] }))] }), _jsx("div", { className: "mt-3 pt-3 text-xs", style: {
255
235
  ...getThemeStyles().metadata,
256
236
  }, children: _jsx("div", { className: "flex justify-center", children: _jsxs("span", { children: ["ID: ", generatedImage.requestId.slice(-8)] }) }) })] })), _jsx(ErrorToast, { error: errorData, onComplete: clearError }, errorKey)] }));
257
237
  }
@@ -4,5 +4,5 @@ export interface AiInputProps extends Omit<BaseAiProps, "type">, Omit<InputHTMLA
4
4
  uiMode?: "modal" | "drawer";
5
5
  enableModelManagement?: boolean;
6
6
  }
7
- export declare function AiInput({ baseUrl, apiKeyId, uiMode, context, model, prompt, editMode, onValue, onToast, disabled, className, enableModelManagement, ...inputProps }: AiInputProps): import("react/jsx-runtime").JSX.Element;
7
+ export declare function AiInput({ baseUrl, apiKeyId, uiMode, context, model, prompt, editMode, enableModelManagement, storeOutputs, artifactTitle, onValue, onToast, disabled, className, ...inputProps }: AiInputProps): import("react/jsx-runtime").JSX.Element;
8
8
  //# sourceMappingURL=AiInput.d.ts.map
@@ -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;AAE1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAQ5C,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;IAC5B,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;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,qBAA6B,EAC7B,GAAG,UAAU,EACd,EAAE,YAAY,2CA2Kd"}
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;AAQ5C,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;IAC5B,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,wBAAgB,OAAO,CAAC,EACtB,OAAO,EACP,QAAQ,EACR,MAAgB,EAChB,OAAO,EACP,KAAK,EACL,MAAM,EACN,QAAgB,EAChB,qBAA6B,EAC7B,YAAY,EACZ,aAAa,EACb,OAAO,EACP,OAAO,EACP,QAAQ,EACR,SAAS,EACT,GAAG,UAAU,EACd,EAAE,YAAY,2CA6Kd"}
@@ -8,7 +8,7 @@ import { AiPromptPanel } from "./AiPromptPanel";
8
8
  import { UsageToast, useUsageToast } from "./UsageToast";
9
9
  import { aiStyles } from "../styles/inline";
10
10
  import { handleAIError } from "../utils/errorHandler";
11
- export function AiInput({ baseUrl, apiKeyId, uiMode = "modal", context, model, prompt, editMode = false, onValue, onToast, disabled, className, enableModelManagement = false, ...inputProps }) {
11
+ export function AiInput({ baseUrl, apiKeyId, uiMode = "modal", context, model, prompt, editMode = false, enableModelManagement = false, storeOutputs, artifactTitle, onValue, onToast, disabled, className, ...inputProps }) {
12
12
  const [isOpen, setIsOpen] = useState(false);
13
13
  const [inputValue, setInputValue] = useState(inputProps.value?.toString() || inputProps.defaultValue?.toString() || "");
14
14
  const [isFocused, setIsFocused] = useState(false);
@@ -36,6 +36,8 @@ export function AiInput({ baseUrl, apiKeyId, uiMode = "modal", context, model, p
36
36
  prompt: promptWithContext,
37
37
  context: resolvedContext,
38
38
  actionType: hasContext ? "generate-text" : "autocomplete",
39
+ storeOutputs,
40
+ artifactTitle,
39
41
  });
40
42
  if (result.text) {
41
43
  setInputValue(result.text);
@@ -4,5 +4,5 @@ export interface AiSelectProps extends Omit<BaseAiProps, "type">, Omit<SelectHTM
4
4
  children: React.ReactNode;
5
5
  uiMode?: "modal" | "drawer";
6
6
  }
7
- export declare function AiSelect({ baseUrl, apiKeyId, uiMode, context, model, prompt, onValue, onToast, disabled, className, children, ...selectProps }: AiSelectProps): import("react/jsx-runtime").JSX.Element;
7
+ export declare function AiSelect({ baseUrl, apiKeyId, uiMode, context, model, prompt, storeOutputs, artifactTitle, onValue, onToast, disabled, className, children, ...selectProps }: AiSelectProps): import("react/jsx-runtime").JSX.Element;
8
8
  //# sourceMappingURL=AiSelect.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AiSelect.d.ts","sourceRoot":"","sources":["../../src/components/AiSelect.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAY,KAAK,oBAAoB,EAAE,MAAM,OAAO,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAQ5C,MAAM,WAAW,aACf,SACE,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,EACzB,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,SAAS,CAAC;IAC1D,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;CAC7B;AAED,wBAAgB,QAAQ,CAAC,EACvB,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,aAAa,2CA+Ef"}
1
+ {"version":3,"file":"AiSelect.d.ts","sourceRoot":"","sources":["../../src/components/AiSelect.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAY,KAAK,oBAAoB,EAAE,MAAM,OAAO,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAQ5C,MAAM,WAAW,aACf,SACE,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,EACzB,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,SAAS,CAAC;IAC1D,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;CAC7B;AAED,wBAAgB,QAAQ,CAAC,EACvB,OAAO,EACP,QAAQ,EACR,MAAgB,EAChB,OAAO,EACP,KAAK,EACL,MAAM,EACN,YAAY,EACZ,aAAa,EACb,OAAO,EACP,OAAO,EACP,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,GAAG,WAAW,EACf,EAAE,aAAa,2CAiFf"}
@@ -7,7 +7,7 @@ import { AiPromptPanel } from "./AiPromptPanel";
7
7
  import { UsageToast, useUsageToast } from "./UsageToast";
8
8
  import { aiStyles } from "../styles/inline";
9
9
  import { handleAIError } from "../utils/errorHandler";
10
- export function AiSelect({ baseUrl, apiKeyId, uiMode = "modal", context, model, prompt, onValue, onToast, disabled, className, children, ...selectProps }) {
10
+ export function AiSelect({ baseUrl, apiKeyId, uiMode = "modal", context, model, prompt, storeOutputs, artifactTitle, onValue, onToast, disabled, className, children, ...selectProps }) {
11
11
  const [isOpen, setIsOpen] = useState(false);
12
12
  const [isFocused, setIsFocused] = useState(false);
13
13
  const { showUsageToast, toastData, toastKey, clearToast } = useUsageToast();
@@ -26,6 +26,8 @@ export function AiSelect({ baseUrl, apiKeyId, uiMode = "modal", context, model,
26
26
  prompt: selectedPrompt,
27
27
  context: context || undefined,
28
28
  actionType: "autocomplete",
29
+ storeOutputs,
30
+ artifactTitle,
29
31
  });
30
32
  if (result.text) {
31
33
  onValue?.(result.text);
@@ -3,5 +3,5 @@ import type { BaseAiProps } from "../types";
3
3
  export interface AiTextareaProps extends Omit<BaseAiProps, "type">, Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, "onValue"> {
4
4
  uiMode?: "modal" | "drawer";
5
5
  }
6
- export declare function AiTextarea({ baseUrl, apiKeyId, uiMode, context, model, prompt, editMode, enableModelManagement, onValue, onToast, disabled, className, ...textareaProps }: AiTextareaProps): import("react/jsx-runtime").JSX.Element;
6
+ export declare function AiTextarea({ baseUrl, apiKeyId, uiMode, context, model, prompt, editMode, enableModelManagement, storeOutputs, artifactTitle, onValue, onToast, disabled, className, ...textareaProps }: AiTextareaProps): import("react/jsx-runtime").JSX.Element;
7
7
  //# sourceMappingURL=AiTextarea.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AiTextarea.d.ts","sourceRoot":"","sources":["../../src/components/AiTextarea.tsx"],"names":[],"mappings":"AAEA,OAAc,EAIZ,KAAK,sBAAsB,EAC5B,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAQ5C,MAAM,WAAW,eACf,SACE,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,EACzB,IAAI,CAAC,sBAAsB,CAAC,mBAAmB,CAAC,EAAE,SAAS,CAAC;IAC9D,MAAM,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;CAC7B;AAED,wBAAgB,UAAU,CAAC,EACzB,OAAO,EACP,QAAQ,EACR,MAAgB,EAChB,OAAO,EACP,KAAK,EACL,MAAM,EACN,QAAgB,EAChB,qBAAqB,EACrB,OAAO,EACP,OAAO,EACP,QAAQ,EACR,SAAS,EACT,GAAG,aAAa,EACjB,EAAE,eAAe,2CA4LjB"}
1
+ {"version":3,"file":"AiTextarea.d.ts","sourceRoot":"","sources":["../../src/components/AiTextarea.tsx"],"names":[],"mappings":"AAEA,OAAc,EAIZ,KAAK,sBAAsB,EAC5B,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAQ5C,MAAM,WAAW,eACf,SACE,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,EACzB,IAAI,CAAC,sBAAsB,CAAC,mBAAmB,CAAC,EAAE,SAAS,CAAC;IAC9D,MAAM,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;CAC7B;AAED,wBAAgB,UAAU,CAAC,EACzB,OAAO,EACP,QAAQ,EACR,MAAgB,EAChB,OAAO,EACP,KAAK,EACL,MAAM,EACN,QAAgB,EAChB,qBAAqB,EACrB,YAAY,EACZ,aAAa,EACb,OAAO,EACP,OAAO,EACP,QAAQ,EACR,SAAS,EACT,GAAG,aAAa,EACjB,EAAE,eAAe,2CA8LjB"}
@@ -8,7 +8,7 @@ import { AiPromptPanel } from "./AiPromptPanel";
8
8
  import { UsageToast, useUsageToast } from "./UsageToast";
9
9
  import { aiStyles } from "../styles/inline";
10
10
  import { handleAIError } from "../utils/errorHandler";
11
- export function AiTextarea({ baseUrl, apiKeyId, uiMode = "modal", context, model, prompt, editMode = false, enableModelManagement, onValue, onToast, disabled, className, ...textareaProps }) {
11
+ export function AiTextarea({ baseUrl, apiKeyId, uiMode = "modal", context, model, prompt, editMode = false, enableModelManagement, storeOutputs, artifactTitle, onValue, onToast, disabled, className, ...textareaProps }) {
12
12
  const [isOpen, setIsOpen] = useState(false);
13
13
  const [textareaValue, setTextareaValue] = useState(textareaProps.value?.toString() ||
14
14
  textareaProps.defaultValue?.toString() ||
@@ -38,6 +38,8 @@ export function AiTextarea({ baseUrl, apiKeyId, uiMode = "modal", context, model
38
38
  prompt: promptWithContext,
39
39
  context: resolvedContext,
40
40
  actionType: hasContext ? "generate-text" : "autocomplete",
41
+ storeOutputs,
42
+ artifactTitle,
41
43
  });
42
44
  if (result.text) {
43
45
  setTextareaValue(result.text);
package/dist/types.d.ts CHANGED
@@ -13,6 +13,8 @@ export interface BaseAiProps {
13
13
  prompt?: string | null;
14
14
  editMode?: boolean;
15
15
  enableModelManagement?: boolean;
16
+ storeOutputs?: boolean;
17
+ artifactTitle?: string;
16
18
  onValue?: (value: string) => void;
17
19
  onToast?: (toast: ToastType) => void;
18
20
  disabled?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AACF,MAAM,MAAM,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAExC,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AACF,MAAM,MAAM,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAExC,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lastbrain/ai-ui-react",
3
- "version": "1.0.31",
3
+ "version": "1.0.33",
4
4
  "description": "Headless React components for LastBrain AI UI Kit",
5
5
  "private": false,
6
6
  "type": "module",
@@ -48,7 +48,7 @@
48
48
  },
49
49
  "dependencies": {
50
50
  "lucide-react": "^0.257.0",
51
- "@lastbrain/ai-ui-core": "1.0.20"
51
+ "@lastbrain/ai-ui-core": "1.0.22"
52
52
  },
53
53
  "devDependencies": {
54
54
  "@types/react": "^19.2.0",
@@ -68,7 +68,11 @@ export function AiContextButton({
68
68
  const baseUrl = propBaseUrl ?? aiContext.baseUrl;
69
69
  const apiKeyId = propApiKeyId ?? aiContext.apiKeyId;
70
70
 
71
- const { models, loading: modelsLoading } = useAiModels({ baseUrl, apiKeyId });
71
+ // Utiliser les valeurs résolues pour les hooks
72
+ const { models, loading: modelsLoading } = useAiModels({
73
+ baseUrl,
74
+ apiKeyId,
75
+ });
72
76
  const { generateText: callText, loading } = useAiCallText({
73
77
  baseUrl,
74
78
  apiKeyId,
@@ -1,14 +1,7 @@
1
1
  "use client";
2
2
 
3
3
  import { useState, type ButtonHTMLAttributes } from "react";
4
- import {
5
- ImageIcon,
6
- Loader2,
7
- Download,
8
- Copy,
9
- ExternalLink,
10
- X,
11
- } from "lucide-react";
4
+ import { ImageIcon, Loader2, Download, ExternalLink, X } from "lucide-react";
12
5
  import type { BaseAiProps } from "../types";
13
6
  import { useAiCallImage } from "../hooks/useAiCallImage";
14
7
  import { useAiModels } from "../hooks/useAiModels";
@@ -90,19 +83,6 @@ export function AiImageButton({
90
83
  link.click();
91
84
  };
92
85
 
93
- const handleCopyUrl = async () => {
94
- if (!generatedImage) return;
95
- try {
96
- await navigator.clipboard.writeText(generatedImage.url);
97
- onToast?.({
98
- type: "success",
99
- message: "URL copiée dans le presse-papier",
100
- });
101
- } catch (_error) {
102
- onToast?.({ type: "error", message: "Erreur lors de la copie" });
103
- }
104
- };
105
-
106
86
  const handleSave = async () => {
107
87
  if (!generatedImage || !onImageSave) return;
108
88
  try {
@@ -383,46 +363,28 @@ export function AiImageButton({
383
363
  <div className="flex items-center gap-2 flex-wrap">
384
364
  <button
385
365
  onClick={handleDownload}
386
- className="flex items-center gap-1 px-3 py-2 text-xs font-medium rounded-lg transition-colors"
387
- style={getThemeStyles().actionButton}
388
- onMouseEnter={(e) => {
389
- e.currentTarget.style.backgroundColor =
390
- getThemeStyles().actionButton.hoverBackground;
391
- e.currentTarget.style.color =
392
- getThemeStyles().actionButton.hoverColor;
393
- }}
394
- onMouseLeave={(e) => {
395
- e.currentTarget.style.backgroundColor =
396
- getThemeStyles().actionButton.backgroundColor;
397
- e.currentTarget.style.color =
398
- getThemeStyles().actionButton.color;
366
+ className="flex items-center gap-2 px-4 py-2.5 text-sm font-semibold rounded-lg transition-all shadow-sm"
367
+ style={{
368
+ backgroundColor: "#10b981",
369
+ color: "white",
370
+ border: "none",
371
+ cursor: "pointer",
399
372
  }}
400
- title="Télécharger l'image"
401
- >
402
- <Download size={14} />
403
- Télécharger
404
- </button>
405
-
406
- <button
407
- onClick={handleCopyUrl}
408
- className="flex items-center gap-1 px-3 py-2 text-xs font-medium rounded-lg transition-colors"
409
- style={getThemeStyles().actionButton}
410
373
  onMouseEnter={(e) => {
411
- e.currentTarget.style.backgroundColor =
412
- getThemeStyles().actionButton.hoverBackground;
413
- e.currentTarget.style.color =
414
- getThemeStyles().actionButton.hoverColor;
374
+ e.currentTarget.style.backgroundColor = "#059669";
375
+ e.currentTarget.style.transform = "translateY(-1px)";
376
+ e.currentTarget.style.boxShadow =
377
+ "0 4px 12px rgba(16, 185, 129, 0.3)";
415
378
  }}
416
379
  onMouseLeave={(e) => {
417
- e.currentTarget.style.backgroundColor =
418
- getThemeStyles().actionButton.backgroundColor;
419
- e.currentTarget.style.color =
420
- getThemeStyles().actionButton.color;
380
+ e.currentTarget.style.backgroundColor = "#10b981";
381
+ e.currentTarget.style.transform = "translateY(0)";
382
+ e.currentTarget.style.boxShadow = "";
421
383
  }}
422
- title="Copier l'URL"
384
+ title="Télécharger l'image"
423
385
  >
424
- <Copy size={14} />
425
- Copier URL
386
+ <Download size={16} />
387
+ Télécharger l'image
426
388
  </button>
427
389
 
428
390
  {onImageSave && (
@@ -26,11 +26,13 @@ export function AiInput({
26
26
  model,
27
27
  prompt,
28
28
  editMode = false,
29
+ enableModelManagement = false,
30
+ storeOutputs,
31
+ artifactTitle,
29
32
  onValue,
30
33
  onToast,
31
34
  disabled,
32
35
  className,
33
- enableModelManagement = false,
34
36
  ...inputProps
35
37
  }: AiInputProps) {
36
38
  const [isOpen, setIsOpen] = useState(false);
@@ -73,6 +75,8 @@ export function AiInput({
73
75
  prompt: promptWithContext,
74
76
  context: resolvedContext,
75
77
  actionType: hasContext ? "generate-text" : "autocomplete",
78
+ storeOutputs,
79
+ artifactTitle,
76
80
  });
77
81
 
78
82
  if (result.text) {
@@ -24,6 +24,8 @@ export function AiSelect({
24
24
  context,
25
25
  model,
26
26
  prompt,
27
+ storeOutputs,
28
+ artifactTitle,
27
29
  onValue,
28
30
  onToast,
29
31
  disabled,
@@ -56,6 +58,8 @@ export function AiSelect({
56
58
  prompt: selectedPrompt,
57
59
  context: context || undefined,
58
60
  actionType: "autocomplete",
61
+ storeOutputs,
62
+ artifactTitle,
59
63
  });
60
64
 
61
65
  if (result.text) {
@@ -31,6 +31,8 @@ export function AiTextarea({
31
31
  prompt,
32
32
  editMode = false,
33
33
  enableModelManagement,
34
+ storeOutputs,
35
+ artifactTitle,
34
36
  onValue,
35
37
  onToast,
36
38
  disabled,
@@ -79,6 +81,8 @@ export function AiTextarea({
79
81
  prompt: promptWithContext,
80
82
  context: resolvedContext,
81
83
  actionType: hasContext ? "generate-text" : "autocomplete",
84
+ storeOutputs,
85
+ artifactTitle,
82
86
  });
83
87
 
84
88
  if (result.text) {
package/src/types.ts CHANGED
@@ -14,6 +14,8 @@ export interface BaseAiProps {
14
14
  prompt?: string | null;
15
15
  editMode?: boolean;
16
16
  enableModelManagement?: boolean;
17
+ storeOutputs?: boolean; // Whether to store outputs (images in bucket, text in database)
18
+ artifactTitle?: string; // Title for stored artifacts
17
19
  onValue?: (value: string) => void;
18
20
  onToast?: (toast: ToastType) => void;
19
21
  disabled?: boolean;