@svadmin/ui 0.34.10 → 0.36.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.
- package/dist/app.css +746 -22
- package/dist/component-registry.svelte.d.ts +1 -0
- package/dist/components/AdminApp.svelte +94 -15
- package/dist/components/AdminApp.svelte.d.ts +32 -2
- package/dist/components/ApiSettings.svelte +191 -0
- package/dist/components/ApiSettings.svelte.d.ts +3 -0
- package/dist/components/AutoForm.svelte +47 -42
- package/dist/components/AutoTable.svelte +29 -24
- package/dist/components/ErrorPage.svelte +58 -0
- package/dist/components/ErrorPage.svelte.d.ts +8 -0
- package/dist/components/FieldRenderer.svelte +2 -2
- package/dist/components/ForgotPasswordPage.svelte +111 -68
- package/dist/components/Header.svelte +6 -7
- package/dist/components/IntegrationsSettings.svelte +70 -0
- package/dist/components/IntegrationsSettings.svelte.d.ts +4 -0
- package/dist/components/Layout.svelte +7 -7
- package/dist/components/LoginPage.svelte +207 -105
- package/dist/components/LoginPage.svelte.d.ts +3 -15
- package/dist/components/NotificationsSettings.svelte +115 -0
- package/dist/components/NotificationsSettings.svelte.d.ts +3 -0
- package/dist/components/PageHeader.svelte +9 -7
- package/dist/components/RegisterPage.svelte +103 -65
- package/dist/components/ResourceOperationsPage.svelte +151 -0
- package/dist/components/ResourceOperationsPage.svelte.d.ts +37 -0
- package/dist/components/SecuritySettings.svelte +179 -0
- package/dist/components/SecuritySettings.svelte.d.ts +4 -0
- package/dist/components/SettingsPage.svelte +120 -87
- package/dist/components/SettingsPage.svelte.d.ts +25 -1
- package/dist/components/ShowPage.svelte +9 -9
- package/dist/components/Sidebar.svelte +278 -189
- package/dist/components/SidebarItem.svelte +77 -18
- package/dist/components/TwoFactorAuthPage.svelte +247 -0
- package/dist/components/TwoFactorAuthPage.svelte.d.ts +3 -0
- package/dist/components/UpdatePasswordPage.svelte +86 -48
- package/dist/components/account/CompanyProfilePage.svelte +99 -0
- package/dist/components/account/CompanyProfilePage.svelte.d.ts +3 -0
- package/dist/components/account/GetStartedPage.svelte +123 -0
- package/dist/components/account/GetStartedPage.svelte.d.ts +4 -0
- package/dist/components/account/ImportMembersPage.svelte +143 -0
- package/dist/components/account/ImportMembersPage.svelte.d.ts +3 -0
- package/dist/components/account/MembersStarterPage.svelte +104 -0
- package/dist/components/account/MembersStarterPage.svelte.d.ts +3 -0
- package/dist/components/account/SecurityLogPage.svelte +135 -0
- package/dist/components/account/SecurityLogPage.svelte.d.ts +3 -0
- package/dist/components/account/SettingsEnterprisePage.svelte +131 -0
- package/dist/components/account/SettingsEnterprisePage.svelte.d.ts +3 -0
- package/dist/components/account/SettingsPlainPage.svelte +81 -0
- package/dist/components/account/SettingsPlainPage.svelte.d.ts +3 -0
- package/dist/components/account/SettingsSidebarPage.svelte +98 -0
- package/dist/components/account/SettingsSidebarPage.svelte.d.ts +3 -0
- package/dist/components/account/TeamMembersPage.svelte +98 -0
- package/dist/components/account/TeamMembersPage.svelte.d.ts +3 -0
- package/dist/components/network/TeamCrewTablePage.svelte +155 -0
- package/dist/components/network/TeamCrewTablePage.svelte.d.ts +3 -0
- package/dist/components/network/UserCardsNFTPage.svelte +134 -0
- package/dist/components/network/UserCardsNFTPage.svelte.d.ts +3 -0
- package/dist/components/profile/ActivityTimeline.svelte +77 -0
- package/dist/components/profile/ActivityTimeline.svelte.d.ts +16 -0
- package/dist/components/profile/ProfileCard.svelte +216 -0
- package/dist/components/profile/ProfileCard.svelte.d.ts +27 -0
- package/dist/components/profile/ProjectsGrid.svelte +91 -0
- package/dist/components/profile/ProjectsGrid.svelte.d.ts +17 -0
- package/dist/components/profile/PublicProfilePage.svelte +179 -0
- package/dist/components/profile/PublicProfilePage.svelte.d.ts +10 -0
- package/dist/components/profile/TeamsShowcase.svelte +98 -0
- package/dist/components/profile/TeamsShowcase.svelte.d.ts +19 -0
- package/dist/components/ui/pagination/pagination-ellipsis.svelte +1 -1
- package/dist/index.d.ts +23 -0
- package/dist/index.js +27 -0
- package/dist/router-state.svelte.js +17 -0
- package/package.json +2 -2
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { t } from '@svadmin/core/i18n';
|
|
3
|
+
import * as Card from '../ui/card/index.js';
|
|
4
|
+
import { Button } from '../ui/button/index.js';
|
|
5
|
+
import { Badge } from '../ui/badge/index.js';
|
|
6
|
+
import * as Tabs from '../ui/tabs/index.js';
|
|
7
|
+
import ProjectsGrid from './ProjectsGrid.svelte';
|
|
8
|
+
import ActivityTimeline from './ActivityTimeline.svelte';
|
|
9
|
+
import TeamsShowcase from './TeamsShowcase.svelte';
|
|
10
|
+
import { MapPin, Link, Calendar, MoreHorizontal } from '@lucide/svelte';
|
|
11
|
+
|
|
12
|
+
type ProfileVariant = 'default' | 'company' | 'gamer';
|
|
13
|
+
type ProfileTab = 'projects' | 'activity' | 'teams';
|
|
14
|
+
|
|
15
|
+
interface Props {
|
|
16
|
+
variant?: ProfileVariant;
|
|
17
|
+
initialTab?: ProfileTab;
|
|
18
|
+
columns?: 2 | 3;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
let { variant = 'default', initialTab = 'projects', columns = 2 }: Props = $props();
|
|
22
|
+
let activeTab = $derived<ProfileTab>(initialTab);
|
|
23
|
+
|
|
24
|
+
// Demo profile data based on variant
|
|
25
|
+
const profileData = $derived.by(() => {
|
|
26
|
+
if (variant === 'company') {
|
|
27
|
+
return {
|
|
28
|
+
name: 'Acme Corporation',
|
|
29
|
+
tagline: 'Building the future of enterprise software',
|
|
30
|
+
industry: 'Technology',
|
|
31
|
+
employees: 1250,
|
|
32
|
+
founded: '2015',
|
|
33
|
+
website: 'acme.com',
|
|
34
|
+
location: 'San Francisco, CA',
|
|
35
|
+
followers: 8420,
|
|
36
|
+
following: 312,
|
|
37
|
+
stats: [
|
|
38
|
+
{ label: t('profile.employees'), value: '1,250' },
|
|
39
|
+
{ label: t('publicProfile.projects'), value: '48' },
|
|
40
|
+
{ label: t('publicProfile.teams'), value: '12' },
|
|
41
|
+
],
|
|
42
|
+
tags: ['SaaS', 'Enterprise', 'Cloud', 'AI'],
|
|
43
|
+
};
|
|
44
|
+
} else if (variant === 'gamer') {
|
|
45
|
+
return {
|
|
46
|
+
name: 'ShadowFox',
|
|
47
|
+
tagline: 'Pro gamer & content creator',
|
|
48
|
+
gamerTag: 'ShadowFox#7742',
|
|
49
|
+
level: 42,
|
|
50
|
+
rank: 'Diamond II',
|
|
51
|
+
location: 'Seoul, KR',
|
|
52
|
+
followers: 24600,
|
|
53
|
+
following: 180,
|
|
54
|
+
stats: [
|
|
55
|
+
{ label: t('profile.gamesPlayed'), value: '1,284' },
|
|
56
|
+
{ label: t('profile.winRate'), value: '68%' },
|
|
57
|
+
{ label: t('profile.rank'), value: 'Diamond II' },
|
|
58
|
+
],
|
|
59
|
+
tags: ['FPS', 'RPG', 'Streaming', 'Esports'],
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
name: 'Alex Chen',
|
|
64
|
+
tagline: 'Full-stack developer & open source enthusiast',
|
|
65
|
+
location: 'Shanghai, CN',
|
|
66
|
+
website: 'alexchen.dev',
|
|
67
|
+
joinedDate: '2023',
|
|
68
|
+
followers: 1234,
|
|
69
|
+
following: 567,
|
|
70
|
+
stats: [
|
|
71
|
+
{ label: t('publicProfile.projects'), value: '24' },
|
|
72
|
+
{ label: t('publicProfile.followers'), value: '1.2K' },
|
|
73
|
+
{ label: t('publicProfile.following'), value: '567' },
|
|
74
|
+
],
|
|
75
|
+
tags: ['TypeScript', 'Svelte', 'Node.js', 'Open Source'],
|
|
76
|
+
};
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
// Demo data
|
|
80
|
+
const demoProjects = [
|
|
81
|
+
{ id: '1', name: 'Dashboard Redesign', description: 'Modern admin dashboard with real-time analytics and customizable widgets.', members: 8, tasks: 34, status: 'active' as const, tags: ['UI', 'Analytics'] },
|
|
82
|
+
{ id: '2', name: 'API Gateway v2', description: 'High-performance API gateway with rate limiting and circuit breaker patterns.', members: 5, tasks: 21, status: 'active' as const, tags: ['Backend', 'Infra'] },
|
|
83
|
+
{ id: '3', name: 'Mobile App', description: 'Cross-platform mobile application built with React Native.', members: 12, tasks: 56, status: 'completed' as const, tags: ['Mobile', 'React'] },
|
|
84
|
+
{ id: '4', name: 'Data Pipeline', description: 'Real-time data processing pipeline for event streaming.', members: 3, tasks: 18, status: 'on-hold' as const, tags: ['Data', 'Streaming'] },
|
|
85
|
+
];
|
|
86
|
+
|
|
87
|
+
const demoActivities = [
|
|
88
|
+
{ id: '1', type: 'posted' as const, user: 'Alex Chen', content: 'Just shipped the new dashboard redesign with real-time analytics support.', timestamp: '2 hours ago' },
|
|
89
|
+
{ id: '2', type: 'commented' as const, user: 'Alex Chen', target: 'API Gateway PR #42', content: 'Looks great, just a few minor suggestions on error handling.', timestamp: '5 hours ago' },
|
|
90
|
+
{ id: '3', type: 'created' as const, user: 'Alex Chen', target: 'Mobile App project', timestamp: '1 day ago' },
|
|
91
|
+
{ id: '4', type: 'joined' as const, user: 'Alex Chen', target: 'Design Systems Guild', timestamp: '3 days ago' },
|
|
92
|
+
{ id: '5', type: 'starred' as const, user: 'Alex Chen', target: 'svadmin/svadmin', timestamp: '1 week ago' },
|
|
93
|
+
];
|
|
94
|
+
|
|
95
|
+
const demoTeams = [
|
|
96
|
+
{ id: '1', name: 'Frontend Platform', description: 'Building the core UI component library and design system.', members: [{ name: 'Alice' }, { name: 'Bob' }, { name: 'Carol' }], totalMembers: 8, color: '#3b82f6' },
|
|
97
|
+
{ id: '2', name: 'Backend Services', description: 'API development, microservices architecture, and infrastructure.', members: [{ name: 'Dave' }, { name: 'Eve' }], totalMembers: 5, color: '#10b981' },
|
|
98
|
+
{ id: '3', name: 'Design', description: 'User experience research and visual design.', members: [{ name: 'Frank' }, { name: 'Grace' }, { name: 'Hank' }, { name: 'Ivy' }], totalMembers: 6, color: '#f59e0b' },
|
|
99
|
+
];
|
|
100
|
+
</script>
|
|
101
|
+
|
|
102
|
+
<div class="space-y-6" data-svadmin-content-page="public-profile">
|
|
103
|
+
<!-- Cover + Profile Header -->
|
|
104
|
+
<Card.Card class="overflow-hidden border-border/60">
|
|
105
|
+
<div class="h-40 bg-gradient-to-r from-primary/25 via-primary/15 to-accent/20 relative">
|
|
106
|
+
<div class="absolute inset-0 opacity-[0.06]" style="background-image: radial-gradient(circle, currentColor 1px, transparent 1px); background-size: 24px 24px;"></div>
|
|
107
|
+
</div>
|
|
108
|
+
<Card.CardContent class="relative px-6 pb-5">
|
|
109
|
+
<div class="-mt-12 flex flex-col sm:flex-row sm:items-end gap-4">
|
|
110
|
+
<div class="ring-4 ring-card rounded-2xl overflow-hidden shrink-0">
|
|
111
|
+
<div class="flex h-24 w-24 items-center justify-center bg-primary/10 text-primary text-3xl font-bold">
|
|
112
|
+
{profileData.name.split(' ').map(n => n[0]).join('').slice(0, 2)}
|
|
113
|
+
</div>
|
|
114
|
+
</div>
|
|
115
|
+
<div class="flex-1 min-w-0">
|
|
116
|
+
<h2 class="text-2xl font-bold text-foreground">{profileData.name}</h2>
|
|
117
|
+
{#if profileData.tagline}
|
|
118
|
+
<p class="text-muted-foreground">{profileData.tagline}</p>
|
|
119
|
+
{/if}
|
|
120
|
+
<div class="mt-2 flex flex-wrap gap-3 text-sm text-muted-foreground">
|
|
121
|
+
{#if profileData.location}
|
|
122
|
+
<span class="flex items-center gap-1"><MapPin class="h-3.5 w-3.5" />{profileData.location}</span>
|
|
123
|
+
{/if}
|
|
124
|
+
{#if profileData.website}
|
|
125
|
+
<span class="flex items-center gap-1"><Link class="h-3.5 w-3.5" />{profileData.website}</span>
|
|
126
|
+
{/if}
|
|
127
|
+
{#if 'joinedDate' in profileData && profileData.joinedDate}
|
|
128
|
+
<span class="flex items-center gap-1"><Calendar class="h-3.5 w-3.5" />{t('publicProfile.joinedDate', { date: profileData.joinedDate })}</span>
|
|
129
|
+
{/if}
|
|
130
|
+
</div>
|
|
131
|
+
</div>
|
|
132
|
+
<div class="flex gap-2 shrink-0">
|
|
133
|
+
<Button size="sm">{t('publicProfile.editProfile')}</Button>
|
|
134
|
+
<Button size="sm" variant="outline">{t('publicProfile.sendMessage')}</Button>
|
|
135
|
+
<Button size="sm" variant="ghost"><MoreHorizontal class="h-4 w-4" /></Button>
|
|
136
|
+
</div>
|
|
137
|
+
</div>
|
|
138
|
+
|
|
139
|
+
<!-- Stats -->
|
|
140
|
+
{#if profileData.stats.length > 0}
|
|
141
|
+
<div class="mt-4 grid grid-cols-3 gap-4 border-t pt-4">
|
|
142
|
+
{#each profileData.stats as stat (stat.label)}
|
|
143
|
+
<div class="text-center">
|
|
144
|
+
<div class="text-xl font-bold text-foreground">{stat.value}</div>
|
|
145
|
+
<div class="text-xs text-muted-foreground">{stat.label}</div>
|
|
146
|
+
</div>
|
|
147
|
+
{/each}
|
|
148
|
+
</div>
|
|
149
|
+
{/if}
|
|
150
|
+
|
|
151
|
+
<!-- Tags -->
|
|
152
|
+
{#if profileData.tags.length > 0}
|
|
153
|
+
<div class="mt-3 flex flex-wrap gap-1.5">
|
|
154
|
+
{#each profileData.tags as tag (tag)}
|
|
155
|
+
<Badge variant="outline" class="text-xs">{tag}</Badge>
|
|
156
|
+
{/each}
|
|
157
|
+
</div>
|
|
158
|
+
{/if}
|
|
159
|
+
</Card.CardContent>
|
|
160
|
+
</Card.Card>
|
|
161
|
+
|
|
162
|
+
<!-- Tabs: Projects / Activity / Teams -->
|
|
163
|
+
<Tabs.Root value={activeTab}>
|
|
164
|
+
<Tabs.List class="w-full justify-start border-b">
|
|
165
|
+
<Tabs.Trigger value="projects" active={activeTab === 'projects'} onclick={() => activeTab = 'projects'} class="gap-1.5">{t('publicProfile.projects')}</Tabs.Trigger>
|
|
166
|
+
<Tabs.Trigger value="activity" active={activeTab === 'activity'} onclick={() => activeTab = 'activity'} class="gap-1.5">{t('publicProfile.activity')}</Tabs.Trigger>
|
|
167
|
+
<Tabs.Trigger value="teams" active={activeTab === 'teams'} onclick={() => activeTab = 'teams'} class="gap-1.5">{t('publicProfile.teams')}</Tabs.Trigger>
|
|
168
|
+
</Tabs.List>
|
|
169
|
+
<Tabs.Content value="projects" active={activeTab === 'projects'} class="mt-4">
|
|
170
|
+
<ProjectsGrid {columns} projects={demoProjects} />
|
|
171
|
+
</Tabs.Content>
|
|
172
|
+
<Tabs.Content value="activity" active={activeTab === 'activity'} class="mt-4">
|
|
173
|
+
<ActivityTimeline activities={demoActivities} />
|
|
174
|
+
</Tabs.Content>
|
|
175
|
+
<Tabs.Content value="teams" active={activeTab === 'teams'} class="mt-4">
|
|
176
|
+
<TeamsShowcase teams={demoTeams} />
|
|
177
|
+
</Tabs.Content>
|
|
178
|
+
</Tabs.Root>
|
|
179
|
+
</div>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
type ProfileVariant = 'default' | 'company' | 'gamer';
|
|
2
|
+
type ProfileTab = 'projects' | 'activity' | 'teams';
|
|
3
|
+
interface Props {
|
|
4
|
+
variant?: ProfileVariant;
|
|
5
|
+
initialTab?: ProfileTab;
|
|
6
|
+
columns?: 2 | 3;
|
|
7
|
+
}
|
|
8
|
+
declare const PublicProfilePage: import("svelte").Component<Props, {}, "">;
|
|
9
|
+
type PublicProfilePage = ReturnType<typeof PublicProfilePage>;
|
|
10
|
+
export default PublicProfilePage;
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { t } from '@svadmin/core/i18n';
|
|
3
|
+
import * as Card from '../ui/card/index.js';
|
|
4
|
+
import { Badge } from '../ui/badge/index.js';
|
|
5
|
+
import { Button } from '../ui/button/index.js';
|
|
6
|
+
import { Avatar } from '../ui/avatar/index.js';
|
|
7
|
+
import { Users, ArrowRight } from '@lucide/svelte';
|
|
8
|
+
|
|
9
|
+
interface TeamMember {
|
|
10
|
+
name: string;
|
|
11
|
+
avatar?: string;
|
|
12
|
+
role?: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
interface Team {
|
|
16
|
+
id: string;
|
|
17
|
+
name: string;
|
|
18
|
+
description: string;
|
|
19
|
+
members: TeamMember[];
|
|
20
|
+
totalMembers: number;
|
|
21
|
+
color?: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
interface Props {
|
|
25
|
+
teams?: Team[];
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
let { teams = [] }: Props = $props();
|
|
29
|
+
|
|
30
|
+
const initials = (name: string) => name.split(' ').map(n => n[0]).join('').toUpperCase().slice(0, 2);
|
|
31
|
+
</script>
|
|
32
|
+
|
|
33
|
+
<div class="space-y-4">
|
|
34
|
+
<h3 class="text-lg font-semibold text-foreground">{t('publicProfile.teams')}</h3>
|
|
35
|
+
|
|
36
|
+
{#if teams.length === 0}
|
|
37
|
+
<div class="rounded-xl border border-dashed border-border/60 p-8 text-center">
|
|
38
|
+
<p class="text-sm text-muted-foreground">{t('publicProfile.noTeams')}</p>
|
|
39
|
+
</div>
|
|
40
|
+
{:else}
|
|
41
|
+
<div class="grid gap-4 sm:grid-cols-1 md:grid-cols-2">
|
|
42
|
+
{#each teams as team (team.id)}
|
|
43
|
+
<Card.Card class="border-border/60 hover:border-primary/30 transition-colors">
|
|
44
|
+
<Card.CardContent class="p-4 space-y-3">
|
|
45
|
+
<div class="flex items-start justify-between gap-2">
|
|
46
|
+
<div class="flex items-center gap-3">
|
|
47
|
+
{#if team.color}
|
|
48
|
+
<div class="h-8 w-8 rounded-lg" style="background-color: {team.color}20;">
|
|
49
|
+
<Users class="h-4 w-4" style="color: {team.color}" />
|
|
50
|
+
</div>
|
|
51
|
+
{:else}
|
|
52
|
+
<div class="flex h-8 w-8 items-center justify-center rounded-lg bg-primary/10 text-primary">
|
|
53
|
+
<Users class="h-4 w-4" />
|
|
54
|
+
</div>
|
|
55
|
+
{/if}
|
|
56
|
+
<div>
|
|
57
|
+
<h4 class="font-semibold text-foreground">{team.name}</h4>
|
|
58
|
+
<p class="text-xs text-muted-foreground">{team.totalMembers} {t('publicProfile.projectMembers', { count: team.totalMembers })}</p>
|
|
59
|
+
</div>
|
|
60
|
+
</div>
|
|
61
|
+
<Badge variant="secondary" class="shrink-0">
|
|
62
|
+
<Users class="h-3 w-3 mr-1" />{team.totalMembers}
|
|
63
|
+
</Badge>
|
|
64
|
+
</div>
|
|
65
|
+
|
|
66
|
+
<p class="text-sm text-muted-foreground line-clamp-2">{team.description}</p>
|
|
67
|
+
|
|
68
|
+
<!-- Member avatars -->
|
|
69
|
+
<div class="flex items-center gap-1">
|
|
70
|
+
{#each team.members.slice(0, 5) as member (member.name)}
|
|
71
|
+
{#if member.avatar}
|
|
72
|
+
<Avatar class="h-7 w-7 ring-1 ring-background">
|
|
73
|
+
<img src={member.avatar} alt={member.name} />
|
|
74
|
+
</Avatar>
|
|
75
|
+
{:else}
|
|
76
|
+
<div class="flex h-7 w-7 items-center justify-center rounded-full bg-muted text-[10px] font-semibold text-muted-foreground ring-1 ring-background">
|
|
77
|
+
{initials(member.name)}
|
|
78
|
+
</div>
|
|
79
|
+
{/if}
|
|
80
|
+
{/each}
|
|
81
|
+
{#if team.members.length > 5}
|
|
82
|
+
<div class="flex h-7 w-7 items-center justify-center rounded-full bg-muted text-[10px] font-semibold text-muted-foreground ring-1 ring-background">
|
|
83
|
+
+{team.members.length - 5}
|
|
84
|
+
</div>
|
|
85
|
+
{/if}
|
|
86
|
+
</div>
|
|
87
|
+
|
|
88
|
+
<div class="pt-2 border-t">
|
|
89
|
+
<Button variant="ghost" size="sm" class="w-full">
|
|
90
|
+
{t('publicProfile.viewProfile')} <ArrowRight class="h-3.5 w-3.5 ml-1" />
|
|
91
|
+
</Button>
|
|
92
|
+
</div>
|
|
93
|
+
</Card.CardContent>
|
|
94
|
+
</Card.Card>
|
|
95
|
+
{/each}
|
|
96
|
+
</div>
|
|
97
|
+
{/if}
|
|
98
|
+
</div>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
interface TeamMember {
|
|
2
|
+
name: string;
|
|
3
|
+
avatar?: string;
|
|
4
|
+
role?: string;
|
|
5
|
+
}
|
|
6
|
+
interface Team {
|
|
7
|
+
id: string;
|
|
8
|
+
name: string;
|
|
9
|
+
description: string;
|
|
10
|
+
members: TeamMember[];
|
|
11
|
+
totalMembers: number;
|
|
12
|
+
color?: string;
|
|
13
|
+
}
|
|
14
|
+
interface Props {
|
|
15
|
+
teams?: Team[];
|
|
16
|
+
}
|
|
17
|
+
declare const TeamsShowcase: import("svelte").Component<Props, {}, "">;
|
|
18
|
+
type TeamsShowcase = ReturnType<typeof TeamsShowcase>;
|
|
19
|
+
export default TeamsShowcase;
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
let { class: className, ...restProps }: HTMLAttributes<HTMLSpanElement> = $props();
|
|
7
7
|
</script>
|
|
8
8
|
|
|
9
|
-
<span aria-hidden="true" data-slot="pagination-ellipsis" class={cn("flex size-
|
|
9
|
+
<span aria-hidden="true" data-slot="pagination-ellipsis" class={cn("flex size-8 items-center justify-center", className)} {...restProps}>
|
|
10
10
|
<Ellipsis class="size-4" />
|
|
11
11
|
<span class="sr-only">More pages</span>
|
|
12
12
|
</span>
|
package/dist/index.d.ts
CHANGED
|
@@ -13,6 +13,7 @@ export { default as FieldRenderer } from './components/FieldRenderer.svelte';
|
|
|
13
13
|
export { default as EmptyState } from './components/EmptyState.svelte';
|
|
14
14
|
export { default as StatsCard } from './components/StatsCard.svelte';
|
|
15
15
|
export { default as PageHeader } from './components/PageHeader.svelte';
|
|
16
|
+
export { default as ResourceOperationsPage } from './components/ResourceOperationsPage.svelte';
|
|
16
17
|
export { default as LoginPage } from './components/LoginPage.svelte';
|
|
17
18
|
export { default as RegisterPage } from './components/RegisterPage.svelte';
|
|
18
19
|
export { default as ForgotPasswordPage } from './components/ForgotPasswordPage.svelte';
|
|
@@ -59,6 +60,11 @@ export { default as SettingsPage } from "./components/SettingsPage.svelte";
|
|
|
59
60
|
export { setRichTextEditor, getRichTextEditor } from "./editor-config.svelte.js";
|
|
60
61
|
export { default as AppearanceSettings } from "./components/AppearanceSettings.svelte";
|
|
61
62
|
export { default as AboutSettings } from "./components/AboutSettings.svelte";
|
|
63
|
+
export { default as SecuritySettings } from "./components/SecuritySettings.svelte";
|
|
64
|
+
export { default as IntegrationsSettings } from "./components/IntegrationsSettings.svelte";
|
|
65
|
+
export { default as NotificationsSettings } from "./components/NotificationsSettings.svelte";
|
|
66
|
+
export { default as ApiSettings } from "./components/ApiSettings.svelte";
|
|
67
|
+
export { default as ErrorPage } from "./components/ErrorPage.svelte";
|
|
62
68
|
export { default as PermissionMatrix } from "./components/PermissionMatrix.svelte";
|
|
63
69
|
export type { RoleInfo, ResourceInfo, ActionInfo } from "./types.js";
|
|
64
70
|
export { default as RolesSettings } from "./components/RolesSettings.svelte";
|
|
@@ -120,3 +126,20 @@ export { setComponentRegistry, getComponentRegistry, useComponent, type Componen
|
|
|
120
126
|
export { builtinDisplayComponents, registerDisplayComponent, getDisplayComponent, hasDisplayComponent, } from './components/fieldComponentMap';
|
|
121
127
|
export type { FieldComponentMap } from './components/fieldComponentMap';
|
|
122
128
|
export { clickOutside, shortcut, intersect, copyOnClick } from './actions';
|
|
129
|
+
export { default as ProfileCard } from './components/profile/ProfileCard.svelte';
|
|
130
|
+
export { default as ProjectsGrid } from './components/profile/ProjectsGrid.svelte';
|
|
131
|
+
export { default as ActivityTimeline } from './components/profile/ActivityTimeline.svelte';
|
|
132
|
+
export { default as TeamsShowcase } from './components/profile/TeamsShowcase.svelte';
|
|
133
|
+
export { default as PublicProfilePage } from './components/profile/PublicProfilePage.svelte';
|
|
134
|
+
export { default as GetStartedPage } from './components/account/GetStartedPage.svelte';
|
|
135
|
+
export { default as CompanyProfilePage } from './components/account/CompanyProfilePage.svelte';
|
|
136
|
+
export { default as SettingsPlainPage } from './components/account/SettingsPlainPage.svelte';
|
|
137
|
+
export { default as SettingsSidebarPage } from './components/account/SettingsSidebarPage.svelte';
|
|
138
|
+
export { default as SettingsEnterprisePage } from './components/account/SettingsEnterprisePage.svelte';
|
|
139
|
+
export { default as ImportMembersPage } from './components/account/ImportMembersPage.svelte';
|
|
140
|
+
export { default as MembersStarterPage } from './components/account/MembersStarterPage.svelte';
|
|
141
|
+
export { default as SecurityLogPage } from './components/account/SecurityLogPage.svelte';
|
|
142
|
+
export { default as TeamMembersPage } from './components/account/TeamMembersPage.svelte';
|
|
143
|
+
export { default as UserCardsNFTPage } from './components/network/UserCardsNFTPage.svelte';
|
|
144
|
+
export { default as TeamCrewTablePage } from './components/network/TeamCrewTablePage.svelte';
|
|
145
|
+
export { default as TwoFactorAuthPage } from './components/TwoFactorAuthPage.svelte';
|
package/dist/index.js
CHANGED
|
@@ -16,6 +16,7 @@ export { default as FieldRenderer } from './components/FieldRenderer.svelte';
|
|
|
16
16
|
export { default as EmptyState } from './components/EmptyState.svelte';
|
|
17
17
|
export { default as StatsCard } from './components/StatsCard.svelte';
|
|
18
18
|
export { default as PageHeader } from './components/PageHeader.svelte';
|
|
19
|
+
export { default as ResourceOperationsPage } from './components/ResourceOperationsPage.svelte';
|
|
19
20
|
export { default as LoginPage } from './components/LoginPage.svelte';
|
|
20
21
|
export { default as RegisterPage } from './components/RegisterPage.svelte';
|
|
21
22
|
export { default as ForgotPasswordPage } from './components/ForgotPasswordPage.svelte';
|
|
@@ -64,6 +65,11 @@ export { setRichTextEditor, getRichTextEditor } from "./editor-config.svelte.js"
|
|
|
64
65
|
// Settings & Preferences
|
|
65
66
|
export { default as AppearanceSettings } from "./components/AppearanceSettings.svelte";
|
|
66
67
|
export { default as AboutSettings } from "./components/AboutSettings.svelte";
|
|
68
|
+
export { default as SecuritySettings } from "./components/SecuritySettings.svelte";
|
|
69
|
+
export { default as IntegrationsSettings } from "./components/IntegrationsSettings.svelte";
|
|
70
|
+
export { default as NotificationsSettings } from "./components/NotificationsSettings.svelte";
|
|
71
|
+
export { default as ApiSettings } from "./components/ApiSettings.svelte";
|
|
72
|
+
export { default as ErrorPage } from "./components/ErrorPage.svelte";
|
|
67
73
|
export { default as PermissionMatrix } from "./components/PermissionMatrix.svelte";
|
|
68
74
|
export { default as RolesSettings } from "./components/RolesSettings.svelte";
|
|
69
75
|
export { default as AuditLogViewer } from "./components/AuditLogViewer.svelte";
|
|
@@ -131,3 +137,24 @@ export { setComponentRegistry, getComponentRegistry, useComponent, } from './com
|
|
|
131
137
|
export { builtinDisplayComponents, registerDisplayComponent, getDisplayComponent, hasDisplayComponent, } from './components/fieldComponentMap';
|
|
132
138
|
// Svelte Actions
|
|
133
139
|
export { clickOutside, shortcut, intersect, copyOnClick } from './actions';
|
|
140
|
+
// Public Profile
|
|
141
|
+
export { default as ProfileCard } from './components/profile/ProfileCard.svelte';
|
|
142
|
+
export { default as ProjectsGrid } from './components/profile/ProjectsGrid.svelte';
|
|
143
|
+
export { default as ActivityTimeline } from './components/profile/ActivityTimeline.svelte';
|
|
144
|
+
export { default as TeamsShowcase } from './components/profile/TeamsShowcase.svelte';
|
|
145
|
+
export { default as PublicProfilePage } from './components/profile/PublicProfilePage.svelte';
|
|
146
|
+
// Account extensions
|
|
147
|
+
export { default as GetStartedPage } from './components/account/GetStartedPage.svelte';
|
|
148
|
+
export { default as CompanyProfilePage } from './components/account/CompanyProfilePage.svelte';
|
|
149
|
+
export { default as SettingsPlainPage } from './components/account/SettingsPlainPage.svelte';
|
|
150
|
+
export { default as SettingsSidebarPage } from './components/account/SettingsSidebarPage.svelte';
|
|
151
|
+
export { default as SettingsEnterprisePage } from './components/account/SettingsEnterprisePage.svelte';
|
|
152
|
+
export { default as ImportMembersPage } from './components/account/ImportMembersPage.svelte';
|
|
153
|
+
export { default as MembersStarterPage } from './components/account/MembersStarterPage.svelte';
|
|
154
|
+
export { default as SecurityLogPage } from './components/account/SecurityLogPage.svelte';
|
|
155
|
+
export { default as TeamMembersPage } from './components/account/TeamMembersPage.svelte';
|
|
156
|
+
// Network
|
|
157
|
+
export { default as UserCardsNFTPage } from './components/network/UserCardsNFTPage.svelte';
|
|
158
|
+
export { default as TeamCrewTablePage } from './components/network/TeamCrewTablePage.svelte';
|
|
159
|
+
// Auth extensions
|
|
160
|
+
export { default as TwoFactorAuthPage } from './components/TwoFactorAuthPage.svelte';
|
|
@@ -10,9 +10,26 @@ const ROUTES = [
|
|
|
10
10
|
'/register',
|
|
11
11
|
'/forgot-password',
|
|
12
12
|
'/update-password',
|
|
13
|
+
'/2fa',
|
|
13
14
|
'/settings',
|
|
14
15
|
'/settings/:tab',
|
|
15
16
|
'/',
|
|
17
|
+
'/public-profile',
|
|
18
|
+
'/public-profile/projects/:columns',
|
|
19
|
+
'/public-profile/activity',
|
|
20
|
+
'/public-profile/teams',
|
|
21
|
+
'/public-profile/profiles/:variant',
|
|
22
|
+
'/account/get-started',
|
|
23
|
+
'/account/company-profile',
|
|
24
|
+
'/account/settings-plain',
|
|
25
|
+
'/account/settings-sidebar',
|
|
26
|
+
'/account/settings-enterprise',
|
|
27
|
+
'/account/import-members',
|
|
28
|
+
'/account/members-starter',
|
|
29
|
+
'/account/team-members',
|
|
30
|
+
'/account/security-log',
|
|
31
|
+
'/network/user-cards',
|
|
32
|
+
'/network/team-crew',
|
|
16
33
|
'/:resource',
|
|
17
34
|
'/:resource/create',
|
|
18
35
|
'/:resource/edit/:id',
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@svadmin/ui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.36.0",
|
|
4
4
|
"description": "Pre-built admin UI components — AdminApp, AutoTable, AutoForm, Sidebar, Layout",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": [
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"./components/*": "./dist/components/*"
|
|
34
34
|
},
|
|
35
35
|
"peerDependencies": {
|
|
36
|
-
"@svadmin/core": "^0.
|
|
36
|
+
"@svadmin/core": "^0.29.0",
|
|
37
37
|
"@tanstack/svelte-query": "^6.1.29",
|
|
38
38
|
"highlight.js": "^11.11.1",
|
|
39
39
|
"isomorphic-dompurify": "^3.15.0",
|