@svadmin/ui 0.64.0 → 0.65.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.
Files changed (73) hide show
  1. package/dist/components/ActivityFeed.svelte +135 -0
  2. package/dist/components/ActivityFeed.svelte.d.ts +21 -0
  3. package/dist/components/ApprovalActionCard.svelte +248 -0
  4. package/dist/components/ApprovalActionCard.svelte.d.ts +22 -0
  5. package/dist/components/CanvasAnnotation.svelte +389 -0
  6. package/dist/components/CanvasAnnotation.svelte.d.ts +17 -0
  7. package/dist/components/ColumnHeaderFilter.svelte +178 -0
  8. package/dist/components/ColumnHeaderFilter.svelte.d.ts +12 -0
  9. package/dist/components/ColumnSettings.svelte +198 -0
  10. package/dist/components/ColumnSettings.svelte.d.ts +19 -0
  11. package/dist/components/DecisionTable.svelte +240 -0
  12. package/dist/components/DecisionTable.svelte.d.ts +22 -0
  13. package/dist/components/DraggableRowTable.svelte +117 -0
  14. package/dist/components/DraggableRowTable.svelte.d.ts +15 -0
  15. package/dist/components/DrawerForm.svelte +110 -26
  16. package/dist/components/DrawerForm.svelte.d.ts +20 -8
  17. package/dist/components/EditableTable.svelte +195 -0
  18. package/dist/components/EditableTable.svelte.d.ts +25 -0
  19. package/dist/components/GanttChart.svelte +144 -0
  20. package/dist/components/GanttChart.svelte.d.ts +20 -0
  21. package/dist/components/ImageCropper.svelte +122 -0
  22. package/dist/components/ImageCropper.svelte.d.ts +12 -0
  23. package/dist/components/ImportWizard.svelte +336 -0
  24. package/dist/components/ImportWizard.svelte.d.ts +12 -0
  25. package/dist/components/JsonSchemaForm.svelte +149 -0
  26. package/dist/components/JsonSchemaForm.svelte.d.ts +10 -0
  27. package/dist/components/KanbanBoard.svelte +212 -0
  28. package/dist/components/KanbanBoard.svelte.d.ts +30 -0
  29. package/dist/components/MasterDetailView.svelte +134 -0
  30. package/dist/components/MasterDetailView.svelte.d.ts +16 -0
  31. package/dist/components/MediaLibraryModal.svelte +195 -0
  32. package/dist/components/MediaLibraryModal.svelte.d.ts +22 -0
  33. package/dist/components/MentionsInput.svelte +174 -0
  34. package/dist/components/MentionsInput.svelte.d.ts +21 -0
  35. package/dist/components/ModalForm.svelte +113 -28
  36. package/dist/components/ModalForm.svelte.d.ts +20 -8
  37. package/dist/components/MultiTabKeepAlive.svelte +143 -0
  38. package/dist/components/MultiTabKeepAlive.svelte.d.ts +21 -0
  39. package/dist/components/OfflineSyncBanner.svelte +172 -0
  40. package/dist/components/OfflineSyncBanner.svelte.d.ts +19 -0
  41. package/dist/components/PdfDocumentViewer.svelte +255 -0
  42. package/dist/components/PdfDocumentViewer.svelte.d.ts +22 -0
  43. package/dist/components/PivotTable.svelte +140 -0
  44. package/dist/components/PivotTable.svelte.d.ts +16 -0
  45. package/dist/components/PresenceAvatarGroup.svelte +89 -0
  46. package/dist/components/PresenceAvatarGroup.svelte.d.ts +15 -0
  47. package/dist/components/PrintableBill.svelte +149 -0
  48. package/dist/components/PrintableBill.svelte.d.ts +24 -0
  49. package/dist/components/SensitiveDataMask.svelte +125 -0
  50. package/dist/components/SensitiveDataMask.svelte.d.ts +13 -0
  51. package/dist/components/SignaturePad.svelte +264 -0
  52. package/dist/components/SignaturePad.svelte.d.ts +17 -0
  53. package/dist/components/SplitPaneLayout.svelte +113 -0
  54. package/dist/components/SplitPaneLayout.svelte.d.ts +13 -0
  55. package/dist/components/SpreadsheetView.svelte +363 -0
  56. package/dist/components/SpreadsheetView.svelte.d.ts +18 -0
  57. package/dist/components/StepForm.svelte +180 -0
  58. package/dist/components/StepForm.svelte.d.ts +23 -0
  59. package/dist/components/TableSummary.svelte +110 -0
  60. package/dist/components/TableSummary.svelte.d.ts +20 -0
  61. package/dist/components/TreeTable.svelte +237 -0
  62. package/dist/components/TreeTable.svelte.d.ts +28 -0
  63. package/dist/components/UnsavedChangesPrompt.svelte +44 -0
  64. package/dist/components/UnsavedChangesPrompt.svelte.d.ts +7 -0
  65. package/dist/components/VersionDiffViewer.svelte +196 -0
  66. package/dist/components/VersionDiffViewer.svelte.d.ts +12 -0
  67. package/dist/components/VirtualTable.svelte +86 -54
  68. package/dist/components/VirtualTable.svelte.d.ts +14 -21
  69. package/dist/components/Watermark.svelte +166 -0
  70. package/dist/components/Watermark.svelte.d.ts +26 -0
  71. package/dist/index.d.ts +58 -3
  72. package/dist/index.js +35 -3
  73. package/package.json +2 -2
