Read-only textarea containing your form submission data in JSON format
+ + +diff --git a/css/styles.css b/css/styles.css index 4a1055a..17428dc 100644 --- a/css/styles.css +++ b/css/styles.css @@ -1,3 +1,533 @@ +/* ========================================== + UN SDG Form Site - Enhanced UI/UX Styles + ========================================== + Features: + - Responsive design for all devices + - Accessibility-first approach + - Clear visual feedback for interactions + - Modern, clean aesthetics + ========================================== */ + +/* CSS Custom Properties for theming and consistency */ +:root { + --primary-color: #0a6ebd; + --primary-hover: #085a9e; + --primary-focus: #064a82; + --success-color: #28a745; + --warning-color: #ffc107; + --error-color: #dc3545; + --info-color: #17a2b8; + + --text-color: #333333; + --text-muted: #6c757d; + --background-color: #ffffff; + --surface-color: #f8f9fa; + --border-color: #dee2e6; + + --font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; + --font-size-base: 16px; + --line-height-base: 1.5; + + --spacing-xs: 0.25rem; + --spacing-sm: 0.5rem; + --spacing-md: 1rem; + --spacing-lg: 1.5rem; + --spacing-xl: 2rem; + --spacing-xxl: 3rem; + + --border-radius: 0.375rem; + --border-radius-lg: 0.5rem; + --box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + --box-shadow-lg: 0 4px 12px rgba(0, 0, 0, 0.15); + + --transition-fast: 150ms ease-in-out; + --transition-normal: 250ms ease-in-out; + + --container-max-width: 900px; + --focus-ring: 0 0 0 3px rgba(10, 110, 189, 0.4); +} + +/* Accessibility: Reduced motion preference */ +@media (prefers-reduced-motion: reduce) { + *, + *::before, + *::after { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.01ms !important; + } +} + +/* Accessibility: High contrast mode support */ +@media (prefers-contrast: high) { + :root { + --primary-color: #0052cc; + --border-color: #000000; + --text-color: #000000; + } +} + +/* Base reset and typography */ +*, +*::before, +*::after { + box-sizing: border-box; +} + +html { + font-size: var(--font-size-base); + scroll-behavior: smooth; +} + body { - margin: 20px; + margin: 0; + padding: var(--spacing-lg); + font-family: var(--font-family); + font-size: 1rem; + line-height: var(--line-height-base); + color: var(--text-color); + background-color: var(--background-color); + max-width: var(--container-max-width); + margin-left: auto; + margin-right: auto; +} + +/* Skip link for keyboard navigation */ +.skip-link { + position: absolute; + top: -100%; + left: var(--spacing-md); + padding: var(--spacing-sm) var(--spacing-md); + background-color: var(--primary-color); + color: white; + text-decoration: none; + border-radius: var(--border-radius); + z-index: 1000; + transition: top var(--transition-fast); +} + +.skip-link:focus { + top: var(--spacing-md); + outline: 2px solid var(--primary-focus); + outline-offset: 2px; +} + +/* Screen reader only utility */ +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; +} + +/* Header styles */ +#form-header { + text-align: center; + margin-bottom: var(--spacing-xl); + padding-bottom: var(--spacing-lg); + border-bottom: 2px solid var(--border-color); +} + +#form-header h1 { + font-size: clamp(1.5rem, 4vw, 2.25rem); + font-weight: 700; + color: var(--primary-color); + margin: 0 0 var(--spacing-sm) 0; +} + +#form-header h2 { + font-size: clamp(1rem, 2.5vw, 1.25rem); + font-weight: 400; + color: var(--text-muted); + margin: 0; +} + +/* Form container */ +#formio { + margin-bottom: var(--spacing-xxl); +} + +/* Form.io component overrides for better accessibility and UX */ +#formio .form-group { + margin-bottom: var(--spacing-lg); +} + +#formio .control-label, +#formio label { + font-weight: 600; + margin-bottom: var(--spacing-xs); + display: block; +} + +#formio .form-control { + padding: var(--spacing-sm) var(--spacing-md); + border: 1px solid var(--border-color); + border-radius: var(--border-radius); + font-size: 1rem; + transition: border-color var(--transition-fast), box-shadow var(--transition-fast); + width: 100%; +} + +#formio .form-control:focus { + border-color: var(--primary-color); + box-shadow: var(--focus-ring); + outline: none; +} + +#formio .form-control:hover:not(:focus) { + border-color: var(--primary-hover); +} + +/* Form validation states */ +#formio .has-error .form-control { + border-color: var(--error-color); +} + +#formio .has-error .control-label { + color: var(--error-color); +} + +#formio .has-success .form-control { + border-color: var(--success-color); +} + +/* Submit button styling */ +#formio .btn-primary { + background-color: var(--primary-color); + border-color: var(--primary-color); + color: white; + padding: var(--spacing-sm) var(--spacing-xl); + font-size: 1rem; + font-weight: 600; + border-radius: var(--border-radius); + cursor: pointer; + transition: all var(--transition-fast); + min-height: 44px; /* Touch-friendly minimum */ +} + +#formio .btn-primary:hover { + background-color: var(--primary-hover); + border-color: var(--primary-hover); + transform: translateY(-1px); + box-shadow: var(--box-shadow); +} + +#formio .btn-primary:focus { + box-shadow: var(--focus-ring); + outline: none; +} + +#formio .btn-primary:active { + transform: translateY(0); +} + +/* Output section */ +#output { + background-color: var(--surface-color); + padding: var(--spacing-lg); + border-radius: var(--border-radius-lg); + border: 1px solid var(--border-color); + margin-top: var(--spacing-xl); +} + +#output label { + display: block; + font-size: 1.125rem; + font-weight: 600; + margin-bottom: var(--spacing-sm); + color: var(--text-color); +} + +#output .form-control { + font-family: 'SF Mono', 'Monaco', 'Consolas', 'Liberation Mono', monospace; + font-size: 0.875rem; + background-color: var(--background-color); + border: 1px solid var(--border-color); + border-radius: var(--border-radius); + padding: var(--spacing-md); + resize: vertical; + min-height: 200px; + margin-bottom: var(--spacing-md); +} + +#output .form-control:focus { + border-color: var(--primary-color); + box-shadow: var(--focus-ring); + outline: none; +} + +/* Button group */ +.button-group { + display: flex; + flex-wrap: wrap; + gap: var(--spacing-sm); +} + +/* Action buttons */ +.btn { + display: inline-flex; + align-items: center; + justify-content: center; + gap: var(--spacing-xs); + padding: var(--spacing-sm) var(--spacing-lg); + font-size: 1rem; + font-weight: 500; + border-radius: var(--border-radius); + cursor: pointer; + transition: all var(--transition-fast); + min-height: 44px; /* Touch-friendly minimum */ + min-width: 100px; + position: relative; + overflow: hidden; +} + +.btn-outline { + background-color: transparent; + border: 2px solid var(--primary-color); + color: var(--primary-color); +} + +.btn-outline:hover { + background-color: var(--primary-color); + color: white; + transform: translateY(-2px); + box-shadow: var(--box-shadow); +} + +.btn-outline:focus { + box-shadow: var(--focus-ring); + outline: none; +} + +.btn-outline:active { + transform: translateY(0); + box-shadow: none; +} + +/* Button feedback animation */ +.btn-feedback { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + font-size: 0.75rem; + opacity: 0; + pointer-events: none; +} + +.btn.success { + background-color: var(--success-color); + border-color: var(--success-color); + color: white; +} + +.btn.success .btn-feedback { + opacity: 1; +} + +.btn.error { + background-color: var(--error-color); + border-color: var(--error-color); + color: white; +} + +/* Loading state */ +.btn.loading { + pointer-events: none; + opacity: 0.7; +} + +.btn.loading::after { + content: ''; + position: absolute; + width: 16px; + height: 16px; + border: 2px solid transparent; + border-top-color: currentColor; + border-radius: 50%; + animation: spin 0.8s linear infinite; +} + +@keyframes spin { + to { + transform: rotate(360deg); + } +} + +/* Notification modal */ +.notification-modal { + position: fixed; + top: var(--spacing-lg); + right: var(--spacing-lg); + max-width: 400px; + width: calc(100% - 2 * var(--spacing-lg)); + padding: var(--spacing-md) var(--spacing-lg); + background-color: var(--background-color); + border-radius: var(--border-radius-lg); + box-shadow: var(--box-shadow-lg); + z-index: 1000; + transform: translateX(calc(100% + var(--spacing-lg))); + opacity: 0; + transition: transform var(--transition-normal), opacity var(--transition-normal); +} + +.notification-modal[aria-hidden="false"] { + transform: translateX(0); + opacity: 1; +} + +.notification-content { + display: flex; + align-items: center; + gap: var(--spacing-sm); +} + +.notification-icon { + font-size: 1.5rem; + flex-shrink: 0; +} + +.notification-message { + flex-grow: 1; + font-size: 0.9375rem; +} + +.notification-close { + background: none; + border: none; + font-size: 1.5rem; + cursor: pointer; + color: var(--text-muted); + padding: 0; + line-height: 1; + transition: color var(--transition-fast); +} + +.notification-close:hover, +.notification-close:focus { + color: var(--text-color); +} + +.notification-modal.success { + border-left: 4px solid var(--success-color); +} + +.notification-modal.success .notification-icon::before { + content: '✓'; + color: var(--success-color); +} + +.notification-modal.error { + border-left: 4px solid var(--error-color); +} + +.notification-modal.error .notification-icon::before { + content: '✕'; + color: var(--error-color); +} + +.notification-modal.info { + border-left: 4px solid var(--info-color); +} + +.notification-modal.info .notification-icon::before { + content: 'ℹ'; + color: var(--info-color); +} + +/* Responsive Design */ + +/* Tablet and below */ +@media (max-width: 768px) { + body { + padding: var(--spacing-md); + } + + #output { + padding: var(--spacing-md); + } + + .button-group { + flex-direction: column; + } + + .btn { + width: 100%; + } + + #output .form-control { + min-height: 150px; + } +} + +/* Mobile phones */ +@media (max-width: 480px) { + :root { + --font-size-base: 14px; + } + + body { + padding: var(--spacing-sm); + } + + #form-header { + margin-bottom: var(--spacing-lg); + padding-bottom: var(--spacing-md); + } + + #output { + padding: var(--spacing-sm); + border-radius: var(--border-radius); + } + + .notification-modal { + top: var(--spacing-sm); + right: var(--spacing-sm); + left: var(--spacing-sm); + width: auto; + max-width: none; + } +} + +/* Large screens */ +@media (min-width: 1200px) { + body { + padding: var(--spacing-xxl); + } +} + +/* Print styles */ +@media print { + .skip-link, + .btn, + .button-group, + .notification-modal { + display: none !important; + } + + body { + padding: 0; + max-width: none; + } + + #output .form-control { + border: 1px solid #000; + background: white; + } +} + +/* Focus visible for keyboard navigation */ +:focus-visible { + outline: 2px solid var(--primary-color); + outline-offset: 2px; +} + +/* Hide focus ring for mouse users */ +:focus:not(:focus-visible) { + outline: none; } \ No newline at end of file diff --git a/index.html b/index.html index f81c8db..7c4512a 100644 --- a/index.html +++ b/index.html @@ -1,6 +1,10 @@ - + +
+ + +Read-only textarea containing your form submission data in JSON format
+ + +