@svadmin/lite 0.3.6 → 0.3.10

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 (172) hide show
  1. package/README.md +19 -13
  2. package/dist/components/LiteAlert.svelte +19 -0
  3. package/dist/components/LiteAlert.svelte.d.ts +11 -0
  4. package/dist/components/LiteArrayField.svelte +60 -0
  5. package/dist/components/LiteArrayField.svelte.d.ts +17 -0
  6. package/dist/components/LiteArrayItem.svelte +146 -0
  7. package/dist/components/LiteArrayItem.svelte.d.ts +13 -0
  8. package/dist/components/LiteAuditLog.svelte +104 -0
  9. package/dist/components/LiteAuditLog.svelte.d.ts +23 -0
  10. package/dist/components/LiteBreadcrumbs.svelte +39 -0
  11. package/dist/components/LiteBreadcrumbs.svelte.d.ts +16 -0
  12. package/dist/components/LiteChatDialog.svelte +101 -0
  13. package/dist/components/LiteChatDialog.svelte.d.ts +20 -0
  14. package/dist/components/LiteConfirmDialog.svelte +60 -0
  15. package/dist/components/LiteConfirmDialog.svelte.d.ts +22 -0
  16. package/dist/components/LiteEmptyState.svelte +39 -0
  17. package/dist/components/LiteEmptyState.svelte.d.ts +16 -0
  18. package/dist/components/LiteForm.svelte +165 -0
  19. package/dist/components/LiteForm.svelte.d.ts +26 -0
  20. package/dist/components/LiteLayout.svelte +147 -0
  21. package/dist/components/LiteLayout.svelte.d.ts +19 -0
  22. package/dist/components/LiteLogin.svelte +41 -0
  23. package/dist/components/LiteLogin.svelte.d.ts +8 -0
  24. package/dist/components/LitePagination.svelte +73 -0
  25. package/dist/components/LitePagination.svelte.d.ts +11 -0
  26. package/dist/components/LitePermissionMatrix.svelte +147 -0
  27. package/dist/components/LitePermissionMatrix.svelte.d.ts +32 -0
  28. package/dist/components/LiteSearch.svelte +41 -0
  29. package/dist/components/LiteSearch.svelte.d.ts +9 -0
  30. package/dist/components/LiteShow.svelte +61 -0
  31. package/dist/components/LiteShow.svelte.d.ts +14 -0
  32. package/dist/components/LiteShowField.svelte +62 -0
  33. package/dist/components/LiteShowField.svelte.d.ts +12 -0
  34. package/dist/components/LiteStatsCard.svelte +70 -0
  35. package/dist/components/LiteStatsCard.svelte.d.ts +24 -0
  36. package/dist/components/LiteTable.svelte +132 -0
  37. package/dist/components/LiteTable.svelte.d.ts +19 -0
  38. package/dist/components/LiteTabs.svelte +57 -0
  39. package/dist/components/LiteTabs.svelte.d.ts +16 -0
  40. package/dist/components/advanced/LiteAutoSaveIndicator.svelte +26 -0
  41. package/dist/components/advanced/LiteAutoSaveIndicator.svelte.d.ts +12 -0
  42. package/dist/components/advanced/LiteDraggableHeader.svelte +33 -0
  43. package/dist/components/advanced/LiteDraggableHeader.svelte.d.ts +15 -0
  44. package/dist/components/advanced/LiteDrawerForm.svelte +42 -0
  45. package/dist/components/advanced/LiteDrawerForm.svelte.d.ts +16 -0
  46. package/dist/components/advanced/LiteInlineEdit.svelte +32 -0
  47. package/dist/components/advanced/LiteInlineEdit.svelte.d.ts +15 -0
  48. package/dist/components/advanced/LiteModalForm.svelte +44 -0
  49. package/dist/components/advanced/LiteModalForm.svelte.d.ts +17 -0
  50. package/dist/components/advanced/LiteToast.svelte +34 -0
  51. package/dist/components/advanced/LiteToast.svelte.d.ts +14 -0
  52. package/dist/components/advanced/LiteUndoableNotification.svelte +25 -0
  53. package/dist/components/advanced/LiteUndoableNotification.svelte.d.ts +13 -0
  54. package/dist/components/advanced/LiteVirtualTable.svelte +44 -0
  55. package/dist/components/advanced/LiteVirtualTable.svelte.d.ts +20 -0
  56. package/dist/components/advanced/index.js +8 -0
  57. package/dist/components/buttons/LiteCloneButton.svelte +33 -0
  58. package/dist/components/buttons/LiteCloneButton.svelte.d.ts +11 -0
  59. package/dist/components/buttons/LiteCreateButton.svelte +31 -0
  60. package/dist/components/buttons/LiteCreateButton.svelte.d.ts +10 -0
  61. package/dist/components/buttons/LiteDeleteButton.svelte +57 -0
  62. package/dist/components/buttons/LiteDeleteButton.svelte.d.ts +12 -0
  63. package/dist/components/buttons/LiteEditButton.svelte +33 -0
  64. package/dist/components/buttons/LiteEditButton.svelte.d.ts +11 -0
  65. package/dist/components/buttons/LiteExportButton.svelte +31 -0
  66. package/dist/components/buttons/LiteExportButton.svelte.d.ts +10 -0
  67. package/dist/components/buttons/LiteImportButton.svelte +50 -0
  68. package/dist/components/buttons/LiteImportButton.svelte.d.ts +10 -0
  69. package/dist/components/buttons/LiteListButton.svelte +31 -0
  70. package/dist/components/buttons/LiteListButton.svelte.d.ts +10 -0
  71. package/dist/components/buttons/LiteRefreshButton.svelte +34 -0
  72. package/dist/components/buttons/LiteRefreshButton.svelte.d.ts +8 -0
  73. package/dist/components/buttons/LiteSaveButton.svelte +27 -0
  74. package/dist/components/buttons/LiteSaveButton.svelte.d.ts +8 -0
  75. package/dist/components/buttons/LiteShowButton.svelte +33 -0
  76. package/dist/components/buttons/LiteShowButton.svelte.d.ts +11 -0
  77. package/dist/components/buttons/index.js +10 -0
  78. package/dist/components/fields/LiteBooleanField.svelte +42 -0
  79. package/dist/components/fields/LiteBooleanField.svelte.d.ts +10 -0
  80. package/dist/components/fields/LiteDateField.svelte +51 -0
  81. package/dist/components/fields/LiteDateField.svelte.d.ts +10 -0
  82. package/dist/components/fields/LiteEmailField.svelte +41 -0
  83. package/dist/components/fields/LiteEmailField.svelte.d.ts +10 -0
  84. package/dist/components/fields/LiteFileField.svelte +59 -0
  85. package/dist/components/fields/LiteFileField.svelte.d.ts +10 -0
  86. package/dist/components/fields/LiteImageField.svelte +57 -0
  87. package/dist/components/fields/LiteImageField.svelte.d.ts +10 -0
  88. package/dist/components/fields/LiteJsonField.svelte +43 -0
  89. package/dist/components/fields/LiteJsonField.svelte.d.ts +10 -0
  90. package/dist/components/fields/LiteMarkdownField.svelte +33 -0
  91. package/dist/components/fields/LiteMarkdownField.svelte.d.ts +10 -0
  92. package/dist/components/fields/LiteMultiSelectField.svelte +57 -0
  93. package/dist/components/fields/LiteMultiSelectField.svelte.d.ts +10 -0
  94. package/dist/components/fields/LiteNumberField.svelte +35 -0
  95. package/dist/components/fields/LiteNumberField.svelte.d.ts +10 -0
  96. package/dist/components/fields/LiteRelationField.svelte +67 -0
  97. package/dist/components/fields/LiteRelationField.svelte.d.ts +10 -0
  98. package/dist/components/fields/LiteRichTextField.svelte +44 -0
  99. package/dist/components/fields/LiteRichTextField.svelte.d.ts +10 -0
  100. package/dist/components/fields/LiteSelectField.svelte +47 -0
  101. package/dist/components/fields/LiteSelectField.svelte.d.ts +10 -0
  102. package/dist/components/fields/LiteTagField.svelte +44 -0
  103. package/dist/components/fields/LiteTagField.svelte.d.ts +10 -0
  104. package/dist/components/fields/LiteTextField.svelte +35 -0
  105. package/dist/components/fields/LiteTextField.svelte.d.ts +10 -0
  106. package/dist/components/fields/LiteUrlField.svelte +52 -0
  107. package/dist/components/fields/LiteUrlField.svelte.d.ts +10 -0
  108. package/dist/components/fields/index.js +15 -0
  109. package/dist/components/layout/LiteAuthenticated.svelte +23 -0
  110. package/dist/components/layout/LiteAuthenticated.svelte.d.ts +10 -0
  111. package/dist/components/layout/LiteCanAccess.svelte +27 -0
  112. package/dist/components/layout/LiteCanAccess.svelte.d.ts +10 -0
  113. package/dist/components/layout/LiteCatchAllNavigate.svelte +20 -0
  114. package/dist/components/layout/LiteCatchAllNavigate.svelte.d.ts +7 -0
  115. package/dist/components/layout/LiteErrorBoundary.svelte +20 -0
  116. package/dist/components/layout/LiteErrorBoundary.svelte.d.ts +13 -0
  117. package/dist/components/layout/LiteErrorComponent.svelte +37 -0
  118. package/dist/components/layout/LiteErrorComponent.svelte.d.ts +9 -0
  119. package/dist/components/layout/LiteHeader.svelte +19 -0
  120. package/dist/components/layout/LiteHeader.svelte.d.ts +8 -0
  121. package/dist/components/layout/LiteNavigateToResource.svelte +25 -0
  122. package/dist/components/layout/LiteNavigateToResource.svelte.d.ts +7 -0
  123. package/dist/components/layout/LiteSidebar.svelte +93 -0
  124. package/dist/components/layout/LiteSidebar.svelte.d.ts +12 -0
  125. package/dist/components/layout/index.js +8 -0
  126. package/dist/components/pages/LiteCreatePage.svelte +39 -0
  127. package/dist/components/pages/LiteCreatePage.svelte.d.ts +10 -0
  128. package/dist/components/pages/LiteEditPage.svelte +54 -0
  129. package/dist/components/pages/LiteEditPage.svelte.d.ts +12 -0
  130. package/dist/components/pages/LiteForgotPasswordPage.svelte +60 -0
  131. package/dist/components/pages/LiteForgotPasswordPage.svelte.d.ts +11 -0
  132. package/dist/components/pages/LiteListPage.svelte +81 -0
  133. package/dist/components/pages/LiteListPage.svelte.d.ts +20 -0
  134. package/dist/components/pages/LiteProfilePage.svelte +61 -0
  135. package/dist/components/pages/LiteProfilePage.svelte.d.ts +14 -0
  136. package/dist/components/pages/LiteRegisterPage.svelte +63 -0
  137. package/dist/components/pages/LiteRegisterPage.svelte.d.ts +10 -0
  138. package/dist/components/pages/LiteShowPage.svelte +61 -0
  139. package/dist/components/pages/LiteShowPage.svelte.d.ts +11 -0
  140. package/dist/components/pages/LiteUpdatePasswordPage.svelte +51 -0
  141. package/dist/components/pages/LiteUpdatePasswordPage.svelte.d.ts +9 -0
  142. package/dist/components/pages/index.js +8 -0
  143. package/dist/components/widgets/LiteAnomalyBadge.svelte +40 -0
  144. package/dist/components/widgets/LiteAnomalyBadge.svelte.d.ts +15 -0
  145. package/dist/components/widgets/LiteBarChart.svelte +45 -0
  146. package/dist/components/widgets/LiteBarChart.svelte.d.ts +17 -0
  147. package/dist/components/widgets/LiteInsightCard.svelte +31 -0
  148. package/dist/components/widgets/LiteInsightCard.svelte.d.ts +13 -0
  149. package/dist/components/widgets/LiteLineChart.svelte +48 -0
  150. package/dist/components/widgets/LiteLineChart.svelte.d.ts +17 -0
  151. package/dist/components/widgets/LitePieChart.svelte +44 -0
  152. package/dist/components/widgets/LitePieChart.svelte.d.ts +17 -0
  153. package/dist/components/widgets/index.js +5 -0
  154. package/dist/enhance.js +112 -0
  155. package/dist/index.d.ts +27 -0
  156. package/{src/index.ts → dist/index.js} +3 -26
  157. package/dist/lite.css +817 -0
  158. package/dist/schema-generator.d.ts +29 -0
  159. package/dist/schema-generator.js +226 -0
  160. package/dist/security.d.ts +14 -0
  161. package/dist/security.js +59 -0
  162. package/dist/server-adapter.d.ts +111 -0
  163. package/dist/server-adapter.js +422 -0
  164. package/package.json +55 -18
  165. package/src/schema-generator.ts +0 -147
  166. package/src/server-adapter.ts +0 -307
  167. /package/{src/components/advanced/index.ts → dist/components/advanced/index.d.ts} +0 -0
  168. /package/{src/components/buttons/index.ts → dist/components/buttons/index.d.ts} +0 -0
  169. /package/{src/components/fields/index.ts → dist/components/fields/index.d.ts} +0 -0
  170. /package/{src/components/layout/index.ts → dist/components/layout/index.d.ts} +0 -0
  171. /package/{src/components/pages/index.ts → dist/components/pages/index.d.ts} +0 -0
  172. /package/{src/components/widgets/index.ts → dist/components/widgets/index.d.ts} +0 -0