@@ -1,74 +1,106 @@
1
1
  <script lang="ts">
2
- /**
3
- * VirtualTable — A lightweight virtual scrolling wrapper for large datasets.
4
- * Uses IntersectionObserver-based approach instead of a heavy dependency.
5
- *
6
- * Usage:
7
- * <VirtualTable items={rows} rowHeight={40} containerHeight={500}>
8
- * {#snippet row(item, index)}
9
- * <tr>...</tr>
10
- * {/snippet}
11
- * </VirtualTable>
12
- */
13
2
  import type { Snippet } from 'svelte';
3
+ import { cn } from '../utils.js';
14
4
 
15
- interface Props<T> {
16
- items: T[];
17
- /** Estimated row height in pixels */
18
- rowHeight?: number;
19
- /** Container height in pixels */
20
- containerHeight?: number;
21
- /** Number of extra rows to render above/below visible area */
5
+ export interface VirtualTableColumn {
6
+ key: string;
7
+ label: string;
8
+ width?: string;
9
+ align?: 'left' | 'center' | 'right';
10
+ }
11
+
12
+ interface Props {
13
+ items?: Record<string, unknown>[];
14
+ columns: VirtualTableColumn[];
15
+ itemHeight?: number;
16
+ height?: number;
22
17
  overscan?: number;
23
- /** Row rendering snippet */
24
- row: Snippet<[T, number]>;
18
+ rowKey?: string;
25
19
  class?: string;
20
+ rowSnippet?: Snippet<[Record<string, unknown>, number]>;
26
21
  }
27
22
 
28
23
  let {
29
- items,
30
- rowHeight = 40,
31
- containerHeight = 500,
32
- overscan = 5,
33
- row,
24
+ items = [],
25
+ columns,
26
+ itemHeight = 44,
27
+ height = 360,
28
+ overscan = 4,
29
+ rowKey = 'id',
34
30
  class: className = '',
35
- }: Props<unknown> = $props();
31
+ rowSnippet,
32
+ }: Props = $props();
36
33
 
37
34
  let scrollTop = $state(0);
38
35
 
39
- const visibleRange = $derived.by(() => {
40
- const start = Math.max(0, Math.floor(scrollTop / rowHeight) - overscan);
41
- const visibleCount = Math.ceil(containerHeight / rowHeight);
42
- const end = Math.min(items.length - 1, start + visibleCount + overscan * 2);
43
- return { start, end };
44
- });
36
+ function handleScroll(e: Event) {
37
+ const target = e.currentTarget as HTMLElement;
38
+ scrollTop = target.scrollTop;
39
+ }
45
40
 
