@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,90 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from 'react';
|
|
4
|
+
import { useTeam } 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 { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from './ui/select.js';
|
|
10
|
+
import { Table, TableBody, TableHead, TableHeader, TableRow, } from './ui/table.js';
|
|
11
|
+
import { PageHeader } from './components/PageHeader.js';
|
|
12
|
+
import { EmptyState } from './components/EmptyState.js';
|
|
13
|
+
import { MemberRow } from './components/MemberRow.js';
|
|
14
|
+
import { InviteRow } from './components/InviteRow.js';
|
|
15
|
+
import { ErrorAlert } from './components/ErrorAlert.js';
|
|
16
|
+
import { Users, UserPlus, X } from 'lucide-react';
|
|
17
|
+
import { cn } from './lib/utils.js';
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
// Invite form
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
function InviteForm({ onDone, onInvite, inviting, }) {
|
|
22
|
+
const [email, setEmail] = useState('');
|
|
23
|
+
const [role, setRole] = useState('editor');
|
|
24
|
+
const [error, setError] = useState(null);
|
|
25
|
+
async function handleSubmit(e) {
|
|
26
|
+
e.preventDefault();
|
|
27
|
+
if (!email.trim()) {
|
|
28
|
+
setError('Email is required');
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
await onInvite(email.trim(), role);
|
|
33
|
+
onDone();
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
setError(err instanceof Error ? err.message : 'Failed to send invite.');
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return (_jsxs("form", { onSubmit: handleSubmit, className: "flex flex-wrap items-end gap-2 rounded-lg border bg-muted/30 p-3", children: [_jsxs("div", { className: "flex-1 min-w-45 space-y-1", children: [_jsx(Label, { htmlFor: "invite-email", className: "text-xs", children: "Email" }), _jsx(Input, { id: "invite-email", type: "email", value: email, onChange: (e) => { setEmail(e.target.value); setError(null); }, placeholder: "team@example.com", className: "h-8 text-sm", autoFocus: true })] }), _jsxs("div", { className: "space-y-1", children: [_jsx(Label, { htmlFor: "invite-role", className: "text-xs", children: "Role" }), _jsxs(Select, { value: role, onValueChange: (v) => setRole(v), children: [_jsx(SelectTrigger, { id: "invite-role", className: "h-8 w-28 text-xs", children: _jsx(SelectValue, {}) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "admin", children: "Admin" }), _jsx(SelectItem, { value: "publisher", children: "Publisher" }), _jsx(SelectItem, { value: "editor", children: "Editor" })] })] })] }), _jsxs(Button, { type: "submit", size: "sm", disabled: inviting, children: [_jsx(Loader, { loading: inviting, className: "size-3.5" }), inviting ? 'Sending…' : 'Send invite'] }), _jsx(Button, { type: "button", variant: "ghost", size: "icon", className: "h-8 w-8", onClick: onDone, children: _jsx(X, { className: "h-4 w-4" }) }), error && _jsx(ErrorAlert, { error: error, compact: true, className: "w-full" })] }));
|
|
40
|
+
}
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
// TeamManager
|
|
43
|
+
// ---------------------------------------------------------------------------
|
|
44
|
+
/**
|
|
45
|
+
* Tier 3 — drop-in team manager.
|
|
46
|
+
*
|
|
47
|
+
* Lists team members and pending invites. Requires admin role to manage.
|
|
48
|
+
*
|
|
49
|
+
* ```tsx
|
|
50
|
+
* import { TeamManager } from '@airdraft/react-ui'
|
|
51
|
+
*
|
|
52
|
+
* export default function TeamPage() {
|
|
53
|
+
* return <TeamManager />
|
|
54
|
+
* }
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
// Inner component — only rendered (and therefore only fetches) when the user is admin.
|
|
58
|
+
function TeamManagerAdmin({ className, inviteBasePath, currentUserEmail }) {
|
|
59
|
+
const { users, invites, loading, error, refresh, inviting, createInvite, revokeInvite, changeRole, removeUser } = useTeam();
|
|
60
|
+
const [showInvite, setShowInvite] = useState(false);
|
|
61
|
+
const [removingId, setRemovingId] = useState(null);
|
|
62
|
+
const [revokingToken, setRevokingToken] = useState(null);
|
|
63
|
+
const basePath = inviteBasePath ?? (typeof window !== 'undefined' ? window.location.origin : '');
|
|
64
|
+
const handleRemove = async (userId) => {
|
|
65
|
+
setRemovingId(userId);
|
|
66
|
+
try {
|
|
67
|
+
await removeUser(userId);
|
|
68
|
+
}
|
|
69
|
+
finally {
|
|
70
|
+
setRemovingId(null);
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
const handleRevoke = async (token) => {
|
|
74
|
+
setRevokingToken(token);
|
|
75
|
+
try {
|
|
76
|
+
await revokeInvite(token);
|
|
77
|
+
}
|
|
78
|
+
finally {
|
|
79
|
+
setRevokingToken(null);
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
return (_jsxs("div", { className: cn('space-y-6', className), children: [_jsx(PageHeader, { title: "Team", description: `${users.length} member${users.length === 1 ? '' : 's'}`, actions: !showInvite && (_jsxs(Button, { size: "sm", onClick: () => setShowInvite(true), children: [_jsx(UserPlus, { className: "mr-1.5 h-3.5 w-3.5" }), "Invite member"] })) }), showInvite && (_jsx(InviteForm, { onDone: () => setShowInvite(false), onInvite: createInvite, inviting: inviting })), loading ? (_jsx("div", { className: "flex justify-center py-8", children: _jsx(Loader, {}) })) : error ? (_jsx(ErrorAlert, { error: error, title: "Failed to load team", onRetry: refresh })) : (_jsxs(_Fragment, { children: [users.length === 0 ? (_jsx(EmptyState, { icon: _jsx(Users, { className: "h-10 w-10" }), title: "No team members", description: "Invite your first team member to get started." })) : (_jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: "Member" }), _jsx(TableHead, { children: "Role" }), _jsx(TableHead, { children: "Joined" }), _jsx(TableHead, {})] }) }), _jsx(TableBody, { children: users.map((u) => (_jsx(MemberRow, { user: u, currentUserEmail: currentUserEmail, canManage: true, onRemove: handleRemove, removing: removingId === u.id }, u.id))) })] })), invites.length > 0 && (_jsxs("div", { className: "space-y-2", children: [_jsx("h3", { className: "text-sm font-medium text-muted-foreground", children: "Pending invites" }), _jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: "Email" }), _jsx(TableHead, { children: "Role" }), _jsx(TableHead, { children: "Expires" }), _jsx(TableHead, {})] }) }), _jsx(TableBody, { children: invites.map((inv) => (_jsx(InviteRow, { invite: inv, inviteBasePath: basePath, canManage: true, revoking: revokingToken === inv.token }, inv.token))) })] })] }))] }))] }));
|
|
83
|
+
}
|
|
84
|
+
export function TeamManager({ className, inviteBasePath, isAdmin = true, currentUserEmail }) {
|
|
85
|
+
if (!isAdmin) {
|
|
86
|
+
return (_jsxs("div", { className: cn('space-y-6', className), children: [_jsx(PageHeader, { title: "Team", description: "" }), _jsx(EmptyState, { icon: _jsx(Users, { className: "h-10 w-10" }), title: "Access restricted", description: "Only admins can manage team members." })] }));
|
|
87
|
+
}
|
|
88
|
+
return (_jsx(TeamManagerAdmin, { className: className, inviteBasePath: inviteBasePath, currentUserEmail: currentUserEmail }));
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=TeamManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TeamManager.js","sourceRoot":"","sources":["../src/TeamManager.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface CmsAdminHeaderProps {
|
|
2
|
+
/** The authenticated CMS user. Omit when running in API-key mode or when
|
|
3
|
+
* the user is not yet known — the user menu is hidden in that case. */
|
|
4
|
+
user?: {
|
|
5
|
+
email: string;
|
|
6
|
+
name?: string;
|
|
7
|
+
} | null;
|
|
8
|
+
onLogout?: () => void;
|
|
9
|
+
}
|
|
10
|
+
export declare function CmsAdminHeader({ user, onLogout }: CmsAdminHeaderProps): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
//# sourceMappingURL=CmsAdminHeader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CmsAdminHeader.d.ts","sourceRoot":"","sources":["../../src/components/CmsAdminHeader.tsx"],"names":[],"mappings":"AA4HA,MAAM,WAAW,mBAAmB;IAClC;4EACwE;IACxE,IAAI,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC/C,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;AAED,wBAAgB,cAAc,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,mBAAmB,2CA8CrE"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import Link from "next/link";
|
|
4
|
+
import Image from "next/image";
|
|
5
|
+
import { usePathname } from "next/navigation";
|
|
6
|
+
import { PageHeader } from "../ui/aevr/page-header.js";
|
|
7
|
+
import { NavUser } from "../ui/aevr/nav-user.js";
|
|
8
|
+
import { SearchCommand } from "../ui/aevr/search-command.js";
|
|
9
|
+
import { ActivityIcon, Code2Icon, ImageIcon, LayoutListIcon, SettingsIcon, UsersIcon, } from "lucide-react";
|
|
10
|
+
// ── Segment config for CMS breadcrumbs ───────────────────────────────────────
|
|
11
|
+
// The "cms" segment itself is skipped so breadcrumbs start from the sub-route.
|
|
12
|
+
const CMS_SEGMENT_CONFIG = {
|
|
13
|
+
collections: {
|
|
14
|
+
label: "Content",
|
|
15
|
+
shortLabel: "Content",
|
|
16
|
+
icon: LayoutListIcon,
|
|
17
|
+
},
|
|
18
|
+
media: { label: "Media", shortLabel: "Media", icon: ImageIcon },
|
|
19
|
+
settings: { label: "Settings", shortLabel: "Settings", icon: SettingsIcon },
|
|
20
|
+
schema: { label: "Schema", shortLabel: "Schema", icon: Code2Icon },
|
|
21
|
+
team: { label: "Team", shortLabel: "Team", icon: UsersIcon },
|
|
22
|
+
audit: { label: "Audit Log", shortLabel: "Audit", icon: ActivityIcon },
|
|
23
|
+
};
|
|
24
|
+
// ── Search command config ─────────────────────────────────────────────────────
|
|
25
|
+
const CMS_SEARCH_GROUPS = [
|
|
26
|
+
{
|
|
27
|
+
heading: "Navigation",
|
|
28
|
+
entries: [
|
|
29
|
+
{
|
|
30
|
+
title: "Content",
|
|
31
|
+
description: "Manage collection entries",
|
|
32
|
+
href: "/cms",
|
|
33
|
+
icon: LayoutListIcon,
|
|
34
|
+
shortcut: "gc",
|
|
35
|
+
keywords: ["content", "entries", "collections"],
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
title: "Media",
|
|
39
|
+
description: "Upload and browse media files",
|
|
40
|
+
href: "/cms/media",
|
|
41
|
+
icon: ImageIcon,
|
|
42
|
+
shortcut: "gm",
|
|
43
|
+
keywords: ["media", "images", "files", "uploads"],
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
title: "Schema",
|
|
47
|
+
description: "Edit content schema and fields",
|
|
48
|
+
href: "/cms/settings/schema",
|
|
49
|
+
icon: Code2Icon,
|
|
50
|
+
shortcut: "gs",
|
|
51
|
+
keywords: ["schema", "fields", "types"],
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
title: "Team",
|
|
55
|
+
description: "Manage team members and invites",
|
|
56
|
+
href: "/cms/settings/team",
|
|
57
|
+
icon: UsersIcon,
|
|
58
|
+
shortcut: "gt",
|
|
59
|
+
keywords: ["team", "users", "members", "invites"],
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
title: "Audit Log",
|
|
63
|
+
description: "View content activity history",
|
|
64
|
+
href: "/cms/settings/audit",
|
|
65
|
+
icon: ActivityIcon,
|
|
66
|
+
keywords: ["audit", "log", "activity", "history"],
|
|
67
|
+
},
|
|
68
|
+
],
|
|
69
|
+
},
|
|
70
|
+
];
|
|
71
|
+
const CMS_KEY_SEQUENCES = {
|
|
72
|
+
gc: "/cms",
|
|
73
|
+
gm: "/cms/media",
|
|
74
|
+
gs: "/cms/settings/schema",
|
|
75
|
+
gt: "/cms/settings/team",
|
|
76
|
+
};
|
|
77
|
+
// ── Primary nav items ─────────────────────────────────────────────────────────
|
|
78
|
+
const NAV_ITEMS = [
|
|
79
|
+
{
|
|
80
|
+
href: "/cms",
|
|
81
|
+
label: "Content",
|
|
82
|
+
match: (p) => p === "/cms" || p.startsWith("/cms/collections"),
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
href: "/cms/media",
|
|
86
|
+
label: "Media",
|
|
87
|
+
match: (p) => p.startsWith("/cms/media"),
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
href: "/cms/settings/schema",
|
|
91
|
+
label: "Schema",
|
|
92
|
+
match: (p) => p.startsWith("/cms/settings/schema"),
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
href: "/cms/settings/team",
|
|
96
|
+
label: "Team",
|
|
97
|
+
match: (p) => p.startsWith("/cms/settings/team"),
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
href: "/cms/settings/audit",
|
|
101
|
+
label: "Audit",
|
|
102
|
+
match: (p) => p.startsWith("/cms/settings/audit"),
|
|
103
|
+
},
|
|
104
|
+
];
|
|
105
|
+
export function CmsAdminHeader({ user, onLogout }) {
|
|
106
|
+
const pathname = usePathname();
|
|
107
|
+
const navUser = user
|
|
108
|
+
? {
|
|
109
|
+
displayName: user.name ?? user.email.split("@")[0],
|
|
110
|
+
email: user.email,
|
|
111
|
+
}
|
|
112
|
+
: null;
|
|
113
|
+
return (_jsx(PageHeader, { segmentConfig: CMS_SEGMENT_CONFIG, skipSegments: ["cms"], logoSlot: _jsxs(Link, { href: "/cms", className: "text-sm flex items-center gap-2 font-semibold whitespace-nowrap", children: [_jsx(Image, { src: "https://aevr.online/favicon.ico", alt: "Airdraft", width: 24, height: 24, className: "rounded-full" }), "Airdraft"] }), searchSlot: _jsx(SearchCommand, { groups: CMS_SEARCH_GROUPS, keySequenceRoutes: CMS_KEY_SEQUENCES, triggerLabel: "Search...", storageKey: "cms:search:recent" }), userSlot: navUser && (_jsx(NavUser, { variant: "header", user: navUser, onLogout: onLogout })), options: {
|
|
114
|
+
showBreadcrumbs: true,
|
|
115
|
+
showThemeToggle: true,
|
|
116
|
+
showSearch: true,
|
|
117
|
+
} }));
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=CmsAdminHeader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CmsAdminHeader.js","sourceRoot":"","sources":["../../src/components/CmsAdminHeader.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface ConfirmDialogProps {
|
|
2
|
+
/** The trigger element — or omit to control `open` externally. */
|
|
3
|
+
trigger?: React.ReactNode;
|
|
4
|
+
/** Controlled open state (use with `onOpenChange`). */
|
|
5
|
+
open?: boolean;
|
|
6
|
+
onOpenChange?: (open: boolean) => void;
|
|
7
|
+
title: string;
|
|
8
|
+
description: string;
|
|
9
|
+
/** Label for the confirm button. Default: "Confirm" */
|
|
10
|
+
confirmLabel?: string;
|
|
11
|
+
/** Label for the cancel button. Default: "Cancel" */
|
|
12
|
+
cancelLabel?: string;
|
|
13
|
+
/** Applies destructive (red) styling to the confirm button. Default: true */
|
|
14
|
+
destructive?: boolean;
|
|
15
|
+
onConfirm: () => void;
|
|
16
|
+
loading?: boolean;
|
|
17
|
+
}
|
|
18
|
+
export declare function ConfirmDialog({ trigger, open, onOpenChange, title, description, confirmLabel, cancelLabel, destructive, onConfirm, loading, }: ConfirmDialogProps): import("react/jsx-runtime").JSX.Element;
|
|
19
|
+
//# sourceMappingURL=ConfirmDialog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfirmDialog.d.ts","sourceRoot":"","sources":["../../src/components/ConfirmDialog.tsx"],"names":[],"mappings":"AAeA,MAAM,WAAW,kBAAkB;IACjC,kEAAkE;IAClE,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,uDAAuD;IACvD,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACtC,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,uDAAuD;IACvD,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,qDAAqD;IACrD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,6EAA6E;IAC7E,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,SAAS,EAAE,MAAM,IAAI,CAAA;IACrB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,wBAAgB,aAAa,CAAC,EAC5B,OAAO,EACP,IAAI,EACJ,YAAY,EACZ,KAAK,EACL,WAAW,EACX,YAAwB,EACxB,WAAsB,EACtB,WAAkB,EAClB,SAAS,EACT,OAAO,GACR,EAAE,kBAAkB,2CAmCpB"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger, } from '../ui/alert-dialog.js';
|
|
4
|
+
import Loader from '../ui/aevr/loader.js';
|
|
5
|
+
export function ConfirmDialog({ trigger, open, onOpenChange, title, description, confirmLabel = 'Confirm', cancelLabel = 'Cancel', destructive = true, onConfirm, loading, }) {
|
|
6
|
+
const content = (_jsxs(AlertDialogContent, { children: [_jsxs(AlertDialogHeader, { children: [_jsx(AlertDialogTitle, { children: title }), _jsx(AlertDialogDescription, { children: description })] }), _jsxs(AlertDialogFooter, { children: [_jsx(AlertDialogCancel, { disabled: loading, children: cancelLabel }), _jsxs(AlertDialogAction, { onClick: onConfirm, disabled: loading, className: destructive ? 'bg-destructive text-destructive-foreground hover:bg-destructive/90' : undefined, children: [_jsx(Loader, { loading: loading, className: "size-3.5" }), loading ? 'Loading…' : confirmLabel] })] })] }));
|
|
7
|
+
if (trigger) {
|
|
8
|
+
return (_jsxs(AlertDialog, { open: open, onOpenChange: onOpenChange, children: [_jsx(AlertDialogTrigger, { asChild: true, children: trigger }), content] }));
|
|
9
|
+
}
|
|
10
|
+
return (_jsx(AlertDialog, { open: open, onOpenChange: onOpenChange, children: content }));
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=ConfirmDialog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfirmDialog.js","sourceRoot":"","sources":["../../src/components/ConfirmDialog.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,MAAM,MAAM,sBAAsB,CAAA;AAoBzC,MAAM,UAAU,aAAa,CAAC,EAC5B,OAAO,EACP,IAAI,EACJ,YAAY,EACZ,KAAK,EACL,WAAW,EACX,YAAY,GAAG,SAAS,EACxB,WAAW,GAAG,QAAQ,EACtB,WAAW,GAAG,IAAI,EAClB,SAAS,EACT,OAAO,GACY;IACnB,MAAM,OAAO,GAAG,CACd,MAAC,kBAAkB,eACjB,MAAC,iBAAiB,eAChB,KAAC,gBAAgB,cAAE,KAAK,GAAoB,EAC5C,KAAC,sBAAsB,cAAE,WAAW,GAA0B,IAC5C,EACpB,MAAC,iBAAiB,eAChB,KAAC,iBAAiB,IAAC,QAAQ,EAAE,OAAO,YAAG,WAAW,GAAqB,EACvE,MAAC,iBAAiB,IAChB,OAAO,EAAE,SAAS,EAClB,QAAQ,EAAE,OAAO,EACjB,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC,oEAAoE,CAAC,CAAC,CAAC,SAAS,aAEzG,KAAC,MAAM,IAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAC,UAAU,GAAG,EAChD,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,IAClB,IACF,IACD,CACtB,CAAA;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CACL,MAAC,WAAW,IAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,aACjD,KAAC,kBAAkB,IAAC,OAAO,kBAAE,OAAO,GAAsB,EACzD,OAAO,IACI,CACf,CAAA;IACH,CAAC;IAED,OAAO,CACL,KAAC,WAAW,IAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,YAChD,OAAO,GACI,CACf,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface EmptyStateProps {
|
|
2
|
+
icon?: React.ReactNode;
|
|
3
|
+
title: string;
|
|
4
|
+
description?: string;
|
|
5
|
+
action?: React.ReactNode;
|
|
6
|
+
className?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function EmptyState({ icon, title, description, action, className }: EmptyStateProps): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
//# sourceMappingURL=EmptyState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmptyState.d.ts","sourceRoot":"","sources":["../../src/components/EmptyState.tsx"],"names":[],"mappings":"AAIA,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACtB,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACxB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,UAAU,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,eAAe,2CAW1F"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { cn } from '../lib/utils.js';
|
|
4
|
+
export function EmptyState({ icon, title, description, action, className }) {
|
|
5
|
+
return (_jsxs("div", { className: cn('flex flex-col items-center justify-center gap-3 py-16 text-center', className), children: [icon && _jsx("div", { className: "text-muted-foreground/50", children: icon }), _jsxs("div", { className: "space-y-1", children: [_jsx("p", { className: "text-sm font-medium", children: title }), description && _jsx("p", { className: "text-xs text-muted-foreground", children: description })] }), action] }));
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=EmptyState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmptyState.js","sourceRoot":"","sources":["../../src/components/EmptyState.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAA;AAUpC,MAAM,UAAU,UAAU,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAmB;IACzF,OAAO,CACL,eAAK,SAAS,EAAE,EAAE,CAAC,mEAAmE,EAAE,SAAS,CAAC,aAC/F,IAAI,IAAI,cAAK,SAAS,EAAC,0BAA0B,YAAE,IAAI,GAAO,EAC/D,eAAK,SAAS,EAAC,WAAW,aACxB,YAAG,SAAS,EAAC,qBAAqB,YAAE,KAAK,GAAK,EAC7C,WAAW,IAAI,YAAG,SAAS,EAAC,+BAA+B,YAAE,WAAW,GAAK,IAC1E,EACL,MAAM,IACH,CACP,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Entry } from '@airdraft/core';
|
|
2
|
+
export interface EntryRowProps {
|
|
3
|
+
entry: Entry;
|
|
4
|
+
/** Field name used as the display title. Defaults to 'title'. */
|
|
5
|
+
titleField?: string;
|
|
6
|
+
hasPublish?: boolean;
|
|
7
|
+
onEdit?: (entry: Entry) => void;
|
|
8
|
+
onDelete?: (entry: Entry) => void;
|
|
9
|
+
deleting?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare function EntryRow({ entry, titleField, hasPublish, onEdit, onDelete, deleting }: EntryRowProps): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
//# sourceMappingURL=EntryRow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EntryRow.d.ts","sourceRoot":"","sources":["../../src/components/EntryRow.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAO3C,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,KAAK,CAAA;IACZ,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;IAC/B,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;IACjC,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,wBAAgB,QAAQ,CAAC,EAAE,KAAK,EAAE,UAAoB,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,aAAa,2CAmD9G"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from 'react';
|
|
4
|
+
import { TableCell, TableRow } from '../ui/table.js';
|
|
5
|
+
import { Button } from '../ui/button.js';
|
|
6
|
+
import { StatusBadge } from './StatusBadge.js';
|
|
7
|
+
import { ConfirmDialog } from './ConfirmDialog.js';
|
|
8
|
+
import { Pencil, Trash2 } from 'lucide-react';
|
|
9
|
+
export function EntryRow({ entry, titleField = 'title', hasPublish, onEdit, onDelete, deleting }) {
|
|
10
|
+
const [confirmOpen, setConfirmOpen] = useState(false);
|
|
11
|
+
const title = entry.data?.[titleField] ?? entry.slug;
|
|
12
|
+
const published = Boolean(entry.data?.['published']);
|
|
13
|
+
const publishedAt = entry.data?.['publishedAt'];
|
|
14
|
+
const dateStr = undefined;
|
|
15
|
+
return (_jsxs(TableRow, { children: [_jsx(TableCell, { className: "font-medium", children: title }), _jsx(TableCell, { className: "text-muted-foreground text-xs", children: entry.slug }), hasPublish && (_jsx(TableCell, { children: _jsx(StatusBadge, { published: published, publishedAt: publishedAt }) })), dateStr && (_jsx(TableCell, { className: "text-muted-foreground text-xs", children: dateStr })), _jsx(TableCell, { className: "text-right", children: _jsxs("div", { className: "flex justify-end gap-1", children: [onEdit && (_jsx(Button, { variant: "ghost", size: "icon", className: "h-7 w-7", onClick: () => onEdit(entry), children: _jsx(Pencil, { className: "h-3.5 w-3.5" }) })), onDelete && (_jsx(ConfirmDialog, { trigger: _jsx(Button, { variant: "ghost", size: "icon", className: "h-7 w-7 text-destructive hover:text-destructive", children: _jsx(Trash2, { className: "h-3.5 w-3.5" }) }), open: confirmOpen, onOpenChange: setConfirmOpen, title: "Delete entry", description: `Delete "${title}"? This cannot be undone.`, confirmLabel: "Delete", loading: deleting, onConfirm: () => {
|
|
16
|
+
onDelete(entry);
|
|
17
|
+
setConfirmOpen(false);
|
|
18
|
+
} }))] }) })] }));
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=EntryRow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EntryRow.js","sourceRoot":"","sources":["../../src/components/EntryRow.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEhC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAY7C,MAAM,UAAU,QAAQ,CAAC,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAiB;IAC7G,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAErD,MAAM,KAAK,GAAI,KAAK,CAAC,IAAI,EAAE,CAAC,UAAU,CAAwB,IAAI,KAAK,CAAC,IAAI,CAAA;IAC5E,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,CAAC,CAAA;IACpD,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,aAAa,CAA8B,CAAA;IAE5E,MAAM,OAAO,GAAG,SAAS,CAAA;IAEzB,OAAO,CACL,MAAC,QAAQ,eACP,KAAC,SAAS,IAAC,SAAS,EAAC,aAAa,YAAE,KAAK,GAAa,EACtD,KAAC,SAAS,IAAC,SAAS,EAAC,+BAA+B,YAAE,KAAK,CAAC,IAAI,GAAa,EAC5E,UAAU,IAAI,CACb,KAAC,SAAS,cACR,KAAC,WAAW,IAAC,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,GAAI,GACrD,CACb,EACA,OAAO,IAAI,CACV,KAAC,SAAS,IAAC,SAAS,EAAC,+BAA+B,YAAE,OAAO,GAAa,CAC3E,EACD,KAAC,SAAS,IAAC,SAAS,EAAC,YAAY,YAC/B,eAAK,SAAS,EAAC,wBAAwB,aACpC,MAAM,IAAI,CACT,KAAC,MAAM,IAAC,OAAO,EAAC,OAAO,EAAC,IAAI,EAAC,MAAM,EAAC,SAAS,EAAC,SAAS,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,YAClF,KAAC,MAAM,IAAC,SAAS,EAAC,aAAa,GAAG,GAC3B,CACV,EACA,QAAQ,IAAI,CACX,KAAC,aAAa,IACZ,OAAO,EACL,KAAC,MAAM,IAAC,OAAO,EAAC,OAAO,EAAC,IAAI,EAAC,MAAM,EAAC,SAAS,EAAC,iDAAiD,YAC7F,KAAC,MAAM,IAAC,SAAS,EAAC,aAAa,GAAG,GAC3B,EAEX,IAAI,EAAE,WAAW,EACjB,YAAY,EAAE,cAAc,EAC5B,KAAK,EAAC,cAAc,EACpB,WAAW,EAAE,WAAW,KAAK,2BAA2B,EACxD,YAAY,EAAC,QAAQ,EACrB,OAAO,EAAE,QAAQ,EACjB,SAAS,EAAE,GAAG,EAAE;gCACd,QAAQ,CAAC,KAAK,CAAC,CAAA;gCACf,cAAc,CAAC,KAAK,CAAC,CAAA;4BACvB,CAAC,GACD,CACH,IACG,GACI,IACH,CACZ,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
type ErrorLike = Error | {
|
|
2
|
+
message: string;
|
|
3
|
+
code?: string;
|
|
4
|
+
} | string;
|
|
5
|
+
export interface ErrorAlertProps {
|
|
6
|
+
/** The error to display. Accepts an Error, an object with `message`/`code`, or a plain string. */
|
|
7
|
+
error: ErrorLike;
|
|
8
|
+
/** Heading shown above the message. Defaults to "Something went wrong". */
|
|
9
|
+
title?: string;
|
|
10
|
+
/** Callback for a "Retry" button. Omit to hide the button. */
|
|
11
|
+
onRetry?: () => void;
|
|
12
|
+
/** Render a compact single-line variant (no border/background). Use inside forms. */
|
|
13
|
+
compact?: boolean;
|
|
14
|
+
className?: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* System-wide error display built on the shadcn `Alert` primitive.
|
|
18
|
+
*
|
|
19
|
+
* - **Default**: full `Alert` with icon, title, description, and optional retry button.
|
|
20
|
+
* - **Compact** (`compact`): inline single-line text with icon — use inside forms.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* // Page-level load failure
|
|
24
|
+
* <ErrorAlert error={error} title="Failed to load entries" onRetry={refresh} />
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* // Inline form validation error
|
|
28
|
+
* <ErrorAlert error={mutError} compact />
|
|
29
|
+
*/
|
|
30
|
+
export declare function ErrorAlert({ error, title, onRetry, compact, className }: ErrorAlertProps): import("react/jsx-runtime").JSX.Element;
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=ErrorAlert.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ErrorAlert.d.ts","sourceRoot":"","sources":["../../src/components/ErrorAlert.tsx"],"names":[],"mappings":"AAWA,KAAK,SAAS,GAAG,KAAK,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAAA;AAEpE,MAAM,WAAW,eAAe;IAC9B,kGAAkG;IAClG,KAAK,EAAE,SAAS,CAAA;IAChB,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,qFAAqF;IACrF,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAgBD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,KAA8B,EAAE,OAAO,EAAE,OAAe,EAAE,SAAS,EAAE,EAAE,eAAe,2CAgDzH"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { AlertCircle, RefreshCw } from 'lucide-react';
|
|
4
|
+
import { Alert, AlertTitle, AlertDescription, AlertAction } from '../ui/alert.js';
|
|
5
|
+
import { Button } from '../ui/button.js';
|
|
6
|
+
import { cn } from '../lib/utils.js';
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
// Helpers
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
function toErrorParts(error) {
|
|
11
|
+
if (typeof error === 'string')
|
|
12
|
+
return { message: error };
|
|
13
|
+
const e = error;
|
|
14
|
+
return { message: e.message, code: e.code };
|
|
15
|
+
}
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
// ErrorAlert
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
/**
|
|
20
|
+
* System-wide error display built on the shadcn `Alert` primitive.
|
|
21
|
+
*
|
|
22
|
+
* - **Default**: full `Alert` with icon, title, description, and optional retry button.
|
|
23
|
+
* - **Compact** (`compact`): inline single-line text with icon — use inside forms.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* // Page-level load failure
|
|
27
|
+
* <ErrorAlert error={error} title="Failed to load entries" onRetry={refresh} />
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* // Inline form validation error
|
|
31
|
+
* <ErrorAlert error={mutError} compact />
|
|
32
|
+
*/
|
|
33
|
+
export function ErrorAlert({ error, title = 'Something went wrong', onRetry, compact = false, className }) {
|
|
34
|
+
const { message, code } = toErrorParts(error);
|
|
35
|
+
if (compact) {
|
|
36
|
+
return (_jsxs("p", { className: cn('flex items-start gap-1.5 text-xs text-destructive', className), children: [_jsx(AlertCircle, { className: "mt-px h-3.5 w-3.5 shrink-0" }), _jsxs("span", { children: [code && _jsxs("code", { className: "font-mono mr-1", children: ["[", code, "]"] }), message, onRetry && (_jsx("button", { type: "button", onClick: onRetry, className: "ml-2 underline hover:no-underline", children: "Retry" }))] })] }));
|
|
37
|
+
}
|
|
38
|
+
return (_jsxs(Alert, { variant: "destructive", className: className, children: [_jsx(AlertCircle, {}), _jsx(AlertTitle, { children: title }), _jsxs(AlertDescription, { children: [code && _jsxs("code", { className: "font-mono text-xs mr-1.5", children: ["[", code, "]"] }), message] }), onRetry && (_jsx(AlertAction, { children: _jsxs(Button, { type: "button", variant: "outline", size: "sm", onClick: onRetry, className: "h-6 gap-1.5 px-2 text-xs", children: [_jsx(RefreshCw, { className: "h-3 w-3" }), "Retry"] }) }))] }));
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=ErrorAlert.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ErrorAlert.js","sourceRoot":"","sources":["../../src/components/ErrorAlert.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACrD,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AACjF,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AACxC,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAA;AAoBpC,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,SAAS,YAAY,CAAC,KAAgB;IACpC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;IACxD,MAAM,CAAC,GAAG,KAA2C,CAAA;IACrD,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;AAC7C,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,UAAU,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,sBAAsB,EAAE,OAAO,EAAE,OAAO,GAAG,KAAK,EAAE,SAAS,EAAmB;IACxH,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAA;IAE7C,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CACL,aAAG,SAAS,EAAE,EAAE,CAAC,mDAAmD,EAAE,SAAS,CAAC,aAC9E,KAAC,WAAW,IAAC,SAAS,EAAC,4BAA4B,GAAG,EACtD,2BACG,IAAI,IAAI,gBAAM,SAAS,EAAC,gBAAgB,kBAAG,IAAI,SAAS,EACxD,OAAO,EACP,OAAO,IAAI,CACV,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,OAAO,EAChB,SAAS,EAAC,mCAAmC,sBAGtC,CACV,IACI,IACL,CACL,CAAA;IACH,CAAC;IAED,OAAO,CACL,MAAC,KAAK,IAAC,OAAO,EAAC,aAAa,EAAC,SAAS,EAAE,SAAS,aAC/C,KAAC,WAAW,KAAG,EACf,KAAC,UAAU,cAAE,KAAK,GAAc,EAChC,MAAC,gBAAgB,eACd,IAAI,IAAI,gBAAM,SAAS,EAAC,0BAA0B,kBAAG,IAAI,SAAS,EAClE,OAAO,IACS,EAClB,OAAO,IAAI,CACV,KAAC,WAAW,cACV,MAAC,MAAM,IACL,IAAI,EAAC,QAAQ,EACb,OAAO,EAAC,SAAS,EACjB,IAAI,EAAC,IAAI,EACT,OAAO,EAAE,OAAO,EAChB,SAAS,EAAC,0BAA0B,aAEpC,KAAC,SAAS,IAAC,SAAS,EAAC,SAAS,GAAG,aAE1B,GACG,CACf,IACK,CACT,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type CmsRole } from './RoleBadge.js';
|
|
2
|
+
export interface CmsInvite {
|
|
3
|
+
token: string;
|
|
4
|
+
email: string;
|
|
5
|
+
role: CmsRole;
|
|
6
|
+
expiresAt: number;
|
|
7
|
+
inviteUrl?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface InviteRowProps {
|
|
10
|
+
invite: CmsInvite;
|
|
11
|
+
/** Base URL used to build the invite link when `invite.inviteUrl` is absent. */
|
|
12
|
+
inviteBasePath?: string;
|
|
13
|
+
canManage?: boolean;
|
|
14
|
+
onRevoke?: (token: string) => void;
|
|
15
|
+
revoking?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export declare function InviteRow({ invite, inviteBasePath, canManage, onRevoke, revoking }: InviteRowProps): import("react/jsx-runtime").JSX.Element;
|
|
18
|
+
//# sourceMappingURL=InviteRow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InviteRow.d.ts","sourceRoot":"","sources":["../../src/components/InviteRow.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAa,KAAK,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAIxD,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,OAAO,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,SAAS,CAAA;IACjB,gFAAgF;IAChF,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,wBAAgB,SAAS,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,cAAc,2CA2ElG"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from 'react';
|
|
4
|
+
import { TableCell, TableRow } from '../ui/table.js';
|
|
5
|
+
import { Button } from '../ui/button.js';
|
|
6
|
+
import { RoleBadge } from './RoleBadge.js';
|
|
7
|
+
import { ConfirmDialog } from './ConfirmDialog.js';
|
|
8
|
+
import { Copy, Check, XCircle, Clock } from 'lucide-react';
|
|
9
|
+
export function InviteRow({ invite, inviteBasePath, canManage, onRevoke, revoking }) {
|
|
10
|
+
const [confirmOpen, setConfirmOpen] = useState(false);
|
|
11
|
+
const [copied, setCopied] = useState(false);
|
|
12
|
+
const inviteUrl = invite.inviteUrl ??
|
|
13
|
+
(inviteBasePath ? `${inviteBasePath}/auth/invite/${invite.token}` : null);
|
|
14
|
+
const expiresIn = invite.expiresAt - Math.floor(Date.now() / 1000);
|
|
15
|
+
const hoursLeft = Math.max(0, Math.round(expiresIn / 3600));
|
|
16
|
+
async function copyLink() {
|
|
17
|
+
if (!inviteUrl)
|
|
18
|
+
return;
|
|
19
|
+
await navigator.clipboard.writeText(inviteUrl);
|
|
20
|
+
setCopied(true);
|
|
21
|
+
setTimeout(() => setCopied(false), 2000);
|
|
22
|
+
}
|
|
23
|
+
return (_jsxs(TableRow, { className: "text-muted-foreground", children: [_jsx(TableCell, { children: _jsx("p", { className: "text-sm", children: invite.email }) }), _jsx(TableCell, { children: _jsx(RoleBadge, { role: invite.role }) }), _jsx(TableCell, { className: "text-xs", children: _jsxs("span", { className: "flex items-center gap-1", children: [_jsx(Clock, { className: "h-3 w-3" }), hoursLeft > 0 ? `${hoursLeft}h left` : 'Expired'] }) }), _jsx(TableCell, { className: "text-right", children: _jsxs("div", { className: "flex justify-end gap-1", children: [inviteUrl && (_jsx(Button, { variant: "ghost", size: "icon", className: "h-7 w-7", title: "Copy invite link", onClick: copyLink, children: copied ? _jsx(Check, { className: "h-3.5 w-3.5 text-emerald-600" }) : _jsx(Copy, { className: "h-3.5 w-3.5" }) })), canManage && onRevoke && (_jsx(ConfirmDialog, { trigger: _jsx(Button, { variant: "ghost", size: "icon", className: "h-7 w-7 hover:text-destructive", children: _jsx(XCircle, { className: "h-3.5 w-3.5" }) }), open: confirmOpen, onOpenChange: setConfirmOpen, title: "Revoke invite", description: `Revoke the invite for ${invite.email}?`, confirmLabel: "Revoke", loading: revoking, onConfirm: () => {
|
|
24
|
+
onRevoke(invite.token);
|
|
25
|
+
setConfirmOpen(false);
|
|
26
|
+
} }))] }) })] }));
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=InviteRow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InviteRow.js","sourceRoot":"","sources":["../../src/components/InviteRow.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { MediaItem } from '@airdraft/core';
|
|
2
|
+
export interface MediaCardProps {
|
|
3
|
+
item: MediaItem;
|
|
4
|
+
onDelete?: (item: MediaItem) => void;
|
|
5
|
+
onSelect?: (item: MediaItem) => void;
|
|
6
|
+
deleting?: boolean;
|
|
7
|
+
selected?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare function MediaCard({ item, onDelete, onSelect, deleting, selected }: MediaCardProps): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
//# sourceMappingURL=MediaCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MediaCard.d.ts","sourceRoot":"","sources":["../../src/components/MediaCard.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAO/C,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,SAAS,CAAA;IACf,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAA;IACpC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAA;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAQD,wBAAgB,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,cAAc,2CAmFzF"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from 'react';
|
|
4
|
+
import { Button } from '../ui/button.js';
|
|
5
|
+
import { Item } from '../ui/item.js';
|
|
6
|
+
import { ConfirmDialog } from './ConfirmDialog.js';
|
|
7
|
+
import { Trash2, File, ExternalLink } from 'lucide-react';
|
|
8
|
+
import { cn } from '../lib/utils.js';
|
|
9
|
+
function humanBytes(bytes) {
|
|
10
|
+
if (bytes < 1024)
|
|
11
|
+
return `${bytes} B`;
|
|
12
|
+
if (bytes < 1024 * 1024)
|
|
13
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
14
|
+
return `${(bytes / 1024 / 1024).toFixed(1)} MB`;
|
|
15
|
+
}
|
|
16
|
+
export function MediaCard({ item, onDelete, onSelect, deleting, selected }) {
|
|
17
|
+
const [confirmOpen, setConfirmOpen] = useState(false);
|
|
18
|
+
// Detect images via mimeType, falling back to file extension for items
|
|
19
|
+
// uploaded before MIME type was recorded in the sidecar.
|
|
20
|
+
const isImage = item.mimeType?.startsWith('image/') ||
|
|
21
|
+
/\.(jpe?g|png|webp|gif|svg|avif)$/i.test(item.name ?? item.key ?? '');
|
|
22
|
+
return (_jsxs(Item, { variant: "outline", className: cn('flex-col gap-0 p-0 overflow-hidden', selected && 'ring-2 ring-primary', onSelect && 'cursor-pointer'), onClick: () => onSelect?.(item), children: [_jsxs("div", { className: "relative w-full aspect-square flex-shrink-0 overflow-hidden border-b bg-muted", children: [isImage ? (
|
|
23
|
+
// eslint-disable-next-line @next/next/no-img-element
|
|
24
|
+
_jsx("img", { src: item.url, alt: item.alt ?? item.name, className: "w-full h-full object-cover" })) : (_jsx("div", { className: "flex h-full w-full items-center justify-center", children: _jsx(File, { className: "h-10 w-10 text-muted-foreground" }) })), _jsxs("div", { className: "absolute top-1 right-1 flex gap-1 opacity-0 group-hover/item:opacity-100 transition-opacity", children: [_jsx(Button, { variant: "secondary", size: "icon", asChild: true, onClick: (e) => e.stopPropagation(), children: _jsx("a", { href: item.url, target: "_blank", rel: "noopener noreferrer", children: _jsx(ExternalLink, { className: "size-4" }) }) }), onDelete && (_jsx(ConfirmDialog, { trigger: _jsx(Button, { variant: "secondary", size: "icon", className: "text-destructive hover:text-destructive", onClick: (e) => e.stopPropagation(), children: _jsx(Trash2, { className: "size-4" }) }), open: confirmOpen, onOpenChange: setConfirmOpen, title: "Delete media", description: `Delete "${item.name}"? This cannot be undone.`, confirmLabel: "Delete", loading: deleting, onConfirm: () => {
|
|
25
|
+
onDelete(item);
|
|
26
|
+
setConfirmOpen(false);
|
|
27
|
+
} }))] })] }), _jsxs("div", { className: "flex flex-col gap-0.5 px-2.5 py-2 min-w-0 w-full", children: [_jsx("p", { className: "text-xs font-medium truncate", title: item.name, children: item.name }), item.size != null && (_jsx("p", { className: "text-xs text-muted-foreground", children: humanBytes(item.size) }))] })] }));
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=MediaCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MediaCard.js","sourceRoot":"","sources":["../../src/components/MediaCard.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type CmsRole } from './RoleBadge.js';
|
|
2
|
+
export interface CmsUser {
|
|
3
|
+
id: string;
|
|
4
|
+
email: string;
|
|
5
|
+
name?: string;
|
|
6
|
+
role: CmsRole;
|
|
7
|
+
createdAt: number;
|
|
8
|
+
}
|
|
9
|
+
export interface MemberRowProps {
|
|
10
|
+
user: CmsUser;
|
|
11
|
+
/** Email of the currently logged-in user — disables self-removal. */
|
|
12
|
+
currentUserEmail?: string;
|
|
13
|
+
canManage?: boolean;
|
|
14
|
+
onRoleChange?: (userId: string, role: CmsRole) => void;
|
|
15
|
+
onRemove?: (userId: string) => void;
|
|
16
|
+
removing?: boolean;
|
|
17
|
+
}
|
|
18
|
+
export declare function MemberRow({ user, currentUserEmail, canManage, onRoleChange, onRemove, removing, }: MemberRowProps): import("react/jsx-runtime").JSX.Element;
|
|
19
|
+
//# sourceMappingURL=MemberRow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MemberRow.d.ts","sourceRoot":"","sources":["../../src/components/MemberRow.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAa,KAAK,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAIxD,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,OAAO,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,OAAO,CAAA;IACb,qEAAqE;IACrE,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACtD,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,wBAAgB,SAAS,CAAC,EACxB,IAAI,EACJ,gBAAgB,EAChB,SAAS,EACT,YAAY,EACZ,QAAQ,EACR,QAAQ,GACT,EAAE,cAAc,2CAsEhB"}
|