@pubflow/react 0.3.1 → 0.3.4-beta.1
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/index.cjs +111 -16
- package/dist/index.cjs.map +1 -1
- package/dist/index.esm.js +111 -16
- package/dist/index.esm.js.map +1 -1
- package/package.json +1 -1
package/dist/index.esm.js
CHANGED
|
@@ -454,7 +454,8 @@ function PubflowProvider({ children, config, instances, defaultInstance = 'defau
|
|
|
454
454
|
}
|
|
455
455
|
});
|
|
456
456
|
}
|
|
457
|
-
if
|
|
457
|
+
// Only set context value if we have instances to set
|
|
458
|
+
if (isMounted && Object.keys(instancesMap).length > 0) {
|
|
458
459
|
setContextValue({
|
|
459
460
|
instances: instancesMap,
|
|
460
461
|
defaultInstance
|
|
@@ -8559,6 +8560,68 @@ function BridgeList({ renderItem, showPagination = true, showSearch = true, show
|
|
|
8559
8560
|
}) })), renderPagination()] })] })] }));
|
|
8560
8561
|
}
|
|
8561
8562
|
|
|
8563
|
+
/**
|
|
8564
|
+
* Asset Utilities for Pubflow React
|
|
8565
|
+
*
|
|
8566
|
+
* Utilities for handling assets like logos, images, and other media files
|
|
8567
|
+
* Supports both external URLs and internal assets with proper Vite/bundler integration
|
|
8568
|
+
*/
|
|
8569
|
+
/**
|
|
8570
|
+
* Process asset URL - supports both external URLs and internal assets
|
|
8571
|
+
*
|
|
8572
|
+
* @param assetUrl - The asset URL to process
|
|
8573
|
+
* @returns Processed URL ready for use in src attributes
|
|
8574
|
+
*/
|
|
8575
|
+
function processAssetUrl(assetUrl) {
|
|
8576
|
+
// Return non-string values as-is (React components, null, undefined)
|
|
8577
|
+
if (!assetUrl || typeof assetUrl !== 'string') {
|
|
8578
|
+
return assetUrl;
|
|
8579
|
+
}
|
|
8580
|
+
// Return empty string as-is (no logo case)
|
|
8581
|
+
if (assetUrl.trim() === '') {
|
|
8582
|
+
return '';
|
|
8583
|
+
}
|
|
8584
|
+
// Check if it's an external URL (starts with http:// or https://)
|
|
8585
|
+
if (assetUrl.startsWith('http://') || assetUrl.startsWith('https://')) {
|
|
8586
|
+
return assetUrl;
|
|
8587
|
+
}
|
|
8588
|
+
// Check if it's a data URL (base64 encoded image)
|
|
8589
|
+
if (assetUrl.startsWith('data:')) {
|
|
8590
|
+
return assetUrl;
|
|
8591
|
+
}
|
|
8592
|
+
// Check if it's already a processed Vite asset (starts with /)
|
|
8593
|
+
if (assetUrl.startsWith('/')) {
|
|
8594
|
+
return assetUrl;
|
|
8595
|
+
}
|
|
8596
|
+
// Check if it's a blob URL
|
|
8597
|
+
if (assetUrl.startsWith('blob:')) {
|
|
8598
|
+
return assetUrl;
|
|
8599
|
+
}
|
|
8600
|
+
// For relative paths or simple filenames, assume they're in the public directory
|
|
8601
|
+
// This handles cases like 'logo.svg', './logo.png', '../assets/logo.jpg', etc.
|
|
8602
|
+
if (assetUrl.includes('.')) {
|
|
8603
|
+
// Remove leading ./ if present
|
|
8604
|
+
const cleanPath = assetUrl.replace(/^\.\//, '');
|
|
8605
|
+
// If it starts with ../, keep it as is (relative to current directory)
|
|
8606
|
+
if (assetUrl.startsWith('../')) {
|
|
8607
|
+
return assetUrl;
|
|
8608
|
+
}
|
|
8609
|
+
// For simple filenames or paths, prepend with /
|
|
8610
|
+
return `/${cleanPath}`;
|
|
8611
|
+
}
|
|
8612
|
+
// Return as-is for any other cases
|
|
8613
|
+
return assetUrl;
|
|
8614
|
+
}
|
|
8615
|
+
/**
|
|
8616
|
+
* Process logo URL specifically - alias for processAssetUrl with better naming
|
|
8617
|
+
*
|
|
8618
|
+
* @param logoUrl - The logo URL to process
|
|
8619
|
+
* @returns Processed URL ready for use in img src
|
|
8620
|
+
*/
|
|
8621
|
+
function processLogoUrl(logoUrl) {
|
|
8622
|
+
return processAssetUrl(logoUrl);
|
|
8623
|
+
}
|
|
8624
|
+
|
|
8562
8625
|
/**
|
|
8563
8626
|
* Professional login form component
|
|
8564
8627
|
*/
|
|
@@ -8616,21 +8679,31 @@ function LoginForm({ config = {}, onSuccess, onError, onPasswordReset, onAccount
|
|
|
8616
8679
|
const styles = {
|
|
8617
8680
|
container: {
|
|
8618
8681
|
maxWidth: '400px',
|
|
8682
|
+
width: '100%',
|
|
8619
8683
|
margin: '0 auto',
|
|
8620
8684
|
padding: '24px',
|
|
8621
8685
|
backgroundColor: '#ffffff',
|
|
8622
8686
|
borderRadius: '24px',
|
|
8623
8687
|
boxShadow: '0 8px 24px rgba(0, 0, 0, 0.1)',
|
|
8624
|
-
border: '1px solid #f0f0f0'
|
|
8688
|
+
border: '1px solid #f0f0f0',
|
|
8689
|
+
boxSizing: 'border-box'
|
|
8625
8690
|
},
|
|
8626
8691
|
logoSection: {
|
|
8692
|
+
display: 'flex',
|
|
8693
|
+
justifyContent: 'center',
|
|
8694
|
+
alignItems: 'center',
|
|
8627
8695
|
textAlign: 'center',
|
|
8628
|
-
marginBottom: '32px'
|
|
8696
|
+
marginBottom: '32px',
|
|
8697
|
+
width: '100%'
|
|
8629
8698
|
},
|
|
8630
8699
|
logo: {
|
|
8631
8700
|
maxWidth: '320px',
|
|
8632
|
-
|
|
8633
|
-
|
|
8701
|
+
maxHeight: '80px',
|
|
8702
|
+
height: 'auto',
|
|
8703
|
+
width: 'auto',
|
|
8704
|
+
objectFit: 'contain',
|
|
8705
|
+
marginBottom: '20px',
|
|
8706
|
+
display: 'block'
|
|
8634
8707
|
},
|
|
8635
8708
|
welcomeText: {
|
|
8636
8709
|
fontSize: '32px',
|
|
@@ -8739,7 +8812,7 @@ function LoginForm({ config = {}, onSuccess, onError, onPasswordReset, onAccount
|
|
|
8739
8812
|
textAlign: 'center'
|
|
8740
8813
|
}
|
|
8741
8814
|
};
|
|
8742
|
-
return (jsxs("div", { className: className, style: styles.container, children: [jsxs("div", { style: styles.logoSection, children: [logo && (typeof logo === 'string' ? (jsx("img", { src: logo, alt: `${appName} Logo`, style: styles.logo })) : (logo)), jsxs("h1", { style: styles.welcomeText, children: ["Welcome to ", appName] }), jsx("p", { style: styles.subtitleText, children: "Sign in to your account" })] }), jsxs("form", { onSubmit: handleSubmit, children: [error && (jsxs("div", { style: styles.errorContainer, children: [jsx("span", { style: { color: '#ff4757', fontSize: '20px' }, children: "\u26A0" }), jsx("span", { style: styles.errorText, children: error })] })), jsxs("div", { style: styles.inputGroup, children: [jsx("label", { style: styles.inputLabel, children: "Email Address" }), jsxs("div", { style: styles.inputContainer, children: [jsx("span", { style: { marginRight: '12px', opacity: 0.7, color: '#666' }, children: "\u2709" }), jsx("input", { type: "email", style: styles.input, placeholder: "Enter your email", value: email, onChange: (e) => setEmail(e.target.value), autoCapitalize: "none", autoComplete: "email", disabled: isLoading, required: true })] })] }), jsxs("div", { style: styles.inputGroup, children: [jsx("label", { style: styles.inputLabel, children: "Password" }), jsxs("div", { style: styles.inputContainer, children: [jsx("span", { style: { marginRight: '12px', opacity: 0.7, color: '#666' }, children: "\uD83D\uDD12" }), jsx("input", { type: showPassword ? 'text' : 'password', style: styles.input, placeholder: "Enter your password", value: password, onChange: (e) => setPassword(e.target.value), autoComplete: "current-password", disabled: isLoading, required: true }), jsx("button", { type: "button", style: styles.eyeButton, onClick: () => setShowPassword(!showPassword), disabled: isLoading, children: showPassword ? '👁' : '👁🗨' })] })] }), jsxs("div", { style: styles.checkboxContainer, children: [jsxs("label", { style: { display: 'flex', alignItems: 'center', fontSize: '14px', color: '#666' }, children: [jsx("input", { type: "checkbox", checked: rememberMe, onChange: (e) => setRememberMe(e.target.checked), style: { marginRight: '8px' } }), "Remember me"] }), showPasswordReset && (jsx("button", { type: "button", style: { ...styles.linkButton, fontSize: '14px' }, onClick: onPasswordReset, disabled: isLoading, children: "Forgot password?" }))] }), jsx("button", { type: "submit", style: {
|
|
8815
|
+
return (jsxs("div", { className: className, style: styles.container, children: [jsxs("div", { style: styles.logoSection, children: [logo && (typeof logo === 'string' ? (jsx("img", { src: processLogoUrl(logo), alt: `${appName} Logo`, style: styles.logo })) : (logo)), jsxs("h1", { style: styles.welcomeText, children: ["Welcome to ", appName] }), jsx("p", { style: styles.subtitleText, children: "Sign in to your account" })] }), jsxs("form", { onSubmit: handleSubmit, children: [error && (jsxs("div", { style: styles.errorContainer, children: [jsx("span", { style: { color: '#ff4757', fontSize: '20px' }, children: "\u26A0" }), jsx("span", { style: styles.errorText, children: error })] })), jsxs("div", { style: styles.inputGroup, children: [jsx("label", { style: styles.inputLabel, children: "Email Address" }), jsxs("div", { style: styles.inputContainer, children: [jsx("span", { style: { marginRight: '12px', opacity: 0.7, color: '#666' }, children: "\u2709" }), jsx("input", { type: "email", style: styles.input, placeholder: "Enter your email", value: email, onChange: (e) => setEmail(e.target.value), autoCapitalize: "none", autoComplete: "email", disabled: isLoading, required: true })] })] }), jsxs("div", { style: styles.inputGroup, children: [jsx("label", { style: styles.inputLabel, children: "Password" }), jsxs("div", { style: styles.inputContainer, children: [jsx("span", { style: { marginRight: '12px', opacity: 0.7, color: '#666' }, children: "\uD83D\uDD12" }), jsx("input", { type: showPassword ? 'text' : 'password', style: styles.input, placeholder: "Enter your password", value: password, onChange: (e) => setPassword(e.target.value), autoComplete: "current-password", disabled: isLoading, required: true }), jsx("button", { type: "button", style: styles.eyeButton, onClick: () => setShowPassword(!showPassword), disabled: isLoading, children: showPassword ? '👁' : '👁🗨' })] })] }), jsxs("div", { style: styles.checkboxContainer, children: [jsxs("label", { style: { display: 'flex', alignItems: 'center', fontSize: '14px', color: '#666' }, children: [jsx("input", { type: "checkbox", checked: rememberMe, onChange: (e) => setRememberMe(e.target.checked), style: { marginRight: '8px' } }), "Remember me"] }), showPasswordReset && (jsx("button", { type: "button", style: { ...styles.linkButton, fontSize: '14px' }, onClick: onPasswordReset, disabled: isLoading, children: "Forgot password?" }))] }), jsx("button", { type: "submit", style: {
|
|
8743
8816
|
...styles.loginButton,
|
|
8744
8817
|
opacity: isLoading ? 0.8 : 1,
|
|
8745
8818
|
cursor: isLoading ? 'not-allowed' : 'pointer'
|
|
@@ -8856,21 +8929,32 @@ function PasswordResetForm({ config = {}, onSuccess, onError, onBackToLogin, res
|
|
|
8856
8929
|
const styles = {
|
|
8857
8930
|
container: {
|
|
8858
8931
|
maxWidth: '400px',
|
|
8932
|
+
width: '100%',
|
|
8859
8933
|
margin: '0 auto',
|
|
8860
8934
|
padding: '24px',
|
|
8861
8935
|
backgroundColor: '#ffffff',
|
|
8862
8936
|
borderRadius: '24px',
|
|
8863
8937
|
boxShadow: '0 8px 24px rgba(0, 0, 0, 0.1)',
|
|
8864
|
-
border: '1px solid #f0f0f0'
|
|
8938
|
+
border: '1px solid #f0f0f0',
|
|
8939
|
+
boxSizing: 'border-box'
|
|
8865
8940
|
},
|
|
8866
8941
|
logoSection: {
|
|
8942
|
+
display: 'flex',
|
|
8943
|
+
flexDirection: 'column',
|
|
8944
|
+
justifyContent: 'center',
|
|
8945
|
+
alignItems: 'center',
|
|
8867
8946
|
textAlign: 'center',
|
|
8868
|
-
marginBottom: '32px'
|
|
8947
|
+
marginBottom: '32px',
|
|
8948
|
+
width: '100%'
|
|
8869
8949
|
},
|
|
8870
8950
|
logo: {
|
|
8871
8951
|
maxWidth: '320px',
|
|
8872
|
-
|
|
8873
|
-
|
|
8952
|
+
maxHeight: '80px',
|
|
8953
|
+
height: 'auto',
|
|
8954
|
+
width: 'auto',
|
|
8955
|
+
objectFit: 'contain',
|
|
8956
|
+
marginBottom: '20px',
|
|
8957
|
+
display: 'block'
|
|
8874
8958
|
},
|
|
8875
8959
|
title: {
|
|
8876
8960
|
fontSize: '28px',
|
|
@@ -8989,7 +9073,7 @@ function PasswordResetForm({ config = {}, onSuccess, onError, onBackToLogin, res
|
|
|
8989
9073
|
const renderStep = () => {
|
|
8990
9074
|
switch (step) {
|
|
8991
9075
|
case 'request':
|
|
8992
|
-
return (jsxs(Fragment, { children: [jsxs("div", { style: styles.logoSection, children: [logo && (typeof logo === 'string' ? (jsx("img", { src: logo, alt: `${appName} Logo`, style: styles.logo })) : (logo)), jsx("h1", { style: styles.title, children: "Reset Password" }), jsx("p", { style: styles.subtitle, children: "Enter your email to receive reset instructions" })] }), jsxs("form", { onSubmit: handleRequestReset, children: [error && (jsxs("div", { style: styles.errorContainer, children: [jsx("span", { style: { color: '#ff4757', fontSize: '20px' }, children: "\u26A0" }), jsx("span", { style: styles.errorText, children: error })] })), jsxs("div", { style: styles.inputGroup, children: [jsx("label", { style: styles.inputLabel, children: "Email Address" }), jsxs("div", { style: styles.inputContainer, children: [jsx("span", { style: { marginRight: '12px', opacity: 0.7, color: '#666' }, children: "\u2709" }), jsx("input", { type: "email", style: styles.input, placeholder: "Enter your email", value: email, onChange: (e) => setEmail(e.target.value), autoCapitalize: "none", autoComplete: "email", disabled: isLoading, required: true })] })] }), jsx("button", { type: "submit", style: {
|
|
9076
|
+
return (jsxs(Fragment, { children: [jsxs("div", { style: styles.logoSection, children: [logo && (typeof logo === 'string' ? (jsx("img", { src: processLogoUrl(logo), alt: `${appName} Logo`, style: styles.logo })) : (logo)), jsx("h1", { style: styles.title, children: "Reset Password" }), jsx("p", { style: styles.subtitle, children: "Enter your email to receive reset instructions" })] }), jsxs("form", { onSubmit: handleRequestReset, children: [error && (jsxs("div", { style: styles.errorContainer, children: [jsx("span", { style: { color: '#ff4757', fontSize: '20px' }, children: "\u26A0" }), jsx("span", { style: styles.errorText, children: error })] })), jsxs("div", { style: styles.inputGroup, children: [jsx("label", { style: styles.inputLabel, children: "Email Address" }), jsxs("div", { style: styles.inputContainer, children: [jsx("span", { style: { marginRight: '12px', opacity: 0.7, color: '#666' }, children: "\u2709" }), jsx("input", { type: "email", style: styles.input, placeholder: "Enter your email", value: email, onChange: (e) => setEmail(e.target.value), autoCapitalize: "none", autoComplete: "email", disabled: isLoading, required: true })] })] }), jsx("button", { type: "submit", style: {
|
|
8993
9077
|
...styles.button,
|
|
8994
9078
|
opacity: isLoading ? 0.8 : 1,
|
|
8995
9079
|
cursor: isLoading ? 'not-allowed' : 'pointer'
|
|
@@ -9126,21 +9210,32 @@ function AccountCreationForm({ config = {}, onSuccess, onError, onBackToLogin })
|
|
|
9126
9210
|
const styles = {
|
|
9127
9211
|
container: {
|
|
9128
9212
|
maxWidth: '400px',
|
|
9213
|
+
width: '100%',
|
|
9129
9214
|
margin: '0 auto',
|
|
9130
9215
|
padding: '24px',
|
|
9131
9216
|
backgroundColor: '#ffffff',
|
|
9132
9217
|
borderRadius: '24px',
|
|
9133
9218
|
boxShadow: '0 8px 24px rgba(0, 0, 0, 0.1)',
|
|
9134
|
-
border: '1px solid #f0f0f0'
|
|
9219
|
+
border: '1px solid #f0f0f0',
|
|
9220
|
+
boxSizing: 'border-box'
|
|
9135
9221
|
},
|
|
9136
9222
|
logoSection: {
|
|
9223
|
+
display: 'flex',
|
|
9224
|
+
flexDirection: 'column',
|
|
9225
|
+
justifyContent: 'center',
|
|
9226
|
+
alignItems: 'center',
|
|
9137
9227
|
textAlign: 'center',
|
|
9138
|
-
marginBottom: '32px'
|
|
9228
|
+
marginBottom: '32px',
|
|
9229
|
+
width: '100%'
|
|
9139
9230
|
},
|
|
9140
9231
|
logo: {
|
|
9141
9232
|
maxWidth: '320px',
|
|
9142
|
-
|
|
9143
|
-
|
|
9233
|
+
maxHeight: '80px',
|
|
9234
|
+
height: 'auto',
|
|
9235
|
+
width: 'auto',
|
|
9236
|
+
objectFit: 'contain',
|
|
9237
|
+
marginBottom: '20px',
|
|
9238
|
+
display: 'block'
|
|
9144
9239
|
},
|
|
9145
9240
|
title: {
|
|
9146
9241
|
fontSize: '28px',
|
|
@@ -9253,7 +9348,7 @@ function AccountCreationForm({ config = {}, onSuccess, onError, onBackToLogin })
|
|
|
9253
9348
|
const renderStep = () => {
|
|
9254
9349
|
switch (step) {
|
|
9255
9350
|
case 'form':
|
|
9256
|
-
return (jsxs(Fragment, { children: [jsxs("div", { style: styles.logoSection, children: [logo && (typeof logo === 'string' ? (jsx("img", { src: logo, alt: `${appName} Logo`, style: styles.logo })) : (logo)), jsx("h1", { style: styles.title, children: "Create Account" }), jsxs("p", { style: styles.subtitle, children: ["Join ", appName, " today"] })] }), jsxs("form", { onSubmit: handleSubmit, children: [errors.general && (jsxs("div", { style: { ...styles.successContainer, backgroundColor: '#fef2f2', borderColor: '#fecaca' }, children: [jsx("span", { style: { color: '#ff4757', fontSize: '20px' }, children: "\u26A0" }), jsx("span", { style: { ...styles.successText, color: '#dc2626' }, children: errors.general })] })), jsxs("div", { style: styles.inputGroup, children: [jsx("label", { style: styles.inputLabel, children: "First Name *" }), jsxs("div", { style: { ...styles.inputContainer, ...(errors.name ? styles.inputError : {}) }, children: [jsx("span", { style: { marginRight: '12px', opacity: 0.7, color: '#666' }, children: "\uD83D\uDC64" }), jsx("input", { type: "text", style: styles.input, placeholder: "Enter your first name", value: formData.name, onChange: (e) => updateField('name', e.target.value), autoComplete: "given-name", disabled: isLoading, required: true })] }), errors.name && jsx("div", { style: styles.errorText, children: errors.name })] }), jsxs("div", { style: styles.inputGroup, children: [jsx("label", { style: styles.inputLabel, children: "Last Name *" }), jsxs("div", { style: { ...styles.inputContainer, ...(errors.lastName ? styles.inputError : {}) }, children: [jsx("span", { style: { marginRight: '12px', opacity: 0.7, color: '#666' }, children: "\uD83D\uDC64" }), jsx("input", { type: "text", style: styles.input, placeholder: "Enter your last name", value: formData.lastName, onChange: (e) => updateField('lastName', e.target.value), autoComplete: "family-name", disabled: isLoading, required: true })] }), errors.lastName && jsx("div", { style: styles.errorText, children: errors.lastName })] }), jsxs("div", { style: styles.inputGroup, children: [jsx("label", { style: styles.inputLabel, children: "Email Address *" }), jsxs("div", { style: { ...styles.inputContainer, ...(errors.email ? styles.inputError : {}) }, children: [jsx("span", { style: { marginRight: '12px', opacity: 0.7, color: '#666' }, children: "\u2709" }), jsx("input", { type: "email", style: styles.input, placeholder: "Enter your email", value: formData.email, onChange: (e) => updateField('email', e.target.value), autoCapitalize: "none", autoComplete: "email", disabled: isLoading, required: true })] }), errors.email && jsx("div", { style: styles.errorText, children: errors.email })] }), jsxs("div", { style: styles.inputGroup, children: [jsx("label", { style: styles.inputLabel, children: "Password *" }), jsxs("div", { style: { ...styles.inputContainer, ...(errors.password ? styles.inputError : {}) }, children: [jsx("span", { style: { marginRight: '12px', opacity: 0.7, color: '#666' }, children: "\uD83D\uDD12" }), jsx("input", { type: showPassword ? 'text' : 'password', style: styles.input, placeholder: "Create a password", value: formData.password, onChange: (e) => updateField('password', e.target.value), autoComplete: "new-password", disabled: isLoading, required: true }), jsx("button", { type: "button", style: styles.eyeButton, onClick: () => setShowPassword(!showPassword), disabled: isLoading, children: showPassword ? '👁' : '👁🗨' })] }), errors.password && jsx("div", { style: styles.errorText, children: errors.password })] }), jsxs("div", { style: styles.inputGroup, children: [jsx("label", { style: styles.inputLabel, children: "Confirm Password *" }), jsxs("div", { style: { ...styles.inputContainer, ...(errors.confirmPassword ? styles.inputError : {}) }, children: [jsx("span", { style: { marginRight: '12px', opacity: 0.7, color: '#666' }, children: "\uD83D\uDD12" }), jsx("input", { type: showConfirmPassword ? 'text' : 'password', style: styles.input, placeholder: "Confirm your password", value: formData.confirmPassword, onChange: (e) => updateField('confirmPassword', e.target.value), autoComplete: "new-password", disabled: isLoading, required: true }), jsx("button", { type: "button", style: styles.eyeButton, onClick: () => setShowConfirmPassword(!showConfirmPassword), disabled: isLoading, children: showConfirmPassword ? '👁' : '👁🗨' })] }), errors.confirmPassword && jsx("div", { style: styles.errorText, children: errors.confirmPassword })] }), jsx("button", { type: "submit", style: {
|
|
9351
|
+
return (jsxs(Fragment, { children: [jsxs("div", { style: styles.logoSection, children: [logo && (typeof logo === 'string' ? (jsx("img", { src: processLogoUrl(logo), alt: `${appName} Logo`, style: styles.logo })) : (logo)), jsx("h1", { style: styles.title, children: "Create Account" }), jsxs("p", { style: styles.subtitle, children: ["Join ", appName, " today"] })] }), jsxs("form", { onSubmit: handleSubmit, children: [errors.general && (jsxs("div", { style: { ...styles.successContainer, backgroundColor: '#fef2f2', borderColor: '#fecaca' }, children: [jsx("span", { style: { color: '#ff4757', fontSize: '20px' }, children: "\u26A0" }), jsx("span", { style: { ...styles.successText, color: '#dc2626' }, children: errors.general })] })), jsxs("div", { style: styles.inputGroup, children: [jsx("label", { style: styles.inputLabel, children: "First Name *" }), jsxs("div", { style: { ...styles.inputContainer, ...(errors.name ? styles.inputError : {}) }, children: [jsx("span", { style: { marginRight: '12px', opacity: 0.7, color: '#666' }, children: "\uD83D\uDC64" }), jsx("input", { type: "text", style: styles.input, placeholder: "Enter your first name", value: formData.name, onChange: (e) => updateField('name', e.target.value), autoComplete: "given-name", disabled: isLoading, required: true })] }), errors.name && jsx("div", { style: styles.errorText, children: errors.name })] }), jsxs("div", { style: styles.inputGroup, children: [jsx("label", { style: styles.inputLabel, children: "Last Name *" }), jsxs("div", { style: { ...styles.inputContainer, ...(errors.lastName ? styles.inputError : {}) }, children: [jsx("span", { style: { marginRight: '12px', opacity: 0.7, color: '#666' }, children: "\uD83D\uDC64" }), jsx("input", { type: "text", style: styles.input, placeholder: "Enter your last name", value: formData.lastName, onChange: (e) => updateField('lastName', e.target.value), autoComplete: "family-name", disabled: isLoading, required: true })] }), errors.lastName && jsx("div", { style: styles.errorText, children: errors.lastName })] }), jsxs("div", { style: styles.inputGroup, children: [jsx("label", { style: styles.inputLabel, children: "Email Address *" }), jsxs("div", { style: { ...styles.inputContainer, ...(errors.email ? styles.inputError : {}) }, children: [jsx("span", { style: { marginRight: '12px', opacity: 0.7, color: '#666' }, children: "\u2709" }), jsx("input", { type: "email", style: styles.input, placeholder: "Enter your email", value: formData.email, onChange: (e) => updateField('email', e.target.value), autoCapitalize: "none", autoComplete: "email", disabled: isLoading, required: true })] }), errors.email && jsx("div", { style: styles.errorText, children: errors.email })] }), jsxs("div", { style: styles.inputGroup, children: [jsx("label", { style: styles.inputLabel, children: "Password *" }), jsxs("div", { style: { ...styles.inputContainer, ...(errors.password ? styles.inputError : {}) }, children: [jsx("span", { style: { marginRight: '12px', opacity: 0.7, color: '#666' }, children: "\uD83D\uDD12" }), jsx("input", { type: showPassword ? 'text' : 'password', style: styles.input, placeholder: "Create a password", value: formData.password, onChange: (e) => updateField('password', e.target.value), autoComplete: "new-password", disabled: isLoading, required: true }), jsx("button", { type: "button", style: styles.eyeButton, onClick: () => setShowPassword(!showPassword), disabled: isLoading, children: showPassword ? '👁' : '👁🗨' })] }), errors.password && jsx("div", { style: styles.errorText, children: errors.password })] }), jsxs("div", { style: styles.inputGroup, children: [jsx("label", { style: styles.inputLabel, children: "Confirm Password *" }), jsxs("div", { style: { ...styles.inputContainer, ...(errors.confirmPassword ? styles.inputError : {}) }, children: [jsx("span", { style: { marginRight: '12px', opacity: 0.7, color: '#666' }, children: "\uD83D\uDD12" }), jsx("input", { type: showConfirmPassword ? 'text' : 'password', style: styles.input, placeholder: "Confirm your password", value: formData.confirmPassword, onChange: (e) => updateField('confirmPassword', e.target.value), autoComplete: "new-password", disabled: isLoading, required: true }), jsx("button", { type: "button", style: styles.eyeButton, onClick: () => setShowConfirmPassword(!showConfirmPassword), disabled: isLoading, children: showConfirmPassword ? '👁' : '👁🗨' })] }), errors.confirmPassword && jsx("div", { style: styles.errorText, children: errors.confirmPassword })] }), jsx("button", { type: "submit", style: {
|
|
9257
9352
|
...styles.button,
|
|
9258
9353
|
opacity: isLoading ? 0.8 : 1,
|
|
9259
9354
|
cursor: isLoading ? 'not-allowed' : 'pointer'
|