# Story 9.5: Component Styling - Forms ## Epic Reference **Epic 9:** Design & Branding Implementation ## User Story As a **user**, I want **consistent, accessible form styling**, So that **data entry is intuitive and error states are clear**. ## Dependencies - **Story 9.1 (Color System)** - Must be completed first; provides Tailwind color aliases used below - **Story 9.2 (Typography System)** - Font weights for labels ## Color Reference (from Story 9.1) For quick reference, this story uses these colors defined in the Tailwind theme: - `gold` (#D4AF37) - Focus states, checkbox accents - `charcoal` (#2C3E50) - Default borders, label text - `danger` (#E74C3C) - Error states - `cream` (#F9F7F4) - Input backgrounds (if needed) ## Acceptance Criteria ### Input Fields - [ ] Border: Charcoal Gray (`border-charcoal/30`) - [ ] Focus: Gold border with subtle ring (`focus:border-gold focus:ring-gold/20`) - [ ] Border-radius: 6px (`rounded-md`) - [ ] Padding: 12px 16px (`px-4 py-3`) ### Textareas - [ ] Same styling as inputs - [ ] Minimum height: 120px (`min-h-[120px]`) ### Select Dropdowns - [ ] Custom styled using Flux UI (not native browser) - [ ] Consistent border/focus styling with inputs ### Checkboxes & Radios - [ ] Custom styled with gold accent when checked - [ ] Clear visual distinction between checked/unchecked states ### Labels - [ ] SemiBold weight (`font-semibold`) - [ ] Required indicator (*) in danger color ### Error States - [ ] Red border (`border-danger`) - [ ] Error message displayed below field - [ ] Error ring on focus (`focus:ring-danger/20`) ### RTL Support - [ ] Labels align to the right in RTL mode - [ ] Input text direction follows locale - [ ] Error messages align correctly - [ ] Padding swaps appropriately (use `ps-4 pe-4` instead of `px-4` if needed) ## Files to Create/Modify ### Primary Files - `resources/css/app.css` - Add form component utility classes ### Flux UI Integration Flux UI Free includes these form components that need styling customization: - `flux:input` - Text inputs - `flux:textarea` - Multiline text - `flux:select` - Dropdown selects - `flux:checkbox` - Checkboxes - `flux:radio` - Radio buttons - `flux:field` - Field wrapper with label/error support ### Existing Forms to Audit Review and update existing forms in: - `resources/views/livewire/` - Any Volt components with forms - Authentication views (login, register, password reset) - Contact/booking forms ## Technical Implementation ### CSS Classes (add to `resources/css/app.css`) ```css /* Form field styling */ .input-field { @apply w-full border border-charcoal/30 rounded-md px-4 py-3 focus:border-gold focus:ring-2 focus:ring-gold/20 transition-colors outline-none bg-white; } .input-error { @apply border-danger focus:border-danger focus:ring-danger/20; } .form-label { @apply block text-sm font-semibold text-charcoal mb-2; } .form-label-required::after { content: ' *'; @apply text-danger; } .error-message { @apply text-sm text-danger mt-1; } /* Textarea specific */ .textarea-field { @apply input-field min-h-[120px] resize-y; } /* Custom checkbox */ .checkbox-custom { @apply w-5 h-5 rounded border-charcoal/30 text-gold focus:ring-gold focus:ring-offset-0; } /* Custom radio */ .radio-custom { @apply w-5 h-5 border-charcoal/30 text-gold focus:ring-gold focus:ring-offset-0; } ``` ### Flux UI Component Usage Examples ```blade {{-- Basic input with label --}} Email {{-- Required field with error --}} Name @error('name') {{ $message }} @enderror {{-- Textarea --}} Message {{-- Select dropdown --}} Category Select... Legal General {{-- Checkbox with gold accent --}} I agree to the terms {{-- Radio group --}} Preferred Contact
``` ### RTL Considerations - Use logical properties where possible (`ps-`, `pe-`, `ms-`, `me-` instead of `pl-`, `pr-`, `ml-`, `mr-`) - Flux components should handle RTL automatically with `dir="rtl"` on the HTML element - Test label positioning in Arabic locale ## Testing Requirements ### Manual Testing Checklist 1. **Visual Inspection (both locales)** - [ ] Switch to Arabic - verify RTL alignment - [ ] Switch to English - verify LTR alignment - [ ] All form elements match design specs 2. **Interactive States** - [ ] Click into each field type - verify gold focus ring appears - [ ] Tab through form - verify focus order is logical - [ ] Submit with errors - verify error styling appears 3. **Accessibility** - [ ] Labels are associated with inputs (clicking label focuses input) - [ ] Error messages are announced to screen readers - [ ] Focus indicators are clearly visible ### Automated Tests Create feature test for form styling verification: ```php // tests/Feature/FormStylingTest.php test('form fields render with correct classes', function () { // Test that forms include the expected CSS classes $this->get('/contact') ->assertSee('input-field') ->assertSee('form-label'); }); test('form error states display correctly', function () { // Submit form with invalid data and check error styling Livewire::test('contact-form') ->set('email', 'invalid') ->call('submit') ->assertSee('input-error') ->assertSee('error-message'); }); ``` ### Browser Testing (RTL Verification) ```php // tests/Browser/FormRtlTest.php it('displays form labels on the right in RTL mode', function () { visit('/ar/contact') ->assertPresent('[dir="rtl"]') ->assertVisible('.form-label'); // Visual inspection for alignment }); ``` ## Definition of Done - [ ] CSS classes added to `resources/css/app.css` - [ ] Input styling matches specs (border, focus, padding, radius) - [ ] Textarea styling consistent with inputs, min-height 120px - [ ] Select dropdowns styled consistently (not native) - [ ] Checkboxes show gold accent when checked - [ ] Radio buttons show gold accent when selected - [ ] Labels are semibold with required indicator working - [ ] Error states show red border and message below - [ ] RTL alignment verified in Arabic locale - [ ] LTR alignment verified in English locale - [ ] Existing forms updated to use new classes - [ ] Feature tests pass - [ ] Code formatted with Pint ## Estimation **Complexity:** Medium | **Effort:** 3-4 hours ## Dev Notes - Check Flux UI docs for any built-in theming options before adding custom CSS - If Flux components don't accept className props well, may need to use CSS selectors targeting Flux's rendered HTML - Run `npm run build` after CSS changes to see updates