@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.
Files changed (76) hide show
  1. package/dist/app.css +462 -825
  2. package/dist/app.theme.css +462 -825
  3. package/dist/components/ErrorPage.svelte +4 -56
  4. package/dist/components/TwoFactorAuthPage.svelte +44 -232
  5. package/dist/components/account/CompanyProfilePage.svelte +21 -142
  6. package/dist/components/account/GetStartedPage.svelte +33 -115
  7. package/dist/components/account/GetStartedPage.svelte.d.ts +1 -2
  8. package/dist/components/account/SecurityLogPage.svelte +16 -131
  9. package/dist/components/account/SettingsEnterprisePage.svelte +15 -275
  10. package/dist/components/account/SettingsPlainPage.svelte +10 -175
  11. package/dist/components/account/SettingsSidebarPage.svelte +11 -304
  12. package/dist/components/account/TeamMembersPage.svelte +18 -187
  13. package/dist/components/account/UserProfilePage.svelte +19 -196
  14. package/dist/components/account/UserProfilePage.svelte.d.ts +1 -2
  15. package/dist/components/content/ApiKeyList.svelte +13 -0
  16. package/dist/components/content/ApiKeyList.svelte.d.ts +16 -0
  17. package/dist/components/content/ContentPageHeader.svelte +31 -0
  18. package/dist/components/content/ContentPageHeader.svelte.d.ts +12 -0
  19. package/dist/components/content/ContentPageShell.svelte +39 -0
  20. package/dist/components/content/ContentPageShell.svelte.d.ts +14 -0
  21. package/dist/components/content/DataState.svelte +44 -0
  22. package/dist/components/content/DataState.svelte.d.ts +13 -0
  23. package/dist/components/content/DescriptionList.svelte +27 -0
  24. package/dist/components/content/DescriptionList.svelte.d.ts +14 -0
  25. package/dist/components/content/FileList.svelte +13 -0
  26. package/dist/components/content/FileList.svelte.d.ts +16 -0
  27. package/dist/components/content/FilterToolbar.svelte +24 -0
  28. package/dist/components/content/FilterToolbar.svelte.d.ts +11 -0
  29. package/dist/components/content/ImportDropzone.svelte +19 -0
  30. package/dist/components/content/ImportDropzone.svelte.d.ts +10 -0
  31. package/dist/components/content/IntegrationCard.svelte +16 -0
  32. package/dist/components/content/IntegrationCard.svelte.d.ts +15 -0
  33. package/dist/components/content/MemberList.svelte +16 -0
  34. package/dist/components/content/MemberList.svelte.d.ts +17 -0
  35. package/dist/components/content/MetricBlock.svelte +27 -0
  36. package/dist/components/content/MetricBlock.svelte.d.ts +13 -0
  37. package/dist/components/content/NetworkTable.svelte +18 -0
  38. package/dist/components/content/NetworkTable.svelte.d.ts +31 -0
  39. package/dist/components/content/NetworkTable.types.d.ts +4 -0
  40. package/dist/components/content/NetworkTable.types.js +1 -0
  41. package/dist/components/content/NetworkUserCard.svelte +17 -0
  42. package/dist/components/content/NetworkUserCard.svelte.d.ts +17 -0
  43. package/dist/components/content/OtpInput.svelte +22 -0
  44. package/dist/components/content/OtpInput.svelte.d.ts +10 -0
  45. package/dist/components/content/PageToolbar.svelte +18 -0
  46. package/dist/components/content/PageToolbar.svelte.d.ts +10 -0
  47. package/dist/components/content/ProjectCard.svelte +39 -0
  48. package/dist/components/content/ProjectCard.svelte.d.ts +20 -0
  49. package/dist/components/content/SectionHeader.svelte +18 -0
  50. package/dist/components/content/SectionHeader.svelte.d.ts +10 -0
  51. package/dist/components/content/SecurityEventTable.svelte +18 -0
  52. package/dist/components/content/SecurityEventTable.svelte.d.ts +15 -0
  53. package/dist/components/content/StatusBadge.svelte +19 -0
  54. package/dist/components/content/StatusBadge.svelte.d.ts +9 -0
  55. package/dist/components/content/SystemErrorState.svelte +18 -0
  56. package/dist/components/content/SystemErrorState.svelte.d.ts +10 -0
  57. package/dist/components/content/TeamCard.svelte +26 -0
  58. package/dist/components/content/TeamCard.svelte.d.ts +23 -0
  59. package/dist/components/content/TwoFactorStepper.svelte +11 -0
  60. package/dist/components/content/TwoFactorStepper.svelte.d.ts +8 -0
  61. package/dist/components/content/index.d.ts +32 -0
  62. package/dist/components/content/index.js +22 -0
  63. package/dist/components/network/TeamCrewTablePage.svelte +29 -181
  64. package/dist/components/network/UserCardsNFTPage.svelte +24 -137
  65. package/dist/components/profile/ActivityTimeline.svelte +17 -91
  66. package/dist/components/profile/ProfileCard.svelte +4 -4
  67. package/dist/components/profile/ProjectsGrid.svelte +28 -106
  68. package/dist/components/profile/ProjectsGrid.svelte.d.ts +2 -12
  69. package/dist/components/profile/PublicProfilePage.svelte +31 -181
  70. package/dist/components/profile/TeamsShowcase.svelte +12 -114
  71. package/dist/components/profile/TeamsShowcase.svelte.d.ts +2 -12
  72. package/dist/index.d.ts +36 -0
  73. package/dist/index.js +24 -0
  74. package/dist/reference-data.d.ts +171 -0
  75. package/dist/reference-data.js +39 -0
  76. package/package.json +1 -1
@@ -1,119 +1,17 @@
1
1
  <script lang="ts">
2
2
  import { useTranslation } from '@svadmin/core/i18n';
3
- import * as Card from '../ui/card/index.js';
4
- import { Button } from '../ui/button/index.js';
5
- import { Avatar } from '../ui/avatar/index.js';
6
- import { Input } from '../ui/input/index.js';
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
- let searchQuery = $state('');
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
- <div class="space-y-4">
44
- <div class="flex flex-wrap items-center justify-between gap-3">
45
- <h3 class="text-lg font-semibold text-foreground">{i18n.t('publicProfile.teamsCount', { count: filtered.length })}</h3>
46
- <div class="relative">
47
- <Search class="absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" />
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
- interface TeamMember {
2
- name: string;
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
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@svadmin/ui",
3
- "version": "0.42.3",
3
+ "version": "0.43.0",
4
4
  "description": "Pre-built admin UI components — AdminApp, AutoTable, AutoForm, Sidebar, Layout",
5
5
  "type": "module",
6
6
  "sideEffects": [