feat: add LoginForm and LoginDialog to component inventory
All checks were successful
Build & Publish / publish (push) Successful in 50s

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
hsiegeln
2026-03-24 11:26:40 +01:00
parent ff4ba9bb91
commit a62b69b8e2
2 changed files with 62 additions and 0 deletions

View File

@@ -64,6 +64,8 @@ const NAV_SECTIONS = [
{ label: 'FilterBar', href: '#filterbar' },
{ label: 'GroupCard', href: '#groupcard' },
{ label: 'LineChart', href: '#linechart' },
{ label: 'LoginDialog', href: '#logindialog' },
{ label: 'LoginForm', href: '#loginform' },
{ label: 'MenuItem', href: '#menuitem' },
{ label: 'Modal', href: '#modal' },
{ label: 'MultiSelect', href: '#multi-select' },

View File

@@ -16,6 +16,8 @@ import {
FilterBar,
GroupCard,
LineChart,
LoginDialog,
LoginForm,
MenuItem,
Modal,
MultiSelect,
@@ -219,6 +221,11 @@ export function CompositesSection() {
// MultiSelect
const [multiValue, setMultiValue] = useState<string[]>(['admin'])
// LoginDialog
const [loginDialogOpen, setLoginDialogOpen] = useState(false)
const [loginLoading, setLoginLoading] = useState(false)
const [loginError, setLoginError] = useState<string | undefined>()
// 15. Modal
const [modalOpen, setModalOpen] = useState(false)
@@ -502,6 +509,59 @@ export function CompositesSection() {
<LineChart series={CHART_SERIES} xLabel="Time (minutes)" yLabel="Count" width={420} height={180} />
</DemoCard>
{/* LoginDialog */}
<DemoCard
id="logindialog"
title="LoginDialog"
description="Modal login dialog wrapping LoginForm. Supports social providers, credentials, and error states."
>
<div className={styles.demoAreaRow}>
<Button size="sm" variant="primary" onClick={() => setLoginDialogOpen(true)}>
Open LoginDialog
</Button>
<Button size="sm" variant="secondary" onClick={() => { setLoginError('Invalid email or password.'); setLoginDialogOpen(true) }}>
With error
</Button>
</div>
<LoginDialog
open={loginDialogOpen}
onClose={() => { setLoginDialogOpen(false); setLoginError(undefined); setLoginLoading(false) }}
logo={<div style={{ width: 40, height: 40, borderRadius: 'var(--radius-md)', background: 'var(--amber)', display: 'flex', alignItems: 'center', justifyContent: 'center', color: 'white', fontWeight: 700, fontSize: 16 }}>C</div>}
title="Sign in to Cameleer"
socialProviders={[
{ label: 'Continue with Google', onClick: () => {} },
{ label: 'Continue with GitHub', onClick: () => {} },
]}
onSubmit={() => {
setLoginLoading(true)
setTimeout(() => { setLoginLoading(false); setLoginDialogOpen(false) }, 1500)
}}
onForgotPassword={() => {}}
onSignUp={() => {}}
error={loginError}
loading={loginLoading}
/>
</DemoCard>
{/* LoginForm */}
<DemoCard
id="loginform"
title="LoginForm"
description="Standalone login form with configurable social providers, validation, and loading state."
>
<div style={{ maxWidth: 360 }}>
<LoginForm
title="Sign in"
socialProviders={[
{ label: 'Continue with Google', onClick: () => {} },
]}
onSubmit={() => {}}
onForgotPassword={() => {}}
onSignUp={() => {}}
/>
</div>
</DemoCard>
{/* 14. MenuItem */}
<DemoCard
id="menuitem"