complete story 14.1

This commit is contained in:
Naser Mansour 2026-01-09 16:51:55 +02:00
parent 6504327ed7
commit 972af7a127
6 changed files with 201 additions and 27 deletions

View File

@ -127,17 +127,17 @@ return [
## Dev Checklist ## Dev Checklist
- [ ] Create hero section HTML structure - [x] Create hero section HTML structure
- [ ] Add English translations to `lang/en/home.php` - [x] Add English translations to `lang/en/home.php`
- [ ] Add Arabic translations to `lang/ar/home.php` - [x] Add Arabic translations to `lang/ar/home.php`
- [ ] Style tagline with correct typography - [x] Style tagline with correct typography
- [ ] Style intro text with max-width - [x] Style intro text with max-width
- [ ] Implement primary CTA button linking to `/booking` - [x] Implement primary CTA button linking to `/booking`
- [ ] Implement secondary CTA with smooth scroll to `#services` - [x] Implement secondary CTA with smooth scroll to `#services`
- [ ] Test responsive layout (mobile, tablet, desktop) - [x] Test responsive layout (mobile, tablet, desktop)
- [ ] Test RTL layout (Arabic) - [x] Test RTL layout (Arabic)
- [ ] Test LTR layout (English) - [x] Test LTR layout (English)
- [ ] Verify color usage matches brand guidelines - [x] Verify color usage matches brand guidelines
## Estimation ## Estimation
@ -148,3 +148,51 @@ return [
- Epic 12 completed (brand colors available) - Epic 12 completed (brand colors available)
- Booking route exists at `/booking` - Booking route exists at `/booking`
---
## Dev Agent Record
### Status
Ready for Review
### Agent Model Used
Claude Opus 4.5 (claude-opus-4-5-20251101)
### File List
| File | Action | Description |
|------|--------|-------------|
| `resources/views/pages/home.blade.php` | Modified | Added hero section with tagline, intro, and CTA buttons |
| `lang/en/home.php` | Created | English translations for hero section |
| `lang/ar/home.php` | Created | Arabic translations for hero section |
| `resources/css/app.css` | Modified | Added smooth scroll behavior for HTML element |
| `tests/Feature/Public/HomePageTest.php` | Created | 12 tests covering all acceptance criteria |
### Completion Notes
- Implemented hero section with full-width warm cream background per AC1
- Responsive typography: 1.75rem mobile, 2rem tablet, 2.5rem desktop per AC2
- Intro text constrained to 800px max-width per AC3
- Primary CTA uses existing `btn-primary` class with warm gold styling per AC4
- Secondary CTA uses `btn-secondary` class with forest green border per AC5
- Smooth scroll implemented via CSS `scroll-behavior: smooth` on html element
- Added `id="services"` to existing services section for anchor link
- Buttons stack vertically on mobile, inline on tablet/desktop per AC6
- RTL support automatic via Tailwind's built-in RTL utilities per AC7
- All 12 feature tests pass covering bilingual content, links, and structure
### Change Log
| Date | Change |
|------|--------|
| 2026-01-09 | Initial implementation of hero section |
| 2026-01-09 | Created translation files (en/ar) |
| 2026-01-09 | Added smooth scroll CSS |
| 2026-01-09 | Created comprehensive test suite |
### Debug Log References
N/A - No issues encountered during implementation

8
lang/ar/home.php Normal file
View File

@ -0,0 +1,8 @@
<?php
return [
'tagline' => 'ملتزمون بالعدالة متجذرون بالكرامة مدفوعون للدفاع',
'intro' => 'ليبرا للحقوق مؤسسة قانونية منسوجة من نسيج المجتمع، تقدم حلولاً قانونية مبتكرة بأمانة واحترافية.',
'cta_book' => 'احجز استشارة',
'cta_services' => 'خدماتنا',
];

8
lang/en/home.php Normal file
View File

@ -0,0 +1,8 @@
<?php
return [
'tagline' => 'Committed to Justice Grounded in Dignity Driven to Advocate',
'intro' => 'Libra for Rights is a legal institution woven from the fabric of society, offering innovative legal solutions with honesty and professionalism.',
'cta_book' => 'Book a Consultation',
'cta_services' => 'Our Services',
];

View File

@ -328,6 +328,11 @@ html[lang="en"] body {
font-family: var(--font-english); font-family: var(--font-english);
} }
/* Smooth Scrolling */
html {
scroll-behavior: smooth;
}
/* Typography Base Styles */ /* Typography Base Styles */
body { body {
font-size: var(--font-size-base); font-size: var(--font-size-base);

View File

@ -1,9 +1,33 @@
<x-layouts.public> <x-layouts.public>
<div class="text-center py-8 sm:py-12"> {{-- Hero Section --}}
<h1 class="text-2xl sm:text-3xl lg:text-4xl font-bold text-body mb-4">{{ __('Libra Law Firm') }}</h1> <section class="bg-background py-8 sm:py-12 lg:py-16">
<p class="text-body text-base sm:text-lg mb-6 sm:mb-8 px-4">{{ __('Professional legal services with integrity and excellence.') }}</p> <div class="container mx-auto px-4 text-center">
{{-- Tagline --}}
<h1 class="text-[1.75rem] sm:text-[2rem] lg:text-[2.5rem] font-bold text-text mb-6">
{{ __('home.tagline') }}
</h1>
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4 sm:gap-6 lg:gap-8 mt-8 sm:mt-12"> {{-- Introductory Text --}}
<p class="text-text text-base sm:text-lg max-w-[800px] mx-auto mb-8">
{{ __('home.intro') }}
</p>
{{-- CTA Buttons --}}
<div class="flex flex-col sm:flex-row gap-4 justify-center">
<a href="{{ route('booking') }}" class="btn-primary">
{{ __('home.cta_book') }}
</a>
<a href="#services" class="btn-secondary">
{{ __('home.cta_services') }}
</a>
</div>
</div>
</section>
{{-- Services Section Placeholder --}}
<section id="services" class="py-8 sm:py-12">
<div class="container mx-auto px-4">
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4 sm:gap-6 lg:gap-8">
<div class="bg-card p-4 sm:p-6 rounded-lg shadow-card"> <div class="bg-card p-4 sm:p-6 rounded-lg shadow-card">
<h3 class="text-lg sm:text-xl font-semibold text-text mb-2">{{ __('Expert Consultations') }}</h3> <h3 class="text-lg sm:text-xl font-semibold text-text mb-2">{{ __('Expert Consultations') }}</h3>
<p class="text-body text-sm sm:text-base">{{ __('Professional legal advice tailored to your needs.') }}</p> <p class="text-body text-sm sm:text-base">{{ __('Professional legal advice tailored to your needs.') }}</p>
@ -18,4 +42,5 @@
</div> </div>
</div> </div>
</div> </div>
</section>
</x-layouts.public> </x-layouts.public>

View File

@ -0,0 +1,80 @@
<?php
test('home page is accessible', function () {
$this->get('/')
->assertOk();
});
test('home page displays English tagline when locale is English', function () {
$this->withSession(['locale' => 'en'])
->get('/')
->assertOk()
->assertSee('Committed to Justice Grounded in Dignity Driven to Advocate');
});
test('home page displays Arabic tagline when locale is Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/')
->assertOk()
->assertSee('ملتزمون بالعدالة متجذرون بالكرامة مدفوعون للدفاع');
});
test('home page displays English intro text when locale is English', function () {
$this->withSession(['locale' => 'en'])
->get('/')
->assertOk()
->assertSee('Libra for Rights is a legal institution woven from the fabric of society');
});
test('home page displays Arabic intro text when locale is Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/')
->assertOk()
->assertSee('ليبرا للحقوق مؤسسة قانونية منسوجة من نسيج المجتمع');
});
test('home page displays Book a Consultation button in English', function () {
$this->withSession(['locale' => 'en'])
->get('/')
->assertOk()
->assertSee('Book a Consultation');
});
test('home page displays Book a Consultation button in Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/')
->assertOk()
->assertSee('احجز استشارة');
});
test('home page displays Our Services button in English', function () {
$this->withSession(['locale' => 'en'])
->get('/')
->assertOk()
->assertSee('Our Services');
});
test('home page displays Our Services button in Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/')
->assertOk()
->assertSee('خدماتنا');
});
test('home page contains link to booking page', function () {
$this->get('/')
->assertOk()
->assertSee('href="'.route('booking').'"', false);
});
test('home page contains link to services section', function () {
$this->get('/')
->assertOk()
->assertSee('href="#services"', false);
});
test('home page contains services section with id', function () {
$this->get('/')
->assertOk()
->assertSee('id="services"', false);
});