# Story 1.5: Homepage Implementation

**Status:** ready-for-dev

**Epic:** Epic 1 - Webflow to Payload CMS + Astro Migration

**Priority:** P1 (High - First public page visitors see)

**Estimated Time:** 6-8 hours

**Depends On:** Story 1.4 (Global Layout Components - Header/Footer)

---

## Story

**As a** Visitor,
**I want** to view the homepage with hero section and service features,
**so that** I can understand what Enchun Digital offers.

哇，這是我們網站的第一印象！首頁必須讓訪客一眼就知道恩群數位是做什麼的，並且想要繼續探索！

---

## Context

這是首個完整的公開頁面實作，依賴 Story 1.4 完成 Header 和 Footer 組件。首頁是網站的門面，需要完美呈現品牌形象和核心服務。

**Story Source:**
- PRD: `docs/prd/05-epic-stories.md` - Story 1.5
- Frontend route exists at: `apps/frontend/src/pages/index.astro`
- CMS Globals: Header, Footer (already configured)

**Current State:**
- Basic `index.astro` exists with hardcoded content
- `VideoHero` component exists with video background support
- Header/Footer components fetch from Payload CMS
- Layout.astro integrates Header and Footer

---

## Acceptance Criteria

### AC1: Hero Section (完整英雄區域)
- [ ] Background video with overlay (desktop + mobile variants)
- [ ] Main headline: "創造企業更多發展的可能性是我們的使命"
- [ ] Subheadline: "Its our destiny to create possibilities for your business"
- [ ] Enchun logo display
- [ ] Video fallback image for non-video browsers
- [ ] Gradient overlay for text readability (from-black/80 to-black/0)

### AC2: Service Features Grid (服務特色網格)
- [ ] 4 service cards in responsive grid (1 col mobile, 2 col tablet, 4 col desktop)
- [ ] Each card displays:
  - Icon (SVG or emoji)
  - Title (中文)
  - Description (中文)
- [ ] Card styling: white background, shadow, rounded corners
- [ ] Hover effects for interactivity

### AC3: Portfolio Preview Section (作品預覽)
- [ ] Display 3-6 portfolio items as preview cards
- [ ] Each card shows: image, title, short description
- [ ] "View All Portfolio" CTA button linking to `/website-portfolio`
- [ ] Data fetched from Portfolio collection (Payload CMS)

### AC4: CTA Section (行動呼籲)
- [ ] Headline: "準備好開始新的旅程了嗎"
- [ ] Description text
- [ ] Primary CTA button linking to `/contact-us`
- [ ] Background styling matching Webflow design

### AC5: Content from Payload CMS (內容來自 CMS)
- [ ] Hero content (headline, subheadline) from Home global or Page collection
- [ ] Service features from configurable CMS source
- [ ] Portfolio items from Portfolio collection
- [ ] CTA section text from CMS

### AC6: Visual Fidelity 95%+ (視覺保真度)
- [ ] Colors match Webflow design tokens
- [ ] Spacing and typography match original
- [ ] Responsive breakpoints align with Webflow
- [ ] Animations and transitions feel smooth

### AC7: Lighthouse Performance 90+ (效能標準)
- [ ] Performance score >= 90
- [ ] FCP < 1.5s
- [ ] LCP < 2.5s
- [ ] CLS < 0.1

---

## Tasks / Subtasks

### Task 1.5.1: Create Home Global in Payload CMS (1h)
**AC Coverage:** AC5

- [ ] **Subtask 1.5.1.1:** Create Home global config
  - File: `apps/backend/src/Home/config.ts`
  - Fields: heroHeadline, heroSubheadline, heroVideo (upload), heroOverlay (group)
- [ ] **Subtask 1.5.1.2:** Register Home global in payload.config.ts
- [ ] **Subtask 1.5.1.3:** Add access control (read: public, update: adminOnly)
- [ ] **Subtask 1.5.1.4:** Seed initial content in Payload Admin
- [ ] **Subtask 1.5.1.5:** Verify TypeScript types regenerate

### Task 1.5.2: Refactor index.astro to use Payload Data (2h)
**AC Coverage:** AC5, AC6

- [ ] **Subtask 1.5.2.1:** Create `getHomeData` utility function
  - File: `apps/frontend/src/lib/api/home.ts`
  - Fetch Home global, Portfolio items
