motionsites中文站 / Global Hubs
Global Hubs
aadmin2026-09-22 发布Site模板0 阅读

Global Hubs

类型:Site模板 · 分类:Business · 源码:会员可见

[hidecontent type="vip1"]
**Recreate this exact single-page “Meridian — Our Offices” section as a static HTML/CSS/JS site (`index.html`, `styles.css`, `main.js`). Match every layout, type, color, asset URL, glass treatment, and animation below. Do not invent extra sections, nav, footer, or branding.**



## Page identity



- Title: `Meridian — Our Offices`

- Language: `en`

- Single full-viewport page (no scroll on desktop). `html, body { height: 100%; overflow: hidden; }`

- On viewports `max-width: 960px`, allow scroll (`overflow: auto`), page becomes `height: auto; min-height: 100dvh`.



## Fonts (exact Google Fonts URL)



Load:



```

https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500&family=Inter:wght@400;500;600;700&display=swap

```



Preconnect `https://fonts.googleapis.com` and `https://fonts.gstatic.com` (crossorigin).



Stacks:



- Body / UI / headline / copy: `"Inter", "Helvetica Neue", Helvetica, "Segoe UI", sans-serif`

- Mono (hover-panel city name + meta): `"IBM Plex Mono", "SF Mono", "Consolas", monospace`

- Antialiased: `-webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale`



## Color tokens (exact)



```

--bg: #fafaf8

--text: #111111

--muted: #666666

--muted-soft: #8c8c8c

--pill-bg: #ffffff

--card-gray: #e5e5e5

--line: #e6e6e4

--tz-bg: rgba(255, 255, 255, 0.78)

--accent: #e67e22

--radius: 28px

```



Page background (warm off-white with two faint radial washes):



```

radial-gradient(1100px 480px at 8% -8%, rgba(0,0,0,0.03), transparent 55%),

radial-gradient(800px 380px at 95% 8%, rgba(0,0,0,0.025), transparent 48%),

#fafaf8

```



## Layout (desktop, 3-column office page)



Outer `.offices`: `width 100%`, `height 100vh / 100dvh`, flex column.



Padding tokens:



- `--pad-top: clamp(56px, 7vh, 125px)`

- `--pad-x: clamp(24px, 4.2vw, 75px)`

- `--pad-bottom: 40px`

- `--gap-pill-line: clamp(18px, 2.2vh, 40px)`

- `--gap-line-text: clamp(32px, 4vh, 48px)`

- `--gap-text-cards: clamp(36px, 4.5vh, 64px)`

- `--gap-cards: clamp(18px, 2vw, 35px)`

- `--card-pad: clamp(22px, 2vw, 34px)`



### Top block (top-aligned, not vertically centered)



1. **Eyebrow row** (column, left-aligned):

   - White capsule pill: text `OUR OFFICES` (CSS `uppercase`, `letter-spacing: 0.08em`, `font-size: 0.8rem`, `font-weight: 500`, color `#2a2a2a`)

   - Pill padding `0.42rem 0.85rem 0.42rem 0.7rem`, `border-radius: 999px`, `box-shadow: 0 4px 14px rgba(0,0,0,0.05)`, gap `0.38rem`

   - Left of the label: small right-pointing arrow SVG, 14×10, viewBox `0 0 18 12`, path `M1.5 6h13.5M11.5 2.75 15.5 6l-4 3.25`, stroke currentColor, `stroke-width 1.35`, round caps/joins, no fill

   - Full-width 1px hairline `#e6e6e4` under the pill



2. **Header**: 2-column CSS grid  

   `grid-template-columns: minmax(0, 1fr) minmax(0, 630px)`  

   gap `clamp(1.25rem, 4vw, 3.75rem)`, items start-aligned.



   Left headline (exact copy, line break after first sentence):



   **Three time zones.**  

   **One standard of work.**



   Type: Inter 500, `font-size: clamp(2.55rem, 2.65vw + 1.65vh, 4.5rem)`, `line-height: 1.18`, `letter-spacing: -0.03em`, color `#111`, `text-wrap: balance`.



   Right copy, `justify-self: end`, max-width `min(630px, 100%)`, Inter 400, `font-size: clamp(1.2rem, 0.7vw + 0.7vh, 1.5rem)`, `line-height: 1.5`, `letter-spacing: -0.01em`, color `#6b6b6b`. Exact copy:



   > Meridian operates from three hubs across Europe and North America. Wherever you are, there’s a team nearby — hover a location for the details.



### Cards grid



`flex: 1`, `min-height: 0`, `display: grid`, `grid-template-columns: repeat(3, minmax(0, 1fr))`, gap as `--gap-cards`. Cards stretch to remaining viewport height. Each card `min-height: max(280px, 38vh)`, `cursor: pointer`, `tabindex="0"`, `outline: none`. **Do not lift/translate the card on hover** — only the photo scales.



Card surface: `border-radius: 28px`, `overflow: hidden`, `isolation: isolate`, `border: 1px solid rgba(0,0,0,0.1)`, no box-shadow.



