@lastbrain/ai-ui-react 1.0.69 → 1.0.71

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.
Files changed (85) hide show
  1. package/dist/components/AiChipLabel.d.ts +1 -0
  2. package/dist/components/AiChipLabel.d.ts.map +1 -1
  3. package/dist/components/AiChipLabel.js +4 -1
  4. package/dist/components/AiContextButton.d.ts +6 -1
  5. package/dist/components/AiContextButton.d.ts.map +1 -1
  6. package/dist/components/AiContextButton.js +11 -4
  7. package/dist/components/AiImageButton.d.ts +1 -0
  8. package/dist/components/AiImageButton.d.ts.map +1 -1
  9. package/dist/components/AiImageButton.js +1 -0
  10. package/dist/components/AiInput.d.ts +1 -0
  11. package/dist/components/AiInput.d.ts.map +1 -1
  12. package/dist/components/AiInput.js +1 -0
  13. package/dist/components/AiModelSelect.d.ts +1 -0
  14. package/dist/components/AiModelSelect.d.ts.map +1 -1
  15. package/dist/components/AiModelSelect.js +1 -0
  16. package/dist/components/AiPromptPanel.d.ts +1 -0
  17. package/dist/components/AiPromptPanel.d.ts.map +1 -1
  18. package/dist/components/AiPromptPanel.js +13 -6
  19. package/dist/components/AiSelect.d.ts +1 -0
  20. package/dist/components/AiSelect.d.ts.map +1 -1
  21. package/dist/components/AiSelect.js +1 -0
  22. package/dist/components/AiSettingsButton.d.ts +1 -0
  23. package/dist/components/AiSettingsButton.d.ts.map +1 -1
  24. package/dist/components/AiSettingsButton.js +1 -0
  25. package/dist/components/AiStatusButton.d.ts +1 -0
  26. package/dist/components/AiStatusButton.d.ts.map +1 -1
  27. package/dist/components/AiStatusButton.js +21 -13
  28. package/dist/components/AiTextarea.d.ts +1 -0
  29. package/dist/components/AiTextarea.d.ts.map +1 -1
  30. package/dist/components/AiTextarea.js +1 -0
  31. package/dist/components/ErrorToast.d.ts +1 -0
  32. package/dist/components/ErrorToast.d.ts.map +1 -1
  33. package/dist/components/ErrorToast.js +1 -0
  34. package/dist/components/LBApiKeySelector.d.ts.map +1 -1
  35. package/dist/components/LBConnectButton.d.ts +1 -0
  36. package/dist/components/LBConnectButton.d.ts.map +1 -1
  37. package/dist/components/LBConnectButton.js +2 -1
  38. package/dist/components/LBKeyPicker.d.ts +1 -0
  39. package/dist/components/LBKeyPicker.d.ts.map +1 -1
  40. package/dist/components/LBKeyPicker.js +1 -0
  41. package/dist/components/LBSigninModal.d.ts +1 -0
  42. package/dist/components/LBSigninModal.d.ts.map +1 -1
  43. package/dist/components/LBSigninModal.js +2 -1
  44. package/dist/components/UsageToast.d.ts +1 -0
  45. package/dist/components/UsageToast.d.ts.map +1 -1
  46. package/dist/components/UsageToast.js +1 -0
  47. package/dist/context/LBAuthProvider.d.ts +35 -3
  48. package/dist/context/LBAuthProvider.d.ts.map +1 -1
  49. package/dist/context/LBAuthProvider.js +2 -0
  50. package/dist/examples/AiUiPremiumShowcase.d.ts.map +1 -1
  51. package/dist/hooks/useAiModels.d.ts.map +1 -1
  52. package/dist/hooks/useModelManagement.d.ts.map +1 -1
  53. package/dist/styles/register.d.ts +3 -0
  54. package/dist/styles/register.d.ts.map +1 -0
  55. package/dist/styles/register.js +1 -0
  56. package/dist/utils/errorHandler.d.ts +2 -2
  57. package/dist/utils/errorHandler.d.ts.map +1 -1
  58. package/dist/utils/errorHandler.js +8 -1
  59. package/dist/utils/modelManagement.d.ts +13 -10
  60. package/dist/utils/modelManagement.d.ts.map +1 -1
  61. package/dist/utils/modelManagement.js +19 -2
  62. package/package.json +5 -2
  63. package/src/components/AiChipLabel.tsx +6 -1
  64. package/src/components/AiContextButton.tsx +51 -23
  65. package/src/components/AiImageButton.tsx +1 -0
  66. package/src/components/AiInput.tsx +1 -0
  67. package/src/components/AiModelSelect.tsx +1 -0
  68. package/src/components/AiPromptPanel.tsx +20 -15
  69. package/src/components/AiSelect.tsx +1 -0
  70. package/src/components/AiSettingsButton.tsx +1 -0
  71. package/src/components/AiStatusButton.tsx +33 -19
  72. package/src/components/AiTextarea.tsx +4 -1
  73. package/src/components/ErrorToast.tsx +1 -0
  74. package/src/components/LBApiKeySelector.tsx +13 -3
  75. package/src/components/LBConnectButton.tsx +4 -12
  76. package/src/components/LBKeyPicker.tsx +1 -0
  77. package/src/components/LBSigninModal.tsx +21 -10
  78. package/src/components/UsageToast.tsx +1 -0
  79. package/src/context/LBAuthProvider.tsx +47 -7
  80. package/src/examples/AiUiPremiumShowcase.tsx +4 -1
  81. package/src/hooks/useAiModels.ts +2 -1
  82. package/src/hooks/useModelManagement.ts +2 -1
  83. package/src/styles/register.ts +3 -0
  84. package/src/utils/errorHandler.ts +16 -3
  85. package/src/utils/modelManagement.ts +53 -15
