@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
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface AcceptInviteFormProps {
|
|
2
|
+
/** The invite token from the URL — passed directly into `POST /auth/invite/:token`. */
|
|
3
|
+
token: string;
|
|
4
|
+
/** Called after the invite is accepted and the user is automatically logged in. */
|
|
5
|
+
onSuccess?: () => void;
|
|
6
|
+
/** Optional class name applied to the outer `<form>` element. */
|
|
7
|
+
className?: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Name + password form for accepting an email invite.
|
|
11
|
+
*
|
|
12
|
+
* Accepts the invite (creates the account), then immediately logs the new user
|
|
13
|
+
* in so the caller can redirect straight to the CMS.
|
|
14
|
+
*
|
|
15
|
+
* Must be rendered inside an `<AirdraftProvider>` with `{ type: 'session' }` auth.
|
|
16
|
+
*
|
|
17
|
+
* ```tsx
|
|
18
|
+
* <AcceptInviteForm token={token} onSuccess={() => router.replace('/cms')} />
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export declare function AcceptInviteForm({ token, onSuccess, className }: AcceptInviteFormProps): import("react/jsx-runtime").JSX.Element;
|
|
22
|
+
//# sourceMappingURL=AcceptInviteForm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AcceptInviteForm.d.ts","sourceRoot":"","sources":["../src/AcceptInviteForm.tsx"],"names":[],"mappings":"AAQA,MAAM,WAAW,qBAAqB;IACpC,uFAAuF;IACvF,KAAK,EAAE,MAAM,CAAA;IACb,mFAAmF;IACnF,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;IACtB,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,qBAAqB,2CA0FtF"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from 'react';
|
|
4
|
+
import { useAirdraftClient, 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
|
+
* Name + password form for accepting an email invite.
|
|
10
|
+
*
|
|
11
|
+
* Accepts the invite (creates the account), then immediately logs the new user
|
|
12
|
+
* in so the caller can redirect straight to the CMS.
|
|
13
|
+
*
|
|
14
|
+
* Must be rendered inside an `<AirdraftProvider>` with `{ type: 'session' }` auth.
|
|
15
|
+
*
|
|
16
|
+
* ```tsx
|
|
17
|
+
* <AcceptInviteForm token={token} onSuccess={() => router.replace('/cms')} />
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export function AcceptInviteForm({ token, onSuccess, className }) {
|
|
21
|
+
const client = useAirdraftClient();
|
|
22
|
+
const { login } = useAuth();
|
|
23
|
+
const [name, setName] = useState('');
|
|
24
|
+
const [password, setPassword] = useState('');
|
|
25
|
+
const [confirm, setConfirm] = useState('');
|
|
26
|
+
const [error, setError] = useState(null);
|
|
27
|
+
const [loading, setLoading] = useState(false);
|
|
28
|
+
async function handleSubmit(e) {
|
|
29
|
+
e.preventDefault();
|
|
30
|
+
if (password !== confirm) {
|
|
31
|
+
setError('Passwords do not match');
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
setError(null);
|
|
35
|
+
setLoading(true);
|
|
36
|
+
try {
|
|
37
|
+
// Step 1: Accept invite — creates the account, returns the new email
|
|
38
|
+
const { email } = await client.auth.acceptInvite(token, password, name.trim() || undefined);
|
|
39
|
+
// Step 2: Auto-login so the session cookie is set immediately
|
|
40
|
+
await login(email, password);
|
|
41
|
+
onSuccess?.();
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
setError(err instanceof Error ? err.message : 'Something went wrong. Please try again.');
|
|
45
|
+
}
|
|
46
|
+
finally {
|
|
47
|
+
setLoading(false);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return (_jsx("form", { onSubmit: handleSubmit, className: className, children: _jsxs("div", { className: "space-y-4", children: [_jsxs("div", { className: "space-y-1.5", children: [_jsxs(Label, { htmlFor: "airdraft-invite-name", children: ["Name", ' ', _jsx("span", { className: "text-muted-foreground font-normal", children: "(optional)" })] }), _jsx(Input, { id: "airdraft-invite-name", type: "text", value: name, onChange: (e) => setName(e.target.value), placeholder: "Your name", autoComplete: "name", disabled: loading })] }), _jsxs("div", { className: "space-y-1.5", children: [_jsx(Label, { htmlFor: "airdraft-invite-password", children: "Password" }), _jsx(Input, { id: "airdraft-invite-password", type: "password", value: password, onChange: (e) => { setPassword(e.target.value); setError(null); }, placeholder: "Min. 8 characters", autoComplete: "new-password", required: true, disabled: loading })] }), _jsxs("div", { className: "space-y-1.5", children: [_jsx(Label, { htmlFor: "airdraft-invite-confirm", children: "Confirm password" }), _jsx(Input, { id: "airdraft-invite-confirm", type: "password", value: confirm, onChange: (e) => { setConfirm(e.target.value); setError(null); }, placeholder: "Re-enter password", autoComplete: "new-password", required: true, 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 ? 'Setting up account…' : 'Create account' })] }) }));
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=AcceptInviteForm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AcceptInviteForm.js","sourceRoot":"","sources":["../src/AcceptInviteForm.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export interface AuditEventRecord {
|
|
2
|
+
requestId: string;
|
|
3
|
+
timestamp: string;
|
|
4
|
+
durationMs: number;
|
|
5
|
+
method: string;
|
|
6
|
+
path: string;
|
|
7
|
+
action: string;
|
|
8
|
+
collection?: string;
|
|
9
|
+
slug?: string;
|
|
10
|
+
statusCode: number;
|
|
11
|
+
actor?: string;
|
|
12
|
+
request?: Record<string, unknown>;
|
|
13
|
+
response?: Record<string, unknown>;
|
|
14
|
+
error?: {
|
|
15
|
+
message: string;
|
|
16
|
+
code?: string;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export interface AuditLogViewerProps {
|
|
20
|
+
/**
|
|
21
|
+
* URL of the endpoint that returns `{ events: AuditEventRecord[], total: number }`.
|
|
22
|
+
* Defaults to `/api/audit`.
|
|
23
|
+
*/
|
|
24
|
+
apiUrl?: string;
|
|
25
|
+
className?: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Tier 3 — drop-in audit log inspector.
|
|
29
|
+
*
|
|
30
|
+
* Fetches audit events from `apiUrl` (default `/api/audit`) and renders them
|
|
31
|
+
* in a filterable, sortable table with status-code colour coding.
|
|
32
|
+
*
|
|
33
|
+
* ```tsx
|
|
34
|
+
* import { AuditLogViewer } from '@airdraft/react-ui'
|
|
35
|
+
*
|
|
36
|
+
* export default function AuditPage() {
|
|
37
|
+
* return <AuditLogViewer />
|
|
38
|
+
* }
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export declare function AuditLogViewer({ apiUrl, className }: AuditLogViewerProps): import("react/jsx-runtime").JSX.Element;
|
|
42
|
+
//# sourceMappingURL=AuditLogViewer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuditLogViewer.d.ts","sourceRoot":"","sources":["../src/AuditLogViewer.tsx"],"names":[],"mappings":"AAwBA,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAClC,KAAK,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAC3C;AAgDD,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,EAAE,MAAqB,EAAE,SAAS,EAAE,EAAE,mBAAmB,2CA6KvF"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { useEffect, useState, useCallback } from 'react';
|
|
4
|
+
import { Button } from './ui/button.js';
|
|
5
|
+
import { Input } from './ui/input.js';
|
|
6
|
+
import { Badge } from './ui/badge.js';
|
|
7
|
+
import { PageHeader } from './components/PageHeader.js';
|
|
8
|
+
import { EmptyState } from './components/EmptyState.js';
|
|
9
|
+
import { ErrorAlert } from './components/ErrorAlert.js';
|
|
10
|
+
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from './ui/table.js';
|
|
11
|
+
import { cn } from './lib/utils.js';
|
|
12
|
+
import { RefreshCw, ScrollText } from 'lucide-react';
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// Helpers
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
function StatusBadge({ code }) {
|
|
17
|
+
const cls = code >= 500 ? 'bg-red-100 text-red-700 border-red-200 hover:bg-red-100'
|
|
18
|
+
: code >= 400 ? 'bg-orange-100 text-orange-700 border-orange-200 hover:bg-orange-100'
|
|
19
|
+
: code >= 300 ? 'bg-yellow-100 text-yellow-700 border-yellow-200 hover:bg-yellow-100'
|
|
20
|
+
: 'bg-green-100 text-green-700 border-green-200 hover:bg-green-100';
|
|
21
|
+
return (_jsx(Badge, { variant: "outline", className: cn('font-mono text-xs', cls), children: code }));
|
|
22
|
+
}
|
|
23
|
+
function MethodBadge({ method }) {
|
|
24
|
+
const cls = method === 'GET' ? 'bg-blue-50 text-blue-700 border-blue-200 hover:bg-blue-50'
|
|
25
|
+
: method === 'POST' ? 'bg-green-50 text-green-700 border-green-200 hover:bg-green-50'
|
|
26
|
+
: method === 'PUT' || method === 'PATCH' ? 'bg-amber-50 text-amber-700 border-amber-200 hover:bg-amber-50'
|
|
27
|
+
: method === 'DELETE' ? 'bg-red-50 text-red-700 border-red-200 hover:bg-red-50'
|
|
28
|
+
: 'bg-muted text-muted-foreground';
|
|
29
|
+
return (_jsx(Badge, { variant: "outline", className: cn('font-mono text-xs w-14 justify-center', cls), children: method }));
|
|
30
|
+
}
|
|
31
|
+
function formatTs(ts) {
|
|
32
|
+
const d = new Date(ts);
|
|
33
|
+
return d.toLocaleString(undefined, {
|
|
34
|
+
month: 'short',
|
|
35
|
+
day: 'numeric',
|
|
36
|
+
hour: '2-digit',
|
|
37
|
+
minute: '2-digit',
|
|
38
|
+
second: '2-digit',
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Tier 3 — drop-in audit log inspector.
|
|
43
|
+
*
|
|
44
|
+
* Fetches audit events from `apiUrl` (default `/api/audit`) and renders them
|
|
45
|
+
* in a filterable, sortable table with status-code colour coding.
|
|
46
|
+
*
|
|
47
|
+
* ```tsx
|
|
48
|
+
* import { AuditLogViewer } from '@airdraft/react-ui'
|
|
49
|
+
*
|
|
50
|
+
* export default function AuditPage() {
|
|
51
|
+
* return <AuditLogViewer />
|
|
52
|
+
* }
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
export function AuditLogViewer({ apiUrl = '/api/audit', className }) {
|
|
56
|
+
const [events, setEvents] = useState([]);
|
|
57
|
+
const [total, setTotal] = useState(0);
|
|
58
|
+
const [loading, setLoading] = useState(true);
|
|
59
|
+
const [error, setError] = useState(null);
|
|
60
|
+
const [filter, setFilter] = useState('');
|
|
61
|
+
const [expanded, setExpanded] = useState(null);
|
|
62
|
+
const load = useCallback(async () => {
|
|
63
|
+
setLoading(true);
|
|
64
|
+
setError(null);
|
|
65
|
+
try {
|
|
66
|
+
const res = await fetch(`${apiUrl}?limit=500`);
|
|
67
|
+
if (!res.ok)
|
|
68
|
+
throw new Error(`HTTP ${res.status}`);
|
|
69
|
+
const json = await res.json();
|
|
70
|
+
setEvents(json.events);
|
|
71
|
+
setTotal(json.total);
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
setError(err instanceof Error ? err.message : 'Failed to load audit log');
|
|
75
|
+
}
|
|
76
|
+
finally {
|
|
77
|
+
setLoading(false);
|
|
78
|
+
}
|
|
79
|
+
}, [apiUrl]);
|
|
80
|
+
useEffect(() => { load(); }, [load]);
|
|
81
|
+
const q = filter.toLowerCase().trim();
|
|
82
|
+
const filtered = q
|
|
83
|
+
? events.filter((e) => e.action.toLowerCase().includes(q) ||
|
|
84
|
+
e.path.toLowerCase().includes(q) ||
|
|
85
|
+
e.method.toLowerCase().includes(q) ||
|
|
86
|
+
String(e.statusCode).includes(q) ||
|
|
87
|
+
(e.collection ?? '').toLowerCase().includes(q) ||
|
|
88
|
+
(e.actor ?? '').toLowerCase().includes(q) ||
|
|
89
|
+
(e.error?.message ?? '').toLowerCase().includes(q))
|
|
90
|
+
: events;
|
|
91
|
+
return (_jsxs("div", { className: cn('space-y-4', className), children: [_jsx(PageHeader, { title: "Audit Log", description: loading ? 'Loading…'
|
|
92
|
+
: error ? 'Error'
|
|
93
|
+
: `${filtered.length} of ${total} event${total === 1 ? '' : 's'}`, actions: _jsxs(Button, { variant: "outline", size: "sm", onClick: load, disabled: loading, children: [_jsx(RefreshCw, { className: cn('h-3.5 w-3.5 mr-1.5', loading && 'animate-spin') }), "Refresh"] }) }), _jsx(Input, { placeholder: "Filter by action, path, status, collection\u2026", value: filter, onChange: (e) => setFilter(e.target.value), className: "max-w-md" }), error && _jsx(ErrorAlert, { error: error, title: "Failed to load audit log", onRetry: load }), !loading && !error && filtered.length === 0 && (_jsx(EmptyState, { icon: _jsx(ScrollText, { className: "h-10 w-10" }), title: "No events", description: q ? 'No events match your filter.' : 'No audit events recorded yet.' })), filtered.length > 0 && (_jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { className: "w-[160px]", children: "Time" }), _jsx(TableHead, { className: "w-[60px]", children: "Method" }), _jsx(TableHead, { children: "Path" }), _jsx(TableHead, { className: "w-[80px]", children: "Status" }), _jsx(TableHead, { className: "w-[70px] text-right", children: "ms" })] }) }), _jsx(TableBody, { children: filtered.map((ev) => (_jsxs(_Fragment, { children: [_jsxs(TableRow, { className: cn('cursor-pointer hover:bg-muted/50', expanded === ev.requestId && 'bg-muted/40'), onClick: () => setExpanded((prev) => (prev === ev.requestId ? null : ev.requestId)), children: [_jsx(TableCell, { className: "font-mono text-xs text-muted-foreground whitespace-nowrap", children: formatTs(ev.timestamp) }), _jsx(TableCell, { children: _jsx(MethodBadge, { method: ev.method }) }), _jsxs(TableCell, { className: "font-mono text-xs max-w-[320px] truncate", children: [_jsx("span", { className: "text-muted-foreground", children: ev.path }), ev.error && (_jsx("span", { className: "ml-2 text-destructive text-xs", children: ev.error.message }))] }), _jsx(TableCell, { children: _jsx(StatusBadge, { code: ev.statusCode }) }), _jsx(TableCell, { className: "text-right font-mono text-xs text-muted-foreground", children: ev.durationMs })] }, ev.requestId), expanded === ev.requestId && (_jsx(TableRow, { className: "bg-muted/20 hover:bg-muted/20", children: _jsx(TableCell, { colSpan: 5, className: "p-0", children: _jsx("div", { className: "px-4 py-3 font-mono text-xs space-y-1.5", children: _jsxs("div", { className: "grid grid-cols-[120px_1fr] gap-x-4 gap-y-1", children: [_jsx("span", { className: "text-muted-foreground", children: "requestId" }), _jsx("span", { children: ev.requestId }), _jsx("span", { className: "text-muted-foreground", children: "action" }), _jsx("span", { children: ev.action }), ev.collection && (_jsxs(_Fragment, { children: [_jsx("span", { className: "text-muted-foreground", children: "collection" }), _jsx("span", { children: ev.collection })] })), ev.slug && (_jsxs(_Fragment, { children: [_jsx("span", { className: "text-muted-foreground", children: "slug" }), _jsx("span", { children: ev.slug })] })), ev.actor && (_jsxs(_Fragment, { children: [_jsx("span", { className: "text-muted-foreground", children: "actor" }), _jsx("span", { className: "truncate max-w-[300px]", children: ev.actor })] })), ev.error && (_jsxs(_Fragment, { children: [_jsx("span", { className: "text-muted-foreground", children: "error" }), _jsxs("span", { className: "text-destructive", children: [ev.error.code ? `[${ev.error.code}] ` : '', ev.error.message] })] })), ev.response && Object.keys(ev.response).length > 0 && (_jsxs(_Fragment, { children: [_jsx("span", { className: "text-muted-foreground", children: "response" }), _jsx("span", { className: "text-muted-foreground break-all", children: JSON.stringify(ev.response) })] }))] }) }) }) }, `${ev.requestId}-detail`))] }))) })] }))] }));
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=AuditLogViewer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuditLogViewer.js","sourceRoot":"","sources":["../src/AuditLogViewer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export interface ContentManagerProps {
|
|
2
|
+
collection: string;
|
|
3
|
+
/** Override display name. Falls back to capitalised collection key. */
|
|
4
|
+
label?: string;
|
|
5
|
+
/**
|
|
6
|
+
* Called when the user clicks Edit on an entry.
|
|
7
|
+
* Default: navigates to `./{slug}` (Next.js `router.push`).
|
|
8
|
+
*/
|
|
9
|
+
onEdit?: (slug: string) => void;
|
|
10
|
+
className?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Tier 3 — drop-in collection manager.
|
|
14
|
+
*
|
|
15
|
+
* Lists all entries in a collection with create and delete actions.
|
|
16
|
+
*
|
|
17
|
+
* ```tsx
|
|
18
|
+
* import { CollectionManager } from '@airdraft/react-ui'
|
|
19
|
+
*
|
|
20
|
+
* export default function Page({ params }: { params: { collection: string } }) {
|
|
21
|
+
* return <CollectionManager collection={params.collection} />
|
|
22
|
+
* }
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export declare function ContentManager({ collection, label, onEdit, className }: ContentManagerProps): import("react/jsx-runtime").JSX.Element;
|
|
26
|
+
//# sourceMappingURL=CollectionManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CollectionManager.d.ts","sourceRoot":"","sources":["../src/CollectionManager.tsx"],"names":[],"mappings":"AAsBA,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAA;IAClB,uEAAuE;IACvE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;;;OAGG;IACH,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAyDD;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,mBAAmB,2CAqH3F"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState, useCallback } from 'react';
|
|
4
|
+
import { useEntries, useMutateEntry, useAirdraftClient } 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
|
+
import { Table, TableBody, TableHead, TableHeader, TableRow, } from './ui/table.js';
|
|
9
|
+
import { PageHeader } from './components/PageHeader.js';
|
|
10
|
+
import { EmptyState } from './components/EmptyState.js';
|
|
11
|
+
import { EntryRow } from './components/EntryRow.js';
|
|
12
|
+
import { FileText, Plus, X } from 'lucide-react';
|
|
13
|
+
import { cn } from './lib/utils.js';
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// New-entry inline form
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
function NewEntryForm({ onDone, onCreate, creating, }) {
|
|
18
|
+
const [title, setTitle] = useState('');
|
|
19
|
+
const [error, setError] = useState(null);
|
|
20
|
+
async function handleSubmit(e) {
|
|
21
|
+
e.preventDefault();
|
|
22
|
+
if (!title.trim()) {
|
|
23
|
+
setError('Title is required');
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
try {
|
|
27
|
+
await onCreate({ title: title.trim() });
|
|
28
|
+
onDone();
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
setError(err instanceof Error ? err.message : 'Failed to create entry.');
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
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: "Title" }), _jsx(Input, { id: "new-entry-title", value: title, onChange: (e) => { setTitle(e.target.value); setError(null); }, placeholder: "New entry title", className: "h-8 text-sm", autoFocus: true }), error && _jsx("p", { className: "text-xs text-destructive", children: error })] }), _jsx(Button, { type: "submit", size: "sm", disabled: creating, children: 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" }) })] }));
|
|
35
|
+
}
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
// CollectionManager
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
/**
|
|
40
|
+
* Tier 3 — drop-in collection manager.
|
|
41
|
+
*
|
|
42
|
+
* Lists all entries in a collection with create and delete actions.
|
|
43
|
+
*
|
|
44
|
+
* ```tsx
|
|
45
|
+
* import { CollectionManager } from '@airdraft/react-ui'
|
|
46
|
+
*
|
|
47
|
+
* export default function Page({ params }: { params: { collection: string } }) {
|
|
48
|
+
* return <CollectionManager collection={params.collection} />
|
|
49
|
+
* }
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
export function ContentManager({ collection, label, onEdit, className }) {
|
|
53
|
+
const client = useAirdraftClient();
|
|
54
|
+
const { entries, loading, error, refresh } = useEntries(collection);
|
|
55
|
+
const { createEntry, deleteEntry, creating, deleting } = useMutateEntry(collection);
|
|
56
|
+
const [showNew, setShowNew] = useState(false);
|
|
57
|
+
const [deletingSlug, setDeletingSlug] = useState(null);
|
|
58
|
+
const displayLabel = label ?? collection.charAt(0).toUpperCase() + collection.slice(1);
|
|
59
|
+
// Detect publish-enabled collection via schema
|
|
60
|
+
const [hasPublish, setHasPublish] = useState(false);
|
|
61
|
+
const [titleField, setTitleField] = useState('title');
|
|
62
|
+
useState(() => {
|
|
63
|
+
client.getSchema().then((schema) => {
|
|
64
|
+
const col = schema.collections[collection];
|
|
65
|
+
if (col) {
|
|
66
|
+
setHasPublish(Boolean(col.publish));
|
|
67
|
+
if (col.slugSource)
|
|
68
|
+
setTitleField(col.slugSource);
|
|
69
|
+
}
|
|
70
|
+
}).catch(() => undefined);
|
|
71
|
+
});
|
|
72
|
+
const handleDelete = useCallback(async (entry) => {
|
|
73
|
+
const sha = entry.meta?.sha;
|
|
74
|
+
if (!sha)
|
|
75
|
+
return;
|
|
76
|
+
setDeletingSlug(entry.slug);
|
|
77
|
+
try {
|
|
78
|
+
await deleteEntry(entry.slug, sha);
|
|
79
|
+
refresh();
|
|
80
|
+
}
|
|
81
|
+
finally {
|
|
82
|
+
setDeletingSlug(null);
|
|
83
|
+
}
|
|
84
|
+
}, [deleteEntry, refresh]);
|
|
85
|
+
const handleEdit = useCallback((entry) => {
|
|
86
|
+
if (onEdit) {
|
|
87
|
+
onEdit(entry.slug);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
window.location.href = `./${collection}/${entry.slug}`;
|
|
91
|
+
}
|
|
92
|
+
}, [onEdit, collection]);
|
|
93
|
+
const handleCreate = useCallback(async (data) => {
|
|
94
|
+
const entry = await createEntry(data);
|
|
95
|
+
refresh();
|
|
96
|
+
return entry;
|
|
97
|
+
}, [createEntry, refresh]);
|
|
98
|
+
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 })), loading ? (_jsx("p", { className: "text-sm text-muted-foreground", children: "Loading\u2026" })) : error ? (_jsxs("div", { className: "space-y-2", children: [_jsx("p", { className: "text-sm text-destructive", children: error.message }), _jsx(Button, { variant: "outline", size: "sm", onClick: refresh, children: "Retry" })] })) : 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))) })] }))] }));
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=CollectionManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CollectionManager.js","sourceRoot":"","sources":["../src/CollectionManager.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { CollectionConfig } from '@airdraft/core';
|
|
2
|
+
export interface CollectionsIndexProps {
|
|
3
|
+
/**
|
|
4
|
+
* Called when the user clicks a collection card.
|
|
5
|
+
* Default: navigates to `./collections/{name}`.
|
|
6
|
+
*/
|
|
7
|
+
onSelect?: (name: string, config: CollectionConfig) => void;
|
|
8
|
+
className?: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Tier 3 — collections index / landing page.
|
|
12
|
+
*
|
|
13
|
+
* Lists all collections from the schema as cards. Clicking one navigates to
|
|
14
|
+
* its content manager (via `onSelect` or the default `./collections/{name}` route).
|
|
15
|
+
*
|
|
16
|
+
* ```tsx
|
|
17
|
+
* import { CollectionsIndex } from '@airdraft/react-ui'
|
|
18
|
+
*
|
|
19
|
+
* export default function CmsPage() {
|
|
20
|
+
* return <CollectionsIndex />
|
|
21
|
+
* }
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export declare function CollectionsIndex({ onSelect, className }: CollectionsIndexProps): import("react/jsx-runtime").JSX.Element;
|
|
25
|
+
//# sourceMappingURL=CollectionsIndex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CollectionsIndex.d.ts","sourceRoot":"","sources":["../src/CollectionsIndex.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAStD,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAA;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AA8CD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,qBAAqB,2CAqD9E"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { useCallback } from 'react';
|
|
4
|
+
import { useSchemaEditor } from '@airdraft/react';
|
|
5
|
+
import { Button } from './ui/button.js';
|
|
6
|
+
import { PageHeader } from './components/PageHeader.js';
|
|
7
|
+
import { EmptyState } from './components/EmptyState.js';
|
|
8
|
+
import { ErrorAlert } from './components/ErrorAlert.js';
|
|
9
|
+
import { FileText, ChevronRight, Hash, LayoutList } from 'lucide-react';
|
|
10
|
+
import { cn } from './lib/utils.js';
|
|
11
|
+
function CollectionCard({ name, config, onClick, }) {
|
|
12
|
+
const fieldCount = Object.keys(config.fields).length;
|
|
13
|
+
return (_jsxs(Button, { onClick: onClick, className: "w-full text-left flex items-center gap-4 border bg-card h-auto p-3 hover:bg-accent/50 transition-colors group", children: [_jsx("div", { className: "flex h-9 w-9 shrink-0 items-center justify-center rounded-xl bg-muted", children: _jsx(LayoutList, { className: "h-4 w-4 text-muted-foreground" }) }), _jsxs("div", { className: "flex-1 min-w-0", children: [_jsx("p", { className: "font-medium text-sm truncate", children: config.label ?? name.charAt(0).toUpperCase() + name.slice(1) }), _jsxs("p", { className: "text-xs text-muted-foreground flex truncate text-ellipsis items-center gap-2 mt-0.5", children: [_jsxs("span", { className: "flex items-center gap-1", children: [_jsx(Hash, { className: "h-3 w-3" }), name] }), _jsx("span", { children: "\u00B7" }), _jsxs("span", { children: [fieldCount, " field", fieldCount === 1 ? '' : 's'] }), _jsx("span", { children: "\u00B7" }), _jsx("span", { className: "font-mono", children: config.format }), config.publish && (_jsxs(_Fragment, { children: [_jsx("span", { children: "\u00B7" }), _jsx("span", { className: "text-emerald-600 truncate", children: "publish enabled" })] }))] })] }), _jsx(ChevronRight, { className: "h-4 w-4 text-muted-foreground shrink-0 group-hover:translate-x-0.5 transition-transform" })] }));
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Tier 3 — collections index / landing page.
|
|
17
|
+
*
|
|
18
|
+
* Lists all collections from the schema as cards. Clicking one navigates to
|
|
19
|
+
* its content manager (via `onSelect` or the default `./collections/{name}` route).
|
|
20
|
+
*
|
|
21
|
+
* ```tsx
|
|
22
|
+
* import { CollectionsIndex } from '@airdraft/react-ui'
|
|
23
|
+
*
|
|
24
|
+
* export default function CmsPage() {
|
|
25
|
+
* return <CollectionsIndex />
|
|
26
|
+
* }
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export function CollectionsIndex({ onSelect, className }) {
|
|
30
|
+
const { collections, loading, error, refresh } = useSchemaEditor();
|
|
31
|
+
const handleSelect = useCallback((name, config) => {
|
|
32
|
+
if (onSelect) {
|
|
33
|
+
onSelect(name, config);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
window.location.href = `./collections/${name}`;
|
|
37
|
+
}
|
|
38
|
+
}, [onSelect]);
|
|
39
|
+
const entries = collections ? Object.entries(collections) : [];
|
|
40
|
+
return (_jsxs("div", { className: cn('space-y-4', className), children: [_jsx(PageHeader, { title: "Content", description: loading ? 'Loading…' : `${entries.length} collection${entries.length === 1 ? '' : 's'}` }), loading ? (_jsx("div", { className: "space-y-2", children: [1, 2, 3].map((i) => (_jsx("div", { className: "h-16 rounded-lg border bg-muted/30 animate-pulse" }, i))) })) : error ? (_jsx(ErrorAlert, { error: error, title: "Failed to load entries", onRetry: refresh, className: "mt-2" })) : entries.length === 0 ? (_jsx(EmptyState, { icon: _jsx(FileText, { className: "h-10 w-10" }), title: "No collections", description: "Define collections in your airdraft config or use the Schema editor to create them." })) : (_jsx("div", { className: "space-y-2", children: entries.map(([name, config]) => (_jsx(CollectionCard, { name: name, config: config, onClick: () => handleSelect(name, config) }, name))) }))] }));
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=CollectionsIndex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CollectionsIndex.js","sourceRoot":"","sources":["../src/CollectionsIndex.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export interface ContentManagerProps {
|
|
2
|
+
collection: string;
|
|
3
|
+
/** Override display name. Falls back to capitalised collection key. */
|
|
4
|
+
label?: string;
|
|
5
|
+
/**
|
|
6
|
+
* Called when the user clicks Edit on an entry.
|
|
7
|
+
* Default: navigates to `./{slug}` (Next.js `router.push`).
|
|
8
|
+
*/
|
|
9
|
+
onEdit?: (slug: string) => void;
|
|
10
|
+
className?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Tier 3 — drop-in content manager for a single collection.
|
|
14
|
+
*
|
|
15
|
+
* Lists entries in the given collection with create and delete actions.
|
|
16
|
+
*
|
|
17
|
+
* ```tsx
|
|
18
|
+
* import { ContentManager } from '@airdraft/react-ui'
|
|
19
|
+
*
|
|
20
|
+
* export default function Page({ params }: { params: { collection: string } }) {
|
|
21
|
+
* return <ContentManager collection={params.collection} />
|
|
22
|
+
* }
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export declare function ContentManager({ collection, label, onEdit, className }: ContentManagerProps): import("react/jsx-runtime").JSX.Element;
|
|
26
|
+
//# sourceMappingURL=ContentManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContentManager.d.ts","sourceRoot":"","sources":["../src/ContentManager.tsx"],"names":[],"mappings":"AAwBA,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAA;IAClB,uEAAuE;IACvE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;;;OAGG;IACH,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AA6DD;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,mBAAmB,2CA4H3F"}
|