@svadmin/ui 0.30.0 → 0.30.1

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.
@@ -191,6 +191,11 @@
191
191
  {@const Comp = getComponentRegistry().ShowPage}
192
192
  <Comp resourceName={params.resource} id={params.id} />
193
193
  {/key}
194
+ {:else if route === '/:resource/clone/:id'}
195
+ {#key `${params.resource}-clone-${params.id}`}
196
+ {@const Comp = getComponentRegistry().AutoForm}
197
+ <Comp resourceName={params.resource} mode="create" id={params.id} />
198
+ {/key}
194
199
  {/if}
195
200
  </div>
196
201
  {/key}
@@ -22,24 +22,24 @@
22
22
  // Sidebar density
23
23
  const DENSITY_KEY = 'svadmin-sidebar-density';
24
24
  let density = $state<'compact' | 'standard'>(
25
- (typeof localStorage !== 'undefined' ? localStorage.getItem(DENSITY_KEY) : null) as 'compact' | 'standard' ?? 'standard'
25
+ (typeof window !== 'undefined' ? localStorage.getItem(DENSITY_KEY) : null) as 'compact' | 'standard' ?? 'standard'
26
26
  );
27
27
 
28
28
  function setDensity(d: 'compact' | 'standard') {
29
29
  density = d;
30
- if (typeof localStorage !== 'undefined') localStorage.setItem(DENSITY_KEY, d);
30
+ if (typeof window !== 'undefined') localStorage.setItem(DENSITY_KEY, d);
31
31
  }
32
32
 
33
33
  // Page size
34
34
  const PAGE_SIZE_KEY = 'svadmin-default-page-size';
35
35
  const pageSizeOptions = [10, 20, 50];
36
36
  let pageSize = $state<number>(
37
- typeof localStorage !== 'undefined' ? parseInt(localStorage.getItem(PAGE_SIZE_KEY) ?? '10', 10) : 10
37
+ typeof window !== 'undefined' ? parseInt(localStorage.getItem(PAGE_SIZE_KEY) ?? '10', 10) : 10
38
38
  );
39
39
 
40
40
  function setPageSize(size: number) {
41
41
  pageSize = size;
42
- if (typeof localStorage !== 'undefined') localStorage.setItem(PAGE_SIZE_KEY, String(size));
42
+ if (typeof window !== 'undefined') localStorage.setItem(PAGE_SIZE_KEY, String(size));
43
43
  }
44
44
 
45
45
  // Locale display names
@@ -84,7 +84,7 @@
84
84
  const urlState = readURLState();
85
85
 
86
86
  // Snapshot resource values for initial state (untrack to avoid reactive tracking)
87
- const storedPageSize = typeof localStorage !== 'undefined' ? parseInt(localStorage.getItem('svadmin-default-page-size') ?? '', 10) : NaN;
87
+ const storedPageSize = typeof window !== 'undefined' ? parseInt(localStorage.getItem('svadmin-default-page-size') ?? '', 10) : NaN;
88
88
  const initPageSize = untrack(() => resource.pageSize ?? (isNaN(storedPageSize) ? 10 : storedPageSize));
89
89
  const initDefaultSort = untrack(() => resource.defaultSort);
90
90
 
@@ -171,7 +171,7 @@
171
171
  let columnVisibility = $state<VisibilityState>((() => {
172
172
  // Try to restore from localStorage first
173
173
  const storageKey = `svadmin-columns-${resourceName}`;
174
- if (typeof localStorage !== 'undefined') {
174
+ if (typeof window !== 'undefined') {
175
175
  try {
176
176
  const stored = localStorage.getItem(storageKey);
177
177
  if (stored) return JSON.parse(stored);
@@ -191,7 +191,7 @@
191
191
  // Persist column visibility to localStorage
192
192
  $effect(() => {
193
193
  const storageKey = `svadmin-columns-${resourceName}`;
194
- if (typeof localStorage !== 'undefined') {
194
+ if (typeof window !== 'undefined') {
195
195
  try {
196
196
  localStorage.setItem(storageKey, JSON.stringify(columnVisibility));
197
197
  } catch { /* ignore quota errors */ }
@@ -32,7 +32,7 @@
32
32
  // Restore saved order from localStorage
33
33
  $effect(() => {
34
34
  const storageKey = `svadmin-colorder-${resourceName}`;
35
- if (typeof localStorage === 'undefined') return;
35
+ if (typeof window === 'undefined') return;
36
36
  try {
37
37
  const saved = localStorage.getItem(storageKey);
38
38
  if (saved) {
@@ -79,7 +79,7 @@
79
79
 
80
80
  // Persist to localStorage
81
81
  const storageKey = `svadmin-colorder-${resourceName}`;
82
- if (typeof localStorage !== 'undefined') {
82
+ if (typeof window !== 'undefined') {
83
83
  try {
84
84
  localStorage.setItem(storageKey, JSON.stringify(newColumns.map(c => c.id)));
85
85
  } catch { /* ignore */ }
@@ -6,6 +6,9 @@
6
6
 
7
7
  interface Props extends Omit<HTMLButtonAttributes, 'class' | 'children'> {
8
8
  tooltip: string;
9
+ href?: string;
10
+ target?: string;
11
+ rel?: string;
9
12
  variant?: 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link';
10
13
  size?: 'default' | 'sm' | 'lg' | 'icon' | 'icon-sm';
11
14
  side?: 'top' | 'right' | 'bottom' | 'left';
@@ -24,6 +27,9 @@
24
27
  disabled = false,
25
28
  type = 'button',
26
29
  tabindex,
30
+ href,
31
+ target,
32
+ rel,
27
33
  children,
28
34
  ...restProps
29
35
  }: Props = $props();
@@ -32,7 +38,7 @@
32
38
  <Tooltip.Root>
33
39
  <Tooltip.Trigger>
34
40
  {#snippet child({ props })}
35
- {@const buttonProps = { ...props, ...restProps, variant, size, type, class: className, 'aria-label': restProps['aria-label'] ?? tooltip, onclick, disabled, tabindex } as any}
41
+ {@const buttonProps = { ...props, ...restProps, href, target, rel, variant, size, type, class: className, 'aria-label': restProps['aria-label'] ?? tooltip, onclick, disabled, tabindex } as any}
36
42
  <Button {...buttonProps}>
37
43
  {@render children()}
38
44
  </Button>
@@ -2,6 +2,9 @@ import type { Snippet } from 'svelte';
2
2
  import type { HTMLButtonAttributes } from 'svelte/elements';
3
3
  interface Props extends Omit<HTMLButtonAttributes, 'class' | 'children'> {
4
4
  tooltip: string;
5
+ href?: string;
6
+ target?: string;
7
+ rel?: string;
5
8
  variant?: 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link';
6
9
  size?: 'default' | 'sm' | 'lg' | 'icon' | 'icon-sm';
7
10
  side?: 'top' | 'right' | 'bottom' | 'left';
@@ -14,10 +14,12 @@ const ROUTES = [
14
14
  '/:resource/create',
15
15
  '/:resource/edit/:id',
16
16
  '/:resource/show/:id',
17
+ '/:resource/clone/:id',
17
18
  '/:parent/:parentId/:resource',
18
19
  '/:parent/:parentId/:resource/create',
19
20
  '/:parent/:parentId/:resource/edit/:id',
20
21
  '/:parent/:parentId/:resource/show/:id',
22
+ '/:parent/:parentId/:resource/clone/:id',
21
23
  ];
22
24
  function sync() {
23
25
  let path;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@svadmin/ui",
3
- "version": "0.30.0",
3
+ "version": "0.30.1",
4
4
  "description": "Pre-built admin UI components — AdminApp, AutoTable, AutoForm, Sidebar, Layout",
5
5
  "type": "module",
6
6
  "sideEffects": [
@@ -25,7 +25,7 @@
25
25
  "./components/*": "./dist/components/*"
26
26
  },
27
27
  "peerDependencies": {
28
- "@svadmin/core": "^0.21.0",
28
+ "@svadmin/core": "^0.21.1",
29
29
  "@tanstack/svelte-query": "^6.0.0",
30
30
  "highlight.js": "^11.11.1",
31
31
  "isomorphic-dompurify": "^3.7.1",
@@ -53,6 +53,7 @@
53
53
  "dependencies": {
54
54
  "@lucide/svelte": "^1.7.0",
55
55
  "@tanstack/svelte-table": "^9.0.0-alpha.10",
56
+ "@tanstack/table-core": "^9.0.0-alpha.10",
56
57
  "bits-ui": "^2.17.1",
57
58
  "clsx": "^2.1.1",
58
59
  "cmdk-sv": "^0.0.19",
@@ -71,9 +72,7 @@
71
72
  "bugs": {
72
73
  "url": "https://github.com/zuohuadong/svadmin/issues"
73
74
  },
74
- "devDependencies": {
75
- "@tanstack/table-core": "8.21.3"
76
- },
75
+ "devDependencies": {},
77
76
  "scripts": {
78
77
  "build": "svelte-package -i src -o dist"
79
78
  }