46
- const visibleItems = $derived(
47
- items.slice(visibleRange.start, visibleRange.end + 1).map((item, i) => ({
41
+ const totalHeight = $derived(items.length * itemHeight);
42
+ const startIndex = $derived(Math.max(0, Math.floor(scrollTop / itemHeight) - overscan));
43
+ const endIndex = $derived(Math.min(items.length, Math.ceil((scrollTop + height) / itemHeight) + overscan));
44
+ const visibleSlice = $derived(
45
+ items.slice(startIndex, endIndex).map((item, idx) => ({
48
46
  item,
49
- index: visibleRange.start + i,
50
- offsetY: (visibleRange.start + i) * rowHeight,
47
+ index: startIndex + idx,
48
+ top: (startIndex + idx) * itemHeight,
51
49
  }))
52
50
  );
53
-
54
- function handleScroll(e: Event) {
55
- const target = e.target as HTMLDivElement;
56
- scrollTop = target.scrollTop;
57
- }
58
51
  </script>
59
52
 
60
- <div
61
- class="overflow-auto {className}"
62
- style="height: {containerHeight}px;"
63
- onscroll={handleScroll}
64
- >
65
- <table class="w-full relative" style="border-spacing: 0;">
66
- <tbody style="display: block;">
67
- <tr style="height: {visibleRange.start * rowHeight}px; border: none; padding: 0; display: block;"></tr>
68
- {#each visibleItems as { item, index } (index)}
69
- {@render row(item, index)}
53
+ <div class={cn('w-full rounded-xl border border-border bg-card shadow-xs overflow-hidden flex flex-col text-xs', className)}>
54
+ <!-- Sticky Header -->
55
+ <div class="border-b border-border/80 bg-muted/40 font-semibold text-muted-foreground flex items-center h-10 px-4 select-none shrink-0">
56
+ {#each columns as col (col.key)}
57
+ <div
58
+ style={col.width ? `width: ${col.width}; flex-shrink: 0;` : 'flex: 1; min-width: 0;'}
59
+ class={cn('truncate px-2', col.align === 'right' ? 'text-right' : col.align === 'center' ? 'text-center' : 'text-left')}
60
+ >
61
+ {col.label}
62
+ </div>
63
+ {/each}
64
+ </div>
65
+
66
+ <!-- Virtual Scroll Viewport -->
67
+ <div
68
+ class="overflow-y-auto relative w-full"
69
+ style="height: {height}px;"
70
+ onscroll={handleScroll}
71
+ >
72
+ <div style="height: {totalHeight}px; width: 100%; position: relative;">
73
+ {#each visibleSlice as { item, index, top } (item[rowKey] ?? index)}
74
+ <div
75
+ class="absolute left-0 right-0 flex items-center px-4 border-b border-border/40 hover:bg-muted/30 transition-colors"
76
+ style="top: {top}px; height: {itemHeight}px;"
77
+ >
78
+ {#if rowSnippet}
79
+ {@render rowSnippet(item, index)}
80
+ {:else}
81
+ {#each columns as col (col.key)}
82
+ <div
83
+ style={col.width ? `width: ${col.width}; flex-shrink: 0;` : 'flex: 1; min-width: 0;'}
84
+ class={cn('truncate px-2 font-medium text-foreground', col.align === 'right' ? 'text-right' : col.align === 'center' ? 'text-center' : 'text-left')}
85
+ >
86
+ {item[col.key] ?? '—'}
87
+ </div>
88
+ {/each}
89
+ {/if}
90
+ </div>
70
91
  {/each}
71
- <tr style="height: {Math.max(0, (items.length - visibleRange.end - 1) * rowHeight)}px; border: none; padding: 0; display: block;"></tr>
72
- </tbody>
73
- </table>
92
+
93
+ {#if items.length === 0}
94
+ <div class="h-32 flex items-center justify-center text-muted-foreground text-xs">
95
+ No records to display
96
+ </div>
97
+ {/if}
98
+ </div>
99
+ </div>
100
+
101
+ <!-- Footer Info -->
102
+ <div class="flex items-center justify-between px-4 py-2 border-t border-border/60 bg-muted/20 text-[11px] text-muted-foreground shrink-0">
103
+ <span>Total <strong class="text-foreground font-semibold">{items.length}</strong> rows</span>
104
+ <span>Rendered {visibleSlice.length} in viewport</span>
105
+ </div>
74
106
  </div>
@@ -1,27 +1,20 @@
1
- /**
2
- * VirtualTable — A lightweight virtual scrolling wrapper for large datasets.
3
- * Uses IntersectionObserver-based approach instead of a heavy dependency.
4
- *
5
- * Usage:
6
- * <VirtualTable items={rows} rowHeight={40} containerHeight={500}>
7
- * {#snippet row(item, index)}
8
- * <tr>...</tr>
9
- * {/snippet}
10
- * </VirtualTable>
11
- */
12
1
  import type { Snippet } from 'svelte';
13
- interface Props<T> {
14
- items: T[];
15
- /** Estimated row height in pixels */
16
- rowHeight?: number;
17
- /** Container height in pixels */
18
- containerHeight?: number;
19
- /** Number of extra rows to render above/below visible area */
2
+ export interface VirtualTableColumn {
3
+ key: string;
4
+ label: string;
5
+ width?: string;
6
+ align?: 'left' | 'center' | 'right';
7
+ }
8
+ interface Props {
9
+ items?: Record<string, unknown>[];
10
+ columns: VirtualTableColumn[];
11
+ itemHeight?: number;
12
+ height?: number;
20
13
  overscan?: number;
21
- /** Row rendering snippet */
22
- row: Snippet<[T, number]>;
14
+ rowKey?: string;
23
15
  class?: string;
16
+ rowSnippet?: Snippet<[Record<string, unknown>, number]>;
24
17
  }
25
- declare const VirtualTable: import("svelte").Component<Props<unknown>, {}, "">;
18
+ declare const VirtualTable: import("svelte").Component<Props, {}, "">;
26
19
  type VirtualTable = ReturnType<typeof VirtualTable>;
27
20
  export default VirtualTable;
@@ -0,0 +1,166 @@
1
+ <script lang="ts">
2
+ import { onMount, onDestroy, type Snippet } from 'svelte';
3
+ import { cn } from '../utils.js';
4
+
5
+ interface WatermarkFont {
6
+ color?: string;
7
+ fontSize?: number;
8
+ fontWeight?: 'normal' | 'light' | 'weight' | 'bold' | number;
9
+ fontFamily?: string;
10
+ fontStyle?: 'none' | 'normal' | 'italic' | 'oblique';
11
+ }
12
+
13
+ interface Props {
14
+ content?: string | string[];
15
+ image?: string;
16
+ width?: number;
17
+ height?: number;
18
+ rotate?: number;
19
+ zIndex?: number;
20
+ gap?: [number, number];
21
+ offset?: [number, number];
22
+ opacity?: number;
23
+ font?: WatermarkFont;
24
+ antiTamper?: boolean;
25
+ class?: string;
26
+ children?: Snippet;
27
+ }
28
+
29
+ let {
30
+ content = 'CONFIDENTIAL',
31
+ image,
32
+ width = 120,
33
+ height = 64,
34
+ rotate = -22,
35
+ zIndex = 9,
36
+ gap = [100, 100],
37
+ offset = [gap[0] / 2, gap[1] / 2],
38
+ opacity = 0.12,
39
+ font = {},
40
+ antiTamper = true,
41
+ class: className = '',
42
+ children,
43
+ }: Props = $props();
44
+
45
+ let containerEl: HTMLDivElement | null = $state(null);
46
+ let base64Url = $state<string>('');
47
+ let watermarkRevision = $state(0);
48
+ let observer: MutationObserver | null = null;
49
+ let isCleaningUp = false;
50
+
51
+ function renderWatermark() {
52
+ if (typeof window === 'undefined') return;
53
+
54
+ const canvas = document.createElement('canvas');
55
+ const ctx = canvas.getContext('2d');
56
+ if (!ctx) return;
57
+
58
+ const ratio = window.devicePixelRatio || 1;
59
+ const [gapX, gapY] = gap;
60
+ const canvasWidth = (gapX + width) * ratio;
61
+ const canvasHeight = (gapY + height) * ratio;
62
+
63
+ canvas.width = canvasWidth;
64
+ canvas.height = canvasHeight;
65
+ canvas.style.width = `${gapX + width}px`;
66
+ canvas.style.height = `${gapY + height}px`;
67
+
68
+ ctx.scale(ratio, ratio);
69
+ ctx.translate(offset[0], offset[1]);
70
+ ctx.rotate((rotate * Math.PI) / 180);
71
+
72
+ if (image) {
73
+ const img = new Image();
74
+ img.crossOrigin = 'anonymous';
75
+ img.referrerPolicy = 'no-referrer';
76
+ img.onload = () => {
77
+ ctx.globalAlpha = opacity;
78
+ ctx.drawImage(img, -width / 2, -height / 2, width, height);
79
+ base64Url = canvas.toDataURL();
80
+ };
81
+ img.src = image;
82
+ } else {
83
+ const {
84
+ fontSize = 14,
85
+ fontFamily = 'sans-serif',
86
+ fontWeight = 'normal',
87
+ fontStyle = 'normal',
88
+ color = 'currentColor',
89
+ } = font;
90
+
91
+ ctx.font = `${fontStyle} ${fontWeight} ${fontSize}px ${fontFamily}`;
92
+ ctx.fillStyle = color === 'currentColor' ? 'rgba(128, 128, 128, 0.85)' : color;
93
+ ctx.globalAlpha = opacity;
94
+ ctx.textBaseline = 'middle';
95
+ ctx.textAlign = 'center';
96
+
97
+ const contents = Array.isArray(content) ? content : [content];
98
+ const lineHeight = fontSize + 4;
99
+ const totalHeight = contents.length * lineHeight;
100
+ const startY = -(totalHeight / 2) + lineHeight / 2;
101
+
102
+ contents.forEach((text, i) => {
103
+ ctx.fillText(text, 0, startY + i * lineHeight);
104
+ });
105
+
106
+ base64Url = canvas.toDataURL();
107
+ }
108
+ }
109
+
110
+ $effect(() => {
111
+ // Re-generate watermark when inputs change
112
+ if (content || image || width || height || rotate || gap || offset || opacity || font) {
113
+ renderWatermark();
114
+ }
115
+ });
116
+
117
+ onMount(() => {
118
+ renderWatermark();
119
+
120
+ if (antiTamper && typeof MutationObserver !== 'undefined' && containerEl) {
121
+ observer = new MutationObserver((mutations) => {
122
+ if (isCleaningUp) return;
123
+ for (const mutation of mutations) {
124
+ if (mutation.type === 'childList' || mutation.type === 'attributes') {
125
+ watermarkRevision += 1;
126
+ break;
127
+ }
128
+ }
129
+ });
130
+
131
+ observer.observe(containerEl, {
132
+ attributes: true,
133
+ subtree: true,
134
+ childList: true,
135
+ attributeFilter: ['style', 'class', 'hidden'],
136
+ });
137
+ }
138
+ });
139
+
140
+ onDestroy(() => {
141
+ isCleaningUp = true;
142
+ if (observer) {
143
+ observer.disconnect();
144
+ observer = null;
145
+ }
146
+ });
147
+ </script>
148
+
149
+ <div
150
+ bind:this={containerEl}
151
+ class={cn('relative overflow-hidden', className)}
152
+ data-svadmin-watermark-wrapper
153
+ >
154
+ {#key watermarkRevision}
155
+ {#if base64Url}
156
+ <div
157
+ data-svadmin-watermark
158
+ class="absolute inset-0 pointer-events-none"
159
+ style="z-index: {zIndex}; background-image: url('{base64Url}'); background-position: {offset[0]}px {offset[1]}px; background-repeat: repeat;"
160
+ ></div>
161
+ {/if}
162
+ {/key}
163
+ {#if children}
164
+ {@render children()}
165
+ {/if}
166
+ </div>
@@ -0,0 +1,26 @@
1
+ import { type Snippet } from 'svelte';
2
+ interface WatermarkFont {
3
+ color?: string;
4
+ fontSize?: number;
5
+ fontWeight?: 'normal' | 'light' | 'weight' | 'bold' | number;
6
+ fontFamily?: string;
7
+ fontStyle?: 'none' | 'normal' | 'italic' | 'oblique';
8
+ }
9
+ interface Props {
10
+ content?: string | string[];
11
+ image?: string;
12
+ width?: number;
13
+ height?: number;
14
+ rotate?: number;
15
+ zIndex?: number;
16
+ gap?: [number, number];
17
+ offset?: [number, number];
18
+ opacity?: number;
19
+ font?: WatermarkFont;
20
+ antiTamper?: boolean;
21
+ class?: string;
22
+ children?: Snippet;
23
+ }
24
+ declare const Watermark: import("svelte").Component<Props, {}, "">;
25
+ type Watermark = ReturnType<typeof Watermark>;
26
+ export default Watermark;
package/dist/index.d.ts CHANGED
@@ -24,8 +24,6 @@ export { default as ForgotPasswordPage } from './components/ForgotPasswordPage.s
24
24
  export { default as CanAccess } from './components/CanAccess.svelte';
25
25
  export { default as Can } from './components/CanAccess.svelte';
26
26
  export { default as UndoableNotification } from './components/UndoableNotification.svelte';
27
- export { default as ModalForm } from './components/ModalForm.svelte';
28
- export { default as DrawerForm } from './components/DrawerForm.svelte';
29
27
  export { default as DevTools } from './components/DevTools.svelte';
30
28
  export { default as Authenticated } from './components/Authenticated.svelte';
31
29
  export { default as UpdatePasswordPage } from './components/UpdatePasswordPage.svelte';
@@ -58,6 +56,64 @@ export { default as Transfer } from './components/Transfer.svelte';
58
56
  export type { TransferItem } from './components/Transfer.svelte';
59
57
  export { default as FilterBuilder } from './components/FilterBuilder.svelte';
60
58
  export type { FilterRuleItem } from './components/FilterBuilder.svelte';
59
+ export { default as Watermark } from './components/Watermark.svelte';
60
+ export { default as ColumnSettings } from './components/ColumnSettings.svelte';
61
+ export type { ColumnItem } from './components/ColumnSettings.svelte';
62
+ export { default as UnsavedChangesPrompt } from './components/UnsavedChangesPrompt.svelte';
63
+ export { default as ImportWizard } from './components/ImportWizard.svelte';
64
+ export { default as ColumnHeaderFilter } from './components/ColumnHeaderFilter.svelte';
65
+ export { default as TreeTable } from './components/TreeTable.svelte';
66
+ export type { TreeTableColumn } from './components/TreeTable.svelte';
67
+ export { default as SensitiveDataMask } from './components/SensitiveDataMask.svelte';
68
+ export type { MaskType } from './components/SensitiveDataMask.svelte';
69
+ export { default as ApprovalActionCard } from './components/ApprovalActionCard.svelte';
70
+ export type { ApprovalStatus } from './components/ApprovalActionCard.svelte';
71
+ export { default as StepForm } from './components/StepForm.svelte';
72
+ export type { FormStep } from './components/StepForm.svelte';
73
+ export { default as ModalForm } from './components/ModalForm.svelte';
74
+ export { default as DrawerForm } from './components/DrawerForm.svelte';
75
+ export { default as TableSummary } from './components/TableSummary.svelte';
76
+ export type { TableSummaryColumn, AggregationType } from './components/TableSummary.svelte';
77
+ export { default as VersionDiffViewer } from './components/VersionDiffViewer.svelte';
78
+ export { default as VirtualTable } from './components/VirtualTable.svelte';
79
+ export type { VirtualTableColumn } from './components/VirtualTable.svelte';
80
+ export { default as EditableTable } from './components/EditableTable.svelte';
81
+ export type { EditableTableColumn } from './components/EditableTable.svelte';
82
+ export { default as DraggableRowTable } from './components/DraggableRowTable.svelte';
83
+ export type { DraggableTableColumn } from './components/DraggableRowTable.svelte';
84
+ export { default as SplitPaneLayout } from './components/SplitPaneLayout.svelte';
85
+ export { default as MasterDetailView } from './components/MasterDetailView.svelte';
86
+ export { default as MediaLibraryModal } from './components/MediaLibraryModal.svelte';
87
+ export type { MediaItem } from './components/MediaLibraryModal.svelte';
88
+ export { default as ImageCropper } from './components/ImageCropper.svelte';
89
+ export { default as ActivityFeed } from './components/ActivityFeed.svelte';
90
+ export type { ActivityItem } from './components/ActivityFeed.svelte';
91
+ export { default as PresenceAvatarGroup } from './components/PresenceAvatarGroup.svelte';
92
+ export type { PresenceUser } from './components/PresenceAvatarGroup.svelte';
93
+ export { default as PrintableBill } from './components/PrintableBill.svelte';
94
+ export type { BillItem } from './components/PrintableBill.svelte';
95
+ export { default as JsonSchemaForm } from './components/JsonSchemaForm.svelte';
96
+ export { default as MentionsInput } from './components/MentionsInput.svelte';
97
+ export type { MentionOption } from './components/MentionsInput.svelte';
98
+ export { default as KanbanBoard } from './components/KanbanBoard.svelte';
99
+ export type { KanbanCard, KanbanColumn } from './components/KanbanBoard.svelte';
100
+ export { default as PivotTable } from './components/PivotTable.svelte';
101
+ export type { AggregationFn } from './components/PivotTable.svelte';
102
+ export { default as MultiTabKeepAlive } from './components/MultiTabKeepAlive.svelte';
103
+ export type { WorkspaceTab } from './components/MultiTabKeepAlive.svelte';
104
+ export { default as GanttChart } from './components/GanttChart.svelte';
105
+ export type { GanttTask } from './components/GanttChart.svelte';
106
+ export { default as CanvasAnnotation } from './components/CanvasAnnotation.svelte';
107
+ export type { AnnotationTool } from './components/CanvasAnnotation.svelte';
108
+ export { default as SignaturePad } from './components/SignaturePad.svelte';
109
+ export { default as PdfDocumentViewer } from './components/PdfDocumentViewer.svelte';
110
+ export type { DocumentStamp } from './components/PdfDocumentViewer.svelte';
111
+ export { default as SpreadsheetView } from './components/SpreadsheetView.svelte';
112
+ export type { SheetData } from './components/SpreadsheetView.svelte';
113
+ export { default as DecisionTable } from './components/DecisionTable.svelte';
114
+ export type { DecisionColumn, DecisionRule } from './components/DecisionTable.svelte';
115
+ export { default as OfflineSyncBanner } from './components/OfflineSyncBanner.svelte';
116
+ export type { PendingMutation } from './components/OfflineSyncBanner.svelte';
61
117
  export { default as InfiniteList } from './components/InfiniteList.svelte';
62
118
  export { default as ComboboxField } from './components/ComboboxField.svelte';
63
119
  export { default as PasswordInput } from './components/PasswordInput.svelte';
@@ -72,7 +128,6 @@ export { default as VoiceInput } from "./components/VoiceInput.svelte";
72
128
  export { default as AnimatedCounter } from "./components/AnimatedCounter.svelte";
73
129
  export { default as KeyboardShortcuts } from "./components/KeyboardShortcuts.svelte";
74
130
  export { default as InlineEdit } from "./components/InlineEdit.svelte";
75
- export { default as VirtualTable } from "./components/VirtualTable.svelte";
76
131
  export { default as DraggableHeader } from "./components/DraggableHeader.svelte";
77
132
  export { default as SettingsPage } from "./components/SettingsPage.svelte";
78
133
  export { default as FeedbackNotice } from './components/content/FeedbackNotice.svelte';
package/dist/index.js CHANGED
@@ -27,8 +27,6 @@ export { default as ForgotPasswordPage } from './components/ForgotPasswordPage.s
27
27
  export { default as CanAccess } from './components/CanAccess.svelte';
28
28
  export { default as Can } from './components/CanAccess.svelte';
29
29
  export { default as UndoableNotification } from './components/UndoableNotification.svelte';
30
- export { default as ModalForm } from './components/ModalForm.svelte';
31
- export { default as DrawerForm } from './components/DrawerForm.svelte';
32
30
  export { default as DevTools } from './components/DevTools.svelte';
33
31
  export { default as Authenticated } from './components/Authenticated.svelte';
34
32
  export { default as UpdatePasswordPage } from './components/UpdatePasswordPage.svelte';
@@ -58,6 +56,41 @@ export { default as TreeSelect } from './components/TreeSelect.svelte';
58
56
  export { default as Cascader } from './components/Cascader.svelte';
59
57
  export { default as Transfer } from './components/Transfer.svelte';
60
58
  export { default as FilterBuilder } from './components/FilterBuilder.svelte';
59
+ export { default as Watermark } from './components/Watermark.svelte';
60
+ export { default as ColumnSettings } from './components/ColumnSettings.svelte';
61
+ export { default as UnsavedChangesPrompt } from './components/UnsavedChangesPrompt.svelte';
62
+ export { default as ImportWizard } from './components/ImportWizard.svelte';
63
+ export { default as ColumnHeaderFilter } from './components/ColumnHeaderFilter.svelte';
64
+ export { default as TreeTable } from './components/TreeTable.svelte';
65
+ export { default as SensitiveDataMask } from './components/SensitiveDataMask.svelte';
66
+ export { default as ApprovalActionCard } from './components/ApprovalActionCard.svelte';
67
+ export { default as StepForm } from './components/StepForm.svelte';
68
+ export { default as ModalForm } from './components/ModalForm.svelte';
69
+ export { default as DrawerForm } from './components/DrawerForm.svelte';
70
+ export { default as TableSummary } from './components/TableSummary.svelte';
71
+ export { default as VersionDiffViewer } from './components/VersionDiffViewer.svelte';
72
+ export { default as VirtualTable } from './components/VirtualTable.svelte';
73
+ export { default as EditableTable } from './components/EditableTable.svelte';
74
+ export { default as DraggableRowTable } from './components/DraggableRowTable.svelte';
75
+ export { default as SplitPaneLayout } from './components/SplitPaneLayout.svelte';
76
+ export { default as MasterDetailView } from './components/MasterDetailView.svelte';
77
+ export { default as MediaLibraryModal } from './components/MediaLibraryModal.svelte';
78
+ export { default as ImageCropper } from './components/ImageCropper.svelte';
79
+ export { default as ActivityFeed } from './components/ActivityFeed.svelte';
80
+ export { default as PresenceAvatarGroup } from './components/PresenceAvatarGroup.svelte';
81
+ export { default as PrintableBill } from './components/PrintableBill.svelte';
82
+ export { default as JsonSchemaForm } from './components/JsonSchemaForm.svelte';
83
+ export { default as MentionsInput } from './components/MentionsInput.svelte';
84
+ export { default as KanbanBoard } from './components/KanbanBoard.svelte';
85
+ export { default as PivotTable } from './components/PivotTable.svelte';
86
+ export { default as MultiTabKeepAlive } from './components/MultiTabKeepAlive.svelte';
87
+ export { default as GanttChart } from './components/GanttChart.svelte';
88
+ export { default as CanvasAnnotation } from './components/CanvasAnnotation.svelte';
89
+ export { default as SignaturePad } from './components/SignaturePad.svelte';
90
+ export { default as PdfDocumentViewer } from './components/PdfDocumentViewer.svelte';
91
+ export { default as SpreadsheetView } from './components/SpreadsheetView.svelte';
92
+ export { default as DecisionTable } from './components/DecisionTable.svelte';
93
+ export { default as OfflineSyncBanner } from './components/OfflineSyncBanner.svelte';
61
94
  export { default as InfiniteList } from './components/InfiniteList.svelte';
62
95
  export { default as ComboboxField } from './components/ComboboxField.svelte';
63
96
  export { default as PasswordInput } from './components/PasswordInput.svelte';
@@ -72,7 +105,6 @@ export { default as VoiceInput } from "./components/VoiceInput.svelte";
72
105
  export { default as AnimatedCounter } from "./components/AnimatedCounter.svelte";
73
106
  export { default as KeyboardShortcuts } from "./components/KeyboardShortcuts.svelte";
74
107
  export { default as InlineEdit } from "./components/InlineEdit.svelte";
75
- export { default as VirtualTable } from "./components/VirtualTable.svelte";
76
108
  export { default as DraggableHeader } from "./components/DraggableHeader.svelte";
77
109
  export { default as SettingsPage } from "./components/SettingsPage.svelte";
78
110
  export { default as FeedbackNotice } from './components/content/FeedbackNotice.svelte';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@svadmin/ui",
3
- "version": "0.64.0",
3
+ "version": "0.65.1",
4
4
  "description": "Pre-built admin UI components — AdminApp, AutoTable, AutoForm, Sidebar, Layout",
5
5
  "type": "module",
6
6
  "sideEffects": [
@@ -39,7 +39,7 @@
39
39
  "./components/*": "./dist/components/*"
40
40
  },
41
41
  "peerDependencies": {
42
- "@svadmin/core": "^0.46.0",
42
+ "@svadmin/core": "^0.47.1",
43
43
  "@tanstack/svelte-query": "^6.1.48",
44
44
  "highlight.js": "^11.12.0",
45
45
  "isomorphic-dompurify": "^3.23.0",