@actuate-media/cms-admin 0.10.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AdminRoot.d.ts.map +1 -1
- package/dist/AdminRoot.js +8 -5
- package/dist/AdminRoot.js.map +1 -1
- package/dist/__tests__/layout/primitives.test.d.ts +2 -0
- package/dist/__tests__/layout/primitives.test.d.ts.map +1 -0
- package/dist/__tests__/layout/primitives.test.js +34 -0
- package/dist/__tests__/layout/primitives.test.js.map +1 -0
- package/dist/__tests__/lib/cv.test.d.ts +2 -0
- package/dist/__tests__/lib/cv.test.d.ts.map +1 -0
- package/dist/__tests__/lib/cv.test.js +66 -0
- package/dist/__tests__/lib/cv.test.js.map +1 -0
- package/dist/actuate-admin.css +1 -1
- package/dist/assets/actuate-logo.d.ts +36 -0
- package/dist/assets/actuate-logo.d.ts.map +1 -0
- package/dist/assets/actuate-logo.js +15 -0
- package/dist/assets/actuate-logo.js.map +1 -0
- package/dist/components/Breadcrumbs.js +2 -2
- package/dist/components/CommandPalette.js +10 -10
- package/dist/components/ContentOverviewChart.js +3 -3
- package/dist/components/ErrorBoundary.js +1 -1
- package/dist/components/FocalPointPicker.js +2 -2
- package/dist/components/FolderTree.js +20 -20
- package/dist/components/LivePreview.js +3 -3
- package/dist/components/LocaleSwitcher.js +1 -1
- package/dist/components/MediaPickerModal.js +4 -4
- package/dist/components/PresenceIndicator.js +1 -1
- package/dist/components/SEOConfigPanel.d.ts +2 -0
- package/dist/components/SEOConfigPanel.d.ts.map +1 -0
- package/dist/components/SEOConfigPanel.js +174 -0
- package/dist/components/SEOConfigPanel.js.map +1 -0
- package/dist/components/SEOPanel.js +9 -9
- package/dist/components/SEOPerformance.js +2 -2
- package/dist/components/SchedulePublishDialog.js +1 -1
- package/dist/components/SharePreviewLinkDialog.js +1 -1
- package/dist/components/TipTapEditor.js +5 -5
- package/dist/components/VersionHistory.js +2 -2
- package/dist/components/ui/Badge.d.ts +33 -3
- package/dist/components/ui/Badge.d.ts.map +1 -1
- package/dist/components/ui/Badge.js +42 -8
- package/dist/components/ui/Badge.js.map +1 -1
- package/dist/components/ui/Button.d.ts +19 -8
- package/dist/components/ui/Button.d.ts.map +1 -1
- package/dist/components/ui/Button.js +35 -14
- package/dist/components/ui/Button.js.map +1 -1
- package/dist/components/ui/Card.d.ts +26 -0
- package/dist/components/ui/Card.d.ts.map +1 -0
- package/dist/components/ui/Card.js +45 -0
- package/dist/components/ui/Card.js.map +1 -0
- package/dist/components/ui/DataTable.js +1 -1
- package/dist/components/ui/Input.d.ts +15 -0
- package/dist/components/ui/Input.d.ts.map +1 -0
- package/dist/components/ui/Input.js +23 -0
- package/dist/components/ui/Input.js.map +1 -0
- package/dist/components/ui/SearchInput.js +1 -1
- package/dist/components/ui/Select.d.ts +16 -0
- package/dist/components/ui/Select.d.ts.map +1 -0
- package/dist/components/ui/Select.js +25 -0
- package/dist/components/ui/Select.js.map +1 -0
- package/dist/components/ui/Toast.js +1 -1
- package/dist/components/ui/index.d.ts +10 -4
- package/dist/components/ui/index.d.ts.map +1 -1
- package/dist/components/ui/index.js +5 -2
- package/dist/components/ui/index.js.map +1 -1
- package/dist/fields/BlockBuilderField.js +3 -3
- package/dist/fields/DateField.js +1 -1
- package/dist/fields/RelationshipField.js +3 -3
- package/dist/fields/TextField.js +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/layout/Header.js +1 -1
- package/dist/layout/Layout.d.ts +14 -0
- package/dist/layout/Layout.d.ts.map +1 -1
- package/dist/layout/Layout.js +17 -11
- package/dist/layout/Layout.js.map +1 -1
- package/dist/layout/Sidebar.d.ts.map +1 -1
- package/dist/layout/Sidebar.js +21 -11
- package/dist/layout/Sidebar.js.map +1 -1
- package/dist/layout/primitives/AdminShell.d.ts +43 -0
- package/dist/layout/primitives/AdminShell.d.ts.map +1 -0
- package/dist/layout/primitives/AdminShell.js +51 -0
- package/dist/layout/primitives/AdminShell.js.map +1 -0
- package/dist/layout/primitives/Box.d.ts +19 -0
- package/dist/layout/primitives/Box.d.ts.map +1 -0
- package/dist/layout/primitives/Box.js +12 -0
- package/dist/layout/primitives/Box.js.map +1 -0
- package/dist/layout/primitives/Cluster.d.ts +27 -0
- package/dist/layout/primitives/Cluster.d.ts.map +1 -0
- package/dist/layout/primitives/Cluster.js +37 -0
- package/dist/layout/primitives/Cluster.js.map +1 -0
- package/dist/layout/primitives/Grid.d.ts +45 -0
- package/dist/layout/primitives/Grid.d.ts.map +1 -0
- package/dist/layout/primitives/Grid.js +59 -0
- package/dist/layout/primitives/Grid.js.map +1 -0
- package/dist/layout/primitives/PageContainer.d.ts +36 -0
- package/dist/layout/primitives/PageContainer.d.ts.map +1 -0
- package/dist/layout/primitives/PageContainer.js +41 -0
- package/dist/layout/primitives/PageContainer.js.map +1 -0
- package/dist/layout/primitives/Split.d.ts +34 -0
- package/dist/layout/primitives/Split.d.ts.map +1 -0
- package/dist/layout/primitives/Split.js +27 -0
- package/dist/layout/primitives/Split.js.map +1 -0
- package/dist/layout/primitives/Stack.d.ts +23 -0
- package/dist/layout/primitives/Stack.d.ts.map +1 -0
- package/dist/layout/primitives/Stack.js +34 -0
- package/dist/layout/primitives/Stack.js.map +1 -0
- package/dist/layout/primitives/index.d.ts +30 -0
- package/dist/layout/primitives/index.d.ts.map +1 -0
- package/dist/layout/primitives/index.js +22 -0
- package/dist/layout/primitives/index.js.map +1 -0
- package/dist/layout/primitives/tokens.d.ts +48 -0
- package/dist/layout/primitives/tokens.d.ts.map +1 -0
- package/dist/layout/primitives/tokens.js +54 -0
- package/dist/layout/primitives/tokens.js.map +1 -0
- package/dist/lib/cv.d.ts +53 -0
- package/dist/lib/cv.d.ts.map +1 -0
- package/dist/lib/cv.js +39 -0
- package/dist/lib/cv.js.map +1 -0
- package/dist/views/ApiKeys.js +7 -7
- package/dist/views/CollectionList.js +8 -8
- package/dist/views/Dashboard.d.ts.map +1 -1
- package/dist/views/Dashboard.js +333 -78
- package/dist/views/Dashboard.js.map +1 -1
- package/dist/views/DocumentEdit.js +3 -3
- package/dist/views/ForgotPassword.js +2 -2
- package/dist/views/FormEditor.js +5 -5
- package/dist/views/FormSubmissions.js +6 -6
- package/dist/views/Forms.js +2 -2
- package/dist/views/Login.d.ts +16 -1
- package/dist/views/Login.d.ts.map +1 -1
- package/dist/views/Login.js +17 -7
- package/dist/views/Login.js.map +1 -1
- package/dist/views/MediaBrowser.js +16 -16
- package/dist/views/PageEditor.js +2 -2
- package/dist/views/Pages.js +10 -10
- package/dist/views/PostEditor.js +2 -2
- package/dist/views/Posts.js +4 -4
- package/dist/views/Redirects.js +4 -4
- package/dist/views/ResetPassword.js +2 -2
- package/dist/views/SEO.js +6 -6
- package/dist/views/ScriptTagEditor.js +4 -4
- package/dist/views/ScriptTags.js +2 -2
- package/dist/views/Settings.d.ts.map +1 -1
- package/dist/views/Settings.js +9 -8
- package/dist/views/Settings.js.map +1 -1
- package/dist/views/SetupWizard.js +2 -2
- package/dist/views/Users.js +4 -4
- package/dist/views/page-builder/AIBlockAssist.js +1 -1
- package/dist/views/page-builder/AIGenerateDialog.js +10 -10
- package/dist/views/page-builder/BlockEditor.js +10 -10
- package/dist/views/page-builder/BlockPicker.js +4 -4
- package/dist/views/page-builder/BottomBar.js +1 -1
- package/dist/views/page-builder/BuilderToolbar.js +2 -2
- package/dist/views/page-builder/ContextPanel.js +2 -2
- package/dist/views/page-builder/DesignScore.js +9 -9
- package/dist/views/page-builder/NodeSettings.js +8 -8
- package/dist/views/page-builder/PageBuilder.js +3 -3
- package/dist/views/page-builder/PageSettings.js +1 -1
- package/dist/views/page-builder/PageTemplates.js +2 -2
- package/dist/views/page-builder/SEOPanel.js +13 -13
- package/dist/views/page-builder/SavedSections.js +5 -5
- package/dist/views/page-builder/TemplatePicker.js +2 -2
- package/dist/views/page-builder/block-renderers/CTAPreview.js +5 -5
- package/dist/views/page-builder/block-renderers/CardsPreview.js +1 -1
- package/dist/views/page-builder/block-renderers/CodePreview.js +1 -1
- package/dist/views/page-builder/block-renderers/FAQPreview.js +3 -3
- package/dist/views/page-builder/block-renderers/FallbackPreview.js +1 -1
- package/dist/views/page-builder/block-renderers/FormPreview.js +3 -3
- package/dist/views/page-builder/block-renderers/GalleryPreview.js +5 -5
- package/dist/views/page-builder/block-renderers/HeroPreview.js +3 -3
- package/dist/views/page-builder/block-renderers/ImagePreview.js +3 -3
- package/dist/views/page-builder/block-renderers/TextPreview.js +3 -3
- package/dist/views/page-builder/block-renderers/VideoPreview.js +4 -4
- package/dist/views/page-builder/canvas/BlockRenderer.js +1 -1
- package/dist/views/page-builder/canvas/BuilderCanvas.js +3 -3
- package/dist/views/page-builder/canvas/ColumnRenderer.js +2 -2
- package/dist/views/page-builder/canvas/ContainerRenderer.js +2 -2
- package/dist/views/page-builder/canvas/RowRenderer.js +2 -2
- package/dist/views/page-builder/canvas/SectionRenderer.js +2 -2
- package/package.json +6 -2
- package/src/AdminRoot.tsx +21 -11
- package/src/__tests__/layout/primitives.test.ts +37 -0
- package/src/__tests__/lib/cv.test.ts +74 -0
- package/src/assets/actuate-logo.tsx +72 -0
- package/src/components/Breadcrumbs.tsx +6 -6
- package/src/components/CommandPalette.tsx +34 -34
- package/src/components/ContentOverviewChart.tsx +3 -3
- package/src/components/ErrorBoundary.tsx +3 -3
- package/src/components/FocalPointPicker.tsx +4 -4
- package/src/components/FolderTree.tsx +38 -38
- package/src/components/LivePreview.tsx +16 -16
- package/src/components/LocaleSwitcher.tsx +7 -7
- package/src/components/MediaPickerModal.tsx +21 -21
- package/src/components/PresenceIndicator.tsx +2 -2
- package/src/components/SEOConfigPanel.tsx +582 -0
- package/src/components/SEOPanel.tsx +46 -46
- package/src/components/SEOPerformance.tsx +21 -21
- package/src/components/SchedulePublishDialog.tsx +4 -4
- package/src/components/SharePreviewLinkDialog.tsx +1 -1
- package/src/components/TipTapEditor.tsx +33 -33
- package/src/components/VersionHistory.tsx +16 -16
- package/src/components/ui/Badge.tsx +66 -14
- package/src/components/ui/Button.tsx +70 -33
- package/src/components/ui/Card.tsx +101 -0
- package/src/components/ui/DataTable.tsx +1 -1
- package/src/components/ui/Input.tsx +35 -0
- package/src/components/ui/SearchInput.tsx +4 -4
- package/src/components/ui/Select.tsx +56 -0
- package/src/components/ui/Toast.tsx +1 -1
- package/src/components/ui/index.ts +18 -4
- package/src/fields/BlockBuilderField.tsx +3 -3
- package/src/fields/DateField.tsx +1 -1
- package/src/fields/RelationshipField.tsx +10 -10
- package/src/fields/TextField.tsx +1 -1
- package/src/index.ts +28 -0
- package/src/layout/Header.tsx +28 -28
- package/src/layout/Layout.tsx +39 -46
- package/src/layout/Sidebar.tsx +37 -64
- package/src/layout/primitives/AdminShell.tsx +118 -0
- package/src/layout/primitives/Box.tsx +30 -0
- package/src/layout/primitives/Cluster.tsx +74 -0
- package/src/layout/primitives/Grid.tsx +120 -0
- package/src/layout/primitives/PageContainer.tsx +96 -0
- package/src/layout/primitives/Split.tsx +73 -0
- package/src/layout/primitives/Stack.tsx +67 -0
- package/src/layout/primitives/index.ts +36 -0
- package/src/layout/primitives/tokens.ts +76 -0
- package/src/lib/cv.ts +96 -0
- package/src/styles/build-input.css +1 -1
- package/src/views/ApiKeys.tsx +57 -57
- package/src/views/CollectionList.tsx +30 -30
- package/src/views/Dashboard.tsx +737 -186
- package/src/views/DocumentEdit.tsx +9 -9
- package/src/views/ForgotPassword.tsx +18 -18
- package/src/views/FormEditor.tsx +75 -75
- package/src/views/FormSubmissions.tsx +76 -76
- package/src/views/Forms.tsx +27 -27
- package/src/views/Login.tsx +65 -25
- package/src/views/MediaBrowser.tsx +127 -127
- package/src/views/PageEditor.tsx +25 -25
- package/src/views/Pages.tsx +59 -59
- package/src/views/PostEditor.tsx +37 -37
- package/src/views/Posts.tsx +48 -48
- package/src/views/Redirects.tsx +21 -21
- package/src/views/ResetPassword.tsx +28 -28
- package/src/views/SEO.tsx +144 -144
- package/src/views/ScriptTagEditor.tsx +24 -24
- package/src/views/ScriptTags.tsx +10 -10
- package/src/views/Settings.tsx +88 -80
- package/src/views/SetupWizard.tsx +28 -28
- package/src/views/Users.tsx +20 -20
- package/src/views/page-builder/AIBlockAssist.tsx +1 -1
- package/src/views/page-builder/AIGenerateDialog.tsx +63 -63
- package/src/views/page-builder/BlockEditor.tsx +26 -26
- package/src/views/page-builder/BlockPicker.tsx +22 -22
- package/src/views/page-builder/BottomBar.tsx +8 -8
- package/src/views/page-builder/BuilderToolbar.tsx +17 -17
- package/src/views/page-builder/ContextPanel.tsx +3 -3
- package/src/views/page-builder/DesignScore.tsx +21 -21
- package/src/views/page-builder/NodeSettings.tsx +27 -27
- package/src/views/page-builder/PageBuilder.tsx +11 -11
- package/src/views/page-builder/PageSettings.tsx +4 -4
- package/src/views/page-builder/PageTemplates.tsx +18 -18
- package/src/views/page-builder/SEOPanel.tsx +53 -53
- package/src/views/page-builder/SavedSections.tsx +37 -37
- package/src/views/page-builder/TemplatePicker.tsx +17 -17
- package/src/views/page-builder/block-renderers/CTAPreview.tsx +13 -13
- package/src/views/page-builder/block-renderers/CardsPreview.tsx +5 -5
- package/src/views/page-builder/block-renderers/CodePreview.tsx +6 -6
- package/src/views/page-builder/block-renderers/FAQPreview.tsx +13 -13
- package/src/views/page-builder/block-renderers/FallbackPreview.tsx +3 -3
- package/src/views/page-builder/block-renderers/FormPreview.tsx +20 -20
- package/src/views/page-builder/block-renderers/GalleryPreview.tsx +8 -8
- package/src/views/page-builder/block-renderers/HeroPreview.tsx +16 -16
- package/src/views/page-builder/block-renderers/ImagePreview.tsx +4 -4
- package/src/views/page-builder/block-renderers/TextPreview.tsx +14 -14
- package/src/views/page-builder/block-renderers/VideoPreview.tsx +12 -12
- package/src/views/page-builder/canvas/BlockRenderer.tsx +4 -4
- package/src/views/page-builder/canvas/BuilderCanvas.tsx +6 -6
- package/src/views/page-builder/canvas/ColumnRenderer.tsx +3 -3
- package/src/views/page-builder/canvas/ContainerRenderer.tsx +2 -2
- package/src/views/page-builder/canvas/RowRenderer.tsx +2 -2
- package/src/views/page-builder/canvas/SectionRenderer.tsx +2 -2
|
@@ -69,18 +69,18 @@ export function SetupWizard({ onComplete, siteName = 'Actuate CMS' }: SetupWizar
|
|
|
69
69
|
|
|
70
70
|
if (done) {
|
|
71
71
|
return (
|
|
72
|
-
<div className="min-h-screen
|
|
72
|
+
<div className="flex min-h-screen items-center justify-center bg-gray-50 px-4">
|
|
73
73
|
<div className="w-full max-w-md text-center">
|
|
74
|
-
<div className="mx-auto mb-6
|
|
75
|
-
<CheckCircle2 className="
|
|
74
|
+
<div className="mx-auto mb-6 flex h-16 w-16 items-center justify-center rounded-full bg-green-100">
|
|
75
|
+
<CheckCircle2 className="h-8 w-8 text-green-600" />
|
|
76
76
|
</div>
|
|
77
|
-
<h1 className="text-2xl font-bold text-gray-900
|
|
78
|
-
<p className="text-gray-600
|
|
77
|
+
<h1 className="mb-2 text-2xl font-bold text-gray-900">Setup Complete</h1>
|
|
78
|
+
<p className="mb-6 text-gray-600">
|
|
79
79
|
Your admin account has been created. You can now sign in to manage your content.
|
|
80
80
|
</p>
|
|
81
81
|
<button
|
|
82
82
|
onClick={() => window.location.reload()}
|
|
83
|
-
className="w-full px-6 py-3
|
|
83
|
+
className="w-full rounded-lg bg-blue-600 px-6 py-3 font-medium text-white transition-colors hover:bg-blue-700"
|
|
84
84
|
>
|
|
85
85
|
Go to Login
|
|
86
86
|
</button>
|
|
@@ -90,29 +90,29 @@ export function SetupWizard({ onComplete, siteName = 'Actuate CMS' }: SetupWizar
|
|
|
90
90
|
}
|
|
91
91
|
|
|
92
92
|
return (
|
|
93
|
-
<div className="min-h-screen
|
|
93
|
+
<div className="flex min-h-screen items-center justify-center bg-gray-50 px-4">
|
|
94
94
|
<div className="w-full max-w-md">
|
|
95
|
-
<div className="text-center
|
|
96
|
-
<div className="mx-auto mb-4
|
|
97
|
-
<Shield className="
|
|
95
|
+
<div className="mb-8 text-center">
|
|
96
|
+
<div className="mx-auto mb-4 flex h-14 w-14 items-center justify-center rounded-xl bg-blue-600">
|
|
97
|
+
<Shield className="h-7 w-7 text-white" />
|
|
98
98
|
</div>
|
|
99
99
|
<h1 className="text-2xl font-bold text-gray-900">Welcome to {siteName}</h1>
|
|
100
|
-
<p className="text-gray-600
|
|
100
|
+
<p className="mt-2 text-gray-600">Create your admin account to get started</p>
|
|
101
101
|
</div>
|
|
102
102
|
|
|
103
103
|
<form
|
|
104
104
|
onSubmit={handleSubmit}
|
|
105
|
-
className="
|
|
105
|
+
className="space-y-5 rounded-xl border border-gray-200 bg-white p-6 shadow-sm"
|
|
106
106
|
>
|
|
107
107
|
{error && (
|
|
108
|
-
<div className="flex items-start gap-3
|
|
109
|
-
<AlertTriangle className="
|
|
108
|
+
<div className="flex items-start gap-3 rounded-lg border border-red-200 bg-red-50 p-3">
|
|
109
|
+
<AlertTriangle className="mt-0.5 h-5 w-5 shrink-0 text-red-600" />
|
|
110
110
|
<p className="text-sm text-red-800">{error}</p>
|
|
111
111
|
</div>
|
|
112
112
|
)}
|
|
113
113
|
|
|
114
114
|
<div>
|
|
115
|
-
<label htmlFor="setup-name" className="block text-sm font-medium text-gray-700
|
|
115
|
+
<label htmlFor="setup-name" className="mb-1.5 block text-sm font-medium text-gray-700">
|
|
116
116
|
Full Name
|
|
117
117
|
</label>
|
|
118
118
|
<input
|
|
@@ -121,7 +121,7 @@ export function SetupWizard({ onComplete, siteName = 'Actuate CMS' }: SetupWizar
|
|
|
121
121
|
value={name}
|
|
122
122
|
onChange={(e) => setName(e.target.value)}
|
|
123
123
|
placeholder="Jane Smith"
|
|
124
|
-
className="w-full
|
|
124
|
+
className="w-full rounded-lg border border-gray-300 px-3 py-2.5 text-sm focus:border-blue-500 focus:ring-2 focus:ring-blue-500 focus:outline-none"
|
|
125
125
|
required
|
|
126
126
|
autoFocus
|
|
127
127
|
autoComplete="name"
|
|
@@ -129,7 +129,7 @@ export function SetupWizard({ onComplete, siteName = 'Actuate CMS' }: SetupWizar
|
|
|
129
129
|
</div>
|
|
130
130
|
|
|
131
131
|
<div>
|
|
132
|
-
<label htmlFor="setup-email" className="block text-sm font-medium text-gray-700
|
|
132
|
+
<label htmlFor="setup-email" className="mb-1.5 block text-sm font-medium text-gray-700">
|
|
133
133
|
Email Address
|
|
134
134
|
</label>
|
|
135
135
|
<input
|
|
@@ -138,7 +138,7 @@ export function SetupWizard({ onComplete, siteName = 'Actuate CMS' }: SetupWizar
|
|
|
138
138
|
value={email}
|
|
139
139
|
onChange={(e) => setEmail(e.target.value)}
|
|
140
140
|
placeholder="admin@example.com"
|
|
141
|
-
className="w-full
|
|
141
|
+
className="w-full rounded-lg border border-gray-300 px-3 py-2.5 text-sm focus:border-blue-500 focus:ring-2 focus:ring-blue-500 focus:outline-none"
|
|
142
142
|
required
|
|
143
143
|
autoComplete="email"
|
|
144
144
|
/>
|
|
@@ -147,7 +147,7 @@ export function SetupWizard({ onComplete, siteName = 'Actuate CMS' }: SetupWizar
|
|
|
147
147
|
<div>
|
|
148
148
|
<label
|
|
149
149
|
htmlFor="setup-password"
|
|
150
|
-
className="block text-sm font-medium text-gray-700
|
|
150
|
+
className="mb-1.5 block text-sm font-medium text-gray-700"
|
|
151
151
|
>
|
|
152
152
|
Password
|
|
153
153
|
</label>
|
|
@@ -158,7 +158,7 @@ export function SetupWizard({ onComplete, siteName = 'Actuate CMS' }: SetupWizar
|
|
|
158
158
|
value={password}
|
|
159
159
|
onChange={(e) => setPassword(e.target.value)}
|
|
160
160
|
placeholder="Minimum 12 characters"
|
|
161
|
-
className="w-full px-3 py-2.5 pr-10
|
|
161
|
+
className="w-full rounded-lg border border-gray-300 px-3 py-2.5 pr-10 text-sm focus:border-blue-500 focus:ring-2 focus:ring-blue-500 focus:outline-none"
|
|
162
162
|
required
|
|
163
163
|
minLength={12}
|
|
164
164
|
autoComplete="new-password"
|
|
@@ -166,16 +166,16 @@ export function SetupWizard({ onComplete, siteName = 'Actuate CMS' }: SetupWizar
|
|
|
166
166
|
<button
|
|
167
167
|
type="button"
|
|
168
168
|
onClick={() => setShowPassword(!showPassword)}
|
|
169
|
-
className="absolute
|
|
169
|
+
className="absolute top-1/2 right-3 -translate-y-1/2 text-gray-400 hover:text-gray-600"
|
|
170
170
|
tabIndex={-1}
|
|
171
171
|
>
|
|
172
|
-
{showPassword ? <EyeOff className="
|
|
172
|
+
{showPassword ? <EyeOff className="h-4 w-4" /> : <Eye className="h-4 w-4" />}
|
|
173
173
|
</button>
|
|
174
174
|
</div>
|
|
175
175
|
{password && (
|
|
176
176
|
<div className="mt-2">
|
|
177
177
|
<div className="flex items-center gap-2">
|
|
178
|
-
<div className="
|
|
178
|
+
<div className="h-1.5 flex-1 overflow-hidden rounded-full bg-gray-200">
|
|
179
179
|
<div
|
|
180
180
|
className={`h-full rounded-full transition-all ${strength.color}`}
|
|
181
181
|
style={{ width: `${(strength.score / 6) * 100}%` }}
|
|
@@ -190,7 +190,7 @@ export function SetupWizard({ onComplete, siteName = 'Actuate CMS' }: SetupWizar
|
|
|
190
190
|
<div>
|
|
191
191
|
<label
|
|
192
192
|
htmlFor="setup-confirm"
|
|
193
|
-
className="block text-sm font-medium text-gray-700
|
|
193
|
+
className="mb-1.5 block text-sm font-medium text-gray-700"
|
|
194
194
|
>
|
|
195
195
|
Confirm Password
|
|
196
196
|
</label>
|
|
@@ -200,26 +200,26 @@ export function SetupWizard({ onComplete, siteName = 'Actuate CMS' }: SetupWizar
|
|
|
200
200
|
value={confirmPassword}
|
|
201
201
|
onChange={(e) => setConfirmPassword(e.target.value)}
|
|
202
202
|
placeholder="Re-enter your password"
|
|
203
|
-
className={`w-full px-3 py-2.5
|
|
203
|
+
className={`w-full rounded-lg border px-3 py-2.5 text-sm focus:border-blue-500 focus:ring-2 focus:ring-blue-500 focus:outline-none ${
|
|
204
204
|
confirmPassword && !passwordsMatch ? 'border-red-300' : 'border-gray-300'
|
|
205
205
|
}`}
|
|
206
206
|
required
|
|
207
207
|
autoComplete="new-password"
|
|
208
208
|
/>
|
|
209
209
|
{confirmPassword && !passwordsMatch && (
|
|
210
|
-
<p className="text-xs text-red-600
|
|
210
|
+
<p className="mt-1 text-xs text-red-600">Passwords do not match</p>
|
|
211
211
|
)}
|
|
212
212
|
</div>
|
|
213
213
|
|
|
214
214
|
<button
|
|
215
215
|
type="submit"
|
|
216
216
|
disabled={!canSubmit}
|
|
217
|
-
className="w-full
|
|
217
|
+
className="w-full rounded-lg bg-blue-600 py-2.5 font-medium text-white transition-colors hover:bg-blue-700 disabled:cursor-not-allowed disabled:opacity-50"
|
|
218
218
|
>
|
|
219
219
|
{submitting ? 'Creating Account...' : 'Create Admin Account'}
|
|
220
220
|
</button>
|
|
221
221
|
|
|
222
|
-
<p className="text-xs text-gray-500
|
|
222
|
+
<p className="text-center text-xs text-gray-500">
|
|
223
223
|
This form is only available during initial setup. Once an admin account exists, it will
|
|
224
224
|
be replaced by the login screen.
|
|
225
225
|
</p>
|
package/src/views/Users.tsx
CHANGED
|
@@ -82,17 +82,17 @@ export function Users({ onNavigate }: UsersProps) {
|
|
|
82
82
|
<button
|
|
83
83
|
type="button"
|
|
84
84
|
onClick={() => setSortConfig(toggleSort(sortConfig, sortKey))}
|
|
85
|
-
className="flex items-center gap-1 text-xs font-medium text-gray-700 hover:text-gray-900
|
|
85
|
+
className="flex items-center gap-1 text-xs font-medium text-gray-700 transition-colors hover:text-gray-900"
|
|
86
86
|
>
|
|
87
87
|
{label}
|
|
88
88
|
{active ? (
|
|
89
89
|
sortConfig!.direction === 'asc' ? (
|
|
90
|
-
<ArrowUp className="
|
|
90
|
+
<ArrowUp className="h-3 w-3" />
|
|
91
91
|
) : (
|
|
92
|
-
<ArrowDown className="
|
|
92
|
+
<ArrowDown className="h-3 w-3" />
|
|
93
93
|
)
|
|
94
94
|
) : (
|
|
95
|
-
<ArrowUpDown className="
|
|
95
|
+
<ArrowUpDown className="h-3 w-3 text-gray-400" />
|
|
96
96
|
)}
|
|
97
97
|
</button>
|
|
98
98
|
)
|
|
@@ -100,8 +100,8 @@ export function Users({ onNavigate }: UsersProps) {
|
|
|
100
100
|
|
|
101
101
|
if (loading) {
|
|
102
102
|
return (
|
|
103
|
-
<div className="p-3 pr-6 sm:p-4 sm:pr-8
|
|
104
|
-
<Loader2 className="
|
|
103
|
+
<div className="flex h-64 items-center justify-center p-3 pr-6 sm:p-4 sm:pr-8">
|
|
104
|
+
<Loader2 className="h-6 w-6 animate-spin text-blue-600" />
|
|
105
105
|
</div>
|
|
106
106
|
)
|
|
107
107
|
}
|
|
@@ -110,11 +110,11 @@ export function Users({ onNavigate }: UsersProps) {
|
|
|
110
110
|
<div className="p-3 pr-6 sm:p-4 sm:pr-8">
|
|
111
111
|
{error && (
|
|
112
112
|
<div className="mb-4 flex items-center gap-3 rounded-lg border border-red-200 bg-red-50 p-3">
|
|
113
|
-
<AlertTriangle className="
|
|
114
|
-
<span className="text-sm text-red-800
|
|
113
|
+
<AlertTriangle className="h-5 w-5 shrink-0 text-red-600" />
|
|
114
|
+
<span className="flex-1 text-sm text-red-800">{error}</span>
|
|
115
115
|
<button
|
|
116
116
|
onClick={refetch}
|
|
117
|
-
className="px-3 py-1 text-sm text-red-700
|
|
117
|
+
className="rounded-lg border border-red-300 px-3 py-1 text-sm text-red-700 transition-colors hover:bg-red-100"
|
|
118
118
|
>
|
|
119
119
|
Retry
|
|
120
120
|
</button>
|
|
@@ -136,22 +136,22 @@ export function Users({ onNavigate }: UsersProps) {
|
|
|
136
136
|
</button>
|
|
137
137
|
</div>
|
|
138
138
|
|
|
139
|
-
<div className="
|
|
140
|
-
<div className="
|
|
139
|
+
<div className="mb-4 rounded-lg border border-gray-200 bg-white">
|
|
140
|
+
<div className="flex flex-col gap-3 p-3 sm:flex-row">
|
|
141
141
|
<div className="relative flex-1">
|
|
142
|
-
<Search className="absolute
|
|
142
|
+
<Search className="absolute top-1/2 left-3 h-4 w-4 -translate-y-1/2 text-gray-400" />
|
|
143
143
|
<input
|
|
144
144
|
type="text"
|
|
145
145
|
placeholder="Search users by name or email..."
|
|
146
146
|
value={searchQuery}
|
|
147
147
|
onChange={(e) => setSearchQuery(e.target.value)}
|
|
148
|
-
className="w-full
|
|
148
|
+
className="w-full rounded-lg border border-gray-300 py-2 pr-3 pl-9 text-sm focus:ring-2 focus:ring-blue-500 focus:outline-none"
|
|
149
149
|
/>
|
|
150
150
|
</div>
|
|
151
151
|
<select
|
|
152
152
|
value={filterRole}
|
|
153
153
|
onChange={(e) => setFilterRole(e.target.value)}
|
|
154
|
-
className="
|
|
154
|
+
className="rounded-lg border border-gray-300 px-3 py-2 text-sm focus:ring-2 focus:ring-blue-500 focus:outline-none"
|
|
155
155
|
>
|
|
156
156
|
<option value="all">All Roles</option>
|
|
157
157
|
<option value="admin">Admin</option>
|
|
@@ -164,10 +164,10 @@ export function Users({ onNavigate }: UsersProps) {
|
|
|
164
164
|
|
|
165
165
|
{filteredAndSorted.length === 0 && !loading ? (
|
|
166
166
|
<div className="flex flex-col items-center justify-center py-16 text-center">
|
|
167
|
-
<div className="
|
|
168
|
-
<UserPlus className="
|
|
167
|
+
<div className="mb-4 flex h-12 w-12 items-center justify-center rounded-full bg-gray-100">
|
|
168
|
+
<UserPlus className="h-6 w-6 text-gray-400" />
|
|
169
169
|
</div>
|
|
170
|
-
<h3 className="text-sm font-medium text-gray-900
|
|
170
|
+
<h3 className="mb-1 text-sm font-medium text-gray-900">No users yet</h3>
|
|
171
171
|
<p className="text-sm text-gray-500">Invite your first user to get started.</p>
|
|
172
172
|
</div>
|
|
173
173
|
) : (
|
|
@@ -261,7 +261,7 @@ export function Users({ onNavigate }: UsersProps) {
|
|
|
261
261
|
<Dialog.Root open={showInviteDialog} onOpenChange={setShowInviteDialog}>
|
|
262
262
|
<Dialog.Portal>
|
|
263
263
|
<Dialog.Overlay className="fixed inset-0 z-50 bg-black/50" />
|
|
264
|
-
<Dialog.Content className="fixed
|
|
264
|
+
<Dialog.Content className="fixed top-1/2 left-1/2 z-50 w-full max-w-md -translate-x-1/2 -translate-y-1/2 rounded-lg bg-white p-6 shadow-lg">
|
|
265
265
|
<Dialog.Title className="mb-4 text-lg font-semibold text-gray-900">
|
|
266
266
|
Invite User
|
|
267
267
|
</Dialog.Title>
|
|
@@ -275,7 +275,7 @@ export function Users({ onNavigate }: UsersProps) {
|
|
|
275
275
|
value={inviteEmail}
|
|
276
276
|
onChange={(e) => setInviteEmail(e.target.value)}
|
|
277
277
|
placeholder="user@example.com"
|
|
278
|
-
className="w-full rounded-lg border border-gray-300 px-3 py-2 text-sm focus:
|
|
278
|
+
className="w-full rounded-lg border border-gray-300 px-3 py-2 text-sm focus:ring-2 focus:ring-blue-500 focus:outline-none"
|
|
279
279
|
required
|
|
280
280
|
/>
|
|
281
281
|
</div>
|
|
@@ -284,7 +284,7 @@ export function Users({ onNavigate }: UsersProps) {
|
|
|
284
284
|
<select
|
|
285
285
|
value={inviteRole}
|
|
286
286
|
onChange={(e) => setInviteRole(e.target.value)}
|
|
287
|
-
className="w-full rounded-lg border border-gray-300 px-3 py-2 text-sm focus:
|
|
287
|
+
className="w-full rounded-lg border border-gray-300 px-3 py-2 text-sm focus:ring-2 focus:ring-blue-500 focus:outline-none"
|
|
288
288
|
>
|
|
289
289
|
<option value="viewer">Viewer</option>
|
|
290
290
|
<option value="editor">Editor</option>
|
|
@@ -54,7 +54,7 @@ export function AIBlockAssist({
|
|
|
54
54
|
<button
|
|
55
55
|
onClick={handleGenerate}
|
|
56
56
|
disabled={generating}
|
|
57
|
-
className="flex items-center gap-1.5 px-2.5 py-1 text-xs
|
|
57
|
+
className="text-primary hover:bg-primary/10 flex items-center gap-1.5 rounded-md px-2.5 py-1 text-xs transition-colors disabled:opacity-50"
|
|
58
58
|
title="Generate content with AI"
|
|
59
59
|
>
|
|
60
60
|
{generating ? <Loader2 size={12} className="animate-spin" /> : <Sparkles size={12} />}
|