@mesob/auth-react 0.0.8 → 0.1.0

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 (75) hide show
  1. package/dist/components/auth/auth-page-layout.d.ts +1 -3
  2. package/dist/components/auth/auth-page-layout.js +1 -17
  3. package/dist/components/auth/auth-page-layout.js.map +1 -1
  4. package/dist/components/auth/countdown.js +70 -9
  5. package/dist/components/auth/countdown.js.map +1 -1
  6. package/dist/components/auth/forgot-password.js +101 -35
  7. package/dist/components/auth/forgot-password.js.map +1 -1
  8. package/dist/components/auth/pages/forgot-password-page.d.ts +2 -13
  9. package/dist/components/auth/pages/forgot-password-page.js +198 -126
  10. package/dist/components/auth/pages/forgot-password-page.js.map +1 -1
  11. package/dist/components/auth/pages/reset-password-page.d.ts +1 -12
  12. package/dist/components/auth/pages/reset-password-page.js +288 -200
  13. package/dist/components/auth/pages/reset-password-page.js.map +1 -1
  14. package/dist/components/auth/pages/sign-in-page.d.ts +1 -12
  15. package/dist/components/auth/pages/sign-in-page.js +352 -230
  16. package/dist/components/auth/pages/sign-in-page.js.map +1 -1
  17. package/dist/components/auth/pages/sign-up-page.d.ts +1 -11
  18. package/dist/components/auth/pages/sign-up-page.js +310 -216
  19. package/dist/components/auth/pages/sign-up-page.js.map +1 -1
  20. package/dist/components/auth/pages/verify-email-page.d.ts +2 -12
  21. package/dist/components/auth/pages/verify-email-page.js +203 -135
  22. package/dist/components/auth/pages/verify-email-page.js.map +1 -1
  23. package/dist/components/auth/pages/verify-phone-page.d.ts +1 -11
  24. package/dist/components/auth/pages/verify-phone-page.js +206 -137
  25. package/dist/components/auth/pages/verify-phone-page.js.map +1 -1
  26. package/dist/components/auth/reset-password-form.d.ts +1 -1
  27. package/dist/components/auth/reset-password-form.js +188 -106
  28. package/dist/components/auth/reset-password-form.js.map +1 -1
  29. package/dist/components/auth/sign-in.d.ts +3 -3
  30. package/dist/components/auth/sign-in.js +228 -109
  31. package/dist/components/auth/sign-in.js.map +1 -1
  32. package/dist/components/auth/sign-up.js +210 -122
  33. package/dist/components/auth/sign-up.js.map +1 -1
  34. package/dist/components/auth/verification-form.d.ts +1 -1
  35. package/dist/components/auth/verification-form.js +101 -53
  36. package/dist/components/auth/verification-form.js.map +1 -1
  37. package/dist/components/error-boundary.d.ts +27 -0
  38. package/dist/components/error-boundary.js +49 -0
  39. package/dist/components/error-boundary.js.map +1 -0
  40. package/dist/components/iam/permissions/permissions-page.d.ts +5 -0
  41. package/dist/components/iam/permissions/permissions-page.js +201 -0
  42. package/dist/components/iam/permissions/permissions-page.js.map +1 -0
  43. package/dist/components/iam/roles/roles-page.d.ts +5 -0
  44. package/dist/components/iam/roles/roles-page.js +199 -0
  45. package/dist/components/iam/roles/roles-page.js.map +1 -0
  46. package/dist/components/iam/sessions/sessions-page.d.ts +5 -0
  47. package/dist/components/iam/sessions/sessions-page.js +202 -0
  48. package/dist/components/iam/sessions/sessions-page.js.map +1 -0
  49. package/dist/components/iam/tenants/tenants-page.d.ts +5 -0
  50. package/dist/components/iam/tenants/tenants-page.js +202 -0
  51. package/dist/components/iam/tenants/tenants-page.js.map +1 -0
  52. package/dist/components/iam/users/users-page.d.ts +5 -0
  53. package/dist/components/iam/users/users-page.js +211 -0
  54. package/dist/components/iam/users/users-page.js.map +1 -0
  55. package/dist/components/profile/profile-page.d.ts +8 -0
  56. package/dist/components/profile/profile-page.js +163 -0
  57. package/dist/components/profile/profile-page.js.map +1 -0
  58. package/dist/components/shared/data-table/data-table.d.ts +22 -0
  59. package/dist/components/shared/data-table/data-table.js +85 -0
  60. package/dist/components/shared/data-table/data-table.js.map +1 -0
  61. package/dist/components/skeletons/auth-form-skeleton.d.ts +5 -0
  62. package/dist/components/skeletons/auth-form-skeleton.js +32 -0
  63. package/dist/components/skeletons/auth-form-skeleton.js.map +1 -0
  64. package/dist/components/skeletons/profile-skeleton.d.ts +5 -0
  65. package/dist/components/skeletons/profile-skeleton.js +33 -0
  66. package/dist/components/skeletons/profile-skeleton.js.map +1 -0
  67. package/dist/components/skeletons/table-skeleton.d.ts +9 -0
  68. package/dist/components/skeletons/table-skeleton.js +39 -0
  69. package/dist/components/skeletons/table-skeleton.js.map +1 -0
  70. package/dist/handle-error-BqDMxnQZ.d.ts +8 -0
  71. package/dist/index.d.ts +75 -208
  72. package/dist/index.js +2091 -1057
  73. package/dist/index.js.map +1 -1
  74. package/package.json +9 -3
  75. package/dist/handle-error-H0iqQxJ5.d.ts +0 -6