## Exact photo URLs (background-image, cover, center)



Apply as CSS `background-image` on `.office__media.has-photo`. Use these URLs verbatim (Higgs CDN, webp, `w=1280`, `q=85`):



**Paris**

```

https://images.higgs.ai/?default=1&output=webp&url=https%3A%2F%2Fd8j0ntlcm91z4.cloudfront.net%2Fuser_38xzZboKViGWJOttwIXH07lWA1P%2Fhf_20260813_120239_176d1c43-47bb-4034-880e-9abfa55cb46e.png&w=1280&q=85

```

Photo: daytime Paris Haussmann street, cream buildings, café awning, trees, pedestrians.



**London**

```

https://images.higgs.ai/?default=1&output=webp&url=https%3A%2F%2Fd8j0ntlcm91z4.cloudfront.net%2Fuser_38xzZboKViGWJOttwIXH07lWA1P%2Fhf_20260813_120256_cfcb1ed1-6e80-486d-9fed-26ebe5dea114.png&w=1280&q=85

```

Photo: overcast London street, red double-decker bus, black taxi, brick/stone buildings, wet pavement.



**New York**

```

https://images.higgs.ai/?default=1&output=webp&url=https%3A%2F%2Fd8j0ntlcm91z4.cloudfront.net%2Fuser_38xzZboKViGWJOttwIXH07lWA1P%2Fhf_20260813_131320_4b0da7d5-ad06-4d7d-b491-f99d947a524c.png&w=1280&q=85

```

Photo: NYC Financial District canyon, tall beige masonry towers, yellow taxi, American flags, busy sidewalk.



Media layer: absolute inset 0, z-index 0, fallback gray `#e5e5e5`, `filter: brightness(1.06) contrast(0.98)`.



## Card chrome (always visible until hover)



Overlay absolute inset 0, `pointer-events: none`, z-index 2. Padding from `--card-pad`.



**Top row:** country name left, timezone pill right.



- Country: Inter 600, `clamp(1.4rem, 1.7vw + 0.3vh, 1.85rem)`, `letter-spacing: -0.025em`, `line-height: 1`, `#111`

- TZ pill: `rgba(255,255,255,0.78)` fill, `1px solid rgba(0,0,0,0.08)`, `border-radius: 999px`, padding `0.38rem 0.7rem`, color `#555`, Inter 600, `clamp(0.78rem, 0.85vw + 0.15vh, 0.92rem)`, **glass: `backdrop-filter: blur(6px)`** (and `-webkit-`)



**Bottom row:** city left (uppercase tracking), orange northeast arrow right.



- City: Inter 600, `clamp(0.7rem, 0.82vw, 0.8rem)`, `letter-spacing: 0.14em`, `text-transform: uppercase`, color `#9b9b9b`

- Arrow: 1.7rem box, color `#e67e22`, SVG viewBox `0 0 24 24`, path `M5 19 19 5M13 5h6v6`, stroke currentColor, `stroke-width 1.15`, round, no fill. Default `transform: translateY(-1px)`.



On hover/open: bottom row fades `opacity: 0` in `0.3s ease`. Arrow nudges `translate(2px, -3px)` in `0.3s cubic-bezier(0.22, 1, 0.36, 1)`. Photo zooms to `scale(1.04)` in `0.55s cubic-bezier(0.22, 1, 0.36, 1)`.



## Hover glass details panel (critical)



Panel sits absolute left/right/bottom, **height 62%**, min-height 280px, z-index 3, `pointer-events: none`.



### Glass / blur layer (`.office__panel-blur`)



- Absolute inset 0

- Bottom corners: `border-radius: 0 0 calc(28px - 1px) calc(28px - 1px)`

- **No tinted overlay fill** — `background: transparent`

- **Instant (no transition) frosted glass:** `backdrop-filter: blur(30px)` and `-webkit-backdrop-filter: blur(30px)`

- Opacity 0 by default; on hover/open jump to 1 (`transition: none`) so blur appears instantly

- Soft top fade via mask so glass dissolves into the photo:



```

linear-gradient(

  to bottom,

  transparent 0%,

  rgba(0,0,0,0.35) 18%,

  rgba(0,0,0,0.85) 38%,

  #000 58%,

  #000 100%

)

```



Apply as both `mask-image` and `-webkit-mask-image`.



### Panel copy (rises from bottom)



Inner padding `1.35rem var(--card-pad) var(--card-pad)`, transparent background, left-aligned column.



Each item starts `opacity: 0; transform: translateY(22px)` and animates to `opacity: 1; translateY(0)` with:



- opacity `0.42s cubic-bezier(0.22, 1, 0.36, 1)`

- transform `0.48s cubic-bezier(0.22, 1, 0.36, 1)`

- stagger delay `calc(var(--i) * 55ms)` where `--i` is 0, 1, 2, 3 from top to bottom



