@svadmin/ui 0.29.3 → 0.30.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.
- package/dist/README.md +18 -0
- package/dist/actions.d.ts +35 -0
- package/dist/actions.js +84 -0
- package/dist/app.css +673 -0
- package/dist/component-registry.svelte.d.ts +36 -0
- package/dist/component-registry.svelte.js +20 -0
- package/dist/components/AICommandBar.svelte +180 -0
- package/dist/components/AICommandBar.svelte.d.ts +6 -0
- package/dist/components/AboutSettings.svelte +106 -0
- package/dist/components/AboutSettings.svelte.d.ts +18 -0
- package/dist/components/AdminApp.svelte +205 -0
- package/dist/components/AdminApp.svelte.d.ts +28 -0
- package/dist/components/AnimatedCounter.svelte +46 -0
- package/dist/components/AnimatedCounter.svelte.d.ts +11 -0
- package/dist/components/AnomalyBadge.svelte +65 -0
- package/dist/components/AnomalyBadge.svelte.d.ts +16 -0
- package/dist/components/AppearanceSettings.svelte +183 -0
- package/dist/components/AppearanceSettings.svelte.d.ts +3 -0
- package/dist/components/AuditLogDrawer.svelte +93 -0
- package/dist/components/AuditLogDrawer.svelte.d.ts +8 -0
- package/dist/components/AuditLogViewer.svelte +226 -0
- package/dist/components/AuditLogViewer.svelte.d.ts +3 -0
- package/dist/components/Authenticated.svelte +51 -0
- package/dist/components/Authenticated.svelte.d.ts +11 -0
- package/dist/components/AutoForm.svelte +244 -0
- package/dist/components/AutoForm.svelte.d.ts +20 -0
- package/dist/components/AutoSaveIndicator.svelte +35 -0
- package/dist/components/AutoSaveIndicator.svelte.d.ts +9 -0
- package/dist/components/AutoTable.svelte +839 -0
- package/dist/components/AutoTable.svelte.d.ts +44 -0
- package/dist/components/Breadcrumbs.svelte +58 -0
- package/dist/components/Breadcrumbs.svelte.d.ts +3 -0
- package/dist/components/CanAccess.svelte +23 -0
- package/dist/components/CanAccess.svelte.d.ts +12 -0
- package/dist/components/CatchAllNavigate.svelte +21 -0
- package/dist/components/CatchAllNavigate.svelte.d.ts +3 -0
- package/dist/components/ChatDialog.svelte +535 -0
- package/dist/components/ChatDialog.svelte.d.ts +14 -0
- package/dist/components/ComboboxField.svelte +129 -0
- package/dist/components/ComboboxField.svelte.d.ts +17 -0
- package/dist/components/CommandPalette.svelte +135 -0
- package/dist/components/CommandPalette.svelte.d.ts +8 -0
- package/dist/components/ConfigErrorScreen.svelte +126 -0
- package/dist/components/ConfigErrorScreen.svelte.d.ts +11 -0
- package/dist/components/ConfirmDialog.svelte +53 -0
- package/dist/components/ConfirmDialog.svelte.d.ts +13 -0
- package/dist/components/CopilotPanel.svelte +163 -0
- package/dist/components/CopilotPanel.svelte.d.ts +6 -0
- package/dist/components/CreatePage.svelte +39 -0
- package/dist/components/CreatePage.svelte.d.ts +10 -0
- package/dist/components/DevTools.svelte +149 -0
- package/dist/components/DevTools.svelte.d.ts +3 -0
- package/dist/components/DraggableGrid.svelte +86 -0
- package/dist/components/DraggableGrid.svelte.d.ts +17 -0
- package/dist/components/DraggableHeader.svelte +112 -0
- package/dist/components/DraggableHeader.svelte.d.ts +25 -0
- package/dist/components/DrawerForm.svelte +35 -0
- package/dist/components/DrawerForm.svelte.d.ts +11 -0
- package/dist/components/EditPage.svelte +52 -0
- package/dist/components/EditPage.svelte.d.ts +12 -0
- package/dist/components/EmptyState.svelte +31 -0
- package/dist/components/EmptyState.svelte.d.ts +8 -0
- package/dist/components/ErrorBoundary.svelte +49 -0
- package/dist/components/ErrorBoundary.svelte.d.ts +12 -0
- package/dist/components/ErrorComponent.svelte +36 -0
- package/dist/components/ErrorComponent.svelte.d.ts +9 -0
- package/dist/components/FieldRenderer.svelte +357 -0
- package/dist/components/FieldRenderer.svelte.d.ts +13 -0
- package/dist/components/ForgotPasswordPage.svelte +112 -0
- package/dist/components/ForgotPasswordPage.svelte.d.ts +6 -0
- package/dist/components/Header.svelte +94 -0
- package/dist/components/Header.svelte.d.ts +12 -0
- package/dist/components/InferencerPanel.svelte +192 -0
- package/dist/components/InferencerPanel.svelte.d.ts +3 -0
- package/dist/components/InfiniteList.svelte +93 -0
- package/dist/components/InfiniteList.svelte.d.ts +20 -0
- package/dist/components/InlineEdit.svelte +88 -0
- package/dist/components/InlineEdit.svelte.d.ts +12 -0
- package/dist/components/InsightCard.svelte +98 -0
- package/dist/components/InsightCard.svelte.d.ts +11 -0
- package/dist/components/KeyboardShortcuts.svelte +61 -0
- package/dist/components/KeyboardShortcuts.svelte.d.ts +6 -0
- package/dist/components/Layout.svelte +167 -0
- package/dist/components/Layout.svelte.d.ts +12 -0
- package/dist/components/ListPage.svelte +71 -0
- package/dist/components/ListPage.svelte.d.ts +32 -0
- package/dist/components/LiveIndicator.svelte +58 -0
- package/dist/components/LiveIndicator.svelte.d.ts +12 -0
- package/dist/components/LoginPage.svelte +163 -0
- package/dist/components/LoginPage.svelte.d.ts +28 -0
- package/dist/components/MarkdownRenderer.svelte +127 -0
- package/dist/components/MarkdownRenderer.svelte.d.ts +11 -0
- package/dist/components/ModalForm.svelte +38 -0
- package/dist/components/ModalForm.svelte.d.ts +10 -0
- package/dist/components/NavigateToResource.svelte +20 -0
- package/dist/components/NavigateToResource.svelte.d.ts +3 -0
- package/dist/components/PageHeader.svelte +39 -0
- package/dist/components/PageHeader.svelte.d.ts +11 -0
- package/dist/components/PageSkeleton.svelte +71 -0
- package/dist/components/PageSkeleton.svelte.d.ts +7 -0
- package/dist/components/PasswordInput.svelte +96 -0
- package/dist/components/PasswordInput.svelte.d.ts +12 -0
- package/dist/components/PermissionMatrix.svelte +185 -0
- package/dist/components/PermissionMatrix.svelte.d.ts +19 -0
- package/dist/components/ProfilePage.svelte +284 -0
- package/dist/components/ProfilePage.svelte.d.ts +3 -0
- package/dist/components/RegisterPage.svelte +112 -0
- package/dist/components/RegisterPage.svelte.d.ts +7 -0
- package/dist/components/RolesSettings.svelte +146 -0
- package/dist/components/RolesSettings.svelte.d.ts +3 -0
- package/dist/components/SettingsPage.svelte +113 -0
- package/dist/components/SettingsPage.svelte.d.ts +3 -0
- package/dist/components/ShowPage.svelte +73 -0
- package/dist/components/ShowPage.svelte.d.ts +7 -0
- package/dist/components/Sidebar.svelte +417 -0
- package/dist/components/Sidebar.svelte.d.ts +14 -0
- package/dist/components/SidebarItem.svelte +129 -0
- package/dist/components/SidebarItem.svelte.d.ts +11 -0
- package/dist/components/SmartSuggest.svelte +158 -0
- package/dist/components/SmartSuggest.svelte.d.ts +19 -0
- package/dist/components/StatsCard.svelte +79 -0
- package/dist/components/StatsCard.svelte.d.ts +23 -0
- package/dist/components/StepsForm.svelte +194 -0
- package/dist/components/StepsForm.svelte.d.ts +13 -0
- package/dist/components/TaskQueueDrawer.svelte +158 -0
- package/dist/components/TaskQueueDrawer.svelte.d.ts +11 -0
- package/dist/components/TenantSwitcher.svelte +84 -0
- package/dist/components/TenantSwitcher.svelte.d.ts +12 -0
- package/dist/components/ThemedTitle.svelte +32 -0
- package/dist/components/ThemedTitle.svelte.d.ts +9 -0
- package/dist/components/Toast.svelte +46 -0
- package/dist/components/Toast.svelte.d.ts +3 -0
- package/dist/components/TooltipButton.svelte +42 -0
- package/dist/components/TooltipButton.svelte.d.ts +14 -0
- package/dist/components/UndoableNotification.svelte +69 -0
- package/dist/components/UndoableNotification.svelte.d.ts +9 -0
- package/dist/components/UpdatePasswordPage.svelte +89 -0
- package/dist/components/UpdatePasswordPage.svelte.d.ts +6 -0
- package/dist/components/VirtualTable.svelte +76 -0
- package/dist/components/VirtualTable.svelte.d.ts +27 -0
- package/dist/components/VoiceInput.svelte +120 -0
- package/dist/components/VoiceInput.svelte.d.ts +15 -0
- package/dist/components/buttons/CloneButton.svelte +30 -0
- package/dist/components/buttons/CloneButton.svelte.d.ts +13 -0
- package/dist/components/buttons/CreateButton.svelte +29 -0
- package/dist/components/buttons/CreateButton.svelte.d.ts +12 -0
- package/dist/components/buttons/DeleteButton.svelte +59 -0
- package/dist/components/buttons/DeleteButton.svelte.d.ts +15 -0
- package/dist/components/buttons/EditButton.svelte +30 -0
- package/dist/components/buttons/EditButton.svelte.d.ts +13 -0
- package/dist/components/buttons/ExportButton.svelte +30 -0
- package/dist/components/buttons/ExportButton.svelte.d.ts +12 -0
- package/dist/components/buttons/ImportButton.svelte +56 -0
- package/dist/components/buttons/ImportButton.svelte.d.ts +19 -0
- package/dist/components/buttons/ListButton.svelte +23 -0
- package/dist/components/buttons/ListButton.svelte.d.ts +8 -0
- package/dist/components/buttons/RefreshButton.svelte +36 -0
- package/dist/components/buttons/RefreshButton.svelte.d.ts +8 -0
- package/dist/components/buttons/SaveButton.svelte +27 -0
- package/dist/components/buttons/SaveButton.svelte.d.ts +9 -0
- package/dist/components/buttons/ShowButton.svelte +31 -0
- package/dist/components/buttons/ShowButton.svelte.d.ts +13 -0
- package/dist/components/buttons/index.d.ts +10 -0
- package/dist/components/buttons/index.js +10 -0
- package/dist/components/charts/BarChart.svelte +69 -0
- package/dist/components/charts/BarChart.svelte.d.ts +15 -0
- package/dist/components/charts/LineChart.svelte +115 -0
- package/dist/components/charts/LineChart.svelte.d.ts +17 -0
- package/dist/components/charts/PieChart.svelte +95 -0
- package/dist/components/charts/PieChart.svelte.d.ts +15 -0
- package/dist/components/charts/index.d.ts +3 -0
- package/dist/components/charts/index.js +3 -0
- package/dist/components/fieldComponentMap.d.ts +24 -0
- package/dist/components/fieldComponentMap.js +65 -0
- package/dist/components/fields/ArrayField.svelte +86 -0
- package/dist/components/fields/ArrayField.svelte.d.ts +9 -0
- package/dist/components/fields/BooleanField.svelte +13 -0
- package/dist/components/fields/BooleanField.svelte.d.ts +8 -0
- package/dist/components/fields/DateField.svelte +6 -0
- package/dist/components/fields/DateField.svelte.d.ts +8 -0
- package/dist/components/fields/EmailField.svelte +9 -0
- package/dist/components/fields/EmailField.svelte.d.ts +6 -0
- package/dist/components/fields/FileField.svelte +14 -0
- package/dist/components/fields/FileField.svelte.d.ts +7 -0
- package/dist/components/fields/ImageField.svelte +9 -0
- package/dist/components/fields/ImageField.svelte.d.ts +9 -0
- package/dist/components/fields/JsonField.svelte +72 -0
- package/dist/components/fields/JsonField.svelte.d.ts +6 -0
- package/dist/components/fields/MarkdownField.svelte +9 -0
- package/dist/components/fields/MarkdownField.svelte.d.ts +6 -0
- package/dist/components/fields/MultiSelectField.svelte +21 -0
- package/dist/components/fields/MultiSelectField.svelte.d.ts +10 -0
- package/dist/components/fields/NumberField.svelte +6 -0
- package/dist/components/fields/NumberField.svelte.d.ts +8 -0
- package/dist/components/fields/RelationField.svelte +24 -0
- package/dist/components/fields/RelationField.svelte.d.ts +8 -0
- package/dist/components/fields/RichTextField.svelte +35 -0
- package/dist/components/fields/RichTextField.svelte.d.ts +7 -0
- package/dist/components/fields/SelectField.svelte +14 -0
- package/dist/components/fields/SelectField.svelte.d.ts +10 -0
- package/dist/components/fields/TagField.svelte +12 -0
- package/dist/components/fields/TagField.svelte.d.ts +6 -0
- package/dist/components/fields/TextField.svelte +11 -0
- package/dist/components/fields/TextField.svelte.d.ts +7 -0
- package/dist/components/fields/UrlField.svelte +14 -0
- package/dist/components/fields/UrlField.svelte.d.ts +7 -0
- package/dist/components/ui/alert/alert-description.svelte +17 -0
- package/dist/components/ui/alert/alert-description.svelte.d.ts +6 -0
- package/dist/components/ui/alert/alert-title.svelte +17 -0
- package/dist/components/ui/alert/alert-title.svelte.d.ts +6 -0
- package/dist/components/ui/alert/alert.svelte +44 -0
- package/dist/components/ui/alert/alert.svelte.d.ts +32 -0
- package/dist/components/ui/alert/index.d.ts +4 -0
- package/dist/components/ui/alert/index.js +5 -0
- package/dist/components/ui/alert-dialog/alert-dialog-content.svelte +29 -0
- package/dist/components/ui/alert-dialog/alert-dialog-content.svelte.d.ts +10 -0
- package/dist/components/ui/alert-dialog/alert-dialog-description.svelte +16 -0
- package/dist/components/ui/alert-dialog/alert-dialog-description.svelte.d.ts +7 -0
- package/dist/components/ui/alert-dialog/alert-dialog-footer.svelte +11 -0
- package/dist/components/ui/alert-dialog/alert-dialog-footer.svelte.d.ts +8 -0
- package/dist/components/ui/alert-dialog/alert-dialog-header.svelte +11 -0
- package/dist/components/ui/alert-dialog/alert-dialog-header.svelte.d.ts +8 -0
- package/dist/components/ui/alert-dialog/alert-dialog-overlay.svelte +16 -0
- package/dist/components/ui/alert-dialog/alert-dialog-overlay.svelte.d.ts +7 -0
- package/dist/components/ui/alert-dialog/alert-dialog-portal.svelte +6 -0
- package/dist/components/ui/alert-dialog/alert-dialog-portal.svelte.d.ts +3 -0
- package/dist/components/ui/alert-dialog/alert-dialog-title.svelte +16 -0
- package/dist/components/ui/alert-dialog/alert-dialog-title.svelte.d.ts +7 -0
- package/dist/components/ui/alert-dialog/index.d.ts +13 -0
- package/dist/components/ui/alert-dialog/index.js +13 -0
- package/dist/components/ui/avatar/avatar.svelte +63 -0
- package/dist/components/ui/avatar/avatar.svelte.d.ts +32 -0
- package/dist/components/ui/avatar/index.d.ts +2 -0
- package/dist/components/ui/avatar/index.js +2 -0
- package/dist/components/ui/badge/badge.svelte +49 -0
- package/dist/components/ui/badge/badge.svelte.d.ts +38 -0
- package/dist/components/ui/badge/index.d.ts +2 -0
- package/dist/components/ui/badge/index.js +3 -0
- package/dist/components/ui/breadcrumb/breadcrumb-ellipsis.svelte +18 -0
- package/dist/components/ui/breadcrumb/breadcrumb-ellipsis.svelte.d.ts +4 -0
- package/dist/components/ui/breadcrumb/breadcrumb-item.svelte +15 -0
- package/dist/components/ui/breadcrumb/breadcrumb-item.svelte.d.ts +8 -0
- package/dist/components/ui/breadcrumb/breadcrumb-link.svelte +15 -0
- package/dist/components/ui/breadcrumb/breadcrumb-link.svelte.d.ts +8 -0
- package/dist/components/ui/breadcrumb/breadcrumb-list.svelte +15 -0
- package/dist/components/ui/breadcrumb/breadcrumb-list.svelte.d.ts +8 -0
- package/dist/components/ui/breadcrumb/breadcrumb-page.svelte +18 -0
- package/dist/components/ui/breadcrumb/breadcrumb-page.svelte.d.ts +8 -0
- package/dist/components/ui/breadcrumb/breadcrumb-separator.svelte +22 -0
- package/dist/components/ui/breadcrumb/breadcrumb-separator.svelte.d.ts +8 -0
- package/dist/components/ui/breadcrumb/breadcrumb.svelte +11 -0
- package/dist/components/ui/breadcrumb/breadcrumb.svelte.d.ts +8 -0
- package/dist/components/ui/breadcrumb/index.d.ts +7 -0
- package/dist/components/ui/breadcrumb/index.js +7 -0
- package/dist/components/ui/button/button.svelte +90 -0
- package/dist/components/ui/button/button.svelte.d.ts +70 -0
- package/dist/components/ui/button/index.d.ts +2 -0
- package/dist/components/ui/button/index.js +5 -0
- package/dist/components/ui/card/card-action.svelte +23 -0
- package/dist/components/ui/card/card-action.svelte.d.ts +5 -0
- package/dist/components/ui/card/card-content.svelte +20 -0
- package/dist/components/ui/card/card-content.svelte.d.ts +5 -0
- package/dist/components/ui/card/card-description.svelte +20 -0
- package/dist/components/ui/card/card-description.svelte.d.ts +5 -0
- package/dist/components/ui/card/card-footer.svelte +20 -0
- package/dist/components/ui/card/card-footer.svelte.d.ts +5 -0
- package/dist/components/ui/card/card-header.svelte +23 -0
- package/dist/components/ui/card/card-header.svelte.d.ts +5 -0
- package/dist/components/ui/card/card-title.svelte +15 -0
- package/dist/components/ui/card/card-title.svelte.d.ts +5 -0
- package/dist/components/ui/card/card.svelte +22 -0
- package/dist/components/ui/card/card.svelte.d.ts +8 -0
- package/dist/components/ui/card/index.d.ts +8 -0
- package/dist/components/ui/card/index.js +10 -0
- package/dist/components/ui/checkbox/checkbox.svelte +39 -0
- package/dist/components/ui/checkbox/checkbox.svelte.d.ts +4 -0
- package/dist/components/ui/checkbox/index.d.ts +2 -0
- package/dist/components/ui/checkbox/index.js +4 -0
- package/dist/components/ui/collapsible/index.d.ts +5 -0
- package/dist/components/ui/collapsible/index.js +5 -0
- package/dist/components/ui/command/command-dialog.svelte +31 -0
- package/dist/components/ui/command/command-dialog.svelte.d.ts +10 -0
- package/dist/components/ui/command/index.d.ts +2 -0
- package/dist/components/ui/command/index.js +2 -0
- package/dist/components/ui/context-menu/index.d.ts +9 -0
- package/dist/components/ui/context-menu/index.js +9 -0
- package/dist/components/ui/dialog/dialog-close.svelte +11 -0
- package/dist/components/ui/dialog/dialog-close.svelte.d.ts +4 -0
- package/dist/components/ui/dialog/dialog-content.svelte +48 -0
- package/dist/components/ui/dialog/dialog-content.svelte.d.ts +13 -0
- package/dist/components/ui/dialog/dialog-description.svelte +17 -0
- package/dist/components/ui/dialog/dialog-description.svelte.d.ts +4 -0
- package/dist/components/ui/dialog/dialog-footer.svelte +32 -0
- package/dist/components/ui/dialog/dialog-footer.svelte.d.ts +8 -0
- package/dist/components/ui/dialog/dialog-header.svelte +20 -0
- package/dist/components/ui/dialog/dialog-header.svelte.d.ts +5 -0
- package/dist/components/ui/dialog/dialog-overlay.svelte +17 -0
- package/dist/components/ui/dialog/dialog-overlay.svelte.d.ts +4 -0
- package/dist/components/ui/dialog/dialog-portal.svelte +7 -0
- package/dist/components/ui/dialog/dialog-portal.svelte.d.ts +3 -0
- package/dist/components/ui/dialog/dialog-title.svelte +17 -0
- package/dist/components/ui/dialog/dialog-title.svelte.d.ts +4 -0
- package/dist/components/ui/dialog/dialog-trigger.svelte +11 -0
- package/dist/components/ui/dialog/dialog-trigger.svelte.d.ts +4 -0
- package/dist/components/ui/dialog/dialog.svelte +7 -0
- package/dist/components/ui/dialog/dialog.svelte.d.ts +3 -0
- package/dist/components/ui/dialog/index.d.ts +11 -0
- package/dist/components/ui/dialog/index.js +13 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte +43 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte.d.ts +9 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu-content.svelte +35 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu-content.svelte.d.ts +8 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu-item.svelte +36 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu-item.svelte.d.ts +9 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu-separator.svelte +10 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu-separator.svelte.d.ts +6 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu-trigger.svelte +27 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu-trigger.svelte.d.ts +11 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu.svelte +45 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu.svelte.d.ts +9 -0
- package/dist/components/ui/dropdown-menu/index.d.ts +7 -0
- package/dist/components/ui/dropdown-menu/index.js +7 -0
- package/dist/components/ui/input/index.d.ts +2 -0
- package/dist/components/ui/input/index.js +4 -0
- package/dist/components/ui/input/input.svelte +48 -0
- package/dist/components/ui/input/input.svelte.d.ts +13 -0
- package/dist/components/ui/label/index.d.ts +1 -0
- package/dist/components/ui/label/index.js +1 -0
- package/dist/components/ui/label/label.svelte +18 -0
- package/dist/components/ui/label/label.svelte.d.ts +5 -0
- package/dist/components/ui/pagination/index.d.ts +7 -0
- package/dist/components/ui/pagination/index.js +7 -0
- package/dist/components/ui/pagination/pagination-content.svelte +11 -0
- package/dist/components/ui/pagination/pagination-content.svelte.d.ts +8 -0
- package/dist/components/ui/pagination/pagination-ellipsis.svelte +12 -0
- package/dist/components/ui/pagination/pagination-ellipsis.svelte.d.ts +4 -0
- package/dist/components/ui/pagination/pagination-item.svelte +11 -0
- package/dist/components/ui/pagination/pagination-item.svelte.d.ts +8 -0
- package/dist/components/ui/pagination/pagination-link.svelte +26 -0
- package/dist/components/ui/pagination/pagination-link.svelte.d.ts +9 -0
- package/dist/components/ui/pagination/pagination-next.svelte +22 -0
- package/dist/components/ui/pagination/pagination-next.svelte.d.ts +8 -0
- package/dist/components/ui/pagination/pagination-previous.svelte +22 -0
- package/dist/components/ui/pagination/pagination-previous.svelte.d.ts +8 -0
- package/dist/components/ui/pagination/pagination.svelte +11 -0
- package/dist/components/ui/pagination/pagination.svelte.d.ts +8 -0
- package/dist/components/ui/popover/index.d.ts +6 -0
- package/dist/components/ui/popover/index.js +6 -0
- package/dist/components/ui/popover/popover-content.svelte +25 -0
- package/dist/components/ui/popover/popover-content.svelte.d.ts +7 -0
- package/dist/components/ui/progress/index.d.ts +1 -0
- package/dist/components/ui/progress/index.js +1 -0
- package/dist/components/ui/progress/progress.svelte +22 -0
- package/dist/components/ui/progress/progress.svelte.d.ts +8 -0
- package/dist/components/ui/scroll-area/index.d.ts +1 -0
- package/dist/components/ui/scroll-area/index.js +1 -0
- package/dist/components/ui/scroll-area/scroll-area.svelte +20 -0
- package/dist/components/ui/scroll-area/scroll-area.svelte.d.ts +9 -0
- package/dist/components/ui/select/index.d.ts +2 -0
- package/dist/components/ui/select/index.js +2 -0
- package/dist/components/ui/select/select.svelte +36 -0
- package/dist/components/ui/select/select.svelte.d.ts +8 -0
- package/dist/components/ui/separator/index.d.ts +2 -0
- package/dist/components/ui/separator/index.js +4 -0
- package/dist/components/ui/separator/separator.svelte +23 -0
- package/dist/components/ui/separator/separator.svelte.d.ts +4 -0
- package/dist/components/ui/sheet/index.d.ts +7 -0
- package/dist/components/ui/sheet/index.js +7 -0
- package/dist/components/ui/sheet/sheet-content.svelte +28 -0
- package/dist/components/ui/sheet/sheet-content.svelte.d.ts +8 -0
- package/dist/components/ui/sheet/sheet-description.svelte +22 -0
- package/dist/components/ui/sheet/sheet-description.svelte.d.ts +6 -0
- package/dist/components/ui/sheet/sheet-footer.svelte +22 -0
- package/dist/components/ui/sheet/sheet-footer.svelte.d.ts +6 -0
- package/dist/components/ui/sheet/sheet-header.svelte +22 -0
- package/dist/components/ui/sheet/sheet-header.svelte.d.ts +6 -0
- package/dist/components/ui/sheet/sheet-title.svelte +22 -0
- package/dist/components/ui/sheet/sheet-title.svelte.d.ts +6 -0
- package/dist/components/ui/sheet/sheet.svelte +78 -0
- package/dist/components/ui/sheet/sheet.svelte.d.ts +10 -0
- package/dist/components/ui/skeleton/index.d.ts +2 -0
- package/dist/components/ui/skeleton/index.js +2 -0
- package/dist/components/ui/skeleton/skeleton.svelte +21 -0
- package/dist/components/ui/skeleton/skeleton.svelte.d.ts +8 -0
- package/dist/components/ui/switch/index.d.ts +2 -0
- package/dist/components/ui/switch/index.js +2 -0
- package/dist/components/ui/switch/switch.svelte +49 -0
- package/dist/components/ui/switch/switch.svelte.d.ts +10 -0
- package/dist/components/ui/table/index.d.ts +9 -0
- package/dist/components/ui/table/index.js +11 -0
- package/dist/components/ui/table/table-body.svelte +15 -0
- package/dist/components/ui/table/table-body.svelte.d.ts +5 -0
- package/dist/components/ui/table/table-caption.svelte +20 -0
- package/dist/components/ui/table/table-caption.svelte.d.ts +5 -0
- package/dist/components/ui/table/table-cell.svelte +15 -0
- package/dist/components/ui/table/table-cell.svelte.d.ts +5 -0
- package/dist/components/ui/table/table-footer.svelte +20 -0
- package/dist/components/ui/table/table-footer.svelte.d.ts +5 -0
- package/dist/components/ui/table/table-head.svelte +15 -0
- package/dist/components/ui/table/table-head.svelte.d.ts +5 -0
- package/dist/components/ui/table/table-header.svelte +20 -0
- package/dist/components/ui/table/table-header.svelte.d.ts +5 -0
- package/dist/components/ui/table/table-row.svelte +15 -0
- package/dist/components/ui/table/table-row.svelte.d.ts +5 -0
- package/dist/components/ui/table/table.svelte +17 -0
- package/dist/components/ui/table/table.svelte.d.ts +5 -0
- package/dist/components/ui/tabs/index.d.ts +5 -0
- package/dist/components/ui/tabs/index.js +5 -0
- package/dist/components/ui/tabs/tabs-content.svelte +30 -0
- package/dist/components/ui/tabs/tabs-content.svelte.d.ts +9 -0
- package/dist/components/ui/tabs/tabs-list.svelte +26 -0
- package/dist/components/ui/tabs/tabs-list.svelte.d.ts +6 -0
- package/dist/components/ui/tabs/tabs-trigger.svelte +37 -0
- package/dist/components/ui/tabs/tabs-trigger.svelte.d.ts +9 -0
- package/dist/components/ui/tabs/tabs.svelte +27 -0
- package/dist/components/ui/tabs/tabs.svelte.d.ts +9 -0
- package/dist/components/ui/textarea/index.d.ts +2 -0
- package/dist/components/ui/textarea/index.js +2 -0
- package/dist/components/ui/textarea/textarea.svelte +24 -0
- package/dist/components/ui/textarea/textarea.svelte.d.ts +6 -0
- package/dist/components/ui/tooltip/index.d.ts +6 -0
- package/dist/components/ui/tooltip/index.js +8 -0
- package/dist/components/ui/tooltip/tooltip-content.svelte +52 -0
- package/dist/components/ui/tooltip/tooltip-content.svelte.d.ts +11 -0
- package/dist/components/ui/tooltip/tooltip-portal.svelte +7 -0
- package/dist/components/ui/tooltip/tooltip-portal.svelte.d.ts +4 -0
- package/dist/components/ui/tooltip/tooltip-provider.svelte +7 -0
- package/dist/components/ui/tooltip/tooltip-provider.svelte.d.ts +4 -0
- package/dist/components/ui/tooltip/tooltip-trigger.svelte +7 -0
- package/dist/components/ui/tooltip/tooltip-trigger.svelte.d.ts +4 -0
- package/dist/components/ui/tooltip/tooltip.svelte +10 -0
- package/dist/components/ui/tooltip/tooltip.svelte.d.ts +4 -0
- package/dist/editor-config.svelte.d.ts +15 -0
- package/dist/editor-config.svelte.js +19 -0
- package/dist/index.d.ts +117 -0
- package/dist/index.js +127 -0
- package/dist/markdown-deps.d.ts +21 -0
- package/dist/router-state.svelte.d.ts +5 -0
- package/dist/router-state.svelte.js +58 -0
- package/dist/types.d.ts +42 -0
- package/dist/types.js +1 -0
- package/dist/utils.d.ts +16 -0
- package/dist/utils.js +5 -0
- package/package.json +2 -2
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
interface DataPoint {
|
|
3
|
+
label: string;
|
|
4
|
+
value: number;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
interface Props {
|
|
8
|
+
data: DataPoint[];
|
|
9
|
+
height?: number;
|
|
10
|
+
color?: string;
|
|
11
|
+
/** Show dots at data points */
|
|
12
|
+
showDots?: boolean;
|
|
13
|
+
/** Fill area under the line */
|
|
14
|
+
fill?: boolean;
|
|
15
|
+
class?: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
let { data, height = 200, color = 'var(--primary)', showDots = true, fill = true, class: className = '' }: Props = $props();
|
|
19
|
+
|
|
20
|
+
const padding = { top: 20, right: 20, bottom: 30, left: 40 };
|
|
21
|
+
const chartWidth = $derived(Math.max(data.length * 60, 300));
|
|
22
|
+
const chartHeight = $derived(height - padding.top - padding.bottom);
|
|
23
|
+
|
|
24
|
+
const maxValue = $derived(Math.max(...data.map(d => d.value), 1));
|
|
25
|
+
const minValue = $derived(Math.min(...data.map(d => d.value), 0));
|
|
26
|
+
const range = $derived(maxValue - minValue || 1);
|
|
27
|
+
|
|
28
|
+
function getX(i: number): number {
|
|
29
|
+
if (data.length <= 1) return padding.left + chartWidth / 2;
|
|
30
|
+
return padding.left + (i / (data.length - 1)) * (chartWidth - padding.left - padding.right);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function getY(value: number): number {
|
|
34
|
+
return padding.top + chartHeight - ((value - minValue) / range) * chartHeight;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const linePath = $derived(
|
|
38
|
+
data.map((d, i) => `${i === 0 ? 'M' : 'L'} ${getX(i)} ${getY(d.value)}`).join(' ')
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
const areaPath = $derived(
|
|
42
|
+
linePath + ` L ${getX(data.length - 1)} ${padding.top + chartHeight} L ${getX(0)} ${padding.top + chartHeight} Z`
|
|
43
|
+
);
|
|
44
|
+
</script>
|
|
45
|
+
|
|
46
|
+
<div class="w-full overflow-x-auto {className}">
|
|
47
|
+
<svg viewBox="0 0 {chartWidth} {height}" class="w-full" style="min-width: {Math.min(chartWidth, 300)}px;">
|
|
48
|
+
<!-- Grid lines -->
|
|
49
|
+
{#each [0, 0.25, 0.5, 0.75, 1] as ratio}
|
|
50
|
+
{@const y = padding.top + chartHeight * (1 - ratio)}
|
|
51
|
+
<line
|
|
52
|
+
x1={padding.left}
|
|
53
|
+
y1={y}
|
|
54
|
+
x2={chartWidth - padding.right}
|
|
55
|
+
y2={y}
|
|
56
|
+
stroke="var(--border)"
|
|
57
|
+
stroke-width="1"
|
|
58
|
+
stroke-dasharray={ratio === 0 ? 'none' : '4 4'}
|
|
59
|
+
opacity="0.5"
|
|
60
|
+
/>
|
|
61
|
+
<text x={padding.left - 8} y={y + 4} text-anchor="end" fill="var(--muted-foreground)" font-size="10">
|
|
62
|
+
{Math.round(minValue + range * ratio)}
|
|
63
|
+
</text>
|
|
64
|
+
{/each}
|
|
65
|
+
|
|
66
|
+
<!-- Area fill -->
|
|
67
|
+
{#if fill && data.length > 1}
|
|
68
|
+
<path
|
|
69
|
+
d={areaPath}
|
|
70
|
+
fill={color}
|
|
71
|
+
opacity="0.08"
|
|
72
|
+
/>
|
|
73
|
+
{/if}
|
|
74
|
+
|
|
75
|
+
<!-- Line -->
|
|
76
|
+
{#if data.length > 1}
|
|
77
|
+
<path
|
|
78
|
+
d={linePath}
|
|
79
|
+
fill="none"
|
|
80
|
+
stroke={color}
|
|
81
|
+
stroke-width="2"
|
|
82
|
+
stroke-linecap="round"
|
|
83
|
+
stroke-linejoin="round"
|
|
84
|
+
>
|
|
85
|
+
<animate attributeName="stroke-dashoffset" from="2000" to="0" dur="1s" fill="freeze" />
|
|
86
|
+
</path>
|
|
87
|
+
{/if}
|
|
88
|
+
|
|
89
|
+
<!-- Dots -->
|
|
90
|
+
{#if showDots}
|
|
91
|
+
{#each data as point, i}
|
|
92
|
+
<circle
|
|
93
|
+
cx={getX(i)}
|
|
94
|
+
cy={getY(point.value)}
|
|
95
|
+
r="4"
|
|
96
|
+
fill="var(--background)"
|
|
97
|
+
stroke={color}
|
|
98
|
+
stroke-width="2"
|
|
99
|
+
class="transition-all duration-200 hover:r-[6]"
|
|
100
|
+
/>
|
|
101
|
+
{/each}
|
|
102
|
+
{/if}
|
|
103
|
+
|
|
104
|
+
<!-- X-axis labels -->
|
|
105
|
+
{#each data as point, i}
|
|
106
|
+
<text
|
|
107
|
+
x={getX(i)}
|
|
108
|
+
y={height - 4}
|
|
109
|
+
text-anchor="middle"
|
|
110
|
+
fill="var(--muted-foreground)"
|
|
111
|
+
font-size="10"
|
|
112
|
+
>{point.label}</text>
|
|
113
|
+
{/each}
|
|
114
|
+
</svg>
|
|
115
|
+
</div>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
interface DataPoint {
|
|
2
|
+
label: string;
|
|
3
|
+
value: number;
|
|
4
|
+
}
|
|
5
|
+
interface Props {
|
|
6
|
+
data: DataPoint[];
|
|
7
|
+
height?: number;
|
|
8
|
+
color?: string;
|
|
9
|
+
/** Show dots at data points */
|
|
10
|
+
showDots?: boolean;
|
|
11
|
+
/** Fill area under the line */
|
|
12
|
+
fill?: boolean;
|
|
13
|
+
class?: string;
|
|
14
|
+
}
|
|
15
|
+
declare const LineChart: import("svelte").Component<Props, {}, "">;
|
|
16
|
+
type LineChart = ReturnType<typeof LineChart>;
|
|
17
|
+
export default LineChart;
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
interface Slice {
|
|
3
|
+
label: string;
|
|
4
|
+
value: number;
|
|
5
|
+
color: string;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
interface Props {
|
|
9
|
+
data: Slice[];
|
|
10
|
+
size?: number;
|
|
11
|
+
/** Donut hole ratio (0 = pie, 0.6 = donut) */
|
|
12
|
+
donut?: number;
|
|
13
|
+
class?: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
let { data, size = 200, donut = 0.6, class: className = '' }: Props = $props();
|
|
17
|
+
|
|
18
|
+
const total = $derived(data.reduce((sum, d) => sum + d.value, 0) || 1);
|
|
19
|
+
const center = $derived(size / 2);
|
|
20
|
+
const radius = $derived(size / 2 - 8);
|
|
21
|
+
const innerRadius = $derived(radius * donut);
|
|
22
|
+
|
|
23
|
+
function getArcPath(startAngle: number, endAngle: number, outer: number, inner: number): string {
|
|
24
|
+
const startOuter = polarToCartesian(center, center, outer, endAngle);
|
|
25
|
+
const endOuter = polarToCartesian(center, center, outer, startAngle);
|
|
26
|
+
const startInner = polarToCartesian(center, center, inner, startAngle);
|
|
27
|
+
const endInner = polarToCartesian(center, center, inner, endAngle);
|
|
28
|
+
const largeArc = endAngle - startAngle > 180 ? 1 : 0;
|
|
29
|
+
|
|
30
|
+
return [
|
|
31
|
+
`M ${startOuter.x} ${startOuter.y}`,
|
|
32
|
+
`A ${outer} ${outer} 0 ${largeArc} 0 ${endOuter.x} ${endOuter.y}`,
|
|
33
|
+
inner > 0 ? `L ${startInner.x} ${startInner.y}` : `L ${center} ${center}`,
|
|
34
|
+
inner > 0 ? `A ${inner} ${inner} 0 ${largeArc} 1 ${endInner.x} ${endInner.y}` : '',
|
|
35
|
+
'Z',
|
|
36
|
+
].join(' ');
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function polarToCartesian(cx: number, cy: number, r: number, angleDeg: number) {
|
|
40
|
+
const rad = ((angleDeg - 90) * Math.PI) / 180;
|
|
41
|
+
return { x: cx + r * Math.cos(rad), y: cy + r * Math.sin(rad) };
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const slices = $derived.by(() => {
|
|
45
|
+
let currentAngle = 0;
|
|
46
|
+
return data.map(d => {
|
|
47
|
+
const angle = (d.value / total) * 360;
|
|
48
|
+
const slice = {
|
|
49
|
+
...d,
|
|
50
|
+
startAngle: currentAngle,
|
|
51
|
+
endAngle: currentAngle + angle,
|
|
52
|
+
percentage: ((d.value / total) * 100).toFixed(1),
|
|
53
|
+
};
|
|
54
|
+
currentAngle += angle;
|
|
55
|
+
return slice;
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
</script>
|
|
59
|
+
|
|
60
|
+
<div class="inline-flex flex-col items-center gap-3 {className}">
|
|
61
|
+
<svg viewBox="0 0 {size} {size}" width={size} height={size}>
|
|
62
|
+
{#each slices as slice, i}
|
|
63
|
+
<path
|
|
64
|
+
d={getArcPath(slice.startAngle, slice.endAngle, radius, innerRadius)}
|
|
65
|
+
fill={slice.color}
|
|
66
|
+
class="transition-all duration-200 hover:opacity-80"
|
|
67
|
+
stroke="var(--background)"
|
|
68
|
+
stroke-width="2"
|
|
69
|
+
>
|
|
70
|
+
<animate attributeName="opacity" from="0" to="1" dur="0.4s" begin="{i * 0.1}s" fill="freeze" />
|
|
71
|
+
</path>
|
|
72
|
+
{/each}
|
|
73
|
+
|
|
74
|
+
<!-- Center label (donut only) -->
|
|
75
|
+
{#if donut > 0}
|
|
76
|
+
<text x={center} y={center - 6} text-anchor="middle" fill="var(--foreground)" font-size="20" font-weight="600">
|
|
77
|
+
{total.toLocaleString()}
|
|
78
|
+
</text>
|
|
79
|
+
<text x={center} y={center + 12} text-anchor="middle" fill="var(--muted-foreground)" font-size="11">
|
|
80
|
+
Total
|
|
81
|
+
</text>
|
|
82
|
+
{/if}
|
|
83
|
+
</svg>
|
|
84
|
+
|
|
85
|
+
<!-- Legend -->
|
|
86
|
+
<div class="flex flex-wrap justify-center gap-x-4 gap-y-1">
|
|
87
|
+
{#each slices as slice}
|
|
88
|
+
<div class="flex items-center gap-1.5 text-xs">
|
|
89
|
+
<span class="h-2.5 w-2.5 rounded-full" style="background-color: {slice.color};"></span>
|
|
90
|
+
<span class="text-muted-foreground">{slice.label}</span>
|
|
91
|
+
<span class="font-medium text-foreground">{slice.percentage}%</span>
|
|
92
|
+
</div>
|
|
93
|
+
{/each}
|
|
94
|
+
</div>
|
|
95
|
+
</div>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
interface Slice {
|
|
2
|
+
label: string;
|
|
3
|
+
value: number;
|
|
4
|
+
color: string;
|
|
5
|
+
}
|
|
6
|
+
interface Props {
|
|
7
|
+
data: Slice[];
|
|
8
|
+
size?: number;
|
|
9
|
+
/** Donut hole ratio (0 = pie, 0.6 = donut) */
|
|
10
|
+
donut?: number;
|
|
11
|
+
class?: string;
|
|
12
|
+
}
|
|
13
|
+
declare const PieChart: import("svelte").Component<Props, {}, "">;
|
|
14
|
+
type PieChart = ReturnType<typeof PieChart>;
|
|
15
|
+
export default PieChart;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Component } from 'svelte';
|
|
2
|
+
export interface FieldComponentMap {
|
|
3
|
+
[fieldType: string]: Component<any>;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Built-in display components for show/detail pages.
|
|
7
|
+
* Keys match FieldDefinition.type values.
|
|
8
|
+
*/
|
|
9
|
+
export declare const builtinDisplayComponents: FieldComponentMap;
|
|
10
|
+
/**
|
|
11
|
+
* Register a custom field display component for a given field type.
|
|
12
|
+
* The component will be used by ShowPage and any other display contexts.
|
|
13
|
+
*/
|
|
14
|
+
export declare function registerDisplayComponent(fieldType: string, component: Component<any>): void;
|
|
15
|
+
/**
|
|
16
|
+
* Get the display component for a field type.
|
|
17
|
+
* Custom components take precedence over built-in ones.
|
|
18
|
+
* Returns undefined if no component is registered for the type.
|
|
19
|
+
*/
|
|
20
|
+
export declare function getDisplayComponent(fieldType: string): Component<any> | undefined;
|
|
21
|
+
/**
|
|
22
|
+
* Check if a field type has a display component (custom or built-in).
|
|
23
|
+
*/
|
|
24
|
+
export declare function hasDisplayComponent(fieldType: string): boolean;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
// Shared field type → display component mapping
|
|
2
|
+
// Used by both ShowPage and FieldRenderer to avoid duplicate if/else chains.
|
|
3
|
+
// Components are lazily resolved by field type at runtime.
|
|
4
|
+
// Default display component map (read-only field display)
|
|
5
|
+
// Dynamically imports components only when first used
|
|
6
|
+
const displayCache = new Map();
|
|
7
|
+
// Pre-import all field display components (tree-shaken by bundler)
|
|
8
|
+
import BooleanField from './fields/BooleanField.svelte';
|
|
9
|
+
import ImageField from './fields/ImageField.svelte';
|
|
10
|
+
import TagField from './fields/TagField.svelte';
|
|
11
|
+
import DateField from './fields/DateField.svelte';
|
|
12
|
+
import EmailField from './fields/EmailField.svelte';
|
|
13
|
+
import UrlField from './fields/UrlField.svelte';
|
|
14
|
+
import SelectField from './fields/SelectField.svelte';
|
|
15
|
+
import MultiSelectField from './fields/MultiSelectField.svelte';
|
|
16
|
+
import RelationField from './fields/RelationField.svelte';
|
|
17
|
+
import JsonField from './fields/JsonField.svelte';
|
|
18
|
+
import RichTextField from './fields/RichTextField.svelte';
|
|
19
|
+
import NumberField from './fields/NumberField.svelte';
|
|
20
|
+
import FileField from './fields/FileField.svelte';
|
|
21
|
+
/**
|
|
22
|
+
* Built-in display components for show/detail pages.
|
|
23
|
+
* Keys match FieldDefinition.type values.
|
|
24
|
+
*/
|
|
25
|
+
export const builtinDisplayComponents = {
|
|
26
|
+
boolean: BooleanField,
|
|
27
|
+
image: ImageField,
|
|
28
|
+
images: ImageField,
|
|
29
|
+
tags: TagField,
|
|
30
|
+
date: DateField,
|
|
31
|
+
email: EmailField,
|
|
32
|
+
url: UrlField,
|
|
33
|
+
select: SelectField,
|
|
34
|
+
multiselect: MultiSelectField,
|
|
35
|
+
relation: RelationField,
|
|
36
|
+
json: JsonField,
|
|
37
|
+
richtext: RichTextField,
|
|
38
|
+
textarea: RichTextField,
|
|
39
|
+
number: NumberField,
|
|
40
|
+
file: FileField,
|
|
41
|
+
};
|
|
42
|
+
// ─── Custom component registry ─────────────────────────────────
|
|
43
|
+
// Users can register custom field display components at runtime
|
|
44
|
+
const customDisplayComponents = new Map();
|
|
45
|
+
/**
|
|
46
|
+
* Register a custom field display component for a given field type.
|
|
47
|
+
* The component will be used by ShowPage and any other display contexts.
|
|
48
|
+
*/
|
|
49
|
+
export function registerDisplayComponent(fieldType, component) {
|
|
50
|
+
customDisplayComponents.set(fieldType, component);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Get the display component for a field type.
|
|
54
|
+
* Custom components take precedence over built-in ones.
|
|
55
|
+
* Returns undefined if no component is registered for the type.
|
|
56
|
+
*/
|
|
57
|
+
export function getDisplayComponent(fieldType) {
|
|
58
|
+
return customDisplayComponents.get(fieldType) ?? builtinDisplayComponents[fieldType];
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Check if a field type has a display component (custom or built-in).
|
|
62
|
+
*/
|
|
63
|
+
export function hasDisplayComponent(fieldType) {
|
|
64
|
+
return customDisplayComponents.has(fieldType) || fieldType in builtinDisplayComponents;
|
|
65
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { FieldDefinition } from '@svadmin/core';
|
|
3
|
+
import { t } from '@svadmin/core/i18n';
|
|
4
|
+
import { Button } from '../ui/button/index.js';
|
|
5
|
+
import { Plus, Trash2 } from '@lucide/svelte';
|
|
6
|
+
import TooltipButton from '../TooltipButton.svelte';
|
|
7
|
+
import FieldRenderer from '../FieldRenderer.svelte';
|
|
8
|
+
|
|
9
|
+
let { field, value, onchange } = $props<{
|
|
10
|
+
field: FieldDefinition;
|
|
11
|
+
value: unknown;
|
|
12
|
+
onchange: (val: unknown) => void;
|
|
13
|
+
}>();
|
|
14
|
+
|
|
15
|
+
const arrayVal = $derived(Array.isArray(value) ? value : []);
|
|
16
|
+
const subFields = $derived(field.subFields || []);
|
|
17
|
+
|
|
18
|
+
function getDefaultForType(type: string): unknown {
|
|
19
|
+
switch (type) {
|
|
20
|
+
case 'text': case 'textarea': case 'richtext': case 'image': return '';
|
|
21
|
+
case 'number': return 0;
|
|
22
|
+
case 'boolean': return false;
|
|
23
|
+
case 'tags': case 'images': case 'multiselect': case 'array': return [];
|
|
24
|
+
case 'json': return {};
|
|
25
|
+
default: return '';
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function handleAdd() {
|
|
30
|
+
const newItem: Record<string, unknown> = {};
|
|
31
|
+
for (const f of subFields) {
|
|
32
|
+
newItem[f.key] = f.defaultValue ?? getDefaultForType(f.type);
|
|
33
|
+
}
|
|
34
|
+
onchange([...arrayVal, newItem]);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function handleRemove(index: number) {
|
|
38
|
+
onchange(arrayVal.filter((_, i) => i !== index));
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function handleChange(index: number, key: string, val: unknown) {
|
|
42
|
+
const next = [...arrayVal];
|
|
43
|
+
next[index] = { ...next[index], [key]: val };
|
|
44
|
+
onchange(next);
|
|
45
|
+
}
|
|
46
|
+
</script>
|
|
47
|
+
|
|
48
|
+
<div class="space-y-4 rounded-lg border border-dashed p-4">
|
|
49
|
+
<div class="flex items-center justify-between">
|
|
50
|
+
<div class="text-sm font-medium text-foreground">
|
|
51
|
+
{field.label}
|
|
52
|
+
{#if field.required}
|
|
53
|
+
<span class="text-destructive">*</span>
|
|
54
|
+
{/if}
|
|
55
|
+
</div>
|
|
56
|
+
<Button variant="outline" size="sm" type="button" onclick={handleAdd}>
|
|
57
|
+
<Plus class="h-3.5 w-3.5 mr-1" /> {t('common.add') || 'Add'}
|
|
58
|
+
</Button>
|
|
59
|
+
</div>
|
|
60
|
+
|
|
61
|
+
<div class="space-y-4 pt-2">
|
|
62
|
+
{#each arrayVal as item, i}
|
|
63
|
+
<div class="relative rounded-md border bg-card p-4 pt-6 shadow-sm">
|
|
64
|
+
<div class="absolute right-2 top-2">
|
|
65
|
+
<TooltipButton tooltip={t('common.remove') || 'Remove'} variant="ghost" size="icon" class="h-8 w-8 text-muted-foreground hover:text-destructive transition-colors" onclick={() => handleRemove(i)}>
|
|
66
|
+
<Trash2 class="h-4 w-4" />
|
|
67
|
+
</TooltipButton>
|
|
68
|
+
</div>
|
|
69
|
+
<div class="grid gap-5">
|
|
70
|
+
{#each subFields as subField (subField.key)}
|
|
71
|
+
<FieldRenderer
|
|
72
|
+
field={subField}
|
|
73
|
+
value={item[subField.key]}
|
|
74
|
+
onchange={(val) => handleChange(i, subField.key, val)}
|
|
75
|
+
/>
|
|
76
|
+
{/each}
|
|
77
|
+
</div>
|
|
78
|
+
</div>
|
|
79
|
+
{/each}
|
|
80
|
+
{#if arrayVal.length === 0}
|
|
81
|
+
<div class="flex flex-col items-center justify-center py-6 text-sm text-muted-foreground bg-muted/10 rounded-md">
|
|
82
|
+
<span>{t('common.noData') || 'No items added yet.'}</span>
|
|
83
|
+
</div>
|
|
84
|
+
{/if}
|
|
85
|
+
</div>
|
|
86
|
+
</div>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { FieldDefinition } from '@svadmin/core';
|
|
2
|
+
type $$ComponentProps = {
|
|
3
|
+
field: FieldDefinition;
|
|
4
|
+
value: unknown;
|
|
5
|
+
onchange: (val: unknown) => void;
|
|
6
|
+
};
|
|
7
|
+
declare const ArrayField: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
8
|
+
type ArrayField = ReturnType<typeof ArrayField>;
|
|
9
|
+
export default ArrayField;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
interface Props { value: boolean | null | undefined; trueIcon?: string; falseIcon?: string }
|
|
3
|
+
let { value, trueIcon = '✓', falseIcon = '✗' }: Props = $props();
|
|
4
|
+
</script>
|
|
5
|
+
{#if value}
|
|
6
|
+
<span class="inline-flex items-center justify-center w-6 h-6 rounded-full text-sm bg-success/10 text-success">
|
|
7
|
+
{trueIcon}
|
|
8
|
+
</span>
|
|
9
|
+
{:else}
|
|
10
|
+
<span class="inline-flex items-center justify-center w-6 h-6 rounded-full text-sm bg-destructive/10 text-destructive">
|
|
11
|
+
{falseIcon}
|
|
12
|
+
</span>
|
|
13
|
+
{/if}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
interface Props { value: string | number | Date | null | undefined; locale?: string; options?: Intl.DateTimeFormatOptions }
|
|
3
|
+
let { value, locale = 'en-US', options = { dateStyle: 'medium' } }: Props = $props();
|
|
4
|
+
const formatted = $derived(value != null ? new Intl.DateTimeFormat(locale, options).format(new Date(value as string | number | Date)) : '—');
|
|
5
|
+
</script>
|
|
6
|
+
<span class="field-date">{formatted}</span>
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
value: string | number | Date | null | undefined;
|
|
3
|
+
locale?: string;
|
|
4
|
+
options?: Intl.DateTimeFormatOptions;
|
|
5
|
+
}
|
|
6
|
+
declare const DateField: import("svelte").Component<Props, {}, "">;
|
|
7
|
+
type DateField = ReturnType<typeof DateField>;
|
|
8
|
+
export default DateField;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
interface Props { value: string | null | undefined }
|
|
3
|
+
let { value }: Props = $props();
|
|
4
|
+
</script>
|
|
5
|
+
{#if value}
|
|
6
|
+
<a href="mailto:{value}" class="text-primary hover:underline no-underline">{value}</a>
|
|
7
|
+
{:else}
|
|
8
|
+
<span class="text-muted-foreground">—</span>
|
|
9
|
+
{/if}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { Download } from '@lucide/svelte';
|
|
3
|
+
interface Props { value: string | null | undefined; title?: string }
|
|
4
|
+
let { value, title }: Props = $props();
|
|
5
|
+
const fileName = $derived(value ? value.split('/').pop() ?? value : null);
|
|
6
|
+
</script>
|
|
7
|
+
{#if value}
|
|
8
|
+
<a href={value} download class="text-primary hover:underline no-underline inline-flex items-center gap-1" title={title ?? fileName ?? ''}>
|
|
9
|
+
<Download class="h-3.5 w-3.5 opacity-60" />
|
|
10
|
+
{fileName}
|
|
11
|
+
</a>
|
|
12
|
+
{:else}
|
|
13
|
+
<span class="text-muted-foreground">—</span>
|
|
14
|
+
{/if}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
interface Props { value: string | null | undefined; alt?: string; width?: number; height?: number }
|
|
3
|
+
let { value, alt = '', width = 80, height = 80 }: Props = $props();
|
|
4
|
+
</script>
|
|
5
|
+
{#if value}
|
|
6
|
+
<img src={value} {alt} {width} {height} class="rounded-lg object-cover border border-border" />
|
|
7
|
+
{:else}
|
|
8
|
+
<span class="inline-flex items-center justify-center w-20 h-20 bg-muted rounded-lg text-muted-foreground">—</span>
|
|
9
|
+
{/if}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { t } from '@svadmin/core/i18n';
|
|
3
|
+
import { Button } from '../ui/button/index.js';
|
|
4
|
+
import { Copy, Check, ChevronDown, ChevronRight } from '@lucide/svelte';
|
|
5
|
+
|
|
6
|
+
let { value } = $props<{
|
|
7
|
+
value: unknown;
|
|
8
|
+
}>();
|
|
9
|
+
|
|
10
|
+
let expanded = $state(false);
|
|
11
|
+
let copied = $state(false);
|
|
12
|
+
let copyTimer: ReturnType<typeof setTimeout> | undefined;
|
|
13
|
+
|
|
14
|
+
$effect(() => {
|
|
15
|
+
return () => { if (copyTimer) clearTimeout(copyTimer); };
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
const formatted = $derived(
|
|
19
|
+
value != null ? JSON.stringify(value, null, 2) : '—'
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
const preview = $derived(
|
|
23
|
+
value != null ? JSON.stringify(value).slice(0, 80) + (JSON.stringify(value).length > 80 ? '...' : '') : '—'
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
function copyJson() {
|
|
27
|
+
navigator.clipboard.writeText(formatted);
|
|
28
|
+
copied = true;
|
|
29
|
+
if (copyTimer) clearTimeout(copyTimer);
|
|
30
|
+
copyTimer = setTimeout(() => { copied = false; }, 2000);
|
|
31
|
+
}
|
|
32
|
+
</script>
|
|
33
|
+
|
|
34
|
+
{#if value == null}
|
|
35
|
+
<span class="text-muted-foreground">—</span>
|
|
36
|
+
{:else}
|
|
37
|
+
<div class="space-y-1">
|
|
38
|
+
<div class="flex items-center gap-2">
|
|
39
|
+
<Button
|
|
40
|
+
variant="ghost"
|
|
41
|
+
size="sm"
|
|
42
|
+
class="flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground h-auto py-0.5 px-1"
|
|
43
|
+
onclick={() => { expanded = !expanded; }}
|
|
44
|
+
>
|
|
45
|
+
{#if expanded}
|
|
46
|
+
<ChevronDown class="h-3 w-3" />
|
|
47
|
+
{:else}
|
|
48
|
+
<ChevronRight class="h-3 w-3" />
|
|
49
|
+
{/if}
|
|
50
|
+
{expanded ? t('common.collapse') : t('common.expand')}
|
|
51
|
+
</Button>
|
|
52
|
+
<Button
|
|
53
|
+
variant="ghost"
|
|
54
|
+
size="sm"
|
|
55
|
+
class="flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground h-auto py-0.5 px-1"
|
|
56
|
+
onclick={copyJson}
|
|
57
|
+
aria-label={t('common.copy')}
|
|
58
|
+
>
|
|
59
|
+
{#if copied}
|
|
60
|
+
<Check class="h-3 w-3 text-emerald-500" />
|
|
61
|
+
{:else}
|
|
62
|
+
<Copy class="h-3 w-3" />
|
|
63
|
+
{/if}
|
|
64
|
+
</Button>
|
|
65
|
+
</div>
|
|
66
|
+
{#if expanded}
|
|
67
|
+
<pre class="rounded-lg bg-muted p-3 text-xs overflow-auto max-h-64 font-mono">{formatted}</pre>
|
|
68
|
+
{:else}
|
|
69
|
+
<code class="text-xs font-mono bg-muted px-1.5 py-0.5 rounded">{preview}</code>
|
|
70
|
+
{/if}
|
|
71
|
+
</div>
|
|
72
|
+
{/if}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
interface Props { value: string | null | undefined }
|
|
3
|
+
let { value }: Props = $props();
|
|
4
|
+
</script>
|
|
5
|
+
{#if value}
|
|
6
|
+
<div class="prose prose-sm dark:prose-invert max-w-none leading-relaxed [&_code]:bg-muted [&_code]:px-1.5 [&_code]:py-0.5 [&_code]:rounded [&_code]:text-[0.875em] [&_pre]:bg-muted [&_pre]:p-3 [&_pre]:rounded-lg [&_pre]:overflow-x-auto [&_a]:text-primary">{@html value}</div>
|
|
7
|
+
{:else}
|
|
8
|
+
<span class="text-muted-foreground">—</span>
|
|
9
|
+
{/if}
|