A 3-star guest house at 1700 m on the Transalpina, presented like a travel feature instead of a booking funnel. The whole site reads as one editorial — kicker dashes, ghost numerals, pull-quotes with double rules, letterpress hero reveals — built on native WordPress full-site editing with zero page-builders, zero plugins doing the heavy lifting, and four custom content types holding the mountain.
The owner answers the phone personally. The site had to feel the same way.
- 0
- Editorial pages
- 0
- Custom content types
- 0
- Page-builders used
- 0
- px — base viewport
The challenge
Hospitality on WordPress is a field of tired templates. Defaults from a theme marketplace, an Elementor build with seven plugins fighting each other, a hero stock photo that could be any cabin anywhere. None of it earns the second click. None of it sounds like the people who actually run the place.
Cabana Rareș needed the opposite: a site that opens with the cabin's own snowfall, leads with a specific place ("aproape de Pârtia M1, departe de agitație"), and gives a guest enough context — about the road in winter, about Transalpina in summer, about the seven rooms — to decide before they pick up the phone. A site the owner is comfortable handing out as the answer to "where are you, exactly?".
01 · The hero

The approach
Native FSE, end-to-end. We chose WordPress 6.7's block editor as the publishing surface, then refused every page-builder shortcut. The design system lives in theme.json (color, type scale, spacing, fluid type, layout, motion) and every pattern, template, and block style references those tokens. No hardcoded hex codes anywhere in the theme tree — the brand can shift seasonally without touching CSS.
Content lives in four custom post types — room, slope, trail, attraction — each with proper rewrite rules, taxonomies, schema.org JSON-LD, and dedicated single templates. Editing happens in the WordPress admin; rendering is handled by the theme's own pattern library. No drag-and-drop, no shortcodes, no third-party block libraries.

The solution
A full editorial-grade design system, plus the WordPress engineering to back it.
Design language
- Display typography in Cormorant Garamond (variable, self-hosted). Body in Plus Jakarta Sans (variable, self-hosted) — diacritics tested across ă â î ș ț.
- Editorial accent vocabulary: kicker with copper dash, title-dot at 10 px after every major heading, pull-quotes with double-rule borders, ghost numerals at 200 px+ as section watermarks.
- Letterpress hero reveals — words rise with a 35–55 ms stagger, kicker first, figure attribution last.
prefers-reduced-motionshort-circuits to a clean fade. - Click-to-embed video facade — every YouTube embed renders as a static thumbnail + play button, swapped to an iframe on click. Zero iframes on page load.
Information architecture
- 35 editorial pages, hand-written, with a chapter-narrative structure for the long reads (Drumul de iarnă spre Rânca, Transalpina traseu complet).
- 4 custom content types with 23 single pages auto-rendered from one template per type.
- Sticky chapter rail on long reads (≥ 3 chapters), driven by IntersectionObserver — gold left-border on the active chapter.
- Bilingual scaffolding (Romanian live, English-ready via Polylang) — the i18n is wired even though only RO is published.
02 · Room single

Engineering craft
- mu-plugin seeders — every page, room, slope, trail, attraction lives in code-as-content. Re-running a seeder is idempotent. No hand-edits in wp-admin to maintain.
- Schema.org JSON-LD on every page (Organization, LocalBusiness, BreadcrumbList, Accommodation per room, TouristTrip per trail).
- Custom REST endpoints for the inquiry form (nonce + honeypot + rate limit + sanitization + escape-on-output).
- Performance budget enforced from day one — self-hosted variable fonts, conditional per-pattern CSS enqueue, lazy-loaded below-fold imagery, explicit width/height on every
<img>(zero CLS contribution).
Three moments worth zooming into
The hero
Three lines of serif type rise on a winter sunset photo of the cabin, each line staggered at the same easing as the snowfall behind it. The phone number sits in a glass utility bar above. From the first second the site declares its register: this is a magazine spread, not a search result.

The chapter narrative
The page about the winter road from Novaci to Rânca reads like a travel essay — kicker, chapter number as a 200-px ghost numeral, body text wrapping a pull-quote with double copper rules. A sticky chapter rail rides down the left edge on desktop; an IntersectionObserver toggles the active chapter as you scroll. None of it requires a plugin. All of it falls back gracefully on mobile to a horizontal chip bar.
03 · The editorial range

The four content types
Rooms, slopes, trails, attractions — each one a custom post type with its own admin column layout, its own taxonomy, its own single template, its own JSON-LD shape. Adding a new ski slope means writing one block of code in the seeder; the front-end picks it up automatically with breadcrumbs, schema, related-content rail, and the same editorial design language as everything else.
04 · The signature

The stack
WordPress 6.7+ FSE PHP 8.2 theme.json Cormorant Garamond + Plus Jakarta Sans (self-hosted)
Custom block theme mu-plugin seeders 4 custom post types Polylang-ready
Schema.org JSON-LD Native search click-to-embed YouTube facade
Mobile-first 360 px primary Self-hosted assets only No page-builders
The result
The site is live at cabanarares.ro, written in the owner's voice, owned entirely by the client — the design tokens, the content seeders, the custom post types, all of it lives in one self-contained block theme that any future developer can read and extend. Adding a new room is a five-line edit. Changing the brand color is a one-line edit. There's no agency dashboard, no monthly fee, no plugin subscription that breaks if it expires.
You own the code. The website opens like a travel feature, books like a guest house, runs like a static site.



