@airdraft/react-ui 0.1.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/CHANGELOG.md +5 -0
- package/dist/AcceptInviteForm.d.ts +22 -0
- package/dist/AcceptInviteForm.d.ts.map +1 -0
- package/dist/AcceptInviteForm.js +52 -0
- package/dist/AcceptInviteForm.js.map +1 -0
- package/dist/AuditLogViewer.d.ts +42 -0
- package/dist/AuditLogViewer.d.ts.map +1 -0
- package/dist/AuditLogViewer.js +95 -0
- package/dist/AuditLogViewer.js.map +1 -0
- package/dist/CollectionManager.d.ts +26 -0
- package/dist/CollectionManager.d.ts.map +1 -0
- package/dist/CollectionManager.js +100 -0
- package/dist/CollectionManager.js.map +1 -0
- package/dist/CollectionsIndex.d.ts +25 -0
- package/dist/CollectionsIndex.d.ts.map +1 -0
- package/dist/CollectionsIndex.js +42 -0
- package/dist/CollectionsIndex.js.map +1 -0
- package/dist/ContentManager.d.ts +26 -0
- package/dist/ContentManager.d.ts.map +1 -0
- package/dist/ContentManager.js +110 -0
- package/dist/ContentManager.js.map +1 -0
- package/dist/EntryEditor.d.ts +25 -0
- package/dist/EntryEditor.d.ts.map +1 -0
- package/dist/EntryEditor.js +190 -0
- package/dist/EntryEditor.js.map +1 -0
- package/dist/LoginForm.d.ts +18 -0
- package/dist/LoginForm.d.ts.map +1 -0
- package/dist/LoginForm.js +41 -0
- package/dist/LoginForm.js.map +1 -0
- package/dist/MediaManager.d.ts +21 -0
- package/dist/MediaManager.d.ts.map +1 -0
- package/dist/MediaManager.js +59 -0
- package/dist/MediaManager.js.map +1 -0
- package/dist/SchemaEditor.d.ts +22 -0
- package/dist/SchemaEditor.d.ts.map +1 -0
- package/dist/SchemaEditor.js +35 -0
- package/dist/SchemaEditor.js.map +1 -0
- package/dist/SchemaEditorContent.d.ts +4 -0
- package/dist/SchemaEditorContent.d.ts.map +1 -0
- package/dist/SchemaEditorContent.js +82 -0
- package/dist/SchemaEditorContent.js.map +1 -0
- package/dist/SchemaEditorFieldDrawer.d.ts +2 -0
- package/dist/SchemaEditorFieldDrawer.d.ts.map +1 -0
- package/dist/SchemaEditorFieldDrawer.js +126 -0
- package/dist/SchemaEditorFieldDrawer.js.map +1 -0
- package/dist/SchemaEditorRoot.d.ts +59 -0
- package/dist/SchemaEditorRoot.d.ts.map +1 -0
- package/dist/SchemaEditorRoot.js +71 -0
- package/dist/SchemaEditorRoot.js.map +1 -0
- package/dist/SchemaEditorSidebar.d.ts +4 -0
- package/dist/SchemaEditorSidebar.d.ts.map +1 -0
- package/dist/SchemaEditorSidebar.js +67 -0
- package/dist/SchemaEditorSidebar.js.map +1 -0
- package/dist/TeamManager.d.ts +18 -0
- package/dist/TeamManager.d.ts.map +1 -0
- package/dist/TeamManager.js +90 -0
- package/dist/TeamManager.js.map +1 -0
- package/dist/components/CmsAdminHeader.d.ts +11 -0
- package/dist/components/CmsAdminHeader.d.ts.map +1 -0
- package/dist/components/CmsAdminHeader.js +119 -0
- package/dist/components/CmsAdminHeader.js.map +1 -0
- package/dist/components/ConfirmDialog.d.ts +19 -0
- package/dist/components/ConfirmDialog.d.ts.map +1 -0
- package/dist/components/ConfirmDialog.js +12 -0
- package/dist/components/ConfirmDialog.js.map +1 -0
- package/dist/components/EmptyState.d.ts +9 -0
- package/dist/components/EmptyState.d.ts.map +1 -0
- package/dist/components/EmptyState.js +7 -0
- package/dist/components/EmptyState.js.map +1 -0
- package/dist/components/EntryRow.d.ts +12 -0
- package/dist/components/EntryRow.d.ts.map +1 -0
- package/dist/components/EntryRow.js +20 -0
- package/dist/components/EntryRow.js.map +1 -0
- package/dist/components/ErrorAlert.d.ts +32 -0
- package/dist/components/ErrorAlert.d.ts.map +1 -0
- package/dist/components/ErrorAlert.js +40 -0
- package/dist/components/ErrorAlert.js.map +1 -0
- package/dist/components/InviteRow.d.ts +18 -0
- package/dist/components/InviteRow.d.ts.map +1 -0
- package/dist/components/InviteRow.js +28 -0
- package/dist/components/InviteRow.js.map +1 -0
- package/dist/components/MediaCard.d.ts +10 -0
- package/dist/components/MediaCard.d.ts.map +1 -0
- package/dist/components/MediaCard.js +29 -0
- package/dist/components/MediaCard.js.map +1 -0
- package/dist/components/MemberRow.d.ts +19 -0
- package/dist/components/MemberRow.d.ts.map +1 -0
- package/dist/components/MemberRow.js +19 -0
- package/dist/components/MemberRow.js.map +1 -0
- package/dist/components/PageHeader.d.ts +8 -0
- package/dist/components/PageHeader.d.ts.map +1 -0
- package/dist/components/PageHeader.js +7 -0
- package/dist/components/PageHeader.js.map +1 -0
- package/dist/components/RoleBadge.d.ts +7 -0
- package/dist/components/RoleBadge.d.ts.map +1 -0
- package/dist/components/RoleBadge.js +12 -0
- package/dist/components/RoleBadge.js.map +1 -0
- package/dist/components/StatusBadge.d.ts +8 -0
- package/dist/components/StatusBadge.d.ts.map +1 -0
- package/dist/components/StatusBadge.js +16 -0
- package/dist/components/StatusBadge.js.map +1 -0
- package/dist/components/TagInput.d.ts +12 -0
- package/dist/components/TagInput.d.ts.map +1 -0
- package/dist/components/TagInput.js +76 -0
- package/dist/components/TagInput.js.map +1 -0
- package/dist/components/UploadZone.d.ts +9 -0
- package/dist/components/UploadZone.d.ts.map +1 -0
- package/dist/components/UploadZone.js +21 -0
- package/dist/components/UploadZone.js.map +1 -0
- package/dist/components/index.d.ts +27 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +15 -0
- package/dist/components/index.js.map +1 -0
- package/dist/hooks/use-mobile.d.ts +2 -0
- package/dist/hooks/use-mobile.d.ts.map +1 -0
- package/dist/hooks/use-mobile.js +16 -0
- package/dist/hooks/use-mobile.js.map +1 -0
- package/dist/hooks/useMediaQuery.d.ts +2 -0
- package/dist/hooks/useMediaQuery.d.ts.map +1 -0
- package/dist/hooks/useMediaQuery.js +16 -0
- package/dist/hooks/useMediaQuery.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/utils.d.ts +3 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +6 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/ui/accordion.d.ts +8 -0
- package/dist/ui/accordion.d.ts.map +1 -0
- package/dist/ui/accordion.js +19 -0
- package/dist/ui/accordion.js.map +1 -0
- package/dist/ui/aevr/aevr/activity-item.d.ts +107 -0
- package/dist/ui/aevr/aevr/activity-item.d.ts.map +1 -0
- package/dist/ui/aevr/aevr/activity-item.js +154 -0
- package/dist/ui/aevr/aevr/activity-item.js.map +1 -0
- package/dist/ui/aevr/aevr/blurred-background.d.ts +10 -0
- package/dist/ui/aevr/aevr/blurred-background.d.ts.map +1 -0
- package/dist/ui/aevr/aevr/blurred-background.js +31 -0
- package/dist/ui/aevr/aevr/blurred-background.js.map +1 -0
- package/dist/ui/aevr/aevr/button.d.ts +11 -0
- package/dist/ui/aevr/aevr/button.d.ts.map +1 -0
- package/dist/ui/aevr/aevr/button.js +37 -0
- package/dist/ui/aevr/aevr/button.js.map +1 -0
- package/dist/ui/aevr/aevr/country-dropdown.d.ts +25 -0
- package/dist/ui/aevr/aevr/country-dropdown.d.ts.map +1 -0
- package/dist/ui/aevr/aevr/country-dropdown.js +38 -0
- package/dist/ui/aevr/aevr/country-dropdown.js.map +1 -0
- package/dist/ui/aevr/aevr/currency-amount-input.d.ts +19 -0
- package/dist/ui/aevr/aevr/currency-amount-input.d.ts.map +1 -0
- package/dist/ui/aevr/aevr/currency-amount-input.js +89 -0
- package/dist/ui/aevr/aevr/currency-amount-input.js.map +1 -0
- package/dist/ui/aevr/aevr/currency-select.d.ts +16 -0
- package/dist/ui/aevr/aevr/currency-select.d.ts.map +1 -0
- package/dist/ui/aevr/aevr/currency-select.js +38 -0
- package/dist/ui/aevr/aevr/currency-select.js.map +1 -0
- package/dist/ui/aevr/aevr/file-upload.d.ts +70 -0
- package/dist/ui/aevr/aevr/file-upload.d.ts.map +1 -0
- package/dist/ui/aevr/aevr/file-upload.js +388 -0
- package/dist/ui/aevr/aevr/file-upload.js.map +1 -0
- package/dist/ui/aevr/aevr/info-box.d.ts +32 -0
- package/dist/ui/aevr/aevr/info-box.d.ts.map +1 -0
- package/dist/ui/aevr/aevr/info-box.js +248 -0
- package/dist/ui/aevr/aevr/info-box.js.map +1 -0
- package/dist/ui/aevr/aevr/loader.d.ts +6 -0
- package/dist/ui/aevr/aevr/loader.d.ts.map +1 -0
- package/dist/ui/aevr/aevr/loader.js +14 -0
- package/dist/ui/aevr/aevr/loader.js.map +1 -0
- package/dist/ui/aevr/aevr/mini-wallet-card.d.ts +29 -0
- package/dist/ui/aevr/aevr/mini-wallet-card.d.ts.map +1 -0
- package/dist/ui/aevr/aevr/mini-wallet-card.js +31 -0
- package/dist/ui/aevr/aevr/mini-wallet-card.js.map +1 -0
- package/dist/ui/aevr/aevr/multistep.d.ts +40 -0
- package/dist/ui/aevr/aevr/multistep.d.ts.map +1 -0
- package/dist/ui/aevr/aevr/multistep.js +95 -0
- package/dist/ui/aevr/aevr/multistep.js.map +1 -0
- package/dist/ui/aevr/aevr/nav-user.d.ts +35 -0
- package/dist/ui/aevr/aevr/nav-user.d.ts.map +1 -0
- package/dist/ui/aevr/aevr/nav-user.js +47 -0
- package/dist/ui/aevr/aevr/nav-user.js.map +1 -0
- package/dist/ui/aevr/aevr/page-header.d.ts +46 -0
- package/dist/ui/aevr/aevr/page-header.d.ts.map +1 -0
- package/dist/ui/aevr/aevr/page-header.js +68 -0
- package/dist/ui/aevr/aevr/page-header.js.map +1 -0
- package/dist/ui/aevr/aevr/phone-input.d.ts +8 -0
- package/dist/ui/aevr/aevr/phone-input.d.ts.map +1 -0
- package/dist/ui/aevr/aevr/phone-input.js +60 -0
- package/dist/ui/aevr/aevr/phone-input.js.map +1 -0
- package/dist/ui/aevr/aevr/progress.d.ts +38 -0
- package/dist/ui/aevr/aevr/progress.d.ts.map +1 -0
- package/dist/ui/aevr/aevr/progress.js +65 -0
- package/dist/ui/aevr/aevr/progress.js.map +1 -0
- package/dist/ui/aevr/aevr/responsive-breadcrumb.d.ts +14 -0
- package/dist/ui/aevr/aevr/responsive-breadcrumb.d.ts.map +1 -0
- package/dist/ui/aevr/aevr/responsive-breadcrumb.js +17 -0
- package/dist/ui/aevr/aevr/responsive-breadcrumb.js.map +1 -0
- package/dist/ui/aevr/aevr/responsive-dialog.d.ts +16 -0
- package/dist/ui/aevr/aevr/responsive-dialog.d.ts.map +1 -0
- package/dist/ui/aevr/aevr/responsive-dialog.js +29 -0
- package/dist/ui/aevr/aevr/responsive-dialog.js.map +1 -0
- package/dist/ui/aevr/aevr/search-command.d.ts +31 -0
- package/dist/ui/aevr/aevr/search-command.d.ts.map +1 -0
- package/dist/ui/aevr/aevr/search-command.js +129 -0
- package/dist/ui/aevr/aevr/search-command.js.map +1 -0
- package/dist/ui/aevr/aevr/settings-card.d.ts +15 -0
- package/dist/ui/aevr/aevr/settings-card.d.ts.map +1 -0
- package/dist/ui/aevr/aevr/settings-card.js +29 -0
- package/dist/ui/aevr/aevr/settings-card.js.map +1 -0
- package/dist/ui/aevr/aevr/settings-header.d.ts +8 -0
- package/dist/ui/aevr/aevr/settings-header.d.ts.map +1 -0
- package/dist/ui/aevr/aevr/settings-header.js +9 -0
- package/dist/ui/aevr/aevr/settings-header.js.map +1 -0
- package/dist/ui/aevr/aevr/stat-card.d.ts +55 -0
- package/dist/ui/aevr/aevr/stat-card.d.ts.map +1 -0
- package/dist/ui/aevr/aevr/stat-card.js +86 -0
- package/dist/ui/aevr/aevr/stat-card.js.map +1 -0
- package/dist/ui/aevr/aevr/summary-card.d.ts +20 -0
- package/dist/ui/aevr/aevr/summary-card.d.ts.map +1 -0
- package/dist/ui/aevr/aevr/summary-card.js +29 -0
- package/dist/ui/aevr/aevr/summary-card.js.map +1 -0
- package/dist/ui/aevr/aevr/tag.d.ts +15 -0
- package/dist/ui/aevr/aevr/tag.d.ts.map +1 -0
- package/dist/ui/aevr/aevr/tag.js +42 -0
- package/dist/ui/aevr/aevr/tag.js.map +1 -0
- package/dist/ui/aevr/aevr/theme-toggle.d.ts +2 -0
- package/dist/ui/aevr/aevr/theme-toggle.d.ts.map +1 -0
- package/dist/ui/aevr/aevr/theme-toggle.js +20 -0
- package/dist/ui/aevr/aevr/theme-toggle.js.map +1 -0
- package/dist/ui/aevr/aevr/transaction-pin-confirm.d.ts +21 -0
- package/dist/ui/aevr/aevr/transaction-pin-confirm.d.ts.map +1 -0
- package/dist/ui/aevr/aevr/transaction-pin-confirm.js +65 -0
- package/dist/ui/aevr/aevr/transaction-pin-confirm.js.map +1 -0
- package/dist/ui/aevr/aevr/wallet-activity-item.d.ts +36 -0
- package/dist/ui/aevr/aevr/wallet-activity-item.d.ts.map +1 -0
- package/dist/ui/aevr/aevr/wallet-activity-item.js +288 -0
- package/dist/ui/aevr/aevr/wallet-activity-item.js.map +1 -0
- package/dist/ui/aevr/aevr/wallet-topup-form.d.ts +26 -0
- package/dist/ui/aevr/aevr/wallet-topup-form.d.ts.map +1 -0
- package/dist/ui/aevr/aevr/wallet-topup-form.js +13 -0
- package/dist/ui/aevr/aevr/wallet-topup-form.js.map +1 -0
- package/dist/ui/aevr/blurred-background.d.ts +10 -0
- package/dist/ui/aevr/blurred-background.d.ts.map +1 -0
- package/dist/ui/aevr/blurred-background.js +31 -0
- package/dist/ui/aevr/blurred-background.js.map +1 -0
- package/dist/ui/aevr/loader.d.ts +7 -0
- package/dist/ui/aevr/loader.d.ts.map +1 -0
- package/dist/ui/aevr/loader.js +15 -0
- package/dist/ui/aevr/loader.js.map +1 -0
- package/dist/ui/aevr/nav-user.d.ts +35 -0
- package/dist/ui/aevr/nav-user.d.ts.map +1 -0
- package/dist/ui/aevr/nav-user.js +38 -0
- package/dist/ui/aevr/nav-user.js.map +1 -0
- package/dist/ui/aevr/page-header.d.ts +46 -0
- package/dist/ui/aevr/page-header.d.ts.map +1 -0
- package/dist/ui/aevr/page-header.js +72 -0
- package/dist/ui/aevr/page-header.js.map +1 -0
- package/dist/ui/aevr/progress.d.ts +38 -0
- package/dist/ui/aevr/progress.d.ts.map +1 -0
- package/dist/ui/aevr/progress.js +65 -0
- package/dist/ui/aevr/progress.js.map +1 -0
- package/dist/ui/aevr/responsive-breadcrumb.d.ts +14 -0
- package/dist/ui/aevr/responsive-breadcrumb.d.ts.map +1 -0
- package/dist/ui/aevr/responsive-breadcrumb.js +17 -0
- package/dist/ui/aevr/responsive-breadcrumb.js.map +1 -0
- package/dist/ui/aevr/search-command.d.ts +31 -0
- package/dist/ui/aevr/search-command.d.ts.map +1 -0
- package/dist/ui/aevr/search-command.js +129 -0
- package/dist/ui/aevr/search-command.js.map +1 -0
- package/dist/ui/aevr/theme-toggle.d.ts +2 -0
- package/dist/ui/aevr/theme-toggle.d.ts.map +1 -0
- package/dist/ui/aevr/theme-toggle.js +20 -0
- package/dist/ui/aevr/theme-toggle.js.map +1 -0
- package/dist/ui/alert-dialog.d.ts +19 -0
- package/dist/ui/alert-dialog.d.ts.map +1 -0
- package/dist/ui/alert-dialog.js +42 -0
- package/dist/ui/alert-dialog.js.map +1 -0
- package/dist/ui/alert.d.ts +11 -0
- package/dist/ui/alert.d.ts.map +1 -0
- package/dist/ui/alert.js +28 -0
- package/dist/ui/alert.js.map +1 -0
- package/dist/ui/avatar.d.ts +12 -0
- package/dist/ui/avatar.d.ts.map +1 -0
- package/dist/ui/avatar.js +24 -0
- package/dist/ui/avatar.js.map +1 -0
- package/dist/ui/badge.d.ts +10 -0
- package/dist/ui/badge.d.ts.map +1 -0
- package/dist/ui/badge.js +25 -0
- package/dist/ui/badge.js.map +1 -0
- package/dist/ui/breadcrumb.d.ts +12 -0
- package/dist/ui/breadcrumb.d.ts.map +1 -0
- package/dist/ui/breadcrumb.js +28 -0
- package/dist/ui/breadcrumb.js.map +1 -0
- package/dist/ui/button.d.ts +11 -0
- package/dist/ui/button.d.ts.map +1 -0
- package/dist/ui/button.js +36 -0
- package/dist/ui/button.js.map +1 -0
- package/dist/ui/checkbox.d.ts +5 -0
- package/dist/ui/checkbox.d.ts.map +1 -0
- package/dist/ui/checkbox.js +9 -0
- package/dist/ui/checkbox.js.map +1 -0
- package/dist/ui/command.d.ts +19 -0
- package/dist/ui/command.d.ts.map +1 -0
- package/dist/ui/command.js +35 -0
- package/dist/ui/command.js.map +1 -0
- package/dist/ui/dialog.d.ts +18 -0
- package/dist/ui/dialog.d.ts.map +1 -0
- package/dist/ui/dialog.js +37 -0
- package/dist/ui/dialog.js.map +1 -0
- package/dist/ui/drawer.d.ts +14 -0
- package/dist/ui/drawer.d.ts.map +1 -0
- package/dist/ui/drawer.js +35 -0
- package/dist/ui/drawer.js.map +1 -0
- package/dist/ui/dropdown-menu.d.ts +30 -0
- package/dist/ui/dropdown-menu.d.ts.map +1 -0
- package/dist/ui/dropdown-menu.js +52 -0
- package/dist/ui/dropdown-menu.js.map +1 -0
- package/dist/ui/field.d.ts +25 -0
- package/dist/ui/field.d.ts.map +1 -0
- package/dist/ui/field.js +68 -0
- package/dist/ui/field.js.map +1 -0
- package/dist/ui/hover-card.d.ts +7 -0
- package/dist/ui/hover-card.d.ts.map +1 -0
- package/dist/ui/hover-card.js +14 -0
- package/dist/ui/hover-card.js.map +1 -0
- package/dist/ui/input-group.d.ts +17 -0
- package/dist/ui/input-group.d.ts.map +1 -0
- package/dist/ui/input-group.js +57 -0
- package/dist/ui/input-group.js.map +1 -0
- package/dist/ui/input.d.ts +4 -0
- package/dist/ui/input.d.ts.map +1 -0
- package/dist/ui/input.js +7 -0
- package/dist/ui/input.js.map +1 -0
- package/dist/ui/item.d.ts +24 -0
- package/dist/ui/item.d.ts.map +1 -0
- package/dist/ui/item.js +68 -0
- package/dist/ui/item.js.map +1 -0
- package/dist/ui/label.d.ts +5 -0
- package/dist/ui/label.d.ts.map +1 -0
- package/dist/ui/label.js +8 -0
- package/dist/ui/label.js.map +1 -0
- package/dist/ui/radio-group.d.ts +6 -0
- package/dist/ui/radio-group.d.ts.map +1 -0
- package/dist/ui/radio-group.js +11 -0
- package/dist/ui/radio-group.js.map +1 -0
- package/dist/ui/select.d.ts +16 -0
- package/dist/ui/select.d.ts.map +1 -0
- package/dist/ui/select.js +36 -0
- package/dist/ui/select.js.map +1 -0
- package/dist/ui/separator.d.ts +5 -0
- package/dist/ui/separator.d.ts.map +1 -0
- package/dist/ui/separator.js +9 -0
- package/dist/ui/separator.js.map +1 -0
- package/dist/ui/sheet.d.ts +15 -0
- package/dist/ui/sheet.d.ts.map +1 -0
- package/dist/ui/sheet.js +37 -0
- package/dist/ui/sheet.js.map +1 -0
- package/dist/ui/sidebar.d.ts +70 -0
- package/dist/ui/sidebar.d.ts.map +1 -0
- package/dist/ui/sidebar.js +207 -0
- package/dist/ui/sidebar.js.map +1 -0
- package/dist/ui/skeleton.d.ts +3 -0
- package/dist/ui/skeleton.d.ts.map +1 -0
- package/dist/ui/skeleton.js +7 -0
- package/dist/ui/skeleton.js.map +1 -0
- package/dist/ui/switch.d.ts +7 -0
- package/dist/ui/switch.d.ts.map +1 -0
- package/dist/ui/switch.js +8 -0
- package/dist/ui/switch.js.map +1 -0
- package/dist/ui/table.d.ts +11 -0
- package/dist/ui/table.d.ts.map +1 -0
- package/dist/ui/table.js +28 -0
- package/dist/ui/table.js.map +1 -0
- package/dist/ui/textarea.d.ts +4 -0
- package/dist/ui/textarea.d.ts.map +1 -0
- package/dist/ui/textarea.js +7 -0
- package/dist/ui/textarea.js.map +1 -0
- package/dist/ui/toggle-group.d.ts +11 -0
- package/dist/ui/toggle-group.d.ts.map +1 -0
- package/dist/ui/toggle-group.js +24 -0
- package/dist/ui/toggle-group.js.map +1 -0
- package/dist/ui/toggle.d.ts +10 -0
- package/dist/ui/toggle.d.ts.map +1 -0
- package/dist/ui/toggle.js +26 -0
- package/dist/ui/toggle.js.map +1 -0
- package/dist/ui/tooltip.d.ts +8 -0
- package/dist/ui/tooltip.d.ts.map +1 -0
- package/dist/ui/tooltip.js +17 -0
- package/dist/ui/tooltip.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState, useEffect, useCallback } from 'react';
|
|
4
|
+
import { useEntries, useMutateEntry, useSchemaEditor } from '@airdraft/react';
|
|
5
|
+
import { Button } from './ui/button.js';
|
|
6
|
+
import Loader from './ui/aevr/loader.js';
|
|
7
|
+
import { Input } from './ui/input.js';
|
|
8
|
+
import { Label } from './ui/label.js';
|
|
9
|
+
import { Table, TableBody, TableHead, TableHeader, TableRow, } from './ui/table.js';
|
|
10
|
+
import { PageHeader } from './components/PageHeader.js';
|
|
11
|
+
import { EmptyState } from './components/EmptyState.js';
|
|
12
|
+
import { EntryRow } from './components/EntryRow.js';
|
|
13
|
+
import { ErrorAlert } from './components/ErrorAlert.js';
|
|
14
|
+
import { FileText, Plus, X } from 'lucide-react';
|
|
15
|
+
import { cn } from './lib/utils.js';
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
// New-entry inline form
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
function NewEntryForm({ onDone, onCreate, creating, fieldName = 'title', }) {
|
|
20
|
+
const [value, setValue] = useState('');
|
|
21
|
+
const [error, setError] = useState(null);
|
|
22
|
+
const fieldLabel = fieldName.charAt(0).toUpperCase() + fieldName.slice(1);
|
|
23
|
+
async function handleSubmit(e) {
|
|
24
|
+
e.preventDefault();
|
|
25
|
+
if (!value.trim()) {
|
|
26
|
+
setError(`${fieldLabel} is required`);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
try {
|
|
30
|
+
await onCreate({ [fieldName]: value.trim() });
|
|
31
|
+
onDone();
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
setError(err instanceof Error ? err.message : 'Failed to create entry.');
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return (_jsxs("form", { onSubmit: handleSubmit, className: "flex items-end gap-2 rounded-lg border bg-muted/30 p-3", children: [_jsxs("div", { className: "flex-1 space-y-1", children: [_jsx(Label, { htmlFor: "new-entry-title", className: "text-xs", children: fieldLabel }), _jsx(Input, { id: "new-entry-title", value: value, onChange: (e) => { setValue(e.target.value); setError(null); }, placeholder: `New entry ${fieldLabel.toLowerCase()}`, className: "h-8 text-sm", autoFocus: true }), error && _jsx(ErrorAlert, { error: error, compact: true })] }), _jsxs(Button, { type: "submit", size: "sm", disabled: creating, children: [_jsx(Loader, { loading: creating, className: "size-3.5" }), creating ? 'Creating…' : 'Create'] }), _jsx(Button, { type: "button", variant: "ghost", size: "icon", className: "h-8 w-8", onClick: onDone, children: _jsx(X, { className: "h-4 w-4" }) })] }));
|
|
38
|
+
}
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
// CollectionManager
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
/**
|
|
43
|
+
* Tier 3 — drop-in content manager for a single collection.
|
|
44
|
+
*
|
|
45
|
+
* Lists entries in the given collection with create and delete actions.
|
|
46
|
+
*
|
|
47
|
+
* ```tsx
|
|
48
|
+
* import { ContentManager } from '@airdraft/react-ui'
|
|
49
|
+
*
|
|
50
|
+
* export default function Page({ params }: { params: { collection: string } }) {
|
|
51
|
+
* return <ContentManager collection={params.collection} />
|
|
52
|
+
* }
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
export function ContentManager({ collection, label, onEdit, className }) {
|
|
56
|
+
const { entries, loading, error, refresh } = useEntries(collection);
|
|
57
|
+
const { createEntry, deleteEntry, creating, deleting } = useMutateEntry(collection);
|
|
58
|
+
const { collections, loading: schemaLoading } = useSchemaEditor();
|
|
59
|
+
const [showNew, setShowNew] = useState(false);
|
|
60
|
+
const [deletingSlug, setDeletingSlug] = useState(null);
|
|
61
|
+
const displayLabel = label ?? collection.charAt(0).toUpperCase() + collection.slice(1);
|
|
62
|
+
// Derive publish flag and the slug-source field from the loaded schema
|
|
63
|
+
const [hasPublish, setHasPublish] = useState(false);
|
|
64
|
+
const [titleField, setTitleField] = useState('title');
|
|
65
|
+
useEffect(() => {
|
|
66
|
+
const col = collections?.[collection];
|
|
67
|
+
if (!col)
|
|
68
|
+
return;
|
|
69
|
+
setHasPublish(Boolean(col.publish));
|
|
70
|
+
if (col.slugSource) {
|
|
71
|
+
setTitleField(col.slugSource);
|
|
72
|
+
}
|
|
73
|
+
else if (!col.fields['title']) {
|
|
74
|
+
// Fall back to first required string field, then first string field
|
|
75
|
+
const fieldEntries = Object.entries(col.fields);
|
|
76
|
+
const pick = fieldEntries.find(([, f]) => f.required && f.type === 'string') ??
|
|
77
|
+
fieldEntries.find(([, f]) => f.type === 'string');
|
|
78
|
+
if (pick)
|
|
79
|
+
setTitleField(pick[0]);
|
|
80
|
+
}
|
|
81
|
+
}, [collections, collection]);
|
|
82
|
+
const handleDelete = useCallback(async (entry) => {
|
|
83
|
+
const sha = entry.meta?.sha;
|
|
84
|
+
if (!sha)
|
|
85
|
+
return;
|
|
86
|
+
setDeletingSlug(entry.slug);
|
|
87
|
+
try {
|
|
88
|
+
await deleteEntry(entry.slug, sha);
|
|
89
|
+
refresh();
|
|
90
|
+
}
|
|
91
|
+
finally {
|
|
92
|
+
setDeletingSlug(null);
|
|
93
|
+
}
|
|
94
|
+
}, [deleteEntry, refresh]);
|
|
95
|
+
const handleEdit = useCallback((entry) => {
|
|
96
|
+
if (onEdit) {
|
|
97
|
+
onEdit(entry.slug);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
window.location.href = `./${collection}/${entry.slug}`;
|
|
101
|
+
}
|
|
102
|
+
}, [onEdit, collection]);
|
|
103
|
+
const handleCreate = useCallback(async (data) => {
|
|
104
|
+
const entry = await createEntry(data);
|
|
105
|
+
refresh();
|
|
106
|
+
return entry;
|
|
107
|
+
}, [createEntry, refresh]);
|
|
108
|
+
return (_jsxs("div", { className: cn('space-y-4', className), children: [_jsx(PageHeader, { title: displayLabel, description: `${entries.length} entr${entries.length === 1 ? 'y' : 'ies'}`, actions: !showNew && (_jsxs(Button, { size: "sm", onClick: () => setShowNew(true), children: [_jsx(Plus, { className: "mr-1.5 h-3.5 w-3.5" }), "New entry"] })) }), showNew && (_jsx(NewEntryForm, { onDone: () => setShowNew(false), onCreate: handleCreate, creating: creating, fieldName: titleField })), loading ? (_jsx("div", { className: "flex justify-center py-8", children: _jsx(Loader, {}) })) : error ? (_jsx(ErrorAlert, { error: error, title: "Failed to load entries", onRetry: refresh })) : entries.length === 0 ? (_jsx(EmptyState, { icon: _jsx(FileText, { className: "h-10 w-10" }), title: "No entries yet", description: "Create the first entry in this collection.", action: _jsxs(Button, { size: "sm", onClick: () => setShowNew(true), children: [_jsx(Plus, { className: "mr-1.5 h-3.5 w-3.5" }), "New entry"] }) })) : (_jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: "Title" }), _jsx(TableHead, { children: "Slug" }), hasPublish && _jsx(TableHead, { children: "Status" }), _jsx(TableHead, { className: "text-right", children: "Actions" })] }) }), _jsx(TableBody, { children: entries.map((entry) => (_jsx(EntryRow, { entry: entry, titleField: titleField, hasPublish: hasPublish, onEdit: handleEdit, onDelete: handleDelete, deleting: deletingSlug === entry.slug && deleting }, entry.slug))) })] }))] }));
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=ContentManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContentManager.js","sourceRoot":"","sources":["../src/ContentManager.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface EntryEditorProps {
|
|
2
|
+
/** Collection name (from schema). */
|
|
3
|
+
collection: string;
|
|
4
|
+
/** Entry slug to edit. */
|
|
5
|
+
slug: string;
|
|
6
|
+
/** Called when the back button is clicked. */
|
|
7
|
+
onBack?: () => void;
|
|
8
|
+
className?: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Tier 3 — drop-in entry editor for a single CMS entry.
|
|
12
|
+
*
|
|
13
|
+
* Loads the entry and its collection schema, then renders a dynamic form for
|
|
14
|
+
* all defined fields. Saves via `updateEntry`.
|
|
15
|
+
*
|
|
16
|
+
* ```tsx
|
|
17
|
+
* import { EntryEditor } from '@airdraft/react-ui'
|
|
18
|
+
*
|
|
19
|
+
* export default function Page({ collection, slug }) {
|
|
20
|
+
* return <EntryEditor collection={collection} slug={slug} />
|
|
21
|
+
* }
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export declare function EntryEditor({ collection, slug, onBack, className }: EntryEditorProps): import("react/jsx-runtime").JSX.Element;
|
|
25
|
+
//# sourceMappingURL=EntryEditor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EntryEditor.d.ts","sourceRoot":"","sources":["../src/EntryEditor.tsx"],"names":[],"mappings":"AA4bA,MAAM,WAAW,gBAAgB;IAC/B,qCAAqC;IACrC,UAAU,EAAE,MAAM,CAAA;IAClB,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,8CAA8C;IAC9C,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,WAAW,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,gBAAgB,2CAuJpF"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { useEffect, useState, useCallback, useRef } from 'react';
|
|
4
|
+
import { createPortal } from 'react-dom';
|
|
5
|
+
import { useEntry, useMutateEntry, useSchemaEditor, useEntries, useMediaLibrary, useMediaUpload, AirdraftClientError } from '@airdraft/react';
|
|
6
|
+
import { Button } from './ui/button.js';
|
|
7
|
+
import { Input } from './ui/input.js';
|
|
8
|
+
import { TagInput } from './components/TagInput.js';
|
|
9
|
+
import { Textarea } from './ui/textarea.js';
|
|
10
|
+
import { Label } from './ui/label.js';
|
|
11
|
+
import { Switch } from './ui/switch.js';
|
|
12
|
+
import { Checkbox } from './ui/checkbox.js';
|
|
13
|
+
import Loader from './ui/aevr/loader.js';
|
|
14
|
+
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from './ui/select.js';
|
|
15
|
+
import { PageHeader } from './components/PageHeader.js';
|
|
16
|
+
import { ErrorAlert } from './components/ErrorAlert.js';
|
|
17
|
+
import { cn } from './lib/utils.js';
|
|
18
|
+
import { Image as ImageIcon, Upload, X, Check, AlertTriangle, RefreshCw } from 'lucide-react';
|
|
19
|
+
function FieldMediaInput({ name, label, required, value, onChange }) {
|
|
20
|
+
const id = `field-${name}`;
|
|
21
|
+
const { items, loading: libLoading, refresh } = useMediaLibrary();
|
|
22
|
+
const { upload, uploading } = useMediaUpload();
|
|
23
|
+
const [open, setOpen] = useState(false);
|
|
24
|
+
const [mounted, setMounted] = useState(false);
|
|
25
|
+
const [uploadError, setUploadError] = useState(null);
|
|
26
|
+
const fileRef = useRef(null);
|
|
27
|
+
useEffect(() => { setMounted(true); }, []);
|
|
28
|
+
const currentKey = String(value ?? '');
|
|
29
|
+
const currentItem = items.find((i) => i.key === currentKey);
|
|
30
|
+
async function handleFile(files) {
|
|
31
|
+
if (!files?.length)
|
|
32
|
+
return;
|
|
33
|
+
setUploadError(null);
|
|
34
|
+
try {
|
|
35
|
+
const item = await upload(files[0]);
|
|
36
|
+
refresh();
|
|
37
|
+
onChange(name, item.key);
|
|
38
|
+
setOpen(false);
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
setUploadError(err instanceof Error ? err.message : 'Upload failed');
|
|
42
|
+
}
|
|
43
|
+
finally {
|
|
44
|
+
if (fileRef.current)
|
|
45
|
+
fileRef.current.value = '';
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const modal = open && mounted && createPortal(_jsx("div", { className: "fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/60", onClick: (e) => { if (e.target === e.currentTarget)
|
|
49
|
+
setOpen(false); }, children: _jsxs("div", { className: "bg-background rounded-xl border shadow-xl w-full max-w-2xl max-h-[80vh] flex flex-col", children: [_jsxs("div", { className: "flex items-center justify-between px-5 py-3 border-b shrink-0", children: [_jsx("h2", { className: "font-semibold text-sm", children: "Media library" }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsxs(Button, { type: "button", size: "sm", variant: "outline", onClick: () => fileRef.current?.click(), disabled: uploading, children: [_jsx(Loader, { loading: uploading, className: "size-3.5" }), _jsx(Upload, { className: "h-3.5 w-3.5 mr-1.5" }), uploading ? 'Uploading…' : 'Upload'] }), _jsx("input", { ref: fileRef, type: "file", accept: "image/jpeg,image/png,image/webp,image/gif,image/svg+xml", className: "sr-only", onChange: (e) => handleFile(e.target.files) }), _jsx(Button, { type: "button", size: "icon", variant: "ghost", className: "h-7 w-7", onClick: () => setOpen(false), children: _jsx(X, { className: "h-4 w-4" }) })] })] }), _jsxs("div", { className: "overflow-y-auto p-4 flex-1", children: [uploadError && _jsx("p", { className: "text-sm text-destructive mb-3", children: uploadError }), libLoading && _jsx("div", { className: "flex justify-center py-4", children: _jsx(Loader, {}) }), !libLoading && items.length === 0 && (_jsx("p", { className: "text-sm text-muted-foreground", children: "No media yet \u2014 upload something above." })), _jsx("div", { className: "grid grid-cols-3 sm:grid-cols-4 gap-2", children: items.map((item) => {
|
|
50
|
+
const selected = item.key === currentKey;
|
|
51
|
+
return (_jsxs("button", { type: "button", onClick: () => { onChange(name, item.key); setOpen(false); }, className: cn('group relative rounded-lg overflow-hidden border aspect-square transition-all', selected ? 'ring-2 ring-primary border-primary' : 'hover:border-foreground/40'), children: [_jsx("img", { src: item.url, alt: item.alt ?? item.name, className: "w-full h-full object-cover" }), selected && (_jsx("div", { className: "absolute top-1.5 right-1.5 bg-primary text-primary-foreground rounded-full w-5 h-5 flex items-center justify-center", children: _jsx(Check, { className: "h-3 w-3" }) })), _jsx("div", { className: "absolute bottom-0 inset-x-0 bg-linear-to-t from-black/70 to-transparent px-2 py-1.5 opacity-0 group-hover:opacity-100 transition-opacity", children: _jsx("p", { className: "text-white text-xs truncate", children: item.name }) })] }, item.key));
|
|
52
|
+
}) })] })] }) }), document.body);
|
|
53
|
+
return (_jsxs("div", { className: "space-y-1.5", children: [_jsxs(Label, { htmlFor: id, children: [label, required && _jsx("span", { className: "text-destructive ml-1", children: "*" })] }), currentItem ? (_jsxs("div", { className: "relative rounded-lg overflow-hidden border aspect-video w-full max-w-sm bg-muted", children: [_jsx("img", { src: currentItem.url, alt: currentItem.alt ?? currentItem.name, className: "w-full h-full object-cover" }), _jsxs("div", { className: "absolute top-2 right-2 flex gap-1.5", children: [_jsx(Button, { type: "button", size: "sm", variant: "secondary", className: "h-6 text-xs px-2", onClick: () => setOpen(true), children: "Change" }), _jsx(Button, { type: "button", size: "icon", variant: "secondary", className: "h-6 w-6", onClick: () => onChange(name, ''), children: _jsx(X, { className: "h-3 w-3" }) })] }), _jsx("p", { className: "absolute bottom-0 inset-x-0 bg-black/50 text-white text-xs px-2 py-1 truncate", children: currentItem.name })] })) : (_jsxs("button", { id: id, type: "button", onClick: () => setOpen(true), className: "flex flex-col items-center justify-center gap-2 rounded-lg border border-dashed bg-muted/40 aspect-video w-full max-w-sm text-muted-foreground hover:bg-muted/70 hover:border-foreground/30 transition-colors", children: [_jsx(ImageIcon, { className: "h-8 w-8 opacity-40" }), _jsx("span", { className: "text-xs", children: "Click to pick from media library" })] })), modal] }));
|
|
54
|
+
}
|
|
55
|
+
function getEntryLabel(entry) {
|
|
56
|
+
return String(entry.data['title'] ?? entry.data['name'] ?? entry.slug);
|
|
57
|
+
}
|
|
58
|
+
function FieldRelationInput({ name, config, value, onChange }) {
|
|
59
|
+
const id = `field-${name}`;
|
|
60
|
+
const label = config.label ?? name;
|
|
61
|
+
const relatedCollection = config.collection ?? '';
|
|
62
|
+
const isMulti = config.type === 'relations';
|
|
63
|
+
const { entries, loading } = useEntries(relatedCollection);
|
|
64
|
+
const [search, setSearch] = useState('');
|
|
65
|
+
const filtered = search
|
|
66
|
+
? entries.filter((e) => getEntryLabel(e).toLowerCase().includes(search.toLowerCase()) || e.slug.includes(search.toLowerCase()))
|
|
67
|
+
: entries;
|
|
68
|
+
if (!relatedCollection) {
|
|
69
|
+
return (_jsxs("div", { className: "space-y-1.5", children: [_jsxs(Label, { children: [label, config.required && _jsx("span", { className: "text-destructive ml-1", children: "*" })] }), _jsx("p", { className: "text-xs text-destructive", children: "Relation field missing collection config." })] }));
|
|
70
|
+
}
|
|
71
|
+
if (isMulti) {
|
|
72
|
+
const selected = Array.isArray(value) ? value : [];
|
|
73
|
+
function toggle(slug) {
|
|
74
|
+
onChange(name, selected.includes(slug) ? selected.filter((s) => s !== slug) : [...selected, slug]);
|
|
75
|
+
}
|
|
76
|
+
return (_jsxs("div", { className: "space-y-1.5", children: [_jsxs(Label, { htmlFor: id, children: [label, config.required && _jsx("span", { className: "text-destructive ml-1", children: "*" }), _jsxs("span", { className: "text-muted-foreground ml-1 text-xs", children: ["\u2192 ", relatedCollection] })] }), selected.length > 0 && (_jsx("div", { className: "flex flex-wrap gap-1.5 mb-1", children: selected.map((slug) => {
|
|
77
|
+
const entry = entries.find((e) => e.slug === slug);
|
|
78
|
+
return (_jsxs("span", { className: "inline-flex items-center gap-1 rounded-full border bg-muted px-2.5 py-0.5 text-xs", children: [entry ? getEntryLabel(entry) : slug, _jsx("button", { type: "button", onClick: () => toggle(slug), className: "text-muted-foreground hover:text-foreground transition-colors ml-0.5", children: _jsx(X, { className: "h-3 w-3" }) })] }, slug));
|
|
79
|
+
}) })), _jsxs("div", { className: "rounded-lg border overflow-hidden", children: [_jsx("div", { className: "border-b px-3 py-2 bg-muted/30", children: _jsx(Input, { placeholder: `Search ${relatedCollection}…`, value: search, onChange: (e) => setSearch(e.target.value), className: "h-7 text-xs border-0 bg-transparent shadow-none px-0 focus-visible:ring-0" }) }), _jsxs("div", { className: "max-h-48 overflow-y-auto divide-y", children: [loading && _jsx("p", { className: "text-xs text-muted-foreground px-3 py-2", children: "Loading\u2026" }), !loading && filtered.length === 0 && (_jsx("p", { className: "text-xs text-muted-foreground px-3 py-2", children: "No entries found." })), filtered.map((entry) => {
|
|
80
|
+
const checked = selected.includes(entry.slug);
|
|
81
|
+
return (_jsxs("label", { className: "flex items-center gap-2.5 px-3 py-2 cursor-pointer hover:bg-muted/50 transition-colors", children: [_jsx(Checkbox, { checked: checked, onCheckedChange: () => toggle(entry.slug) }), _jsx("span", { className: "text-sm flex-1 truncate", children: getEntryLabel(entry) }), _jsx("span", { className: "text-xs text-muted-foreground font-mono", children: entry.slug })] }, entry.slug));
|
|
82
|
+
})] })] })] }));
|
|
83
|
+
}
|
|
84
|
+
// Single relation — Select dropdown
|
|
85
|
+
const currentSlug = String(value ?? '');
|
|
86
|
+
return (_jsxs("div", { className: "space-y-1.5", children: [_jsxs(Label, { htmlFor: id, children: [label, config.required && _jsx("span", { className: "text-destructive ml-1", children: "*" }), _jsxs("span", { className: "text-muted-foreground ml-1 text-xs", children: ["\u2192 ", relatedCollection] })] }), _jsxs(Select, { value: currentSlug, onValueChange: (v) => onChange(name, v === '__none__' ? '' : v), children: [_jsx(SelectTrigger, { id: id, children: _jsx(SelectValue, { placeholder: loading ? 'Loading…' : `Select ${relatedCollection}…` }) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "__none__", children: _jsx("span", { className: "text-muted-foreground", children: "None" }) }), entries.map((entry) => (_jsx(SelectItem, { value: entry.slug, children: getEntryLabel(entry) }, entry.slug)))] })] })] }));
|
|
87
|
+
}
|
|
88
|
+
function FieldInput({ name, config, value, onChange }) {
|
|
89
|
+
const label = config.label ?? name;
|
|
90
|
+
const id = `field-${name}`;
|
|
91
|
+
switch (config.type) {
|
|
92
|
+
case 'boolean':
|
|
93
|
+
return (_jsxs("div", { className: "flex items-center gap-3", children: [_jsx(Switch, { id: id, checked: Boolean(value ?? config.default ?? false), onCheckedChange: (checked) => onChange(name, checked) }), _jsx(Label, { htmlFor: id, children: label })] }));
|
|
94
|
+
case 'text':
|
|
95
|
+
case 'rich-text':
|
|
96
|
+
return (_jsxs("div", { className: "space-y-1.5", children: [_jsxs(Label, { htmlFor: id, children: [label, config.required && _jsx("span", { className: "text-destructive ml-1", children: "*" })] }), _jsx(Textarea, { id: id, value: String(value ?? config.default ?? ''), onChange: (e) => onChange(name, e.target.value), className: "min-h-[120px]" })] }));
|
|
97
|
+
case 'number':
|
|
98
|
+
return (_jsxs("div", { className: "space-y-1.5", children: [_jsxs(Label, { htmlFor: id, children: [label, config.required && _jsx("span", { className: "text-destructive ml-1", children: "*" })] }), _jsx(Input, { id: id, type: "number", value: String(value ?? config.default ?? ''), onChange: (e) => onChange(name, e.target.value === '' ? '' : Number(e.target.value)) })] }));
|
|
99
|
+
case 'date':
|
|
100
|
+
return (_jsxs("div", { className: "space-y-1.5", children: [_jsxs(Label, { htmlFor: id, children: [label, config.required && _jsx("span", { className: "text-destructive ml-1", children: "*" })] }), _jsx(Input, { id: id, type: "date", value: String(value ?? config.default ?? ''), onChange: (e) => onChange(name, e.target.value) })] }));
|
|
101
|
+
case 'datetime':
|
|
102
|
+
return (_jsxs("div", { className: "space-y-1.5", children: [_jsxs(Label, { htmlFor: id, children: [label, config.required && _jsx("span", { className: "text-destructive ml-1", children: "*" })] }), _jsx(Input, { id: id, type: "datetime-local", value: String(value ?? config.default ?? '').replace('Z', ''), onChange: (e) => onChange(name, e.target.value ? `${e.target.value}Z` : '') })] }));
|
|
103
|
+
case 'select':
|
|
104
|
+
return (_jsxs("div", { className: "space-y-1.5", children: [_jsxs(Label, { htmlFor: id, children: [label, config.required && _jsx("span", { className: "text-destructive ml-1", children: "*" })] }), _jsxs(Select, { value: String(value ?? config.default ?? ''), onValueChange: (v) => onChange(name, v), children: [_jsx(SelectTrigger, { id: id, children: _jsx(SelectValue, { placeholder: "Select\u2026" }) }), _jsx(SelectContent, { children: (config.options ?? []).map((opt) => (_jsx(SelectItem, { value: opt, children: opt }, opt))) })] })] }));
|
|
105
|
+
case 'multiselect':
|
|
106
|
+
case 'list':
|
|
107
|
+
return (_jsxs("div", { className: "space-y-1.5", children: [_jsxs(Label, { htmlFor: id, children: [label, config.required && _jsx("span", { className: "text-destructive ml-1", children: "*" })] }), _jsx(TagInput, { id: id, value: Array.isArray(value) ? value : String(value ?? '').split(',').map((s) => s.trim()).filter(Boolean), onChange: (tags) => onChange(name, tags), options: config.type === 'multiselect' ? (config.options ?? undefined) : undefined, placeholder: config.type === 'multiselect' ? 'Pick options…' : 'Type and press Enter' })] }));
|
|
108
|
+
case 'image':
|
|
109
|
+
return (_jsx(FieldMediaInput, { name: name, label: label, required: config.required, value: value, onChange: onChange }));
|
|
110
|
+
case 'relation':
|
|
111
|
+
case 'relations':
|
|
112
|
+
return (_jsx(FieldRelationInput, { name: name, config: config, value: value, onChange: onChange }));
|
|
113
|
+
// string (default)
|
|
114
|
+
default:
|
|
115
|
+
return (_jsxs("div", { className: "space-y-1.5", children: [_jsxs(Label, { htmlFor: id, children: [label, config.required && _jsx("span", { className: "text-destructive ml-1", children: "*" })] }), _jsx(Input, { id: id, value: String(value ?? config.default ?? ''), onChange: (e) => onChange(name, e.target.value) })] }));
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Tier 3 — drop-in entry editor for a single CMS entry.
|
|
120
|
+
*
|
|
121
|
+
* Loads the entry and its collection schema, then renders a dynamic form for
|
|
122
|
+
* all defined fields. Saves via `updateEntry`.
|
|
123
|
+
*
|
|
124
|
+
* ```tsx
|
|
125
|
+
* import { EntryEditor } from '@airdraft/react-ui'
|
|
126
|
+
*
|
|
127
|
+
* export default function Page({ collection, slug }) {
|
|
128
|
+
* return <EntryEditor collection={collection} slug={slug} />
|
|
129
|
+
* }
|
|
130
|
+
* ```
|
|
131
|
+
*/
|
|
132
|
+
export function EntryEditor({ collection, slug, onBack, className }) {
|
|
133
|
+
const { entry, loading: entryLoading, error: entryError, refresh } = useEntry(collection, slug);
|
|
134
|
+
const { updateEntry, updating, error: mutError } = useMutateEntry(collection);
|
|
135
|
+
const { collections, loading: schemaLoading } = useSchemaEditor();
|
|
136
|
+
const [form, setForm] = useState({});
|
|
137
|
+
const [saved, setSaved] = useState(false);
|
|
138
|
+
const [conflict, setConflict] = useState(false);
|
|
139
|
+
// Seed form when entry loads
|
|
140
|
+
useEffect(() => {
|
|
141
|
+
if (entry) {
|
|
142
|
+
setForm({ ...entry.data });
|
|
143
|
+
setConflict(false);
|
|
144
|
+
}
|
|
145
|
+
}, [entry]);
|
|
146
|
+
const handleChange = useCallback((name, value) => {
|
|
147
|
+
setSaved(false);
|
|
148
|
+
setForm((prev) => ({ ...prev, [name]: value }));
|
|
149
|
+
}, []);
|
|
150
|
+
async function handleSave(e) {
|
|
151
|
+
e.preventDefault();
|
|
152
|
+
if (!entry)
|
|
153
|
+
return;
|
|
154
|
+
// Coerce list / multiselect / relations fields to arrays before saving.
|
|
155
|
+
// Entries written when those fields had type "string" store plain strings
|
|
156
|
+
// on disk; the validator requires arrays.
|
|
157
|
+
const normalized = { ...form };
|
|
158
|
+
for (const [name, cfg] of Object.entries(fields)) {
|
|
159
|
+
if (['list', 'multiselect', 'relations'].includes(cfg.type)) {
|
|
160
|
+
const v = normalized[name];
|
|
161
|
+
if (!Array.isArray(v)) {
|
|
162
|
+
normalized[name] = v
|
|
163
|
+
? String(v).split(',').map((s) => s.trim()).filter(Boolean)
|
|
164
|
+
: [];
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
try {
|
|
169
|
+
await updateEntry(slug, normalized, entry.meta.sha);
|
|
170
|
+
refresh();
|
|
171
|
+
setSaved(true);
|
|
172
|
+
setConflict(false);
|
|
173
|
+
}
|
|
174
|
+
catch (err) {
|
|
175
|
+
if (err instanceof AirdraftClientError && err.statusCode === 409) {
|
|
176
|
+
setConflict(true);
|
|
177
|
+
}
|
|
178
|
+
// mutError is set by the hook; form stays visible
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
const schema = collections?.[collection];
|
|
182
|
+
const fields = schema?.fields ?? {};
|
|
183
|
+
const loading = entryLoading || schemaLoading;
|
|
184
|
+
const title = String(entry?.data?.['title'] ?? entry?.data?.['name'] ?? slug);
|
|
185
|
+
const collectionLabel = schema?.label ?? collection;
|
|
186
|
+
return (_jsxs("div", { className: className, children: [_jsx(PageHeader, { title: loading ? '…' : title, description: `${collectionLabel} / ${slug}`, actions: onBack ? (_jsx(Button, { variant: "outline", size: "sm", onClick: onBack, children: "\u2190 Back" })) : undefined }), loading && (_jsx("div", { className: "flex justify-center py-10 mt-6", children: _jsx(Loader, {}) })), !loading && entryError && (_jsx(ErrorAlert, { error: entryError, title: "Failed to load entry", className: "mt-6" })), !loading && !entryError && entry && (_jsxs(_Fragment, { children: [conflict && (_jsxs("div", { className: "mt-6 flex items-start gap-3 rounded-lg border border-amber-500/40 bg-amber-500/10 px-4 py-3 text-sm", children: [_jsx(AlertTriangle, { className: "mt-0.5 h-4 w-4 shrink-0 text-amber-500" }), _jsxs("div", { className: "flex-1", children: [_jsx("p", { className: "font-medium text-amber-700 dark:text-amber-400", children: "Conflict detected" }), _jsx("p", { className: "text-muted-foreground text-xs mt-0.5", children: "This entry was updated by someone else. Reload to get the latest version before saving." })] }), _jsxs(Button, { type: "button", size: "sm", variant: "outline", className: "shrink-0 border-amber-500/40 text-amber-700 hover:bg-amber-500/10 dark:text-amber-400", onClick: () => { refresh(); }, children: [_jsx(RefreshCw, { className: "mr-1.5 h-3.5 w-3.5" }), "Reload"] })] })), _jsxs("form", { onSubmit: handleSave, className: "mt-6 space-y-5 max-w-2xl", children: [Object.entries(fields)
|
|
187
|
+
.filter(([, cfg]) => !cfg.hidden)
|
|
188
|
+
.map(([name, cfg]) => (_jsx(FieldInput, { name: name, config: cfg, value: form[name], onChange: handleChange }, name))), schema?.publish && (_jsxs("div", { className: "flex items-center gap-3 pt-2 border-t", children: [_jsx(Switch, { id: "field-published", checked: Boolean(form['published']), onCheckedChange: (checked) => handleChange('published', checked) }), _jsxs(Label, { htmlFor: "field-published", className: "text-muted-foreground text-sm", children: ["Published", entry.publishedAt && (_jsx("span", { className: "ml-2 text-xs", children: new Date(entry.publishedAt).toLocaleDateString() }))] })] })), _jsxs("div", { className: "flex items-center gap-3 pt-4", children: [_jsxs(Button, { type: "submit", disabled: updating, children: [_jsx(Loader, { loading: updating, className: "size-3.5" }), updating ? 'Saving…' : 'Save changes'] }), saved && !updating && (_jsx("span", { className: "text-sm text-green-600", children: "Saved" })), mutError && !conflict && (_jsx(ErrorAlert, { error: mutError, title: "Save failed", compact: true }))] })] })] }))] }));
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=EntryEditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EntryEditor.js","sourceRoot":"","sources":["../src/EntryEditor.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface LoginFormProps {
|
|
2
|
+
/** Called after a successful login. Use this to redirect the user. */
|
|
3
|
+
onSuccess?: () => void;
|
|
4
|
+
/** Optional class name applied to the outer `<form>` element. */
|
|
5
|
+
className?: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Email + password login form backed by `useAuth()`.
|
|
9
|
+
*
|
|
10
|
+
* Must be rendered inside an `<AirdraftProvider>` that uses
|
|
11
|
+
* `{ type: 'session' }` auth.
|
|
12
|
+
*
|
|
13
|
+
* ```tsx
|
|
14
|
+
* <LoginForm onSuccess={() => router.replace('/cms')} />
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export declare function LoginForm({ onSuccess, className }: LoginFormProps): import("react/jsx-runtime").JSX.Element;
|
|
18
|
+
//# sourceMappingURL=LoginForm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LoginForm.d.ts","sourceRoot":"","sources":["../src/LoginForm.tsx"],"names":[],"mappings":"AAQA,MAAM,WAAW,cAAc;IAC7B,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;IACtB,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,cAAc,2CA6DjE"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from 'react';
|
|
4
|
+
import { useAuth } from '@airdraft/react';
|
|
5
|
+
import { Button } from './ui/button.js';
|
|
6
|
+
import { Input } from './ui/input.js';
|
|
7
|
+
import { Label } from './ui/label.js';
|
|
8
|
+
/**
|
|
9
|
+
* Email + password login form backed by `useAuth()`.
|
|
10
|
+
*
|
|
11
|
+
* Must be rendered inside an `<AirdraftProvider>` that uses
|
|
12
|
+
* `{ type: 'session' }` auth.
|
|
13
|
+
*
|
|
14
|
+
* ```tsx
|
|
15
|
+
* <LoginForm onSuccess={() => router.replace('/cms')} />
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export function LoginForm({ onSuccess, className }) {
|
|
19
|
+
const { login } = useAuth();
|
|
20
|
+
const [email, setEmail] = useState('');
|
|
21
|
+
const [password, setPassword] = useState('');
|
|
22
|
+
const [error, setError] = useState(null);
|
|
23
|
+
const [loading, setLoading] = useState(false);
|
|
24
|
+
async function handleSubmit(e) {
|
|
25
|
+
e.preventDefault();
|
|
26
|
+
setError(null);
|
|
27
|
+
setLoading(true);
|
|
28
|
+
try {
|
|
29
|
+
await login(email, password);
|
|
30
|
+
onSuccess?.();
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
setError(err instanceof Error ? err.message : 'Login failed. Check your credentials.');
|
|
34
|
+
}
|
|
35
|
+
finally {
|
|
36
|
+
setLoading(false);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return (_jsx("form", { onSubmit: handleSubmit, className: className, children: _jsxs("div", { className: "space-y-4", children: [_jsxs("div", { className: "space-y-1.5", children: [_jsx(Label, { htmlFor: "airdraft-email", children: "Email" }), _jsx(Input, { id: "airdraft-email", type: "email", value: email, onChange: (e) => setEmail(e.target.value), required: true, autoComplete: "email", placeholder: "you@example.com", disabled: loading })] }), _jsxs("div", { className: "space-y-1.5", children: [_jsx(Label, { htmlFor: "airdraft-password", children: "Password" }), _jsx(Input, { id: "airdraft-password", type: "password", value: password, onChange: (e) => setPassword(e.target.value), required: true, autoComplete: "current-password", placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022", disabled: loading })] }), error && (_jsx("p", { role: "alert", className: "text-sm text-destructive", children: error })), _jsx(Button, { type: "submit", className: "w-full", disabled: loading, children: loading ? 'Signing in…' : 'Sign in' })] }) }));
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=LoginForm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LoginForm.js","sourceRoot":"","sources":["../src/LoginForm.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAA;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AASrC;;;;;;;;;GASG;AACH,MAAM,UAAU,SAAS,CAAC,EAAE,SAAS,EAAE,SAAS,EAAkB;IAChE,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,EAAE,CAAA;IAC3B,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IACtC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IAC5C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAA;IACvD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAE7C,KAAK,UAAU,YAAY,CAAC,CAA6B;QACvD,CAAC,CAAC,cAAc,EAAE,CAAA;QAClB,QAAQ,CAAC,IAAI,CAAC,CAAA;QACd,UAAU,CAAC,IAAI,CAAC,CAAA;QAChB,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;YAC5B,SAAS,EAAE,EAAE,CAAA;QACf,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,uCAAuC,CAAC,CAAA;QACxF,CAAC;gBAAS,CAAC;YACT,UAAU,CAAC,KAAK,CAAC,CAAA;QACnB,CAAC;IACH,CAAC;IAED,OAAO,CACL,eAAM,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,YAChD,eAAK,SAAS,EAAC,WAAW,aACxB,eAAK,SAAS,EAAC,aAAa,aAC1B,KAAC,KAAK,IAAC,OAAO,EAAC,gBAAgB,sBAAc,EAC7C,KAAC,KAAK,IACJ,EAAE,EAAC,gBAAgB,EACnB,IAAI,EAAC,OAAO,EACZ,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACzC,QAAQ,QACR,YAAY,EAAC,OAAO,EACpB,WAAW,EAAC,iBAAiB,EAC7B,QAAQ,EAAE,OAAO,GACjB,IACE,EACN,eAAK,SAAS,EAAC,aAAa,aAC1B,KAAC,KAAK,IAAC,OAAO,EAAC,mBAAmB,yBAAiB,EACnD,KAAC,KAAK,IACJ,EAAE,EAAC,mBAAmB,EACtB,IAAI,EAAC,UAAU,EACf,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC5C,QAAQ,QACR,YAAY,EAAC,kBAAkB,EAC/B,WAAW,EAAC,kDAAU,EACtB,QAAQ,EAAE,OAAO,GACjB,IACE,EACL,KAAK,IAAI,CACR,YAAG,IAAI,EAAC,OAAO,EAAC,SAAS,EAAC,0BAA0B,YACjD,KAAK,GACJ,CACL,EACD,KAAC,MAAM,IAAC,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,QAAQ,EAAC,QAAQ,EAAE,OAAO,YACvD,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,GAC7B,IACL,GACD,CACR,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { MediaItem } from '@airdraft/core';
|
|
2
|
+
export interface MediaManagerProps {
|
|
3
|
+
className?: string;
|
|
4
|
+
/** When set, calls this instead of showing the selection state. */
|
|
5
|
+
onSelect?: (item: MediaItem) => void;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Tier 3 — drop-in media manager.
|
|
9
|
+
*
|
|
10
|
+
* Provides upload, browse, and delete for all media assets.
|
|
11
|
+
*
|
|
12
|
+
* ```tsx
|
|
13
|
+
* import { MediaManager } from '@airdraft/react-ui'
|
|
14
|
+
*
|
|
15
|
+
* export default function MediaPage() {
|
|
16
|
+
* return <MediaManager />
|
|
17
|
+
* }
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export declare function MediaManager({ className, onSelect }: MediaManagerProps): import("react/jsx-runtime").JSX.Element;
|
|
21
|
+
//# sourceMappingURL=MediaManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MediaManager.d.ts","sourceRoot":"","sources":["../src/MediaManager.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAa/C,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,mEAAmE;IACnE,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAA;CACrC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,iBAAiB,2CAiGtE"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState, useCallback } from 'react';
|
|
4
|
+
import { useMediaLibrary, useMediaUpload, useMediaDelete } from '@airdraft/react';
|
|
5
|
+
import { Button } from './ui/button.js';
|
|
6
|
+
import Loader from './ui/aevr/loader.js';
|
|
7
|
+
import { Input } from './ui/input.js';
|
|
8
|
+
import { PageHeader } from './components/PageHeader.js';
|
|
9
|
+
import { EmptyState } from './components/EmptyState.js';
|
|
10
|
+
import { MediaCard } from './components/MediaCard.js';
|
|
11
|
+
import { UploadZone } from './components/UploadZone.js';
|
|
12
|
+
import { ErrorAlert } from './components/ErrorAlert.js';
|
|
13
|
+
import { Images, Search, X } from 'lucide-react';
|
|
14
|
+
import { cn } from './lib/utils.js';
|
|
15
|
+
/**
|
|
16
|
+
* Tier 3 — drop-in media manager.
|
|
17
|
+
*
|
|
18
|
+
* Provides upload, browse, and delete for all media assets.
|
|
19
|
+
*
|
|
20
|
+
* ```tsx
|
|
21
|
+
* import { MediaManager } from '@airdraft/react-ui'
|
|
22
|
+
*
|
|
23
|
+
* export default function MediaPage() {
|
|
24
|
+
* return <MediaManager />
|
|
25
|
+
* }
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export function MediaManager({ className, onSelect }) {
|
|
29
|
+
const [search, setSearch] = useState('');
|
|
30
|
+
const [showUpload, setShowUpload] = useState(false);
|
|
31
|
+
const [deletingKey, setDeletingKey] = useState(null);
|
|
32
|
+
const [uploadError, setUploadError] = useState(null);
|
|
33
|
+
const { items, loading, error, refresh } = useMediaLibrary({ search: search || undefined });
|
|
34
|
+
const { upload, uploading } = useMediaUpload();
|
|
35
|
+
const { deleteItem } = useMediaDelete();
|
|
36
|
+
const handleUpload = useCallback(async (files) => {
|
|
37
|
+
setUploadError(null);
|
|
38
|
+
try {
|
|
39
|
+
await Promise.all(files.map((f) => upload(f)));
|
|
40
|
+
refresh();
|
|
41
|
+
setShowUpload(false);
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
setUploadError(err instanceof Error ? err.message : 'Upload failed.');
|
|
45
|
+
}
|
|
46
|
+
}, [upload, refresh]);
|
|
47
|
+
const handleDelete = useCallback(async (item) => {
|
|
48
|
+
setDeletingKey(item.key);
|
|
49
|
+
try {
|
|
50
|
+
await deleteItem(item.key);
|
|
51
|
+
refresh();
|
|
52
|
+
}
|
|
53
|
+
finally {
|
|
54
|
+
setDeletingKey(null);
|
|
55
|
+
}
|
|
56
|
+
}, [deleteItem, refresh]);
|
|
57
|
+
return (_jsxs("div", { className: cn('space-y-4', className), children: [_jsx(PageHeader, { title: "Media", description: `${items.length} item${items.length === 1 ? '' : 's'}`, actions: _jsx(Button, { size: "sm", onClick: () => setShowUpload((v) => !v), children: showUpload ? (_jsxs(_Fragment, { children: [_jsx(X, { className: "mr-1.5 h-3.5 w-3.5" }), "Cancel"] })) : (_jsx(_Fragment, { children: "Upload" })) }) }), showUpload && (_jsxs("div", { className: "space-y-2", children: [_jsx(UploadZone, { onFiles: handleUpload, uploading: uploading }), uploadError && _jsx(ErrorAlert, { error: uploadError, compact: true })] })), _jsxs("div", { className: "relative", children: [_jsx(Search, { className: "absolute left-2.5 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-muted-foreground" }), _jsx(Input, { value: search, onChange: (e) => setSearch(e.target.value), placeholder: "Search by filename\u2026", className: "pl-8 h-8 text-sm" })] }), loading ? (_jsx("div", { className: "flex justify-center py-8", children: _jsx(Loader, {}) })) : error ? (_jsx(ErrorAlert, { error: error, title: "Failed to load media", onRetry: refresh })) : items.length === 0 ? (_jsx(EmptyState, { icon: _jsx(Images, { className: "h-10 w-10" }), title: search ? 'No results' : 'No media yet', description: search ? 'Try a different search term.' : 'Upload your first file to get started.', action: !search && (_jsx(Button, { size: "sm", onClick: () => setShowUpload(true), children: "Upload" })) })) : (_jsx("div", { className: "grid grid-cols-2 gap-3 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5", children: items.map((item) => (_jsx(MediaCard, { item: item, onDelete: handleDelete, onSelect: onSelect, deleting: deletingKey === item.key }, item.key))) }))] }));
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=MediaManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MediaManager.js","sourceRoot":"","sources":["../src/MediaManager.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { UseSchemaEditorState } from "@airdraft/react";
|
|
2
|
+
import { type SchemaEditorLabels } from "./SchemaEditorRoot.js";
|
|
3
|
+
export interface SchemaEditorProps {
|
|
4
|
+
/** Consumer-controlled state override (from useSchemaEditor()). */
|
|
5
|
+
value?: UseSchemaEditorState;
|
|
6
|
+
/** Override any label string. */
|
|
7
|
+
labels?: SchemaEditorLabels;
|
|
8
|
+
className?: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Tier 3 — drop-in schema editor. Zero configuration required.
|
|
12
|
+
*
|
|
13
|
+
* ```tsx
|
|
14
|
+
* import { SchemaEditor } from '@airdraft/react-ui'
|
|
15
|
+
*
|
|
16
|
+
* export default function SchemaPage() {
|
|
17
|
+
* return <SchemaEditor />
|
|
18
|
+
* }
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export declare function SchemaEditor({ value, labels, className }: SchemaEditorProps): import("react/jsx-runtime").JSX.Element;
|
|
22
|
+
//# sourceMappingURL=SchemaEditor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SchemaEditor.d.ts","sourceRoot":"","sources":["../src/SchemaEditor.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,uBAAuB,CAAC;AAS/B,MAAM,WAAW,iBAAiB;IAChC,mEAAmE;IACnE,KAAK,CAAC,EAAE,oBAAoB,CAAC;IAC7B,iCAAiC;IACjC,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,iBAAiB,2CAM3E"}
|