# City Individual Page — Drupal Mapping

**Page route:** `/eye-hospital-in-<city>` — driven by `node--city` content type.

## Content type & fields

### `node--city` (new)

| Field | Type | Notes |
|---|---|---|
| `name` (node title) | string | "Eye Hospital in Mumbai" (or just "Mumbai" with rendered prefix) |
| `field_city_name` | string | "Mumbai" — used in section headings |
| `field_tagline` | text | "Trusted Experts in Eye Care…" |
| `field_about` | text (long, formatted) | About paragraph |
| `field_city_photo` | image | Hero cityscape (~681×547) |
| `field_specialities_offered` | term reference (multivalue, `taxonomy_term--speciality`) | Drives accordion panels |
| `field_localities` | text (multivalue) | Drives services-across strip |
| `field_faq_items` | paragraph reference (multivalue) | FAQ accordion |
| `field_slug` | string (or pathauto) | URL alias |

The centres in the city are NOT a direct field on `node--city`. They are pulled via Views block filtered by `node--centre.field_city = current node's field_city_name`. Same for doctors.

## Twig templates introduced

| Template | Replaces partial |
|---|---|
| `node--city--full.html.twig` | Whole-page render |
| `views-view-row--centres-by-city.html.twig` | Centre card (reuses existing centre-card row template) |
| `views-view-row--city-specialties.html.twig` | One accordion panel per term |
| `views-view-row--city-doctors.html.twig` | Doctor card (reuses existing doctor-card row template) |
| `paragraph--faq_item.html.twig` | Existing |
| `webform--city-callback.html.twig` | Hero callback form |

## Field-by-section mapping

### Hero

| HTML | Field |
|---|---|
| `<h1>` | "Eye Hospital in {field_city_name}" (or `node.title`) |
| Tagline | `node.field_tagline` |
| Right photo | `node.field_city_photo` |
| Form | Webform `city-callback` |

### About

`node.field_about`.

### Centres in city

Views block `view-centres-by-city`:
- Filter: `node--centre.field_city = node.field_city_name`
- Row template: existing `views-view-row--centre-card.html.twig`

### Specialties accordion

Views block `view-city-specialties`:
- Filter: `node.field_specialities_offered` (multivalue term reference)
- Row template: emits one `<div data-tab data-target="..." data-active="...">` per term
- First row gets `data-active="true"`; rest `"false"`
- Per row: term `name` → label + heading, term `field_speciality_description` → body, term `field_accordion_color` → CSS variable for collapsed bg color (or auto-distribute from a 5-color palette)

### Doctor row

Views block `view-city-doctors`:
- Filter: doctors with `field_practising_centres → field_city = node.field_city_name`
- Row template: existing doctor-card row template
- Limit: 4 + Load More via Views pager

### FAQ

`node.field_faq_items` rendered directly.

### Services-across strip

`node.field_localities` rendered as `<a>` links joined with ` | `. Each link points to `/eye-hospital-in-<city>/<locality-slug>` (the locality detail page — separate template, future work).

### Callback form (bottom)

Webform `homepage-callback` (existing).
