--- id: 24-4 title: 24-4 Home Page Sections (Hero to Latest Articles) status: Ready for Dev date: 2026-10-31 parent: 24 --- ## Description Rebuild `resources/views/livewire/pages/home.blade.php` as the approved redesign, sections 1–7 (hero, pillars, founder, services, vision, values, latest articles). Section 8, the booking card, is task 24-5; leave a placeholder comment `{{-- booking card: task 24-5 --}}` where it goes. Keep the component's PHP class as it is (`#[Layout('components.layouts.public')]`, `with()` returning `latestPosts` = `Post::published()->latest('published_at')->take(3)->get()`). Remove the temporary `
` wrapper added in 24-1: each section is full-bleed and holds a `
`. The visual reference is `docs/ux-mockup.html` (commit `caec396`). Port the CSS for each section from the line ranges below into `resources/css/public.css`, every selector prefixed with `body.site `, and port the matching responsive rules from lines 293–323. Put `data-reveal` and `data-d` attributes on the same elements as the mockup (lines 358–506). ### Photography — create `public/images/site/` Extract these JPEG data URIs from `docs/ux-mockup.html` and save them, decoded, as files (a short script reading the file and base64-decoding the `src="data:image/jpeg;base64,…"` value on each line is enough; do not commit the script): | Mockup line | `` | Save as | |---|---|---| | 377 | hero olive tree | `public/images/site/olive-tree.jpg` | | 447 | embroidery hoop | `public/images/site/embroidery-hoop.jpg` | | 455 | olives on a branch | `public/images/site/olives.jpg` | | 459 | hills and road | `public/images/site/hills.jpg` | The founder portrait uses the existing `public/images/huda-armouche.jpg`. The images are from Unsplash (licence permits commercial use without attribution); show no credit line. ### Sections (in order, inside the root `
`) 1. **Hero** — `
`; CSS lines 100–125. Two-column grid (`1fr 1.08fr`, gap 56px; one column ≤1100px). Start column: `.eyebrow` = `site.hero_eyebrow`; `

` = `{{ __('site.hero_title_a') }}{{ __('site.hero_title_em') }}{{ __('site.hero_title_b') }}` (the `em` is upright, `--olive`, with `text-decoration: underline dashed var(--gold) .07em; text-underline-offset:.28em`); `

` = `home.intro`; CTA row: gold button `home.cta_book` → `#book` with the arrow SVG (mockup line 366), ghost button `home.cta_services` → `#services`; `.trust` strip with three items, each `` + ``: (`site.trust_1_title`, `site.trust_1_text`), (`site.trust_2_title`, `site.trust_2_text`), (`site.trust_3_title`, `site.trust_3_text`). End column `.hero-art`: `

` (aspect 4/4.6, radius `999px 999px 18px 18px`, forest ground, gradient veil `::before` from `rgba(35,42,28,.35)` to `.9`), containing `{{ __('site.alt_olive_tree') }}` (filter `saturate(.75) contrast(1.05)`, `scale(1.08)`), `` (420px radial gold glow), `` positioned `inset:10% 8% 12%`, and `
` = `site.frame_caption` (display italic, cream .78). Then `
` with `` (olive, pulsing) and `site.frame_tag`. 2. **Pillars band** — `
`; CSS lines 127–137. Three `.pillar` columns: (`site.pillar_justice`, `site.pillar_justice_text`), (`site.pillar_dignity`, `site.pillar_dignity_text`), (`site.pillar_advocacy`, `site.pillar_advocacy_text`), each title preceded by `` (CSS line 210). 3. **Founder** — `
`; CSS lines 146–157. Portrait `/images/huda-armouche.jpg` (alt `home.lawyer_name`) with `.namecard` (`` `home.lawyer_name`, `` `site.founder_role`). Text column: `.art-no` `site.art_founder`; `

` `home.about_title`; `
` `site.founder_quote`; paragraphs `home.lawyer_bio` and `home.lawyer_bio_2`; ghost button `site.founder_cta` → `route('about')`. 4. **Services docket** — `
`; CSS lines 159–174. `x-site.section-head` (see below) with label `site.art_services`, title `home.services_subtitle`, lede `site.services_lede`. Four `` rows: number `01`–`04` (`.n`), `

` title, `.chips` of the items, `.go` arrow circle. Rows in order: (`home.service_consultation_title`, `home.service_consultation_items`), (`home.service_family_title`, `home.service_family_items`), (`home.service_civil_title`, `home.service_civil_items`), (`home.service_business_title`, `home.service_business_items`). Items are arrays — render each as ``. 5. **Vision** — `
`; CSS lines 176–197. Text column: `.art-no` `site.art_vision`, `

