@svadmin/ui 0.46.0 → 0.48.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 (33) hide show
  1. package/dist/components/AboutSettings.svelte +21 -96
  2. package/dist/components/AdminApp.svelte +20 -0
  3. package/dist/components/AdminApp.svelte.d.ts +5 -1
  4. package/dist/components/ApiSettings.svelte +153 -246
  5. package/dist/components/AppearanceSettings.svelte +36 -165
  6. package/dist/components/AutoForm.svelte +21 -3
  7. package/dist/components/DetailDrawer.svelte +74 -0
  8. package/dist/components/DetailDrawer.svelte.d.ts +16 -0
  9. package/dist/components/FieldRenderer.svelte +70 -2
  10. package/dist/components/FieldRenderer.svelte.d.ts +2 -0
  11. package/dist/components/IntegrationsSettings.svelte +22 -61
  12. package/dist/components/Layout.svelte +15 -1
  13. package/dist/components/NotificationsSettings.svelte +22 -103
  14. package/dist/components/PasswordInput.svelte +4 -0
  15. package/dist/components/PasswordInput.svelte.d.ts +1 -0
  16. package/dist/components/PermissionMatrix.svelte +17 -8
  17. package/dist/components/RowActions.svelte +154 -0
  18. package/dist/components/RowActions.svelte.d.ts +26 -0
  19. package/dist/components/SecuritySettings.svelte +165 -140
  20. package/dist/components/SecuritySettings.svelte.d.ts +1 -2
  21. package/dist/components/SettingsPage.svelte +12 -2
  22. package/dist/components/account/CompanyProfilePage.svelte +10 -4
  23. package/dist/components/account/SettingsEnterprisePage.svelte +227 -23
  24. package/dist/components/account/SettingsSidebarPage.svelte +12 -1
  25. package/dist/components/account/UserProfilePage.svelte +5 -4
  26. package/dist/components/content/ApiKeyList.svelte +30 -5
  27. package/dist/components/content/ApiKeyList.svelte.d.ts +3 -0
  28. package/dist/components/content/WorkspaceLayout.svelte +7 -4
  29. package/dist/components/content/WorkspaceLayout.svelte.d.ts +1 -0
  30. package/dist/components/ui/sheet/sheet.svelte +122 -10
  31. package/dist/index.d.ts +3 -0
  32. package/dist/index.js +2 -0
  33. package/package.json +5 -2
@@ -1,108 +1,33 @@
1
1
  <script lang="ts">
2
+ import { captureAdminContext, getColorTheme, getResolvedTheme } from '@svadmin/core';
2
3
  import { useTranslation } from '@svadmin/core/i18n';
3
- import { captureAdminContext } from '@svadmin/core';
4
- import { getResolvedTheme, getColorTheme } from '@svadmin/core';
5
- import * as Card from './ui/card/index.js';
6
4
  import { Badge } from './ui/badge/index.js';
7
- import { Info, Database, Globe, Palette, Layers } from '@lucide/svelte';
5
+ import DescriptionList from './content/DescriptionList.svelte';
6
+ import SettingsGroup from './content/SettingsGroup.svelte';
8
7
 
9
8
  const i18n = useTranslation();
10
9
  const adminContext = captureAdminContext();
11
-
12
10
  const resources = $derived(adminContext.resources);
13
11
  const providerNames = $derived(adminContext.getDataProviderNames());
14
-
15
- const version = '__SVADMIN_VERSION__'; // replaced at build time or shown as-is
12
+ const version = '__SVADMIN_VERSION__';
16
13
  </script>
17
14
 
18
15
  <div class="space-y-6">