- [ ] **Subtask 1.5.2.2:** Update index.astro to fetch data at build time
- [ ] **Subtask 1.5.2.3:** Pass props to child components
- [ ] **Subtask 1.5.2.4:** Handle data fetching errors gracefully
- [ ] **Subtask 1.5.2.5:** Test with draft=false parameter

### Task 1.5.3: Enhance Hero Section (1.5h)
**AC Coverage:** AC1, AC6

- [ ] **Subtask 1.5.3.1:** Update VideoHero to accept CMS data
  - Props: heroHeadline, heroSubheadline, heroVideoUrl
- [ ] **Subtask 1.5.3.2:** Add fallback image when video fails to load
- [ ] **Subtask 1.5.3.3:** Adjust gradient overlay for text readability
- [ ] **Subtask 1.5.3.4:** Ensure mobile video is optimized (smaller file)
- [ ] **Subtask 1.5.3.5:** Test on various devices and network speeds

### Task 1.5.4: Implement Service Features Grid (1.5h)
**AC Coverage:** AC2, AC6

- [ ] **Subtask 1.5.4.1:** Create ServiceFeatureCard component
  - File: `apps/frontend/src/components/ServiceFeatureCard.astro`
  - Props: icon, title, description
- [ ] **Subtask 1.5.4.2:** Create ServiceFeaturesGrid section
  - File: `apps/frontend/src/sections/ServiceFeatures.astro`
  - Grid layout: 1 col mobile, 2 col md, 4 col lg
- [ ] **Subtask 1.5.4.3:** Add hover effects (transform, shadow)
- [ ] **Subtask 1.5.4.4:** Configure 4 service features
  - Google Ads, 社群行銷, 論壇行銷, 網站設計
- [ ] **Subtask 1.5.4.5:** Test responsive behavior

### Task 1.5.5: Implement Portfolio Preview Section (1h)
**AC Coverage:** AC3, AC5

- [ ] **Subtask 1.5.5.1:** Create PortfolioPreviewCard component
  - File: `apps/frontend/src/components/PortfolioPreviewCard.astro`
  - Props: image, title, description, slug
- [ ] **Subtask 1.5.5.2:** Create PortfolioPreview section
  - File: `apps/frontend/src/sections/PortfolioPreview.astro`
  - Display 3 items (limit query)
- [ ] **Subtask 1.5.5.3:** Add "View All" CTA button
- [ ] **Subtask 1.5.5.4:** Fetch from Portfolio collection with proper sorting
- [ ] **Subtask 1.5.5.5:** Handle empty portfolio state

### Task 1.5.6: Implement CTA Section (1h)
**AC Coverage:** AC4, AC6

- [ ] **Subtask 1.5.6.1:** Create CTASection component
  - File: `apps/frontend/src/sections/CTASection.astro`
  - Props: headline, description, ctaText, ctaLink
- [ ] **Subtask 1.5.6.2:** Style with gradient background matching Webflow
- [ ] **Subtask 1.5.6.3:** Add primary button styling
- [ ] **Subtask 1.5.6.4:** Connect to Contact page route
- [ ] **Subtask 1.5.6.5:** Make text configurable via CMS

### Task 1.5.7: Performance Optimization and Testing (1h)
**AC Coverage:** AC7

- [ ] **Subtask 1.5.7.1:** Run Lighthouse audit (desktop + mobile)
- [ ] **Subtask 1.5.7.2:** Optimize images (use WebP, responsive sizes)
- [ ] **Subtask 1.5.7.3:** Implement lazy loading for below-fold content
- [ ] **Subtask 1.5.7.4:** Minimize CLS (reserve space for dynamic content)
- [ ] **Subtask 1.5.7.5:** Test on actual devices (iOS, Android)

---

## Dev Notes

### Architecture Patterns

1. **Data Fetching Pattern:**
   - Use Astro's server-side fetching in the frontmatter
   - Cache aggressively (Payload CMS responses are stable)
   - Use `draft=false` for public content

2. **Component Structure:**
   ```
   index.astro (main page)
   ├── VideoHero (hero section)
   ├── ServiceFeatures (services grid)
   ├── PortfolioPreview (portfolio cards)
   ├── CTASection (call to action)
   └── uses Layout.astro (wraps with Header/Footer)
   ```

3. **Styling Approach:**
   - Use Tailwind CSS utility classes
   - Reference design tokens from `apps/frontend/src/styles/theme.css`
   - Maintain consistency with existing components

### Project Structure Notes