@@ -0,0 +1,163 @@
1
+ "use client";
2
+
3
+ // src/components/profile/profile-page.tsx
4
+ import { Button } from "@mesob/ui/components/button";
5
+ import {
6
+ Card,
7
+ CardContent,
8
+ CardDescription,
9
+ CardHeader,
10
+ CardTitle
11
+ } from "@mesob/ui/components/card";
12
+ import { Separator } from "@mesob/ui/components/separator";
13
+
14
+ // src/provider.tsx
15
+ import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
16
+ import { deepmerge } from "deepmerge-ts";
17
+ import createFetchClient from "openapi-fetch";
18
+ import createClient from "openapi-react-query";
19
+ import { createContext, useContext, useEffect, useState } from "react";
20
+ import { jsx } from "react/jsx-runtime";
21
+ var SessionContext = createContext(null);
22
+ var ApiContext = createContext(null);
23
+ var ConfigContext = createContext(null);
24
+ var queryClient = new QueryClient({
25
+ defaultOptions: {
26
+ queries: {
27
+ staleTime: 1e3 * 60 * 5,
28
+ gcTime: 1e3 * 60 * 10,
29
+ retry: 1,
30
+ refetchOnWindowFocus: false
31
+ }
32
+ }
33
+ });
34
+ function useSession() {
35
+ const context = useContext(SessionContext);
36
+ if (!context) {
37
+ throw new Error("useSession must be used within MesobAuthProvider");
38
+ }
39
+ return context;
40
+ }
41
+
42
+ // src/components/skeletons/profile-skeleton.tsx
43
+ import { Skeleton } from "@mesob/ui/components/skeleton";
44
+ import { jsx as jsx2, jsxs } from "react/jsx-runtime";
45
+ function ProfileSkeleton() {
46
+ return /* @__PURE__ */ jsxs("div", { className: "w-full max-w-4xl space-y-8 p-6", children: [
47
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-6", children: [
48
+ /* @__PURE__ */ jsx2(Skeleton, { className: "h-24 w-24 rounded-full" }),
49
+ /* @__PURE__ */ jsxs("div", { className: "space-y-2 flex-1", children: [
50
+ /* @__PURE__ */ jsx2(Skeleton, { className: "h-8 w-48" }),
51
+ /* @__PURE__ */ jsx2(Skeleton, { className: "h-4 w-64" })
52
+ ] })
53
+ ] }),
54
+ /* @__PURE__ */ jsx2("div", { className: "space-y-6", children: [1, 2, 3].map((i) => /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
55
+ /* @__PURE__ */ jsx2(Skeleton, { className: "h-6 w-32" }),
56
+ /* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
57
+ /* @__PURE__ */ jsxs("div", { className: "flex justify-between items-center", children: [
58
+ /* @__PURE__ */ jsx2(Skeleton, { className: "h-4 w-24" }),
59
+ /* @__PURE__ */ jsx2(Skeleton, { className: "h-4 w-32" })
60
+ ] }),
61
+ /* @__PURE__ */ jsxs("div", { className: "flex justify-between items-center", children: [
62
+ /* @__PURE__ */ jsx2(Skeleton, { className: "h-4 w-24" }),
63
+ /* @__PURE__ */ jsx2(Skeleton, { className: "h-4 w-40" })
64
+ ] })
65
+ ] })
66
+ ] }, i)) })
67
+ ] });
68
+ }
69
+
70
+ // src/components/profile/profile-page.tsx
71
+ import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
72
+ function ProfilePage({ onEditClick }) {
73
+ const { user, isLoading } = useSession();
74
+ if (isLoading) {
75
+ return /* @__PURE__ */ jsx3(ProfileSkeleton, {});
76
+ }
77
+ if (!user) {
78
+ return /* @__PURE__ */ jsx3("div", { className: "flex items-center justify-center min-h-[400px]", children: /* @__PURE__ */ jsx3("p", { className: "text-muted-foreground", children: "Not authenticated" }) });
79
+ }
80
+ return /* @__PURE__ */ jsxs2("div", { className: "w-full max-w-4xl mx-auto space-y-6 p-6", children: [
81
+ /* @__PURE__ */ jsxs2("div", { className: "flex items-center justify-between", children: [
82
+ /* @__PURE__ */ jsxs2("div", { children: [
83
+ /* @__PURE__ */ jsx3("h1", { className: "text-3xl font-bold", children: user.fullName }),
84
+ /* @__PURE__ */ jsxs2("p", { className: "text-muted-foreground", children: [
85
+ "@",
86
+ user.handle
87
+ ] })
88
+ ] }),
89
+ onEditClick && /* @__PURE__ */ jsx3(Button, { onClick: onEditClick, children: "Edit Profile" })
90
+ ] }),
91
+ /* @__PURE__ */ jsx3(Separator, {}),
92
+ /* @__PURE__ */ jsxs2("div", { className: "grid gap-6 md:grid-cols-2", children: [
93
+ /* @__PURE__ */ jsxs2(Card, { children: [
94
+ /* @__PURE__ */ jsxs2(CardHeader, { children: [
95
+ /* @__PURE__ */ jsx3(CardTitle, { children: "Contact Information" }),
96
+ /* @__PURE__ */ jsx3(CardDescription, { children: "Your contact details" })
97
+ ] }),
98
+ /* @__PURE__ */ jsxs2(CardContent, { className: "space-y-4", children: [
99
+ /* @__PURE__ */ jsxs2("div", { children: [
100
+ /* @__PURE__ */ jsx3("p", { className: "text-sm font-medium text-muted-foreground", children: "Email" }),
101
+ /* @__PURE__ */ jsxs2("p", { className: "text-sm", children: [
102
+ user.email || "Not provided",
103
+ user.email && /* @__PURE__ */ jsx3(
104
+ "span",
105
+ {
106
+ className: user.emailVerified ? "text-green-600 ml-2" : "text-yellow-600 ml-2",
107
+ children: user.emailVerified ? "(Verified)" : "(Not verified)"
108
+ }
109
+ )
110
+ ] })
111
+ ] }),
112
+ /* @__PURE__ */ jsxs2("div", { children: [
113
+ /* @__PURE__ */ jsx3("p", { className: "text-sm font-medium text-muted-foreground", children: "Phone" }),
114
+ /* @__PURE__ */ jsxs2("p", { className: "text-sm", children: [
115
+ user.phone || "Not provided",
116
+ user.phone && /* @__PURE__ */ jsx3(
117
+ "span",
118
+ {
119
+ className: user.phoneVerified ? "text-green-600 ml-2" : "text-yellow-600 ml-2",
120
+ children: user.phoneVerified ? "(Verified)" : "(Not verified)"
121
+ }
122
+ )
123
+ ] })
124
+ ] })
125
+ ] })
126
+ ] }),
127
+ /* @__PURE__ */ jsxs2(Card, { children: [
128
+ /* @__PURE__ */ jsxs2(CardHeader, { children: [
129
+ /* @__PURE__ */ jsx3(CardTitle, { children: "Account Information" }),
130
+ /* @__PURE__ */ jsx3(CardDescription, { children: "Your account details" })
131
+ ] }),
132
+ /* @__PURE__ */ jsxs2(CardContent, { className: "space-y-4", children: [
133
+ /* @__PURE__ */ jsxs2("div", { children: [
134
+ /* @__PURE__ */ jsx3("p", { className: "text-sm font-medium text-muted-foreground", children: "Tenant ID" }),
135
+ /* @__PURE__ */ jsx3("p", { className: "text-sm font-mono", children: user.tenantId })
136
+ ] }),
137
+ /* @__PURE__ */ jsxs2("div", { children: [
138
+ /* @__PURE__ */ jsx3("p", { className: "text-sm font-medium text-muted-foreground", children: "Last Sign In" }),
139
+ /* @__PURE__ */ jsx3("p", { className: "text-sm", children: user.lastSignInAt ? new Date(user.lastSignInAt).toLocaleString() : "Never" })
140
+ ] })
141
+ ] })
142
+ ] }),
143
+ user.userRoles && user.userRoles.length > 0 && /* @__PURE__ */ jsxs2(Card, { className: "md:col-span-2", children: [
144
+ /* @__PURE__ */ jsxs2(CardHeader, { children: [
145
+ /* @__PURE__ */ jsx3(CardTitle, { children: "Roles" }),
146
+ /* @__PURE__ */ jsx3(CardDescription, { children: "Your assigned roles" })
147
+ ] }),
148
+ /* @__PURE__ */ jsx3(CardContent, { children: /* @__PURE__ */ jsx3("div", { className: "flex flex-wrap gap-2", children: user.userRoles.map((role) => /* @__PURE__ */ jsx3(
149
+ "div",
150
+ {
151
+ className: "px-3 py-1 bg-primary/10 text-primary rounded-full text-sm",
152
+ children: role.name
153
+ },
154
+ role.id
155
+ )) }) })
156
+ ] })
157
+ ] })
158
+ ] });
159
+ }
160
+ export {
161
+ ProfilePage
162
+ };
163
+ //# sourceMappingURL=profile-page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/profile/profile-page.tsx","../../../src/provider.tsx","../../../src/components/skeletons/profile-skeleton.tsx"],"sourcesContent":["'use client';\n\nimport { Button } from '@mesob/ui/components/button';\nimport {\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from '@mesob/ui/components/card';\nimport { Separator } from '@mesob/ui/components/separator';\nimport { useSession } from '../../provider';\nimport { ProfileSkeleton } from '../skeletons/profile-skeleton';\n\ntype ProfilePageProps = {\n onEditClick?: () => void;\n};\n\nexport function ProfilePage({ onEditClick }: ProfilePageProps) {\n const { user, isLoading } = useSession();\n\n if (isLoading) {\n return <ProfileSkeleton />;\n }\n\n if (!user) {\n return (\n <div className=\"flex items-center justify-center min-h-[400px]\">\n <p className=\"text-muted-foreground\">Not authenticated</p>\n </div>\n );\n }\n\n return (\n <div className=\"w-full max-w-4xl mx-auto space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-3xl font-bold\">{user.fullName}</h1>\n <p className=\"text-muted-foreground\">@{user.handle}</p>\n </div>\n {onEditClick && <Button onClick={onEditClick}>Edit Profile</Button>}\n </div>\n\n <Separator />\n\n <div className=\"grid gap-6 md:grid-cols-2\">\n <Card>\n <CardHeader>\n <CardTitle>Contact Information</CardTitle>\n <CardDescription>Your contact details</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div>\n <p className=\"text-sm font-medium text-muted-foreground\">Email</p>\n <p className=\"text-sm\">\n {user.email || 'Not provided'}\n {user.email && (\n <span\n className={\n user.emailVerified\n ? 'text-green-600 ml-2'\n : 'text-yellow-600 ml-2'\n }\n >\n {user.emailVerified ? '(Verified)' : '(Not verified)'}\n </span>\n )}\n </p>\n </div>\n <div>\n <p className=\"text-sm font-medium text-muted-foreground\">Phone</p>\n <p className=\"text-sm\">\n {user.phone || 'Not provided'}\n {user.phone && (\n <span\n className={\n user.phoneVerified\n ? 'text-green-600 ml-2'\n : 'text-yellow-600 ml-2'\n }\n >\n {user.phoneVerified ? '(Verified)' : '(Not verified)'}\n </span>\n )}\n </p>\n </div>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Account Information</CardTitle>\n <CardDescription>Your account details</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div>\n <p className=\"text-sm font-medium text-muted-foreground\">\n Tenant ID\n </p>\n <p className=\"text-sm font-mono\">{user.tenantId}</p>\n </div>\n <div>\n <p className=\"text-sm font-medium text-muted-foreground\">\n Last Sign In\n </p>\n <p className=\"text-sm\">\n {user.lastSignInAt\n ? new Date(user.lastSignInAt).toLocaleString()\n : 'Never'}\n </p>\n </div>\n </CardContent>\n </Card>\n\n {user.userRoles && user.userRoles.length > 0 && (\n <Card className=\"md:col-span-2\">\n <CardHeader>\n <CardTitle>Roles</CardTitle>\n <CardDescription>Your assigned roles</CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"flex flex-wrap gap-2\">\n {user.userRoles.map((role) => (\n <div\n key={role.id}\n className=\"px-3 py-1 bg-primary/10 text-primary rounded-full text-sm\"\n >\n {role.name}\n </div>\n ))}\n </div>\n </CardContent>\n </Card>\n )}\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { deepmerge } from 'deepmerge-ts';\nimport createFetchClient from 'openapi-fetch';\nimport createClient from 'openapi-react-query';\nimport type { ReactNode } from 'react';\nimport { createContext, useContext, useEffect, useState } from 'react';\nimport type { paths } from './data/openapi';\nimport { createTranslator } from './lib/translations';\nimport {\n type AuthClientConfig,\n type AuthResponse,\n defaultAuthClientConfig,\n type Session,\n type User,\n} from './types';\nimport { createCustomFetch } from './utils/custom-fetch';\n\ntype OpenApiHooks = any;\n\ntype SessionState = {\n user: User | null;\n session: Session | null;\n isLoading: boolean;\n isAuthenticated: boolean;\n error: Error | null;\n};\n\ntype SessionContextValue = SessionState & {\n refresh: () => Promise<void>;\n signOut: () => Promise<void>;\n};\n\ntype ApiContextValue = {\n hooks: OpenApiHooks;\n setAuth: (auth: AuthResponse) => void;\n clearAuth: () => void;\n refresh: () => Promise<void>;\n};\n\ntype ConfigContextValue = {\n config: AuthClientConfig;\n t: (key: string, params?: Record<string, string | number>) => string;\n};\n\nconst SessionContext = createContext<SessionContextValue | null>(null);\nconst ApiContext = createContext<ApiContextValue | null>(null);\nconst ConfigContext = createContext<ConfigContextValue | null>(null);\n\nconst queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 1000 * 60 * 5,\n gcTime: 1000 * 60 * 10,\n retry: 1,\n refetchOnWindowFocus: false,\n },\n },\n});\n\nexport function useSession() {\n const context = useContext(SessionContext);\n if (!context) {\n throw new Error('useSession must be used within MesobAuthProvider');\n }\n return context;\n}\n\nexport function useApi() {\n const context = useContext(ApiContext);\n if (!context) {\n throw new Error('useApi must be used within MesobAuthProvider');\n }\n return context;\n}\n\nexport function useConfig() {\n const context = useContext(ConfigContext);\n if (!context) {\n throw new Error('useConfig must be used within MesobAuthProvider');\n }\n return context;\n}\n\ntype MesobAuthProviderProps = {\n config: AuthClientConfig;\n children: ReactNode;\n};\n\nexport function MesobAuthProvider({\n config,\n children,\n}: MesobAuthProviderProps) {\n const mergedConfig = deepmerge(\n { ...defaultAuthClientConfig } as Partial<AuthClientConfig>,\n config,\n ) as AuthClientConfig;\n\n const api = createFetchClient<paths>({\n baseUrl: mergedConfig.baseURL,\n fetch: createCustomFetch(mergedConfig),\n });\n\n const hooks = createClient(api);\n\n return (\n <QueryClientProvider client={queryClient}>\n <AuthStateProvider config={mergedConfig} hooks={hooks}>\n {children}\n </AuthStateProvider>\n </QueryClientProvider>\n );\n}\n\ntype AuthStateProviderProps = {\n config: AuthClientConfig;\n hooks: OpenApiHooks;\n children: ReactNode;\n};\n\nfunction AuthStateProvider({\n config,\n hooks,\n children,\n}: AuthStateProviderProps) {\n const [authState, setAuthState] = useState<{\n user: User | null;\n session: Session | null;\n isLoading: boolean;\n error: Error | null;\n }>({\n user: null,\n session: null,\n isLoading: false,\n error: null,\n });\n\n const {\n data: sessionData,\n isLoading: sessionLoading,\n error: sessionError,\n refetch,\n } = hooks.useQuery(\n 'get',\n '/session',\n {},\n {\n enabled: true,\n refetchOnMount: true,\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n retry: false,\n },\n );\n\n useEffect(() => {\n if (sessionLoading) {\n setAuthState((prev) => ({ ...prev, isLoading: true }));\n return;\n }\n\n if (sessionError) {\n setAuthState({\n user: null,\n session: null,\n isLoading: false,\n error: sessionError as Error,\n });\n return;\n }\n\n if (sessionData) {\n setAuthState({\n user: sessionData.user,\n session: sessionData.session,\n isLoading: false,\n error: null,\n });\n return;\n }\n\n setAuthState({\n user: null,\n session: null,\n isLoading: false,\n error: null,\n });\n }, [sessionData, sessionLoading, sessionError]);\n\n const refresh = async () => {\n await refetch();\n };\n\n const setAuth = (auth: AuthResponse) => {\n setAuthState({\n user: auth.user,\n session: auth.session,\n isLoading: false,\n error: null,\n });\n };\n\n const clearAuth = () => {\n setAuthState({\n user: null,\n session: null,\n isLoading: false,\n error: null,\n });\n };\n\n const signOutMutation = hooks.useMutation('post', '/sign-out');\n\n const signOut = async () => {\n try {\n await signOutMutation.mutateAsync({});\n } finally {\n clearAuth();\n }\n };\n\n const t = createTranslator(config.messages || {});\n\n return (\n <ConfigContext.Provider value={{ config, t }}>\n <ApiContext.Provider value={{ hooks, setAuth, clearAuth, refresh }}>\n <SessionContext.Provider\n value={{\n user: authState.user,\n session: authState.session,\n isLoading: authState.isLoading,\n isAuthenticated: !!authState.user && !!authState.session,\n error: authState.error,\n refresh,\n signOut,\n }}\n >\n {children}\n </SessionContext.Provider>\n </ApiContext.Provider>\n </ConfigContext.Provider>\n );\n}\n","'use client';\n\nimport { Skeleton } from '@mesob/ui/components/skeleton';\n\nexport function ProfileSkeleton() {\n return (\n <div className=\"w-full max-w-4xl space-y-8 p-6\">\n {/* Header */}\n <div className=\"flex items-center gap-6\">\n <Skeleton className=\"h-24 w-24 rounded-full\" />\n <div className=\"space-y-2 flex-1\">\n <Skeleton className=\"h-8 w-48\" />\n <Skeleton className=\"h-4 w-64\" />\n </div>\n </div>\n\n {/* Profile sections */}\n <div className=\"space-y-6\">\n {[1, 2, 3].map((i) => (\n <div key={i} className=\"space-y-4\">\n <Skeleton className=\"h-6 w-32\" />\n <div className=\"space-y-3\">\n <div className=\"flex justify-between items-center\">\n <Skeleton className=\"h-4 w-24\" />\n <Skeleton className=\"h-4 w-32\" />\n </div>\n <div className=\"flex justify-between items-center\">\n <Skeleton className=\"h-4 w-24\" />\n <Skeleton className=\"h-4 w-40\" />\n </div>\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["jsx","jsx","jsxs"]}
@@ -0,0 +1,22 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode } from 'react';
3
+
4
+ type DataTableColumn<T> = {
5
+ key: string;
6
+ header: string;
7
+ cell: (row: T) => ReactNode;
8
+ sortable?: boolean;
9
+ };
10
+ type DataTableProps<T> = {
11
+ data: T[];
12
+ columns: DataTableColumn<T>[];
13
+ isLoading?: boolean;
14
+ onRowClick?: (row: T) => void;
15
+ emptyMessage?: string;
16
+ actions?: ReactNode;
17
+ };
18
+ declare function DataTable<T extends {
19
+ id: string;
20
+ }>({ data, columns, isLoading, onRowClick, emptyMessage, actions, }: DataTableProps<T>): react_jsx_runtime.JSX.Element;
21
+
22
+ export { DataTable, type DataTableColumn };
@@ -0,0 +1,85 @@
1
+ "use client";
2
+
3
+ // src/components/shared/data-table/data-table.tsx
4
+ import {
5
+ Table,
6
+ TableBody,
7
+ TableCell,
8
+ TableHead,
9
+ TableHeader,
10
+ TableRow
11
+ } from "@mesob/ui/components/table";
12
+
13
+ // src/components/skeletons/table-skeleton.tsx
14
+ import { Skeleton } from "@mesob/ui/components/skeleton";
15
+ import { jsx, jsxs } from "react/jsx-runtime";
16
+ function TableSkeleton({ columns = 5, rows = 10 }) {
17
+ const headerKeys = Array.from({ length: columns }, (_, i) => `header-${i}`);
18
+ const rowKeys = Array.from({ length: rows }, (_, i) => `row-${i}`);
19
+ const cellKeys = Array.from(
20
+ { length: rows },
21
+ (_, rowIdx) => Array.from({ length: columns }, (_2, colIdx) => `cell-${rowIdx}-${colIdx}`)
22
+ );
23
+ return /* @__PURE__ */ jsxs("div", { className: "w-full space-y-4", children: [
24
+ /* @__PURE__ */ jsxs("div", { className: "flex justify-between items-center", children: [
25
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-8 w-48" }),
26
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-10 w-32" })
27
+ ] }),
28
+ /* @__PURE__ */ jsxs("div", { className: "flex gap-4", children: [
29
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-10 flex-1 max-w-sm" }),
30
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-10 w-24" }),
31
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-10 w-24" })
32
+ ] }),
33
+ /* @__PURE__ */ jsxs("div", { className: "border rounded-lg overflow-hidden", children: [
34
+ /* @__PURE__ */ jsx("div", { className: "flex gap-4 p-4 bg-muted", children: headerKeys.map((key) => /* @__PURE__ */ jsx(Skeleton, { className: "h-4 flex-1" }, key)) }),
35
+ rowKeys.map((rowKey, rowIdx) => /* @__PURE__ */ jsx("div", { className: "flex gap-4 p-4 border-t", children: cellKeys[rowIdx]?.map((cellKey) => /* @__PURE__ */ jsx(Skeleton, { className: "h-4 flex-1" }, cellKey)) }, rowKey))
36
+ ] }),
37
+ /* @__PURE__ */ jsxs("div", { className: "flex justify-between items-center", children: [
38
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-32" }),
39
+ /* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
40
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-10 w-20" }),
41
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-10 w-20" })
42
+ ] })
43
+ ] })
44
+ ] });
45
+ }
46
+
47
+ // src/components/shared/data-table/data-table.tsx
48
+ import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
49
+ function DataTable({
50
+ data,
51
+ columns,
52
+ isLoading,
53
+ onRowClick,
54
+ emptyMessage = "No data available",
55
+ actions
56
+ }) {
57
+ if (isLoading) {
58
+ return /* @__PURE__ */ jsx2(TableSkeleton, { columns: columns.length, rows: 5 });
59
+ }
60
+ if (data.length === 0) {
61
+ return /* @__PURE__ */ jsxs2("div", { className: "flex flex-col items-center justify-center min-h-[400px] p-6", children: [
62
+ /* @__PURE__ */ jsx2("p", { className: "text-muted-foreground", children: emptyMessage }),
63
+ actions && /* @__PURE__ */ jsx2("div", { className: "mt-4", children: actions })
64
+ ] });
65
+ }
66
+ return /* @__PURE__ */ jsxs2("div", { className: "w-full space-y-4", children: [
67
+ actions && /* @__PURE__ */ jsx2("div", { className: "flex justify-end", children: actions }),
68
+ /* @__PURE__ */ jsx2("div", { className: "border rounded-lg overflow-hidden", children: /* @__PURE__ */ jsxs2(Table, { children: [
69
+ /* @__PURE__ */ jsx2(TableHeader, { children: /* @__PURE__ */ jsx2(TableRow, { children: columns.map((column) => /* @__PURE__ */ jsx2(TableHead, { children: column.header }, column.key)) }) }),
70
+ /* @__PURE__ */ jsx2(TableBody, { children: data.map((row) => /* @__PURE__ */ jsx2(
71
+ TableRow,
72
+ {
73
+ onClick: () => onRowClick?.(row),
74
+ className: onRowClick ? "cursor-pointer hover:bg-muted/50" : "",
75
+ children: columns.map((column) => /* @__PURE__ */ jsx2(TableCell, { children: column.cell(row) }, `${row.id}-${column.key}`))
76
+ },
77
+ row.id
78
+ )) })
79
+ ] }) })
80
+ ] });
81
+ }
82
+ export {
83
+ DataTable
84
+ };
85
+ //# sourceMappingURL=data-table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/shared/data-table/data-table.tsx","../../../../src/components/skeletons/table-skeleton.tsx"],"sourcesContent":["'use client';\n\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@mesob/ui/components/table';\nimport type { ReactNode } from 'react';\nimport { TableSkeleton } from '../../skeletons/table-skeleton';\n\nexport type DataTableColumn<T> = {\n key: string;\n header: string;\n cell: (row: T) => ReactNode;\n sortable?: boolean;\n};\n\ntype DataTableProps<T> = {\n data: T[];\n columns: DataTableColumn<T>[];\n isLoading?: boolean;\n onRowClick?: (row: T) => void;\n emptyMessage?: string;\n actions?: ReactNode;\n};\n\nexport function DataTable<T extends { id: string }>({\n data,\n columns,\n isLoading,\n onRowClick,\n emptyMessage = 'No data available',\n actions,\n}: DataTableProps<T>) {\n if (isLoading) {\n return <TableSkeleton columns={columns.length} rows={5} />;\n }\n\n if (data.length === 0) {\n return (\n <div className=\"flex flex-col items-center justify-center min-h-[400px] p-6\">\n <p className=\"text-muted-foreground\">{emptyMessage}</p>\n {actions && <div className=\"mt-4\">{actions}</div>}\n </div>\n );\n }\n\n return (\n <div className=\"w-full space-y-4\">\n {actions && <div className=\"flex justify-end\">{actions}</div>}\n\n <div className=\"border rounded-lg overflow-hidden\">\n <Table>\n <TableHeader>\n <TableRow>\n {columns.map((column) => (\n <TableHead key={column.key}>{column.header}</TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {data.map((row) => (\n <TableRow\n key={row.id}\n onClick={() => onRowClick?.(row)}\n className={onRowClick ? 'cursor-pointer hover:bg-muted/50' : ''}\n >\n {columns.map((column) => (\n <TableCell key={`${row.id}-${column.key}`}>\n {column.cell(row)}\n </TableCell>\n ))}\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { Skeleton } from '@mesob/ui/components/skeleton';\n\ntype TableSkeletonProps = {\n columns?: number;\n rows?: number;\n};\n\nexport function TableSkeleton({ columns = 5, rows = 10 }: TableSkeletonProps) {\n const headerKeys = Array.from({ length: columns }, (_, i) => `header-${i}`);\n const rowKeys = Array.from({ length: rows }, (_, i) => `row-${i}`);\n const cellKeys = Array.from({ length: rows }, (_, rowIdx) =>\n Array.from({ length: columns }, (_, colIdx) => `cell-${rowIdx}-${colIdx}`),\n );\n\n return (\n <div className=\"w-full space-y-4\">\n {/* Header */}\n <div className=\"flex justify-between items-center\">\n <Skeleton className=\"h-8 w-48\" />\n <Skeleton className=\"h-10 w-32\" />\n </div>\n\n {/* Search/filters */}\n <div className=\"flex gap-4\">\n <Skeleton className=\"h-10 flex-1 max-w-sm\" />\n <Skeleton className=\"h-10 w-24\" />\n <Skeleton className=\"h-10 w-24\" />\n </div>\n\n {/* Table */}\n <div className=\"border rounded-lg overflow-hidden\">\n {/* Table header */}\n <div className=\"flex gap-4 p-4 bg-muted\">\n {headerKeys.map((key) => (\n <Skeleton key={key} className=\"h-4 flex-1\" />\n ))}\n </div>\n\n {/* Table rows */}\n {rowKeys.map((rowKey, rowIdx) => (\n <div key={rowKey} className=\"flex gap-4 p-4 border-t\">\n {cellKeys[rowIdx]?.map((cellKey) => (\n <Skeleton key={cellKey} className=\"h-4 flex-1\" />\n ))}\n </div>\n ))}\n </div>\n\n {/* Pagination */}\n <div className=\"flex justify-between items-center\">\n <Skeleton className=\"h-4 w-32\" />\n <div className=\"flex gap-2\">\n <Skeleton className=\"h-10 w-20\" />\n <Skeleton className=\"h-10 w-20\" />\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["_","jsx","jsxs"]}
@@ -0,0 +1,5 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ declare function AuthFormSkeleton(): react_jsx_runtime.JSX.Element;
4
+
5
+ export { AuthFormSkeleton };
@@ -0,0 +1,32 @@
1
+ "use client";
2
+
3
+ // src/components/skeletons/auth-form-skeleton.tsx
4
+ import { Skeleton } from "@mesob/ui/components/skeleton";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ function AuthFormSkeleton() {
7
+ return /* @__PURE__ */ jsxs("div", { className: "w-full max-w-md space-y-6 p-6", children: [
8
+ /* @__PURE__ */ jsxs("div", { className: "space-y-2 text-center", children: [
9
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-8 w-48 mx-auto" }),
10
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-64 mx-auto" })
11
+ ] }),
12
+ /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
13
+ /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
14
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-24" }),
15
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-10 w-full" })
16
+ ] }),
17
+ /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
18
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-24" }),
19
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-10 w-full" })
20
+ ] }),
21
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-10 w-full" })
22
+ ] }),
23
+ /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
24
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-px w-full" }),
25
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-32 mx-auto" })
26
+ ] })
27
+ ] });
28
+ }
29
+ export {
30
+ AuthFormSkeleton
31
+ };
32
+ //# sourceMappingURL=auth-form-skeleton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/skeletons/auth-form-skeleton.tsx"],"sourcesContent":["'use client';\n\nimport { Skeleton } from '@mesob/ui/components/skeleton';\n\nexport function AuthFormSkeleton() {\n return (\n <div className=\"w-full max-w-md space-y-6 p-6\">\n <div className=\"space-y-2 text-center\">\n <Skeleton className=\"h-8 w-48 mx-auto\" />\n <Skeleton className=\"h-4 w-64 mx-auto\" />\n </div>\n\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Skeleton className=\"h-4 w-24\" />\n <Skeleton className=\"h-10 w-full\" />\n </div>\n\n <div className=\"space-y-2\">\n <Skeleton className=\"h-4 w-24\" />\n <Skeleton className=\"h-10 w-full\" />\n </div>\n\n <Skeleton className=\"h-10 w-full\" />\n </div>\n\n <div className=\"space-y-2\">\n <Skeleton className=\"h-px w-full\" />\n <Skeleton className=\"h-4 w-32 mx-auto\" />\n </div>\n </div>\n );\n}\n"],"mappings":";;;AAEA,SAAS,gBAAgB;AAKnB,SACE,KADF;AAHC,SAAS,mBAAmB;AACjC,SACE,qBAAC,SAAI,WAAU,iCACb;AAAA,yBAAC,SAAI,WAAU,yBACb;AAAA,0BAAC,YAAS,WAAU,oBAAmB;AAAA,MACvC,oBAAC,YAAS,WAAU,oBAAmB;AAAA,OACzC;AAAA,IAEA,qBAAC,SAAI,WAAU,aACb;AAAA,2BAAC,SAAI,WAAU,aACb;AAAA,4BAAC,YAAS,WAAU,YAAW;AAAA,QAC/B,oBAAC,YAAS,WAAU,eAAc;AAAA,SACpC;AAAA,MAEA,qBAAC,SAAI,WAAU,aACb;AAAA,4BAAC,YAAS,WAAU,YAAW;AAAA,QAC/B,oBAAC,YAAS,WAAU,eAAc;AAAA,SACpC;AAAA,MAEA,oBAAC,YAAS,WAAU,eAAc;AAAA,OACpC;AAAA,IAEA,qBAAC,SAAI,WAAU,aACb;AAAA,0BAAC,YAAS,WAAU,eAAc;AAAA,MAClC,oBAAC,YAAS,WAAU,oBAAmB;AAAA,OACzC;AAAA,KACF;AAEJ;","names":[]}
@@ -0,0 +1,5 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ declare function ProfileSkeleton(): react_jsx_runtime.JSX.Element;
4
+
5
+ export { ProfileSkeleton };
@@ -0,0 +1,33 @@
1
+ "use client";
2
+
3
+ // src/components/skeletons/profile-skeleton.tsx
4
+ import { Skeleton } from "@mesob/ui/components/skeleton";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ function ProfileSkeleton() {
7
+ return /* @__PURE__ */ jsxs("div", { className: "w-full max-w-4xl space-y-8 p-6", children: [
8
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-6", children: [
9
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-24 w-24 rounded-full" }),
10
+ /* @__PURE__ */ jsxs("div", { className: "space-y-2 flex-1", children: [
11
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-8 w-48" }),
12
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-64" })
13
+ ] })
14
+ ] }),
15
+ /* @__PURE__ */ jsx("div", { className: "space-y-6", children: [1, 2, 3].map((i) => /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
16
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-6 w-32" }),
17
+ /* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
18
+ /* @__PURE__ */ jsxs("div", { className: "flex justify-between items-center", children: [
19
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-24" }),
20
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-32" })
21
+ ] }),
22
+ /* @__PURE__ */ jsxs("div", { className: "flex justify-between items-center", children: [
23
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-24" }),
24
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-40" })
25
+ ] })
26
+ ] })
27
+ ] }, i)) })
28
+ ] });
29
+ }
30
+ export {
31
+ ProfileSkeleton
32
+ };
33
+ //# sourceMappingURL=profile-skeleton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/skeletons/profile-skeleton.tsx"],"sourcesContent":["'use client';\n\nimport { Skeleton } from '@mesob/ui/components/skeleton';\n\nexport function ProfileSkeleton() {\n return (\n <div className=\"w-full max-w-4xl space-y-8 p-6\">\n {/* Header */}\n <div className=\"flex items-center gap-6\">\n <Skeleton className=\"h-24 w-24 rounded-full\" />\n <div className=\"space-y-2 flex-1\">\n <Skeleton className=\"h-8 w-48\" />\n <Skeleton className=\"h-4 w-64\" />\n </div>\n </div>\n\n {/* Profile sections */}\n <div className=\"space-y-6\">\n {[1, 2, 3].map((i) => (\n <div key={i} className=\"space-y-4\">\n <Skeleton className=\"h-6 w-32\" />\n <div className=\"space-y-3\">\n <div className=\"flex justify-between items-center\">\n <Skeleton className=\"h-4 w-24\" />\n <Skeleton className=\"h-4 w-32\" />\n </div>\n <div className=\"flex justify-between items-center\">\n <Skeleton className=\"h-4 w-24\" />\n <Skeleton className=\"h-4 w-40\" />\n </div>\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n}\n"],"mappings":";;;AAEA,SAAS,gBAAgB;AAOjB,cACA,YADA;AALD,SAAS,kBAAkB;AAChC,SACE,qBAAC,SAAI,WAAU,kCAEb;AAAA,yBAAC,SAAI,WAAU,2BACb;AAAA,0BAAC,YAAS,WAAU,0BAAyB;AAAA,MAC7C,qBAAC,SAAI,WAAU,oBACb;AAAA,4BAAC,YAAS,WAAU,YAAW;AAAA,QAC/B,oBAAC,YAAS,WAAU,YAAW;AAAA,SACjC;AAAA,OACF;AAAA,IAGA,oBAAC,SAAI,WAAU,aACZ,WAAC,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC,MACd,qBAAC,SAAY,WAAU,aACrB;AAAA,0BAAC,YAAS,WAAU,YAAW;AAAA,MAC/B,qBAAC,SAAI,WAAU,aACb;AAAA,6BAAC,SAAI,WAAU,qCACb;AAAA,8BAAC,YAAS,WAAU,YAAW;AAAA,UAC/B,oBAAC,YAAS,WAAU,YAAW;AAAA,WACjC;AAAA,QACA,qBAAC,SAAI,WAAU,qCACb;AAAA,8BAAC,YAAS,WAAU,YAAW;AAAA,UAC/B,oBAAC,YAAS,WAAU,YAAW;AAAA,WACjC;AAAA,SACF;AAAA,SAXQ,CAYV,CACD,GACH;AAAA,KACF;AAEJ;","names":[]}
@@ -0,0 +1,9 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ type TableSkeletonProps = {
4
+ columns?: number;
5
+ rows?: number;
6
+ };
7
+ declare function TableSkeleton({ columns, rows }: TableSkeletonProps): react_jsx_runtime.JSX.Element;
8
+
9
+ export { TableSkeleton };
@@ -0,0 +1,39 @@
1
+ "use client";
2
+
3
+ // src/components/skeletons/table-skeleton.tsx
4
+ import { Skeleton } from "@mesob/ui/components/skeleton";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ function TableSkeleton({ columns = 5, rows = 10 }) {
7
+ const headerKeys = Array.from({ length: columns }, (_, i) => `header-${i}`);
8
+ const rowKeys = Array.from({ length: rows }, (_, i) => `row-${i}`);
9
+ const cellKeys = Array.from(
10
+ { length: rows },
11
+ (_, rowIdx) => Array.from({ length: columns }, (_2, colIdx) => `cell-${rowIdx}-${colIdx}`)
12
+ );
13
+ return /* @__PURE__ */ jsxs("div", { className: "w-full space-y-4", children: [
14
+ /* @__PURE__ */ jsxs("div", { className: "flex justify-between items-center", children: [
15
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-8 w-48" }),
16
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-10 w-32" })
17
+ ] }),
18
+ /* @__PURE__ */ jsxs("div", { className: "flex gap-4", children: [
19
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-10 flex-1 max-w-sm" }),
20
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-10 w-24" }),
21
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-10 w-24" })
22
+ ] }),
23
+ /* @__PURE__ */ jsxs("div", { className: "border rounded-lg overflow-hidden", children: [
24
+ /* @__PURE__ */ jsx("div", { className: "flex gap-4 p-4 bg-muted", children: headerKeys.map((key) => /* @__PURE__ */ jsx(Skeleton, { className: "h-4 flex-1" }, key)) }),
25
+ rowKeys.map((rowKey, rowIdx) => /* @__PURE__ */ jsx("div", { className: "flex gap-4 p-4 border-t", children: cellKeys[rowIdx]?.map((cellKey) => /* @__PURE__ */ jsx(Skeleton, { className: "h-4 flex-1" }, cellKey)) }, rowKey))
26
+ ] }),
27
+ /* @__PURE__ */ jsxs("div", { className: "flex justify-between items-center", children: [
28
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-32" }),
29
+ /* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
30
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-10 w-20" }),
31
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-10 w-20" })
32
+ ] })
33
+ ] })
34
+ ] });
35
+ }
36
+ export {
37
+ TableSkeleton
38
+ };
39
+ //# sourceMappingURL=table-skeleton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/skeletons/table-skeleton.tsx"],"sourcesContent":["'use client';\n\nimport { Skeleton } from '@mesob/ui/components/skeleton';\n\ntype TableSkeletonProps = {\n columns?: number;\n rows?: number;\n};\n\nexport function TableSkeleton({ columns = 5, rows = 10 }: TableSkeletonProps) {\n const headerKeys = Array.from({ length: columns }, (_, i) => `header-${i}`);\n const rowKeys = Array.from({ length: rows }, (_, i) => `row-${i}`);\n const cellKeys = Array.from({ length: rows }, (_, rowIdx) =>\n Array.from({ length: columns }, (_, colIdx) => `cell-${rowIdx}-${colIdx}`),\n );\n\n return (\n <div className=\"w-full space-y-4\">\n {/* Header */}\n <div className=\"flex justify-between items-center\">\n <Skeleton className=\"h-8 w-48\" />\n <Skeleton className=\"h-10 w-32\" />\n </div>\n\n {/* Search/filters */}\n <div className=\"flex gap-4\">\n <Skeleton className=\"h-10 flex-1 max-w-sm\" />\n <Skeleton className=\"h-10 w-24\" />\n <Skeleton className=\"h-10 w-24\" />\n </div>\n\n {/* Table */}\n <div className=\"border rounded-lg overflow-hidden\">\n {/* Table header */}\n <div className=\"flex gap-4 p-4 bg-muted\">\n {headerKeys.map((key) => (\n <Skeleton key={key} className=\"h-4 flex-1\" />\n ))}\n </div>\n\n {/* Table rows */}\n {rowKeys.map((rowKey, rowIdx) => (\n <div key={rowKey} className=\"flex gap-4 p-4 border-t\">\n {cellKeys[rowIdx]?.map((cellKey) => (\n <Skeleton key={cellKey} className=\"h-4 flex-1\" />\n ))}\n </div>\n ))}\n </div>\n\n {/* Pagination */}\n <div className=\"flex justify-between items-center\">\n <Skeleton className=\"h-4 w-32\" />\n <div className=\"flex gap-2\">\n <Skeleton className=\"h-10 w-20\" />\n <Skeleton className=\"h-10 w-20\" />\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":";;;AAEA,SAAS,gBAAgB;AAiBnB,SACE,KADF;AAVC,SAAS,cAAc,EAAE,UAAU,GAAG,OAAO,GAAG,GAAuB;AAC5E,QAAM,aAAa,MAAM,KAAK,EAAE,QAAQ,QAAQ,GAAG,CAAC,GAAG,MAAM,UAAU,CAAC,EAAE;AAC1E,QAAM,UAAU,MAAM,KAAK,EAAE,QAAQ,KAAK,GAAG,CAAC,GAAG,MAAM,OAAO,CAAC,EAAE;AACjE,QAAM,WAAW,MAAM;AAAA,IAAK,EAAE,QAAQ,KAAK;AAAA,IAAG,CAAC,GAAG,WAChD,MAAM,KAAK,EAAE,QAAQ,QAAQ,GAAG,CAACA,IAAG,WAAW,QAAQ,MAAM,IAAI,MAAM,EAAE;AAAA,EAC3E;AAEA,SACE,qBAAC,SAAI,WAAU,oBAEb;AAAA,yBAAC,SAAI,WAAU,qCACb;AAAA,0BAAC,YAAS,WAAU,YAAW;AAAA,MAC/B,oBAAC,YAAS,WAAU,aAAY;AAAA,OAClC;AAAA,IAGA,qBAAC,SAAI,WAAU,cACb;AAAA,0BAAC,YAAS,WAAU,wBAAuB;AAAA,MAC3C,oBAAC,YAAS,WAAU,aAAY;AAAA,MAChC,oBAAC,YAAS,WAAU,aAAY;AAAA,OAClC;AAAA,IAGA,qBAAC,SAAI,WAAU,qCAEb;AAAA,0BAAC,SAAI,WAAU,2BACZ,qBAAW,IAAI,CAAC,QACf,oBAAC,YAAmB,WAAU,gBAAf,GAA4B,CAC5C,GACH;AAAA,MAGC,QAAQ,IAAI,CAAC,QAAQ,WACpB,oBAAC,SAAiB,WAAU,2BACzB,mBAAS,MAAM,GAAG,IAAI,CAAC,YACtB,oBAAC,YAAuB,WAAU,gBAAnB,OAAgC,CAChD,KAHO,MAIV,CACD;AAAA,OACH;AAAA,IAGA,qBAAC,SAAI,WAAU,qCACb;AAAA,0BAAC,YAAS,WAAU,YAAW;AAAA,MAC/B,qBAAC,SAAI,WAAU,cACb;AAAA,4BAAC,YAAS,WAAU,aAAY;AAAA,QAChC,oBAAC,YAAS,WAAU,aAAY;AAAA,SAClC;AAAA,OACF;AAAA,KACF;AAEJ;","names":["_"]}
@@ -0,0 +1,8 @@
1
+ type AuthErrorContent = {
2
+ title: string;
3
+ description: string;
4
+ };
5
+ type TranslatorFunction = (key: string, params?: Record<string, string | number>) => string;
6
+ declare const handleError: (err: unknown, setError: (error: AuthErrorContent | null) => void, t: TranslatorFunction) => void;
7
+
8
+ export { type AuthErrorContent as A, handleError as h };