@howone/sdk 0.1.19 → 0.1.20

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/index.d.mts CHANGED
@@ -423,19 +423,48 @@ interface LoginFormProps {
423
423
  }
424
424
  declare const LoginForm: React$1.FC<LoginFormProps>;
425
425
 
426
+ type Theme$1 = "dark" | "light" | "system";
426
427
  type AuthContextValue = {
427
428
  user: ReturnType<typeof parseUserFromToken> | null;
428
429
  token: string | null;
429
430
  isAuthenticated: boolean;
430
431
  logout: () => void;
431
432
  };
432
- declare const AuthProvider: React$1.FC<{
433
+ interface HowoneProviderProps {
433
434
  children: React$1.ReactNode;
434
435
  autoRedirect?: boolean;
435
436
  showFloatingButton?: boolean;
436
437
  projectId?: string;
437
- }>;
438
+ /** 主题相关配置 */
439
+ defaultTheme?: Theme$1;
440
+ themeStorageKey?: string;
441
+ /** 如果为 true,将忽略 localStorage 中的值,始终使用 defaultTheme */
442
+ forceDefaultTheme?: boolean;
443
+ }
444
+ /**
445
+ * HowoneProvider - All-in-one application provider
446
+ *
447
+ * Includes:
448
+ * - Authentication management
449
+ * - Theme management (dark/light/system)
450
+ * - Toast notifications
451
+ * - Floating button
452
+ *
453
+ * @example
454
+ * ```tsx
455
+ * <HowoneProvider
456
+ * defaultTheme="dark"
457
+ * themeStorageKey="my-app-theme"
458
+ * showFloatingButton={true}
459
+ * >
460
+ * <App />
461
+ * </HowoneProvider>
462
+ * ```
463
+ */
464
+ declare const HowoneProvider: React$1.FC<HowoneProviderProps>;
438
465
  declare function useAuthContext(): AuthContextValue;
466
+ declare const AuthProvider: React$1.FC<HowoneProviderProps>;
467
+ type AuthProviderProps = HowoneProviderProps;
439
468
 
