@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.esm.js CHANGED
@@ -454,7 +454,8 @@ function PubflowProvider({ children, config, instances, defaultInstance = 'defau
454
454
  }
455
455
  });
456
456
  }
457
- if (isMounted) {
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
- height: '80px',
8633
- marginBottom: '20px'
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
- height: '80px',
8873
- marginBottom: '20px'
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
- height: '80px',
9143
- marginBottom: '20px'
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'