Compare commits

...

27 Commits

Author SHA1 Message Date
Naser Mansour 147231f216 removed peer verification for emails 2026-01-28 17:12:41 +02:00
Naser Mansour 80c4f621de show actual mail error 2026-01-28 17:06:11 +02:00
Naser Mansour 4fef8dc165 Use plain HTML for test email to avoid mail namespace issue 2026-01-28 16:50:58 +02:00
Naser Mansour 4283944f33 mail fix #1 2026-01-28 16:48:32 +02:00
Naser Mansour d51688aa2b added debug to the emails 2026-01-28 16:45:20 +02:00
Naser Mansour 3a5ac9c130 added the booking msgs that the client asked for 2026-01-28 01:54:29 +02:00
Naser Mansour cc85c67034 finished client asked text edits 2026-01-28 01:46:13 +02:00
Naser Mansour 21375352f5 changed libra firm to libra for rights 2026-01-24 20:18:51 +02:00
Naser Mansour ee770e8846 changed Business Legal Services 2026-01-24 20:13:22 +02:00
Naser Mansour 6662981172 updated founder bio 2026-01-24 20:10:38 +02:00
Naser Mansour 70233a2854 reduced spacing between forst 2 sentancces in the home page 2026-01-24 20:06:59 +02:00
Naser Mansour 62563ee783 fixed invisible button in working hours 2026-01-17 12:54:40 +02:00
Naser Mansour f8d9133c8a disabeled 2fa 2026-01-17 12:46:17 +02:00
Naser Mansour 83d51c441f fixes for auto referesh and user icon dtop down 2026-01-17 12:35:59 +02:00
Naser Mansour 42014c458c fixed the issue on auto refresh for widgets 2026-01-17 12:28:25 +02:00
Naser Mansour 71114974ab updated claude md with production info of php-fpm setup 2026-01-17 12:22:32 +02:00
Naser Mansour d8cda5b87f fixed the layout path not defined that we faced on production 2026-01-16 03:24:42 +02:00
Naser Mansour e8c17305a9 removed the scholarship stiff from /about 2026-01-11 23:36:28 +02:00
Naser Mansour 4c992c01f5 fixed servicies in home page 2026-01-11 21:11:58 +02:00
Naser Mansour ceb2985f16 fixed that libra gets translated to arabic instead of keeping it as its a brand name 2026-01-11 21:08:36 +02:00
Naser Mansour 366cc1ed44 changed coloring in /about 2026-01-11 21:05:30 +02:00
Naser Mansour abde8698ee complete story 16.6 2026-01-11 21:02:17 +02:00
Naser Mansour 5a23b35e19 complete story 16.5 2026-01-11 20:57:39 +02:00
Naser Mansour e65df52e2a complete story 16.4 2026-01-11 20:52:52 +02:00
Naser Mansour 9e13a77781 complete story 16.3 2026-01-11 20:49:43 +02:00
Naser Mansour 6d10abac1a complete story 16.2 2026-01-11 20:43:49 +02:00
Naser Mansour 877569e6e8 complete story 16.1 2026-01-11 20:35:51 +02:00
42 changed files with 25291 additions and 172 deletions
+31 -1
View File
@@ -6,7 +6,37 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
Libra Law Firm is a bilingual (Arabic/English) web platform for managing client consultations, appointments, and case tracking. It serves as both a public-facing website and an internal management tool.
**Domain:** libra.ps
**Domain:** libra.adv.ps (production), libra.test (local)
## Production Environment
- **Server:** Rocky Linux 9.6 on 69.62.106.94
- **PHP:** 8.4 (use `php84` command, not `php`)
- **Database:** MariaDB/MySQL
### Production Commands
All artisan commands on production require `php84` prefix:
```bash
php84 artisan migrate
php84 artisan config:cache
php84 artisan optimize:clear
```
### Deployment Checklist
```bash
# On production server
composer install --no-dev --optimize-autoloader
php84 artisan migrate --force
php84 artisan optimize:clear
php84 artisan config:cache
php84 artisan route:cache
php84 artisan view:cache
# IMPORTANT: Always restart PHP-FPM after deployment
sudo systemctl restart php84-php-fpm
```
**Note:** The server has both PHP 8.3 and 8.4. Always use `php84` for artisan commands. Failing to restart PHP-FPM can cause cached config issues.
## Development Commands
+4 -4
View File
@@ -149,10 +149,10 @@ return [
Features::emailVerification(),
Features::updateProfileInformation(),
Features::updatePasswords(),
Features::twoFactorAuthentication([
'confirm' => true,
'confirmPassword' => true,
]),
// Features::twoFactorAuthentication([
// 'confirm' => true,
// 'confirmPassword' => true,
// ]), // DISABLED - client request
],
];
+5
View File
@@ -0,0 +1,5 @@
<?php
return [
'layout' => 'components.layouts.app',
];
+25
View File
@@ -47,6 +47,13 @@ return [
'password' => env('MAIL_PASSWORD'),
'timeout' => null,
'local_domain' => env('MAIL_EHLO_DOMAIN', parse_url((string) env('APP_URL', 'http://localhost'), PHP_URL_HOST)),
'stream' => [
'ssl' => [
'allow_self_signed' => true,
'verify_peer' => false,
'verify_peer_name' => false,
],
],
],
'ses' => [
@@ -115,4 +122,22 @@ return [
'name' => env('MAIL_FROM_NAME', 'Example'),
],
/*
|--------------------------------------------------------------------------
| Markdown Mail Settings
|--------------------------------------------------------------------------
|
| If you are using Markdown based email rendering, you may configure your
| theme and component paths here, allowing you to customize the design
| of the emails. Or, you may simply stick with the Laravel defaults!
|
*/
'markdown' => [
'theme' => 'default',
'paths' => [
resource_path('views/vendor/mail'),
],
],
];
+1202
View File
File diff suppressed because it is too large Load Diff
+100 -13
View File
@@ -170,19 +170,19 @@ return [
## Dev Checklist
- [ ] Add route for `/about` in `routes/web.php`
- [ ] Create `resources/views/pages/about.blade.php`
- [ ] Create `lang/en/about.php` with initial translations
- [ ] Create `lang/ar/about.php` with initial translations
- [ ] Add About Us link to navigation
- [ ] Implement hero section with dark green background
- [ ] Style page title with correct typography
- [ ] Add tagline below title
- [ ] Add identity statement
- [ ] Test responsive layout (mobile, tablet, desktop)
- [ ] Test RTL layout (Arabic)
- [ ] Test LTR layout (English)
- [ ] Verify navigation link works correctly
- [x] Add route for `/about` in `routes/web.php`
- [x] Create `resources/views/pages/about.blade.php`
- [x] Create `lang/en/about.php` with initial translations
- [x] Create `lang/ar/about.php` with initial translations
- [x] Add About Us link to navigation
- [x] Implement hero section with dark green background
- [x] Style page title with correct typography
- [x] Add tagline below title
- [x] Add identity statement
- [x] Test responsive layout (mobile, tablet, desktop)
- [x] Test RTL layout (Arabic)
- [x] Test LTR layout (English)
- [x] Verify navigation link works correctly
## Estimation
@@ -194,3 +194,90 @@ return [
- Public layout exists
- Navigation component exists
- Brand colors defined in CSS
---
## Dev Agent Record
### Status
Ready for Review
### Agent Model Used
Claude Opus 4.5 (claude-opus-4-5-20251101)
### File List
| File | Action |
|------|--------|
| `routes/web.php` | Modified - Added `/about` route |
| `resources/views/livewire/pages/about.blade.php` | Created - About page Volt component with hero section |
| `lang/en/about.php` | Created - English translations |
| `lang/ar/about.php` | Created - Arabic translations |
| `lang/en/navigation.php` | Modified - Added 'about' key |
| `lang/ar/navigation.php` | Modified - Added 'about' key |
| `resources/views/components/navigation.blade.php` | Modified - Added About Us links to desktop and mobile navigation |
| `tests/Feature/Public/AboutPageTest.php` | Created - 16 tests covering all acceptance criteria |
### Change Log
- Added Volt route for `/about` page with named route 'about'
- Created About page Volt component using class-based pattern with public layout
- Implemented hero section with Dark Forest Green (#2D3624) background
- Added responsive typography (2rem mobile, 2.5rem tablet, 3rem desktop)
- Added tagline with white/80 opacity and 800px max-width
- Added identity statement with white/70 opacity and 700px max-width
- Created English and Arabic translation files for about page content
- Added 'about' navigation translation keys to both language files
- Updated navigation component with About Us link in desktop and mobile views
- Added data-test attributes for navigation links (nav-about, mobile-nav-about)
- Created comprehensive test suite with 16 tests covering all acceptance criteria
### Completion Notes
- All acceptance criteria implemented and tested
- 16 tests passing with 33 assertions
- RTL/LTR support verified through existing public layout
- Responsive layout implemented with Tailwind breakpoints
- Hero section extends full-width with negative margins to override container padding
- Placeholder comments added for future story sections (Vision, Mission, Values, Goals, Services, Scholarship)
### DoD Checklist
1. **Requirements Met:**
- [x] All functional requirements specified in the story are implemented.
- [x] All acceptance criteria defined in the story are met.
2. **Coding Standards & Project Structure:**
- [x] All new/modified code strictly adheres to `Operational Guidelines`.
- [x] All new/modified code aligns with `Project Structure` (file locations, naming, etc.).
- [x] Adherence to `Tech Stack` for technologies/versions used.
- [N/A] Adherence to `Api Reference` and `Data Models` - No API or data model changes.
- [x] Basic security best practices applied.
- [x] No new linter errors or warnings introduced.
- [x] Code is well-commented where necessary.
3. **Testing:**
- [x] All required unit tests implemented (16 tests for About page).
- [N/A] Integration tests - Not applicable for static page.
- [x] All tests pass successfully (16 passed, 33 assertions).
- [x] Test coverage meets project standards.
4. **Functionality & Verification:**
- [x] Functionality verified via automated tests.
- [x] Edge cases handled (RTL/LTR, both languages).
5. **Story Administration:**
- [x] All tasks within the story file are marked as complete.
- [x] Clarifications documented in Dev Agent Record.
- [x] Story wrap up section completed.
6. **Dependencies, Build & Configuration:**
- [x] Project builds successfully without errors.
- [x] Project linting passes (273 files checked).
- [N/A] No new dependencies added.
- [N/A] No new environment variables introduced.
7. **Documentation:**
- [x] Inline code documentation complete (placeholders for future sections).
- [N/A] No user-facing documentation changes needed.
- [N/A] No architectural changes requiring technical documentation.
**Final Confirmation:**
- [x] I, the Developer Agent, confirm that all applicable items above have been addressed.
@@ -217,17 +217,17 @@
## Dev Checklist
- [ ] Add vision section to about.blade.php
- [ ] Style vision header with gold underline
- [ ] Add vision statement with decorative quotes
- [ ] Add mission section with cream background
- [ ] Style mission header with gold underline
- [ ] Create 3 mission cards with icons
- [ ] Implement responsive grid (3 cols → 2 cols → 1 col)
- [ ] Add all English translations
- [ ] Add all Arabic translations
- [ ] Test RTL layout
- [ ] Test responsive breakpoints
- [x] Add vision section to about.blade.php
- [x] Style vision header with gold underline
- [x] Add vision statement with decorative quotes
- [x] Add mission section with cream background
- [x] Style mission header with gold underline
- [x] Create 3 mission cards with icons
- [x] Implement responsive grid (3 cols → 2 cols → 1 col)
- [x] Add all English translations
- [x] Add all Arabic translations
- [x] Test RTL layout
- [x] Test responsive breakpoints
## Estimation
@@ -238,3 +238,37 @@
- Story 16.1 completed (page structure exists)
- Flux icons available
---
## Dev Agent Record
### Status
Ready for Review
### Agent Model Used
claude-opus-4-5-20251101
### File List
| File | Action |
|------|--------|
| `resources/views/livewire/pages/about.blade.php` | Modified |
| `lang/en/about.php` | Modified |
| `lang/ar/about.php` | Modified |
| `tests/Feature/Public/AboutPageTest.php` | Modified |
### Change Log
- Added Vision section with white background, H2 header with gold underline, and decorative quote styling
- Added Mission section with cream background, H2 header with gold underline
- Implemented 3 mission cards (Institution, Society, Diaspora) with Flux icons
- Added responsive grid: 3 cols desktop, 2 cols tablet, 1 col mobile
- Added all English translations (vision_title, vision_text, mission_title, mission cards)
- Added all Arabic translations
- Added 17 new tests covering all acceptance criteria
- All 33 About page tests pass
### Completion Notes
- RTL support verified via existing layout tests (dir="rtl" applied correctly)
- Responsive grid tested via CSS class assertions
- Flux icons render as inline SVGs (test updated to check for SVG presence)
- Pre-existing test failure in AuthBackgroundPatternTest (unrelated to this story)
+38 -10
View File
@@ -207,16 +207,16 @@
## Dev Checklist
- [ ] Add values section to about.blade.php
- [ ] Style section header with gold underline
- [ ] Add intro text
- [ ] Create 6 value cards with icons
- [ ] Implement responsive grid (6 → 3 → 2 columns)
- [ ] Add hover effects to cards
- [ ] Add all English translations
- [ ] Add all Arabic translations
- [ ] Test RTL layout
- [ ] Test responsive breakpoints
- [x] Add values section to about.blade.php
- [x] Style section header with gold underline
- [x] Add intro text
- [x] Create 6 value cards with icons
- [x] Implement responsive grid (6 → 3 → 2 columns)
- [x] Add hover effects to cards
- [x] Add all English translations
- [x] Add all Arabic translations
- [x] Test RTL layout
- [x] Test responsive breakpoints
## Estimation
@@ -227,3 +227,31 @@
- Story 16.2 completed (mission section exists above)
- Flux icons available
---
## Dev Agent Record
### Status
Ready for Review
### Agent Model Used
claude-opus-4-5-20251101
### Completion Notes
- Added values section with 6 value cards following the exact HTML structure from technical notes
- Implemented responsive grid: 2 cols mobile, 3 cols tablet, 6 cols desktop
- Added all English and Arabic translations for values section
- Used Flux icons: shield-check, scale, academic-cap, heart, briefcase, light-bulb
- Added hover shadow effect on cards
- All 19 new tests pass (52 total AboutPageTest tests pass)
- RTL support works automatically with centered text and grid layout
### File List
- `resources/views/livewire/pages/about.blade.php` (modified)
- `lang/en/about.php` (modified)
- `lang/ar/about.php` (modified)
- `tests/Feature/Public/AboutPageTest.php` (modified)
### Change Log
- 2026-01-11: Implemented Story 16.3 values section with all acceptance criteria met
+21 -10
View File
@@ -158,16 +158,27 @@
## Dev Checklist
- [ ] Add goals section to about.blade.php
- [ ] Style section header with gold underline
- [ ] Create white card container
- [ ] Implement 2-column grid layout
- [ ] Style numbered circles (gold background, white text)
- [ ] Display all 7 goals with proper spacing
- [ ] Add English translations (array format)
- [ ] Add Arabic translations (array format)
- [ ] Test RTL layout (numbers on right)
- [ ] Test responsive breakpoints
- [x] Add goals section to about.blade.php
- [x] Style section header with gold underline
- [x] Create white card container
- [x] Implement 2-column grid layout
- [x] Style numbered circles (gold background, white text)
- [x] Display all 7 goals with proper spacing
- [x] Add English translations (array format)
- [x] Add Arabic translations (array format)
- [x] Test RTL layout (numbers on right)
- [x] Test responsive breakpoints
## File List
- `resources/views/livewire/pages/about.blade.php` - Added goals section
- `lang/en/about.php` - Added goals_title and goals array translations
- `lang/ar/about.php` - Added goals_title and goals array translations
- `tests/Feature/Public/AboutPageTest.php` - Added 21 tests for Story 16.4
## Status
Ready for Review
## Estimation
@@ -301,17 +301,17 @@
## Dev Checklist
- [ ] Add services section to about.blade.php
- [ ] Style section header with gold underline
- [ ] Add intro text
- [ ] Create 4 service category cards with icons
- [ ] Add bullet list items to each card
- [ ] Implement responsive grid (4 → 2 → 1 columns)
- [ ] Add CTA button linking to /booking
- [ ] Add all English translations (arrays)
- [ ] Add all Arabic translations (arrays)
- [ ] Test RTL layout
- [ ] Test responsive breakpoints
- [x] Add services section to about.blade.php
- [x] Style section header with gold underline
- [x] Add intro text
- [x] Create 4 service category cards with icons
- [x] Add bullet list items to each card
- [x] Implement responsive grid (4 → 2 → 1 columns)
- [x] Add CTA button linking to /booking
- [x] Add all English translations (arrays)
- [x] Add all Arabic translations (arrays)
- [x] Test RTL layout
- [x] Test responsive breakpoints
## Estimation
@@ -323,3 +323,35 @@
- Story 16.4 completed (goals section exists above)
- Booking route exists at `/booking`
- Flux icons available
---
## Dev Agent Record
### Status
Ready for Review
### Agent Model Used
Claude Opus 4.5
### File List
- `resources/views/livewire/pages/about.blade.php` - Added services section with 4 service cards
- `lang/en/about.php` - Added English translations for services section
- `lang/ar/about.php` - Added Arabic translations for services section
- `tests/Feature/Public/AboutPageTest.php` - Added 26 tests for services section (Story 16.5)
### Debug Log References
None - No issues encountered
### Completion Notes
- Implemented services section below the goals section on the About page
- Added 4 service category cards: Legal Consultations & Representation, Women's & Family Law, Civil & Commercial Disputes, Business Legal Services
- Each card has an icon, title, and bullet list of services
- Responsive grid: 4 columns desktop, 2 columns tablet, 1 column mobile
- CTA button linking to /booking page
- Full bilingual support (EN/AR) with RTL layout
- 26 new tests added covering all acceptance criteria
- All 206 public page tests pass
### Change Log
- 2026-01-11: Initial implementation of Story 16.5 - Legal Services Section
+48 -11
View File
@@ -162,17 +162,17 @@
## Dev Checklist
- [ ] Add scholarship section to about.blade.php
- [ ] Style section with dark green background
- [ ] Style header with gold underline
- [ ] Add two-paragraph description
- [ ] Create 4 aspiration items with icons
- [ ] Implement responsive grid (4 → 2 → 1 columns)
- [ ] Add English translations
- [ ] Add Arabic translations
- [ ] Test RTL layout
- [ ] Test responsive breakpoints
- [ ] Ensure visual contrast is accessible (WCAG)
- [x] Add scholarship section to about.blade.php
- [x] Style section with dark green background
- [x] Style header with gold underline
- [x] Add two-paragraph description
- [x] Create 4 aspiration items with icons
- [x] Implement responsive grid (4 → 2 → 1 columns)
- [x] Add English translations
- [x] Add Arabic translations
- [x] Test RTL layout
- [x] Test responsive breakpoints
- [x] Ensure visual contrast is accessible (WCAG)
## Estimation
@@ -183,3 +183,40 @@
- Story 16.5 completed (services section exists above)
- Flux icons available
---
## Dev Agent Record
### Status
Ready for Review
### Agent Model Used
Claude Opus 4.5
### File List
| File | Action |
|------|--------|
| `resources/views/livewire/pages/about.blade.php` | Modified - Added scholarship aspiration section |
| `lang/en/about.php` | Modified - Added scholarship translation keys |
| `lang/ar/about.php` | Modified - Added scholarship translation keys |
| `tests/Feature/Public/AboutPageTest.php` | Modified - Added 18 tests for scholarship section |
### Debug Log References
None - implementation completed without issues.
### Completion Notes
- Implemented scholarship section with Dark Forest Green (#2D3624) background per AC1
- Added decorative gold border frame accent (border-accent/20) for elegant visual appeal per AC6
- Responsive padding: 60px desktop (lg:py-[60px]), 48px tablet (sm:py-12), 32px mobile (py-8)
- Responsive grid: 4 columns on desktop, 2x2 on tablet, single column on mobile per AC7
- Added subtle separators between aspiration items using border-s classes
- RTL support works automatically via Tailwind's logical properties (border-s, ps-6)
- All 18 new tests pass covering both English and Arabic content
- All 225 Public tests pass, no regressions
- Pint linting passes
### Change Log
| Date | Change |
|------|--------|
| 2026-01-11 | Initial implementation of scholarship aspiration section |
+80
View File
@@ -0,0 +1,80 @@
<?php
return [
'title' => 'من نحن',
'tagline' => 'ملتزمون بالعدالة – متجذرون بالكرامة – مدفوعون للدفاع',
'identity' => 'مؤسسة قانونية نسيجاً أصيلاً من المجتمع، تستخدم البحث كأداة قوة لخدمة العدالة.',
// Vision Section
'vision_title' => 'رؤيتنا',
'vision_text' => 'ليبرا نسيجًا أصيلًا من المجتمع، تتقصّى مشاكله وتوثّقها وتكشف جذورها، وتقدّم حلولًا عملية لرتق الآلام المجتمعية مهما بدت صغيرة من خلال العمل المشترك، والبحث الميداني الحقيقي، والانخراط الواعي في قطاع العدالة.',
// Mission Section
'mission_title' => 'رسالتنا',
'mission_intro' => 'تعمل ليبرا على ملامسة نبض المجتمع، وتقصّي مشاكله وتوثيقها، وتحويلها إلى معرفة وحلول قانونية مبتكرة. نرافق الأفراد والمؤسسات بصدق ومهنية، ونعمل على تعزيز العدالة وتمكين النساء والنهوض ببيئة أعمال صحية من خلال القانون والبحث والعمل الميداني.',
'mission_institution_title' => 'لمؤسستنا',
'mission_institution_text' => 'تعمل ليبرا في قلب المجتمع ملتقطةً نبضه، محققةً في تحدياته، موثقةً إياها، ومحولةً لها إلى معرفة وحلول قانونية مبتكرة. نرافق الأفراد والمؤسسات بأمانة واحترافية، ساعين لتحقيق العدالة، وتمكين المرأة، وتعزيز بيئة أعمال صحية من خلال القانون والبحث والعمل الميداني.',
'mission_society_title' => 'للمجتمع',
'mission_society_text' => 'تطمح ليبرا إلى إعادة ربط المجتمع بتاريخه وإرثه القانوني، والعمل كشريك موثوق للقضاء.',
'mission_diaspora_title' => 'للفلسطينيين في الشتات',
'mission_diaspora_text' => 'ليبرا منصة للاستماع إلى الفلسطينيين في الشتات وتعزيز ارتباطهم بالأرض الفلسطينية من خلال مساعدتهم في البحث والتحقيق في عائلاتهم وتاريخهم، والبحث في أراضيهم، وتوفير منصة للاستماع إلى آرائهم حول القضية الفلسطينية والمجتمعات الفلسطينية في الخارج.',
// Values Section
'values_title' => 'قيمنا',
'values_intro' => 'هذه القيم تبدأ من الميدان وتعود إلى الناس.',
'value_integrity' => 'النزاهة',
'value_justice' => 'العدالة',
'value_knowledge' => 'المعرفة',
'value_women' => 'تمكين المرأة',
'value_professionalism' => 'الاحترافية',
'value_innovation' => 'الابتكار الاجتماعي',
// Goals Section
'goals_title' => 'أهدافنا',
'goals' => [
'دعم المهنيين القانونيين الفلسطينيين وتطوير قدراتهم المهنية والبحثية.',
'توثيق وتحليل القضايا المجتمعية لإنتاج معرفة قانونية متجذرة في الواقع.',
'إعداد وكتابة أوراق بحثية تعالج القضايا القانونية المعاصرة بعمق ومنهجية.',
'إطلاق برامج توعية قانونية ترفع وعي المجتمع بحقوقه وواجباته.',
'تعزيز الصلة بين المجتمع وتاريخه القانوني من خلال المبادرات المعرفية والثقافية.',
'تطوير حلول قانونية مبتكرة قائمة على البحث الميداني الذي يعكس السياق الاجتماعي الفلسطيني.',
'تعزيز العدالة وتمكين المرأة من خلال خدمات قانونية متخصصة وميسّرة.',
],
// Services Section
'services_title' => 'خدماتنا القانونية',
'services_intro' => 'تقدم ليبرا خدمات قانونية شاملة تجمع بين الممارسة القانونية التقليدية والرؤية المبنية على البحث.',
'services_cta' => 'احجز استشارة',
'service_consultation_title' => 'الاستشارات والتمثيل القانوني',
'service_consultation_items' => [
'الاستشارات القانونية',
'التمثيل أمام المحاكم',
'إدارة التقاضي',
'المذكرات والاستئناف',
],
'service_family_title' => 'قانون المرأة والأسرة',
'service_family_items' => [
'إجراءات الطلاق',
'قضايا النفقة',
'حضانة الأطفال',
'الحماية من العنف',
],
'service_civil_title' => 'النزاعات المدنية والتجارية',
'service_civil_items' => [
'قضايا الشراكة',
'المطالبات المالية',
'النزاعات المدنية',
'التقاضي التجاري',
],
'service_business_title' => 'الخدمات القانونية للأعمال',
'service_business_items' => [
'صياغة ومراجعة العقود',
'الحوكمة والامتثال',
'التحكيم حل البديل للنزاعات والوساطة',
'حلول لحماية أفكارك الإبداعية',
],
];
+29
View File
@@ -82,4 +82,33 @@ return [
'too_many_attempts' => 'محاولات حجز كثيرة جداً. يرجى المحاولة لاحقاً.',
'success_title' => 'تم تقديم طلب الحجز!',
'success_message' => 'لقد تلقينا طلب الاستشارة الخاص بك. ستتلقى رسالة تأكيد عبر البريد الإلكتروني قريباً. سيقوم فريقنا بمراجعة طلبك والتواصل معك.',
// Expectations section
'expectations_from_us_title' => 'ماذا تتوقع منّا',
'expect_focused_consultation' => 'استشارة مُركّزة',
'expect_focused_consultation_desc' => 'تقديم رأي قانوني أو بحثي متخصص ومهيكل، يذهب مباشرة إلى جوهر مشكلتك أو استفسارك.',
'expect_confidentiality' => 'أمان وسرية تامة',
'expect_confidentiality_desc' => 'التزام مطلق بحماية خصوصيتك والتعامل مع معلوماتك بأعلى درجات السرية.',
'expect_practical_solutions' => 'حلول واقعية',
'expect_practical_solutions_desc' => 'توضيح الخيارات القانونية المتاحة لك بشكل عملي وقابل للتطبيق، بعيداً عن التعقيد النظري.',
'expect_roadmap' => 'خارطة طريق',
'expect_roadmap_desc' => 'إرشادك بوضوح للخطوات التالية التي يجب عليك اتخاذها بعد انتهاء الاستشارة.',
'expectations_from_you_title' => 'ما نتوقعه منك',
'your_transparency' => 'الشفافية والوضوح',
'your_transparency_desc' => 'تزويدنا بكافة المعلومات والوثائق ذات الصلة قبل أو أثناء الجلسة (إن وُجدت) لضمان دقة الرأي القانوني.',
'your_punctuality' => 'الالتزام بالوقت',
'your_punctuality_desc' => 'الحضور في الموعد المحدد لضمان استفادتك الكاملة من وقت الاستشارة المخصص لك.',
'your_confirmation' => 'تأكيد الحجز',
'your_confirmation_desc' => 'استكمال إجراءات الحجز، وسداد الرسوم المترتبة (في حال كانت الخدمة المختارة مدفوعة).',
'before_booking_title' => 'قبل حجز موعد الاستشارة يجب أن تعلم',
'note_purpose' => 'تهدف الاستشارة إلى تقييم الحالة قانونيًا وتوضيح الخيارات المتاحة.',
'note_duration' => 'مدة الاستشارة 45 دقيقة، ويتم الالتزام بها.',
'note_format' => 'تُقدَّم الاستشارات حضوريًا أو عن بُعد بحسب المتاح عند الحجز.',
'note_prepare' => 'يُرجى تجهيز ملخص للوقائع والمستندات الأساسية قبل الموعد.',
'note_confidential' => 'جميع المعلومات التي تُعرض خلال الاستشارة تُعامل بسرية تامة.',
'note_no_obligation' => 'لا يترتب على الاستشارة أي التزام بقبول القضية أو التمثيل القانوني.',
'note_arbitration' => 'في حال كان موضوع الاستشارة الاستعانة بمكتبنا كمُحكّم معتمد، يرجى كتابة كلمة «تحكيم» في ملخص المشكلة، مع الاكتفاء بذكر الاسم الرباعي واسم الخصم فقط، دون الخوض في أي تفاصيل أخرى.',
'note_cancellation' => 'يمكن إلغاء الموعد وفق سياسة الإلغاء المعتمدة، ويحق لليبرا رفض الاستشارة عند وجود تعارض مصالح أو عدم اختصاص.',
];
+1 -1
View File
@@ -9,5 +9,5 @@ return [
'legal' => 'قانوني',
'terms' => 'شروط الخدمة',
'privacy' => 'سياسة الخصوصية',
'copyright' => 'مكتب الميزان للمحاماة. جميع الحقوق محفوظة.',
'copyright' => 'مكتب ليبرا للحقوق. جميع الحقوق محفوظة.',
];
+30 -19
View File
@@ -10,32 +10,43 @@ return [
'about_title' => 'تعرف على المؤسِّسة',
'lawyer_name' => 'هدى عرموش',
'lawyer_title' => 'محامية',
'lawyer_bio' => 'أسست هدى عرموش ليبرا للحقوق برؤية لإنشاء مؤسسة قانونية منسوجة من نسيج المجتمع. بالتزامها بالعدالة والكرامة، تقود ممارسة تحقق في التحديات وتوثقها وتحولها إلى حلول قانونية مبتكرة. تُرافق ليبرا الأفراد والمؤسسات بأمانة واحترافية، ساعية لتعزيز العدالة وتمكين المرأة من خلال القانون والبحث والعمل الميداني.',
'lawyer_bio' => 'أسست هدى عرموش ليبرا للحقوق انطلاقًا من رؤية تهدف إلى بناء مؤسسة قانونية متجذّرة في نسيج المجتمع، تؤمن بأن العدالة ممارسة يومية وليست مجرد مبدأ نظري. وبالتزام راسخ بقيم الكرامة والمسؤولية، تقود ليبرا ممارسة قانونية تُحلّل التحديات، وتوثّقها، وتحولها إلى حلول قانونية مبتكرة وفعّالة.',
'lawyer_bio_2' => 'ترافق ليبرا الأفراد والمؤسسات بأعلى درجات الأمانة والاحتراف، وتسعى إلى تعزيز العدالة وتمكين المرأة من خلال العمل القانوني المتخصص، والبحث، والمبادرات الميدانية المؤثرة.',
// Services Section
'services_title' => 'خدماتنا',
'services_subtitle' => 'حلول قانونية شاملة للأفراد والشركات',
'services' => [
'consultations' => [
'icon' => 'chat-bubble-left-right',
'title' => 'الاستشارات القانونية',
'description' => 'استشارات قانونية متخصصة مصممة وفقاً لوضعك واحتياجاتك.',
'service_consultation_title' => 'الاستشارات والتمثيل القانوني',
'service_consultation_items' => [
'الاستشارات القانونية',
'التمثيل أمام المحاكم',
'إدارة التقاضي',
'المذكرات والاستئناف',
],
'representation' => [
'icon' => 'scale',
'title' => 'التمثيل أمام المحاكم',
'description' => 'تمثيل احترافي أمام المحاكم والهيئات القضائية في جميع المراحل.',
'service_family_title' => 'قانون المرأة والأسرة',
'service_family_items' => [
'إجراءات الطلاق',
'قضايا النفقة',
'حضانة الأطفال',
'الحماية من العنف',
],
'litigation' => [
'icon' => 'document-text',
'title' => 'إدارة الدعاوى',
'description' => 'إدارة كاملة للقضايا من اللوائح والمذكرات إلى الاستئنافات.',
],
'contracts' => [
'icon' => 'pencil-square',
'title' => 'خدمات العقود',
'description' => 'صياغة ومراجعة العقود والامتثال القانوني لجميع احتياجاتكم التعاقدية.',
'service_civil_title' => 'النزاعات المدنية والتجارية',
'service_civil_items' => [
'قضايا الشراكة',
'المطالبات المالية',
'النزاعات المدنية',
'التقاضي التجاري',
],
'service_business_title' => 'الخدمات القانونية للأعمال',
'service_business_items' => [
'صياغة ومراجعة العقود',
'الحوكمة والامتثال',
'التحكيم / الحل البديل للمنازعات',
'الوساطة',
],
// Values Section
+1
View File
@@ -12,6 +12,7 @@ return [
'repository' => 'المستودع',
'documentation' => 'التوثيق',
'home' => 'الرئيسية',
'about' => 'من نحن',
'booking' => 'حجز استشارة',
'posts' => 'مقالات قانونية',
'back' => 'رجوع',
+80
View File
@@ -0,0 +1,80 @@
<?php
return [
'title' => 'About Us',
'tagline' => 'Committed to Justice Grounded in Dignity Driven to Advocate',
'identity' => 'A legal institution, an authentic fabric of society, using research as a tool of power to serve justice.',
// Vision Section
'vision_title' => 'Our Vision',
'vision_text' => 'Libra is an authentic fabric of society, investigating its problems, documenting them, uncovering their roots, and offering practical solutions to mend social pains, no matter how small, through collaborative work, genuine field research, and conscious engagement in the justice sector.',
// Mission Section
'mission_title' => 'Our Mission',
'mission_intro' => 'Libra works to touch the pulse of society, investigating its problems and documenting them, and transforming them into knowledge and innovative legal solutions. We accompany individuals and institutions with honesty and professionalism, working to promote justice, empower women, and advance a healthy business environment through law, research, and fieldwork.',
'mission_institution_title' => 'For Our Institution',
'mission_institution_text' => 'Libra works at the heart of society capturing its pulse, investigating its challenges, documenting them, and transforming them into knowledge and innovative legal solutions. We accompany individuals and institutions with honesty and professionalism, striving to advance justice, empower women, and foster a healthy business environment through law, research, and fieldwork.',
'mission_society_title' => 'For Society',
'mission_society_text' => 'Libra aspires to reconnect society with its history and legal heritage, and serve as a trusted partner to the judiciary.',
'mission_diaspora_title' => 'For Palestinians in the Diaspora',
'mission_diaspora_text' => 'Libra is a platform for listening to Palestinians in the diaspora and strengthening their connection to the Palestinian land by helping them research and investigate their families and history, research and investigate their lands, and providing them with a platform to hear their views on the Palestinian issue and Palestinian communities abroad.',
// Values Section
'values_title' => 'Our Values',
'values_intro' => 'These values start in the field and return to the people.',
'value_integrity' => 'Integrity',
'value_justice' => 'Justice',
'value_knowledge' => 'Knowledge',
'value_women' => 'Women\'s Empowerment',
'value_professionalism' => 'Professionalism',
'value_innovation' => 'Social Innovation',
// Goals Section
'goals_title' => 'Our Goals',
'goals' => [
'Supporting Palestinian legal professionals and developing their professional and research capabilities.',
'Documenting and analyzing community cases to produce legal knowledge grounded in reality.',
'Preparing and writing research papers that address contemporary legal issues in depth and systematically.',
'Launching legal awareness programs that raise community awareness of rights and obligations.',
'Strengthening the connection between society and its legal history through knowledge-based and cultural initiatives.',
'Developing innovative legal solutions based on field research that reflects the Palestinian social context.',
'Promoting justice and empowering women through specialized and accessible legal services.',
],
// Services Section
'services_title' => 'Our Legal Services',
'services_intro' => 'Libra provides comprehensive legal services, combining traditional legal practice with research-driven insight.',
'services_cta' => 'Book a Consultation',
'service_consultation_title' => 'Legal Consultations & Representation',
'service_consultation_items' => [
'Legal advice',
'Court representation',
'Litigation management',
'Pleadings & appeals',
],
'service_family_title' => 'Women\'s & Family Law',
'service_family_items' => [
'Divorce proceedings',
'Alimony cases',
'Child custody',
'Protection from violence',
],
'service_civil_title' => 'Civil & Commercial Disputes',
'service_civil_items' => [
'Partnership cases',
'Financial claims',
'Civil disputes',
'Commercial litigation',
],
'service_business_title' => 'Business Legal Services',
'service_business_items' => [
'Contract drafting & review',
'Governance & compliance',
'Arbitration, alternative dispute resolution & mediation',
'Solutions to protect your creative ideas',
],
];
+29
View File
@@ -82,4 +82,33 @@ return [
'too_many_attempts' => 'Too many booking attempts. Please try again later.',
'success_title' => 'Booking Request Submitted!',
'success_message' => 'We have received your consultation request. You will receive an email confirmation shortly. Our team will review your request and contact you.',
// Expectations section
'expectations_from_us_title' => 'What to Expect from Us',
'expect_focused_consultation' => 'Focused Consultation',
'expect_focused_consultation_desc' => 'A specialized, structured legal or research opinion that goes directly to the core of your issue or inquiry.',
'expect_confidentiality' => 'Complete Security & Confidentiality',
'expect_confidentiality_desc' => 'Absolute commitment to protecting your privacy and handling your information with the highest level of confidentiality.',
'expect_practical_solutions' => 'Practical Solutions',
'expect_practical_solutions_desc' => 'Clear explanation of your available legal options in a practical and actionable manner, free from theoretical complexity.',
'expect_roadmap' => 'Clear Roadmap',
'expect_roadmap_desc' => 'Clear guidance on the next steps you need to take after the consultation ends.',
'expectations_from_you_title' => 'What We Expect from You',
'your_transparency' => 'Transparency & Clarity',
'your_transparency_desc' => 'Provide us with all relevant information and documents before or during the session (if available) to ensure accurate legal advice.',
'your_punctuality' => 'Punctuality',
'your_punctuality_desc' => 'Attend at the scheduled time to ensure you fully benefit from your allocated consultation time.',
'your_confirmation' => 'Booking Confirmation',
'your_confirmation_desc' => 'Complete the booking procedures and pay any applicable fees (if the selected service is paid).',
'before_booking_title' => 'Before Booking, You Should Know',
'note_purpose' => 'The consultation aims to legally evaluate your situation and clarify available options.',
'note_duration' => 'The consultation duration is 45 minutes, and this is strictly adhered to.',
'note_format' => 'Consultations are offered in-person or remotely based on availability at the time of booking.',
'note_prepare' => 'Please prepare a summary of the facts and essential documents before your appointment.',
'note_confidential' => 'All information shared during the consultation is treated with complete confidentiality.',
'note_no_obligation' => 'The consultation does not create any obligation to accept the case or provide legal representation.',
'note_arbitration' => 'If the consultation is about engaging our office as an accredited arbitrator, please write "Arbitration" in the problem summary, mentioning only your full name and the opposing party\'s name, without any other details.',
'note_cancellation' => 'Appointments can be cancelled according to the cancellation policy. Libra reserves the right to decline a consultation in case of conflict of interest or lack of jurisdiction.',
];
+1 -1
View File
@@ -9,5 +9,5 @@ return [
'legal' => 'Legal',
'terms' => 'Terms of Service',
'privacy' => 'Privacy Policy',
'copyright' => 'Libra Law Firm. All rights reserved.',
'copyright' => 'Libra for Rights. All rights reserved.',
];
+30 -19
View File
@@ -10,32 +10,43 @@ return [
'about_title' => 'Meet the Founder',
'lawyer_name' => 'Huda Armouche',
'lawyer_title' => 'Attorney at Law',
'lawyer_bio' => 'Huda Armouche founded Libra for Rights with a vision to create a legal institution woven from the fabric of society. With a commitment to justice and dignity, she leads a practice that investigates challenges, documents them, and transforms them into innovative legal solutions. Libra accompanies individuals and institutions with honesty and professionalism, striving to advance justice and empower women through law, research, and fieldwork.',
'lawyer_bio' => 'Huda Armouche founded Libra for Rights with a vision to build a legal institution rooted in the fabric of society, believing that justice is a daily practice, not merely a theoretical principle. With a steadfast commitment to dignity and responsibility, Libra leads a legal practice that analyzes challenges, documents them, and transforms them into innovative and effective legal solutions.',
'lawyer_bio_2' => 'Libra accompanies individuals and institutions with the highest levels of integrity and professionalism, striving to advance justice and empower women through specialized legal work, research, and impactful field initiatives.',
// Services Section
'services_title' => 'Our Services',
'services_subtitle' => 'Comprehensive legal solutions for individuals and businesses',
'services' => [
'consultations' => [
'icon' => 'chat-bubble-left-right',
'title' => 'Legal Consultations',
'description' => 'Expert legal advice tailored to your specific situation and needs.',
'service_consultation_title' => 'Legal Consultations & Representation',
'service_consultation_items' => [
'Legal advice',
'Court representation',
'Litigation management',
'Pleadings & appeals',
],
'representation' => [
'icon' => 'scale',
'title' => 'Court Representation',
'description' => 'Professional representation before courts and judicial bodies at all stages.',
'service_family_title' => 'Women\'s & Family Law',
'service_family_items' => [
'Divorce proceedings',
'Alimony cases',
'Child custody',
'Protection from violence',
],
'litigation' => [
'icon' => 'document-text',
'title' => 'Litigation Management',
'description' => 'Complete case management from pleadings and memoranda to appeals.',
],
'contracts' => [
'icon' => 'pencil-square',
'title' => 'Contract Services',
'description' => 'Drafting, review, and legal compliance for all your contractual needs.',
'service_civil_title' => 'Civil & Commercial Disputes',
'service_civil_items' => [
'Partnership cases',
'Financial claims',
'Civil disputes',
'Commercial litigation',
],
'service_business_title' => 'Business Legal Services',
'service_business_items' => [
'Contract drafting & review',
'Governance & compliance',
'Arbitration / Alternative dispute resolution',
'Mediation',
],
// Values Section
+1
View File
@@ -12,6 +12,7 @@ return [
'repository' => 'Repository',
'documentation' => 'Documentation',
'home' => 'Home',
'about' => 'About Us',
'booking' => 'Book Consultation',
'posts' => 'Legal Insights',
'back' => 'Back',
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
+10468
View File
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2
View File
@@ -0,0 +1,2 @@
{"/livewire.js":"0f6341c0"}
+9
View File
@@ -187,6 +187,15 @@
background-color: rgb(228 228 231) !important;
}
/* Flux Switch - ensure visibility in off state on white backgrounds */
[data-flux-switch] {
background-color: rgb(161 161 170) !important; /* zinc-400 - visible gray for off state */
}
[data-flux-switch][data-checked] {
background-color: var(--color-cta) !important; /* Warm Gold when on */
}
/* ==========================================================================
Logo Badge Styling (Story 12.2)
Creates "seal/stamp" effect for logo on Dark Charcoal backgrounds
@@ -0,0 +1,135 @@
@props(['class' => ''])
<div {{ $attributes->merge(['class' => 'space-y-3 ' . $class]) }}>
{{-- What to expect from us --}}
<details class="group rounded-lg border border-zinc-200 bg-white">
<summary class="flex cursor-pointer items-center justify-between gap-3 p-4 font-medium text-zinc-900 [&::-webkit-details-marker]:hidden">
<div class="flex items-center gap-3">
<div class="flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-green-100">
<flux:icon name="check-badge" class="h-5 w-5 text-green-600" />
</div>
<span>{{ __('booking.expectations_from_us_title') }}</span>
</div>
<flux:icon name="chevron-down" class="h-5 w-5 text-zinc-400 transition-transform group-open:rotate-180" />
</summary>
<div class="border-t border-zinc-100 px-4 pb-4 pt-3">
<ul class="space-y-3 text-sm text-zinc-600">
<li class="flex gap-3">
<flux:icon name="light-bulb" class="mt-0.5 h-5 w-5 shrink-0 text-amber-500" />
<div>
<span class="font-medium text-zinc-800">{{ __('booking.expect_focused_consultation') }}</span>
<p class="mt-0.5">{{ __('booking.expect_focused_consultation_desc') }}</p>
</div>
</li>
<li class="flex gap-3">
<flux:icon name="shield-check" class="mt-0.5 h-5 w-5 shrink-0 text-amber-500" />
<div>
<span class="font-medium text-zinc-800">{{ __('booking.expect_confidentiality') }}</span>
<p class="mt-0.5">{{ __('booking.expect_confidentiality_desc') }}</p>
</div>
</li>
<li class="flex gap-3">
<flux:icon name="puzzle-piece" class="mt-0.5 h-5 w-5 shrink-0 text-amber-500" />
<div>
<span class="font-medium text-zinc-800">{{ __('booking.expect_practical_solutions') }}</span>
<p class="mt-0.5">{{ __('booking.expect_practical_solutions_desc') }}</p>
</div>
</li>
<li class="flex gap-3">
<flux:icon name="map" class="mt-0.5 h-5 w-5 shrink-0 text-amber-500" />
<div>
<span class="font-medium text-zinc-800">{{ __('booking.expect_roadmap') }}</span>
<p class="mt-0.5">{{ __('booking.expect_roadmap_desc') }}</p>
</div>
</li>
</ul>
</div>
</details>
{{-- What we expect from you --}}
<details class="group rounded-lg border border-zinc-200 bg-white">
<summary class="flex cursor-pointer items-center justify-between gap-3 p-4 font-medium text-zinc-900 [&::-webkit-details-marker]:hidden">
<div class="flex items-center gap-3">
<div class="flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-blue-100">
<flux:icon name="user-circle" class="h-5 w-5 text-blue-600" />
</div>
<span>{{ __('booking.expectations_from_you_title') }}</span>
</div>
<flux:icon name="chevron-down" class="h-5 w-5 text-zinc-400 transition-transform group-open:rotate-180" />
</summary>
<div class="border-t border-zinc-100 px-4 pb-4 pt-3">
<ul class="space-y-3 text-sm text-zinc-600">
<li class="flex gap-3">
<flux:icon name="document-text" class="mt-0.5 h-5 w-5 shrink-0 text-amber-500" />
<div>
<span class="font-medium text-zinc-800">{{ __('booking.your_transparency') }}</span>
<p class="mt-0.5">{{ __('booking.your_transparency_desc') }}</p>
</div>
</li>
<li class="flex gap-3">
<flux:icon name="clock" class="mt-0.5 h-5 w-5 shrink-0 text-amber-500" />
<div>
<span class="font-medium text-zinc-800">{{ __('booking.your_punctuality') }}</span>
<p class="mt-0.5">{{ __('booking.your_punctuality_desc') }}</p>
</div>
</li>
<li class="flex gap-3">
<flux:icon name="clipboard-document-check" class="mt-0.5 h-5 w-5 shrink-0 text-amber-500" />
<div>
<span class="font-medium text-zinc-800">{{ __('booking.your_confirmation') }}</span>
<p class="mt-0.5">{{ __('booking.your_confirmation_desc') }}</p>
</div>
</li>
</ul>
</div>
</details>
{{-- Before booking - Important notes --}}
<details class="group rounded-lg border border-amber-200 bg-amber-50" open>
<summary class="flex cursor-pointer items-center justify-between gap-3 p-4 font-medium text-zinc-900 [&::-webkit-details-marker]:hidden">
<div class="flex items-center gap-3">
<div class="flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-amber-200">
<flux:icon name="exclamation-triangle" class="h-5 w-5 text-amber-700" />
</div>
<span>{{ __('booking.before_booking_title') }}</span>
</div>
<flux:icon name="chevron-down" class="h-5 w-5 text-amber-600 transition-transform group-open:rotate-180" />
</summary>
<div class="border-t border-amber-200 px-4 pb-4 pt-3">
<ul class="space-y-2 text-sm text-zinc-700">
<li class="flex items-start gap-2">
<span class="mt-1.5 h-1.5 w-1.5 shrink-0 rounded-full bg-amber-500"></span>
<span>{{ __('booking.note_purpose') }}</span>
</li>
<li class="flex items-start gap-2">
<span class="mt-1.5 h-1.5 w-1.5 shrink-0 rounded-full bg-amber-500"></span>
<span>{{ __('booking.note_duration') }}</span>
</li>
<li class="flex items-start gap-2">
<span class="mt-1.5 h-1.5 w-1.5 shrink-0 rounded-full bg-amber-500"></span>
<span>{{ __('booking.note_format') }}</span>
</li>
<li class="flex items-start gap-2">
<span class="mt-1.5 h-1.5 w-1.5 shrink-0 rounded-full bg-amber-500"></span>
<span>{{ __('booking.note_prepare') }}</span>
</li>
<li class="flex items-start gap-2">
<span class="mt-1.5 h-1.5 w-1.5 shrink-0 rounded-full bg-amber-500"></span>
<span>{{ __('booking.note_confidential') }}</span>
</li>
<li class="flex items-start gap-2">
<span class="mt-1.5 h-1.5 w-1.5 shrink-0 rounded-full bg-amber-500"></span>
<span>{{ __('booking.note_no_obligation') }}</span>
</li>
<li class="flex items-start gap-2">
<span class="mt-1.5 h-1.5 w-1.5 shrink-0 rounded-full bg-amber-500"></span>
<span>{{ __('booking.note_arbitration') }}</span>
</li>
<li class="flex items-start gap-2">
<span class="mt-1.5 h-1.5 w-1.5 shrink-0 rounded-full bg-amber-500"></span>
<span>{{ __('booking.note_cancellation') }}</span>
</li>
</ul>
</div>
</details>
</div>
@@ -54,6 +54,17 @@
>
{{ __('navigation.home') }}
</a>
<a
href="{{ route('about') }}"
@class([
'text-off-white hover:text-cta transition-colors py-2',
'border-b-2 border-cta' => request()->routeIs('about'),
])
wire:navigate
data-test="nav-about"
>
{{ __('navigation.about') }}
</a>
<a
href="{{ route('booking') }}"
@class([
@@ -156,6 +167,18 @@
>
{{ __('navigation.home') }}
</a>
<a
href="{{ route('about') }}"
@class([
'block px-3 py-3 text-off-white hover:text-cta hover:bg-primary-light rounded-md min-h-[44px] flex items-center',
'bg-active border-s-2 border-cta' => request()->routeIs('about'),
])
wire:navigate
@click="mobileMenuOpen = false"
data-test="mobile-nav-about"
>
{{ __('navigation.about') }}
</a>
<a
href="{{ route('booking') }}"
@class([
+26 -27
View File
@@ -1,33 +1,32 @@
@component('mail::message')
@if($locale === 'ar')
<div dir="rtl" style="text-align: right;">
# {{ __('emails.test_email_title', [], $locale) }}
{{ __('emails.test_email_body', [], $locale) }}
{{ __('emails.test_email_timestamp', ['time' => now()->format('Y-m-d H:i:s')], $locale) }}
{{ __('emails.test_email_config_info', [], $locale) }}
- **{{ __('emails.sender_name', [], $locale) }}** {{ config('mail.from.name') }}
- **{{ __('emails.sender_email', [], $locale) }}** {{ config('mail.from.address') }}
{{ __('emails.regards', [], $locale) }}<br>
{{ config('app.name') }}
<!DOCTYPE html>
<html lang="{{ $locale }}" dir="{{ $locale === 'ar' ? 'rtl' : 'ltr' }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>{{ __('emails.test_email_subject', [], $locale) }}</title>
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px; {{ $locale === 'ar' ? 'text-align: right;' : '' }}">
<div style="background: #2D3624; padding: 20px; text-align: center; margin-bottom: 20px;">
<h1 style="color: #A68966; margin: 0;">{{ config('app.name') }}</h1>
</div>
@else
# {{ __('emails.test_email_title', [], $locale) }}
{{ __('emails.test_email_body', [], $locale) }}
<div style="background: #F4F1EA; padding: 20px; border-radius: 5px;">
<h2 style="color: #2D322A;">{{ __('emails.test_email_title', [], $locale) }}</h2>
{{ __('emails.test_email_timestamp', ['time' => now()->format('Y-m-d H:i:s')], $locale) }}
<p>{{ __('emails.test_email_body', [], $locale) }}</p>
{{ __('emails.test_email_config_info', [], $locale) }}
<p>{{ __('emails.test_email_timestamp', ['time' => now()->format('Y-m-d H:i:s')], $locale) }}</p>
- **{{ __('emails.sender_name', [], $locale) }}** {{ config('mail.from.name') }}
- **{{ __('emails.sender_email', [], $locale) }}** {{ config('mail.from.address') }}
<p>{{ __('emails.test_email_config_info', [], $locale) }}</p>
{{ __('emails.regards', [], $locale) }}<br>
{{ config('app.name') }}
@endif
@endcomponent
<ul style="list-style: none; padding: 0;">
<li><strong>{{ __('emails.sender_name', [], $locale) }}</strong> {{ config('mail.from.name') }}</li>
<li><strong>{{ __('emails.sender_email', [], $locale) }}</strong> {{ config('mail.from.address') }}</li>
</ul>
</div>
<div style="margin-top: 20px; padding-top: 20px; border-top: 1px solid #ddd; text-align: center; color: #666; font-size: 12px;">
<p>{{ __('emails.regards', [], $locale) }}<br>{{ config('app.name') }}</p>
</div>
</body>
</html>
@@ -5,6 +5,11 @@ use Livewire\Volt\Component;
new class extends Component
{
public function refresh(): void
{
// Explicit refresh method for wire:poll compatibility
}
public function with(): array
{
return [
@@ -5,6 +5,11 @@ use Livewire\Volt\Component;
new class extends Component
{
public function refresh(): void
{
// Explicit refresh method for wire:poll compatibility
}
public function with(): array
{
return [
@@ -5,6 +5,11 @@ use Livewire\Volt\Component;
new class extends Component
{
public function refresh(): void
{
// Explicit refresh method for wire:poll compatibility
}
public function with(): array
{
return [
@@ -232,6 +232,9 @@ new class extends Component
@if(!$selectedDate || !$selectedTime)
<!-- Step 1: Calendar Selection -->
<div class="mt-6">
{{-- Booking Expectations --}}
<x-booking-expectations class="mb-6" />
<p class="mb-4 text-zinc-600">{{ __('booking.select_date_time') }}</p>
<livewire:availability-calendar :booked-dates="$bookedDates" />
</div>
@@ -0,0 +1,294 @@
<?php
use Livewire\Attributes\Layout;
use Livewire\Volt\Component;
new #[Layout('components.layouts.public')] class extends Component
{
//
}; ?>
<div>
{{-- Hero Section --}}
<section class="bg-background py-10 sm:py-[60px] lg:py-20 -mx-4 sm:-mx-6 lg:-mx-8 -mt-6 sm:-mt-8">
<div class="container mx-auto px-4 text-center">
{{-- Page Title --}}
<h1 class="text-[2rem] sm:text-[2.5rem] lg:text-[3rem] font-bold text-text mb-2">
{{ __('about.title') }}
</h1>
{{-- Tagline --}}
<p class="text-xl sm:text-2xl text-text/80 max-w-[800px] mx-auto mb-4">
{{ __('about.tagline') }}
</p>
{{-- Identity Statement --}}
<p class="text-lg text-text/70 max-w-[700px] mx-auto">
{{ __('about.identity') }}
</p>
</div>
</section>
{{-- Vision Section --}}
<section class="bg-white py-8 sm:py-12 lg:py-[60px]">
<div class="container mx-auto px-4">
<h2 class="text-2xl lg:text-3xl font-bold text-text text-center mb-2">
{{ __('about.vision_title') }}
</h2>
<div class="w-20 h-1 bg-accent mx-auto mb-8"></div>
<blockquote class="max-w-[900px] mx-auto text-center text-lg text-text/90">
<span class="text-4xl text-accent leading-none align-top">"</span>
<span class="italic">{{ __('about.vision_text') }}</span>
<span class="text-4xl text-accent leading-none align-bottom">"</span>
</blockquote>
</div>
</section>
{{-- Mission Section --}}
<section class="bg-background py-8 sm:py-12 lg:py-[60px]">
<div class="container mx-auto px-4">
<h2 class="text-2xl lg:text-3xl font-bold text-text text-center mb-2">
{{ __('about.mission_title') }}
</h2>
<div class="w-20 h-1 bg-accent mx-auto mb-8"></div>
<div class="bg-white rounded-lg shadow-sm p-6 sm:p-8 max-w-[900px] mx-auto mb-12">
<p class="text-center text-lg text-text/90">
{{ __('about.mission_intro') }}
</p>
</div>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
{{-- Card 1: For Institution --}}
<div class="bg-white rounded-lg shadow-sm p-6">
<div class="text-accent mb-4">
<flux:icon name="building-office" class="w-12 h-12" />
</div>
<h3 class="text-xl font-bold text-text mb-3">
{{ __('about.mission_institution_title') }}
</h3>
<p class="text-text/80">
{{ __('about.mission_institution_text') }}
</p>
</div>
{{-- Card 2: For Society --}}
<div class="bg-white rounded-lg shadow-sm p-6">
<div class="text-accent mb-4">
<flux:icon name="user-group" class="w-12 h-12" />
</div>
<h3 class="text-xl font-bold text-text mb-3">
{{ __('about.mission_society_title') }}
</h3>
<p class="text-text/80">
{{ __('about.mission_society_text') }}
</p>
</div>
{{-- Card 3: For Diaspora --}}
<div class="bg-white rounded-lg shadow-sm p-6 md:col-span-2 lg:col-span-1">
<div class="text-accent mb-4">
<flux:icon name="globe-alt" class="w-12 h-12" />
</div>
<h3 class="text-xl font-bold text-text mb-3">
{{ __('about.mission_diaspora_title') }}
</h3>
<p class="text-text/80">
{{ __('about.mission_diaspora_text') }}
</p>
</div>
</div>
</div>
</section>
{{-- Values Section --}}
<section class="bg-white py-8 sm:py-12 lg:py-[60px]">
<div class="container mx-auto px-4">
<h2 class="text-2xl lg:text-3xl font-bold text-text text-center mb-2">
{{ __('about.values_title') }}
</h2>
<div class="w-20 h-1 bg-accent mx-auto mb-4"></div>
<p class="text-center text-text/70 max-w-xl mx-auto mb-12">
{{ __('about.values_intro') }}
</p>
<div class="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-4 lg:gap-6">
{{-- Integrity --}}
<div class="bg-background rounded-xl p-6 text-center hover:shadow-md transition-shadow">
<div class="text-accent mb-3">
<flux:icon name="shield-check" class="w-10 h-10 mx-auto" />
</div>
<h4 class="font-semibold text-text">
{{ __('about.value_integrity') }}
</h4>
</div>
{{-- Justice --}}
<div class="bg-background rounded-xl p-6 text-center hover:shadow-md transition-shadow">
<div class="text-accent mb-3">
<flux:icon name="scale" class="w-10 h-10 mx-auto" />
</div>
<h4 class="font-semibold text-text">
{{ __('about.value_justice') }}
</h4>
</div>
{{-- Knowledge --}}
<div class="bg-background rounded-xl p-6 text-center hover:shadow-md transition-shadow">
<div class="text-accent mb-3">
<flux:icon name="academic-cap" class="w-10 h-10 mx-auto" />
</div>
<h4 class="font-semibold text-text">
{{ __('about.value_knowledge') }}
</h4>
</div>
{{-- Women's Empowerment --}}
<div class="bg-background rounded-xl p-6 text-center hover:shadow-md transition-shadow">
<div class="text-accent mb-3">
<flux:icon name="heart" class="w-10 h-10 mx-auto" />
</div>
<h4 class="font-semibold text-text">
{{ __('about.value_women') }}
</h4>
</div>
{{-- Professionalism --}}
<div class="bg-background rounded-xl p-6 text-center hover:shadow-md transition-shadow">
<div class="text-accent mb-3">
<flux:icon name="briefcase" class="w-10 h-10 mx-auto" />
</div>
<h4 class="font-semibold text-text">
{{ __('about.value_professionalism') }}
</h4>
</div>
{{-- Social Innovation --}}
<div class="bg-background rounded-xl p-6 text-center hover:shadow-md transition-shadow">
<div class="text-accent mb-3">
<flux:icon name="light-bulb" class="w-10 h-10 mx-auto" />
</div>
<h4 class="font-semibold text-text">
{{ __('about.value_innovation') }}
</h4>
</div>
</div>
</div>
</section>
{{-- Goals Section --}}
<section class="bg-background py-8 sm:py-12 lg:py-[60px]">
<div class="container mx-auto px-4">
<h2 class="text-2xl lg:text-3xl font-bold text-text text-center mb-2">
{{ __('about.goals_title') }}
</h2>
<div class="w-20 h-1 bg-accent mx-auto mb-12"></div>
<div class="bg-white rounded-lg shadow-sm p-6 sm:p-8 max-w-5xl mx-auto">
<div class="grid grid-cols-1 md:grid-cols-2 gap-x-12 gap-y-6">
@foreach(__('about.goals') as $index => $goal)
<div class="flex items-start gap-4">
<span class="flex-shrink-0 w-8 h-8 bg-accent text-white rounded-full flex items-center justify-center font-bold text-sm">
{{ $index + 1 }}
</span>
<p class="text-text/90 pt-1">{{ $goal }}</p>
</div>
@endforeach
</div>
</div>
</div>
</section>
{{-- Services Section --}}
<section class="bg-white py-8 sm:py-12 lg:py-[60px]">
<div class="container mx-auto px-4">
<h2 class="text-2xl lg:text-3xl font-bold text-text text-center mb-2">
{{ __('about.services_title') }}
</h2>
<div class="w-20 h-1 bg-accent mx-auto mb-4"></div>
<p class="text-center text-text/70 max-w-3xl mx-auto mb-12">
{{ __('about.services_intro') }}
</p>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 mb-12">
{{-- Legal Consultations & Representation --}}
<div class="bg-background rounded-xl p-8 text-center shadow-sm">
<div class="text-accent mb-4">
<flux:icon name="scale" class="w-12 h-12 mx-auto" />
</div>
<h3 class="text-lg font-bold text-text mb-4">
{{ __('about.service_consultation_title') }}
</h3>
<ul class="text-sm text-text/80 space-y-2 text-start">
@foreach(__('about.service_consultation_items') as $item)
<li class="flex items-center gap-2">
<span class="w-1.5 h-1.5 bg-accent rounded-full flex-shrink-0"></span>
{{ $item }}
</li>
@endforeach
</ul>
</div>
{{-- Women's & Family Law --}}
<div class="bg-background rounded-xl p-8 text-center shadow-sm">
<div class="text-accent mb-4">
<flux:icon name="heart" class="w-12 h-12 mx-auto" />
</div>
<h3 class="text-lg font-bold text-text mb-4">
{{ __('about.service_family_title') }}
</h3>
<ul class="text-sm text-text/80 space-y-2 text-start">
@foreach(__('about.service_family_items') as $item)
<li class="flex items-center gap-2">
<span class="w-1.5 h-1.5 bg-accent rounded-full flex-shrink-0"></span>
{{ $item }}
</li>
@endforeach
</ul>
</div>
{{-- Civil & Commercial Disputes --}}
<div class="bg-background rounded-xl p-8 text-center shadow-sm">
<div class="text-accent mb-4">
<flux:icon name="building-office" class="w-12 h-12 mx-auto" />
</div>
<h3 class="text-lg font-bold text-text mb-4">
{{ __('about.service_civil_title') }}
</h3>
<ul class="text-sm text-text/80 space-y-2 text-start">
@foreach(__('about.service_civil_items') as $item)
<li class="flex items-center gap-2">
<span class="w-1.5 h-1.5 bg-accent rounded-full flex-shrink-0"></span>
{{ $item }}
</li>
@endforeach
</ul>
</div>
{{-- Business Legal Services --}}
<div class="bg-background rounded-xl p-8 text-center shadow-sm">
<div class="text-accent mb-4">
<flux:icon name="briefcase" class="w-12 h-12 mx-auto" />
</div>
<h3 class="text-lg font-bold text-text mb-4">
{{ __('about.service_business_title') }}
</h3>
<ul class="text-sm text-text/80 space-y-2 text-start">
@foreach(__('about.service_business_items') as $item)
<li class="flex items-center gap-2">
<span class="w-1.5 h-1.5 bg-accent rounded-full flex-shrink-0"></span>
{{ $item }}
</li>
@endforeach
</ul>
</div>
</div>
<div class="text-center">
<flux:button variant="primary" href="{{ route('booking') }}">
{{ __('about.services_cta') }}
</flux:button>
</div>
</div>
</section>
</div>
@@ -236,9 +236,8 @@ new #[Layout('components.layouts.public')] class extends Component
@if(!$selectedDate || !$selectedTime)
{{-- Step 1: Calendar Selection --}}
<flux:callout class="mb-6">
<p class="text-body">{{ __('booking.guest_intro') }}</p>
</flux:callout>
{{-- Booking Expectations --}}
<x-booking-expectations class="mb-6" />
<p class="mb-4 text-zinc-600">
{{ __('booking.select_date_time') }}
+71 -10
View File
@@ -22,12 +22,12 @@ new #[Layout('components.layouts.public')] class extends Component
<section class="bg-background py-8 sm:py-12 lg:py-16">
<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">
<h1 class="text-[1.75rem] sm:text-[2rem] lg:text-[2.5rem] font-bold text-text mb-2">
{{ __('home.tagline') }}
</h1>
{{-- Introductory Text --}}
<p class="text-text text-base sm:text-lg max-w-[800px] mx-auto mb-8">
<p class="text-text text-base sm:text-lg max-w-[800px] mx-auto mb-6">
{{ __('home.intro') }}
</p>
@@ -71,6 +71,9 @@ new #[Layout('components.layouts.public')] class extends Component
<p class="text-body leading-relaxed">
{{ __('home.lawyer_bio') }}
</p>
<p class="text-body leading-relaxed mt-4">
{{ __('home.lawyer_bio_2') }}
</p>
</div>
</div>
</div>
@@ -89,19 +92,77 @@ new #[Layout('components.layouts.public')] class extends Component
</div>
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6">
@foreach(['consultations', 'representation', 'litigation', 'contracts'] as $service)
{{-- Legal Consultations & Representation --}}
<div class="bg-card p-6 rounded-lg shadow-card text-center">
<div class="text-cta mb-4">
<flux:icon name="{{ __('home.services.' . $service . '.icon') }}" class="w-12 h-12 mx-auto" />
<flux:icon name="scale" class="w-12 h-12 mx-auto" />
</div>
<h3 class="text-lg font-bold text-text mb-2">
{{ __('home.services.' . $service . '.title') }}
<h3 class="text-lg font-bold text-text mb-4">
{{ __('home.service_consultation_title') }}
</h3>
<p class="text-body text-sm">
{{ __('home.services.' . $service . '.description') }}
</p>
</div>
<ul class="text-sm text-body space-y-2 text-start">
@foreach(__('home.service_consultation_items') as $item)
<li class="flex items-center gap-2">
<span class="w-1.5 h-1.5 bg-cta rounded-full flex-shrink-0"></span>
{{ $item }}
</li>
@endforeach
</ul>
</div>
{{-- Women's & Family Law --}}
<div class="bg-card p-6 rounded-lg shadow-card text-center">
<div class="text-cta mb-4">
<flux:icon name="heart" class="w-12 h-12 mx-auto" />
</div>
<h3 class="text-lg font-bold text-text mb-4">
{{ __('home.service_family_title') }}
</h3>
<ul class="text-sm text-body space-y-2 text-start">
@foreach(__('home.service_family_items') as $item)
<li class="flex items-center gap-2">
<span class="w-1.5 h-1.5 bg-cta rounded-full flex-shrink-0"></span>
{{ $item }}
</li>
@endforeach
</ul>
</div>
{{-- Civil & Commercial Disputes --}}
<div class="bg-card p-6 rounded-lg shadow-card text-center">
<div class="text-cta mb-4">
<flux:icon name="building-office" class="w-12 h-12 mx-auto" />
</div>
<h3 class="text-lg font-bold text-text mb-4">
{{ __('home.service_civil_title') }}
</h3>
<ul class="text-sm text-body space-y-2 text-start">
@foreach(__('home.service_civil_items') as $item)
<li class="flex items-center gap-2">
<span class="w-1.5 h-1.5 bg-cta rounded-full flex-shrink-0"></span>
{{ $item }}
</li>
@endforeach
</ul>
</div>
{{-- Business Legal Services --}}
<div class="bg-card p-6 rounded-lg shadow-card text-center">
<div class="text-cta mb-4">
<flux:icon name="briefcase" class="w-12 h-12 mx-auto" />
</div>
<h3 class="text-lg font-bold text-text mb-4">
{{ __('home.service_business_title') }}
</h3>
<ul class="text-sm text-body space-y-2 text-start">
@foreach(__('home.service_business_items') as $item)
<li class="flex items-center gap-2">
<span class="w-1.5 h-1.5 bg-cta rounded-full flex-shrink-0"></span>
{{ $item }}
</li>
@endforeach
</ul>
</div>
</div>
</div>
</section>
@@ -87,7 +87,12 @@ new class extends Component {
Mail::to(Auth::user())->send(new TestEmail($locale));
Session::flash('test-email-sent', true);
} catch (\Exception $e) {
\Log::error('Test email failed: ' . $e->getMessage(), [
'exception' => get_class($e),
'trace' => $e->getTraceAsString(),
]);
Session::flash('test-email-failed', true);
Session::flash('test-email-error', $e->getMessage());
}
}
}; ?>
@@ -160,6 +165,11 @@ new class extends Component {
<div class="mt-4">
<flux:callout variant="danger" icon="exclamation-triangle">
{{ __('admin.test_email_failed') }}
@if (session('test-email-error'))
<div class="mt-2 text-sm opacity-80">
{{ session('test-email-error') }}
</div>
@endif
</flux:callout>
</div>
@endif
+5 -2
View File
@@ -8,6 +8,7 @@ use Laravel\Fortify\Features;
use Livewire\Volt\Volt;
Volt::route('/', 'pages.home')->name('home');
Volt::route('/about', 'pages.about')->name('about');
Volt::route('/booking', 'pages.booking')->name('booking');
Volt::route('/booking/success', 'pages.booking-success')->name('booking.success');
@@ -161,14 +162,16 @@ Route::middleware(['auth', 'active'])->group(function () {
Volt::route('settings/profile', 'settings.profile')->name('profile.edit');
Volt::route('settings/password', 'settings.password')->name('user-password.edit');
// 2FA settings route - only registered when feature is enabled
if (Features::canManageTwoFactorAuthentication()) {
Volt::route('settings/two-factor', 'settings.two-factor')
->middleware(
when(
Features::canManageTwoFactorAuthentication()
&& Features::optionEnabled(Features::twoFactorAuthentication(), 'confirmPassword'),
Features::optionEnabled(Features::twoFactorAuthentication(), 'confirmPassword'),
['password.confirm'],
[],
),
)
->name('two-factor.show');
}
});
+1 -1
View File
@@ -228,7 +228,7 @@ describe('Footer Translations', function () {
test('Arabic footer translations are loaded', function () {
expect(__('footer.terms', [], 'ar'))->toBe('شروط الخدمة');
expect(__('footer.privacy', [], 'ar'))->toBe('سياسة الخصوصية');
expect(__('footer.copyright', [], 'ar'))->toBe('مكتب الميزان للمحاماة. جميع الحقوق محفوظة.');
expect(__('footer.copyright', [], 'ar'))->toBe('مكتب ليبرا للمحاماة. جميع الحقوق محفوظة.');
expect(__('footer.address', [], 'ar'))->toBe('العمارة الأمريكية - بجانب الشني - الطابق الرابع');
expect(__('footer.phone', [], 'ar'))->toBe('+970 599 353 502');
});
+898
View File
@@ -0,0 +1,898 @@
<?php
// AC1: Route & Navigation
test('about page is accessible at /about', function () {
$this->get('/about')
->assertOk();
});
test('about page route is named about', function () {
expect(route('about'))->toEndWith('/about');
});
// AC2: Page Structure
test('about page uses public layout', function () {
$this->get('/about')
->assertOk()
->assertSee('data-test="main-navigation"', false)
->assertSee('<footer', false);
});
// AC3: Hero Section Container
test('about page hero section has dark forest green background', function () {
$this->get('/about')
->assertOk()
->assertSee('bg-[#2D3624]', false);
});
// AC4: Page Title
test('about page displays title in English', function () {
$this->withSession(['locale' => 'en'])
->get('/about')
->assertOk()
->assertSee('About Us');
});
test('about page displays title in Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/about')
->assertOk()
->assertSee('من نحن');
});
// AC5: Tagline Display
test('about page displays tagline in English', function () {
$this->withSession(['locale' => 'en'])
->get('/about')
->assertOk()
->assertSee('Committed to Justice Grounded in Dignity Driven to Advocate');
});
test('about page displays tagline in Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/about')
->assertOk()
->assertSee('ملتزمون بالعدالة – متجذرون بالكرامة – مدفوعون للدفاع');
});
// AC6: Identity Statement
test('about page displays identity statement in English', function () {
$this->withSession(['locale' => 'en'])
->get('/about')
->assertOk()
->assertSee('A legal institution woven from the fabric of society, using research as a tool of power to serve justice.');
});
test('about page displays identity statement in Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/about')
->assertOk()
->assertSee('مؤسسة قانونية منسوجة من نسيج المجتمع، تستخدم البحث كأداة قوة لخدمة العدالة.');
});
// AC8: RTL Support - Verified via locale setting (RTL is handled by layout)
test('about page sets correct language direction for Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/about')
->assertOk()
->assertSee('dir="rtl"', false);
});
test('about page sets correct language direction for English', function () {
$this->withSession(['locale' => 'en'])
->get('/about')
->assertOk()
->assertSee('dir="ltr"', false);
});
// Navigation Link Tests
test('navigation contains about us link in English', function () {
$this->withSession(['locale' => 'en'])
->get('/')
->assertOk()
->assertSee('About Us')
->assertSee('href="'.route('about').'"', false);
});
test('navigation contains about us link in Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/')
->assertOk()
->assertSee('من نحن')
->assertSee('href="'.route('about').'"', false);
});
test('about link in navigation has data-test attribute', function () {
$this->get('/')
->assertOk()
->assertSee('data-test="nav-about"', false);
});
test('mobile navigation contains about us link', function () {
$this->get('/')
->assertOk()
->assertSee('data-test="mobile-nav-about"', false);
});
// Story 16.2: Vision & Mission Section Tests
// AC1: Vision Section Container
test('about page has vision section with white background', function () {
$this->get('/about')
->assertOk()
->assertSee('bg-white py-8', false);
});
// AC2: Vision Section Header
test('about page displays vision title in English', function () {
$this->withSession(['locale' => 'en'])
->get('/about')
->assertOk()
->assertSee('Our Vision');
});
test('about page displays vision title in Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/about')
->assertOk()
->assertSee('رؤيتنا');
});
// AC3: Vision Statement
test('about page displays vision statement in English', function () {
$this->withSession(['locale' => 'en'])
->get('/about')
->assertOk()
->assertSee('Libra is woven from the fabric of society');
});
test('about page displays vision statement in Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/about')
->assertOk()
->assertSee('ليبرا منسوجة من نسيج المجتمع');
});
// AC4: Mission Section Container
test('about page has mission section with cream background', function () {
$this->get('/about')
->assertOk()
->assertSee('bg-background py-8', false);
});
// AC5: Mission Section Header
test('about page displays mission title in English', function () {
$this->withSession(['locale' => 'en'])
->get('/about')
->assertOk()
->assertSee('Our Mission');
});
test('about page displays mission title in Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/about')
->assertOk()
->assertSee('مهمتنا');
});
// AC6: Mission Cards - Institution
test('about page displays institution mission card in English', function () {
$this->withSession(['locale' => 'en'])
->get('/about')
->assertOk()
->assertSee('For Our Institution')
->assertSee('Libra works at the heart of society');
});
test('about page displays institution mission card in Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/about')
->assertOk()
->assertSee('لمؤسستنا')
->assertSee('تعمل ليبرا في قلب المجتمع');
});
// AC6: Mission Cards - Society
test('about page displays society mission card in English', function () {
$this->withSession(['locale' => 'en'])
->get('/about')
->assertOk()
->assertSee('For Society')
->assertSee('Libra Scholarship for Law and Palestinian Arts');
});
test('about page displays society mission card in Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/about')
->assertOk()
->assertSee('للمجتمع')
->assertSee('منحة ليبرا للقانون والفنون الفلسطينية');
});
// AC6: Mission Cards - Diaspora
test('about page displays diaspora mission card in English', function () {
$this->withSession(['locale' => 'en'])
->get('/about')
->assertOk()
->assertSee('For Palestinians in the Diaspora')
->assertSee('platform for listening to Palestinians in the diaspora');
});
test('about page displays diaspora mission card in Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/about')
->assertOk()
->assertSee('للفلسطينيين في الشتات')
->assertSee('منصة للاستماع إلى الفلسطينيين في الشتات');
});
// AC7: Mission Card Styling
test('about page mission cards have correct styling', function () {
$this->get('/about')
->assertOk()
->assertSee('bg-white rounded-lg shadow-sm p-6', false);
});
// AC8: Responsive Grid
test('about page mission cards use responsive grid', function () {
$this->get('/about')
->assertOk()
->assertSee('grid-cols-1 md:grid-cols-2 lg:grid-cols-3', false);
});
// AC7: Icons present (Flux renders icons as inline SVGs)
test('about page mission cards have icons', function () {
$this->get('/about')
->assertOk()
->assertSee('<svg', false); // Flux icons render as inline SVGs
});
// Story 16.3: Values Section Tests
// AC1: Values Section Container
test('about page has values section with white background', function () {
$this->get('/about')
->assertOk()
->assertSee('bg-white py-8 sm:py-12 lg:py-[60px]', false);
});
// AC2: Values Section Header
test('about page displays values title in English', function () {
$this->withSession(['locale' => 'en'])
->get('/about')
->assertOk()
->assertSee('Our Values');
});
test('about page displays values title in Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/about')
->assertOk()
->assertSee('قيمنا');
});
// AC3: Values Introduction
test('about page displays values intro in English', function () {
$this->withSession(['locale' => 'en'])
->get('/about')
->assertOk()
->assertSee('These values start in the field and return to the people.');
});
test('about page displays values intro in Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/about')
->assertOk()
->assertSee('هذه القيم تبدأ من الميدان وتعود إلى الناس.');
});
// AC4: Six Value Cards - English
test('about page displays integrity value in English', function () {
$this->withSession(['locale' => 'en'])
->get('/about')
->assertOk()
->assertSee('Integrity');
});
test('about page displays justice value in English', function () {
$this->withSession(['locale' => 'en'])
->get('/about')
->assertOk()
->assertSee('Justice');
});
test('about page displays knowledge value in English', function () {
$this->withSession(['locale' => 'en'])
->get('/about')
->assertOk()
->assertSee('Knowledge');
});
test('about page displays women empowerment value in English', function () {
$this->withSession(['locale' => 'en'])
->get('/about')
->assertOk()
->assertSee("Women's Empowerment");
});
test('about page displays professionalism value in English', function () {
$this->withSession(['locale' => 'en'])
->get('/about')
->assertOk()
->assertSee('Professionalism');
});
test('about page displays social innovation value in English', function () {
$this->withSession(['locale' => 'en'])
->get('/about')
->assertOk()
->assertSee('Social Innovation');
});
// AC4: Six Value Cards - Arabic
test('about page displays integrity value in Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/about')
->assertOk()
->assertSee('النزاهة');
});
test('about page displays justice value in Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/about')
->assertOk()
->assertSee('العدالة');
});
test('about page displays knowledge value in Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/about')
->assertOk()
->assertSee('المعرفة');
});
test('about page displays women empowerment value in Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/about')
->assertOk()
->assertSee('تمكين المرأة');
});
test('about page displays professionalism value in Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/about')
->assertOk()
->assertSee('الاحترافية');
});
test('about page displays social innovation value in Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/about')
->assertOk()
->assertSee('الابتكار الاجتماعي');
});
// AC5: Value Card Styling
test('about page value cards have correct styling', function () {
$this->get('/about')
->assertOk()
->assertSee('bg-background rounded-xl p-6 text-center hover:shadow-md transition-shadow', false);
});
// AC6: Responsive Grid
test('about page value cards use responsive grid', function () {
$this->get('/about')
->assertOk()
->assertSee('grid-cols-2 md:grid-cols-3 lg:grid-cols-6', false);
});
// Story 16.4: Goals Section Tests
// AC1: Goals Section Container
test('about page has goals section with cream background', function () {
$this->get('/about')
->assertOk()
->assertSee('bg-background py-8 sm:py-12 lg:py-[60px]', false);
});
// AC2: Goals Section Header
test('about page displays goals title in English', function () {
$this->withSession(['locale' => 'en'])
->get('/about')
->assertOk()
->assertSee('Our Goals');
});
test('about page displays goals title in Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/about')
->assertOk()
->assertSee('أهدافنا');
});
// AC3: Seven Goals Display - English
test('about page displays goal 1 in English', function () {
$this->withSession(['locale' => 'en'])
->get('/about')
->assertOk()
->assertSee('Supporting Palestinian legal professionals and developing their professional and research capabilities.');
});
test('about page displays goal 2 in English', function () {
$this->withSession(['locale' => 'en'])
->get('/about')
->assertOk()
->assertSee('Documenting and analyzing community cases to produce legal knowledge grounded in reality.');
});
test('about page displays goal 3 in English', function () {
$this->withSession(['locale' => 'en'])
->get('/about')
->assertOk()
->assertSee('Preparing and writing research papers that address contemporary legal issues in depth and systematically.');
});
test('about page displays goal 4 in English', function () {
$this->withSession(['locale' => 'en'])
->get('/about')
->assertOk()
->assertSee('Launching legal awareness programs that raise community awareness of rights and obligations.');
});
test('about page displays goal 5 in English', function () {
$this->withSession(['locale' => 'en'])
->get('/about')
->assertOk()
->assertSee('Strengthening the connection between society and its legal history through knowledge-based and cultural initiatives.');
});
test('about page displays goal 6 in English', function () {
$this->withSession(['locale' => 'en'])
->get('/about')
->assertOk()
->assertSee('Developing innovative legal solutions based on field research that reflects the Palestinian social context.');
});
test('about page displays goal 7 in English', function () {
$this->withSession(['locale' => 'en'])
->get('/about')
->assertOk()
->assertSee('Promoting justice and empowering women through specialized and accessible legal services.');
});
// AC3: Seven Goals Display - Arabic
test('about page displays goal 1 in Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/about')
->assertOk()
->assertSee('دعم المهنيين القانونيين الفلسطينيين وتطوير قدراتهم المهنية والبحثية.');
});
test('about page displays goal 2 in Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/about')
->assertOk()
->assertSee('توثيق وتحليل القضايا المجتمعية لإنتاج معرفة قانونية متجذرة في الواقع.');
});
test('about page displays goal 3 in Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/about')
->assertOk()
->assertSee('إعداد وكتابة أوراق بحثية تعالج القضايا القانونية المعاصرة بعمق ومنهجية.');
});
test('about page displays goal 4 in Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/about')
->assertOk()
->assertSee('إطلاق برامج توعية قانونية ترفع وعي المجتمع بحقوقه وواجباته.');
});
test('about page displays goal 5 in Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/about')
->assertOk()
->assertSee('تعزيز الصلة بين المجتمع وتاريخه القانوني من خلال المبادرات المعرفية والثقافية.');
});
test('about page displays goal 6 in Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/about')
->assertOk()
->assertSee('تطوير حلول قانونية مبتكرة قائمة على البحث الميداني الذي يعكس السياق الاجتماعي الفلسطيني.');
});
test('about page displays goal 7 in Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/about')
->assertOk()
->assertSee('تعزيز العدالة وتمكين المرأة من خلال خدمات قانونية متخصصة وميسّرة.');
});
// AC4: Goals Card Container Styling
test('about page goals section has white card container', function () {
$this->get('/about')
->assertOk()
->assertSee('bg-white rounded-lg shadow-sm p-6 sm:p-8 max-w-5xl mx-auto', false);
});
// AC5: Numbered Circle Style
test('about page goals have numbered circles with gold background', function () {
$this->get('/about')
->assertOk()
->assertSee('w-8 h-8 bg-accent text-white rounded-full', false);
});
// AC6: Responsive Grid Layout
test('about page goals use responsive grid layout', function () {
$this->get('/about')
->assertOk()
->assertSee('grid-cols-1 md:grid-cols-2 gap-x-12 gap-y-6', false);
});
// AC7: All 7 goal numbers are displayed
test('about page displays all 7 goal numbers', function () {
$response = $this->withSession(['locale' => 'en'])->get('/about');
$response->assertOk();
// Verify there are 7 goals by checking the translation array count
expect(count(__('about.goals')))->toBe(7);
});
// Story 16.5: Legal Services Section Tests
// AC1: Services Section Container
test('about page has services section with white background', function () {
$this->get('/about')
->assertOk()
->assertSee('bg-white py-8 sm:py-12 lg:py-[60px]', false);
});
// AC2: Services Section Header
test('about page displays services title in English', function () {
$this->withSession(['locale' => 'en'])
->get('/about')
->assertOk()
->assertSee('Our Legal Services');
});
test('about page displays services title in Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/about')
->assertOk()
->assertSee('خدماتنا القانونية');
});
// AC3: Services Introduction
test('about page displays services intro in English', function () {
$this->withSession(['locale' => 'en'])
->get('/about')
->assertOk()
->assertSee('Libra provides comprehensive legal services as a for-profit law firm, combining traditional legal practice with research-driven insight.');
});
test('about page displays services intro in Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/about')
->assertOk()
->assertSee('تقدم ليبرا خدمات قانونية شاملة كمكتب محاماة ربحي، يجمع بين الممارسة القانونية التقليدية والرؤية المبنية على البحث.');
});
// AC4: Four Service Categories - Card 1: Legal Consultations & Representation
test('about page displays consultation service card title in English', function () {
$this->withSession(['locale' => 'en'])
->get('/about')
->assertOk()
->assertSee('Legal Consultations')
->assertSee('Representation');
});
test('about page displays consultation service card title in Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/about')
->assertOk()
->assertSee('الاستشارات والتمثيل القانوني');
});
test('about page displays consultation service items in English', function () {
$this->withSession(['locale' => 'en'])
->get('/about')
->assertOk()
->assertSee('Legal advice')
->assertSee('Court representation')
->assertSee('Litigation management')
->assertSee('Pleadings')
->assertSee('appeals');
});
test('about page displays consultation service items in Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/about')
->assertOk()
->assertSee('الاستشارات القانونية')
->assertSee('التمثيل أمام المحاكم')
->assertSee('إدارة التقاضي')
->assertSee('المذكرات والاستئناف');
});
// AC4: Four Service Categories - Card 2: Women's & Family Law
test('about page displays family service card title in English', function () {
$this->withSession(['locale' => 'en'])
->get('/about')
->assertOk()
->assertSee('Women')
->assertSee('Family Law');
});
test('about page displays family service card title in Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/about')
->assertOk()
->assertSee('قانون المرأة والأسرة');
});
test('about page displays family service items in English', function () {
$this->withSession(['locale' => 'en'])
->get('/about')
->assertOk()
->assertSee('Divorce proceedings')
->assertSee('Alimony cases')
->assertSee('Child custody')
->assertSee('Protection from violence');
});
test('about page displays family service items in Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/about')
->assertOk()
->assertSee('إجراءات الطلاق')
->assertSee('قضايا النفقة')
->assertSee('حضانة الأطفال')
->assertSee('الحماية من العنف');
});
// AC4: Four Service Categories - Card 3: Civil & Commercial
test('about page displays civil service card title in English', function () {
$this->withSession(['locale' => 'en'])
->get('/about')
->assertOk()
->assertSee('Civil')
->assertSee('Commercial Disputes');
});
test('about page displays civil service card title in Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/about')
->assertOk()
->assertSee('النزاعات المدنية والتجارية');
});
test('about page displays civil service items in English', function () {
$this->withSession(['locale' => 'en'])
->get('/about')
->assertOk()
->assertSee('Partnership cases')
->assertSee('Financial claims')
->assertSee('Civil disputes')
->assertSee('Commercial litigation');
});
test('about page displays civil service items in Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/about')
->assertOk()
->assertSee('قضايا الشراكة')
->assertSee('المطالبات المالية')
->assertSee('النزاعات المدنية')
->assertSee('التقاضي التجاري');
});
// AC4: Four Service Categories - Card 4: Business Services
test('about page displays business service card title in English', function () {
$this->withSession(['locale' => 'en'])
->get('/about')
->assertOk()
->assertSee('Business Legal Services');
});
test('about page displays business service card title in Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/about')
->assertOk()
->assertSee('الخدمات القانونية للأعمال');
});
test('about page displays business service items in English', function () {
$this->withSession(['locale' => 'en'])
->get('/about')
->assertOk()
->assertSee('Contract drafting')
->assertSee('review')
->assertSee('Governance')
->assertSee('compliance')
->assertSee('Arbitration')
->assertSee('Alternative dispute resolution');
});
test('about page displays business service items in Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/about')
->assertOk()
->assertSee('صياغة ومراجعة العقود')
->assertSee('الحوكمة والامتثال')
->assertSee('التحكيم')
->assertSee('الحل البديل للنزاعات');
});
// AC5: Service Card Styling
test('about page service cards have correct styling', function () {
$this->get('/about')
->assertOk()
->assertSee('bg-background rounded-xl p-8 text-center shadow-sm', false);
});
// AC6: Responsive Grid
test('about page service cards use responsive grid', function () {
$this->get('/about')
->assertOk()
->assertSee('grid-cols-1 md:grid-cols-2 lg:grid-cols-4', false);
});
// AC7: CTA Button
test('about page services section has CTA button in English', function () {
$this->withSession(['locale' => 'en'])
->get('/about')
->assertOk()
->assertSee('Book a Consultation');
});
test('about page services section has CTA button in Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/about')
->assertOk()
->assertSee('احجز استشارة');
});
test('about page services CTA links to booking page', function () {
$this->get('/about')
->assertOk()
->assertSee('href="'.route('booking').'"', false);
});
// Story 16.6: Scholarship Aspiration Section Tests
// AC1: Scholarship Section Container
test('about page has scholarship section with dark forest green background', function () {
$this->get('/about')
->assertOk()
->assertSee('bg-[#2D3624] py-8 sm:py-12 lg:py-[60px]', false);
});
// AC2: Scholarship Section Header
test('about page displays scholarship title in English', function () {
$this->withSession(['locale' => 'en'])
->get('/about')
->assertOk()
->assertSee('Our Aspiration: Libra Scholarship');
});
test('about page displays scholarship title in Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/about')
->assertOk()
->assertSee('طموحنا: منحة ليبرا');
});
// AC3: Scholarship Description
test('about page displays scholarship description paragraph 1 in English', function () {
$this->withSession(['locale' => 'en'])
->get('/about')
->assertOk()
->assertSee('Art is the ambassador of Historical Palestine and the Palestinian people.');
});
test('about page displays scholarship description paragraph 1 in Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/about')
->assertOk()
->assertSee('الفن هو سفير فلسطين التاريخية والشعب الفلسطيني.');
});
test('about page displays scholarship description paragraph 2 in English', function () {
$this->withSession(['locale' => 'en'])
->get('/about')
->assertOk()
->assertSee('We aim to open ongoing discussions about the Palestinian situation and reality');
});
test('about page displays scholarship description paragraph 2 in Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/about')
->assertOk()
->assertSee('نهدف إلى فتح نقاشات مستمرة حول الوضع والواقع الفلسطيني');
});
// AC4: Key Aspirations List
test('about page displays aspiration 1 in English', function () {
$this->withSession(['locale' => 'en'])
->get('/about')
->assertOk()
->assertSee('Empowering students to present Palestinian messages globally');
});
test('about page displays aspiration 1 in Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/about')
->assertOk()
->assertSee('تمكين الطلاب من تقديم الرسائل الفلسطينية عالمياً');
});
test('about page displays aspiration 2 in English', function () {
$this->withSession(['locale' => 'en'])
->get('/about')
->assertOk()
->assertSee('Opening ongoing discussions about Palestinian reality');
});
test('about page displays aspiration 2 in Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/about')
->assertOk()
->assertSee('فتح نقاشات مستمرة حول الواقع الفلسطيني');
});
test('about page displays aspiration 3 in English', function () {
$this->withSession(['locale' => 'en'])
->get('/about')
->assertOk()
->assertSee('Protecting intellectual property rights');
});
test('about page displays aspiration 3 in Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/about')
->assertOk()
->assertSee('حماية حقوق الملكية الفكرية');
});
test('about page displays aspiration 4 in English', function () {
$this->withSession(['locale' => 'en'])
->get('/about')
->assertOk()
->assertSee('Enabling participation in local and international exhibitions');
});
test('about page displays aspiration 4 in Arabic', function () {
$this->withSession(['locale' => 'ar'])
->get('/about')
->assertOk()
->assertSee('تمكين المشاركة في المعارض المحلية والدولية');
});
// AC5: Aspiration Item Styling (icons in scholarship section)
test('about page scholarship aspirations have icons', function () {
$this->get('/about')
->assertOk()
->assertSee('w-6 h-6 text-accent flex-shrink-0', false);
});
// AC6: Visual Accent (decorative border)
test('about page scholarship section has decorative accent', function () {
$this->get('/about')
->assertOk()
->assertSee('border-accent/20', false);
});
// AC7: Responsive Layout
test('about page scholarship aspirations use responsive grid', function () {
$this->get('/about')
->assertOk()
->assertSee('grid-cols-1 sm:grid-cols-2 lg:grid-cols-4', false);
});
// AC8: All 4 aspirations are present
test('about page displays all 4 scholarship aspirations', function () {
$this->withSession(['locale' => 'en'])->get('/about')->assertOk();
expect(count(__('about.scholarship_aspirations')))->toBe(4);
});