**Files to Create:**
```
apps/backend/src/
├── Home/
│   └── config.ts              # Home global configuration

apps/frontend/src/
├── lib/
│   └── api/
│       └── home.ts            # Data fetching utilities
├── components/
│   └── ServiceFeatureCard.astro
├── sections/
│   ├── ServiceFeatures.astro
│   ├── PortfolioPreview.astro
│   └── CTASection.astro
```

**Files to Modify:**
```
apps/frontend/src/
├── pages/
│   └── index.astro            # Main page, refactor to use CMS data
└── components/
    └── videoHero.astro        # Enhance for CMS integration
```

**Naming Conventions:**
- Components: `PascalCase.astro` (e.g., ServiceFeatureCard.astro)
- Sections: `PascalCase.astro` (e.g., ServiceFeatures.astro)
- Utilities: `camelCase.ts` (e.g., getHomeData.ts)

### Design Tokens (from theme.css)

```css
/* Primary Colors */
--color-enchunblue: #0E79B2;
--color-tropical-blue: #E6F4FC;
--color-amber: #F9A825;
--color-st-tropaz: #2C5282;

/* Text Colors */
--color-tarawera: #3D4C53;
--color-dove-gray: #666666;

/* Use these for consistency! */
```

### References

- [Source: docs/prd/05-epic-stories.md#Story-15](/Users/pukpuk/Dev/website-enchun-mgr/docs/prd/05-epic-stories.md)
- [Source: apps/frontend/src/pages/index.astro](/Users/pukpuk/Dev/website-enchun-mgr/apps/frontend/src/pages/index.astro) (existing implementation)
- [Source: apps/backend/src/Header/config.ts](/Users/pukpuk/Dev/website-enchun-mgr/apps/backend/src/Header/config.ts) (Global pattern reference)
- [Source: apps/backend/src/Footer/config.ts](/Users/pukpuk/Dev/website-enchun-mgr/apps/backend/src/Footer/config.ts) (Global pattern reference)
- [Source: research/www.enchun.tw/index.html](/Users/pukpuk/Dev/website-enchun-mgr/research/www.enchun.tw/index.html) (Original Webflow)

---

## Testing Requirements

### Visual Testing Checklist
- [ ] Hero section displays correctly on all screen sizes
- [ ] Video background plays smoothly on desktop
- [ ] Mobile video loads and plays on mobile devices
- [ ] Service cards align properly in grid
- [ ] Portfolio preview cards have consistent heights
- [ ] CTA section button is prominent and clickable

### Functional Testing
- [ ] All navigation links work correctly
- [ ] CTA buttons route to correct pages
- [ ] Portfolio preview cards link to detail pages
- [ ] Data loads from Payload CMS without errors
- [ ] Fallback content displays if CMS is unavailable

### Performance Testing
```bash
# Run Lighthouse audit
npx lighthouse http://localhost:4321 --view
```

**Targets:**
- Performance: >= 90
- Accessibility: >= 90
- Best Practices: >= 90
- SEO: >= 90

### Manual Testing Steps
1. Start dev server: `pnpm dev`
2. Navigate to `http://localhost:4321`
3. Verify hero video loads and plays
4. Scroll through all sections
5. Click all CTA buttons
6. Test on mobile (resize browser or use device)
7. Check console for errors

---

## Risk Assessment

| Risk | Probability | Impact | Mitigation |
|------|------------|--------|------------|
| Video file too large | Medium | High | Compress video, use separate mobile version |
| CLS from dynamic content | Low | Medium | Reserve space with aspect-ratio |
| CMS fetch fails | Low | Medium | Add error boundaries and fallback UI |
| Portfolio empty state | Medium | Low | Show placeholder or hide section |

---

## Definition of Done

- [ ] All 7 tasks completed
- [ ] Home global created and seeded with content
- [ ] index.astro refactored to use Payload CMS data
- [ ] All sections (Hero, Services, Portfolio, CTA) implemented
- [ ] Visual fidelity matches Webflow (95%+)
- [ ] Lighthouse Performance score 90+
- [ ] No console errors on page load
- [ ] Code follows existing patterns
- [ ] No linting errors (`pnpm lint`)
- [ ] sprint-status.yaml updated to mark story as ready-for-dev

---

## Dev Agent Record

### Agent Model Used
*To be filled by Dev Agent*

### Debug Log References
*To be filled by Dev Agent*

### Completion Notes
*To be filled by Dev Agent*

### File List
*To be filled by Dev Agent*

---

## Change Log

| Date | Action | Author |
|------|--------|--------|
| 2026-01-31 | Story created (Draft) | SM Agent (Bob) |