` `site.vision_title`, `

` `site.vision_text`; beside it `.hoop` with `/images/site/embroidery-hoop.jpg` (alt `site.alt_hoop`; filter `hue-rotate(-140deg) saturate(.55) sepia(.25)`). Below, `.three` grid of `

`: (a) `.ph.motif-ph` containing `` (150×150px) and label `site.card_institution_label`, title `site.card_institution_title`, text `site.card_institution_text`; (b) `.ph` with `/images/site/olives.jpg` (alt `site.alt_olives`), label `site.card_society_label`, title `site.card_society_title`, text `site.card_society_text`; (c) `.ph` with `/images/site/hills.jpg` (alt `site.alt_hills`), label `site.card_diaspora_label`, title `site.card_diaspora_title`, text `site.card_diaspora_text`. 6. **Values** — `
`; CSS lines 199–212. Section head: label `site.art_values`, title `home.values_title`, lede `home.values_subtitle`. `.sampler` grid of six `.val` cards, each `` with the line icon and `` = `home.values..title`, keys in order `integrity`, `justice`, `knowledge`, `empowerment`, `professionalism`, `innovation`. Icons: the inline SVGs on mockup lines 474–479 in the same order (24×24 viewBox, `aria-hidden="true"`, stroke `--gold-ink` 1.5, no fill). Replace the current `flux:icon` usage. 7. **Latest articles** — `
`; CSS lines 214–234. Head: label `site.art_articles`, title `home.posts_title`, and in place of the lede a ghost button `home.view_all_posts` → `route('posts.index')`. If `$latestPosts` is not empty: `.posts` grid of ``; otherwise a `

` with `home.posts_empty` (muted, centred). ### Components to create - **`resources/views/components/site/section-head.blade.php`** — props `label`, `title`, `lede` (nullable); renders `

{{ $label }}

{{ $title }}

` then either `

{{ $lede }}

` or the `$slot` (for the button), then `
`. - **`resources/views/components/site/post-card.blade.php`** — prop `post` (App\Models\Post); `
` → `
` with `` = the published date (`$post->published_at?->translatedFormat('j F Y')`), `

` = `$post->getTitle()`, `