@@ -0,0 +1,31 @@
1
+ <script lang="ts">
2
+ import { t } from '@svadmin/core/i18n';
3
+ import { Download } from '@lucide/svelte';
4
+
5
+ interface Props {
6
+ resource: string;
7
+ basePath?: string;
8
+ hideText?: boolean;
9
+ class?: string;
10
+ size?: 'sm' | 'default' | 'icon';
11
+ }
12
+
13
+ let {
14
+ resource,
15
+ basePath = '/lite',
16
+ hideText = false,
17
+ class: className = '',
18
+ size = 'default'
19
+ }: Props = $props();
20
+ </script>
21
+
22
+ <a
23
+ href={`${basePath}/${resource}?action=export`}
24
+ class="lite-btn {size === 'sm' ? 'lite-btn-sm' : ''} {className}"
25
+ title={t('common.export') || 'Export'}
26
+ >
27
+ <Download class="h-4 w-4" />
28
+ {#if !hideText}
29
+ <span style="marginLeft: 4px">{t('common.export') || 'Export'}</span>
30
+ {/if}
31
+ </a>
@@ -0,0 +1,10 @@
1
+ interface Props {
2
+ resource: string;
3
+ basePath?: string;
4
+ hideText?: boolean;
5
+ class?: string;
6
+ size?: 'sm' | 'default' | 'icon';
7
+ }
8
+ declare const LiteExportButton: import("svelte").Component<Props, {}, "">;
9
+ type LiteExportButton = ReturnType<typeof LiteExportButton>;
10
+ export default LiteExportButton;
@@ -0,0 +1,50 @@
1
+ <script lang="ts">
2
+ import { t } from '@svadmin/core/i18n';
3
+ import { Upload } from '@lucide/svelte';
4
+
5
+ interface Props {
6
+ resource: string;
7
+ basePath?: string;
8
+ hideText?: boolean;
9
+ class?: string;
10
+ size?: 'sm' | 'default' | 'icon';
11
+ }
12
+
13
+ let {
14
+ resource,
15
+ basePath = '/lite',
16
+ hideText = false,
17
+ class: className = '',
18
+ size = 'default'
19
+ }: Props = $props();
20
+ </script>
21
+
22
+ <details class="lite-confirm-details {className}">
23
+ <summary
24
+ class="lite-btn {size === 'sm' ? 'lite-btn-sm' : ''}"
25
+ title={t('common.import') || 'Import'}
26
+ >
27
+ <Upload class="h-4 w-4" />
28
+ {#if !hideText}
29
+ <span style="marginLeft: 4px">{t('common.import') || 'Import'}</span>
30
+ {/if}
31
+ </summary>
32
+ <div class="lite-confirm-panel">
33
+ <p style="margin: 0 0 8px; font-size: 13px;">{t('common.importData') || 'Import data (CSV/JSON)'}</p>
34
+ <form method="POST" action={`${basePath}/${resource}?/${resource}_import`} enctype="multipart/form-data" style="display:flex; flex-direction: column; gap: 8px;">
35
+ <input type="file" name="file" accept=".csv,.json" required style="font-size: 13px;" />
36
+ <div style="display:flex; gap: 8px; justify-content: flex-end;">
37
+ <button
38
+ type="button"
39
+ class="lite-btn lite-btn-sm"
40
+ onclick={(e) => (e.currentTarget as HTMLElement).closest('details')?.removeAttribute('open')}
41
+ >
42
+ {t('common.cancel') || 'Cancel'}
43
+ </button>
44
+ <button type="submit" class="lite-btn lite-btn-sm lite-btn-primary">
45
+ {t('common.upload') || 'Upload'}
46
+ </button>
47
+ </div>
48
+ </form>
49
+ </div>
50
+ </details>
@@ -0,0 +1,10 @@
1
+ interface Props {
2
+ resource: string;
3
+ basePath?: string;
4
+ hideText?: boolean;
5
+ class?: string;
6
+ size?: 'sm' | 'default' | 'icon';
7
+ }
8
+ declare const LiteImportButton: import("svelte").Component<Props, {}, "">;
9
+ type LiteImportButton = ReturnType<typeof LiteImportButton>;
10
+ export default LiteImportButton;
@@ -0,0 +1,31 @@
1
+ <script lang="ts">
2
+ import { t } from '@svadmin/core/i18n';
3
+ import { List } from '@lucide/svelte';
4
+
5
+ interface Props {
6
+ resource: string;
7
+ basePath?: string;
8
+ hideText?: boolean;
9
+ class?: string;
10
+ size?: 'sm' | 'default' | 'icon';
11
+ }
12
+
13
+ let {
14
+ resource,
15
+ basePath = '/lite',
16
+ hideText = false,
17
+ class: className = '',
18
+ size = 'default'
19
+ }: Props = $props();
20
+ </script>
21
+
22
+ <a
23
+ href={`${basePath}/${resource}`}
24
+ class="lite-btn {size === 'sm' ? 'lite-btn-sm' : ''} {className}"
25
+ title={t('common.list') || 'List'}
26
+ >
27
+ <List class="h-4 w-4" />
28
+ {#if !hideText}
29
+ <span style="marginLeft: 4px">{t('common.list') || 'List'}</span>
30
+ {/if}
31
+ </a>
@@ -0,0 +1,10 @@
1
+ interface Props {
2
+ resource: string;
3
+ basePath?: string;
4
+ hideText?: boolean;
5
+ class?: string;
6
+ size?: 'sm' | 'default' | 'icon';
7
+ }
8
+ declare const LiteListButton: import("svelte").Component<Props, {}, "">;
9
+ type LiteListButton = ReturnType<typeof LiteListButton>;
10
+ export default LiteListButton;
@@ -0,0 +1,34 @@
1
+ <script lang="ts">
2
+ import { t } from '@svadmin/core/i18n';
3
+ import { RefreshCw } from '@lucide/svelte';
4
+
5
+ interface Props {
6
+ hideText?: boolean;
7
+ class?: string;
8
+ size?: 'sm' | 'default' | 'icon';
9
+ }
10
+
11
+ let {
12
+ hideText = false,
13
+ class: className = '',
14
+ size = 'default'
15
+ }: Props = $props();
16
+
17
+ function refreshPage() {
18
+ if (typeof window !== 'undefined') {
19
+ window.location.reload();
20
+ }
21
+ }
22
+ </script>
23
+
24
+ <button
25
+ type="button"
26
+ class="lite-btn {size === 'sm' ? 'lite-btn-sm' : ''} {className}"
27
+ title={t('common.refresh') || 'Refresh'}
28
+ onclick={refreshPage}
29
+ >
30
+ <RefreshCw class="h-4 w-4" />
31
+ {#if !hideText}
32
+ <span style="marginLeft: 4px">{t('common.refresh') || 'Refresh'}</span>
33
+ {/if}
34
+ </button>
@@ -0,0 +1,8 @@
1
+ interface Props {
2
+ hideText?: boolean;
3
+ class?: string;
4
+ size?: 'sm' | 'default' | 'icon';
5
+ }
6
+ declare const LiteRefreshButton: import("svelte").Component<Props, {}, "">;
7
+ type LiteRefreshButton = ReturnType<typeof LiteRefreshButton>;
8
+ export default LiteRefreshButton;
@@ -0,0 +1,27 @@
1
+ <script lang="ts">
2
+ import { t } from '@svadmin/core/i18n';
3
+ import { Save } from '@lucide/svelte';
4
+
5
+ interface Props {
6
+ hideText?: boolean;
7
+ class?: string;
8
+ size?: 'sm' | 'default' | 'icon';
9
+ }
10
+
11
+ let {
12
+ hideText = false,
13
+ class: className = '',
14
+ size = 'default'
15
+ }: Props = $props();
16
+ </script>
17
+
18
+ <button
19
+ type="submit"
20
+ class="lite-btn lite-btn-primary {size === 'sm' ? 'lite-btn-sm' : ''} {className}"
21
+ title={t('common.save') || 'Save'}
22
+ >
23
+ <Save class="h-4 w-4" />
24
+ {#if !hideText}
25
+ <span style="marginLeft: 4px">{t('common.save') || 'Save'}</span>
26
+ {/if}
27
+ </button>
@@ -0,0 +1,8 @@
1
+ interface Props {
2
+ hideText?: boolean;
3
+ class?: string;
4
+ size?: 'sm' | 'default' | 'icon';
5
+ }
6
+ declare const LiteSaveButton: import("svelte").Component<Props, {}, "">;
7
+ type LiteSaveButton = ReturnType<typeof LiteSaveButton>;
8
+ export default LiteSaveButton;
@@ -0,0 +1,33 @@
1
+ <script lang="ts">
2
+ import { t } from '@svadmin/core/i18n';
3
+ import { Eye } from '@lucide/svelte';
4
+
5
+ interface Props {
6
+ resource: string;
7
+ recordItemId: string | number;
8
+ basePath?: string;
9
+ hideText?: boolean;
10
+ class?: string;
11
+ size?: 'sm' | 'default' | 'icon';
12
+ }
13
+
14
+ let {
15
+ resource,
16
+ recordItemId,
17
+ basePath = '/lite',
18
+ hideText = false,
19
+ class: className = '',
20
+ size = 'default'
21
+ }: Props = $props();
22
+ </script>
23
+
24
+ <a
25
+ href={`${basePath}/${resource}/show/${recordItemId}`}
26
+ class="lite-btn {size === 'sm' ? 'lite-btn-sm' : ''} {className}"
27
+ title={t('common.show') || 'Show'}
28
+ >
29
+ <Eye class="h-4 w-4" />
30
+ {#if !hideText}
31
+ <span style="marginLeft: 4px">{t('common.show') || 'Show'}</span>
32
+ {/if}
33
+ </a>
@@ -0,0 +1,11 @@
1
+ interface Props {
2
+ resource: string;
3
+ recordItemId: string | number;
4
+ basePath?: string;
5
+ hideText?: boolean;
6
+ class?: string;
7
+ size?: 'sm' | 'default' | 'icon';
8
+ }
9
+ declare const LiteShowButton: import("svelte").Component<Props, {}, "">;
10
+ type LiteShowButton = ReturnType<typeof LiteShowButton>;
11
+ export default LiteShowButton;
@@ -0,0 +1,10 @@
1
+ export { default as LiteCreateButton } from './LiteCreateButton.svelte';
2
+ export { default as LiteEditButton } from './LiteEditButton.svelte';
3
+ export { default as LiteShowButton } from './LiteShowButton.svelte';
4
+ export { default as LiteListButton } from './LiteListButton.svelte';
5
+ export { default as LiteDeleteButton } from './LiteDeleteButton.svelte';
6
+ export { default as LiteCloneButton } from './LiteCloneButton.svelte';
7
+ export { default as LiteExportButton } from './LiteExportButton.svelte';
8
+ export { default as LiteImportButton } from './LiteImportButton.svelte';
9
+ export { default as LiteRefreshButton } from './LiteRefreshButton.svelte';
10
+ export { default as LiteSaveButton } from './LiteSaveButton.svelte';
@@ -0,0 +1,42 @@
1
+ <script lang="ts">
2
+ /* eslint-disable @typescript-eslint/no-explicit-any */
3
+ import type { FieldDefinition } from '@svadmin/core';
4
+
5
+ interface Props {
6
+ field: FieldDefinition;
7
+ value?: unknown;
8
+ error?: string[];
9
+ mode?: 'show' | 'edit' | 'create';
10
+ }
11
+
12
+ let { field, value, error = [], mode = 'show' }: Props = $props();
13
+ let hasError = $derived(error.length > 0);
14
+ </script>
15
+
16
+ {#if mode === 'show'}
17
+ <div>
18
+ <span class="lite-bool {value ? 'lite-bool-true' : ''}"></span>
19
+ {value ? '✓ Yes' : '✗ No'}
20
+ </div>
21
+ {:else}
22
+ <div class="lite-checkbox-group">
23
+ <input
24
+ type="checkbox"
25
+ name={field.key}
26
+ id={field.key}
27
+ checked={!!value}
28
+ value="true"
29
+ />
30
+ <!-- Fallback hidden input so unchecked boxes submit "false" -->
31
+ <input type="hidden" name={field.key} value="false" />
32
+
33
+ <label for={field.key}>
34
+ {(field as any).placeholder ?? (field.label || 'Yes')}
35
+ </label>
36
+ {#if hasError}
37
+ {#each error as err, _i (_i)}
38
+ <div class="lite-error-text">{err}</div>
39
+ {/each}
40
+ {/if}
41
+ </div>
42
+ {/if}
@@ -0,0 +1,10 @@
1
+ import type { FieldDefinition } from '@svadmin/core';
2
+ interface Props {
3
+ field: FieldDefinition;
4
+ value?: unknown;
5
+ error?: string[];
6
+ mode?: 'show' | 'edit' | 'create';
7
+ }
8
+ declare const LiteBooleanField: import("svelte").Component<Props, {}, "">;
9
+ type LiteBooleanField = ReturnType<typeof LiteBooleanField>;
10
+ export default LiteBooleanField;
@@ -0,0 +1,51 @@
1
+ <script lang="ts">
2
+ import type { FieldDefinition } from '@svadmin/core';
3
+
4
+ interface Props {
5
+ field: FieldDefinition;
6
+ value?: unknown;
7
+ error?: string[];
8
+ mode?: 'show' | 'edit' | 'create';
9
+ }
10
+
11
+ let { field, value, error = [], mode = 'show' }: Props = $props();
12
+ let hasError = $derived(error.length > 0);
13
+
14
+ function formatDate(v: unknown): string {
15
+ if (!v) return '';
16
+ try {
17
+ return new Date(v as string).toISOString().substring(0, 16); // Formats for html datetime-local
18
+ } catch {
19
+ return '';
20
+ }
21
+ }
22
+
23
+ function displayDate(v: unknown): string {
24
+ if (!v) return '—';
25
+ try {
26
+ return new Date(v as string).toLocaleString();
27
+ } catch {
28
+ return String(v);
29
+ }
30
+ }
31
+ </script>
32
+
33
+ {#if mode === 'show'}
34
+ <span>{displayDate(value)}</span>
35
+ {:else}
36
+ <div>
37
+ <input
38
+ type="datetime-local"
39
+ name={field.key}
40
+ id={field.key}
41
+ value={formatDate(value)}
42
+ class="lite-input {hasError ? 'lite-input-error' : ''}"
43
+ {...field.required ? { required: true } : {}}
44
+ />
45
+ {#if hasError}
46
+ {#each error as err, _i (_i)}
47
+ <div class="lite-error-text">{err}</div>
48
+ {/each}
49
+ {/if}
50
+ </div>
51
+ {/if}
@@ -0,0 +1,10 @@
1
+ import type { FieldDefinition } from '@svadmin/core';
2
+ interface Props {
3
+ field: FieldDefinition;
4
+ value?: unknown;
5
+ error?: string[];
6
+ mode?: 'show' | 'edit' | 'create';
7
+ }
8
+ declare const LiteDateField: import("svelte").Component<Props, {}, "">;
9
+ type LiteDateField = ReturnType<typeof LiteDateField>;
10
+ export default LiteDateField;
@@ -0,0 +1,41 @@
1
+ <script lang="ts">
2
+ /* eslint-disable @typescript-eslint/no-explicit-any */
3
+ import type { FieldDefinition } from '@svadmin/core';
4
+
5
+ interface Props {
6
+ field: FieldDefinition;
7
+ value?: unknown;
8
+ error?: string[];
9
+ mode?: 'show' | 'edit' | 'create';
10
+ }
11
+
12
+ let { field, value, error = [], mode = 'show' }: Props = $props();
13
+ let hasError = $derived(error.length > 0);
14
+ </script>
15
+
16
+ {#if mode === 'show'}
17
+ <span>
18
+ {#if value}
19
+ <a href="mailto:{value}">{value}</a>
20
+ {:else}
21
+
22
+ {/if}
23
+ </span>
24
+ {:else}
25
+ <div>
26
+ <input
27
+ type="email"
28
+ name={field.key}
29
+ id={field.key}
30
+ value={String(value ?? '')}
31
+ class="lite-input {hasError ? 'lite-input-error' : ''}"
32
+ placeholder={(field as any).placeholder ?? field.label}
33
+ {...field.required ? { required: true } : {}}
34
+ />
35
+ {#if hasError}
36
+ {#each error as err, _i (_i)}
37
+ <div class="lite-error-text">{err}</div>
38
+ {/each}
39
+ {/if}
40
+ </div>
41
+ {/if}
@@ -0,0 +1,10 @@
1
+ import type { FieldDefinition } from '@svadmin/core';
2
+ interface Props {
3
+ field: FieldDefinition;
4
+ value?: unknown;
5
+ error?: string[];
6
+ mode?: 'show' | 'edit' | 'create';
7
+ }
8
+ declare const LiteEmailField: import("svelte").Component<Props, {}, "">;
9
+ type LiteEmailField = ReturnType<typeof LiteEmailField>;
10
+ export default LiteEmailField;
@@ -0,0 +1,59 @@
1
+ <script lang="ts">
2
+ import type { FieldDefinition } from '@svadmin/core';
3
+ import { toSafeHref } from '../../security';
4
+
5
+ interface Props {
6
+ field: FieldDefinition;
7
+ value?: unknown;
8
+ error?: string[];
9
+ mode?: 'show' | 'edit' | 'create';
10
+ }
11
+
12
+ let { field, value, error = [], mode = 'show' }: Props = $props();
13
+ let hasError = $derived(error.length > 0);
14
+
15
+ function getFiles(v: unknown): string[] {
16
+ if (!v) return [];
17
+ if (Array.isArray(v)) return v.map(String);
18
+ if (typeof v === 'string') return [v];
19
+ return [];
20
+ }
21
+ </script>
22
+
23
+ {#if mode === 'show'}
24
+ {@const files = getFiles(value)}
25
+ <div style="display:flex; flex-direction: column; gap: 4px;">
26
+ {#each files as f, _i (_i)}
27
+ {@const href = toSafeHref(f)}
28
+ {#if href}
29
+ <a {href} target="_blank" rel="noopener noreferrer">{f.split('/').pop() || 'Download'}</a>
30
+ {:else}
31
+ <span>{f}</span>
32
+ {/if}
33
+ {:else}
34
+ <span>—</span>
35
+ {/each}
36
+ </div>
37
+ {:else}
38
+ {@const files = getFiles(value)}
39
+ <div>
40
+ {#if files.length > 0 && mode === 'edit'}
41
+ <div style="margin-bottom: 8px;">
42
+ <span style="font-size: 12px;">Current files: {files.length}</span>
43
+ </div>
44
+ {/if}
45
+ <input
46
+ type="file"
47
+ name={field.key}
48
+ id={field.key}
49
+ class="lite-input {hasError ? 'lite-input-error' : ''}"
50
+ {...(field.type as string) === 'files' ? { multiple: true } : {}}
51
+ {...field.required && !files.length ? { required: true } : {}}
52
+ />
53
+ {#if hasError}
54
+ {#each error as err, _i (_i)}
55
+ <div class="lite-error-text">{err}</div>
56
+ {/each}
57
+ {/if}
58
+ </div>
59
+ {/if}
@@ -0,0 +1,10 @@
1
+ import type { FieldDefinition } from '@svadmin/core';
2
+ interface Props {
3
+ field: FieldDefinition;
4
+ value?: unknown;
5
+ error?: string[];
6
+ mode?: 'show' | 'edit' | 'create';
7
+ }
8
+ declare const LiteFileField: import("svelte").Component<Props, {}, "">;
9
+ type LiteFileField = ReturnType<typeof LiteFileField>;
10
+ export default LiteFileField;
@@ -0,0 +1,57 @@
1
+ <script lang="ts">
2
+ import type { FieldDefinition } from '@svadmin/core';
3
+
4
+ interface Props {
5
+ field: FieldDefinition;
6
+ value?: unknown;
7
+ error?: string[];
8
+ mode?: 'show' | 'edit' | 'create';
9
+ }
10
+
11
+ let { field, value, error = [], mode = 'show' }: Props = $props();
12
+ let hasError = $derived(error.length > 0);
13
+
14
+ function getUrls(v: unknown): string[] {
15
+ if (!v) return [];
16
+ if (Array.isArray(v)) return v.map(String);
17
+ if (typeof v === 'string') return [v];
18
+ return [];
19
+ }
20
+ </script>
21
+
22
+ {#if mode === 'show'}
23
+ {@const urls = getUrls(value)}
24
+ <div style="display:flex; gap: 8px; flex-wrap: wrap;">
25
+ {#each urls as url, _i (_i)}
26
+ <img src={url} alt={field.label} style="max-height: 100px; border-radius: 4px; border: 1px solid #e5e7eb;" />
27
+ {:else}
28
+ <span>—</span>
29
+ {/each}
30
+ </div>
31
+ {:else}
32
+ {@const urls = getUrls(value)}
33
+ <div>
34
+ {#if urls.length > 0 && mode === 'edit'}
35
+ <div style="margin-bottom: 8px; display:flex; gap: 8px;">
36
+ {#each urls as url, _i (_i)}
37
+ <img src={url} alt="Current" style="height: 60px; border-radius: 4px; border: 1px solid #e5e7eb; opacity: 0.6;" />
38
+ {/each}
39
+ </div>
40
+ <p style="font-size: 11px; color:#6b7280; margin: 0 0 4px;">Uploading new ones will overwrite.</p>
41
+ {/if}
42
+ <input
43
+ type="file"
44
+ name={field.key}
45
+ id={field.key}
46
+ accept="image/*"
47
+ class="lite-input {hasError ? 'lite-input-error' : ''}"
48
+ {...(field.type as string) === 'images' ? { multiple: true } : {}}
49
+ {...field.required && !urls.length ? { required: true } : {}}
50
+ />
51
+ {#if hasError}
52
+ {#each error as err, _i (_i)}
53
+ <div class="lite-error-text">{err}</div>
54
+ {/each}
55
+ {/if}
56
+ </div>
57
+ {/if}
@@ -0,0 +1,10 @@
1
+ import type { FieldDefinition } from '@svadmin/core';
2
+ interface Props {
3
+ field: FieldDefinition;
4
+ value?: unknown;
5
+ error?: string[];
6
+ mode?: 'show' | 'edit' | 'create';
7
+ }
8
+ declare const LiteImageField: import("svelte").Component<Props, {}, "">;
9
+ type LiteImageField = ReturnType<typeof LiteImageField>;
10
+ export default LiteImageField;
@@ -0,0 +1,43 @@
1
+ <script lang="ts">
2
+ import type { FieldDefinition } from '@svadmin/core';
3
+
4
+ interface Props {
5
+ field: FieldDefinition;
6
+ value?: unknown;
7
+ error?: string[];
8
+ mode?: 'show' | 'edit' | 'create';
9
+ }
10
+
11
+ let { field, value, error = [], mode = 'show' }: Props = $props();
12
+ let hasError = $derived(error.length > 0);
13
+
14
+ function getJsonString(v: unknown): string {
15
+ if (v == null) return '';
16
+ if (typeof v === 'string') return v;
17
+ try {
18
+ return JSON.stringify(v, null, 2);
19
+ } catch {
20
+ return String(v);
21
+ }
22
+ }
23
+ </script>
24
+
25
+ {#if mode === 'show'}
26
+ <pre style="padding: 12px; background: #1e293b; color: #f8fafc; border-radius: 4px; overflow-x: auto; font-size: 13px;">{getJsonString(value)}</pre>
27
+ {:else}
28
+ <div>
29
+ <textarea
30
+ name={field.key}
31
+ id={field.key}
32
+ class="lite-input {hasError ? 'lite-input-error' : ''}"
33
+ style="min-height: 150px; font-family: monospace;"
34
+ placeholder="&lbrace;&rbrace;"
35
+ {...field.required ? { required: true } : {}}
36
+ >{getJsonString(value)}</textarea>
37
+ {#if hasError}
38
+ {#each error as err, _i (_i)}
39
+ <div class="lite-error-text">{err}</div>
40
+ {/each}
41
+ {/if}
42
+ </div>
43
+ {/if}
@@ -0,0 +1,10 @@
1
+ import type { FieldDefinition } from '@svadmin/core';
2
+ interface Props {
3
+ field: FieldDefinition;
4
+ value?: unknown;
5
+ error?: string[];
6
+ mode?: 'show' | 'edit' | 'create';
7
+ }
8
+ declare const LiteJsonField: import("svelte").Component<Props, {}, "">;
9
+ type LiteJsonField = ReturnType<typeof LiteJsonField>;
10
+ export default LiteJsonField;