@lastbrain/ai-ui-react 1.0.55 → 1.0.57

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.
@@ -279,7 +279,6 @@ function AiPromptPanelInternal({ isOpen, onClose, onSubmit, uiMode: _uiMode = "m
279
279
  position: "sticky",
280
280
  top: 0,
281
281
  zIndex: 5,
282
- borderBottom: "1px solid var(--ai-border-primary, #374151)",
283
282
  backdropFilter: "blur(8px)",
284
283
  }, children: [_jsx("h2", { style: aiStyles.modalTitle, children: showPromptLibrary ? "Select a Prompt" : "AI Prompt Configuration" }), _jsx("button", { style: {
285
284
  ...aiStyles.modalCloseButton,
@@ -529,7 +528,6 @@ function AiPromptPanelInternal({ isOpen, onClose, onSubmit, uiMode: _uiMode = "m
529
528
  position: "sticky",
530
529
  bottom: 0,
531
530
  zIndex: 5,
532
- borderTop: "1px solid var(--ai-border-primary, #374151)",
533
531
  backdropFilter: "blur(8px)",
534
532
  }, children: [_jsx("button", { onClick: handleClose, onMouseEnter: () => setIsCancelHovered(true), onMouseLeave: () => setIsCancelHovered(false), style: {
535
533
  ...aiStyles.button,
@@ -611,30 +609,30 @@ function AiPromptPanelInternal({ isOpen, onClose, onSubmit, uiMode: _uiMode = "m
611
609
  alignItems: "center",
612
610
  justifyContent: "space-between",
613
611
  padding: "16px 18px",
614
- border: "2px solid",
615
- borderColor: isActive
616
- ? "#10b981"
617
- : "var(--ai-border-primary, #374151)",
612
+ // border: "2px solid",
613
+ // borderColor: isActive
614
+ // ? "#10b981"
615
+ // : "var(--ai-border-primary, #374151)",
618
616
  borderRadius: "10px",
619
617
  backgroundColor: isActive
620
- ? "rgba(16, 185, 129, 0.08)"
621
- : "var(--ai-bg-secondary, rgba(31, 41, 55, 0.5))",
618
+ ? "rgba(16, 185, 129, 0.03)"
619
+ : "var(--ai-bg-secondary, rgba(31, 41, 55, 0.2))",
622
620
  transition: "all 0.2s",
623
621
  cursor: "pointer",
624
622
  backdropFilter: "blur(8px)",
625
623
  }, onClick: () => !isLoading &&
626
624
  handleModelToggle(modelData.id, !isActive), onMouseEnter: (e) => {
627
- e.currentTarget.style.borderColor = isActive
628
- ? "#059669"
629
- : "#4b5563";
625
+ // e.currentTarget.style.borderColor = isActive
626
+ // ? "#059669"
627
+ // : "#4b5563";
630
628
  e.currentTarget.style.transform = "translateY(-2px)";
631
629
  e.currentTarget.style.boxShadow = isActive
632
630
  ? "0 8px 16px rgba(16, 185, 129, 0.2)"
633
631
  : "0 8px 16px rgba(0, 0, 0, 0.15)";
634
632
  }, onMouseLeave: (e) => {
635
- e.currentTarget.style.borderColor = isActive
636
- ? "#10b981"
637
- : "var(--ai-border-primary, #374151)";
633
+ // e.currentTarget.style.borderColor = isActive
634
+ // ? "#10b981"
635
+ // : "var(--ai-border-primary, #374151)";
638
636
  e.currentTarget.style.transform = "translateY(0)";
639
637
  e.currentTarget.style.boxShadow = "none";
640
638
  }, children: [_jsxs("div", { style: {
@@ -1 +1 @@
1
- {"version":3,"file":"LBApiKeySelector.d.ts","sourceRoot":"","sources":["../../src/components/LBApiKeySelector.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEtD,UAAU,qBAAqB;IAC7B,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,MAAM,GACP,EAAE,qBAAqB,kDAwTvB"}
1
+ {"version":3,"file":"LBApiKeySelector.d.ts","sourceRoot":"","sources":["../../src/components/LBApiKeySelector.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEtD,UAAU,qBAAqB;IAC7B,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,MAAM,GACP,EAAE,qBAAqB,kDAyTvB"}
@@ -41,6 +41,7 @@ export function LBApiKeySelector({ apiKeys, onSelect, onCancel, isOpen, }) {
41
41
  bottom: 0,
42
42
  background: "rgba(0, 0, 0, 0.75)",
43
43
  backdropFilter: "blur(8px)",
44
+ height: "110%",
44
45
  } }), _jsxs("div", { style: {
45
46
  position: "relative",
46
47
  background: "light-dark(#ffffff, #1e293b)",
@@ -1 +1 @@
1
- {"version":3,"file":"LBSigninModal.d.ts","sourceRoot":"","sources":["../../src/components/LBSigninModal.tsx"],"names":[],"mappings":"AAOA,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAgB,aAAa,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,kBAAkB,kDA6jBpE"}
1
+ {"version":3,"file":"LBSigninModal.d.ts","sourceRoot":"","sources":["../../src/components/LBSigninModal.tsx"],"names":[],"mappings":"AAOA,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAgB,aAAa,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,kBAAkB,kDAijBpE"}
@@ -12,25 +12,14 @@ export function LBSigninModal({ isOpen, onClose }) {
12
12
  const [error, setError] = useState("");
13
13
  const [showKeySelector, setShowKeySelector] = useState(false);
14
14
  const [currentApiKeys, setCurrentApiKeys] = useState([]); // Stocker les clés API localement
15
- // Vérifier si LBProvider est disponible
16
- let login;
17
- let selectApiKeyWithToken;
18
- let fetchApiKeys;
19
- let apiKeys = [];
20
- let lbStatus;
21
- let lbContext;
22
- try {
23
- lbContext = useLB();
24
- login = lbContext.login;
25
- selectApiKeyWithToken = lbContext.selectApiKeyWithToken;
26
- fetchApiKeys = lbContext.fetchApiKeys;
27
- apiKeys = lbContext.apiKeys || [];
28
- lbStatus = lbContext.status;
29
- }
30
- catch {
31
- // LBProvider n'est pas disponible, ne pas rendre le modal
15
+ // Appeler useLB() inconditionnellement - hook doit toujours être appelé
16
+ const lbContext = useLB();
17
+ // Vérifier si le contexte est valide
18
+ if (!lbContext || !isOpen) {
32
19
  return null;
33
20
  }
21
+ // Extraire les valeurs du contexte
22
+ const { login, selectApiKeyWithToken, fetchApiKeys, apiKeys = [], status: lbStatus, } = lbContext;
34
23
  if (!isOpen || !login)
35
24
  return null;
36
25
  const handleSubmit = async (e) => {
@@ -42,20 +31,20 @@ export function LBSigninModal({ isOpen, onClose }) {
42
31
  if (result.success) {
43
32
  if (result.needsKeySelection) {
44
33
  // L'utilisateur doit choisir une clé API
45
- // Récupérer les clés API avec l'access token temporaire
46
- if (fetchApiKeys && lbContext.accessToken) {
34
+ // Utiliser l'access token retourné directement par login
35
+ if (fetchApiKeys && result.accessToken) {
47
36
  try {
48
- const keys = await fetchApiKeys(lbContext.accessToken);
37
+ const keys = await fetchApiKeys(result.accessToken);
49
38
  setCurrentApiKeys(keys);
50
39
  setShowKeySelector(true);
51
40
  }
52
41
  catch (keyError) {
53
- setError("Impossible de récupérer les clés API");
42
+ setError("Erreur lors de la récupération des clés API");
54
43
  console.error("Failed to fetch API keys:", keyError);
55
44
  }
56
45
  }
57
46
  else {
58
- setError("Accès aux clés API indisponible");
47
+ setError("Token d'accès non disponible");
59
48
  }
60
49
  }
61
50
  else {
@@ -21,6 +21,7 @@ interface LBContextValue extends LBAuthState {
21
21
  success: boolean;
22
22
  error?: string;
23
23
  needsKeySelection?: boolean;
24
+ accessToken?: string;
24
25
  }>;
25
26
  /** Fonction de déconnexion */
26
27
  logout: () => Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"LBAuthProvider.d.ts","sourceRoot":"","sources":["../../src/context/LBAuthProvider.tsx"],"names":[],"mappings":"AAEA;;;GAGG;AAEH,OAAO,EAML,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EACV,WAAW,EACX,QAAQ,EAIR,QAAQ,EACT,MAAM,uBAAuB,CAAC;AAE/B,UAAU,eAAe;IACvB,QAAQ,EAAE,SAAS,CAAC;IACpB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mDAAmD;IACnD,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;IACzD,sEAAsE;IACtE,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;CAC3B;AAED,UAAU,cAAe,SAAQ,WAAW;IAC1C,4BAA4B;IAC5B,KAAK,EAAE,CACL,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,KACb,OAAO,CAAC;QACX,OAAO,EAAE,OAAO,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,iBAAiB,CAAC,EAAE,OAAO,CAAC;KAC7B,CAAC,CAAC;IACH,8BAA8B;IAC9B,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,6CAA6C;IAC7C,YAAY,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC3D,gEAAgE;IAChE,YAAY,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,mDAAmD;IACnD,qBAAqB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,iEAAiE;IACjE,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,oCAAoC;IACpC,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,2BAA2B;IAC3B,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,4CAA4C;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kDAAkD;IAClD,SAAS,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC3B,yCAAyC;IACzC,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,sDAAsD;IACtD,eAAe,EAAE,OAAO,CAAC;CAC1B;AAID,wBAAgB,UAAU,CAAC,EACzB,QAAQ,EACR,OAAO,EAAE,QAA2B,EACpC,QAA2B,EAC3B,cAAc,EACd,YAAY,GACb,EAAE,eAAe,2CA2djB;AAED;;GAEG;AACH,wBAAgB,KAAK,IAAI,cAAc,CAMtC"}
1
+ {"version":3,"file":"LBAuthProvider.d.ts","sourceRoot":"","sources":["../../src/context/LBAuthProvider.tsx"],"names":[],"mappings":"AAEA;;;GAGG;AAEH,OAAO,EAML,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EACV,WAAW,EACX,QAAQ,EAIR,QAAQ,EACT,MAAM,uBAAuB,CAAC;AAE/B,UAAU,eAAe;IACvB,QAAQ,EAAE,SAAS,CAAC;IACpB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mDAAmD;IACnD,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;IACzD,sEAAsE;IACtE,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;CAC3B;AAED,UAAU,cAAe,SAAQ,WAAW;IAC1C,4BAA4B;IAC5B,KAAK,EAAE,CACL,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,KACb,OAAO,CAAC;QACX,OAAO,EAAE,OAAO,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC,CAAC;IACH,8BAA8B;IAC9B,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,6CAA6C;IAC7C,YAAY,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC3D,gEAAgE;IAChE,YAAY,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,mDAAmD;IACnD,qBAAqB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,iEAAiE;IACjE,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,oCAAoC;IACpC,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,2BAA2B;IAC3B,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,4CAA4C;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kDAAkD;IAClD,SAAS,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC3B,yCAAyC;IACzC,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,sDAAsD;IACtD,eAAe,EAAE,OAAO,CAAC;CAC1B;AAID,wBAAgB,UAAU,CAAC,EACzB,QAAQ,EACR,OAAO,EAAE,QAA2B,EACpC,QAA2B,EAC3B,cAAc,EACd,YAAY,GACb,EAAE,eAAe,2CA4djB;AAED;;GAEG;AACH,wBAAgB,KAAK,IAAI,cAAc,CAMtC"}
@@ -229,7 +229,7 @@ export function LBProvider({ children, baseUrl: _baseUrl = "/api/lastbrain", pro
229
229
  status: "needs_key_selection",
230
230
  user: result.user,
231
231
  });
232
- return { success: true, needsKeySelection: true };
232
+ return { success: true, needsKeySelection: true, accessToken: token };
233
233
  }
234
234
  catch (keyError) {
235
235
  console.error("[LBProvider] Failed to fetch API keys:");
@@ -1 +1 @@
1
- {"version":3,"file":"inline.d.ts","sourceRoot":"","sources":["../../src/styles/inline.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA6HH,eAAO,MAAM,QAAQ;WAgBd,KAAK,CAAC,aAAa;gBAKnB,KAAK,CAAC,aAAa;gBAInB,KAAK,CAAC,aAAa;;;;;mBAyBnB,KAAK,CAAC,aAAa;wBAMnB,KAAK,CAAC,aAAa;cAmBnB,KAAK,CAAC,aAAa;mBAKnB,KAAK,CAAC,aAAa;;;;;sBAwBnB,KAAK,CAAC,aAAa;2BAMnB,KAAK,CAAC,aAAa;YAoBnB,KAAK,CAAC,aAAa;iBAMnB,KAAK,CAAC,aAAa;oBAMnB,KAAK,CAAC,aAAa;YA2BnB,KAAK,CAAC,aAAa;iBAKnB,KAAK,CAAC,aAAa;kBAgBnB,KAAK,CAAC,aAAa;uBAMnB,KAAK,CAAC,aAAa;0BAKnB,KAAK,CAAC,aAAa;aAgBnB,KAAK,CAAC,aAAa;mBASnB,KAAK,CAAC,aAAa;oBAKnB,KAAK,CAAC,aAAa;yBAKnB,KAAK,CAAC,aAAa;qBASnB,KAAK,CAAC,aAAa;gBAQnB,KAAK,CAAC,aAAa;kBAKnB,KAAK,CAAC,aAAa;kBAQnB,KAAK,CAAC,aAAa;sBAKnB,KAAK,CAAC,aAAa;yBAKnB,KAAK,CAAC,aAAa;yBAKnB,KAAK,CAAC,aAAa;oBASnB,KAAK,CAAC,aAAa;iBAcnB,KAAK,CAAC,aAAa;sBAKnB,KAAK,CAAC,aAAa;UAcnB,KAAK,CAAC,aAAa;WAenB,KAAK,CAAC,aAAa;kBAWnB,KAAK,CAAC,aAAa;kBAanB,KAAK,CAAC,aAAa;iBAQnB,KAAK,CAAC,aAAa;gBAOnB,KAAK,CAAC,aAAa;sBAiBnB,KAAK,CAAC,aAAa;2BAKnB,KAAK,CAAC,aAAa;eAMnB,KAAK,CAAC,aAAa;iBAQnB,KAAK,CAAC,aAAa;gBAQnB,KAAK,CAAC,aAAa;qBAInB,KAAK,CAAC,aAAa;qBAOnB,KAAK,CAAC,aAAa;0BAKnB,KAAK,CAAC,aAAa;aAUnB,KAAK,CAAC,aAAa;CACzB,CAAC;AAoCF,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,OAAO,EACnB,YAAY,GAAE,MAAY,EAC1B,aAAa,GAAE,MAAY,GAC1B;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAoDlE"}
1
+ {"version":3,"file":"inline.d.ts","sourceRoot":"","sources":["../../src/styles/inline.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA6HH,eAAO,MAAM,QAAQ;WAgBd,KAAK,CAAC,aAAa;gBAKnB,KAAK,CAAC,aAAa;gBAInB,KAAK,CAAC,aAAa;;;;;mBAyBnB,KAAK,CAAC,aAAa;wBAMnB,KAAK,CAAC,aAAa;cAmBnB,KAAK,CAAC,aAAa;mBAKnB,KAAK,CAAC,aAAa;;;;;sBAwBnB,KAAK,CAAC,aAAa;2BAMnB,KAAK,CAAC,aAAa;YAoBnB,KAAK,CAAC,aAAa;iBAMnB,KAAK,CAAC,aAAa;oBAMnB,KAAK,CAAC,aAAa;YA2BnB,KAAK,CAAC,aAAa;iBAKnB,KAAK,CAAC,aAAa;kBAgBnB,KAAK,CAAC,aAAa;uBAMnB,KAAK,CAAC,aAAa;0BAKnB,KAAK,CAAC,aAAa;aAgBnB,KAAK,CAAC,aAAa;mBASnB,KAAK,CAAC,aAAa;oBAKnB,KAAK,CAAC,aAAa;yBAKnB,KAAK,CAAC,aAAa;qBASnB,KAAK,CAAC,aAAa;gBAQnB,KAAK,CAAC,aAAa;kBAKnB,KAAK,CAAC,aAAa;kBAQnB,KAAK,CAAC,aAAa;sBAKnB,KAAK,CAAC,aAAa;yBAKnB,KAAK,CAAC,aAAa;yBAKnB,KAAK,CAAC,aAAa;oBASnB,KAAK,CAAC,aAAa;iBAcnB,KAAK,CAAC,aAAa;sBAKnB,KAAK,CAAC,aAAa;UAcnB,KAAK,CAAC,aAAa;WAenB,KAAK,CAAC,aAAa;kBAWnB,KAAK,CAAC,aAAa;kBAanB,KAAK,CAAC,aAAa;iBAQnB,KAAK,CAAC,aAAa;gBAOnB,KAAK,CAAC,aAAa;sBAiBnB,KAAK,CAAC,aAAa;2BAKnB,KAAK,CAAC,aAAa;eAMnB,KAAK,CAAC,aAAa;iBAQnB,KAAK,CAAC,aAAa;gBAQnB,KAAK,CAAC,aAAa;qBAInB,KAAK,CAAC,aAAa;qBASnB,KAAK,CAAC,aAAa;0BAKnB,KAAK,CAAC,aAAa;aAUnB,KAAK,CAAC,aAAa;CACzB,CAAC;AAoCF,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,OAAO,EACnB,YAAY,GAAE,MAAY,EAC1B,aAAa,GAAE,MAAY,GAC1B;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAoDlE"}
@@ -489,7 +489,9 @@ export const aiStyles = {
489
489
  buttonSecondary: {
490
490
  background: themeVars.bgSecondary,
491
491
  color: themeVars.text,
492
- border: `1px solid ${themeVars.border}`,
492
+ borderWidth: "1px",
493
+ borderStyle: "solid",
494
+ borderColor: themeVars.border,
493
495
  },
494
496
  buttonSecondaryHover: {
495
497
  background: themeVars.bgTertiary,
@@ -1 +1 @@
1
- {"version":3,"file":"modelManagement.d.ts","sourceRoot":"","sources":["../../src/utils/modelManagement.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,OAAO,EACjB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAqCf;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CACR,KAAK,CAAC;IACJ,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;IAC/C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC,CACH,CA6CA;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,MAAM,EAAE,CAAC,CA6CnB"}
1
+ {"version":3,"file":"modelManagement.d.ts","sourceRoot":"","sources":["../../src/utils/modelManagement.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,OAAO,EACjB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAqCf;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CACR,KAAK,CAAC;IACJ,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;IAC/C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC,CACH,CA6CA;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,MAAM,EAAE,CAAC,CAkDnB"}
@@ -85,9 +85,15 @@ export async function getUserModels(options = {}) {
85
85
  : `/api/ai/auth/user-models`; // fallback
86
86
  console.log("[getUserModels] isExternalProxy:", isExternalProxy, "isPublicApi:", isPublicApi, "endpoint:", endpoint);
87
87
  const headers = {};
88
- // Ajouter la clé API pour les appels publics directs
89
- if (isPublicApi && apiKey) {
90
- headers["Authorization"] = `Bearer ${apiKey}`;
88
+ // Ajouter la clé API pour tous les types d'appels si disponible
89
+ if (apiKey) {
90
+ if (isPublicApi) {
91
+ headers["Authorization"] = `Bearer ${apiKey}`;
92
+ }
93
+ else {
94
+ // Pour les routes auth internes, utiliser aussi le Bearer token si pas de session
95
+ headers["Authorization"] = `Bearer ${apiKey}`;
96
+ }
91
97
  }
92
98
  const response = await fetch(endpoint, {
93
99
  method: "GET",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lastbrain/ai-ui-react",
3
- "version": "1.0.55",
3
+ "version": "1.0.57",
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.42"
51
+ "@lastbrain/ai-ui-core": "1.0.43"
52
52
  },
53
53
  "devDependencies": {
54
54
  "@types/react": "^19.2.0",
@@ -425,7 +425,6 @@ function AiPromptPanelInternal({
425
425
  top: 0,
426
426
  zIndex: 5,
427
427
 
428
- borderBottom: "1px solid var(--ai-border-primary, #374151)",
429
428
  backdropFilter: "blur(8px)",
430
429
  }}
431
430
  >
@@ -1004,7 +1003,6 @@ function AiPromptPanelInternal({
1004
1003
  bottom: 0,
1005
1004
  zIndex: 5,
1006
1005
 
1007
- borderTop: "1px solid var(--ai-border-primary, #374151)",
1008
1006
  backdropFilter: "blur(8px)",
1009
1007
  }}
1010
1008
  >
@@ -1183,14 +1181,14 @@ function AiPromptPanelInternal({
1183
1181
  alignItems: "center",
1184
1182
  justifyContent: "space-between",
1185
1183
  padding: "16px 18px",
1186
- border: "2px solid",
1187
- borderColor: isActive
1188
- ? "#10b981"
1189
- : "var(--ai-border-primary, #374151)",
1184
+ // border: "2px solid",
1185
+ // borderColor: isActive
1186
+ // ? "#10b981"
1187
+ // : "var(--ai-border-primary, #374151)",
1190
1188
  borderRadius: "10px",
1191
1189
  backgroundColor: isActive
1192
- ? "rgba(16, 185, 129, 0.08)"
1193
- : "var(--ai-bg-secondary, rgba(31, 41, 55, 0.5))",
1190
+ ? "rgba(16, 185, 129, 0.03)"
1191
+ : "var(--ai-bg-secondary, rgba(31, 41, 55, 0.2))",
1194
1192
  transition: "all 0.2s",
1195
1193
  cursor: "pointer",
1196
1194
  backdropFilter: "blur(8px)",
@@ -1200,18 +1198,18 @@ function AiPromptPanelInternal({
1200
1198
  handleModelToggle(modelData.id, !isActive)
1201
1199
  }
1202
1200
  onMouseEnter={(e) => {
1203
- e.currentTarget.style.borderColor = isActive
1204
- ? "#059669"
1205
- : "#4b5563";
1201
+ // e.currentTarget.style.borderColor = isActive
1202
+ // ? "#059669"
1203
+ // : "#4b5563";
1206
1204
  e.currentTarget.style.transform = "translateY(-2px)";
1207
1205
  e.currentTarget.style.boxShadow = isActive
1208
1206
  ? "0 8px 16px rgba(16, 185, 129, 0.2)"
1209
1207
  : "0 8px 16px rgba(0, 0, 0, 0.15)";
1210
1208
  }}
1211
1209
  onMouseLeave={(e) => {
1212
- e.currentTarget.style.borderColor = isActive
1213
- ? "#10b981"
1214
- : "var(--ai-border-primary, #374151)";
1210
+ // e.currentTarget.style.borderColor = isActive
1211
+ // ? "#10b981"
1212
+ // : "var(--ai-border-primary, #374151)";
1215
1213
  e.currentTarget.style.transform = "translateY(0)";
1216
1214
  e.currentTarget.style.boxShadow = "none";
1217
1215
  }}
@@ -68,6 +68,7 @@ export function LBApiKeySelector({
68
68
  bottom: 0,
69
69
  background: "rgba(0, 0, 0, 0.75)",
70
70
  backdropFilter: "blur(8px)",
71
+ height: "110%",
71
72
  }}
72
73
  />
73
74
 
@@ -19,35 +19,23 @@ export function LBSigninModal({ isOpen, onClose }: LBSigninModalProps) {
19
19
  const [showKeySelector, setShowKeySelector] = useState(false);
20
20
  const [currentApiKeys, setCurrentApiKeys] = useState<any[]>([]); // Stocker les clés API localement
21
21
 
22
- // Vérifier si LBProvider est disponible
23
- let login:
24
- | ((
25
- email: string,
26
- password: string
27
- ) => Promise<{
28
- success: boolean;
29
- error?: string;
30
- needsKeySelection?: boolean;
31
- }>)
32
- | undefined;
33
- let selectApiKeyWithToken: ((apiKeyId: string) => Promise<void>) | undefined;
34
- let fetchApiKeys: ((accessToken: string) => Promise<any[]>) | undefined;
35
- let apiKeys: any[] = [];
36
- let lbStatus: string | undefined;
22
+ // Appeler useLB() inconditionnellement - hook doit toujours être appelé
23
+ const lbContext = useLB();
37
24
 
38
- let lbContext: any;
39
- try {
40
- lbContext = useLB();
41
- login = lbContext.login;
42
- selectApiKeyWithToken = lbContext.selectApiKeyWithToken;
43
- fetchApiKeys = lbContext.fetchApiKeys;
44
- apiKeys = lbContext.apiKeys || [];
45
- lbStatus = lbContext.status;
46
- } catch {
47
- // LBProvider n'est pas disponible, ne pas rendre le modal
25
+ // Vérifier si le contexte est valide
26
+ if (!lbContext || !isOpen) {
48
27
  return null;
49
28
  }
50
29
 
30
+ // Extraire les valeurs du contexte
31
+ const {
32
+ login,
33
+ selectApiKeyWithToken,
34
+ fetchApiKeys,
35
+ apiKeys = [],
36
+ status: lbStatus,
37
+ } = lbContext;
38
+
51
39
  if (!isOpen || !login) return null;
52
40
 
53
41
  const handleSubmit = async (e: React.FormEvent) => {
@@ -60,18 +48,18 @@ export function LBSigninModal({ isOpen, onClose }: LBSigninModalProps) {
60
48
  if (result.success) {
61
49
  if (result.needsKeySelection) {
62
50
  // L'utilisateur doit choisir une clé API
63
- // Récupérer les clés API avec l'access token temporaire
64
- if (fetchApiKeys && lbContext.accessToken) {
51
+ // Utiliser l'access token retourné directement par login
52
+ if (fetchApiKeys && result.accessToken) {
65
53
  try {
66
- const keys = await fetchApiKeys(lbContext.accessToken);
54
+ const keys = await fetchApiKeys(result.accessToken);
67
55
  setCurrentApiKeys(keys);
68
56
  setShowKeySelector(true);
69
57
  } catch (keyError) {
70
- setError("Impossible de récupérer les clés API");
58
+ setError("Erreur lors de la récupération des clés API");
71
59
  console.error("Failed to fetch API keys:", keyError);
72
60
  }
73
61
  } else {
74
- setError("Accès aux clés API indisponible");
62
+ setError("Token d'accès non disponible");
75
63
  }
76
64
  } else {
77
65
  // Connexion réussie, fermer le modal
@@ -43,6 +43,7 @@ interface LBContextValue extends LBAuthState {
43
43
  success: boolean;
44
44
  error?: string;
45
45
  needsKeySelection?: boolean;
46
+ accessToken?: string;
46
47
  }>;
47
48
  /** Fonction de déconnexion */
48
49
  logout: () => Promise<void>;
@@ -268,6 +269,7 @@ export function LBProvider({
268
269
  success: boolean;
269
270
  error?: string;
270
271
  needsKeySelection?: boolean;
272
+ accessToken?: string;
271
273
  }> => {
272
274
  try {
273
275
  console.log("[LBProvider] Login attempt:", email);
@@ -354,7 +356,7 @@ export function LBProvider({
354
356
  status: "needs_key_selection",
355
357
  user: result.user,
356
358
  });
357
- return { success: true, needsKeySelection: true };
359
+ return { success: true, needsKeySelection: true, accessToken: token };
358
360
  } catch (keyError) {
359
361
  console.error("[LBProvider] Failed to fetch API keys:");
360
362
  console.error("[LBProvider] Error details:", keyError);
@@ -557,7 +557,9 @@ export const aiStyles = {
557
557
  buttonSecondary: {
558
558
  background: themeVars.bgSecondary,
559
559
  color: themeVars.text,
560
- border: `1px solid ${themeVars.border}`,
560
+ borderWidth: "1px",
561
+ borderStyle: "solid",
562
+ borderColor: themeVars.border,
561
563
  } as React.CSSProperties,
562
564
 
563
565
  buttonSecondaryHover: {
@@ -147,9 +147,14 @@ export async function getUserModels(
147
147
 
148
148
  const headers: Record<string, string> = {};
149
149
 
150
- // Ajouter la clé API pour les appels publics directs
151
- if (isPublicApi && apiKey) {
152
- headers["Authorization"] = `Bearer ${apiKey}`;
150
+ // Ajouter la clé API pour tous les types d'appels si disponible
151
+ if (apiKey) {
152
+ if (isPublicApi) {
153
+ headers["Authorization"] = `Bearer ${apiKey}`;
154
+ } else {
155
+ // Pour les routes auth internes, utiliser aussi le Bearer token si pas de session
156
+ headers["Authorization"] = `Bearer ${apiKey}`;
157
+ }
153
158
  }
154
159
 
155
160
  const response = await fetch(endpoint, {