06 — Content Modeling (Umbraco)
PRD Document · Savoy Signature Hotels — Multi-Site Headless Platform
Version: 1.0 · Date: 2026-03-04
Related docs:03_MultiSite_and_Domains.md,07_Modules_and_Templates.md,A02_API_Contracts.md
1. Purpose
Section titled “1. Purpose”This document defines the content type structure in Umbraco 17 for the Savoy Signature multi-site platform. It covers Document Types, Element Types (for modules), compositions, property editors, and the content tree hierarchy for all 8 sites.
2. Content Type Architecture
Section titled “2. Content Type Architecture”2.1 Architecture Overview
Section titled “2.1 Architecture Overview”2.2 Type Categories
Section titled “2.2 Type Categories”| Category | Purpose | Example |
|---|---|---|
| Document Types | Represent pages in the content tree; define URL structure | homePage, roomDetailPage |
| Element Types | Represent reusable content blocks (modules) within pages; NOT pages themselves | heroSlider, bookingBar, richText |
| Compositions | Shared property groups mixed into multiple Document/Element Types | seoComposition, openGraphComposition |
3. Document Types
Section titled “3. Document Types”3.1 Site Root (siteRoot)
Section titled “3.1 Site Root (siteRoot)”The root node for each of the 8 sites. Stores site-wide configuration:
| Property | Alias | Type | Required | Description |
|---|---|---|---|---|
| Site Name | siteName | Textstring | ✅ | Display name of the site |
| Site Key | siteKey | Textstring | ✅ | Unique key (savoy-palace, royal-savoy, etc.) |
| Theme | theme | Textstring | ✅ | CSS theme identifier |
| Logo | logo | Media Picker | ✅ | SVG logo for header |
| Logo Alt (light) | logoAlt | Media Picker | ❌ | Light version for dark backgrounds |
| Favicon | favicon | Media Picker | ✅ | Site favicon |
| Default Meta Title | defaultMetaTitle | Textstring | ✅ | Fallback <title> |
| Default Meta Description | defaultMetaDescription | Textarea | ✅ | Fallback meta description |
| Default OG Image | defaultOgImage | Media Picker | ✅ | Fallback Open Graph image |
| Synxis Hotel ID | synxisHotelId | Textstring | ❌ | For booking redirect |
| Synxis Chain ID | synxisChainId | Textstring | ✅ | Chain identifier |
| Navarino Hotel Code | navarinoHotelCode | Textstring | ❌ | Calendar widget config |
| Navarino API Token | navarinoApiToken | Textstring | ❌ | Calendar widget auth |
| GTM Container ID | gtmContainerId | Textstring | ❌ | Google Tag Manager |
| Header Navigation | headerNavigation | Content Picker (Multiple) | ✅ | Main menu items |
| Footer Configuration | footerConfig | Block List | ✅ | Footer columns and links |
| Social Media Links | socialLinks | Block List | ❌ | Social media URLs |
| Cookie Policy Page | cookiePolicyPage | Content Picker | ✅ | Link to cookie policy |
| Privacy Policy Page | privacyPolicyPage | Content Picker | ✅ | Link to privacy policy |
Allowed children: homePage
3.2 Home Page (homePage)
Section titled “3.2 Home Page (homePage)”| Property | Alias | Type | Required | Description |
|---|---|---|---|---|
(inherits seoComposition) | ||||
(inherits openGraphComposition) | ||||
| Modules | modules | Block List | ✅ | Page content composed from Element Types |
Allowed children: contentPage, roomsListPage, diningListPage, wellnessPage, experiencesPage, galleryPage, eventsPage, celebrationsPage, contactPage, newsListPage, specialOffersPage, faqPage
3.3 Content Page (contentPage)
Section titled “3.3 Content Page (contentPage)”Generic content page with modular composition. Used for: About, Concept, Awards, Facilities, Destination, Services, Sustainability, Corporate pages, etc.
| Property | Alias | Type | Required | Description |
|---|---|---|---|---|
(inherits seoComposition) | ||||
(inherits openGraphComposition) | ||||
(inherits navigationComposition) | ||||
| Modules | modules | Block List | ✅ | Page content from modules |
Allowed children: contentPage (allows nesting)
3.4 Rooms & Accommodations
Section titled “3.4 Rooms & Accommodations”roomsListPage
Section titled “roomsListPage”| Property | Alias | Type | Required | Description |
|---|---|---|---|---|
(inherits seoComposition) | ||||
| Title | title | Textstring | ✅ | Page heading |
| Introduction | introduction | Rich Text | ❌ | Intro text |
| Filter by Category | filterByCategory | Toggle | ❌ | Enable category filtering |
Allowed children: roomDetailPage
roomDetailPage
Section titled “roomDetailPage”| Property | Alias | Type | Required | Description |
|---|---|---|---|---|
(inherits seoComposition) | ||||
(inherits openGraphComposition) | ||||
(inherits responsiveImageComposition) | Featured image (desktop + mobile) | |||
| Room Name | roomName | Textstring | ✅ | Name of the room/suite |
| Category | roomCategory | Dropdown | ✅ | Room, Suite, Villa, etc. |
| Short Description | shortDescription | Textarea | ✅ | Card description |
| Full Description | fullDescription | Rich Text | ✅ | Detailed description |
| Gallery | gallery | Block List (responsiveImageItem) | ✅ | Room photos (each with desktop + mobile) |
| Size (sqm) | size | Numeric | ❌ | Room area |
| Max Guests | maxGuests | Numeric | ❌ | Maximum occupancy |
| View | view | Textstring | ❌ | Sea view, garden view, etc. |
| Amenities | amenities | Block List | ❌ | List of amenity items |
| Floor Plan | floorPlan | Media Picker | ❌ | Floor plan image |
| Booking CTA | bookingCta | Toggle | ✅ | Show booking button (default: true) |
| Modules | modules | Block List | ❌ | Additional modules below main content |
3.5 Dining
Section titled “3.5 Dining”diningListPage
Section titled “diningListPage”| Property | Alias | Type | Required |
|---|---|---|---|
(inherits seoComposition) | |||
| Title | title | Textstring | ✅ |
| Introduction | introduction | Rich Text | ❌ |
Allowed children: diningDetailPage
diningDetailPage
Section titled “diningDetailPage”| Property | Alias | Type | Required | Description |
|---|---|---|---|---|
(inherits seoComposition) | ||||
(inherits openGraphComposition) | ||||
| Restaurant Name | restaurantName | Textstring | ✅ | |
| Cuisine Type | cuisineType | Textstring | ❌ | e.g., “Mediterranean”, “Asian Fusion” |
| Short Description | shortDescription | Textarea | ✅ | Card description |
| Full Description | fullDescription | Rich Text | ✅ | |
| Gallery | gallery | Block List (responsiveImageItem) | ✅ | Each item has desktop + mobile image |
| Menu PDF | menuPdf | Media Picker | ❌ | Downloadable menu |
| Opening Hours | openingHours | Block List | ❌ | Day/time blocks |
| Dress Code | dressCode | Textstring | ❌ | |
| Reservations Required | reservationsRequired | Toggle | ❌ | |
| Location/Floor | location | Textstring | ❌ | e.g., “16th Floor” |
| Modules | modules | Block List | ❌ |
3.6 Other Hotel-Specific Page Types
Section titled “3.6 Other Hotel-Specific Page Types”wellnessPage
Section titled “wellnessPage”For SPA & Wellness sections. Inherits seoComposition, modulesComposition. Contains: title, introduction, gallery, treatments list (Block List), opening hours.
experiencesPage / experienceDetailPage
Section titled “experiencesPage / experienceDetailPage”For experiences and activities. List page with filtering; detail page with description, gallery, duration, pricing, booking info.
galleryPage
Section titled “galleryPage”Full-screen photo gallery. Properties: title, gallery albums (Block List of albums, each with title + media picker multiple).
eventsPage
Section titled “eventsPage”Events listing. Properties: title, introduction, and child event items with dates, venue, description.
celebrationsPage
Section titled “celebrationsPage”Weddings & Celebrations, Meetings & Incentives. Properties: title, introduction, modules, venue options (Block List).
contactPage
Section titled “contactPage”Contact form + map. Properties: title, introduction, address, phone, email, map coordinates, form configuration, modules.
newsListPage / newsDetailPage
Section titled “newsListPage / newsDetailPage”News/blog section. List with pagination; detail with title, date, author, body (Rich Text), featured image, tags.
specialOffersPage
Section titled “specialOffersPage”Promotional offers. Properties: title, introduction, child offer items with validity dates, description, conditions, CTA.
faqPage
Section titled “faqPage”FAQ section. Properties: title, FAQ items (Block List of question/answer pairs).
4. Compositions
Section titled “4. Compositions”4.1 SEO Composition (seoComposition)
Section titled “4.1 SEO Composition (seoComposition)”Applied to all pages that need custom SEO settings:
| Property | Alias | Type | Required | Description |
|---|---|---|---|---|
| Meta Title | metaTitle | Textstring | ❌ | Overrides page title in <title> |
| Meta Description | metaDescription | Textarea | ❌ | <meta name="description"> |
| Meta Keywords | metaKeywords | Tags | ❌ | For reference only (not used by search engines) |
| No Index | noIndex | Toggle | ❌ | Add <meta name="robots" content="noindex"> |
| No Follow | noFollow | Toggle | ❌ | Add nofollow to robots meta |
| Canonical URL | canonicalUrl | Textstring | ❌ | Override canonical URL |
4.2 Open Graph Composition (openGraphComposition)
Section titled “4.2 Open Graph Composition (openGraphComposition)”| Property | Alias | Type | Required |
|---|---|---|---|
| OG Title | ogTitle | Textstring | ❌ |
| OG Description | ogDescription | Textarea | ❌ |
| OG Image | ogImage | Media Picker | ❌ |
| OG Type | ogType | Dropdown | ❌ |
| Twitter Card Type | twitterCardType | Dropdown | ❌ |
4.3 Navigation Composition (navigationComposition)
Section titled “4.3 Navigation Composition (navigationComposition)”| Property | Alias | Type | Required | Description |
|---|---|---|---|---|
| Hide in Navigation | hideInNav | Toggle | ❌ | Hide from menus |
| Navigation Title | navTitle | Textstring | ❌ | Override title in menus |
| Navigation Order | navOrder | Numeric | ❌ | Custom sort order |
4.4 Modules Composition (modulesComposition)
Section titled “4.4 Modules Composition (modulesComposition)”| Property | Alias | Type | Required |
|---|---|---|---|
| Modules | modules | Block List | ✅ |
Note: The Block List editor will be configured with all available Element Types (modules). See section 5.
4.5 Responsive Image Composition (responsiveImageComposition)
Section titled “4.5 Responsive Image Composition (responsiveImageComposition)”Applied to all Document Types and Element Types that feature a primary/featured image. All image uploads require both a desktop and a mobile version.
| Property | Alias | Type | Required | Description |
|---|---|---|---|---|
| Image Desktop | imageDesktop | Media Picker | ✅ | Primary image for desktop viewports (≥1024px). Recommended: 1920×1080 or wider |
| Image Mobile | imageMobile | Media Picker | ✅ | Optimized image for mobile viewports (<1024px). Recommended: 750×1000 or taller |
[!IMPORTANT] Every image field across all Document Types and Element Types must follow the desktop + mobile pattern. This includes heroes, galleries, room photos, restaurant photos, etc. The frontend uses
<picture>with<source>elements to serve the correct image based on viewport width.
Nested Element Type: responsiveImageItem
Section titled “Nested Element Type: responsiveImageItem”Used in galleries and any Block List that contains multiple images:
| Property | Alias | Type | Required | Description |
|---|---|---|---|---|
| Image Desktop | imageDesktop | Media Picker | ✅ | Desktop version |
| Image Mobile | imageMobile | Media Picker | ✅ | Mobile version |
| Alt Text | altText | Textstring | ✅ | Accessibility description |
| Caption | caption | Textstring | ❌ | Optional caption |
5. Element Types (Modules)
Section titled “5. Element Types (Modules)”Element Types are the building blocks of page content. They are rendered by the Module Renderer (see 04_Frontend_Architecture.md). Each Element Type corresponds to a React component in packages/modules/.
5.1 Module Registry
Section titled “5.1 Module Registry”| ID | Element Type Alias | Display Name | Description | Used By |
|---|---|---|---|---|
| M01 | headerModule | Header | Site header with navigation | All (via layout) |
| M02 | footerModule | Footer | Site footer with links | All (via layout) |
| M03 | bookingBar | Booking Bar | Date picker + booking CTA (Navarino) | Hotel sites |
| M04 | pageHero | Page Hero | Hero banner with title, subtitle, CTA | All |
| M05 | heroSlider | Hero Slider | Full-width image carousel | All |
| M06 | richTextBlock | Rich Text Block | WYSIWYG content area | All |
| M07 | imageTextBlock | Image + Text | Side-by-side image and text | All |
| M08 | cardGrid | Card Grid | Grid of cards (rooms, restaurants, etc.) | All |
| M09 | featuredCards | Featured Cards | Highlighted content cards with CTA | All |
| M10 | testimonials | Testimonials | Guest review carousel | Hotel sites |
| M11 | imageGallery | Image Gallery | Lightbox-enabled photo gallery | All |
| M12 | videoBlock | Video Block | Embedded video (YouTube/Vimeo or self-hosted) | All |
| M13 | accordion | Accordion | Expandable FAQ/info sections | All |
| M14 | tabsBlock | Tabs | Tabbed content sections | All |
| M15 | ctaBanner | CTA Banner | Full-width call-to-action banner | All |
| M16 | mapBlock | Map | Google Maps embed with markers | All |
| M17 | formModule | Form | Dynamic form (contact, newsletter, etc.) | All |
| M18 | hotelListBlock | Hotel List | Grid/list of hotel cards (group site) | Group site |
| M19 | offersCarousel | Offers Carousel | Special offer cards carousel | All |
| M20 | statsBlock | Stats/Numbers | Key figures with animations | All |
| M21 | timelineBlock | Timeline | Chronological event display | All |
| M22 | teamBlock | Team | Staff/board member cards | Group site |
| M23 | newsletterSignup | Newsletter Signup | Email subscription form | All |
| M24 | socialFeed | Social Feed | Instagram/social media embed | All |
| M25 | downloadsBlock | Downloads | File download list (menus, brochures) | All |
Full module specifications in
07_Modules_and_Templates.mdandA04_Module_Catalog.md
5.2 Reusable Element Type: htmlHeading
Section titled “5.2 Reusable Element Type: htmlHeading”Used for ALL title, subtitle, and label/eyebrow fields across modules. Provides editor control over both the visible text (with bold formatting via Tiptap RTE) and the semantic HTML tag.
| Property | Alias | Type | Required | Description |
|---|---|---|---|---|
| Text | text | Rich Text (Tiptap, bold-only) | ✅ | Heading text — supports <strong> inline formatting |
| HTML Tag | html | Dropdown | ✅ | Semantic tag: h1, h2, h3, h4, h5, h6, span, p |
Configuration: Used as a single-block Block List (useSingleBlockMode: true, validationLimit.max = 1) on title/subtitle/label properties. The text property varies by culture; the html tag is invariant.
[!IMPORTANT] Every title, subtitle, and label/eyebrow field across ALL modules MUST use
htmlHeadingvia Block List. Never use a plain Textstring for heading fields. This ensures editors can control both the text content (with bold) and the semantic HTML tag for accessibility and SEO.
5.3 Element Type Example: heroSlider
Section titled “5.3 Element Type Example: heroSlider”| Property | Alias | Type | Required | Description |
|---|---|---|---|---|
| Title | title | Block List (htmlHeading, single-block) | ✅ | Main heading |
| Subtitle | subtitle | Block List (htmlHeading, single-block) | ❌ | Secondary text |
| Slides | slides | Block List (heroSlide) | ✅ | Carousel slides |
| Autoplay | autoplay | Toggle | ❌ | Auto-advance slides (default: true) |
| Interval (ms) | interval | Numeric | ❌ | Slide interval (default: 5000) |
Nested Element Type: heroSlide
Section titled “Nested Element Type: heroSlide”| Property | Alias | Type | Required |
|---|---|---|---|
| Image Desktop | imageDesktop | Media Picker | ✅ |
| Image Mobile | imageMobile | Media Picker | ✅ |
| Caption | caption | Textstring | ❌ |
| CTA Label | ctaLabel | Textstring | ❌ |
| CTA Link | ctaLink | URL Picker | ❌ |
Note: Title and Subtitle use the reusable
htmlHeadingElement Type (see section 5.2). This allows editors to control both the visible text (with bold formatting) and the semantic HTML tag.
5.4 Element Type Example: bookingBar
Section titled “5.4 Element Type Example: bookingBar”| Property | Alias | Type | Required | Description |
|---|---|---|---|---|
| Style Variant | styleVariant | Dropdown | ❌ | inline, overlay, sticky |
| Show Room Type Filter | showRoomFilter | Toggle | ❌ | Show room type dropdown |
| Custom Promo Code | promoCode | Textstring | ❌ | Pre-filled promo code |
Note: The booking bar reads Synxis/Navarino configuration from the
siteRootnode.
6. Content Delivery API Mapping
Section titled “6. Content Delivery API Mapping”6.1 API Response Structure
Section titled “6.1 API Response Structure”The Umbraco Content Delivery API v2 returns content in the following structure:
{ "name": "Savoy Palace - Homepage", "route": { "path": "/pt/", "startItem": { "id": "...", "path": "savoy-palace" } }, "contentType": "homePage", "cultures": { "pt": { "path": "/pt/", "startItem": { "path": "savoy-palace" } }, "en": { "path": "/en/", "startItem": { "path": "savoy-palace" } } }, "properties": { "metaTitle": "Savoy Palace - Luxury Hotel in Funchal, Madeira", "metaDescription": "...", "modules": { "items": [ { "contentType": "heroSlider", "properties": { "title": { "items": [{ "content": { "contentType": "htmlHeading", "properties": { "text": "Welcome to <strong>Savoy Palace</strong>", "html": "h1" } } }] }, "subtitle": { "items": [{ "content": { "contentType": "htmlHeading", "properties": { "text": "Luxury redefined in Madeira", "html": "p" } } }] }, "slides": { "items": [ { "contentType": "heroSlide", "properties": { "imageDesktop": { "url": "/media/hero-palace-pool-desktop.jpg", "name": "Pool view desktop", "width": 1920, "height": 1080, "mediaType": "Image" }, "imageMobile": { "url": "/media/hero-palace-pool-mobile.jpg", "name": "Pool view mobile", "width": 750, "height": 1000, "mediaType": "Image" }, "caption": "Infinity pool with ocean views", "ctaLabel": "Book Now", "ctaLink": "/pt/accommodations" } } ] }, "autoplay": true, "interval": 5000 } }, { "contentType": "bookingBar", "properties": { "styleVariant": "overlay" } }, { "contentType": "cardGrid", "properties": { "title": { "items": [{ "content": { "contentType": "htmlHeading", "properties": { "text": "Accommodations", "html": "h2" } } }] }, "cards": { "items": [ /* ... */ ] } } } ] } }}6.2 TypeScript Types for API Response
Section titled “6.2 TypeScript Types for API Response”export interface UmbracoContent { name: string; route: { path: string; startItem: { id: string; path: string }; }; contentType: string; cultures: Record<string, { path: string; startItem: { path: string } }>; properties: Record<string, any>;}
export interface UmbracoElement { contentType: string; properties: Record<string, any>;}
export interface UmbracoBlockList { items: UmbracoElement[];}
export interface UmbracoMedia { url: string; name: string; width?: number; height?: number; mediaType: string; bytes?: number;}
export interface PageContent { name: string; contentType: string; locale: string; path: string; siteKey: string; seo: { metaTitle?: string; metaDescription?: string; noIndex?: boolean; canonicalUrl?: string; ogTitle?: string; ogDescription?: string; ogImage?: UmbracoMedia; }; modules: UmbracoElement[]; availableLocales: { locale: string; path: string }[];}7. Content Tree per Site Type
Section titled “7. Content Tree per Site Type”7.1 Group Site (Savoy Signature)
Section titled “7.1 Group Site (Savoy Signature)”Based on the information architecture:
🏨 Savoy Signature [siteRoot]├── Home [homePage]├── About Us [contentPage]│ ├── Our Signature [contentPage]│ ├── Destination [contentPage]│ └── Awards [contentPage]├── Our Hotels [contentPage]│ └── (links to hotel sites — not child pages)├── Sustainability [contentPage]├── Discover [contentPage]│ ├── Restaurants and Bars [contentPage]│ ├── Experiences [contentPage]│ ├── Events [contentPage]│ ├── SPA & Wellness [contentPage]│ └── Special Offers [specialOffersPage]├── Careers [contentPage]├── Contact [contactPage]├── Corporate [contentPage]│ ├── Our Board [contentPage]│ ├── Awards and Certifications [contentPage]│ └── Sustainability [contentPage]├── Privacy Policy [contentPage]├── Terms & Conditions [contentPage]├── Complaint Book [contentPage]└── FAQs [faqPage]7.2 Hotel Site (Savoy Palace — example)
Section titled “7.2 Hotel Site (Savoy Palace — example)”Based on the information architecture:
🏨 Savoy Palace [siteRoot]├── Home [homePage]├── The Hotel [contentPage]│ ├── Concept [contentPage]│ ├── Awards [contentPage]│ ├── Facilities [contentPage]│ ├── Family [contentPage]│ ├── Destination [contentPage]│ ├── Online Store [contentPage]│ ├── Services [contentPage]│ ├── Special Offers [specialOffersPage]│ └── FAQs [faqPage]├── Accommodations [roomsListPage]│ ├── Rooms [roomDetailPage] (×N)│ └── Suites [roomDetailPage] (×N)├── Restaurants & Bars [diningListPage]│ ├── Galáxia Skyfood [diningDetailPage]│ ├── Orchidaceae Atelier [diningDetailPage]│ ├── Hibiscus Restaurant [diningDetailPage]│ ├── Alameda Restaurant [diningDetailPage]│ ├── Terreiro [diningDetailPage]│ ├── Pau de Lume [diningDetailPage]│ ├── Galáxia Skybar [diningDetailPage]│ ├── Lobby Lounge & Bar [diningDetailPage]│ └── Vimes Entertainment Bar [diningDetailPage]├── Wellness [wellnessPage]│ ├── SPA [contentPage]│ └── Gym [contentPage]├── Experiences [experiencesPage]│ └── (experience detail pages)├── Celebrations & Meetings [celebrationsPage]│ ├── Weddings & Celebrations [contentPage]│ └── Meetings & Incentives [contentPage]├── Events [eventsPage]├── Gallery [galleryPage]├── Contact [contactPage]├── Careers [contentPage]├── Privacy Policy [contentPage]└── Terms & Conditions [contentPage]Content trees for all 8 sites follow similar patterns. See section 10 of
03_MultiSite_and_Domains.mdfor the visual sitemaps.
8. Shared Content Node
Section titled “8. Shared Content Node”📁 Shared Content [sharedContentRoot]├── Footer Links [contentPage]│ ├── Corporate [contentPage]│ ├── Guests [contentPage]│ └── Professionals [contentPage]├── Social Media Links [contentPage]├── Legal Pages [contentPage]│ ├── Privacy Policy [contentPage]│ ├── Terms & Conditions [contentPage]│ └── Complaint Book [contentPage]├── Group-wide Promotions [contentPage]└── Common Labels [contentPage] └── (dictionary-style key/value pairs)9. Media Library Structure
Section titled “9. Media Library Structure”[!IMPORTANT] The Media Library folder structure must be pre-organized by WYcreative before handing over the backoffice to the client editorial team. This includes creating all folders, sub-folders, and uploading placeholder/example content to guide editors.
Media├── 📁 _Shared (Common)│ ├── 📁 Icons│ ├── 📁 Backgrounds & Patterns│ ├── 📁 Documents (PDFs, Brochures)│ ├── 📁 Logos (all hotel logos, SVG + PNG)│ └── 📁 Legal (certificates, badges)│├── 📁 Savoy Signature (Group)│ ├── 📁 Logo & Favicon│ ├── 📁 Homepage│ ├── 📁 About│ ├── 📁 Sustainability│ ├── 📁 Discover│ └── 📁 General│├── 📁 Savoy Palace│ ├── 📁 Logo & Favicon│ ├── 📁 Homepage│ ├── 📁 Rooms│ │ ├── 📁 Desktop│ │ └── 📁 Mobile│ ├── 📁 Restaurants│ │ ├── 📁 Desktop│ │ └── 📁 Mobile│ ├── 📁 Wellness│ ├── 📁 Experiences│ ├── 📁 Events & Celebrations│ ├── 📁 Gallery│ └── 📁 General│├── 📁 Royal Savoy│ ├── 📁 Logo & Favicon│ ├── 📁 Homepage│ ├── 📁 Rooms│ ├── 📁 Restaurants│ ├── 📁 Gallery│ └── 📁 General│├── 📁 Saccharum│ └── (same structure as hotel sites)├── 📁 The Reserve│ └── ...├── 📁 Calheta Beach│ └── ...├── 📁 Gardens│ └── ...└── 📁 Hotel Next └── ...9.1 Media Folder Organization Rules
Section titled “9.1 Media Folder Organization Rules”| Rule | Description |
|---|---|
| Pre-created by WYcreative | All folders must exist before client access. Include example/placeholder images where helpful |
| Desktop + Mobile separation | For sections with multiple images (rooms, restaurants), use Desktop/Mobile sub-folders |
| Naming convention | Files named descriptively: savoy-palace-room-deluxe-ocean-desktop.jpg |
| Shared first | Common assets (icons, logos, legal docs) go in _Shared folder, prefixed with underscore to sort first |
| Per-hotel isolation | Each hotel has its own top-level folder — editors should NOT cross-reference between hotel folders |
Media management details in
13_Media_and_Image_Pipeline.md
10. Multi-Language Strategy
Section titled “10. Multi-Language Strategy”| Aspect | Approach |
|---|---|
| Languages | Portuguese (pt) and English (en) for all sites |
| Default | pt is the default (mandatory) language |
| Variants | Umbraco language variants — each content node has pt and en versions |
| Fallback | If en variant is not published, the page returns 404 in English (no fallback to PT) |
| Media — Default | Portuguese (pt) images serve as the default for both PT and EN |
| Media — Overrides | If an image contains text, labels, or locale-specific visual elements, an EN variant can be uploaded. When an EN media variant exists, it is used for the EN locale; otherwise, the PT version is served |
| Dictionary | Umbraco Dictionary for fixed UI labels (e.g., “Read More”, “Book Now”) |
10.1 Media Language Fallback Flow
Section titled “10.1 Media Language Fallback Flow”[!NOTE] Most images (photos, landscapes, architecture) are language-agnostic and only need the PT version. The EN override should only be used when the image contains visible text (infographics, certificates, signage with labels, etc.).
Full i18n strategy in
10_MultiLanguage_and_i18n.md
11. Acceptance Criteria
Section titled “11. Acceptance Criteria”- All Document Types are created in Umbraco with correct property groups and compositions
- Element Types (modules) registered in Block List configuration
-
siteRootnodes created for all 8 sites with theme and booking configuration - Content tree structure matches information architecture sitemaps
- Shared Content node is accessible from all sites
- Content Delivery API returns correct JSON structure for all content types
- Multi-language variants work correctly (PT as mandatory, EN as optional)
- Media Library organized per-site with clear folder structure
- All properties have correct validation (required fields, length limits, etc.)
- Block List editors are configured with the correct allowed Element Types per page type
Next document: 07_Modules_and_Templates.md