@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
package/src/views/Login.tsx
CHANGED
|
@@ -1,13 +1,25 @@
|
|
|
1
1
|
'use client'
|
|
2
2
|
|
|
3
3
|
import { useState, type FormEvent } from 'react'
|
|
4
|
-
import {
|
|
4
|
+
import { Eye, EyeOff, AlertTriangle, Loader2 } from 'lucide-react'
|
|
5
|
+
import { ActuateBrandLogo } from '../assets/actuate-logo.js'
|
|
5
6
|
|
|
6
7
|
export interface CaptchaConfig {
|
|
7
8
|
provider: 'recaptcha' | 'turnstile' | 'none'
|
|
8
9
|
siteKey: string | null
|
|
9
10
|
}
|
|
10
11
|
|
|
12
|
+
/**
|
|
13
|
+
* Branding shown on the login screen. Mirrors `config.admin.branding` from the
|
|
14
|
+
* sidebar so integrators only need to set it once. `logo` should be a URL or
|
|
15
|
+
* data URL; pass `null` to opt out of any logo entirely.
|
|
16
|
+
*/
|
|
17
|
+
export interface LoginBrandingConfig {
|
|
18
|
+
logo?: string | null
|
|
19
|
+
name?: string
|
|
20
|
+
tagline?: string
|
|
21
|
+
}
|
|
22
|
+
|
|
11
23
|
export interface LoginProps {
|
|
12
24
|
onLogin: (
|
|
13
25
|
email: string,
|
|
@@ -17,6 +29,11 @@ export interface LoginProps {
|
|
|
17
29
|
onNavigate?: (path: string) => void
|
|
18
30
|
oauthProviders?: string[]
|
|
19
31
|
captchaConfig?: CaptchaConfig
|
|
32
|
+
/**
|
|
33
|
+
* Custom branding for the login screen. Falls back to the bundled Actuate
|
|
34
|
+
* Media wordmark + "Actuate CMS" headline when omitted.
|
|
35
|
+
*/
|
|
36
|
+
branding?: LoginBrandingConfig
|
|
20
37
|
}
|
|
21
38
|
|
|
22
39
|
const OAUTH_LABELS: Record<string, string> = {
|
|
@@ -48,7 +65,7 @@ const OAUTH_COLORS: Record<string, { border: string; bg: string; text: string; h
|
|
|
48
65
|
|
|
49
66
|
function GoogleIcon() {
|
|
50
67
|
return (
|
|
51
|
-
<svg className="
|
|
68
|
+
<svg className="h-5 w-5" viewBox="0 0 24 24" aria-hidden="true">
|
|
52
69
|
<path
|
|
53
70
|
d="M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 01-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z"
|
|
54
71
|
fill="#4285F4"
|
|
@@ -71,7 +88,7 @@ function GoogleIcon() {
|
|
|
71
88
|
|
|
72
89
|
function MicrosoftIcon() {
|
|
73
90
|
return (
|
|
74
|
-
<svg className="
|
|
91
|
+
<svg className="h-5 w-5" viewBox="0 0 21 21" aria-hidden="true">
|
|
75
92
|
<rect x="1" y="1" width="9" height="9" fill="#F25022" />
|
|
76
93
|
<rect x="1" y="11" width="9" height="9" fill="#00A4EF" />
|
|
77
94
|
<rect x="11" y="1" width="9" height="9" fill="#7FBA00" />
|
|
@@ -86,7 +103,7 @@ function OAuthIcon({ provider }: { provider: string }) {
|
|
|
86
103
|
return <GoogleIcon />
|
|
87
104
|
case 'github':
|
|
88
105
|
return (
|
|
89
|
-
<svg className="
|
|
106
|
+
<svg className="h-5 w-5" viewBox="0 0 24 24" fill="currentColor">
|
|
90
107
|
<path d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z" />
|
|
91
108
|
</svg>
|
|
92
109
|
)
|
|
@@ -170,7 +187,13 @@ async function getCaptchaToken(provider: string, siteKey: string, action: string
|
|
|
170
187
|
return ''
|
|
171
188
|
}
|
|
172
189
|
|
|
173
|
-
export function Login({
|
|
190
|
+
export function Login({
|
|
191
|
+
onLogin,
|
|
192
|
+
onNavigate,
|
|
193
|
+
oauthProviders,
|
|
194
|
+
captchaConfig,
|
|
195
|
+
branding,
|
|
196
|
+
}: LoginProps) {
|
|
174
197
|
const [email, setEmail] = useState('')
|
|
175
198
|
const [password, setPassword] = useState('')
|
|
176
199
|
const [showPassword, setShowPassword] = useState(false)
|
|
@@ -218,30 +241,47 @@ export function Login({ onLogin, onNavigate, oauthProviders, captchaConfig }: Lo
|
|
|
218
241
|
const enabledProviders =
|
|
219
242
|
oauthProviders?.filter((p) => ['google', 'github', 'microsoft'].includes(p)) ?? []
|
|
220
243
|
|
|
244
|
+
// Branding fallbacks: when an integrator doesn't pass `branding`, render the
|
|
245
|
+
// Actuate Media wordmark inline (transparent SVG, no surrounding pill needed).
|
|
246
|
+
// When `branding.logo` is explicitly `null`, render no logo at all (just the
|
|
247
|
+
// headline + tagline) so whitelabel deployments can hide it entirely.
|
|
248
|
+
const customLogo = branding?.logo
|
|
249
|
+
const brandName = branding?.name ?? 'Actuate CMS'
|
|
250
|
+
const brandTagline = branding?.tagline ?? 'Sign in to your account'
|
|
251
|
+
const showLogo = customLogo !== null
|
|
252
|
+
|
|
221
253
|
return (
|
|
222
|
-
<div className="min-h-screen
|
|
254
|
+
<div className="flex min-h-screen items-center justify-center bg-gray-50 px-4">
|
|
223
255
|
<div className="w-full max-w-md">
|
|
224
|
-
<div className="text-center
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
256
|
+
<div className="mb-8 text-center">
|
|
257
|
+
{showLogo &&
|
|
258
|
+
(customLogo ? (
|
|
259
|
+
<img
|
|
260
|
+
src={customLogo}
|
|
261
|
+
alt={brandName}
|
|
262
|
+
className="mx-auto mb-4 max-h-16 w-auto object-contain"
|
|
263
|
+
draggable={false}
|
|
264
|
+
/>
|
|
265
|
+
) : (
|
|
266
|
+
<ActuateBrandLogo className="mx-auto mb-4 h-14 w-auto" />
|
|
267
|
+
))}
|
|
268
|
+
<h1 className="text-2xl font-bold text-gray-900">{brandName}</h1>
|
|
269
|
+
<p className="mt-2 text-gray-600">{brandTagline}</p>
|
|
230
270
|
</div>
|
|
231
271
|
|
|
232
272
|
<form
|
|
233
273
|
onSubmit={handleSubmit}
|
|
234
|
-
className="
|
|
274
|
+
className="space-y-5 rounded-xl border border-gray-200 bg-white p-6 shadow-sm"
|
|
235
275
|
>
|
|
236
276
|
{error && (
|
|
237
|
-
<div className="flex items-start gap-3
|
|
238
|
-
<AlertTriangle className="
|
|
277
|
+
<div className="flex items-start gap-3 rounded-lg border border-red-200 bg-red-50 p-3">
|
|
278
|
+
<AlertTriangle className="mt-0.5 h-5 w-5 shrink-0 text-red-600" />
|
|
239
279
|
<p className="text-sm text-red-800">{error}</p>
|
|
240
280
|
</div>
|
|
241
281
|
)}
|
|
242
282
|
|
|
243
283
|
<div>
|
|
244
|
-
<label htmlFor="login-email" className="block text-sm font-medium text-gray-700
|
|
284
|
+
<label htmlFor="login-email" className="mb-1.5 block text-sm font-medium text-gray-700">
|
|
245
285
|
Email Address
|
|
246
286
|
</label>
|
|
247
287
|
<input
|
|
@@ -250,7 +290,7 @@ export function Login({ onLogin, onNavigate, oauthProviders, captchaConfig }: Lo
|
|
|
250
290
|
value={email}
|
|
251
291
|
onChange={(e) => setEmail(e.target.value)}
|
|
252
292
|
placeholder="admin@example.com"
|
|
253
|
-
className="w-full
|
|
293
|
+
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"
|
|
254
294
|
required
|
|
255
295
|
autoFocus
|
|
256
296
|
autoComplete="email"
|
|
@@ -258,7 +298,7 @@ export function Login({ onLogin, onNavigate, oauthProviders, captchaConfig }: Lo
|
|
|
258
298
|
</div>
|
|
259
299
|
|
|
260
300
|
<div>
|
|
261
|
-
<div className="flex items-center justify-between
|
|
301
|
+
<div className="mb-1.5 flex items-center justify-between">
|
|
262
302
|
<label htmlFor="login-password" className="block text-sm font-medium text-gray-700">
|
|
263
303
|
Password
|
|
264
304
|
</label>
|
|
@@ -266,7 +306,7 @@ export function Login({ onLogin, onNavigate, oauthProviders, captchaConfig }: Lo
|
|
|
266
306
|
<button
|
|
267
307
|
type="button"
|
|
268
308
|
onClick={() => onNavigate('/forgot-password')}
|
|
269
|
-
className="text-xs text-blue-600 hover:text-blue-700
|
|
309
|
+
className="text-xs font-medium text-blue-600 hover:text-blue-700"
|
|
270
310
|
>
|
|
271
311
|
Forgot Password?
|
|
272
312
|
</button>
|
|
@@ -279,17 +319,17 @@ export function Login({ onLogin, onNavigate, oauthProviders, captchaConfig }: Lo
|
|
|
279
319
|
value={password}
|
|
280
320
|
onChange={(e) => setPassword(e.target.value)}
|
|
281
321
|
placeholder="Enter your password"
|
|
282
|
-
className="w-full px-3 py-2.5 pr-10
|
|
322
|
+
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"
|
|
283
323
|
required
|
|
284
324
|
autoComplete="current-password"
|
|
285
325
|
/>
|
|
286
326
|
<button
|
|
287
327
|
type="button"
|
|
288
328
|
onClick={() => setShowPassword(!showPassword)}
|
|
289
|
-
className="absolute
|
|
329
|
+
className="absolute top-1/2 right-3 -translate-y-1/2 text-gray-400 hover:text-gray-600"
|
|
290
330
|
tabIndex={-1}
|
|
291
331
|
>
|
|
292
|
-
{showPassword ? <EyeOff className="
|
|
332
|
+
{showPassword ? <EyeOff className="h-4 w-4" /> : <Eye className="h-4 w-4" />}
|
|
293
333
|
</button>
|
|
294
334
|
</div>
|
|
295
335
|
</div>
|
|
@@ -297,11 +337,11 @@ export function Login({ onLogin, onNavigate, oauthProviders, captchaConfig }: Lo
|
|
|
297
337
|
<button
|
|
298
338
|
type="submit"
|
|
299
339
|
disabled={!canSubmit}
|
|
300
|
-
className="w-full
|
|
340
|
+
className="flex w-full items-center justify-center gap-2 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"
|
|
301
341
|
>
|
|
302
342
|
{submitting ? (
|
|
303
343
|
<>
|
|
304
|
-
<Loader2 className="
|
|
344
|
+
<Loader2 className="h-4 w-4 animate-spin" />
|
|
305
345
|
Signing in...
|
|
306
346
|
</>
|
|
307
347
|
) : (
|
|
@@ -328,7 +368,7 @@ export function Login({ onLogin, onNavigate, oauthProviders, captchaConfig }: Lo
|
|
|
328
368
|
key={provider}
|
|
329
369
|
type="button"
|
|
330
370
|
onClick={() => handleOAuthClick(provider)}
|
|
331
|
-
className={`w-full
|
|
371
|
+
className={`flex w-full items-center justify-center gap-3 border px-4 py-2.5 ${colors?.border ?? ''} ${colors?.bg ?? ''} ${colors?.text ?? ''} rounded-lg text-sm font-medium ${colors?.hover ?? ''} transition-colors`}
|
|
332
372
|
>
|
|
333
373
|
<OAuthIcon provider={provider} />
|
|
334
374
|
{OAUTH_LABELS[provider] ?? provider}
|