@svadmin/ui 0.42.3 → 0.43.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 +462 -825
- package/dist/app.theme.css +462 -825
- package/dist/components/ErrorPage.svelte +4 -56
- package/dist/components/TwoFactorAuthPage.svelte +44 -232
- package/dist/components/account/CompanyProfilePage.svelte +21 -142
- package/dist/components/account/GetStartedPage.svelte +33 -115
- package/dist/components/account/GetStartedPage.svelte.d.ts +1 -2
- package/dist/components/account/SecurityLogPage.svelte +16 -131
- package/dist/components/account/SettingsEnterprisePage.svelte +15 -275
- package/dist/components/account/SettingsPlainPage.svelte +10 -175
- package/dist/components/account/SettingsSidebarPage.svelte +11 -304
- package/dist/components/account/TeamMembersPage.svelte +18 -187
- package/dist/components/account/UserProfilePage.svelte +19 -196
- package/dist/components/account/UserProfilePage.svelte.d.ts +1 -2
- package/dist/components/content/ApiKeyList.svelte +13 -0
- package/dist/components/content/ApiKeyList.svelte.d.ts +16 -0
- package/dist/components/content/ContentPageHeader.svelte +31 -0
- package/dist/components/content/ContentPageHeader.svelte.d.ts +12 -0
- package/dist/components/content/ContentPageShell.svelte +39 -0
- package/dist/components/content/ContentPageShell.svelte.d.ts +14 -0
- package/dist/components/content/DataState.svelte +44 -0
- package/dist/components/content/DataState.svelte.d.ts +13 -0
- package/dist/components/content/DescriptionList.svelte +27 -0
- package/dist/components/content/DescriptionList.svelte.d.ts +14 -0
- package/dist/components/content/FileList.svelte +13 -0
- package/dist/components/content/FileList.svelte.d.ts +16 -0
- package/dist/components/content/FilterToolbar.svelte +24 -0
- package/dist/components/content/FilterToolbar.svelte.d.ts +11 -0
- package/dist/components/content/ImportDropzone.svelte +19 -0
- package/dist/components/content/ImportDropzone.svelte.d.ts +10 -0
- package/dist/components/content/IntegrationCard.svelte +16 -0
- package/dist/components/content/IntegrationCard.svelte.d.ts +15 -0
- package/dist/components/content/MemberList.svelte +16 -0
- package/dist/components/content/MemberList.svelte.d.ts +17 -0
- package/dist/components/content/MetricBlock.svelte +27 -0
- package/dist/components/content/MetricBlock.svelte.d.ts +13 -0
- package/dist/components/content/NetworkTable.svelte +18 -0
- package/dist/components/content/NetworkTable.svelte.d.ts +31 -0
- package/dist/components/content/NetworkTable.types.d.ts +4 -0
- package/dist/components/content/NetworkTable.types.js +1 -0
- package/dist/components/content/NetworkUserCard.svelte +17 -0
- package/dist/components/content/NetworkUserCard.svelte.d.ts +17 -0
- package/dist/components/content/OtpInput.svelte +22 -0
- package/dist/components/content/OtpInput.svelte.d.ts +10 -0
- package/dist/components/content/PageToolbar.svelte +18 -0
- package/dist/components/content/PageToolbar.svelte.d.ts +10 -0
- package/dist/components/content/ProjectCard.svelte +39 -0
- package/dist/components/content/ProjectCard.svelte.d.ts +20 -0
- package/dist/components/content/SectionHeader.svelte +18 -0
- package/dist/components/content/SectionHeader.svelte.d.ts +10 -0
- package/dist/components/content/SecurityEventTable.svelte +18 -0
- package/dist/components/content/SecurityEventTable.svelte.d.ts +15 -0
- package/dist/components/content/StatusBadge.svelte +19 -0
- package/dist/components/content/StatusBadge.svelte.d.ts +9 -0
- package/dist/components/content/SystemErrorState.svelte +18 -0
- package/dist/components/content/SystemErrorState.svelte.d.ts +10 -0
- package/dist/components/content/TeamCard.svelte +26 -0
- package/dist/components/content/TeamCard.svelte.d.ts +23 -0
- package/dist/components/content/TwoFactorStepper.svelte +11 -0
- package/dist/components/content/TwoFactorStepper.svelte.d.ts +8 -0
- package/dist/components/content/index.d.ts +32 -0
- package/dist/components/content/index.js +22 -0
- package/dist/components/network/TeamCrewTablePage.svelte +29 -181
- package/dist/components/network/UserCardsNFTPage.svelte +24 -137
- package/dist/components/profile/ActivityTimeline.svelte +17 -91
- package/dist/components/profile/ProfileCard.svelte +4 -4
- package/dist/components/profile/ProjectsGrid.svelte +28 -106
- package/dist/components/profile/ProjectsGrid.svelte.d.ts +2 -12
- package/dist/components/profile/PublicProfilePage.svelte +31 -181
- package/dist/components/profile/TeamsShowcase.svelte +12 -114
- package/dist/components/profile/TeamsShowcase.svelte.d.ts +2 -12
- package/dist/index.d.ts +36 -0
- package/dist/index.js +24 -0
- package/dist/reference-data.d.ts +171 -0
- package/dist/reference-data.js +39 -0
- package/package.json +1 -1
|
@@ -1,119 +1,17 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { useTranslation } from '@svadmin/core/i18n';
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
import { Users, ArrowRight, Search, Star } from '@lucide/svelte';
|
|
8
|
-
|
|
9
|
-
const i18n = useTranslation();
|
|
10
|
-
|
|
11
|
-
interface TeamMember {
|
|
12
|
-
name: string;
|
|
13
|
-
avatar?: string;
|
|
14
|
-
role?: string;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
interface Team {
|
|
18
|
-
id: string;
|
|
19
|
-
name: string;
|
|
20
|
-
description: string;
|
|
21
|
-
members: TeamMember[];
|
|
22
|
-
totalMembers: number;
|
|
23
|
-
color?: string;
|
|
24
|
-
rating?: number;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
interface Props {
|
|
28
|
-
teams?: Team[];
|
|
29
|
-
}
|
|
30
|
-
|
|
3
|
+
import { DataState, FilterToolbar, TeamCard } from '../content/index.js';
|
|
4
|
+
import type { TeamSummary } from '../content/TeamCard.svelte';
|
|
5
|
+
interface Team extends TeamSummary { description: string; }
|
|
6
|
+
interface Props { teams?: Team[]; }
|
|
31
7
|
let { teams = [] }: Props = $props();
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
const filtered = $derived(
|
|
35
|
-
searchQuery
|
|
36
|
-
? teams.filter(t => t.name.toLowerCase().includes(searchQuery.toLowerCase()) || t.description.toLowerCase().includes(searchQuery.toLowerCase()))
|
|
37
|
-
: teams
|
|
38
|
-
);
|
|
39
|
-
|
|
40
|
-
const initials = (name: string) => name.split(' ').map(n => n[0]).join('').toUpperCase().slice(0, 2);
|
|
8
|
+
let query = $state('');
|
|
9
|
+
const i18n = useTranslation();
|
|
10
|
+
const filtered = $derived(query ? teams.filter((team) => `${team.name} ${team.description}`.toLowerCase().includes(query.toLowerCase())) : teams);
|
|
41
11
|
</script>
|
|
42
12
|
|
|
43
|
-
<
|
|
44
|
-
<div class="flex flex-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
<Input placeholder={i18n.t('publicProfile.searchTeams')} bind:value={searchQuery} class="w-48 pl-9" />
|
|
49
|
-
</div>
|
|
50
|
-
</div>
|
|
51
|
-
|
|
52
|
-
{#if filtered.length === 0}
|
|
53
|
-
<div class="rounded-xl border border-dashed border-border/60 p-8 text-center">
|
|
54
|
-
<p class="text-sm text-muted-foreground">{i18n.t('publicProfile.noTeams')}</p>
|
|
55
|
-
</div>
|
|
56
|
-
{:else}
|
|
57
|
-
<div class="grid gap-4 sm:grid-cols-1 md:grid-cols-2 lg:grid-cols-3">
|
|
58
|
-
{#each filtered as team (team.id)}
|
|
59
|
-
<Card.Card class="border-border/60 hover:border-primary/30 transition-colors">
|
|
60
|
-
<Card.CardContent class="p-4 space-y-3">
|
|
61
|
-
<div class="flex items-start justify-between gap-2">
|
|
62
|
-
<div class="flex items-center gap-3">
|
|
63
|
-
{#if team.color}
|
|
64
|
-
<div class="h-8 w-8 rounded-lg" style="background-color: {team.color}20;">
|
|
65
|
-
<Users class="h-4 w-4" style="color: {team.color}" />
|
|
66
|
-
</div>
|
|
67
|
-
{:else}
|
|
68
|
-
<div class="flex h-8 w-8 items-center justify-center rounded-lg bg-primary/10 text-primary">
|
|
69
|
-
<Users class="h-4 w-4" />
|
|
70
|
-
</div>
|
|
71
|
-
{/if}
|
|
72
|
-
<div>
|
|
73
|
-
<h4 class="font-semibold text-foreground">{team.name}</h4>
|
|
74
|
-
<p class="text-xs text-muted-foreground">{i18n.t('publicProfile.projectMembers', { count: team.totalMembers })}</p>
|
|
75
|
-
</div>
|
|
76
|
-
</div>
|
|
77
|
-
{#if team.rating}
|
|
78
|
-
<span class="flex shrink-0 items-center gap-1 text-xs font-semibold text-amber-500">
|
|
79
|
-
<Star class="h-3.5 w-3.5 fill-amber-400 text-amber-400" />{team.rating}
|
|
80
|
-
</span>
|
|
81
|
-
{/if}
|
|
82
|
-
</div>
|
|
83
|
-
|
|
84
|
-
<p class="text-sm text-muted-foreground line-clamp-2">{team.description}</p>
|
|
85
|
-
|
|
86
|
-
<!-- Member avatars -->
|
|
87
|
-
<div class="flex items-center gap-1">
|
|
88
|
-
{#each team.members.slice(0, 5) as member (member.name)}
|
|
89
|
-
{#if member.avatar}
|
|
90
|
-
<Avatar class="h-7 w-7 ring-1 ring-background">
|
|
91
|
-
<img src={member.avatar} alt={member.name} />
|
|
92
|
-
</Avatar>
|
|
93
|
-
{:else}
|
|
94
|
-
<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">
|
|
95
|
-
{initials(member.name)}
|
|
96
|
-
</div>
|
|
97
|
-
{/if}
|
|
98
|
-
{/each}
|
|
99
|
-
{#if team.members.length > 5}
|
|
100
|
-
<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">
|
|
101
|
-
+{team.members.length - 5}
|
|
102
|
-
</div>
|
|
103
|
-
{/if}
|
|
104
|
-
</div>
|
|
105
|
-
|
|
106
|
-
<div class="flex gap-2 pt-2 border-t">
|
|
107
|
-
<Button variant="outline" size="sm" class="flex-1">
|
|
108
|
-
{i18n.t('publicProfile.join')}
|
|
109
|
-
</Button>
|
|
110
|
-
<Button variant="ghost" size="sm" class="flex-1">
|
|
111
|
-
{i18n.t('publicProfile.viewProfile')} <ArrowRight class="h-3.5 w-3.5 ml-1" />
|
|
112
|
-
</Button>
|
|
113
|
-
</div>
|
|
114
|
-
</Card.CardContent>
|
|
115
|
-
</Card.Card>
|
|
116
|
-
{/each}
|
|
117
|
-
</div>
|
|
118
|
-
{/if}
|
|
119
|
-
</div>
|
|
13
|
+
<section class="space-y-4">
|
|
14
|
+
<div class="flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between"><div><h2 class="text-base font-semibold text-foreground">{i18n.t('publicProfile.teamsCount', { count: filtered.length })}</h2><p class="mt-1 text-sm text-muted-foreground">{i18n.t('publicProfile.searchTeams')}</p></div></div>
|
|
15
|
+
<FilterToolbar bind:query placeholder={i18n.t('publicProfile.searchTeams')} />
|
|
16
|
+
{#if filtered.length === 0}<DataState state="empty" title={i18n.t('publicProfile.noTeams')} />{:else}<div class="grid gap-4 md:grid-cols-2 xl:grid-cols-3">{#each filtered as team (team.id)}<TeamCard {team} />{/each}</div>{/if}
|
|
17
|
+
</section>
|
|
@@ -1,16 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
avatar?: string;
|
|
4
|
-
role?: string;
|
|
5
|
-
}
|
|
6
|
-
interface Team {
|
|
7
|
-
id: string;
|
|
8
|
-
name: string;
|
|
1
|
+
import type { TeamSummary } from '../content/TeamCard.svelte';
|
|
2
|
+
interface Team extends TeamSummary {
|
|
9
3
|
description: string;
|
|
10
|
-
members: TeamMember[];
|
|
11
|
-
totalMembers: number;
|
|
12
|
-
color?: string;
|
|
13
|
-
rating?: number;
|
|
14
4
|
}
|
|
15
5
|
interface Props {
|
|
16
6
|
teams?: Team[];
|
package/dist/index.d.ts
CHANGED
|
@@ -151,3 +151,39 @@ export { default as TeamMembersPage } from './components/account/TeamMembersPage
|
|
|
151
151
|
export { default as UserCardsNFTPage } from './components/network/UserCardsNFTPage.svelte';
|
|
152
152
|
export { default as TeamCrewTablePage } from './components/network/TeamCrewTablePage.svelte';
|
|
153
153
|
export { default as TwoFactorAuthPage } from './components/TwoFactorAuthPage.svelte';
|
|
154
|
+
export { default as ContentPageShell } from './components/content/ContentPageShell.svelte';
|
|
155
|
+
export { default as ContentPageHeader } from './components/content/ContentPageHeader.svelte';
|
|
156
|
+
export { default as SectionHeader } from './components/content/SectionHeader.svelte';
|
|
157
|
+
export { default as PageToolbar } from './components/content/PageToolbar.svelte';
|
|
158
|
+
export { default as MetricBlock } from './components/content/MetricBlock.svelte';
|
|
159
|
+
export { default as DescriptionList } from './components/content/DescriptionList.svelte';
|
|
160
|
+
export type { DescriptionItem } from './components/content/DescriptionList.svelte';
|
|
161
|
+
export { default as StatusBadge } from './components/content/StatusBadge.svelte';
|
|
162
|
+
export type { Status } from './components/content/StatusBadge.svelte';
|
|
163
|
+
export { default as FilterToolbar } from './components/content/FilterToolbar.svelte';
|
|
164
|
+
export { default as DataState } from './components/content/DataState.svelte';
|
|
165
|
+
export type { DataStateKind } from './components/content/DataState.svelte';
|
|
166
|
+
export { default as ProjectCard } from './components/content/ProjectCard.svelte';
|
|
167
|
+
export type { ProjectSummary, ProjectStatus } from './components/content/ProjectCard.svelte';
|
|
168
|
+
export { default as TeamCard } from './components/content/TeamCard.svelte';
|
|
169
|
+
export type { TeamSummary } from './components/content/TeamCard.svelte';
|
|
170
|
+
export { default as FileList } from './components/content/FileList.svelte';
|
|
171
|
+
export type { FileItem } from './components/content/FileList.svelte';
|
|
172
|
+
export { default as IntegrationCard } from './components/content/IntegrationCard.svelte';
|
|
173
|
+
export type { IntegrationSummary } from './components/content/IntegrationCard.svelte';
|
|
174
|
+
export { default as ApiKeyList } from './components/content/ApiKeyList.svelte';
|
|
175
|
+
export type { ApiKeySummary } from './components/content/ApiKeyList.svelte';
|
|
176
|
+
export { default as SecurityEventTable } from './components/content/SecurityEventTable.svelte';
|
|
177
|
+
export type { SecurityEvent } from './components/content/SecurityEventTable.svelte';
|
|
178
|
+
export { default as MemberList } from './components/content/MemberList.svelte';
|
|
179
|
+
export type { MemberSummary } from './components/content/MemberList.svelte';
|
|
180
|
+
export { default as ImportDropzone } from './components/content/ImportDropzone.svelte';
|
|
181
|
+
export { default as NetworkUserCard } from './components/content/NetworkUserCard.svelte';
|
|
182
|
+
export type { NetworkUser } from './components/content/NetworkUserCard.svelte';
|
|
183
|
+
export { default as NetworkTable } from './components/content/NetworkTable.svelte';
|
|
184
|
+
export type { NetworkColumn } from './components/content/NetworkTable.types.js';
|
|
185
|
+
export { default as OtpInput } from './components/content/OtpInput.svelte';
|
|
186
|
+
export { default as TwoFactorStepper } from './components/content/TwoFactorStepper.svelte';
|
|
187
|
+
export { default as SystemErrorState } from './components/content/SystemErrorState.svelte';
|
|
188
|
+
export { referenceDemoData } from './reference-data.js';
|
|
189
|
+
export type { DemoMember, DemoProject, DemoTeam, DemoIntegration, DemoApiKey, DemoSecurityEvent, DemoNotification } from './reference-data.js';
|
package/dist/index.js
CHANGED
|
@@ -166,3 +166,27 @@ export { default as UserCardsNFTPage } from './components/network/UserCardsNFTPa
|
|
|
166
166
|
export { default as TeamCrewTablePage } from './components/network/TeamCrewTablePage.svelte';
|
|
167
167
|
// Auth extensions
|
|
168
168
|
export { default as TwoFactorAuthPage } from './components/TwoFactorAuthPage.svelte';
|
|
169
|
+
// Stripe-first content page and domain primitives
|
|
170
|
+
export { default as ContentPageShell } from './components/content/ContentPageShell.svelte';
|
|
171
|
+
export { default as ContentPageHeader } from './components/content/ContentPageHeader.svelte';
|
|
172
|
+
export { default as SectionHeader } from './components/content/SectionHeader.svelte';
|
|
173
|
+
export { default as PageToolbar } from './components/content/PageToolbar.svelte';
|
|
174
|
+
export { default as MetricBlock } from './components/content/MetricBlock.svelte';
|
|
175
|
+
export { default as DescriptionList } from './components/content/DescriptionList.svelte';
|
|
176
|
+
export { default as StatusBadge } from './components/content/StatusBadge.svelte';
|
|
177
|
+
export { default as FilterToolbar } from './components/content/FilterToolbar.svelte';
|
|
178
|
+
export { default as DataState } from './components/content/DataState.svelte';
|
|
179
|
+
export { default as ProjectCard } from './components/content/ProjectCard.svelte';
|
|
180
|
+
export { default as TeamCard } from './components/content/TeamCard.svelte';
|
|
181
|
+
export { default as FileList } from './components/content/FileList.svelte';
|
|
182
|
+
export { default as IntegrationCard } from './components/content/IntegrationCard.svelte';
|
|
183
|
+
export { default as ApiKeyList } from './components/content/ApiKeyList.svelte';
|
|
184
|
+
export { default as SecurityEventTable } from './components/content/SecurityEventTable.svelte';
|
|
185
|
+
export { default as MemberList } from './components/content/MemberList.svelte';
|
|
186
|
+
export { default as ImportDropzone } from './components/content/ImportDropzone.svelte';
|
|
187
|
+
export { default as NetworkUserCard } from './components/content/NetworkUserCard.svelte';
|
|
188
|
+
export { default as NetworkTable } from './components/content/NetworkTable.svelte';
|
|
189
|
+
export { default as OtpInput } from './components/content/OtpInput.svelte';
|
|
190
|
+
export { default as TwoFactorStepper } from './components/content/TwoFactorStepper.svelte';
|
|
191
|
+
export { default as SystemErrorState } from './components/content/SystemErrorState.svelte';
|
|
192
|
+
export { referenceDemoData } from './reference-data.js';
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
export interface DemoMember {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
email: string;
|
|
5
|
+
role: string;
|
|
6
|
+
department: string;
|
|
7
|
+
status: 'active' | 'invited' | 'inactive';
|
|
8
|
+
}
|
|
9
|
+
export interface DemoProject {
|
|
10
|
+
id: string;
|
|
11
|
+
name: string;
|
|
12
|
+
description: string;
|
|
13
|
+
status: 'active' | 'completed' | 'on-hold';
|
|
14
|
+
members: number;
|
|
15
|
+
tasks: number;
|
|
16
|
+
progress: number;
|
|
17
|
+
tags: string[];
|
|
18
|
+
}
|
|
19
|
+
export interface DemoTeam {
|
|
20
|
+
id: string;
|
|
21
|
+
name: string;
|
|
22
|
+
description: string;
|
|
23
|
+
totalMembers: number;
|
|
24
|
+
members: Array<{
|
|
25
|
+
name: string;
|
|
26
|
+
role?: string;
|
|
27
|
+
}>;
|
|
28
|
+
color?: string;
|
|
29
|
+
rating?: number;
|
|
30
|
+
}
|
|
31
|
+
export interface DemoIntegration {
|
|
32
|
+
id: string;
|
|
33
|
+
name: string;
|
|
34
|
+
description: string;
|
|
35
|
+
account: string;
|
|
36
|
+
connected: boolean;
|
|
37
|
+
}
|
|
38
|
+
export interface DemoApiKey {
|
|
39
|
+
id: string;
|
|
40
|
+
name: string;
|
|
41
|
+
prefix: string;
|
|
42
|
+
createdAt: string;
|
|
43
|
+
lastUsedAt: string;
|
|
44
|
+
}
|
|
45
|
+
export interface DemoSecurityEvent {
|
|
46
|
+
id: string;
|
|
47
|
+
event: string;
|
|
48
|
+
actor: string;
|
|
49
|
+
location: string;
|
|
50
|
+
createdAt: string;
|
|
51
|
+
severity: 'info' | 'warning' | 'danger';
|
|
52
|
+
}
|
|
53
|
+
export interface DemoNotification {
|
|
54
|
+
id: string;
|
|
55
|
+
title: string;
|
|
56
|
+
detail: string;
|
|
57
|
+
unread: boolean;
|
|
58
|
+
}
|
|
59
|
+
export declare const referenceDemoData: {
|
|
60
|
+
organization: {
|
|
61
|
+
id: string;
|
|
62
|
+
name: string;
|
|
63
|
+
plan: string;
|
|
64
|
+
members: number;
|
|
65
|
+
};
|
|
66
|
+
members: ({
|
|
67
|
+
id: string;
|
|
68
|
+
name: string;
|
|
69
|
+
email: string;
|
|
70
|
+
role: string;
|
|
71
|
+
department: string;
|
|
72
|
+
status: "active";
|
|
73
|
+
} | {
|
|
74
|
+
id: string;
|
|
75
|
+
name: string;
|
|
76
|
+
email: string;
|
|
77
|
+
role: string;
|
|
78
|
+
department: string;
|
|
79
|
+
status: "invited";
|
|
80
|
+
} | {
|
|
81
|
+
id: string;
|
|
82
|
+
name: string;
|
|
83
|
+
email: string;
|
|
84
|
+
role: string;
|
|
85
|
+
department: string;
|
|
86
|
+
status: "inactive";
|
|
87
|
+
})[];
|
|
88
|
+
projects: ({
|
|
89
|
+
id: string;
|
|
90
|
+
name: string;
|
|
91
|
+
description: string;
|
|
92
|
+
status: "active";
|
|
93
|
+
members: number;
|
|
94
|
+
tasks: number;
|
|
95
|
+
progress: number;
|
|
96
|
+
tags: string[];
|
|
97
|
+
} | {
|
|
98
|
+
id: string;
|
|
99
|
+
name: string;
|
|
100
|
+
description: string;
|
|
101
|
+
status: "completed";
|
|
102
|
+
members: number;
|
|
103
|
+
tasks: number;
|
|
104
|
+
progress: number;
|
|
105
|
+
tags: string[];
|
|
106
|
+
} | {
|
|
107
|
+
id: string;
|
|
108
|
+
name: string;
|
|
109
|
+
description: string;
|
|
110
|
+
status: "on-hold";
|
|
111
|
+
members: number;
|
|
112
|
+
tasks: number;
|
|
113
|
+
progress: number;
|
|
114
|
+
tags: string[];
|
|
115
|
+
})[];
|
|
116
|
+
teams: {
|
|
117
|
+
id: string;
|
|
118
|
+
name: string;
|
|
119
|
+
description: string;
|
|
120
|
+
totalMembers: number;
|
|
121
|
+
members: {
|
|
122
|
+
name: string;
|
|
123
|
+
}[];
|
|
124
|
+
}[];
|
|
125
|
+
integrations: ({
|
|
126
|
+
id: string;
|
|
127
|
+
name: string;
|
|
128
|
+
description: string;
|
|
129
|
+
account: string;
|
|
130
|
+
connected: true;
|
|
131
|
+
} | {
|
|
132
|
+
id: string;
|
|
133
|
+
name: string;
|
|
134
|
+
description: string;
|
|
135
|
+
account: string;
|
|
136
|
+
connected: false;
|
|
137
|
+
})[];
|
|
138
|
+
apiKeys: {
|
|
139
|
+
id: string;
|
|
140
|
+
name: string;
|
|
141
|
+
prefix: string;
|
|
142
|
+
createdAt: string;
|
|
143
|
+
lastUsedAt: string;
|
|
144
|
+
}[];
|
|
145
|
+
securityEvents: ({
|
|
146
|
+
id: string;
|
|
147
|
+
event: string;
|
|
148
|
+
actor: string;
|
|
149
|
+
location: string;
|
|
150
|
+
createdAt: string;
|
|
151
|
+
severity: "info";
|
|
152
|
+
} | {
|
|
153
|
+
id: string;
|
|
154
|
+
event: string;
|
|
155
|
+
actor: string;
|
|
156
|
+
location: string;
|
|
157
|
+
createdAt: string;
|
|
158
|
+
severity: "warning";
|
|
159
|
+
})[];
|
|
160
|
+
notifications: ({
|
|
161
|
+
id: string;
|
|
162
|
+
title: string;
|
|
163
|
+
detail: string;
|
|
164
|
+
unread: true;
|
|
165
|
+
} | {
|
|
166
|
+
id: string;
|
|
167
|
+
title: string;
|
|
168
|
+
detail: string;
|
|
169
|
+
unread: false;
|
|
170
|
+
})[];
|
|
171
|
+
};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export const referenceDemoData = {
|
|
2
|
+
organization: { id: 'acme', name: 'Acme Corporation', plan: 'Enterprise', members: 1250 },
|
|
3
|
+
members: [
|
|
4
|
+
{ id: '1', name: 'Alex Chen', email: 'alex@acme.com', role: 'Admin', department: 'Engineering', status: 'active' },
|
|
5
|
+
{ id: '2', name: 'Sarah Kim', email: 'sarah@acme.com', role: 'Editor', department: 'Design', status: 'active' },
|
|
6
|
+
{ id: '3', name: 'Mike Johnson', email: 'mike@acme.com', role: 'Viewer', department: 'Marketing', status: 'invited' },
|
|
7
|
+
{ id: '4', name: 'Lisa Wang', email: 'lisa@acme.com', role: 'Editor', department: 'Engineering', status: 'active' },
|
|
8
|
+
{ id: '5', name: 'Tom Brown', email: 'tom@acme.com', role: 'Viewer', department: 'Sales', status: 'inactive' },
|
|
9
|
+
],
|
|
10
|
+
projects: [
|
|
11
|
+
{ id: '1', name: 'Dashboard Redesign', description: 'Modern admin dashboard with real-time analytics and customizable widgets.', status: 'active', members: 8, tasks: 34, progress: 72, tags: ['UI', 'Analytics'] },
|
|
12
|
+
{ id: '2', name: 'API Gateway v2', description: 'High-performance API gateway with rate limiting and circuit breaker patterns.', status: 'active', members: 5, tasks: 21, progress: 45, tags: ['Backend', 'Infra'] },
|
|
13
|
+
{ id: '3', name: 'Mobile App', description: 'Cross-platform mobile application built with shared native modules.', status: 'completed', members: 12, tasks: 56, progress: 100, tags: ['Mobile', 'Product'] },
|
|
14
|
+
{ id: '4', name: 'Data Pipeline', description: 'Real-time data processing pipeline for event streaming.', status: 'on-hold', members: 3, tasks: 18, progress: 20, tags: ['Data', 'Streaming'] },
|
|
15
|
+
],
|
|
16
|
+
teams: [
|
|
17
|
+
{ id: '1', name: 'Frontend Platform', description: 'Core UI component library and design system.', totalMembers: 8, members: [{ name: 'Alice' }, { name: 'Bob' }, { name: 'Carol' }] },
|
|
18
|
+
{ id: '2', name: 'Backend Services', description: 'API development, services architecture, and reliability.', totalMembers: 5, members: [{ name: 'Dave' }, { name: 'Eve' }] },
|
|
19
|
+
{ id: '3', name: 'Design Systems', description: 'Research, visual design, and accessibility standards.', totalMembers: 6, members: [{ name: 'Frank' }, { name: 'Grace' }] },
|
|
20
|
+
],
|
|
21
|
+
integrations: [
|
|
22
|
+
{ id: 'repo', name: 'Source Control', description: 'Pull requests, issues, and repository activity.', account: 'alexchen', connected: true },
|
|
23
|
+
{ id: 'chat', name: 'ChatOps', description: 'Team notifications and direct messages.', account: '@alex.chen', connected: true },
|
|
24
|
+
{ id: 'drive', name: 'Cloud Drive', description: 'Shared files and document previews.', account: 'alex@example.com', connected: false },
|
|
25
|
+
],
|
|
26
|
+
apiKeys: [
|
|
27
|
+
{ id: 'key-1', name: 'Local development', prefix: 'sv_demo_dev_', createdAt: '2026-08-01', lastUsedAt: 'Today, 09:20' },
|
|
28
|
+
{ id: 'key-2', name: 'CI deploy', prefix: 'sv_demo_ci_', createdAt: '2026-07-18', lastUsedAt: 'Yesterday, 18:02' },
|
|
29
|
+
],
|
|
30
|
+
securityEvents: [
|
|
31
|
+
{ id: '1', event: 'Login succeeded', actor: 'Alex Chen', location: 'Shanghai, CN', createdAt: '2 minutes ago', severity: 'info' },
|
|
32
|
+
{ id: '2', event: 'API key created', actor: 'Alex Chen', location: 'Shanghai, CN', createdAt: '1 hour ago', severity: 'info' },
|
|
33
|
+
{ id: '3', event: 'Login failed', actor: 'Unknown', location: 'Unknown', createdAt: '3 hours ago', severity: 'warning' },
|
|
34
|
+
],
|
|
35
|
+
notifications: [
|
|
36
|
+
{ id: 'n1', title: 'Sarah commented on Dashboard Redesign', detail: '8 minutes ago', unread: true },
|
|
37
|
+
{ id: 'n2', title: 'Weekly security summary is ready', detail: 'Yesterday', unread: false },
|
|
38
|
+
],
|
|
39
|
+
};
|