@@ -1 +1 @@
1
- {"version":3,"file":"LBAuthProvider.d.ts","sourceRoot":"","sources":["../../src/context/LBAuthProvider.tsx"],"names":[],"mappings":"AAEA;;;GAGG;AAEH,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EACV,WAAW,EACX,QAAQ,EAIR,QAAQ,EACT,MAAM,uBAAuB,CAAC;AAG/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,mEAAmE;IACnE,WAAW,EAAE,GAAG,CAAC;IACjB,uCAAuC;IACvC,aAAa,EAAE,GAAG,CAAC;IACnB,gDAAgD;IAChD,kBAAkB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,iEAAiE;IACjE,oBAAoB,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,kEAAkE;IAClE,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,8DAA8D;IAC9D,eAAe,EAAE,OAAO,CAAC;IACzB,uDAAuD;IACvD,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAID,wBAAgB,UAAU,CAAC,EACzB,QAAQ,EACR,OAAO,EAAE,QAA2B,EACpC,QAA2B,EAC3B,cAAc,EACd,YAAY,GACb,EAAE,eAAe,2CAsgBjB;AAED;;GAEG;AACH,wBAAgB,KAAK,IAAI,cAAc,CAMtC"}
1
+ {"version":3,"file":"LBAuthProvider.d.ts","sourceRoot":"","sources":["../../src/context/LBAuthProvider.tsx"],"names":[],"mappings":"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"}
@@ -7,6 +7,8 @@ import { jsx as _jsx } from "react/jsx-runtime";
7
7
  import { createContext, useContext, useEffect, useCallback, useMemo, useState, } from "react";
8
8
  import { createLBClient } from "@lastbrain/ai-ui-core";
9
9
  const LBContext = createContext(undefined);