` = an excerpt of `strip_tags($post->getBody())` limited to 140 characters (`Str::limit`), and `` = `home.read_more`. Text-only: no image element. ### Language keys — add to `lang/ar/site.php` and `lang/en/site.php` | Key | ar | en | |---|---|---| | `hero_eyebrow` | ليبرا للحقوق · فلسطين | Libra for Rights · Palestine | | `hero_title_a` | العدالة␠ | Justice is a␠ | | `hero_title_em` | ممارسةٌ يومية | daily practice | | `hero_title_b` | ، لا مبدأٌ نظري. | , not a theory. | | `trust_1_title` | أفراد وشركات | Individuals & companies | | `trust_1_text` | استشارات وتمثيل | Consultations and representation | | `trust_2_title` | المرأة والأسرة | Women & family | | `trust_2_text` | دعم قانوني متخصص | Specialised legal support | | `trust_3_title` | عربي · English | Arabic · English | | `trust_3_text` | خدمة بلغتين | Bilingual service | | `alt_olive_tree` | شجرة زيتون معمّرة بين صخور كلسية | An ancient olive tree among limestone rocks | | `balance_label` | ميزان العدالة | The scales of justice | | `frame_caption` | لكلّ حقٍّ وزنُه | Every right carries its weight | | `frame_tag` | استشارات حضورية أو عن بُعد | Consultations in person or remotely | | `pillars_label` | ركائزنا | Our pillars | | `pillar_justice` | العدالة | Justice | | `pillar_justice_text` | الإنصاف، والمساءلة، وسيادة القانون. | Fairness, accountability and the rule of law. | | `pillar_dignity` | الكرامة | Dignity | | `pillar_dignity_text` | القيمة الأصيلة لكل إنسان. | The inherent worth of every person. | | `pillar_advocacy` | الدفاع | Advocacy | | `pillar_advocacy_text` | انخراطٌ فاعل، وقولُ الحق في وجه السلطة. | Active engagement, and speaking truth to power. | | `art_founder` | المادة ٠١ — المؤسِّسة | Article 01 — The founder | | `founder_role` | المؤسِّسة · محامية | Founder · Attorney at Law | | `founder_quote` | «العدالة ممارسة يومية، وليست مجرد مبدأ نظري.» | “Justice is a daily practice, not merely a theoretical principle.” | | `founder_cta` | اقرأ قصتنا | Read our story | | `art_services` | المادة ٠٢ — الخدمات | Article 02 — Services | | `services_lede` | ممارسة قانونية أصيلة، تقوم على البحث والمعرفة الميدانية. | Traditional legal practice, combined with research-driven insight. | | `art_vision` | المادة ٠٣ — الرؤية | Article 03 — Vision | | `vision_title` | منسوجةٌ من نسيج المجتمع | Woven from the fabric of society | | `vision_text` | ليبرا نسيجٌ أصيل من المجتمع، تتقصّى مشكلاته وتوثّقها وتكشف جذورها، وتقدّم حلولاً عملية لرأب أوجاعه مهما صغرت، عبر العمل التشاركي والبحث الميداني الحقيقي. | Libra investigates society's problems, documents them, uncovers their roots, and offers practical solutions to mend social pains — however small — through collaborative work and genuine field research. | | `alt_hoop` | تطريز بغرزة الصليب مشدود على طارة خشبية | Cross-stitch embroidery stretched on a wooden hoop | | `card_institution_label` | لمؤسستنا | For our institution | | `card_institution_title` | القانون والبحث والميدان | Law, research and fieldwork | | `card_institution_text` | نلتقط نبض المجتمع ونحوّل تحدياته إلى معرفة وحلول قانونية مبتكرة. | Capturing society's pulse and turning its challenges into knowledge and innovative legal solutions. | | `alt_olives` | ثمار زيتون على غصن | Olives ripening on a branch | | `card_society_label` | للمجتمع | For society | | `card_society_title` | شريكٌ موثوق للقضاء | A trusted partner to the judiciary | | `card_society_text` | نعيد وصل المجتمع بتاريخه وإرثه القانوني. | Reconnecting society with its history and legal heritage. | | `alt_hills` | تلال وطريق متعرّج عند الغروب | Hills and a winding road at sunset | | `card_diaspora_label` | لفلسطينيي الشتات | For Palestinians in the diaspora | | `card_diaspora_title` | عودةٌ إلى الأرض والعائلة | Back to the land and the family | | `card_diaspora_text` | نساعد الفلسطينيين في الخارج على البحث في عائلاتهم وتاريخهم وأراضيهم. | Helping Palestinians abroad research their families, their history and their land. | | `art_values` | المادة ٠٤ — القيم | Article 04 — Values | | `art_articles` | المادة ٠٥ — المقالات | Article 05 — Articles | `␠` marks a trailing space that must be kept in the value. ### Files - Create: `public/images/site/olive-tree.jpg`, `public/images/site/embroidery-hoop.jpg`, `public/images/site/olives.jpg`, `public/images/site/hills.jpg`, `resources/views/components/site/section-head.blade.php`, `resources/views/components/site/post-card.blade.php`. - Modify: `resources/views/livewire/pages/home.blade.php`, `resources/css/public.css`, `lang/ar/site.php`, `lang/en/site.php`. - Do not edit `lang/*/home.php`. ## Acceptance Criteria - [ ] `/` renders, in order, sections with ids `top`, (the pillars band), `founder`, `services`, `mission`, `values`, `posts`, each with its content from the keys above in both Arabic and English (switch with `/language/en`). - [ ] `/` has exactly one `

`, and every `` has a non-empty `alt` in both languages. - [ ] The four files in `public/images/site/` exist, are valid JPEGs (`file` reports JPEG image data) and load with HTTP 200 on `/`. - [ ] The hero balance renders inside the hero frame and settles level (task 24-3 behaviour). - [ ] Each services row links to `#book`; each row shows the item chips from `home.php`. - [ ] With three or more published posts, three post cards show date, title, excerpt and "Read more", link to `/posts/{post}`, and contain no ``; with no published posts, the `home.posts_empty` text shows instead of the grid. - [ ] At 1440, 768 and 390px wide, `/` has no horizontal scroll (`document.documentElement.scrollWidth <= innerWidth`). - [ ] Hovering a service row fills it forest with cream text; hovering a value card lifts it and rotates its medallion; hovering a post card lifts it. - [ ] The page contains no "Unsplash" text and `lang/*/home.php` is unchanged against BASE. ## Sub-tasks None.