440
469
  type AuthState = {
441
470
  user: Record<string, unknown> | null;
@@ -504,12 +533,13 @@ type ThemeProviderProps = {
504
533
  children: React.ReactNode;
505
534
  defaultTheme?: Theme;
506
535
  storageKey?: string;
536
+ forceDefault?: boolean;
507
537
  };
508
538
  type ThemeProviderState = {
509
539
  theme: Theme;
510
540
  setTheme: (theme: Theme) => void;
511
541
  };
512
- declare function ThemeProvider({ children, defaultTheme, storageKey, ...props }: ThemeProviderProps): react_jsx_runtime.JSX.Element;
542
+ declare function ThemeProvider({ children, defaultTheme, storageKey, forceDefault, ...props }: ThemeProviderProps): react_jsx_runtime.JSX.Element;
513
543
  declare const useTheme: () => ThemeProviderState;
514
544
 
515
545
  interface ThemeToggleProps {
@@ -543,4 +573,4 @@ declare function useDebounce<T>(value: T, delay: number): T;
543
573
  */
544
574
  declare function injectEarlyErrorHandler(): void;
545
575
 
546
- export { type AIWorkflowClientOptions, type AIWorkflowResponse, AUTH_ROOT, AUTH_TOKEN_KEY, type AccessContext, type Artifact, type ArtifactCreateInput, type ArtifactListQuery, AuthProvider, type AxiosAIWorkflowOptions, ClayxToast, DefaultErrorFallback, type EmailLoginRequest, type EmailLoginResponse, ErrorBoundary, FloatingButton, GlobalToastContainer, Loading, LoadingSpinner, LoginForm, type SendCodeRequest, type SendCodeResponse, ThemeProvider, ThemeToggle, type Visibility, aiRequest, aiWorkflow, canAccessArtifact, createAIWorkflowClient, createAIWorkflowClientAxios, createArtifactsClient, createClient, getAuthRoot, getCodeStatus, getDefaultProjectId, getToken, howone, injectEarlyErrorHandler, isTokenValid, loginWithEmailCode, onAuthStateChanged, parseUserFromToken, request, sendEmailVerificationCode, setAuthRoot, setDefaultProjectId, setToken, unifiedAuth, unifiedOAuth, useAuth, useAuthContext, useDebounce, useIsMobile, useTheme, workflowRequest };
576
+ export { type AIWorkflowClientOptions, type AIWorkflowResponse, AUTH_ROOT, AUTH_TOKEN_KEY, type AccessContext, type Artifact, type ArtifactCreateInput, type ArtifactListQuery, AuthProvider, type AuthProviderProps, type AxiosAIWorkflowOptions, ClayxToast, DefaultErrorFallback, type EmailLoginRequest, type EmailLoginResponse, ErrorBoundary, FloatingButton, GlobalToastContainer, HowoneProvider, type HowoneProviderProps, Loading, LoadingSpinner, LoginForm, type SendCodeRequest, type SendCodeResponse, ThemeProvider, ThemeToggle, type Visibility, aiRequest, aiWorkflow, canAccessArtifact, createAIWorkflowClient, createAIWorkflowClientAxios, createArtifactsClient, createClient, getAuthRoot, getCodeStatus, getDefaultProjectId, getToken, howone, injectEarlyErrorHandler, isTokenValid, loginWithEmailCode, onAuthStateChanged, parseUserFromToken, request, sendEmailVerificationCode, setAuthRoot, setDefaultProjectId, setToken, unifiedAuth, unifiedOAuth, useAuth, useAuthContext, useDebounce, useIsMobile, useTheme, workflowRequest };
package/dist/index.d.ts CHANGED
@@ -423,19 +423,48 @@ interface LoginFormProps {
423
423
  }
424
424
  declare const LoginForm: React$1.FC<LoginFormProps>;
425
425
 
426
+ type Theme$1 = "dark" | "light" | "system";
426
427
  type AuthContextValue = {
427
428
  user: ReturnType<typeof parseUserFromToken> | null;
428
429
  token: string | null;
429
430
  isAuthenticated: boolean;
430
431
  logout: () => void;
431
432
  };
432
- declare const AuthProvider: React$1.FC<{
433
+ interface HowoneProviderProps {
433
434
  children: React$1.ReactNode;
434
435
  autoRedirect?: boolean;
435
436
  showFloatingButton?: boolean;
436
437
  projectId?: string;
437
- }>;
438
+ /** 主题相关配置 */
439
+ defaultTheme?: Theme$1;
440
+ themeStorageKey?: string;
441
+ /** 如果为 true,将忽略 localStorage 中的值,始终使用 defaultTheme */
442
+ forceDefaultTheme?: boolean;
443
+ }
444
+ /**
445
+ * HowoneProvider - All-in-one application provider
446
+ *
447
+ * Includes:
448
+ * - Authentication management
449
+ * - Theme management (dark/light/system)
450
+ * - Toast notifications
451
+ * - Floating button
452
+ *
453
+ * @example
454
+ * ```tsx
455
+ * <HowoneProvider
456
+ * defaultTheme="dark"
457
+ * themeStorageKey="my-app-theme"
458
+ * showFloatingButton={true}
459
+ * >
460
+ * <App />
461
+ * </HowoneProvider>
462
+ * ```
463
+ */
464
+ declare const HowoneProvider: React$1.FC<HowoneProviderProps>;
438
465
  declare function useAuthContext(): AuthContextValue;
466
+ declare const AuthProvider: React$1.FC<HowoneProviderProps>;
467
+ type AuthProviderProps = HowoneProviderProps;
439
468
 
440
469
  type AuthState = {
441
470
  user: Record<string, unknown> | null;
@@ -504,12 +533,13 @@ type ThemeProviderProps = {
504
533
  children: React.ReactNode;
505
534
  defaultTheme?: Theme;
506
535
  storageKey?: string;
536
+ forceDefault?: boolean;
507
537
  };
508
538
  type ThemeProviderState = {
509
539
  theme: Theme;
510
540
  setTheme: (theme: Theme) => void;
511
541
  };
512
- declare function ThemeProvider({ children, defaultTheme, storageKey, ...props }: ThemeProviderProps): react_jsx_runtime.JSX.Element;
542
+ declare function ThemeProvider({ children, defaultTheme, storageKey, forceDefault, ...props }: ThemeProviderProps): react_jsx_runtime.JSX.Element;
513
543
  declare const useTheme: () => ThemeProviderState;
514
544
 
515
545
  interface ThemeToggleProps {
@@ -543,4 +573,4 @@ declare function useDebounce<T>(value: T, delay: number): T;
543
573
  */
544
574
  declare function injectEarlyErrorHandler(): void;
545
575
 
546
- export { type AIWorkflowClientOptions, type AIWorkflowResponse, AUTH_ROOT, AUTH_TOKEN_KEY, type AccessContext, type Artifact, type ArtifactCreateInput, type ArtifactListQuery, AuthProvider, type AxiosAIWorkflowOptions, ClayxToast, DefaultErrorFallback, type EmailLoginRequest, type EmailLoginResponse, ErrorBoundary, FloatingButton, GlobalToastContainer, Loading, LoadingSpinner, LoginForm, type SendCodeRequest, type SendCodeResponse, ThemeProvider, ThemeToggle, type Visibility, aiRequest, aiWorkflow, canAccessArtifact, createAIWorkflowClient, createAIWorkflowClientAxios, createArtifactsClient, createClient, getAuthRoot, getCodeStatus, getDefaultProjectId, getToken, howone, injectEarlyErrorHandler, isTokenValid, loginWithEmailCode, onAuthStateChanged, parseUserFromToken, request, sendEmailVerificationCode, setAuthRoot, setDefaultProjectId, setToken, unifiedAuth, unifiedOAuth, useAuth, useAuthContext, useDebounce, useIsMobile, useTheme, workflowRequest };
576
+ export { type AIWorkflowClientOptions, type AIWorkflowResponse, AUTH_ROOT, AUTH_TOKEN_KEY, type AccessContext, type Artifact, type ArtifactCreateInput, type ArtifactListQuery, AuthProvider, type AuthProviderProps, type AxiosAIWorkflowOptions, ClayxToast, DefaultErrorFallback, type EmailLoginRequest, type EmailLoginResponse, ErrorBoundary, FloatingButton, GlobalToastContainer, HowoneProvider, type HowoneProviderProps, Loading, LoadingSpinner, LoginForm, type SendCodeRequest, type SendCodeResponse, ThemeProvider, ThemeToggle, type Visibility, aiRequest, aiWorkflow, canAccessArtifact, createAIWorkflowClient, createAIWorkflowClientAxios, createArtifactsClient, createClient, getAuthRoot, getCodeStatus, getDefaultProjectId, getToken, howone, injectEarlyErrorHandler, isTokenValid, loginWithEmailCode, onAuthStateChanged, parseUserFromToken, request, sendEmailVerificationCode, setAuthRoot, setDefaultProjectId, setToken, unifiedAuth, unifiedOAuth, useAuth, useAuthContext, useDebounce, useIsMobile, useTheme, workflowRequest };
package/dist/index.js CHANGED
@@ -241,6 +241,7 @@ __export(index_exports, {
241
241
  ErrorBoundary: () => ErrorBoundary,
242
242
  FloatingButton: () => FloatingButton,
243
243
  GlobalToastContainer: () => GlobalToastContainer,
244
+ HowoneProvider: () => HowoneProvider,
244
245
  Loading: () => Loading,
245
246
  LoadingSpinner: () => LoadingSpinner,
246
247
  LoginForm: () => LoginForm,
@@ -292,7 +293,7 @@ var FloatingButton = ({
292
293
  {
293
294
  onClick,
294
295
  id: "floating-howone-btn",
295
- className: `fixed flex bg-white dark:bg-gray-800 gap-2 items-center right-4 z-50 text-black dark:text-white px-3 py-2 rounded-lg shadow-lg transition-colors duration-200 border border-gray-200 dark:border-gray-700 ${className}`,
296
+ className: `fixed flex bg-background gap-2 items-center right-4 z-50 text-black dark:text-white px-3 py-2 rounded-lg shadow-lg transition-colors duration-200 border border-gray-200 dark:border-gray-700 ${className}`,
296
297
  style: {
297
298
  fontSize: "14px",
298
299
  fontWeight: "bold",
@@ -1558,13 +1559,87 @@ var LoginForm = ({
1558
1559
  };
1559
1560
 
1560
1561
  // src/components/auth/AuthProvider.tsx
1561
- var import_react4 = require("react");
1562
+ var import_react5 = require("react");
1562
1563
  init_auth();
1564
+
1565
+ // src/components/theme/ThemeProvider.tsx
1566
+ var import_react4 = require("react");
1563
1567
  var import_jsx_runtime3 = require("react/jsx-runtime");
1564
- var AuthContext = (0, import_react4.createContext)(null);
1565
- var AuthProvider = ({ children, showFloatingButton = true }) => {
1566
- const [user, setUser] = (0, import_react4.useState)(() => parseUserFromToken(getToken()));
1567
- const [token, setTokenState] = (0, import_react4.useState)(() => getToken());
1568
+ var initialState = {
1569
+ theme: "system",
1570
+ setTheme: () => null
1571
+ };
1572
+ var ThemeProviderContext = (0, import_react4.createContext)(initialState);
1573
+ function ThemeProvider({
1574
+ children,
1575
+ defaultTheme = "system",
1576
+ storageKey = "vite-ui-theme",
1577
+ forceDefault = false,
1578
+ ...props
1579
+ }) {
1580
+ const [theme, setTheme] = (0, import_react4.useState)(() => {
1581
+ if (forceDefault) {
1582
+ localStorage.setItem(storageKey, defaultTheme);
1583
+ return defaultTheme;
1584
+ }
1585
+ const stored = localStorage.getItem(storageKey);
1586
+ const initialTheme = stored || defaultTheme;
1587
+ if (!stored) {
1588
+ localStorage.setItem(storageKey, defaultTheme);
1589
+ }
1590
+ return initialTheme;
1591
+ });
1592
+ (0, import_react4.useEffect)(() => {
1593
+ const root = window.document.documentElement;
1594
+ root.classList.remove("light", "dark");
1595
+ if (theme === "system") {
1596
+ const systemTheme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
1597
+ root.classList.add(systemTheme);
1598
+ return;
1599
+ }
1600
+ root.classList.add(theme);
1601
+ }, [theme]);
1602
+ const value = {
1603
+ theme,
1604
+ setTheme: (theme2) => {
1605
+ localStorage.setItem(storageKey, theme2);
1606
+ setTheme(theme2);
1607
+ }
1608
+ };
1609
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(ThemeProviderContext.Provider, { ...props, value, children });
1610
+ }
1611
+ var useTheme = () => {
1612
+ const context = (0, import_react4.useContext)(ThemeProviderContext);
1613
+ if (context === void 0)
1614
+ throw new Error("useTheme must be used within a ThemeProvider");
1615
+ return context;
1616
+ };
1617
+
1618
+ // src/components/ui/Toast/GlobalToastContainer.tsx
1619
+ var import_react_toastify = require("react-toastify");
1620
+ var import_jsx_runtime4 = require("react/jsx-runtime");
1621
+ function GlobalToastContainer() {
1622
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1623
+ import_react_toastify.ToastContainer,
1624
+ {
1625
+ newestOnTop: false,
1626
+ closeButton: false
1627
+ }
1628
+ );
1629
+ }
1630
+
1631
+ // src/components/auth/AuthProvider.tsx
1632
+ var import_jsx_runtime5 = require("react/jsx-runtime");
1633
+ var AuthContext = (0, import_react5.createContext)(null);
1634
+ var HowoneProvider = ({
1635
+ children,
1636
+ showFloatingButton = true,
1637
+ defaultTheme = "system",
1638
+ themeStorageKey = "howone-theme",
1639
+ forceDefaultTheme = false
1640
+ }) => {
1641
+ const [user, setUser] = (0, import_react5.useState)(() => parseUserFromToken(getToken()));
1642
+ const [token, setTokenState] = (0, import_react5.useState)(() => getToken());
1568
1643
  const logout = () => {
1569
1644
  try {
1570
1645
  setToken(null);
@@ -1579,13 +1654,24 @@ var AuthProvider = ({ children, showFloatingButton = true }) => {
1579
1654
  isAuthenticated: !!token,
1580
1655
  logout
1581
1656
  };
1582
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(AuthContext.Provider, { value, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_jsx_runtime3.Fragment, { children: [
1583
- children,
1584
- showFloatingButton && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(FloatingButton, { onClick: () => window.open("https://howone.ai", "_blank") })
1585
- ] }) });
1657
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
1658
+ ThemeProvider,
1659
+ {
1660
+ defaultTheme,
1661
+ storageKey: themeStorageKey,
1662
+ forceDefault: forceDefaultTheme,
1663
+ children: [
1664
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(AuthContext.Provider, { value, children: [
1665
+ children,
1666
+ showFloatingButton && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(FloatingButton, { onClick: () => window.open("https://howone.ai", "_blank") })
1667
+ ] }),
1668
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(GlobalToastContainer, {})
1669
+ ]
1670
+ }
1671
+ );
1586
1672
  };
1587
1673
  function useAuthContext() {
1588
- const ctx = (0, import_react4.useContext)(AuthContext);
1674
+ const ctx = (0, import_react5.useContext)(AuthContext);
1589
1675
  if (!ctx) {
1590
1676
  const t = getToken();
1591
1677
  return {
@@ -1602,6 +1688,7 @@ function useAuthContext() {
1602
1688
  }
1603
1689
  return ctx;
1604
1690
  }
1691
+ var AuthProvider = HowoneProvider;
1605
1692
 
1606
1693
  // src/components/index.ts
1607
1694
  init_auth();
@@ -1689,7 +1776,7 @@ var howone = {
1689
1776
  var client_default = howone;
1690
1777
 
1691
1778
  // src/components/ui/Loading.tsx
1692
- var import_jsx_runtime4 = require("react/jsx-runtime");
1779
+ var import_jsx_runtime6 = require("react/jsx-runtime");
1693
1780
  var Loading = ({
1694
1781
  size = "md",
1695
1782
  text = "Loading...",
@@ -1702,14 +1789,14 @@ var Loading = ({
1702
1789
  lg: "h-12 w-12"
1703
1790
  };
1704
1791
  const containerClasses = fullScreen ? "fixed inset-0 flex items-center justify-center bg-white/80 backdrop-blur-sm z-50" : "flex items-center justify-center p-4";
1705
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: `${containerClasses} ${className}`, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "text-center", children: [
1706
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1792
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: `${containerClasses} ${className}`, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "text-center", children: [
1793
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1707
1794
  "div",
1708
1795
  {
1709
1796
  className: `animate-spin rounded-full border-2 border-gray-300 border-t-blue-600 mx-auto ${sizeClasses[size]}`
1710
1797
  }
1711
1798
  ),
1712
- text && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("p", { className: "mt-2 text-sm text-gray-600", children: text })
1799
+ text && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mt-2 text-sm text-gray-600", children: text })
1713
1800
  ] }) });
1714
1801
  };
1715
1802
  var LoadingSpinner = ({
@@ -1721,7 +1808,7 @@ var LoadingSpinner = ({
1721
1808
  md: "h-8 w-8",
1722
1809
  lg: "h-12 w-12"
1723
1810
  };
1724
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1811
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1725
1812
  "div",
1726
1813
  {
1727
1814
  className: `animate-spin rounded-full border-2 border-gray-300 border-t-blue-600 ${sizeClasses[size]} ${className}`
@@ -1730,9 +1817,9 @@ var LoadingSpinner = ({
1730
1817
  };
1731
1818
 
1732
1819
  // src/components/ui/ErrorBoundary.tsx
1733
- var import_react5 = require("react");
1734
- var import_jsx_runtime5 = require("react/jsx-runtime");
1735
- var ErrorBoundary = class extends import_react5.Component {
1820
+ var import_react6 = require("react");
1821
+ var import_jsx_runtime7 = require("react/jsx-runtime");
1822
+ var ErrorBoundary = class extends import_react6.Component {
1736
1823
  constructor(props) {
1737
1824
  super(props);
1738
1825
  this.handleRetry = () => {
@@ -1754,13 +1841,13 @@ var ErrorBoundary = class extends import_react5.Component {
1754
1841
  if (this.state.hasError) {
1755
1842
  if (this.props.fallback) {
1756
1843
  const FallbackComponent = this.props.fallback;
1757
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(FallbackComponent, { error: this.state.error, retry: this.handleRetry });
1844
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(FallbackComponent, { error: this.state.error, retry: this.handleRetry });
1758
1845
  }
1759
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "min-h-[400px] flex items-center justify-center p-4", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "text-center max-w-md", children: [
1760
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "text-red-500 text-6xl mb-4", children: "\u26A0\uFE0F" }),
1761
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("h2", { className: "text-xl font-semibold text-gray-900 mb-2", children: "Something went wrong" }),
1762
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "text-gray-600 mb-4", children: "An unexpected error occurred. Please try refreshing the page." }),
1763
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1846
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "min-h-[400px] flex items-center justify-center p-4", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "text-center max-w-md", children: [
1847
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "text-red-500 text-6xl mb-4", children: "\u26A0\uFE0F" }),
1848
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("h2", { className: "text-xl font-semibold text-gray-900 mb-2", children: "Something went wrong" }),
1849
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { className: "text-gray-600 mb-4", children: "An unexpected error occurred. Please try refreshing the page." }),
1850
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
1764
1851
  "button",
1765
1852
  {
1766
1853
  onClick: this.handleRetry,
@@ -1774,10 +1861,10 @@ var ErrorBoundary = class extends import_react5.Component {
1774
1861
  return this.props.children;
1775
1862
  }
1776
1863
  };
1777
- var DefaultErrorFallback = ({ retry }) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "min-h-[200px] flex items-center justify-center p-4", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "text-center", children: [
1778
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "text-red-500 text-4xl mb-2", children: "\u26A0\uFE0F" }),
1779
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "text-gray-600 mb-2", children: "Something went wrong" }),
1780
- retry && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1864
+ var DefaultErrorFallback = ({ retry }) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "min-h-[200px] flex items-center justify-center p-4", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "text-center", children: [
1865
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "text-red-500 text-4xl mb-2", children: "\u26A0\uFE0F" }),
1866
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { className: "text-gray-600 mb-2", children: "Something went wrong" }),
1867
+ retry && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
1781
1868
  "button",
1782
1869
  {
1783
1870
  onClick: retry,
@@ -1787,54 +1874,11 @@ var DefaultErrorFallback = ({ retry }) => /* @__PURE__ */ (0, import_jsx_runtime
1787
1874
  )
1788
1875
  ] }) });
1789
1876
 
1790
- // src/components/theme/ThemeProvider.tsx
1791
- var import_react6 = require("react");
1792
- var import_jsx_runtime6 = require("react/jsx-runtime");
1793
- var initialState = {
1794
- theme: "system",
1795
- setTheme: () => null
1796
- };
1797
- var ThemeProviderContext = (0, import_react6.createContext)(initialState);
1798
- function ThemeProvider({
1799
- children,
1800
- defaultTheme = "system",
1801
- storageKey = "vite-ui-theme",
1802
- ...props
1803
- }) {
1804
- const [theme, setTheme] = (0, import_react6.useState)(
1805
- () => localStorage.getItem(storageKey) || defaultTheme
1806
- );
1807
- (0, import_react6.useEffect)(() => {
1808
- const root = window.document.documentElement;
1809
- root.classList.remove("light", "dark");
1810
- if (theme === "system") {
1811
- const systemTheme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
1812
- root.classList.add(systemTheme);
1813
- return;
1814
- }
1815
- root.classList.add(theme);
1816
- }, [theme]);
1817
- const value = {
1818
- theme,
1819
- setTheme: (theme2) => {
1820
- localStorage.setItem(storageKey, theme2);
1821
- setTheme(theme2);
1822
- }
1823
- };
1824
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ThemeProviderContext.Provider, { ...props, value, children });
1825
- }
1826
- var useTheme = () => {
1827
- const context = (0, import_react6.useContext)(ThemeProviderContext);
1828
- if (context === void 0)
1829
- throw new Error("useTheme must be used within a ThemeProvider");
1830
- return context;
1831
- };
1832
-
1833
1877
  // src/components/theme/ThemeToggle.tsx
1834
1878
  var React4 = __toESM(require("react"));
1835
1879
  var import_next_themes = require("next-themes");
1836
1880
  var import_react7 = require("@iconify/react");
1837
- var import_jsx_runtime7 = require("react/jsx-runtime");
1881
+ var import_jsx_runtime8 = require("react/jsx-runtime");
1838
1882
  function ThemeToggle({ className }) {
1839
1883
  const { setTheme, theme } = (0, import_next_themes.useTheme)();
1840
1884
  const [mounted, setMounted] = React4.useState(false);
@@ -1842,44 +1886,31 @@ function ThemeToggle({ className }) {
1842
1886
  setMounted(true);
1843
1887
  }, []);
1844
1888
  if (!mounted) {
1845
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
1889
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
1846
1890
  "button",
1847
1891
  {
1848
1892
  className: `relative inline-flex h-10 w-12 items-center justify-center rounded-md border border-input bg-background hover:bg-accent hover:text-accent-foreground ${className || ""}`,
1849
1893
  disabled: true,
1850
1894
  children: [
1851
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_react7.Icon, { icon: "solar:sun-2-linear", width: 20, height: 20 }),
1852
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "sr-only", children: "Toggle theme" })
1895
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_react7.Icon, { icon: "solar:sun-2-linear", width: 20, height: 20 }),
1896
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: "sr-only", children: "Toggle theme" })
1853
1897
  ]
1854
1898
  }
1855
1899
  );
1856
1900
  }
1857
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
1901
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
1858
1902
  "button",
1859
1903
  {
1860
1904
  className: `inline-flex h-10 w-12 items-center justify-center rounded-md border border-input bg-background hover:bg-accent hover:text-accent-foreground transition-colors ${className || ""}`,
1861
1905
  onClick: () => setTheme(theme === "light" ? "dark" : "light"),
1862
1906
  children: [
1863
- theme === "light" ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_react7.Icon, { icon: "solar:sun-2-linear", width: 20, height: 20 }) : /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_react7.Icon, { icon: "solar:moon-linear", width: 20, height: 20 }),
1864
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "sr-only", children: "Toggle theme" })
1907
+ theme === "light" ? /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_react7.Icon, { icon: "solar:sun-2-linear", width: 20, height: 20 }) : /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_react7.Icon, { icon: "solar:moon-linear", width: 20, height: 20 }),
1908
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: "sr-only", children: "Toggle theme" })
1865
1909
  ]
1866
1910
  }
1867
1911
  );
1868
1912
  }
1869
1913
 
1870
- // src/components/ui/Toast/GlobalToastContainer.tsx
1871
- var import_react_toastify = require("react-toastify");
1872
- var import_jsx_runtime8 = require("react/jsx-runtime");
1873
- function GlobalToastContainer() {
1874
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1875
- import_react_toastify.ToastContainer,
1876
- {
1877
- newestOnTop: false,
1878
- closeButton: false
1879
- }
1880
- );
1881
- }
1882
-
1883
1914
  // src/components/ui/Toast/ClayxToast.tsx
1884
1915
  var import_react8 = __toESM(require("react"));
1885
1916
  var import_react_toastify2 = require("react-toastify");
@@ -2425,6 +2456,7 @@ init_config();
2425
2456
  ErrorBoundary,
2426
2457
  FloatingButton,
2427
2458
  GlobalToastContainer,
2459
+ HowoneProvider,
2428
2460
  Loading,
2429
2461
  LoadingSpinner,
2430
2462
  LoginForm,