10
+ // Export pour usage dans d'autres composants
11
+ export { LBContext };
10
12
  export function LBProvider({ children, baseUrl: _baseUrl = "/api/lastbrain", proxyUrl = "/api/lastbrain", onStatusChange, onAuthChange, }) {
11
13
  const [state, setState] = useState({
12
14
  status: "loading",
@@ -1 +1 @@
1
- {"version":3,"file":"AiUiPremiumShowcase.d.ts","sourceRoot":"","sources":["../../src/examples/AiUiPremiumShowcase.tsx"],"names":[],"mappings":"AAmFA,wBAAgB,mBAAmB,4CAOlC"}
1
+ {"version":3,"file":"AiUiPremiumShowcase.d.ts","sourceRoot":"","sources":["../../src/examples/AiUiPremiumShowcase.tsx"],"names":[],"mappings":"AAsFA,wBAAgB,mBAAmB,4CAOlC"}
@@ -1 +1 @@
1
- {"version":3,"file":"useAiModels.d.ts","sourceRoot":"","sources":["../../src/hooks/useAiModels.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAGtD,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,kBAAkB,CAAC;CAC1E;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,iBAAiB,CA4F3E"}
1
+ {"version":3,"file":"useAiModels.d.ts","sourceRoot":"","sources":["../../src/hooks/useAiModels.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAGtD,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,kBAAkB,CAAC;CAC1E;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,iBAAiB,CA6F3E"}
@@ -1 +1 @@
1
- {"version":3,"file":"useModelManagement.d.ts","sourceRoot":"","sources":["../../src/hooks/useModelManagement.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,yBAA0B,SAAQ,kBAAkB;IACnE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;CACjD;AAED,MAAM,WAAW,wBAAwB;IAEvC,eAAe,EAAE,OAAO,EAAE,CAAC;IAC3B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAGrB,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,iBAAiB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAGvC,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;IAC5C,eAAe,EAAE,MAAM,OAAO,EAAE,CAAC;IACjC,iBAAiB,EAAE,MAAM,OAAO,EAAE,CAAC;CACpC;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,GAAE,yBAA8B,GACtC,wBAAwB,CA+H1B"}
1
+ {"version":3,"file":"useModelManagement.d.ts","sourceRoot":"","sources":["../../src/hooks/useModelManagement.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,yBAA0B,SAAQ,kBAAkB;IACnE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;CACjD;AAED,MAAM,WAAW,wBAAwB;IAEvC,eAAe,EAAE,OAAO,EAAE,CAAC;IAC3B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAGrB,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,iBAAiB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAGvC,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;IAC5C,eAAe,EAAE,MAAM,OAAO,EAAE,CAAC;IACjC,iBAAiB,EAAE,MAAM,OAAO,EAAE,CAAC;CACpC;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,GAAE,yBAA8B,GACtC,wBAAwB,CAgI1B"}
@@ -0,0 +1,3 @@
1
+ import "../styles.css";
2
+ export {};
3
+ //# sourceMappingURL=register.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/styles/register.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AAEvB,OAAO,EAAE,CAAC"}
@@ -0,0 +1 @@
1
+ import "../styles.css";
@@ -6,7 +6,7 @@ export interface ParsedError {
6
6
  /**
7
7
  * Parse et uniformise la gestion des erreurs des composants AI
8
8
  */
9
- export declare function parseAIError(error: any): ParsedError;
9
+ export declare function parseAIError(error: unknown): ParsedError;
10
10
  /**
11
11
  * Interface pour la callback de gestion d'erreur uniforme
12
12
  */
@@ -23,7 +23,7 @@ export interface ErrorToastCallback {
23
23
  * @param onToast Callback externe optionnelle fournie par le parent
24
24
  * @param showInternalToast Callback interne optionnelle pour afficher un toast dans le composant
25
25
  */
26
- export declare function handleAIError(error: any, onToast?: ErrorToastCallback, showInternalToast?: (error: {
26
+ export declare function handleAIError(error: unknown, onToast?: ErrorToastCallback, showInternalToast?: (error: {
27
27
  message: string;
28
28
  code?: string;
29
29
  }) => void): void;
@@ -1 +1 @@
1
- {"version":3,"file":"errorHandler.d.ts","sourceRoot":"","sources":["../../src/utils/errorHandler.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,OAAO,CAAC;CACzB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,GAAG,GAAG,WAAW,CA8CpD;AAyFD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAClE;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,GAAG,EACV,OAAO,CAAC,EAAE,kBAAkB,EAC5B,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,KAAK,IAAI,GACtE,IAAI,CAuBN"}
1
+ {"version":3,"file":"errorHandler.d.ts","sourceRoot":"","sources":["../../src/utils/errorHandler.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,OAAO,CAAC;CACzB;AAeD;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CA8CxD;AAyFD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAClE;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,OAAO,EACd,OAAO,CAAC,EAAE,kBAAkB,EAC5B,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,KAAK,IAAI,GACtE,IAAI,CAuBN"}
@@ -1,11 +1,18 @@
1
1
  "use client";
2
2
  import { ErrorCode } from "@lastbrain/ai-ui-core";
3
+ function isNormalizedErrorLike(value) {
4
+ if (!value || typeof value !== "object") {
5
+ return false;
6
+ }
7
+ const v = value;
8
+ return typeof v.code === "string" && typeof v.message === "string";
9
+ }
3
10
  /**
4
11
  * Parse et uniformise la gestion des erreurs des composants AI
5
12
  */
6
13
  export function parseAIError(error) {
7
14
  // Si l'erreur est déjà un objet normalisé
8
- if (error?.code && error?.message) {
15
+ if (isNormalizedErrorLike(error)) {
9
16
  return {
10
17
  message: getUserFriendlyMessage(error.code, error.message),
11
18
  code: error.code,
@@ -5,25 +5,28 @@ export interface ModelToggleOptions {
5
5
  apiKey?: string;
6
6
  baseUrl?: string;
7
7
  }
8
- /**
9
- * Active ou désactive un modèle pour l'utilisateur courant
10
- */
11
- export declare function toggleUserModel(modelId: string, isActive: boolean, options?: ModelToggleOptions): Promise<void>;
12
- /**
13
- * Récupère tous les modèles disponibles avec API key ou via proxy
14
- */
15
- export declare function getAvailableModels(options?: ModelToggleOptions): Promise<Array<{
8
+ type ModelCategory = "text" | "image" | "audio" | "video";
9
+ interface ModelInfo {
16
10
  id: string;
17
11
  name: string;
18
12
  description?: string;
19
13
  provider: string;
20
- category: "text" | "image" | "audio" | "video";
14
+ category: ModelCategory;
21
15
  isActive?: boolean;
22
16
  isPro?: boolean;
23
17
  costPer1M?: number;
24
- }>>;
18
+ }
19
+ /**
20
+ * Active ou désactive un modèle pour l'utilisateur courant
21
+ */
22
+ export declare function toggleUserModel(modelId: string, isActive: boolean, options?: ModelToggleOptions): Promise<void>;
23
+ /**
24
+ * Récupère tous les modèles disponibles avec API key ou via proxy
25
+ */
26
+ export declare function getAvailableModels(options?: ModelToggleOptions): Promise<ModelInfo[]>;
25
27
  /**
26
28
  * Récupère les modèles activés par l'utilisateur avec API key
27
29
  */
28
30
  export declare function getUserModels(options?: ModelToggleOptions): Promise<string[]>;
31
+ export {};
29
32
  //# sourceMappingURL=modelManagement.d.ts.map
@@ -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;AAUD;;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,CAsDA;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,MAAM,EAAE,CAAC,CAkDnB"}
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;AAcD,KAAK,aAAa,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAE1D,UAAU,SAAS;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,aAAa,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA8BD;;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,CAAC,SAAS,EAAE,CAAC,CA0DtB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,MAAM,EAAE,CAAC,CAkDnB"}
@@ -1,6 +1,21 @@
1
1
  /**
2
2
  * Utilitaires pour la gestion des modèles IA
3
3
  */
4
+ function isModelCategory(value) {
5
+ return (value === "text" ||
6
+ value === "image" ||
7
+ value === "audio" ||
8
+ value === "video");
9
+ }
10
+ function isModelInfo(value) {
11
+ if (!value || typeof value !== "object")
12
+ return false;
13
+ const v = value;
14
+ return (typeof v.id === "string" &&
15
+ typeof v.name === "string" &&
16
+ typeof v.provider === "string" &&
17
+ isModelCategory(v.category));
18
+ }
4
19
  function isAuthTokenCandidate(value) {
5
20
  if (!value)
6
21
  return false;
@@ -76,10 +91,12 @@ export async function getAvailableModels(options = {}) {
76
91
  }
77
92
  const data = await response.json();
78
93
  if (Array.isArray(data?.models)) {
79
- return data.models;
94
+ return data.models.filter(isModelInfo);
80
95
  }
81
96
  if (Array.isArray(data?.providers)) {
82
- return data.providers.flatMap((provider) => Array.isArray(provider.models) ? provider.models : []);
97
+ return (data.providers?.flatMap((provider) => Array.isArray(provider.models)
98
+ ? provider.models.filter(isModelInfo)
99
+ : []) || []);
83
100
  }
84
101
  return [];
85
102
  }
package/package.json CHANGED
@@ -1,10 +1,11 @@
1
1
  {
2
2
  "name": "@lastbrain/ai-ui-react",
3
- "version": "1.0.69",
3
+ "version": "1.0.71",
4
4
  "description": "Headless React components for LastBrain AI UI Kit",
5
5
  "private": false,
6
6
  "type": "module",
7
7
  "main": "dist/index.js",
8
+ "style": "dist/styles.css",
8
9
  "types": "dist/index.d.ts",
9
10
  "exports": {
10
11
  ".": {
@@ -40,7 +41,9 @@
40
41
  ],
41
42
  "sideEffects": [
42
43
  "*.css",
43
- "dist/styles.css"
44
+ "dist/styles.css",
45
+ "dist/index.js",
46
+ "dist/styles/register.js"
44
47
  ],
45
48
  "peerDependencies": {
46
49
  "react": ">=18.0.0",
@@ -1,5 +1,6 @@
1
1
  "use client";
2
2
 
3
+ import "../styles/register";
3
4
  import React, { useState, useRef, KeyboardEvent } from "react";
4
5
  import { X, Sparkles, Lock } from "lucide-react";
5
6
  import { AiPromptPanel } from "./AiPromptPanel";
@@ -218,7 +219,11 @@ Exemple de réponse attendue: javascript, react, frontend, api, development`;
218
219
  }
219
220
  }}
220
221
  className={`ai-control-action ai-spark ${sizeClass} ${radiusClass}`}
221
- aria-label={isAuthenticated ? "Générer des tags avec l'IA" : "Connexion requise"}
222
+ aria-label={
223
+ isAuthenticated
224
+ ? "Générer des tags avec l'IA"
225
+ : "Connexion requise"
226
+ }
222
227
  title={
223
228
  isAuthenticated
224
229
  ? "Générer des tags avec l'IA"
@@ -1,14 +1,8 @@
1
1
  "use client";
2
2
 
3
+ import "../styles/register";
3
4
  import { useState, type ButtonHTMLAttributes } from "react";
4
- import {
5
- Download,
6
- FileText,
7
- Loader2,
8
- Lock,
9
- Sparkles,
10
- X,
11
- } from "lucide-react";
5
+ import { Download, FileText, Loader2, Lock, Sparkles, X } from "lucide-react";
12
6
  import type { BaseAiProps } from "../types";
13
7
  import type { AiRadius, AiSize, AiVariant } from "../types";
14
8
  import { useAiCallText } from "../hooks/useAiCallText";
@@ -20,10 +14,20 @@ import { handleAIError } from "../utils/errorHandler";
20
14
  import { useLB } from "../context/LBAuthProvider";
21
15
  import { LBSigninModal } from "./LBSigninModal";
22
16
 
17
+ // Types pour les données de contexte
18
+ type ContextData =
19
+ | string
20
+ | number
21
+ | boolean
22
+ | object
23
+ | unknown[]
24
+ | { [key: string]: unknown };
25
+
23
26
  export interface AiContextButtonProps
24
- extends Omit<BaseAiProps, "onValue" | "type">,
27
+ extends
28
+ Omit<BaseAiProps, "onValue" | "type">,
25
29
  Omit<ButtonHTMLAttributes<HTMLButtonElement>, "baseUrl" | "apiKeyId"> {
26
- contextData: any;
30
+ contextData: ContextData;
27
31
  contextDescription?: string;
28
32
  onResult?: (
29
33
  result: string,
@@ -99,7 +103,7 @@ export function AiContextButton({
99
103
  setIsOpen(true);
100
104
  };
101
105
 
102
- const formatContextData = (data: any): string => {
106
+ const formatContextData = (data: ContextData): string => {
103
107
  if (typeof data === "string") {
104
108
  return data;
105
109
  }
@@ -109,7 +113,10 @@ export function AiContextButton({
109
113
  return String(data);
110
114
  };
111
115
 
112
- const handleSubmit = async (selectedModel: string, selectedPrompt: string) => {
116
+ const handleSubmit = async (
117
+ selectedModel: string,
118
+ selectedPrompt: string
119
+ ) => {
113
120
  try {
114
121
  const contextString = formatContextData(contextData);
115
122
  const fullPrompt = `${selectedPrompt}\n\nCONTEXTE (${contextDescription}):\n${contextString}\n\nAnalyse ces données et réponds de manière structurée et claire.`;
@@ -175,12 +182,17 @@ export function AiContextButton({
175
182
  return;
176
183
  }
177
184
 
178
- const currentDate = new Date().toLocaleDateString("fr-FR").replace(/\//g, "-");
185
+ const currentDate = new Date()
186
+ .toLocaleDateString("fr-FR")
187
+ .replace(/\//g, "-");
179
188
  const defaultName = `analyse-${currentDate}.txt`;
180
189
  const fileName = prompt("Nom du fichier :", defaultName) || defaultName;
181
190
 
182
- const content = `ANALYSE DES DONNÉES - ${new Date().toLocaleString("fr-FR")}\n\nPROMPT UTILISÉ :\n${analysisResult.prompt}\n\nRÉSULTAT DE L'ANALYSE :\n${analysisResult.content}\n\n--- MÉTADONNÉES ---\nTokens utilisés: ${analysisResult.tokens.toLocaleString()}\nCoût: $${(
183
- apiKeyId?.includes("dev") ? 0 : analysisResult.cost
191
+ const content = `ANALYSE DES DONNÉES - ${new Date().toLocaleString("fr-FR")}\n\nPROMPT UTILISÉ :\n${analysisResult.prompt}\n\nRÉSULTAT DE L'ANALYSE :\n${analysisResult.content}\n\n--- MÉTADONNÉES ---\nTokens utilisés: ${analysisResult.tokens.toLocaleString()}\nCoût: $${(apiKeyId?.includes(
192
+ "dev"
193
+ )
194
+ ? 0
195
+ : analysisResult.cost
184
196
  ).toFixed(6)}\nID de requête: ${analysisResult.requestId || "N/A"}`;
185
197
 
186
198
  const blob = new Blob([content], { type: "text/plain;charset=utf-8" });
@@ -206,7 +218,9 @@ export function AiContextButton({
206
218
  onClick={handleOpenPanel}
207
219
  disabled={disabled || loading || !isAuthReady}
208
220
  className={`ai-btn ai-context-btn ${variantClass} ${sizeClass} ${radiusClass} ${className || ""}`}
209
- title={!isAuthReady ? "Authentication required" : "Analyser avec l'IA"}
221
+ title={
222
+ !isAuthReady ? "Authentication required" : "Analyser avec l'IA"
223
+ }
210
224
  >
211
225
  {loading ? (
212
226
  <>
@@ -251,14 +265,21 @@ export function AiContextButton({
251
265
  }
252
266
  }}
253
267
  >
254
- <div className="ai-popover ai-result-modal" onClick={(e) => e.stopPropagation()}>
268
+ <div
269
+ className="ai-popover ai-result-modal"
270
+ onClick={(e) => e.stopPropagation()}
271
+ >
255
272
  <div className="ai-result-header">
256
273
  <div className="ai-row">
257
274
  <FileText size={18} />
258
275
  <h2 className="ai-result-title">{resultModalTitle}</h2>
259
276
  </div>
260
277
  <div className="ai-row">
261
- <button type="button" className={`ai-btn ai-btn--ghost ai-btn--compact ${sizeClass} ${radiusClass}`} onClick={saveToFile}>
278
+ <button
279
+ type="button"
280
+ className={`ai-btn ai-btn--ghost ai-btn--compact ${sizeClass} ${radiusClass}`}
281
+ onClick={saveToFile}
282
+ >
262
283
  <Download size={14} />
263
284
  Sauvegarder
264
285
  </button>
@@ -284,14 +305,18 @@ export function AiContextButton({
284
305
 
285
306
  <div className="ai-result-block">
286
307
  <h3 className="ai-result-subtitle">Résultat</h3>
287
- <div className="ai-result-content">{analysisResult.content}</div>
308
+ <div className="ai-result-content">
309
+ {analysisResult.content}
310
+ </div>
288
311
  </div>
289
312
 
290
313
  <div className="ai-result-meta ai-between">
291
314
  <span>
292
- Coût: ${
293
- (apiKeyId?.includes("dev") ? 0 : analysisResult.cost).toFixed(6)
294
- }
315
+ Coût: $
316
+ {(apiKeyId?.includes("dev")
317
+ ? 0
318
+ : analysisResult.cost
319
+ ).toFixed(6)}
295
320
  </span>
296
321
  <span>ID: {analysisResult.requestId?.slice(-8) || "N/A"}</span>
297
322
  </div>
@@ -300,7 +325,10 @@ export function AiContextButton({
300
325
  </div>
301
326
  ) : null}
302
327
 
303
- <LBSigninModal isOpen={showAuthModal} onClose={() => setShowAuthModal(false)} />
328
+ <LBSigninModal
329
+ isOpen={showAuthModal}
330
+ onClose={() => setShowAuthModal(false)}
331
+ />
304
332
  <ErrorToast key={errorKey} error={errorData} onComplete={clearError} />
305
333
  </>
306
334
  );
@@ -1,5 +1,6 @@
1
1
  "use client";
2
2
 
3
+ import "../styles/register";
3
4
  import { useState, type ButtonHTMLAttributes } from "react";
4
5
  import {
5
6
  ImageIcon,
@@ -1,5 +1,6 @@
1
1
  "use client";
2
2
 
3
+ import "../styles/register";
3
4
  import React, { useState, useRef, type InputHTMLAttributes } from "react";
4
5
  import { Loader2, Lock, Sparkles } from "lucide-react";
5
6
  import type { AiRadius, AiSize, BaseAiProps } from "../types";
@@ -1,5 +1,6 @@
1
1
  "use client";
2
2
 
3
+ import "../styles/register";
3
4
  import React from "react";
4
5
  import type { ModelRef } from "@lastbrain/ai-ui-core";
5
6
 
@@ -1,5 +1,6 @@
1
1
  "use client";
2
2
 
3
+ import "../styles/register";
3
4
  import {
4
5
  useState,
5
6
  useEffect,
@@ -284,7 +285,9 @@ function AiPromptPanelInternal({
284
285
  setSelectedModel("");
285
286
  return;
286
287
  }
287
- const hasSelected = modelOptions.some((model) => model.id === selectedModel);
288
+ const hasSelected = modelOptions.some(
289
+ (model) => model.id === selectedModel
290
+ );
288
291
  if (!hasSelected) {
289
292
  setSelectedModel(modelOptions[0].id);
290
293
  }
@@ -441,7 +444,8 @@ function AiPromptPanelInternal({
441
444
  width: "64px",
442
445
  height: "64px",
443
446
  borderRadius: "999px",
444
- border: "2px solid color-mix(in srgb, var(--ai-primary) 20%, transparent)",
447
+ border:
448
+ "2px solid color-mix(in srgb, var(--ai-primary) 20%, transparent)",
445
449
  borderTopColor: "var(--ai-primary)",
446
450
  animation: "ai-spin 1.1s linear infinite",
447
451
  display: "flex",
@@ -873,12 +877,15 @@ function AiPromptPanelInternal({
873
877
  transition: "all 0.2s",
874
878
  }}
875
879
  onMouseEnter={(e) => {
876
- e.currentTarget.style.background = "color-mix(in srgb, var(--ai-primary) 10%, transparent)";
877
- e.currentTarget.style.borderColor = "var(--ai-primary)";
880
+ e.currentTarget.style.background =
881
+ "color-mix(in srgb, var(--ai-primary) 10%, transparent)";
882
+ e.currentTarget.style.borderColor =
883
+ "var(--ai-primary)";
878
884
  }}
879
885
  onMouseLeave={(e) => {
880
886
  e.currentTarget.style.background = "transparent";
881
- e.currentTarget.style.borderColor = "var(--ai-border)";
887
+ e.currentTarget.style.borderColor =
888
+ "var(--ai-border)";
882
889
  }}
883
890
  >
884
891
  <div
@@ -958,12 +965,15 @@ function AiPromptPanelInternal({
958
965
  transition: "all 0.2s",
959
966
  }}
960
967
  onMouseEnter={(e) => {
961
- e.currentTarget.style.background = "color-mix(in srgb, var(--ai-primary) 10%, transparent)";
962
- e.currentTarget.style.borderColor = "var(--ai-primary)";
968
+ e.currentTarget.style.background =
969
+ "color-mix(in srgb, var(--ai-primary) 10%, transparent)";
970
+ e.currentTarget.style.borderColor =
971
+ "var(--ai-primary)";
963
972
  }}
964
973
  onMouseLeave={(e) => {
965
974
  e.currentTarget.style.background = "transparent";
966
- e.currentTarget.style.borderColor = "var(--ai-border)";
975
+ e.currentTarget.style.borderColor =
976
+ "var(--ai-border)";
967
977
  }}
968
978
  >
969
979
  <div
@@ -1020,10 +1030,7 @@ function AiPromptPanelInternal({
1020
1030
  backdropFilter: "blur(8px)",
1021
1031
  }}
1022
1032
  >
1023
- <button
1024
- onClick={handleClose}
1025
- className="ai-btn ai-btn--ghost"
1026
- >
1033
+ <button onClick={handleClose} className="ai-btn ai-btn--ghost">
1027
1034
  Cancel
1028
1035
  </button>
1029
1036
  <button
@@ -1179,9 +1186,7 @@ function AiPromptPanelInternal({
1179
1186
  />
1180
1187
  <div style={{ flex: 1 }}>
1181
1188
  <div className="ai-model-item-title">
1182
- <span>
1183
- {modelData.name}
1184
- </span>
1189
+ <span>{modelData.name}</span>
1185
1190
  {modelData.isPro && (
1186
1191
  <span className="ai-pill ai-pill--pro">
1187
1192
  PRO
@@ -1,5 +1,6 @@
1
1
  "use client";
2
2
 
3
+ import "../styles/register";
3
4
  import React, { useState, type SelectHTMLAttributes } from "react";
4
5
  import { ChevronDown, Loader2, Lock, Sparkles } from "lucide-react";
5
6
  import type { AiRadius, AiSize, BaseAiProps } from "../types";
@@ -1,5 +1,6 @@
1
1
  "use client";
2
2
 
3
+ import "../styles/register";
3
4
  import { useState, type ButtonHTMLAttributes } from "react";
4
5
  import { useAiStatus } from "../hooks/useAiStatus";
5
6
 
@@ -1,7 +1,8 @@
1
1
  "use client";
2
2
 
3
- import type { AiStatus } from "@lastbrain/ai-ui-core";
4
- import { useLayoutEffect, useMemo, useRef, useState } from "react";
3
+ import "../styles/register";
4
+ import type { AiStatus, LBUser } from "@lastbrain/ai-ui-core";
5
+ import { useLayoutEffect, useMemo, useRef, useState, useContext } from "react";
5
6
  import { createPortal } from "react-dom";
6
7
  import {
7
8
  ArrowRightLeft,
@@ -14,8 +15,13 @@ import {
14
15
  Settings,
15
16
  Shield,
16
17
  } from "lucide-react";
17
- import { useLB } from "../context/LBAuthProvider";
18
- import { useAiContext } from "../context/AiProvider";
18
+ import {
19
+ LBContext,
20
+ type LBApiKey,
21
+ type BasicStatus,
22
+ type StorageStatus,
23
+ } from "../context/LBAuthProvider";
24
+ import { AiContext } from "../context/AiProvider";
19
25
  import { LBApiKeySelector } from "./LBApiKeySelector";
20
26
  import { LBSigninModal } from "./LBSigninModal";
21
27
  import type { AiRadius, AiSize } from "../types";
@@ -149,23 +155,23 @@ export function AiStatusButton({
149
155
  radius = "full",
150
156
  }: AiStatusButtonProps) {
151
157
  let lbStatus: string | undefined;
152
- let user: any;
158
+ let user: LBUser | null = null;
153
159
  let logout: (() => Promise<void>) | undefined;
154
- let apiKeys: any[] = [];
160
+ let apiKeys: LBApiKey[] = [];
155
161
  let switchApiKey: ((apiKeyId: string) => Promise<void>) | undefined;
156
- let lbApiStatus: any = null;
157
- let lbBasicStatus: any = null;
158
- let lbStorageStatus: any = null;
162
+ let lbApiStatus: AiStatus | null = null;
163
+ let lbBasicStatus: BasicStatus | null = null;
164
+ let lbStorageStatus: StorageStatus | null = null;
159
165
  let lbIsLoadingStatus = false;
160
166
  let lbIsLoadingStorage = false;
161
- let lbSelectedKey: any = null;
167
+ let lbSelectedKey: LBApiKey | null = null;
162
168
  let lbRefreshBasicStatus: (() => Promise<void>) | undefined;
163
169
  let lbRefreshStorageStatus: ((force?: boolean) => Promise<void>) | undefined;
164
170
 
165
- try {
166
- const lbContext = useLB();
171
+ const lbContext = useContext(LBContext);
172
+ if (lbContext) {
167
173
  lbStatus = lbContext.status;
168
- user = lbContext.user;
174
+ user = lbContext.user ?? null;
169
175
  logout = lbContext.logout;
170
176
  apiKeys = lbContext.apiKeys || [];
171
177
  switchApiKey = lbContext.switchApiKey;
@@ -177,14 +183,15 @@ export function AiStatusButton({
177
183
  lbSelectedKey = lbContext.selectedKey || null;
178
184
  lbRefreshBasicStatus = lbContext.refreshBasicStatus;
179
185
  lbRefreshStorageStatus = lbContext.refreshStorageStatus;
180
- } catch {
186
+ } else {
181
187
  lbStatus = undefined;
182
188
  }
183
189
 
190
+ const aiContext = useContext(AiContext);
184
191
  let refetchProviders: (() => Promise<void>) | undefined;
185
- try {
186
- refetchProviders = useAiContext().refetchProviders;
187
- } catch {
192
+ if (aiContext) {
193
+ refetchProviders = aiContext.refetchProviders;
194
+ } else {
188
195
  refetchProviders = undefined;
189
196
  }
190
197
 
@@ -214,7 +221,10 @@ export function AiStatusButton({
214
221
  );
215
222
  const requiresApiKeySelection =
216
223
  lbStatus === "ready" && !hasApiKeySelected && apiKeys.length > 0;
217
- const isApiKeyAuthMode = effectiveStatus?.authType === "api_key";
224
+ const isApiKeyAuthMode =
225
+ effectiveStatus &&
226
+ "authType" in effectiveStatus &&
227
+ effectiveStatus.authType === "api_key";
218
228
 
219
229
  const [tooltipStyle, setTooltipStyle] = useState<Record<string, string>>({});
220
230
 
@@ -453,7 +463,11 @@ export function AiStatusButton({
453
463
  <span className="ai-popover-value">
454
464
  {lbIsLoadingStatus
455
465
  ? "..."
456
- : effectiveStatus?.authType || lbStatus || "unknown"}
466
+ : (effectiveStatus &&
467
+ "authType" in effectiveStatus &&
468
+ effectiveStatus.authType) ||
469
+ lbStatus ||
470
+ "unknown"}
457
471
  </span>
458
472
  </div>
459
473
  </div>
@@ -1,5 +1,6 @@
1
1
  "use client";
2
2
 
3
+ import "../styles/register";
3
4
  import React, {
4
5
  useState,
5
6
  useRef,
@@ -197,7 +198,9 @@ export function AiTextarea({
197
198
 
198
199
  return (
199
200
  <div className={`ai-control-group ai-glow ${className || ""}`}>
200
- <div className={`ai-shell ai-shell--textarea ${sizeClass} ${radiusClass}`}>
201
+ <div
202
+ className={`ai-shell ai-shell--textarea ${sizeClass} ${radiusClass}`}
203
+ >
201
204
  <textarea
202
205
  ref={textareaRef}
203
206
  {...textareaProps}
@@ -1,5 +1,6 @@
1
1
  "use client";
2
2
 
3
+ import "../styles/register";
3
4
  import { useEffect, useRef, useState } from "react";
4
5
  import { X, AlertCircle } from "lucide-react";
5
6