19
- <div>
20
- <h2 class="text-xl font-semibold text-foreground">{i18n.t('settings.about')}</h2>
21
- </div>
22
-
23
- <!-- Version -->
24
- <Card.Card>
25
- <Card.CardHeader class="pb-3">
26
- <Card.CardTitle class="text-base flex items-center gap-2">
27
- <Info class="h-4 w-4 text-muted-foreground" />
28
- svadmin
29
- </Card.CardTitle>
30
- </Card.CardHeader>
31
- <Card.CardContent>
32
- <div class="grid gap-4 text-sm">
33
- <div class="flex items-center justify-between">
34
- <span class="text-muted-foreground">{i18n.t('settings.version')}</span>
35
- <Badge variant="secondary" class="font-mono text-xs">{version}</Badge>
36
- </div>
37
- </div>
38
- </Card.CardContent>
39
- </Card.Card>
40
-
41
- <!-- Registered Resources -->
42
- <Card.Card>
43
- <Card.CardHeader class="pb-3">
44
- <Card.CardTitle class="text-base flex items-center gap-2">
45
- <Layers class="h-4 w-4 text-muted-foreground" />
46
- {i18n.t('settings.registeredResources')}
47
- </Card.CardTitle>
48
- </Card.CardHeader>
49
- <Card.CardContent>
50
- <div class="flex flex-wrap gap-2">
51
- {#each resources as resource, _i (_i)}
52
- <Badge variant="outline" class="font-mono text-xs">{resource.name}</Badge>
53
- {/each}
54
- {#if resources.length === 0}
55
- <p class="text-sm text-muted-foreground">—</p>
56
- {/if}
57
- </div>
58
- </Card.CardContent>
59
- </Card.Card>
60
-
61
- <!-- Data Providers -->
62
- <Card.Card>
63
- <Card.CardHeader class="pb-3">
64
- <Card.CardTitle class="text-base flex items-center gap-2">
65
- <Database class="h-4 w-4 text-muted-foreground" />
66
- {i18n.t('settings.dataProvider')}
67
- </Card.CardTitle>
68
- </Card.CardHeader>
69
- <Card.CardContent>
70
- <div class="flex flex-wrap gap-2">
71
- {#each providerNames as name, _i (_i)}
72
- <Badge variant="outline" class="font-mono text-xs">{name}</Badge>
73
- {/each}
74
- </div>
75
- </Card.CardContent>
76
- </Card.Card>
77
-
78
- <!-- Current Environment -->
79
- <Card.Card>
80
- <Card.CardHeader class="pb-3">
81
- <Card.CardTitle class="text-base flex items-center gap-2">
82
- <Globe class="h-4 w-4 text-muted-foreground" />
83
- {i18n.t('settings.currentEnvironment')}
84
- </Card.CardTitle>
85
- </Card.CardHeader>
86
- <Card.CardContent>
87
- <div class="grid gap-3 text-sm">
88
- <div class="flex items-center justify-between">
89
- <span class="text-muted-foreground">{i18n.t('settings.language')}</span>
90
- <span class="font-mono text-xs">{i18n.locale}</span>
91
- </div>
92
- <div class="h-px bg-border"></div>
93
- <div class="flex items-center justify-between">
94
- <span class="text-muted-foreground">{i18n.t('settings.themeMode')}</span>
95
- <span class="font-mono text-xs">{getResolvedTheme()}</span>
96
- </div>
97
- <div class="h-px bg-border"></div>
98
- <div class="flex items-center justify-between">
99
- <span class="text-muted-foreground flex items-center gap-1.5">
100
- <Palette class="h-3.5 w-3.5" />
101
- {i18n.t('settings.colorAccent')}
102
- </span>
103
- <span class="font-mono text-xs">{getColorTheme()}</span>
104
- </div>
105
- </div>
106
- </Card.CardContent>
107
- </Card.Card>
16
+ <div><h2 class="text-xl font-semibold text-foreground">{i18n.t('settings.about')}</h2></div>
17
+ <SettingsGroup title="svadmin" description={i18n.t('settings.currentEnvironment')} bodyClass="space-y-6">
18
+ <DescriptionList columns={2} items={[
19
+ { label: i18n.t('settings.version'), value: version },
20
+ { label: i18n.t('settings.language'), value: i18n.locale },
21
+ { label: i18n.t('settings.themeMode'), value: getResolvedTheme() },
22
+ { label: i18n.t('settings.colorAccent'), value: getColorTheme() },
23
+ ]} />
24
+ <div class="border-t border-border pt-5">
25
+ <h3 class="text-sm font-medium text-foreground">{i18n.t('settings.registeredResources')}</h3>
26
+ <div class="mt-3 flex flex-wrap gap-2">{#each resources as resource (resource.name)}<Badge variant="outline" class="font-mono text-xs">{resource.name}</Badge>{:else}<span class="text-sm text-muted-foreground">—</span>{/each}</div>
27
+ </div>
28
+ <div class="border-t border-border pt-5">
29
+ <h3 class="text-sm font-medium text-foreground">{i18n.t('settings.dataProvider')}</h3>
30
+ <div class="mt-3 flex flex-wrap gap-2">{#each providerNames as name (name)}<Badge variant="outline" class="font-mono text-xs">{name}</Badge>{:else}<span class="text-sm text-muted-foreground">—</span>{/each}</div>
31
+ </div>
32
+ </SettingsGroup>
108
33
  </div>
@@ -25,14 +25,18 @@
25
25
  AuditLogProvider,
26
26
  AuthProvider,
27
27
  ChatProvider,
28
+ CredentialProvider,
28
29
  DataProviderInput,
30
+ IdentityGovernanceProvider,
29
31
  I18nProvider,
30
32
  LiveProvider,
31
33
  MenuItem,
32
34
  NotificationProvider,
35
+ OrganizationProvider,
33
36
  ProviderBundle,
34
37
  ResourceDefinition,
35
38
  RouterProvider,
39
+ SessionProvider,
36
40
  TaskProvider,
37
41
  TenantAdapter,
38
42
  TenantContext,
@@ -93,6 +97,10 @@
93
97
  taskProvider?: TaskProvider;
94
98
  routerProvider?: RouterProvider;
95
99
  tenantAdapter?: TenantAdapter;
100
+ organizationProvider?: OrganizationProvider;
101
+ identityGovernanceProvider?: IdentityGovernanceProvider;
102
+ sessionProvider?: SessionProvider;
103
+ credentialProvider?: CredentialProvider;
96
104
  /** Request/tree-scoped tenant. Tenant identifiers are never rendered by DevTools. */
97
105
  tenant?: TenantContext;
98
106
  resources: ResourceDefinition[];
@@ -148,6 +156,10 @@
148
156
  taskProvider,
149
157
  routerProvider,
150
158
  tenantAdapter,
159
+ organizationProvider,
160
+ identityGovernanceProvider,
161
+ sessionProvider,
162
+ credentialProvider,
151
163
  tenant,
152
164
  resources,
153
165
  locale = $bindable(),
@@ -190,6 +202,10 @@
190
202
  const resolvedTaskProvider = $derived(taskProvider ?? resolvedProviderBundle?.taskProvider);
191
203
  const resolvedRouterInput = $derived(routerProvider ?? resolvedProviderBundle?.routerProvider);
192
204
  const resolvedTenantAdapter = $derived(tenantAdapter ?? resolvedProviderBundle?.tenantAdapter);
205
+ const resolvedOrganizationProvider = $derived(organizationProvider ?? resolvedProviderBundle?.organizationProvider ?? undefined);
206
+ const resolvedIdentityGovernanceProvider = $derived(identityGovernanceProvider ?? resolvedProviderBundle?.identityGovernanceProvider ?? undefined);
207
+ const resolvedSessionProvider = $derived(sessionProvider ?? resolvedProviderBundle?.sessionProvider ?? undefined);
208
+ const resolvedCredentialProvider = $derived(credentialProvider ?? resolvedProviderBundle?.credentialProvider ?? undefined);
193
209
  const resolvedI18nProvider = $derived(i18nProvider ?? resolvedProviderBundle?.i18nProvider);
194
210
 
195
211
  // Resolve router provider (default to hash)
@@ -280,6 +296,10 @@
280
296
  get chatProvider() { return resolvedChatProvider ?? null; },
281
297
  get agentProvider() { return resolvedAgentProvider ?? null; },
282
298
  get taskProvider() { return resolvedTaskProvider; },
299
+ get organizationProvider() { return resolvedOrganizationProvider ?? null; },
300
+ get identityGovernanceProvider() { return resolvedIdentityGovernanceProvider ?? null; },
301
+ get sessionProvider() { return resolvedSessionProvider ?? null; },
302
+ get credentialProvider() { return resolvedCredentialProvider ?? null; },
283
303
  get resources() { return resources; },
284
304
  get routerProvider() { return scopedRouterProvider; },
285
305
  get tenantAdapter() { return resolvedTenantAdapter; },
@@ -1,6 +1,6 @@
1
1
  import '../app.css';
2
2
  import { type Component, type Snippet } from 'svelte';
3
- import type { AccessControlProvider, AgentProvider, AuditLogProvider, AuthProvider, ChatProvider, DataProviderInput, I18nProvider, LiveProvider, MenuItem, NotificationProvider, ResourceDefinition, RouterProvider, TaskProvider, TenantAdapter, TenantContext, ThemeConfig, ThemeMode } from '@svadmin/core';
3
+ import type { AccessControlProvider, AgentProvider, AuditLogProvider, AuthProvider, ChatProvider, CredentialProvider, DataProviderInput, IdentityGovernanceProvider, I18nProvider, LiveProvider, MenuItem, NotificationProvider, OrganizationProvider, ResourceDefinition, RouterProvider, SessionProvider, TaskProvider, TenantAdapter, TenantContext, ThemeConfig, ThemeMode } from '@svadmin/core';
4
4
  import { QueryClient, type DefaultOptions } from '@tanstack/svelte-query';
5
5
  import { type ComponentRegistry } from '../component-registry.svelte.js';
6
6
  import type { AdminProviderBundle } from '../types.js';
@@ -21,6 +21,10 @@ interface Props {
21
21
  taskProvider?: TaskProvider;
22
22
  routerProvider?: RouterProvider;
23
23
  tenantAdapter?: TenantAdapter;
24
+ organizationProvider?: OrganizationProvider;
25
+ identityGovernanceProvider?: IdentityGovernanceProvider;
26
+ sessionProvider?: SessionProvider;
27
+ credentialProvider?: CredentialProvider;
24
28
  /** Request/tree-scoped tenant. Tenant identifiers are never rendered by DevTools. */
25
29
  tenant?: TenantContext;
26
30
  resources: ResourceDefinition[];