**Block 0 — city row** (IBM Plex Mono 500, uppercase, `letter-spacing: 0.14em`, `clamp(0.78rem, 0.9vw, 0.88rem)`, color `rgba(0,0,0,0.72)`). Left arrow SVG 16×10, viewBox `0 0 20 12`, path `M1 6h16M13.25 2.5 17.5 6l-4.25 3.5`, stroke 1.35. Padding/margin-bottom `0.95rem`. Divider: `1px solid rgba(255,255,255,0.9)`.



**Block 1 — address**  

Primary Inter 600 `clamp(0.92rem, 1.05vw, 1.05rem)`, `letter-spacing: -0.02em`, `rgba(0,0,0,0.8)`  

Secondary Inter 400 same size, `rgba(0,0,0,0.5)`, `margin-top: 0.22rem`  

Padding/margin-bottom `0.9rem`, same white 90% divider.



**Block 2 — phone + email** (same type styles as address)



**Block 3 — meta** IBM Plex Mono 400, uppercase, `letter-spacing: 0.12em`, `clamp(0.78rem, 0.85vw, 0.85rem)`, `rgba(0,0,0,0.45)`. No divider.



## Exact office content



**Card 1 — Paris** (`data-office="paris"`)  

Country: France · TZ: GMT+1 · City: Paris  

Panel city: Paris  

Address: `12 Rue de l'Université` / `75007 Paris, France`  

Phone: `+33 1 44 55 00 12` · Email: `paris@meridian.co`  

Meta: `142 People · Est. 2016`



**Card 2 — London** (`data-office="london"`)  

Country: United Kingdom · TZ: GMT+0 · City: London  

Panel city: London  

Address: `1 Butler's Wharf, Shad Thames` / `London SE1 2LP, UK`  

Phone: `+44 20 7946 0330` · Email: `london@meridian.co`  

Meta: `96 People · Est. 2018`



**Card 3 — New York** (`data-office="new-york"`)  

Country: United States · TZ: GMT-5 · City: New York  

Panel city: New York  

Address: `85 Broad Street, Floor 17` / `New York, NY 10004, USA`  

Phone: `+1 212 555 0184` · Email: `newyork@meridian.co`  

Meta: `210 People · Est. 2014`



Hover interaction only on `(hover: hover) and (pointer: fine)`. Fine-pointer hover also opens the panel. Click toggles `is-open` (for touch). Clicking an open card adds `is-closed` so CSS hover cannot immediately reopen it; `mouseleave` removes `is-closed`. Clicking another card or the document closes others. Enter/Space on focused card triggers click. Set `aria-expanded` true/false.



## Page-load entrance (staggered, slightly blurred)



On first paint, elements with `.reveal` start invisible. After double `requestAnimationFrame`, add `.is-in`. Respect `prefers-reduced-motion: reduce` (show immediately, no motion). Easing: `cubic-bezier(0.22, 1, 0.36, 1)`. Delay via inline `--d`.



| Element | class | --d | from |

|---|---|---|---|

| Pill | `reveal--pill` | 0.02s | `translateY(-8px) scale(0.96)`, blur 3px, 0.45s opacity |

| Hairline | `reveal--line` | 0.1s | `scaleX(0.18)` origin left, 0.25s opacity + 0.55s scale to 1 |

| Headline | `reveal--title` | 0.16s | `translateX(-18px)`, blur 5px, 0.5s/0.6s |

| Copy | `reveal--copy` | 0.24s | `translate(16px, 8px)`, blur 4px |

| Paris card | `reveal--card-left` | 0.32s | `translate(-14px, 14px) scale(0.985)`, blur 4px |

| London card | `reveal--card-mid` | 0.4s | `translateY(10px) scale(0.99)`, blur 4px |

| NY card | `reveal--card-side` | 0.48s | `translate(14px, 14px) scale(0.985)`, blur 4px |



When a card enters, its photo runs `media-settle` 0.65s: scale 1.04 → 1, delay `var(--d) + 0.04s`. After enter, hover must **not** re-apply card translate/blur — keep `transform: none`.



## Responsive (match these breakpoints)



- **≥1921px:** pad-top 125, pad-x 75, gaps 40/48/64/35, card-pad 34, larger type, cards `min-height: max(360px, 42vh)`

- **≤1680:** slightly smaller headline/copy/country

- **≤1440:** pill 0.72rem; header columns `1.05fr / min(480px, 42vw)`; TZ pill smaller; panel height 68% / min 240px

- **≤1200:** header `1fr / min(400px, 40vw)`

- **≤960:** stack header to 1 column; copy left-aligned max 34rem; cards 1 column, surface `aspect-ratio: 4 / 4.7`; page scrolls

- **≤560:** pad-top 36, pad-x 18, tighter gaps, smaller type

- **max-height 860px and min-width 961px:** compress vertical gaps/type

- **max-height 720px and min-width 961px:** even tighter, panel min-height 210px



## What not to do



- No extra navigation, logo, footer, map, or CTA buttons

- No colored glass overlay (no white/black fill on the blur layer)

- No card lift/shadow on hover

- No serif display font — Inter only for headlines

- Do not replace the three Higgs image URLs

- Do not animate the glass blur in (it must appear instantly); only the text rises with stagger
[/hidecontent]
← 返回首页