@svadmin/ui 0.32.5 → 0.32.7

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.
@@ -13,17 +13,6 @@
13
13
  import AutoTable from './AutoTable.svelte';
14
14
  import AutoForm from './AutoForm.svelte';
15
15
  import ShowPage from './ShowPage.svelte';
16
-
17
- // Module-level QueryClient — survives component remounts (SPA only)
18
- let _queryClient: QueryClient | null = null;
19
- function getOrCreateQueryClient(): QueryClient {
20
- if (!_queryClient) {
21
- _queryClient = new QueryClient({
22
- defaultOptions: { queries: { staleTime: 30_000, retry: 1 } },
23
- });
24
- }
25
- return _queryClient;
26
- }
27
16
  import Toast from './Toast.svelte';
28
17
  import LoginPage from './LoginPage.svelte';
29
18
  import RegisterPage from './RegisterPage.svelte';
@@ -51,7 +40,7 @@
51
40
  /** Theme configuration for dark-first mode, CSS overrides, etc. */
52
41
  themeConfig?: ThemeConfig;
53
42
  dashboard?: Snippet;
54
- loginPage?: Snippet<[{ onSuccess: () => void }]>;
43
+ loginPage?: Snippet;
55
44
  /** Override default components via DI */
56
45
  components?: Partial<ComponentRegistry>;
57
46
  /** Custom multi-level menu configuration */
@@ -89,16 +78,28 @@
89
78
  Skeleton: Skeleton as unknown as ComponentRegistry['Skeleton'],
90
79
  };
91
80
 
92
- setComponentRegistry({ ...defaultComponents, ...userComponents });
81
+ // Merge user overrides and set context
82
+ $effect(() => {
83
+ setComponentRegistry({ ...defaultComponents, ...userComponents });
84
+ });
93
85
 
94
- const defaultRouter = createHashRouterProvider();
95
- const resolvedRouter = $derived(routerProvider ?? defaultRouter);
86
+ // Resolve router provider (default to hash)
87
+ const resolvedRouter = $derived(routerProvider ?? createHashRouterProvider());
96
88
  const resolvedRouteMode = $derived(routeMode ?? (routerProvider ? 'auto' : 'hash'));
97
89
 
98
- // Set up context — use $effect.pre so prop changes are tracked and children can access during first render
90
+ // Set up initial context synchronously so children can access resources immediately during first render
91
+ setDataProvider(dataProvider);
92
+ if (authProvider) setAuthProvider(authProvider);
93
+ setResources(resources);
94
+ setRouterProvider(resolvedRouter);
95
+ if (locale) setLocale(locale);
96
+ if (userThemeConfig) configureTheme(userThemeConfig);
97
+ if (defaultTheme) setTheme(defaultTheme);
98
+
99
+ // Set up context — use $effect so prop changes are tracked
99
100
  $effect.pre(() => {
100
101
  setDataProvider(dataProvider);
101
- setAuthProvider(authProvider);
102
+ if (authProvider) setAuthProvider(authProvider);
102
103
  setResources(resources);
103
104
  setRouterProvider(resolvedRouter);
104
105
  if (locale) setLocale(locale);
@@ -106,10 +107,14 @@
106
107
  if (defaultTheme) setTheme(defaultTheme);
107
108
  });
108
109
 
109
- // QueryClient — created once and reused across remounts
110
- const queryClient = getOrCreateQueryClient();
110
+ const queryClient = new QueryClient({
111
+ defaultOptions: {
112
+ queries: { staleTime: 30_000, retry: 1 },
113
+ },
114
+ });
111
115
 
112
- // Initialize router with provider
116
+ // Initialize router with provider synchronously
117
+ initRouter(resolvedRouter);
113
118
  $effect.pre(() => {
114
119
  initRouter(resolvedRouter);
115
120
  });
@@ -164,7 +169,7 @@
164
169
  </div>
165
170
  </div>
166
171
  {:else if route === '/login' && loginPage}
167
- {@render loginPage({ onSuccess: () => { isAuthenticated = true; navigate('/'); } })}
172
+ {@render loginPage()}
168
173
  {:else if route === '/login' && authProvider}
169
174
  <LoginPage {title} onSuccess={() => { isAuthenticated = true; navigate('/'); }} />
170
175
  {:else if route === '/register' && authProvider?.register}
@@ -13,9 +13,7 @@ interface Props {
13
13
  /** Theme configuration for dark-first mode, CSS overrides, etc. */
14
14
  themeConfig?: ThemeConfig;
15
15
  dashboard?: Snippet;
16
- loginPage?: Snippet<[{
17
- onSuccess: () => void;
18
- }]>;
16
+ loginPage?: Snippet;
19
17
  /** Override default components via DI */
20
18
  components?: Partial<ComponentRegistry>;
21
19
  /** Custom multi-level menu configuration */
@@ -9,7 +9,7 @@
9
9
  type ColumnVisibilityState,
10
10
  type ExpandedState,
11
11
  } from '@tanstack/svelte-table';
12
- import { getCoreRowModel } from '@tanstack/table-core';
12
+ import { createCoreRowModel } from '@tanstack/table-core';
13
13
 
14
14
  import { useList, useDelete, useDeleteMany, getResource, notify } from '@svadmin/core';
15
15
  import type { Pagination as PaginationState, Sort, Filter, FieldDefinition } from '@svadmin/core';
@@ -280,7 +280,7 @@
280
280
  const tbl = createTable({
281
281
  get data() { return query.data?.data ?? []; },
282
282
  get columns() { return columns; },
283
- getCoreRowModel: getCoreRowModel(),
283
+ getCoreRowModel: createCoreRowModel(),
284
284
  manualPagination: true,
285
285
  manualSorting: true,
286
286
  getRowId: (row: any) => String(row[primaryKey]),
@@ -26,11 +26,12 @@
26
26
  siteUrl?: string;
27
27
  }>();
28
28
 
29
- const registry = $derived(getComponentRegistry() || {} as any);
30
- const CustomBreadcrumbs = $derived(registry.Breadcrumbs);
31
- const CustomThemeToggle = $derived(registry.ThemeToggle);
32
- const CustomUserMenu = $derived(registry.UserMenu);
33
- const CustomNotificationPanel = $derived(registry.NotificationPanel);
29
+ // Retrieve optional component overrides from registry
30
+ const registry = getComponentRegistry() || {} as any;
31
+ const CustomBreadcrumbs = registry.Breadcrumbs;
32
+ const CustomThemeToggle = registry.ThemeToggle;
33
+ const CustomUserMenu = registry.UserMenu;
34
+ const CustomNotificationPanel = registry.NotificationPanel;
34
35
  </script>
35
36
 
36
37
  <header class="sticky top-0 z-30 flex h-14 w-full shrink-0 items-center justify-between bg-card/60 backdrop-blur-md px-4 md:px-6">
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@svadmin/ui",
3
- "version": "0.32.5",
3
+ "version": "0.32.7",
4
4
  "description": "Pre-built admin UI components — AdminApp, AutoTable, AutoForm, Sidebar, Layout",
5
5
  "type": "module",
6
6
  "sideEffects": [
@@ -27,7 +27,7 @@
27
27
  "./components/*": "./dist/components/*"
28
28
  },
29
29
  "peerDependencies": {
30
- "@svadmin/core": "^0.23.5",
30
+ "@svadmin/core": "^0.23.6",
31
31
  "@tanstack/svelte-query": "^6.0.0",
32
32
  "highlight.js": "^11.11.1",
33
33
  "isomorphic-dompurify": "^3.7.1",