create-chaaskit 0.1.1 → 0.1.3
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/LICENSE +21 -0
- package/dist/templates/app/routes/chat.admin.promo-codes.tsx +10 -0
- package/dist/templates/app/routes/chat.admin.waitlist.tsx +10 -0
- package/dist/templates/app/routes.ts +2 -0
- package/dist/templates/config/app.config.ts +24 -0
- package/dist/templates/prisma/schema/base.prisma +170 -0
- package/dist/templates/server.js +40 -10
- package/package.json +19 -10
- package/dist/cli.d.ts +0 -3
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -25
- package/dist/cli.js.map +0 -1
- package/dist/templates/app/components/AcceptInviteClient.tsx +0 -10
- package/dist/templates/app/components/AdminDashboardClient.tsx +0 -10
- package/dist/templates/app/components/AdminTeamClient.tsx +0 -10
- package/dist/templates/app/components/AdminTeamsClient.tsx +0 -10
- package/dist/templates/app/components/AdminUsersClient.tsx +0 -10
- package/dist/templates/app/components/ApiKeysClient.tsx +0 -10
- package/dist/templates/app/components/AutomationsClient.tsx +0 -10
- package/dist/templates/app/components/ChatClient.tsx +0 -13
- package/dist/templates/app/components/DocumentsClient.tsx +0 -10
- package/dist/templates/app/components/OAuthConsentClient.tsx +0 -10
- package/dist/templates/app/components/PricingClient.tsx +0 -10
- package/dist/templates/app/components/TeamSettingsClient.tsx +0 -10
- package/dist/templates/app/components/VerifyEmailClient.tsx +0 -10
- package/dist/templates/app/routes/admin._index.tsx +0 -57
- package/dist/templates/app/routes/admin.teams.$teamId.tsx +0 -57
- package/dist/templates/app/routes/admin.teams._index.tsx +0 -57
- package/dist/templates/app/routes/admin.users.tsx +0 -57
- package/dist/templates/app/routes/api-keys.tsx +0 -57
- package/dist/templates/app/routes/automations.tsx +0 -57
- package/dist/templates/app/routes/documents.tsx +0 -57
- package/dist/templates/app/routes/team.$teamId.settings.tsx +0 -57
- package/dist/templates/app/routes/thread.$threadId.tsx +0 -102
- package/dist/templates/docs/admin.md +0 -257
- package/dist/templates/docs/api-keys.md +0 -403
- package/dist/templates/docs/authentication.md +0 -247
- package/dist/templates/docs/configuration.md +0 -1212
- package/dist/templates/docs/custom-pages.md +0 -466
- package/dist/templates/docs/deployment.md +0 -362
- package/dist/templates/docs/development.md +0 -411
- package/dist/templates/docs/documents.md +0 -293
- package/dist/templates/docs/extensions.md +0 -639
- package/dist/templates/docs/index.md +0 -139
- package/dist/templates/docs/installation.md +0 -286
- package/dist/templates/docs/mcp.md +0 -952
- package/dist/templates/docs/native-tools.md +0 -688
- package/dist/templates/docs/queue.md +0 -514
- package/dist/templates/docs/scheduled-prompts.md +0 -279
- package/dist/templates/docs/settings.md +0 -415
- package/dist/templates/docs/slack.md +0 -318
- package/dist/templates/docs/styling.md +0 -288
- package/dist/templates/index.html +0 -16
- package/dist/templates/prisma/schema.prisma +0 -271
- package/dist/templates/src/main.tsx +0 -8
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import type { Route } from './+types/admin.teams.$teamId';
|
|
2
|
-
import { lazy, Suspense } from 'react';
|
|
3
|
-
import { ClientOnly } from '../components/ClientOnly';
|
|
4
|
-
|
|
5
|
-
const AdminTeamClient = lazy(() => import('../components/AdminTeamClient'));
|
|
6
|
-
|
|
7
|
-
export function meta({}: Route.MetaArgs) {
|
|
8
|
-
return [{ title: 'Admin - Team Details' }];
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export function links() {
|
|
12
|
-
return [{ rel: 'stylesheet', href: '/node_modules/@chaaskit/client/dist/lib/styles.css' }];
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export default function AdminTeamDetails() {
|
|
16
|
-
return (
|
|
17
|
-
<ClientOnly fallback={<LoadingSkeleton />}>
|
|
18
|
-
{() => (
|
|
19
|
-
<Suspense fallback={<LoadingSkeleton />}>
|
|
20
|
-
<AdminTeamClient />
|
|
21
|
-
</Suspense>
|
|
22
|
-
)}
|
|
23
|
-
</ClientOnly>
|
|
24
|
-
);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
function LoadingSkeleton() {
|
|
28
|
-
return (
|
|
29
|
-
<div
|
|
30
|
-
style={{
|
|
31
|
-
display: 'flex',
|
|
32
|
-
height: '100vh',
|
|
33
|
-
alignItems: 'center',
|
|
34
|
-
justifyContent: 'center',
|
|
35
|
-
backgroundColor: 'rgb(var(--color-background))',
|
|
36
|
-
}}
|
|
37
|
-
>
|
|
38
|
-
<div
|
|
39
|
-
style={{
|
|
40
|
-
width: '2rem',
|
|
41
|
-
height: '2rem',
|
|
42
|
-
border: '2px solid rgb(var(--color-primary))',
|
|
43
|
-
borderTopColor: 'transparent',
|
|
44
|
-
borderRadius: '50%',
|
|
45
|
-
animation: 'spin 1s linear infinite',
|
|
46
|
-
}}
|
|
47
|
-
/>
|
|
48
|
-
<style>
|
|
49
|
-
{`
|
|
50
|
-
@keyframes spin {
|
|
51
|
-
to { transform: rotate(360deg); }
|
|
52
|
-
}
|
|
53
|
-
`}
|
|
54
|
-
</style>
|
|
55
|
-
</div>
|
|
56
|
-
);
|
|
57
|
-
}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import type { Route } from './+types/admin.teams._index';
|
|
2
|
-
import { lazy, Suspense } from 'react';
|
|
3
|
-
import { ClientOnly } from '../components/ClientOnly';
|
|
4
|
-
|
|
5
|
-
const AdminTeamsClient = lazy(() => import('../components/AdminTeamsClient'));
|
|
6
|
-
|
|
7
|
-
export function meta({}: Route.MetaArgs) {
|
|
8
|
-
return [{ title: 'Admin - Teams' }];
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export function links() {
|
|
12
|
-
return [{ rel: 'stylesheet', href: '/node_modules/@chaaskit/client/dist/lib/styles.css' }];
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export default function AdminTeams() {
|
|
16
|
-
return (
|
|
17
|
-
<ClientOnly fallback={<LoadingSkeleton />}>
|
|
18
|
-
{() => (
|
|
19
|
-
<Suspense fallback={<LoadingSkeleton />}>
|
|
20
|
-
<AdminTeamsClient />
|
|
21
|
-
</Suspense>
|
|
22
|
-
)}
|
|
23
|
-
</ClientOnly>
|
|
24
|
-
);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
function LoadingSkeleton() {
|
|
28
|
-
return (
|
|
29
|
-
<div
|
|
30
|
-
style={{
|
|
31
|
-
display: 'flex',
|
|
32
|
-
height: '100vh',
|
|
33
|
-
alignItems: 'center',
|
|
34
|
-
justifyContent: 'center',
|
|
35
|
-
backgroundColor: 'rgb(var(--color-background))',
|
|
36
|
-
}}
|
|
37
|
-
>
|
|
38
|
-
<div
|
|
39
|
-
style={{
|
|
40
|
-
width: '2rem',
|
|
41
|
-
height: '2rem',
|
|
42
|
-
border: '2px solid rgb(var(--color-primary))',
|
|
43
|
-
borderTopColor: 'transparent',
|
|
44
|
-
borderRadius: '50%',
|
|
45
|
-
animation: 'spin 1s linear infinite',
|
|
46
|
-
}}
|
|
47
|
-
/>
|
|
48
|
-
<style>
|
|
49
|
-
{`
|
|
50
|
-
@keyframes spin {
|
|
51
|
-
to { transform: rotate(360deg); }
|
|
52
|
-
}
|
|
53
|
-
`}
|
|
54
|
-
</style>
|
|
55
|
-
</div>
|
|
56
|
-
);
|
|
57
|
-
}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import type { Route } from './+types/admin.users';
|
|
2
|
-
import { lazy, Suspense } from 'react';
|
|
3
|
-
import { ClientOnly } from '../components/ClientOnly';
|
|
4
|
-
|
|
5
|
-
const AdminUsersClient = lazy(() => import('../components/AdminUsersClient'));
|
|
6
|
-
|
|
7
|
-
export function meta({}: Route.MetaArgs) {
|
|
8
|
-
return [{ title: 'Admin - Users' }];
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export function links() {
|
|
12
|
-
return [{ rel: 'stylesheet', href: '/node_modules/@chaaskit/client/dist/lib/styles.css' }];
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export default function AdminUsers() {
|
|
16
|
-
return (
|
|
17
|
-
<ClientOnly fallback={<LoadingSkeleton />}>
|
|
18
|
-
{() => (
|
|
19
|
-
<Suspense fallback={<LoadingSkeleton />}>
|
|
20
|
-
<AdminUsersClient />
|
|
21
|
-
</Suspense>
|
|
22
|
-
)}
|
|
23
|
-
</ClientOnly>
|
|
24
|
-
);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
function LoadingSkeleton() {
|
|
28
|
-
return (
|
|
29
|
-
<div
|
|
30
|
-
style={{
|
|
31
|
-
display: 'flex',
|
|
32
|
-
height: '100vh',
|
|
33
|
-
alignItems: 'center',
|
|
34
|
-
justifyContent: 'center',
|
|
35
|
-
backgroundColor: 'rgb(var(--color-background))',
|
|
36
|
-
}}
|
|
37
|
-
>
|
|
38
|
-
<div
|
|
39
|
-
style={{
|
|
40
|
-
width: '2rem',
|
|
41
|
-
height: '2rem',
|
|
42
|
-
border: '2px solid rgb(var(--color-primary))',
|
|
43
|
-
borderTopColor: 'transparent',
|
|
44
|
-
borderRadius: '50%',
|
|
45
|
-
animation: 'spin 1s linear infinite',
|
|
46
|
-
}}
|
|
47
|
-
/>
|
|
48
|
-
<style>
|
|
49
|
-
{`
|
|
50
|
-
@keyframes spin {
|
|
51
|
-
to { transform: rotate(360deg); }
|
|
52
|
-
}
|
|
53
|
-
`}
|
|
54
|
-
</style>
|
|
55
|
-
</div>
|
|
56
|
-
);
|
|
57
|
-
}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import type { Route } from './+types/api-keys';
|
|
2
|
-
import { lazy, Suspense } from 'react';
|
|
3
|
-
import { ClientOnly } from '../components/ClientOnly';
|
|
4
|
-
|
|
5
|
-
const ApiKeysClient = lazy(() => import('../components/ApiKeysClient'));
|
|
6
|
-
|
|
7
|
-
export function meta({}: Route.MetaArgs) {
|
|
8
|
-
return [{ title: 'API Keys' }];
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export function links() {
|
|
12
|
-
return [{ rel: 'stylesheet', href: '/node_modules/@chaaskit/client/dist/lib/styles.css' }];
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export default function ApiKeys() {
|
|
16
|
-
return (
|
|
17
|
-
<ClientOnly fallback={<LoadingSkeleton />}>
|
|
18
|
-
{() => (
|
|
19
|
-
<Suspense fallback={<LoadingSkeleton />}>
|
|
20
|
-
<ApiKeysClient />
|
|
21
|
-
</Suspense>
|
|
22
|
-
)}
|
|
23
|
-
</ClientOnly>
|
|
24
|
-
);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
function LoadingSkeleton() {
|
|
28
|
-
return (
|
|
29
|
-
<div
|
|
30
|
-
style={{
|
|
31
|
-
display: 'flex',
|
|
32
|
-
height: '100vh',
|
|
33
|
-
alignItems: 'center',
|
|
34
|
-
justifyContent: 'center',
|
|
35
|
-
backgroundColor: 'rgb(var(--color-background))',
|
|
36
|
-
}}
|
|
37
|
-
>
|
|
38
|
-
<div
|
|
39
|
-
style={{
|
|
40
|
-
width: '2rem',
|
|
41
|
-
height: '2rem',
|
|
42
|
-
border: '2px solid rgb(var(--color-primary))',
|
|
43
|
-
borderTopColor: 'transparent',
|
|
44
|
-
borderRadius: '50%',
|
|
45
|
-
animation: 'spin 1s linear infinite',
|
|
46
|
-
}}
|
|
47
|
-
/>
|
|
48
|
-
<style>
|
|
49
|
-
{`
|
|
50
|
-
@keyframes spin {
|
|
51
|
-
to { transform: rotate(360deg); }
|
|
52
|
-
}
|
|
53
|
-
`}
|
|
54
|
-
</style>
|
|
55
|
-
</div>
|
|
56
|
-
);
|
|
57
|
-
}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import type { Route } from './+types/automations';
|
|
2
|
-
import { lazy, Suspense } from 'react';
|
|
3
|
-
import { ClientOnly } from '../components/ClientOnly';
|
|
4
|
-
|
|
5
|
-
const AutomationsClient = lazy(() => import('../components/AutomationsClient'));
|
|
6
|
-
|
|
7
|
-
export function meta({}: Route.MetaArgs) {
|
|
8
|
-
return [{ title: 'Automations' }];
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export function links() {
|
|
12
|
-
return [{ rel: 'stylesheet', href: '/node_modules/@chaaskit/client/dist/lib/styles.css' }];
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export default function Automations() {
|
|
16
|
-
return (
|
|
17
|
-
<ClientOnly fallback={<LoadingSkeleton />}>
|
|
18
|
-
{() => (
|
|
19
|
-
<Suspense fallback={<LoadingSkeleton />}>
|
|
20
|
-
<AutomationsClient />
|
|
21
|
-
</Suspense>
|
|
22
|
-
)}
|
|
23
|
-
</ClientOnly>
|
|
24
|
-
);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
function LoadingSkeleton() {
|
|
28
|
-
return (
|
|
29
|
-
<div
|
|
30
|
-
style={{
|
|
31
|
-
display: 'flex',
|
|
32
|
-
height: '100vh',
|
|
33
|
-
alignItems: 'center',
|
|
34
|
-
justifyContent: 'center',
|
|
35
|
-
backgroundColor: 'rgb(var(--color-background))',
|
|
36
|
-
}}
|
|
37
|
-
>
|
|
38
|
-
<div
|
|
39
|
-
style={{
|
|
40
|
-
width: '2rem',
|
|
41
|
-
height: '2rem',
|
|
42
|
-
border: '2px solid rgb(var(--color-primary))',
|
|
43
|
-
borderTopColor: 'transparent',
|
|
44
|
-
borderRadius: '50%',
|
|
45
|
-
animation: 'spin 1s linear infinite',
|
|
46
|
-
}}
|
|
47
|
-
/>
|
|
48
|
-
<style>
|
|
49
|
-
{`
|
|
50
|
-
@keyframes spin {
|
|
51
|
-
to { transform: rotate(360deg); }
|
|
52
|
-
}
|
|
53
|
-
`}
|
|
54
|
-
</style>
|
|
55
|
-
</div>
|
|
56
|
-
);
|
|
57
|
-
}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import type { Route } from './+types/documents';
|
|
2
|
-
import { lazy, Suspense } from 'react';
|
|
3
|
-
import { ClientOnly } from '../components/ClientOnly';
|
|
4
|
-
|
|
5
|
-
const DocumentsClient = lazy(() => import('../components/DocumentsClient'));
|
|
6
|
-
|
|
7
|
-
export function meta({}: Route.MetaArgs) {
|
|
8
|
-
return [{ title: 'Documents' }];
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export function links() {
|
|
12
|
-
return [{ rel: 'stylesheet', href: '/node_modules/@chaaskit/client/dist/lib/styles.css' }];
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export default function Documents() {
|
|
16
|
-
return (
|
|
17
|
-
<ClientOnly fallback={<LoadingSkeleton />}>
|
|
18
|
-
{() => (
|
|
19
|
-
<Suspense fallback={<LoadingSkeleton />}>
|
|
20
|
-
<DocumentsClient />
|
|
21
|
-
</Suspense>
|
|
22
|
-
)}
|
|
23
|
-
</ClientOnly>
|
|
24
|
-
);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
function LoadingSkeleton() {
|
|
28
|
-
return (
|
|
29
|
-
<div
|
|
30
|
-
style={{
|
|
31
|
-
display: 'flex',
|
|
32
|
-
height: '100vh',
|
|
33
|
-
alignItems: 'center',
|
|
34
|
-
justifyContent: 'center',
|
|
35
|
-
backgroundColor: 'rgb(var(--color-background))',
|
|
36
|
-
}}
|
|
37
|
-
>
|
|
38
|
-
<div
|
|
39
|
-
style={{
|
|
40
|
-
width: '2rem',
|
|
41
|
-
height: '2rem',
|
|
42
|
-
border: '2px solid rgb(var(--color-primary))',
|
|
43
|
-
borderTopColor: 'transparent',
|
|
44
|
-
borderRadius: '50%',
|
|
45
|
-
animation: 'spin 1s linear infinite',
|
|
46
|
-
}}
|
|
47
|
-
/>
|
|
48
|
-
<style>
|
|
49
|
-
{`
|
|
50
|
-
@keyframes spin {
|
|
51
|
-
to { transform: rotate(360deg); }
|
|
52
|
-
}
|
|
53
|
-
`}
|
|
54
|
-
</style>
|
|
55
|
-
</div>
|
|
56
|
-
);
|
|
57
|
-
}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import type { Route } from './+types/team.$teamId.settings';
|
|
2
|
-
import { lazy, Suspense } from 'react';
|
|
3
|
-
import { ClientOnly } from '../components/ClientOnly';
|
|
4
|
-
|
|
5
|
-
const TeamSettingsClient = lazy(() => import('../components/TeamSettingsClient'));
|
|
6
|
-
|
|
7
|
-
export function meta({}: Route.MetaArgs) {
|
|
8
|
-
return [{ title: 'Team Settings' }];
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export function links() {
|
|
12
|
-
return [{ rel: 'stylesheet', href: '/node_modules/@chaaskit/client/dist/lib/styles.css' }];
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export default function TeamSettings() {
|
|
16
|
-
return (
|
|
17
|
-
<ClientOnly fallback={<LoadingSkeleton />}>
|
|
18
|
-
{() => (
|
|
19
|
-
<Suspense fallback={<LoadingSkeleton />}>
|
|
20
|
-
<TeamSettingsClient />
|
|
21
|
-
</Suspense>
|
|
22
|
-
)}
|
|
23
|
-
</ClientOnly>
|
|
24
|
-
);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
function LoadingSkeleton() {
|
|
28
|
-
return (
|
|
29
|
-
<div
|
|
30
|
-
style={{
|
|
31
|
-
display: 'flex',
|
|
32
|
-
height: '100vh',
|
|
33
|
-
alignItems: 'center',
|
|
34
|
-
justifyContent: 'center',
|
|
35
|
-
backgroundColor: 'rgb(var(--color-background))',
|
|
36
|
-
}}
|
|
37
|
-
>
|
|
38
|
-
<div
|
|
39
|
-
style={{
|
|
40
|
-
width: '2rem',
|
|
41
|
-
height: '2rem',
|
|
42
|
-
border: '2px solid rgb(var(--color-primary))',
|
|
43
|
-
borderTopColor: 'transparent',
|
|
44
|
-
borderRadius: '50%',
|
|
45
|
-
animation: 'spin 1s linear infinite',
|
|
46
|
-
}}
|
|
47
|
-
/>
|
|
48
|
-
<style>
|
|
49
|
-
{`
|
|
50
|
-
@keyframes spin {
|
|
51
|
-
to { transform: rotate(360deg); }
|
|
52
|
-
}
|
|
53
|
-
`}
|
|
54
|
-
</style>
|
|
55
|
-
</div>
|
|
56
|
-
);
|
|
57
|
-
}
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
import type { Route } from './+types/thread.$threadId';
|
|
2
|
-
import { lazy, Suspense } from 'react';
|
|
3
|
-
import { ClientOnly } from '../components/ClientOnly';
|
|
4
|
-
|
|
5
|
-
// Lazy load the client-only component
|
|
6
|
-
const ChatClient = lazy(() => import('../components/ChatClient'));
|
|
7
|
-
|
|
8
|
-
export function meta({}: Route.MetaArgs) {
|
|
9
|
-
return [{ title: 'Chat' }];
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
// Styles are loaded via link tag in root.tsx to avoid SSR import issues
|
|
13
|
-
export function links() {
|
|
14
|
-
return [{ rel: 'stylesheet', href: '/node_modules/@chaaskit/client/dist/lib/styles.css' }];
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Thread view route - shows a specific chat thread.
|
|
19
|
-
* Uses the same ChatClient component as the main chat route.
|
|
20
|
-
*/
|
|
21
|
-
export default function Thread() {
|
|
22
|
-
return (
|
|
23
|
-
<ClientOnly fallback={<ThreadLoadingSkeleton />}>
|
|
24
|
-
{() => (
|
|
25
|
-
<Suspense fallback={<ThreadLoadingSkeleton />}>
|
|
26
|
-
<ChatClient />
|
|
27
|
-
</Suspense>
|
|
28
|
-
)}
|
|
29
|
-
</ClientOnly>
|
|
30
|
-
);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
function ThreadLoadingSkeleton() {
|
|
34
|
-
return (
|
|
35
|
-
<div style={{ display: 'flex', height: '100vh' }}>
|
|
36
|
-
{/* Sidebar skeleton */}
|
|
37
|
-
<div
|
|
38
|
-
style={{
|
|
39
|
-
width: '256px',
|
|
40
|
-
backgroundColor: 'rgb(var(--color-sidebar))',
|
|
41
|
-
borderRight: '1px solid rgb(var(--color-border))',
|
|
42
|
-
padding: '1rem',
|
|
43
|
-
}}
|
|
44
|
-
>
|
|
45
|
-
<div
|
|
46
|
-
style={{
|
|
47
|
-
height: '2rem',
|
|
48
|
-
backgroundColor: 'rgb(var(--color-background-secondary))',
|
|
49
|
-
borderRadius: '0.5rem',
|
|
50
|
-
marginBottom: '1rem',
|
|
51
|
-
}}
|
|
52
|
-
/>
|
|
53
|
-
<div
|
|
54
|
-
style={{
|
|
55
|
-
height: '1rem',
|
|
56
|
-
backgroundColor: 'rgb(var(--color-background-secondary))',
|
|
57
|
-
borderRadius: '0.25rem',
|
|
58
|
-
width: '80%',
|
|
59
|
-
}}
|
|
60
|
-
/>
|
|
61
|
-
</div>
|
|
62
|
-
{/* Main content skeleton */}
|
|
63
|
-
<div
|
|
64
|
-
style={{
|
|
65
|
-
flex: 1,
|
|
66
|
-
display: 'flex',
|
|
67
|
-
alignItems: 'center',
|
|
68
|
-
justifyContent: 'center',
|
|
69
|
-
backgroundColor: 'rgb(var(--color-background))',
|
|
70
|
-
}}
|
|
71
|
-
>
|
|
72
|
-
<div
|
|
73
|
-
style={{
|
|
74
|
-
display: 'flex',
|
|
75
|
-
flexDirection: 'column',
|
|
76
|
-
alignItems: 'center',
|
|
77
|
-
gap: '1rem',
|
|
78
|
-
}}
|
|
79
|
-
>
|
|
80
|
-
<div
|
|
81
|
-
style={{
|
|
82
|
-
width: '2rem',
|
|
83
|
-
height: '2rem',
|
|
84
|
-
border: '2px solid rgb(var(--color-primary))',
|
|
85
|
-
borderTopColor: 'transparent',
|
|
86
|
-
borderRadius: '50%',
|
|
87
|
-
animation: 'spin 1s linear infinite',
|
|
88
|
-
}}
|
|
89
|
-
/>
|
|
90
|
-
<p style={{ color: 'rgb(var(--color-text-muted))' }}>Loading...</p>
|
|
91
|
-
</div>
|
|
92
|
-
</div>
|
|
93
|
-
<style>
|
|
94
|
-
{`
|
|
95
|
-
@keyframes spin {
|
|
96
|
-
to { transform: rotate(360deg); }
|
|
97
|
-
}
|
|
98
|
-
`}
|
|
99
|
-
</style>
|
|
100
|
-
</div>
|
|
101
|
-
);
|
|
102
|
-
}
|