Getting Started

Reuse the components, sections and application layouts already implemented in WedUploader. This guide helps developers make small improvements with the current HTML, CSS and JavaScript, without designing a new UI for every change.

Use the guide in this order. Start with the architecture below. Open a component reference for individual controls, then choose a reusable layout pattern. Copy it into the matching page starter, keep its wrapper and dependencies, and replace only the sample content or feature handler.
Reference What you reuse Where it belongs
Page Starter The document scaffold: head dependencies, shared navigation, content container and scripts. A new Public or Application page.
Reusable Layout Pattern A populated content section: existing components arranged as a form, table, card grid, FAQ or marketing section. Inside the starter’s existing content area. It does not add another shell.
Component One control or UI unit, with its states and behaviour. Within a pattern or an existing page.

Thirteen implementation groups remain available in the sidebar. Preview frames load each example’s actual context styles separately, so Public and Application rules do not leak into each other. HTML, dependency order and short source notes sit below every example.

Architecture

This ZIP is a static HTML/CSS/JavaScript project. The product contexts below sit beside each other at the project root; Guest Album is part of Public. The Documentation has no separate component library or build step.

Actual path Responsibility Use when extending
index.html Project entry with links to the supplied contexts. Keep the sibling folder structure when extracting the ZIP.
assets/css/wu-foundation.css
assets/css/wu-components.css
assets/css/wu-form-controls.css
assets/css/wu-icons.css
Shared tokens, Bootstrap theme bridge, controls, component primitives and icon classes. wu-components.css imports Foundation. Reuse variables and classes. Do not copy their rules into a page stylesheet.
assets/js/wu-core.js
assets/logo/
assets/icons/
Shared JavaScript helpers, brand identity and SVG icons. Reference the shared file; respect paths relative to the page or stylesheet.
public/*.html
public/assets/css/
public/assets/js/
Marketing, content and entry pages. Public media stays in public/assets/images/ and public/assets/ornaments/. components.css and public.css import shared styles. site-shell.css and navigation.js belong to Public navigation. Other CSS depends on the page.
public/guest-template-1.html
public/guest-template-2.html
public/guest-template-3.html
Three separate Guest Album templates. public/assets/css/guest-album.css and public/assets/js/guest-album.js supply their related feature architecture. Preserve the chosen template’s .wu-guest, template class and body configuration. Guest is not a fourth top-level app.
application/*.html
application/assets/css/
application/assets/js/
application/assets/images/
Dashboard, Manage Album, Moderation and other signed-in layouts. application-shell.css styles the shared shell; application-features.css adds page-scoped layouts. application-album.css and premium.css are context additions, not global replacements.
documentation/index.html
documentation/preview.html
documentation/assets/js/examples.js
documentation/starters/
This reference, isolated live previews, source/dependency catalog and the two page starters. SOURCE_MAP.json records provenance. Documentation styles use doc-*. Preview hosting stays in Documentation; product styles are loaded from their original folders.

Dependency order & ownership

  • Bootstrap: the source uses Bootstrap 5.3.8 CSS before theme/context styles and its bundle before Bootstrap-dependent scripts. Load the bundle once; it includes Popper and owns dropdown, tab, modal and offcanvas lifecycle.
  • Public: keep the chosen page’s CSS order. The starter uses components.css, pages.css, responsive.css, site-shell.css, public-layout.css, public.css and shared icons. Homepage compositions additionally use homepage.css; Pricing details use pricing-enhanced.css. Each pattern lists its required order. navigation.js owns the Public menu. Page scroll animation is optional and its attributes are omitted from the new reusable examples.
  • Application: shared icons/components/forms → application-shell.css → application-features.css → required page CSS. For the page starter, scripts are Bootstrap → wu-core.js → application-shell.js → application.js. The shell controller owns navigation/profile; application.js owns feature flows and guided tour. Files such as album-ui.js, album-drawers.js, voicemail.js and moderation-tabs.js are only added where their markup is present.
  • Shared markup, page code: shared classes style controls; wrappers and body classes select context rules. Give new Application pages a distinct data-page. Reuse a demonstrated styling class when needed, but do not copy a business root ID such as albumRows just to get its appearance. Keep one owner per event instead of adding a second modal/offcanvas/tab controller.

Use the exact dependency block attached to a specimen when a layout needs page-level CSS. Asset Usage explains file references, and Page Starter Guidance provides the practical starting files and local-server instructions.

Foundation

Color families

These swatches use CSS variables from assets/css/wu-foundation.css. Values are generated from that file, not copied from an older palette board.

--wu-gold-0#fffdf8
--wu-gold-50#fbf8f2
--wu-gold-100#f5ecdd
--wu-gold-300#dfc18e
--wu-gold-500#c19a5b
--wu-gold-700#806036
--wu-gold-900#453015
--wu-bronze-0#fdfbf8
--wu-bronze-50#FBF9F5
--wu-bronze-100#F1EADF
--wu-bronze-300#D3BEA1
--wu-bronze-500#AB8965
--wu-bronze-700#71563D
--wu-bronze-900#3E2E21
--wu-neutral-0#ffffff
--wu-neutral-50#faf9f7
--wu-neutral-100#f4f1ec
--wu-neutral-300#d8d1c6
--wu-neutral-500#958c80
--wu-neutral-700#59524a
--wu-neutral-900#2b2824

Semantic roles

Variable Root declaration Applied at this viewport
--wu-primary var(--wu-gold-500) var(--wu-gold-500)
--wu-primary-2 #8C7954 #8C7954
--wu-canvas #fffefc #fffefc
--wu-accessible-deep #57412e #57412e
--wu-warm-ink #292723 #292723
--wu-success-500 #2f7a58 #2f7a58
--wu-warning-500 #c98916 #c98916
--wu-danger-500 #b23a3a #b23a3a
--wu-info-500 #4e7484 #4e7484

Typography

A place for every memory.

Clear controls. Familiar language. Inter for product UI.

Variable Root declaration Applied at this viewport
--wu-font-sans "Inter", ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif "Inter", ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif
--wu-font-display "Playfair Display", serif "Playfair Display", serif
--wu-text-xs 0.75rem 0.75rem
--wu-text-sm 0.875rem 0.875rem
--wu-text-md 1rem 1rem
--wu-text-lg 1.125rem 1.125rem
--wu-text-xl 1.5rem 1.5rem
--wu-text-2xl clamp(1.875rem, 4vw, 3.25rem) clamp(1.875rem, 4vw, 3.25rem)
--wu-leading-tight 1.08 1.08
--wu-leading-body 1.55 1.55

The source defines .wu-text-md-standard more than once; the later 48px rule wins. Prefer semantic heading markup and the named size tokens when introducing a small page extension.

Spacing, layout & shape

Variable Root declaration Applied at this viewport
--wu-space-0 0 0
--wu-space-1 0.125rem 0.125rem
--wu-space-2 0.25rem 0.25rem
--wu-space-3 0.375rem 0.375rem
--wu-space-4 0.5rem 0.5rem
--wu-space-6 0.75rem 0.75rem
--wu-space-8 1rem 1rem
--wu-space-10 1.25rem 1.25rem
--wu-space-12 1.5rem 1.5rem
--wu-space-16 2rem 2rem
--wu-space-20 2.5rem 2.5rem
--wu-space-24 3rem 3rem
--wu-space-32 4rem 4rem
--wu-space-40 5rem 5rem
--wu-space-48 6rem 6rem
--wu-space-64 8rem 8rem
--wu-radius-none 0 0
--wu-radius-xs 0.25rem 0.25rem
--wu-radius-sm 0.5rem 0.5rem
--wu-radius-md 0.75rem 0.75rem
--wu-radius-lg 1rem 1rem
--wu-radius-xl 1.5rem 1.5rem
--wu-radius-2xl 2rem 2rem
--wu-radius-full 999rem 999rem
--wu-border-subtle rgba(47, 36, 26, 0.12) rgba(47, 36, 26, 0.12)
--wu-border-strong rgba(90, 64, 40, 0.28) rgba(90, 64, 40, 0.28)
--wu-shadow-xs 0 1px 2px rgba(47, 36, 26, 0.05) 0 1px 2px rgba(47, 36, 26, 0.05)
--wu-shadow-sm 0 4px 12px rgba(47, 36, 26, 0.07) 0 4px 12px rgba(47, 36, 26, 0.07)
--wu-shadow-md 0 12px 28px rgba(47, 36, 26, 0.09) 0 12px 28px rgba(47, 36, 26, 0.09)
--wu-shadow-lg 0 24px 50px rgba(47, 36, 26, 0.12) 0 24px 50px rgba(47, 36, 26, 0.12)
--wu-shadow-xl 0 32px 80px rgba(47, 36, 26, 0.16) 0 32px 80px rgba(47, 36, 26, 0.16)
--wu-shadow-overlay 0 40px 96px rgba(31, 29, 27, 0.25) 0 40px 96px rgba(31, 29, 27, 0.25)
--wu-shadow-jumbo 0px 32px 80px 0px rgba(24, 22, 20, 0.051) 0px 32px 80px 0px rgba(24, 22, 20, 0.051)
--wu-container 1280px 1280px
--wu-container-reading 760px 760px
--wu-section-space clamp(4rem, 8vw, 8rem) clamp(4rem, 8vw, 8rem)
--wu-radius-pill 999px 999px
--wu-shadow-focus 0 0 0 3px rgba(193,154,91,.22) 0 0 0 3px rgba(193,154,91,.22)
--wu-space-5 20px 20px
--wu-space-30 120px 120px

Use the actual Bootstrap .container, .row, .col-*, gap and display utilities. Public adds .wu-container; Application uses .wu-app → .wu-main → .wu-page. Do not substitute one context's wrapper for another.

Source naming notes

Use wu-select, wu-button-md, wu-button--outline--light and wu-icon--md for new reuse. Some source markup also carries wu-sellect, wu-button--md, wu-button--outline-light, wu-icon-md or wu-icon--m without matching CSS rules. Existing excerpts retain source markers; these are not documented as supported aliases.

Responsive conventions & Bootstrap bridge

Application and current Public menu use desktop ≥1200px, tablet 768–1199px and mobile <768px. Individual layouts also have component-specific media queries; keep the source CSS with the component.

Variable Root declaration Applied at this viewport
--bs-body-font-family var(--wu-font-sans) var(--wu-font-sans)
--bs-body-color var(--wu-neutral-900) var(--wu-neutral-900)
--bs-body-bg var(--wu-neutral-0) var(--wu-neutral-0)
--bs-primary var(--wu-accessible-deep) var(--wu-accessible-deep)
--bs-primary-rgb 90, 64, 40 90, 64, 40
--bs-secondary var(--wu-bronze-500) var(--wu-bronze-500)
--bs-secondary-rgb 140, 121, 84 140, 121, 84
--bs-border-color var(--wu-border-subtle) var(--wu-border-subtle)
--bs-border-radius-sm var(--wu-radius-sm) var(--wu-radius-sm)
--bs-border-radius var(--wu-radius-md) var(--wu-radius-md)
--bs-border-radius-lg var(--wu-radius-lg) var(--wu-radius-lg)
--bs-link-color var(--wu-gold-700) var(--wu-gold-700)
--bs-link-hover-color var(--wu-gold-900) var(--wu-gold-900)
--bs-focus-ring-color rgba(193, 154, 91, 0.24) rgba(193, 154, 91, 0.24)

Bootstrap primitive color values can be bridged while context CSS changes component appearance. Preserve stylesheet order. Form-specific variables live in wu-form-controls.css; guest --guest-* variables live in guest-album.css.

Reusable Layout Patterns

Ready-to-use content arrangements built from the components already in this guide. A page starter provides the document and shell; a layout pattern fills its content area. These samples do not replace production page content.

Copy into a starter. Open the Public starter or Application starter. Replace its placeholder content with one pattern, keep the surrounding shell, and load the listed dependencies once. New sample HTML and dependency paths are already relative to documentation/starters/. Keep data-page="new-page" in Application demos and add only the styling body classes explicitly stated below.

Insert sections inside the Public starter’s existing <main>. Content + media and CTA extend the previous examples; the grids and full FAQ composition reuse current homepage markup.

Public · Content + media

Source arrangement: public/about.html · .wu-page-hero .wu-page-hero-grid

Live preview
Open preview ↗
  • Insert this whole section directly inside the Public starter <main>, replacing its placeholder section. Keep .container.wu-container and both copy/media columns.
  • Uses the Public starter’s existing stylesheets. The two source images and display utilities preserve the About page’s responsive image swap.
  • Sample copy is documentation-only. Update headings, CTA destinations and image alt text when reusing it.
HTML example Ready for the supplied page starter
HTML
<!-- Paste inside Public starter <main>. Asset paths below target documentation/starters/. -->
<section class="wu-page-hero wu-about-first">
  <div class="container wu-container">
    <div class="wu-page-hero-grid">
      <div class="wu-page-hero-copy">
        <h1 class="wu-title">Every moment, collected together.</h1>
        <p class="wu-lead">
          Create a shared space for your celebration. Invite guests to add their favourite photos,
          then revisit the day from every perspective.
        </p>
        <div class="wu-page-actions">
          <a
            class="wu-button wu-button--primary wu-button-lg"
            href="../../public/create-album.html"
          >
            Create an album →
          </a>
          <a class="wu-text-link" href="../../public/tutorials.html">Read the guide →</a>
        </div>
      </div>
      <div class="wu-page-visual px-2 px-xl-5">
        <img
          class="d-none d-sm-block d-md-none d-lg-block"
          src="../../public/assets/images/03-about-us/01%20hero-about.webp"
          alt="A collection of wedding memories and guest photographs"
          decoding="async"
          loading="lazy"
        />
        <img
          class="d-block d-sm-none d-md-block d-lg-none"
          src="../../public/assets/images/03-about-us/01-2-about-hero-mobile.webp"
          alt="A collection of wedding memories and guest photographs"
          decoding="async"
          loading="lazy"
        />
      </div>
    </div>
  </div>
</section>
CSS reference & dependencies

.wu-page-hero.wu-about-first.wu-container.wu-page-hero-grid.wu-page-hero-copy.wu-title.wu-lead.wu-page-actions.wu-button.wu-button--primary.wu-button-lg.wu-text-link.wu-page-visual

Stylesheets · in this order

  • https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css
  • public/assets/css/components.css
  • public/assets/css/pages.css
  • public/assets/css/responsive.css
  • public/assets/css/site-shell.css
  • public/assets/css/public-layout.css
  • public/assets/css/public.css
  • assets/css/wu-icons.css

Scripts · once, in this order

  • No component JavaScript required.

The reference lists use project-root paths. The copyable dependency block and HTML below use paths relative to documentation/starters/, so they work in the delivered starter files. Load each dependency once; keep scripts after content. When moving your starter to public/ or application/, adjust those paths together. Keep its shell controller; a content-only preview does not need to reload it.

Dependencies
<link
  href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css"
  rel="stylesheet"
/>
<link href="../../public/assets/css/components.css" rel="stylesheet" />
<link href="../../public/assets/css/pages.css" rel="stylesheet" />
<link href="../../public/assets/css/responsive.css" rel="stylesheet" />
<link href="../../public/assets/css/site-shell.css" rel="stylesheet" />
<link href="../../public/assets/css/public-layout.css" rel="stylesheet" />
<link href="../../public/assets/css/public.css" rel="stylesheet" />
<link href="../../assets/css/wu-icons.css" rel="stylesheet" />

Existing page-intro example extended with sample copy and descriptive image alt text; page-scroll animation attributes omitted for standalone reuse.

Public · Feature grid

Source arrangement: public/index.html · #features > .container.wu-container > .wu-latest-feature-head + .wu-latest-feature-grid

Live preview
Open preview ↗
  • Insert inside the Public starter <main>. This source composition contains one photo and four feature cards; keep all five grid items and their order.
  • Add class="wu-home-latest" to the Public starter body for the existing homepage section spacing. Keep a new data-page value such as new-public.html; do not copy the homepage business identity.
  • This section also needs homepage.css. Use the ordered dependency block below for this pattern in the Public starter; it includes responsive.css after homepage.css. Do not load Application styles here.
  • The source grid is three tracks on desktop, two below 1200px (photo spans both), and one below 768px. No component JavaScript is required.
HTML example Ready for the supplied page starter
HTML
<!-- Paste inside Public starter <main>. Asset paths below target documentation/starters/. -->
<section aria-labelledby="features-title" class="wu-section bg-gold-50" id="features">
  <div class="container wu-container">
    <div class="wu-latest-feature-head">
      <div>
        <p class="wu-eyebrow">Made for your celebration</p>
        <h2 class="wu-title" id="features-title">A thoughtful home for your event memories.</h2>
      </div>
      <div
        class="d-xl-block d-md-flex justify-content-start justify-content-lg-between align-items-end"
      >
        <p class="wu-body">
          Build a simple experience around the people who matter. These four sample features show
          how existing cards form a complete section.
        </p>
        <div class="d-none d-md-block d-xl-none text-left mt-2">
          <a class="wu-text-link" href="../../public/pricing.html#features">
            Explore all features →
          </a>
        </div>
      </div>
    </div>
    <div class="wu-latest-feature-grid">
      <figure class="wu-latest-feature-photo">
        <img
          alt="Newlyweds celebrating with friends"
          decoding="async"
          height="698"
          loading="lazy"
          src="../../public/assets/images/memory-07.webp"
          width="478"
        />
      </figure>
      <article class="wu-latest-feature-card">
        <div class="wu-tile-icon">
          <img class="text-gold-500" src="../../assets/icons/user.svg" alt="" />
        </div>
        <h3 class="fw-bold">Easy invitations</h3>
        <p>Give friends one clear link before the celebration begins.</p>
      </article>
      <article class="wu-latest-feature-card">
        <div class="wu-tile-icon">
          <img class="text-gold-500" src="../../assets/icons/disc.svg" alt="" />
        </div>
        <h3 class="fw-bold">One shared collection</h3>
        <p>Gather everyone’s favourite moments in a familiar layout.</p>
      </article>
      <article class="wu-latest-feature-card">
        <div class="wu-tile-icon">
          <img class="text-gold-500" src="../../assets/icons/picture.svg" alt="" />
        </div>
        <h3 class="fw-bold">Details that feel like you</h3>
        <p>Keep your event information close to the photographs.</p>
      </article>
      <article class="wu-latest-feature-card">
        <div class="wu-tile-icon">
          <img class="text-gold-500" src="../../assets/icons/infinity.svg" alt="" />
        </div>
        <h3 class="fw-bold">Memories to revisit</h3>
        <p>Return to the little moments you may have missed.</p>
      </article>
    </div>
    <div class="d-block d-md-none d-xl-block text-left mt-2">
      <a class="wu-text-link" href="../../public/pricing.html#features">Explore all features →</a>
    </div>
  </div>
</section>
CSS reference & dependencies

.wu-section.wu-container.wu-latest-feature-head.wu-eyebrow.wu-title.wu-body.wu-text-link.wu-latest-feature-grid.wu-latest-feature-photo.wu-latest-feature-card.wu-tile-icon

Stylesheets · in this order

  • https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css
  • public/assets/css/components.css
  • public/assets/css/public.css
  • public/assets/css/homepage.css
  • public/assets/css/site-shell.css
  • public/assets/css/responsive.css
  • assets/css/wu-icons.css

Scripts · once, in this order

  • No component JavaScript required.

The reference lists use project-root paths. The copyable dependency block and HTML below use paths relative to documentation/starters/, so they work in the delivered starter files. Load each dependency once; keep scripts after content. When moving your starter to public/ or application/, adjust those paths together. Keep its shell controller; a content-only preview does not need to reload it.

Dependencies
<link
  href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css"
  rel="stylesheet"
/>
<link href="../../public/assets/css/components.css" rel="stylesheet" />
<link href="../../public/assets/css/public.css" rel="stylesheet" />
<link href="../../public/assets/css/homepage.css" rel="stylesheet" />
<link href="../../public/assets/css/site-shell.css" rel="stylesheet" />
<link href="../../public/assets/css/responsive.css" rel="stylesheet" />
<link href="../../assets/css/wu-icons.css" rel="stylesheet" />

Documentation sample composition using existing source classes. Sample text, record IDs and demo-only hooks are local to this example.

Public · Media showcase

Source arrangement: public/index.html · .wu-section.wu-home-learn-dark > .container.wu-container > .wu-learn-grid

Live preview
Open preview ↗
  • Insert inside the Public starter <main>. Repeat .wu-story-card inside .wu-learn-grid; keep the .wu-home-learn-dark parent for this source colour treatment.
  • Add class="wu-home-latest" to the Public starter body for the existing homepage section spacing. Keep a new data-page value such as new-public.html; do not copy the homepage business identity.
  • Use the ordered homepage dependency stack below in the Public starter. This is the same card family documented under Cards, arranged as a complete section.
  • Three columns collapse using the existing Public responsive rules. Source WebP media retain width/height, lazy loading, async decoding and the .wu-photo crop.
HTML example Ready for the supplied page starter
HTML
<!-- Paste inside Public starter <main>. Asset paths below target documentation/starters/. -->
<section
  aria-labelledby="docs-public-showcase-title"
  class="wu-section wu-home-learn-dark"
  id="docs-public-showcase"
>
  <div class="container wu-container">
    <div class="wu-section-head text-center">
      <div>
        <p class="wu-eyebrow wu-eyebrow--center">From the celebration</p>
        <h2 class="wu-title-sans" id="docs-public-showcase-title">A few moments worth sharing.</h2>
      </div>
    </div>
    <div class="wu-learn-grid">
      <article class="wu-story-card">
        <div class="wu-story-card-media wu-photo">
          <img
            alt="Friends gathering for a wedding photograph"
            decoding="async"
            height="645"
            loading="lazy"
            src="../../public/assets/images/memory-01.webp"
            width="960"
          />
        </div>
        <div class="wu-story-card-copy">
          <span class="wu-kicker">Before the ceremony</span>
          <h2 class="wu-font-display">The people who made the day</h2>
          <p class="my-3 text-neutral-500">
            A gallery of laughter, anticipation and familiar faces.
          </p>
          <a class="wu-text-link dark" href="../../public/blog.html">Explore the story →</a>
        </div>
      </article>
      <article class="wu-story-card">
        <div class="wu-story-card-media wu-photo">
          <img
            alt="Newlyweds together outdoors"
            decoding="async"
            height="952"
            loading="lazy"
            src="../../public/assets/images/memory-04.webp"
            width="833"
          />
        </div>
        <div class="wu-story-card-copy">
          <span class="wu-kicker">After the vows</span>
          <h2 class="wu-font-display">A moment just for two</h2>
          <p class="my-3 text-neutral-500">
            A quiet pause in the middle of a beautiful celebration.
          </p>
          <a class="wu-text-link dark" href="../../public/blog.html">Explore the story →</a>
        </div>
      </article>
      <article class="wu-story-card">
        <div class="wu-story-card-media wu-photo">
          <img
            alt="A celebration under sparklers"
            decoding="async"
            height="777"
            loading="lazy"
            src="../../public/assets/images/memory-08.webp"
            width="762"
          />
        </div>
        <div class="wu-story-card-copy">
          <span class="wu-kicker">The evening</span>
          <h2 class="wu-font-display">One last dance together</h2>
          <p class="my-3 text-neutral-500">
            Candid photographs from the end of an unforgettable evening.
          </p>
          <a class="wu-text-link dark" href="../../public/blog.html">Explore the story →</a>
        </div>
      </article>
    </div>
  </div>
</section>
CSS reference & dependencies

.wu-section.wu-home-learn-dark.wu-container.wu-section-head.wu-eyebrow.wu-eyebrow--center.wu-title-sans.wu-learn-grid.wu-story-card.wu-story-card-media.wu-photo.wu-story-card-copy.wu-kicker.wu-font-display.wu-text-link

Stylesheets · in this order

  • https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css
  • public/assets/css/components.css
  • public/assets/css/public.css
  • public/assets/css/homepage.css
  • public/assets/css/site-shell.css
  • public/assets/css/responsive.css
  • assets/css/wu-icons.css

Scripts · once, in this order

  • No component JavaScript required.

The reference lists use project-root paths. The copyable dependency block and HTML below use paths relative to documentation/starters/, so they work in the delivered starter files. Load each dependency once; keep scripts after content. When moving your starter to public/ or application/, adjust those paths together. Keep its shell controller; a content-only preview does not need to reload it.

Dependencies
<link
  href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css"
  rel="stylesheet"
/>
<link href="../../public/assets/css/components.css" rel="stylesheet" />
<link href="../../public/assets/css/public.css" rel="stylesheet" />
<link href="../../public/assets/css/homepage.css" rel="stylesheet" />
<link href="../../public/assets/css/site-shell.css" rel="stylesheet" />
<link href="../../public/assets/css/responsive.css" rel="stylesheet" />
<link href="../../assets/css/wu-icons.css" rel="stylesheet" />

Documentation sample composition using existing source classes. Sample text, record IDs and demo-only hooks are local to this example.

Public · Call to action

Source arrangement: public/about.html · .wu-final.wu-final--cta

Live preview
Open preview ↗
  • Insert directly inside the Public starter <main>. Copy .wu-final, .wu-final-inner, .wu-final-content and the action group together.
  • Uses the Public starter’s existing CSS and no component JavaScript. Source text alignment and action wrapping are kept for smaller screens.
  • The supporting paragraph reuses .wu-lead. All sample copy lives in Documentation; the About page is unchanged.
HTML example Ready for the supplied page starter
HTML
<!-- Paste inside Public starter <main>. Asset paths below target documentation/starters/. -->
<section class="wu-final wu-final--cta" aria-labelledby="final-title">
  <div class="wu-final-inner">
    <div class="wu-final-content">
      <p class="wu-eyebrow wu-eyebrow--center text-start text-sm-center text-gold-700">
        Your next celebration
      </p>
      <h2 class="wu-title-sans text-start text-sm-center" id="final-title">
        Make room for every guest’s memories.
      </h2>
      <p class="wu-lead text-start text-sm-center">
        Share one album link before the event and give every photo a place to land.
      </p>
      <div class="wu-hero-actions justify-content-start justify-content-sm-center">
        <a class="wu-button wu-button-lg wu-button--primary" href="../../public/create-album.html">
          Start collecting →
        </a>
        <a class="wu-text-link" href="../../public/pricing.html">See pricing →</a>
      </div>
    </div>
  </div>
</section>
CSS reference & dependencies

.wu-final.wu-final--cta.wu-final-inner.wu-final-content.wu-eyebrow.wu-eyebrow--center.wu-title-sans.wu-lead.wu-hero-actions.wu-button.wu-button-lg.wu-button--primary.wu-text-link

Stylesheets · in this order

  • https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css
  • public/assets/css/components.css
  • public/assets/css/pages.css
  • public/assets/css/responsive.css
  • public/assets/css/site-shell.css
  • public/assets/css/public-layout.css
  • public/assets/css/public.css
  • assets/css/wu-icons.css

Scripts · once, in this order

  • No component JavaScript required.

The reference lists use project-root paths. The copyable dependency block and HTML below use paths relative to documentation/starters/, so they work in the delivered starter files. Load each dependency once; keep scripts after content. When moving your starter to public/ or application/, adjust those paths together. Keep its shell controller; a content-only preview does not need to reload it.

Dependencies
<link
  href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css"
  rel="stylesheet"
/>
<link href="../../public/assets/css/components.css" rel="stylesheet" />
<link href="../../public/assets/css/pages.css" rel="stylesheet" />
<link href="../../public/assets/css/responsive.css" rel="stylesheet" />
<link href="../../public/assets/css/site-shell.css" rel="stylesheet" />
<link href="../../public/assets/css/public-layout.css" rel="stylesheet" />
<link href="../../public/assets/css/public.css" rel="stylesheet" />
<link href="../../assets/css/wu-icons.css" rel="stylesheet" />

Existing CTA example extended with sample copy and supporting text using .wu-lead; no new CTA styling.

Public · FAQ section

Source arrangement: public/index.html · #faq-preview > .container.wu-container > .wu-faq-layout

Live preview
Open preview ↗
  • Insert inside the Public starter <main>. Keep id="faq-preview": homepage.css uses that ID to style this particular section. Use it once per page.
  • Add class="wu-home-latest" to the Public starter body for the existing homepage section spacing. Keep a new data-page value such as new-public.html; do not copy the homepage business identity.
  • This extends the existing FAQ component into a heading + question-list composition. Native details/summary provides keyboard and open/close behaviour; Bootstrap Collapse is not needed.
  • Use the homepage dependency stack below. The first answer starts open; remove open or change the sample questions as needed. Rename the heading ID and aria-labelledby together if composing multiple sections.
HTML example Ready for the supplied page starter
HTML
<!-- Paste inside Public starter <main>. Asset paths below target documentation/starters/. -->
<section aria-labelledby="docs-faq-title" class="wu-section" id="faq-preview">
  <div class="container wu-container">
    <div class="wu-faq-layout">
      <div class="wu-faq-intro mb-3 mb-sm-0">
        <p class="wu-eyebrow">Frequently asked questions</p>
        <h2 class="wu-title" id="docs-faq-title">Plan a little. Enjoy a lot.</h2>
        <a class="d-none d-sm-inline-flex wu-text-link wu-faq-all" href="../../public/faq.html">
          View all FAQs
          <span aria-hidden="true">→</span>
        </a>
      </div>

      <div class="wu-faq-list">
        <details open>
          <summary>When should we share our album link?</summary>
          <div class="wu-faq-answer">
            Add it to your invitation or welcome message so guests have it ready before the
            celebration.
          </div>
        </details>

        <details>
          <summary>Can we add a reminder to the invitation?</summary>
          <div class="wu-faq-answer">
            Yes. Keep the message short and place the album link beside your event details.
          </div>
        </details>

        <details>
          <summary>What should we tell our guests?</summary>
          <div class="wu-faq-answer">
            Ask them to share the moments they love. A friendly sentence is usually enough.
          </div>
        </details>
      </div>
      <div class="d-block d-sm-none text-center mt-2">
        <a class="wu-text-link text-neutral-900" href="../../public/faq.html">
          View all FAQs
          <span aria-hidden="true">→</span>
        </a>
      </div>
    </div>
  </div>
</section>
CSS reference & dependencies

.wu-section.wu-container.wu-faq-layout.wu-faq-intro.wu-eyebrow.wu-title.wu-text-link.wu-faq-all.wu-faq-list.wu-faq-answer

Stylesheets · in this order

  • https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css
  • public/assets/css/components.css
  • public/assets/css/public.css
  • public/assets/css/homepage.css
  • public/assets/css/site-shell.css
  • public/assets/css/responsive.css
  • assets/css/wu-icons.css

Scripts · once, in this order

  • No component JavaScript required.

The reference lists use project-root paths. The copyable dependency block and HTML below use paths relative to documentation/starters/, so they work in the delivered starter files. Load each dependency once; keep scripts after content. When moving your starter to public/ or application/, adjust those paths together. Keep its shell controller; a content-only preview does not need to reload it.

Dependencies
<link
  href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css"
  rel="stylesheet"
/>
<link href="../../public/assets/css/components.css" rel="stylesheet" />
<link href="../../public/assets/css/public.css" rel="stylesheet" />
<link href="../../public/assets/css/homepage.css" rel="stylesheet" />
<link href="../../public/assets/css/site-shell.css" rel="stylesheet" />
<link href="../../public/assets/css/responsive.css" rel="stylesheet" />
<link href="../../assets/css/wu-icons.css" rel="stylesheet" />

Documentation sample composition using existing source classes. Sample text, record IDs and demo-only hooks are local to this example.

Application · Form layout variations

Insert these cards inside main.wu-page, after its page header. They use shared form/card classes and Bootstrap layout utilities; the original Application shell stays around them.

Application · Single-column form

Source arrangement: application/album.html · application/contact.html · .wu-card > .wu-card-body > form; .form-control.wu-input; .form-control.wu-textarea

Live preview
Open preview ↗
  • Paste this section inside the Application starter’s main.wu-page, after the page header. Keep body class="wu-application" and a new data-page value; these shared card/form classes do not need a page-specific body class.
  • The starter already loads the shared components, wu-form-controls.css and Application shell/feature CSS. Bootstrap grid and spacing utilities arrange the existing controls; no new form CSS is added.
  • Load the documentation-only layout-examples.js once to preview submit/reset feedback. Native required/email validation remains active. Replace the demo handler with your feature integration for production; no API, storage or success state is simulated.
HTML example Ready for the supplied page starter
HTML
<!-- Paste inside Application starter main.wu-page (inside the existing shell). Asset paths below target documentation/starters/. -->
<section class="wu-card" aria-labelledby="docs-single-heading">
  <div class="wu-card-head"><h2 id="docs-single-heading">Event information</h2></div>
  <div class="wu-card-body">
    <form class="d-grid gap-3" data-layout-form>
      <div class="d-grid gap-2">
        <label class="form-label wu-label mb-0" for="docs-single-title">Event title</label>
        <input
          class="form-control wu-input"
          id="docs-single-title"
          name="title"
          type="text"
          value="Alex &amp; Jordan Celebration"
          required
        />
      </div>
      <div class="d-grid gap-2">
        <label class="form-label wu-label mb-0" for="docs-single-email">Contact email</label>
        <input
          class="form-control wu-input"
          id="docs-single-email"
          name="email"
          type="email"
          value="alex@example.com"
          required
        />
      </div>
      <div class="d-grid gap-2">
        <label class="form-label wu-label mb-0" for="docs-single-note">Welcome note</label>
        <textarea class="form-control wu-textarea" id="docs-single-note" name="note" rows="3">We are so happy to celebrate with you. Share your favourite moments here.</textarea
        >
      </div>
      <p class="wu-help mb-0" data-layout-status role="status" aria-live="polite">
        Demo only — fields are editable; no information will be saved or sent.
      </p>
      <div class="d-flex flex-wrap gap-2">
        <button class="wu-button wu-button-md wu-button--primary" type="submit">
          Preview save
        </button>
        <button class="wu-button wu-button-md wu-button--outline" type="reset">
          Reset example
        </button>
      </div>
    </form>
  </div>
</section>
CSS reference & dependencies

.wu-card.wu-card-head.wu-card-body.wu-label.wu-input.wu-textarea.wu-help.wu-button.wu-button-md.wu-button--primary.wu-button--outline

Stylesheets · in this order

  • https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css
  • assets/css/wu-icons.css
  • assets/css/wu-components.css
  • assets/css/wu-form-controls.css
  • application/assets/css/application-shell.css
  • application/assets/css/application-features.css

Scripts · once, in this order

  • documentation/assets/js/layout-examples.js

The reference lists use project-root paths. The copyable dependency block and HTML below use paths relative to documentation/starters/, so they work in the delivered starter files. Load each dependency once; keep scripts after content. When moving your starter to public/ or application/, adjust those paths together. Keep its shell controller; a content-only preview does not need to reload it.

Dependencies
<link
  href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css"
  rel="stylesheet"
/>
<link href="../../assets/css/wu-icons.css" rel="stylesheet" />
<link href="../../assets/css/wu-components.css" rel="stylesheet" />
<link href="../../assets/css/wu-form-controls.css" rel="stylesheet" />
<link href="../../application/assets/css/application-shell.css" rel="stylesheet" />
<link href="../../application/assets/css/application-features.css" rel="stylesheet" />
<script src="../assets/js/layout-examples.js"></script>

Documentation sample composition using existing source classes. Sample text, record IDs and demo-only hooks are local to this example.

Application · Two-column responsive form

Source arrangement: application/contact.html · application/premium.html · .wu-card; .row.g-3 > .col-12.col-md-6; .form-select.wu-select

Live preview
Open preview ↗
  • Paste this section inside the Application starter’s main.wu-page, after the page header. Keep body class="wu-application" and a new data-page value; these shared card/form classes do not need a page-specific body class.
  • The starter already loads the shared components, wu-form-controls.css and Application shell/feature CSS. Bootstrap grid and spacing utilities arrange the existing controls; no new form CSS is added.
  • Load the documentation-only layout-examples.js once to preview submit/reset feedback. Native required/email validation remains active. Replace the demo handler with your feature integration for production; no API, storage or success state is simulated.
  • Fields use two columns at Bootstrap md (768px) and above, and one column below it. The full-width message and actions remain outside the two-column row.
HTML example Ready for the supplied page starter
HTML
<!-- Paste inside Application starter main.wu-page (inside the existing shell). Asset paths below target documentation/starters/. -->
<section class="wu-card" aria-labelledby="docs-two-heading">
  <div class="wu-card-head"><h2 id="docs-two-heading">Contact & event details</h2></div>
  <div class="wu-card-body">
    <form class="d-grid gap-3" data-layout-form>
      <div class="row g-3">
        <div class="col-12 col-md-6">
          <div class="d-grid gap-2">
            <label class="form-label wu-label mb-0" for="docs-two-firstName">First name</label>
            <input
              class="form-control wu-input"
              id="docs-two-firstName"
              name="firstName"
              type="text"
              value="Alex"
              required
            />
          </div>
        </div>
        <div class="col-12 col-md-6">
          <div class="d-grid gap-2">
            <label class="form-label wu-label mb-0" for="docs-two-lastName">Last name</label>
            <input
              class="form-control wu-input"
              id="docs-two-lastName"
              name="lastName"
              type="text"
              value="Morgan"
              required
            />
          </div>
        </div>
        <div class="col-12 col-md-6">
          <div class="d-grid gap-2">
            <label class="form-label wu-label mb-0" for="docs-two-email">Email address</label>
            <input
              class="form-control wu-input"
              id="docs-two-email"
              name="email"
              type="email"
              value="alex@example.com"
              required
            />
          </div>
        </div>
        <div class="col-12 col-md-6">
          <div class="d-grid gap-2">
            <label class="form-label wu-label mb-0" for="docs-two-eventType">Event type</label>
            <select class="form-select wu-select" id="docs-two-eventType" name="eventType">
              <option value="wedding">Wedding</option>
              <option value="anniversary">Anniversary</option>
              <option value="celebration">Celebration</option>
            </select>
          </div>
        </div>
      </div>
      <div class="d-grid gap-2">
        <label class="form-label wu-label mb-0" for="docs-two-message">Message for guests</label>
        <textarea class="form-control wu-textarea" id="docs-two-message" name="message" rows="3">Bring your smiles. We will take care of the memories.</textarea
        >
      </div>
      <p class="wu-help mb-0" data-layout-status role="status" aria-live="polite">
        Demo only — fields are editable; no information will be saved or sent.
      </p>
      <div class="d-flex flex-wrap gap-2">
        <button class="wu-button wu-button-md wu-button--primary" type="submit">
          Preview save
        </button>
        <button class="wu-button wu-button-md wu-button--outline" type="reset">
          Reset example
        </button>
      </div>
    </form>
  </div>
</section>
CSS reference & dependencies

.wu-card.wu-card-head.wu-card-body.wu-label.wu-input.wu-select.wu-textarea.wu-help.wu-button.wu-button-md.wu-button--primary.wu-button--outline

Stylesheets · in this order

  • https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css
  • assets/css/wu-icons.css
  • assets/css/wu-components.css
  • assets/css/wu-form-controls.css
  • application/assets/css/application-shell.css
  • application/assets/css/application-features.css

Scripts · once, in this order

  • documentation/assets/js/layout-examples.js

The reference lists use project-root paths. The copyable dependency block and HTML below use paths relative to documentation/starters/, so they work in the delivered starter files. Load each dependency once; keep scripts after content. When moving your starter to public/ or application/, adjust those paths together. Keep its shell controller; a content-only preview does not need to reload it.

Dependencies
<link
  href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css"
  rel="stylesheet"
/>
<link href="../../assets/css/wu-icons.css" rel="stylesheet" />
<link href="../../assets/css/wu-components.css" rel="stylesheet" />
<link href="../../assets/css/wu-form-controls.css" rel="stylesheet" />
<link href="../../application/assets/css/application-shell.css" rel="stylesheet" />
<link href="../../application/assets/css/application-features.css" rel="stylesheet" />
<script src="../assets/js/layout-examples.js"></script>

Documentation sample composition using existing source classes. Sample text, record IDs and demo-only hooks are local to this example.

Application · Grouped form & actions

Source arrangement: application/album.html · .wu-card; fieldset; .row.g-3; .form-check; .form-switch.wu-form-switch

Live preview
Open preview ↗
  • Paste this section inside the Application starter’s main.wu-page, after the page header. Keep body class="wu-application" and a new data-page value; these shared card/form classes do not need a page-specific body class.
  • The starter already loads the shared components, wu-form-controls.css and Application shell/feature CSS. Bootstrap grid and spacing utilities arrange the existing controls; no new form CSS is added.
  • Load the documentation-only layout-examples.js once to preview submit/reset feedback. Native required/email validation remains active. Replace the demo handler with your feature integration for production; no API, storage or success state is simulated.
  • Fieldsets group related fields. Keep radio names equal within one group and IDs unique. The source switch remains a native checkbox with role="switch".
HTML example Ready for the supplied page starter
HTML
<!-- Paste inside Application starter main.wu-page (inside the existing shell). Asset paths below target documentation/starters/. -->
<section class="wu-card" aria-labelledby="docs-group-heading">
  <div class="wu-card-head"><h2 id="docs-group-heading">Event & guest preferences</h2></div>
  <div class="wu-card-body">
    <form class="d-grid gap-3" data-layout-form>
      <fieldset class="border-0 p-0 m-0">
        <legend class="h6 fw-bold text-bronze-600 mb-3">Event details</legend>
        <div class="row g-3">
          <div class="col-12 col-lg-6">
            <div class="d-grid gap-2">
              <label class="form-label wu-label mb-0" for="docs-group-title">Event title</label>
              <input
                class="form-control wu-input"
                id="docs-group-title"
                name="title"
                type="text"
                value="Alex &amp; Jordan Celebration"
                required
              />
            </div>
          </div>
          <div class="col-12 col-lg-6">
            <div class="d-grid gap-2">
              <label class="form-label wu-label mb-0" for="docs-group-date">Event date</label>
              <input
                class="form-control wu-input"
                id="docs-group-date"
                name="date"
                type="date"
                value="2027-06-12"
                required
              />
            </div>
          </div>
        </div>
      </fieldset>
      <fieldset class="border-0 p-0 m-0">
        <legend class="h6 fw-bold text-bronze-600 mb-3">Guest preferences</legend>
        <div class="form-check form-switch wu-form-switch mb-3">
          <input
            class="form-check-input"
            type="checkbox"
            role="switch"
            name="public"
            id="docs-group-public"
            checked
          />
          <label class="form-check-label" for="docs-group-public">
            Show uploaded photos to guests
          </label>
        </div>
        <div class="form-check mb-3">
          <input
            class="form-check-input"
            type="checkbox"
            name="guestbook"
            id="docs-group-guestbook"
            checked
          />
          <label class="form-check-label" for="docs-group-guestbook">
            Invite guests to leave a message
          </label>
        </div>
        <p class="wu-label mb-2" id="docs-group-reminder-label">Reminder preference</p>
        <div
          role="radiogroup"
          aria-labelledby="docs-group-reminder-label"
          class="d-flex flex-wrap gap-3"
        >
          <div class="form-check">
            <input
              class="form-check-input"
              type="radio"
              name="docs-group-reminder"
              value="email"
              id="docs-group-email"
              checked
            />
            <label class="form-check-label" for="docs-group-email">Email reminder</label>
          </div>
          <div class="form-check">
            <input
              class="form-check-input"
              type="radio"
              name="docs-group-reminder"
              value="none"
              id="docs-group-none"
            />
            <label class="form-check-label" for="docs-group-none">No reminder</label>
          </div>
        </div>
      </fieldset>
      <p class="wu-help mb-0" data-layout-status role="status" aria-live="polite">
        Demo only — fields are editable; no information will be saved or sent.
      </p>
      <div class="d-flex flex-wrap gap-2">
        <button class="wu-button wu-button-md wu-button--primary" type="submit">
          Preview save
        </button>
        <button class="wu-button wu-button-md wu-button--outline" type="reset">
          Reset example
        </button>
      </div>
    </form>
  </div>
</section>
CSS reference & dependencies

.wu-card.wu-card-head.wu-card-body.wu-label.wu-input.wu-form-switch.wu-help.wu-button.wu-button-md.wu-button--primary.wu-button--outline

Stylesheets · in this order

  • https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css
  • assets/css/wu-icons.css
  • assets/css/wu-components.css
  • assets/css/wu-form-controls.css
  • application/assets/css/application-shell.css
  • application/assets/css/application-features.css

Scripts · once, in this order

  • documentation/assets/js/layout-examples.js

The reference lists use project-root paths. The copyable dependency block and HTML below use paths relative to documentation/starters/, so they work in the delivered starter files. Load each dependency once; keep scripts after content. When moving your starter to public/ or application/, adjust those paths together. Keep its shell controller; a content-only preview does not need to reload it.

Dependencies
<link
  href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css"
  rel="stylesheet"
/>
<link href="../../assets/css/wu-icons.css" rel="stylesheet" />
<link href="../../assets/css/wu-components.css" rel="stylesheet" />
<link href="../../assets/css/wu-form-controls.css" rel="stylesheet" />
<link href="../../application/assets/css/application-shell.css" rel="stylesheet" />
<link href="../../application/assets/css/application-features.css" rel="stylesheet" />
<script src="../assets/js/layout-examples.js"></script>

Documentation sample composition using existing source classes. Sample text, record IDs and demo-only hooks are local to this example.

Application · Records & repeated content

These two layouts need different source body scopes. The notes show which class and CSS belong to each; they are intentionally previewed separately.

Application · Data table with actions

Source arrangement: application/dashboard.html · .wu-card > .wu-toolbar + .wu-table-wrap; .wu-table; .wu-mobile-albums; .wu-pagination

Live preview
Open preview ↗
  • Paste inside the Application starter main.wu-page. Add wu-page-dashboard to the body class for these existing responsive table rules, while keeping data-page="new-page". Keep the starter shell and dependencies.
  • Desktop/tablet uses the source table with horizontal overflow from 768px; the source CSS hides Visibility below its breakpoint. Below 768px the paired .wu-mobile-albums list replaces the table. Keep both representations in sync; flex-column is a Bootstrap utility that stacks repeated mobile items.
  • Search, visibility filter, two-page pagination and no-results feedback operate only on these six static sample records. Each table/mobile pair shares its data-layout-record key.
  • Actions use the existing Bootstrap dropdown/modal patterns and only describe the requested demo action. Include the related dialog. Business IDs such as albumRows and product data-album-index hooks are intentionally absent so application.js cannot overwrite the example.
  • Load layout-examples.js once after Bootstrap. These data-layout-* hooks are documentation-only; replace them with your feature controller when connecting real records. No changes are persisted.
  • Place the related dialog blocks after .wu-app, before </body>, as in the Application starter. Keep each dialog ID unique when composing examples.
HTML example Ready for the supplied page starter
HTML
<!-- Paste inside Application starter main.wu-page (inside the existing shell). Asset paths below target documentation/starters/. -->
<section class="wu-card" data-layout-table aria-labelledby="docs-table-title">
  <div class="wu-card-head">
    <h2 id="docs-table-title">Event albums</h2>
    <span class="wu-count-badge" data-layout-total>6 sample albums</span>
  </div>
  <div class="wu-toolbar">
    <div class="wu-toolbar-left">
      <select
        class="form-select wu-select w-50"
        data-layout-filter
        aria-label="Filter sample albums by visibility"
      >
        <option value="all">All visibility</option>
        <option value="public">Public</option>
        <option value="private">Private</option>
      </select>
      <div class="wu-search w-100">
        <i class="wu-icon wu-icon--search-gold wu-icon--sm" aria-hidden="true"></i>
        <input
          class="form-control wu-input"
          type="search"
          placeholder="Search sample albums"
          aria-label="Search sample albums"
          data-layout-search
        />
      </div>
    </div>
  </div>
  <div class="wu-card-body pt-0 pb-0">
    <p class="wu-help" data-layout-status role="status" aria-live="polite">
      Sample records only. View, Edit and Delete open a demo dialog; they never update these
      records.
    </p>
  </div>
  <div class="wu-table-wrap">
    <table class="wu-table">
      <thead>
        <tr>
          <th scope="col">Album</th>
          <th scope="col">QR Code</th>
          <th scope="col">Guest Features</th>
          <th scope="col">Visibility</th>
          <th scope="col">Action</th>
        </tr>
      </thead>
      <tbody>
        <tr
          data-layout-record="alex-jordan"
          data-layout-search-text="Alex &amp; Jordan alex-jordan"
          data-layout-state="public"
        >
          <td>
            <div class="wu-album-cell">
              <div class="wu-thumb">
                <img
                  src="../../public/assets/images/memory-04.webp"
                  alt=""
                  width="64"
                  height="64"
                  loading="lazy"
                  decoding="async"
                />
              </div>
              <div>
                <div class="wu-album-name">Alex &amp; Jordan</div>
                <div class="wu-album-folder">Drive Folder: alex-jordan</div>
                <div class="wu-album-date">12 Jun 2027</div>
              </div>
            </div>
          </td>
          <td>
            <button
              class="wu-album-qr"
              type="button"
              data-bs-toggle="modal"
              data-bs-target="#docs-table-action"
              data-layout-action="View QR"
              data-layout-label="Alex &amp; Jordan"
              aria-label="Preview QR action for Alex &amp; Jordan"
            >
              <img src="../../application/assets/images/qr.svg" alt="" width="64" height="64" />
              <span class="mt-2">View QR</span>
            </button>
          </td>
          <td>
            <div class="d-flex flex-wrap gap-2">
              <span class="badge wu-badge">Guestbook</span>
              <span class="badge wu-badge">Voicemail</span>
            </div>
          </td>
          <td><span class="badge wu-badge wu-badge--primary-fill">Public</span></td>
          <td>
            <div class="wu-row-actions">
              <div class="wu-action-menu dropdown">
                <button
                  class="wu-button wu-button--outline wu-button-sm"
                  type="button"
                  data-bs-toggle="dropdown"
                  aria-expanded="false"
                  data-bs-config='{"popperConfig":{"strategy":"fixed"}}'
                >
                  Actions
                  <i class="wu-icon wu-icon--chevron-down wu-icon--xs" aria-hidden="true"></i>
                  <span class="visually-hidden">for Alex &amp; Jordan</span>
                </button>
                <ul class="dropdown-menu dropdown-menu-end">
                  <li>
                    <button
                      type="button"
                      class="dropdown-item"
                      data-bs-toggle="modal"
                      data-bs-target="#docs-table-action"
                      data-layout-action="View"
                      data-layout-label="Alex &amp; Jordan"
                    >
                      View
                    </button>
                  </li>
                  <li>
                    <button
                      type="button"
                      class="dropdown-item"
                      data-bs-toggle="modal"
                      data-bs-target="#docs-table-action"
                      data-layout-action="Edit"
                      data-layout-label="Alex &amp; Jordan"
                    >
                      Edit
                    </button>
                  </li>
                  <li>
                    <button
                      type="button"
                      class="dropdown-item text-danger-500"
                      data-bs-toggle="modal"
                      data-bs-target="#docs-table-action"
                      data-layout-action="Delete"
                      data-layout-label="Alex &amp; Jordan"
                    >
                      Delete
                    </button>
                  </li>
                </ul>
              </div>
            </div>
          </td>
        </tr>
        <tr
          data-layout-record="maya-sam"
          data-layout-search-text="Maya &amp; Sam maya-sam"
          data-layout-state="private"
        >
          <td>
            <div class="wu-album-cell">
              <div class="wu-thumb">
                <img
                  src="../../public/assets/images/memory-10.webp"
                  alt=""
                  width="64"
                  height="64"
                  loading="lazy"
                  decoding="async"
                />
              </div>
              <div>
                <div class="wu-album-name">Maya &amp; Sam</div>
                <div class="wu-album-folder">Drive Folder: maya-sam</div>
                <div class="wu-album-date">19 Jun 2027</div>
              </div>
            </div>
          </td>
          <td>
            <button
              class="wu-album-qr"
              type="button"
              data-bs-toggle="modal"
              data-bs-target="#docs-table-action"
              data-layout-action="View QR"
              data-layout-label="Maya &amp; Sam"
              aria-label="Preview QR action for Maya &amp; Sam"
            >
              <img src="../../application/assets/images/qr.svg" alt="" width="64" height="64" />
              <span class="mt-2">View QR</span>
            </button>
          </td>
          <td>
            <div class="d-flex flex-wrap gap-2">
              <span class="badge wu-badge">Guestbook</span>
              <span class="badge wu-badge">Voicemail</span>
            </div>
          </td>
          <td><span class="badge wu-badge">Private</span></td>
          <td>
            <div class="wu-row-actions">
              <div class="wu-action-menu dropdown">
                <button
                  class="wu-button wu-button--outline wu-button-sm"
                  type="button"
                  data-bs-toggle="dropdown"
                  aria-expanded="false"
                  data-bs-config='{"popperConfig":{"strategy":"fixed"}}'
                >
                  Actions
                  <i class="wu-icon wu-icon--chevron-down wu-icon--xs" aria-hidden="true"></i>
                  <span class="visually-hidden">for Maya &amp; Sam</span>
                </button>
                <ul class="dropdown-menu dropdown-menu-end">
                  <li>
                    <button
                      type="button"
                      class="dropdown-item"
                      data-bs-toggle="modal"
                      data-bs-target="#docs-table-action"
                      data-layout-action="View"
                      data-layout-label="Maya &amp; Sam"
                    >
                      View
                    </button>
                  </li>
                  <li>
                    <button
                      type="button"
                      class="dropdown-item"
                      data-bs-toggle="modal"
                      data-bs-target="#docs-table-action"
                      data-layout-action="Edit"
                      data-layout-label="Maya &amp; Sam"
                    >
                      Edit
                    </button>
                  </li>
                  <li>
                    <button
                      type="button"
                      class="dropdown-item text-danger-500"
                      data-bs-toggle="modal"
                      data-bs-target="#docs-table-action"
                      data-layout-action="Delete"
                      data-layout-label="Maya &amp; Sam"
                    >
                      Delete
                    </button>
                  </li>
                </ul>
              </div>
            </div>
          </td>
        </tr>
        <tr
          data-layout-record="nora-jamie"
          data-layout-search-text="Nora &amp; Jamie nora-jamie"
          data-layout-state="public"
        >
          <td>
            <div class="wu-album-cell">
              <div class="wu-thumb">
                <img
                  src="../../public/assets/images/memory-08.webp"
                  alt=""
                  width="64"
                  height="64"
                  loading="lazy"
                  decoding="async"
                />
              </div>
              <div>
                <div class="wu-album-name">Nora &amp; Jamie</div>
                <div class="wu-album-folder">Drive Folder: nora-jamie</div>
                <div class="wu-album-date">26 Jun 2027</div>
              </div>
            </div>
          </td>
          <td>
            <button
              class="wu-album-qr"
              type="button"
              data-bs-toggle="modal"
              data-bs-target="#docs-table-action"
              data-layout-action="View QR"
              data-layout-label="Nora &amp; Jamie"
              aria-label="Preview QR action for Nora &amp; Jamie"
            >
              <img src="../../application/assets/images/qr.svg" alt="" width="64" height="64" />
              <span class="mt-2">View QR</span>
            </button>
          </td>
          <td>
            <div class="d-flex flex-wrap gap-2">
              <span class="badge wu-badge">Guestbook</span>
              <span class="badge wu-badge">Voicemail</span>
            </div>
          </td>
          <td><span class="badge wu-badge wu-badge--primary-fill">Public</span></td>
          <td>
            <div class="wu-row-actions">
              <div class="wu-action-menu dropdown">
                <button
                  class="wu-button wu-button--outline wu-button-sm"
                  type="button"
                  data-bs-toggle="dropdown"
                  aria-expanded="false"
                  data-bs-config='{"popperConfig":{"strategy":"fixed"}}'
                >
                  Actions
                  <i class="wu-icon wu-icon--chevron-down wu-icon--xs" aria-hidden="true"></i>
                  <span class="visually-hidden">for Nora &amp; Jamie</span>
                </button>
                <ul class="dropdown-menu dropdown-menu-end">
                  <li>
                    <button
                      type="button"
                      class="dropdown-item"
                      data-bs-toggle="modal"
                      data-bs-target="#docs-table-action"
                      data-layout-action="View"
                      data-layout-label="Nora &amp; Jamie"
                    >
                      View
                    </button>
                  </li>
                  <li>
                    <button
                      type="button"
                      class="dropdown-item"
                      data-bs-toggle="modal"
                      data-bs-target="#docs-table-action"
                      data-layout-action="Edit"
                      data-layout-label="Nora &amp; Jamie"
                    >
                      Edit
                    </button>
                  </li>
                  <li>
                    <button
                      type="button"
                      class="dropdown-item text-danger-500"
                      data-bs-toggle="modal"
                      data-bs-target="#docs-table-action"
                      data-layout-action="Delete"
                      data-layout-label="Nora &amp; Jamie"
                    >
                      Delete
                    </button>
                  </li>
                </ul>
              </div>
            </div>
          </td>
        </tr>
        <tr
          data-layout-record="riley-casey"
          data-layout-search-text="Riley &amp; Casey riley-casey"
          data-layout-state="private"
          hidden
          class="d-none"
        >
          <td>
            <div class="wu-album-cell">
              <div class="wu-thumb">
                <img
                  src="../../public/assets/images/memory-02.webp"
                  alt=""
                  width="64"
                  height="64"
                  loading="lazy"
                  decoding="async"
                />
              </div>
              <div>
                <div class="wu-album-name">Riley &amp; Casey</div>
                <div class="wu-album-folder">Drive Folder: riley-casey</div>
                <div class="wu-album-date">03 Jul 2027</div>
              </div>
            </div>
          </td>
          <td>
            <button
              class="wu-album-qr"
              type="button"
              data-bs-toggle="modal"
              data-bs-target="#docs-table-action"
              data-layout-action="View QR"
              data-layout-label="Riley &amp; Casey"
              aria-label="Preview QR action for Riley &amp; Casey"
            >
              <img src="../../application/assets/images/qr.svg" alt="" width="64" height="64" />
              <span class="mt-2">View QR</span>
            </button>
          </td>
          <td>
            <div class="d-flex flex-wrap gap-2">
              <span class="badge wu-badge">Guestbook</span>
              <span class="badge wu-badge">Voicemail</span>
            </div>
          </td>
          <td><span class="badge wu-badge">Private</span></td>
          <td>
            <div class="wu-row-actions">
              <div class="wu-action-menu dropdown">
                <button
                  class="wu-button wu-button--outline wu-button-sm"
                  type="button"
                  data-bs-toggle="dropdown"
                  aria-expanded="false"
                  data-bs-config='{"popperConfig":{"strategy":"fixed"}}'
                >
                  Actions
                  <i class="wu-icon wu-icon--chevron-down wu-icon--xs" aria-hidden="true"></i>
                  <span class="visually-hidden">for Riley &amp; Casey</span>
                </button>
                <ul class="dropdown-menu dropdown-menu-end">
                  <li>
                    <button
                      type="button"
                      class="dropdown-item"
                      data-bs-toggle="modal"
                      data-bs-target="#docs-table-action"
                      data-layout-action="View"
                      data-layout-label="Riley &amp; Casey"
                    >
                      View
                    </button>
                  </li>
                  <li>
                    <button
                      type="button"
                      class="dropdown-item"
                      data-bs-toggle="modal"
                      data-bs-target="#docs-table-action"
                      data-layout-action="Edit"
                      data-layout-label="Riley &amp; Casey"
                    >
                      Edit
                    </button>
                  </li>
                  <li>
                    <button
                      type="button"
                      class="dropdown-item text-danger-500"
                      data-bs-toggle="modal"
                      data-bs-target="#docs-table-action"
                      data-layout-action="Delete"
                      data-layout-label="Riley &amp; Casey"
                    >
                      Delete
                    </button>
                  </li>
                </ul>
              </div>
            </div>
          </td>
        </tr>
        <tr
          data-layout-record="ellis-robin"
          data-layout-search-text="Ellis &amp; Robin ellis-robin"
          data-layout-state="public"
          hidden
          class="d-none"
        >
          <td>
            <div class="wu-album-cell">
              <div class="wu-thumb">
                <img
                  src="../../public/assets/images/memory-05.webp"
                  alt=""
                  width="64"
                  height="64"
                  loading="lazy"
                  decoding="async"
                />
              </div>
              <div>
                <div class="wu-album-name">Ellis &amp; Robin</div>
                <div class="wu-album-folder">Drive Folder: ellis-robin</div>
                <div class="wu-album-date">10 Jul 2027</div>
              </div>
            </div>
          </td>
          <td>
            <button
              class="wu-album-qr"
              type="button"
              data-bs-toggle="modal"
              data-bs-target="#docs-table-action"
              data-layout-action="View QR"
              data-layout-label="Ellis &amp; Robin"
              aria-label="Preview QR action for Ellis &amp; Robin"
            >
              <img src="../../application/assets/images/qr.svg" alt="" width="64" height="64" />
              <span class="mt-2">View QR</span>
            </button>
          </td>
          <td>
            <div class="d-flex flex-wrap gap-2">
              <span class="badge wu-badge">Guestbook</span>
              <span class="badge wu-badge">Voicemail</span>
            </div>
          </td>
          <td><span class="badge wu-badge wu-badge--primary-fill">Public</span></td>
          <td>
            <div class="wu-row-actions">
              <div class="wu-action-menu dropdown">
                <button
                  class="wu-button wu-button--outline wu-button-sm"
                  type="button"
                  data-bs-toggle="dropdown"
                  aria-expanded="false"
                  data-bs-config='{"popperConfig":{"strategy":"fixed"}}'
                >
                  Actions
                  <i class="wu-icon wu-icon--chevron-down wu-icon--xs" aria-hidden="true"></i>
                  <span class="visually-hidden">for Ellis &amp; Robin</span>
                </button>
                <ul class="dropdown-menu dropdown-menu-end">
                  <li>
                    <button
                      type="button"
                      class="dropdown-item"
                      data-bs-toggle="modal"
                      data-bs-target="#docs-table-action"
                      data-layout-action="View"
                      data-layout-label="Ellis &amp; Robin"
                    >
                      View
                    </button>
                  </li>
                  <li>
                    <button
                      type="button"
                      class="dropdown-item"
                      data-bs-toggle="modal"
                      data-bs-target="#docs-table-action"
                      data-layout-action="Edit"
                      data-layout-label="Ellis &amp; Robin"
                    >
                      Edit
                    </button>
                  </li>
                  <li>
                    <button
                      type="button"
                      class="dropdown-item text-danger-500"
                      data-bs-toggle="modal"
                      data-bs-target="#docs-table-action"
                      data-layout-action="Delete"
                      data-layout-label="Ellis &amp; Robin"
                    >
                      Delete
                    </button>
                  </li>
                </ul>
              </div>
            </div>
          </td>
        </tr>
        <tr
          data-layout-record="lena-drew"
          data-layout-search-text="Lena &amp; Drew lena-drew"
          data-layout-state="public"
          hidden
          class="d-none"
        >
          <td>
            <div class="wu-album-cell">
              <div class="wu-thumb">
                <img
                  src="../../public/assets/images/memory-03.webp"
                  alt=""
                  width="64"
                  height="64"
                  loading="lazy"
                  decoding="async"
                />
              </div>
              <div>
                <div class="wu-album-name">Lena &amp; Drew</div>
                <div class="wu-album-folder">Drive Folder: lena-drew</div>
                <div class="wu-album-date">17 Jul 2027</div>
              </div>
            </div>
          </td>
          <td>
            <button
              class="wu-album-qr"
              type="button"
              data-bs-toggle="modal"
              data-bs-target="#docs-table-action"
              data-layout-action="View QR"
              data-layout-label="Lena &amp; Drew"
              aria-label="Preview QR action for Lena &amp; Drew"
            >
              <img src="../../application/assets/images/qr.svg" alt="" width="64" height="64" />
              <span class="mt-2">View QR</span>
            </button>
          </td>
          <td>
            <div class="d-flex flex-wrap gap-2">
              <span class="badge wu-badge">Guestbook</span>
              <span class="badge wu-badge">Voicemail</span>
            </div>
          </td>
          <td><span class="badge wu-badge wu-badge--primary-fill">Public</span></td>
          <td>
            <div class="wu-row-actions">
              <div class="wu-action-menu dropdown">
                <button
                  class="wu-button wu-button--outline wu-button-sm"
                  type="button"
                  data-bs-toggle="dropdown"
                  aria-expanded="false"
                  data-bs-config='{"popperConfig":{"strategy":"fixed"}}'
                >
                  Actions
                  <i class="wu-icon wu-icon--chevron-down wu-icon--xs" aria-hidden="true"></i>
                  <span class="visually-hidden">for Lena &amp; Drew</span>
                </button>
                <ul class="dropdown-menu dropdown-menu-end">
                  <li>
                    <button
                      type="button"
                      class="dropdown-item"
                      data-bs-toggle="modal"
                      data-bs-target="#docs-table-action"
                      data-layout-action="View"
                      data-layout-label="Lena &amp; Drew"
                    >
                      View
                    </button>
                  </li>
                  <li>
                    <button
                      type="button"
                      class="dropdown-item"
                      data-bs-toggle="modal"
                      data-bs-target="#docs-table-action"
                      data-layout-action="Edit"
                      data-layout-label="Lena &amp; Drew"
                    >
                      Edit
                    </button>
                  </li>
                  <li>
                    <button
                      type="button"
                      class="dropdown-item text-danger-500"
                      data-bs-toggle="modal"
                      data-bs-target="#docs-table-action"
                      data-layout-action="Delete"
                      data-layout-label="Lena &amp; Drew"
                    >
                      Delete
                    </button>
                  </li>
                </ul>
              </div>
            </div>
          </td>
        </tr>
      </tbody>
    </table>
  </div>
  <div class="wu-mobile-albums flex-column">
    <article
      data-layout-record="alex-jordan"
      data-layout-search-text="Alex &amp; Jordan alex-jordan"
      data-layout-state="public"
      class="wu-mobile-album"
    >
      <div class="wu-mobile-album-top">
        <div class="wu-album-cell">
          <div class="wu-thumb">
            <img
              src="../../public/assets/images/memory-04.webp"
              alt=""
              width="64"
              height="64"
              loading="lazy"
              decoding="async"
            />
          </div>
          <div>
            <div class="wu-album-name">Alex &amp; Jordan</div>
            <div class="wu-album-folder">Drive Folder: alex-jordan</div>
            <div class="wu-album-date">12 Jun 2027</div>
          </div>
        </div>
      </div>
      <div class="wu-mobile-album-meta">
        <span class="badge wu-badge wu-badge--primary-fill">Public</span>
        <span>Guestbook · Voicemail</span>
      </div>
      <div class="wu-mobile-album-actions">
        <div class="wu-action-menu dropdown">
          <button
            class="wu-button wu-button--outline wu-button-sm"
            type="button"
            data-bs-toggle="dropdown"
            aria-expanded="false"
            data-bs-config='{"popperConfig":{"strategy":"fixed"}}'
          >
            Actions
            <i class="wu-icon wu-icon--chevron-down wu-icon--xs" aria-hidden="true"></i>
            <span class="visually-hidden">for Alex &amp; Jordan</span>
          </button>
          <ul class="dropdown-menu dropdown-menu-end">
            <li>
              <button
                type="button"
                class="dropdown-item"
                data-bs-toggle="modal"
                data-bs-target="#docs-table-action"
                data-layout-action="View"
                data-layout-label="Alex &amp; Jordan"
              >
                View
              </button>
            </li>
            <li>
              <button
                type="button"
                class="dropdown-item"
                data-bs-toggle="modal"
                data-bs-target="#docs-table-action"
                data-layout-action="Edit"
                data-layout-label="Alex &amp; Jordan"
              >
                Edit
              </button>
            </li>
            <li>
              <button
                type="button"
                class="dropdown-item text-danger-500"
                data-bs-toggle="modal"
                data-bs-target="#docs-table-action"
                data-layout-action="Delete"
                data-layout-label="Alex &amp; Jordan"
              >
                Delete
              </button>
            </li>
          </ul>
        </div>
      </div>
    </article>
    <article
      data-layout-record="maya-sam"
      data-layout-search-text="Maya &amp; Sam maya-sam"
      data-layout-state="private"
      class="wu-mobile-album"
    >
      <div class="wu-mobile-album-top">
        <div class="wu-album-cell">
          <div class="wu-thumb">
            <img
              src="../../public/assets/images/memory-10.webp"
              alt=""
              width="64"
              height="64"
              loading="lazy"
              decoding="async"
            />
          </div>
          <div>
            <div class="wu-album-name">Maya &amp; Sam</div>
            <div class="wu-album-folder">Drive Folder: maya-sam</div>
            <div class="wu-album-date">19 Jun 2027</div>
          </div>
        </div>
      </div>
      <div class="wu-mobile-album-meta">
        <span class="badge wu-badge">Private</span>
        <span>Guestbook · Voicemail</span>
      </div>
      <div class="wu-mobile-album-actions">
        <div class="wu-action-menu dropdown">
          <button
            class="wu-button wu-button--outline wu-button-sm"
            type="button"
            data-bs-toggle="dropdown"
            aria-expanded="false"
            data-bs-config='{"popperConfig":{"strategy":"fixed"}}'
          >
            Actions
            <i class="wu-icon wu-icon--chevron-down wu-icon--xs" aria-hidden="true"></i>
            <span class="visually-hidden">for Maya &amp; Sam</span>
          </button>
          <ul class="dropdown-menu dropdown-menu-end">
            <li>
              <button
                type="button"
                class="dropdown-item"
                data-bs-toggle="modal"
                data-bs-target="#docs-table-action"
                data-layout-action="View"
                data-layout-label="Maya &amp; Sam"
              >
                View
              </button>
            </li>
            <li>
              <button
                type="button"
                class="dropdown-item"
                data-bs-toggle="modal"
                data-bs-target="#docs-table-action"
                data-layout-action="Edit"
                data-layout-label="Maya &amp; Sam"
              >
                Edit
              </button>
            </li>
            <li>
              <button
                type="button"
                class="dropdown-item text-danger-500"
                data-bs-toggle="modal"
                data-bs-target="#docs-table-action"
                data-layout-action="Delete"
                data-layout-label="Maya &amp; Sam"
              >
                Delete
              </button>
            </li>
          </ul>
        </div>
      </div>
    </article>
    <article
      data-layout-record="nora-jamie"
      data-layout-search-text="Nora &amp; Jamie nora-jamie"
      data-layout-state="public"
      class="wu-mobile-album"
    >
      <div class="wu-mobile-album-top">
        <div class="wu-album-cell">
          <div class="wu-thumb">
            <img
              src="../../public/assets/images/memory-08.webp"
              alt=""
              width="64"
              height="64"
              loading="lazy"
              decoding="async"
            />
          </div>
          <div>
            <div class="wu-album-name">Nora &amp; Jamie</div>
            <div class="wu-album-folder">Drive Folder: nora-jamie</div>
            <div class="wu-album-date">26 Jun 2027</div>
          </div>
        </div>
      </div>
      <div class="wu-mobile-album-meta">
        <span class="badge wu-badge wu-badge--primary-fill">Public</span>
        <span>Guestbook · Voicemail</span>
      </div>
      <div class="wu-mobile-album-actions">
        <div class="wu-action-menu dropdown">
          <button
            class="wu-button wu-button--outline wu-button-sm"
            type="button"
            data-bs-toggle="dropdown"
            aria-expanded="false"
            data-bs-config='{"popperConfig":{"strategy":"fixed"}}'
          >
            Actions
            <i class="wu-icon wu-icon--chevron-down wu-icon--xs" aria-hidden="true"></i>
            <span class="visually-hidden">for Nora &amp; Jamie</span>
          </button>
          <ul class="dropdown-menu dropdown-menu-end">
            <li>
              <button
                type="button"
                class="dropdown-item"
                data-bs-toggle="modal"
                data-bs-target="#docs-table-action"
                data-layout-action="View"
                data-layout-label="Nora &amp; Jamie"
              >
                View
              </button>
            </li>
            <li>
              <button
                type="button"
                class="dropdown-item"
                data-bs-toggle="modal"
                data-bs-target="#docs-table-action"
                data-layout-action="Edit"
                data-layout-label="Nora &amp; Jamie"
              >
                Edit
              </button>
            </li>
            <li>
              <button
                type="button"
                class="dropdown-item text-danger-500"
                data-bs-toggle="modal"
                data-bs-target="#docs-table-action"
                data-layout-action="Delete"
                data-layout-label="Nora &amp; Jamie"
              >
                Delete
              </button>
            </li>
          </ul>
        </div>
      </div>
    </article>
    <article
      data-layout-record="riley-casey"
      data-layout-search-text="Riley &amp; Casey riley-casey"
      data-layout-state="private"
      class="wu-mobile-album d-none"
      hidden
    >
      <div class="wu-mobile-album-top">
        <div class="wu-album-cell">
          <div class="wu-thumb">
            <img
              src="../../public/assets/images/memory-02.webp"
              alt=""
              width="64"
              height="64"
              loading="lazy"
              decoding="async"
            />
          </div>
          <div>
            <div class="wu-album-name">Riley &amp; Casey</div>
            <div class="wu-album-folder">Drive Folder: riley-casey</div>
            <div class="wu-album-date">03 Jul 2027</div>
          </div>
        </div>
      </div>
      <div class="wu-mobile-album-meta">
        <span class="badge wu-badge">Private</span>
        <span>Guestbook · Voicemail</span>
      </div>
      <div class="wu-mobile-album-actions">
        <div class="wu-action-menu dropdown">
          <button
            class="wu-button wu-button--outline wu-button-sm"
            type="button"
            data-bs-toggle="dropdown"
            aria-expanded="false"
            data-bs-config='{"popperConfig":{"strategy":"fixed"}}'
          >
            Actions
            <i class="wu-icon wu-icon--chevron-down wu-icon--xs" aria-hidden="true"></i>
            <span class="visually-hidden">for Riley &amp; Casey</span>
          </button>
          <ul class="dropdown-menu dropdown-menu-end">
            <li>
              <button
                type="button"
                class="dropdown-item"
                data-bs-toggle="modal"
                data-bs-target="#docs-table-action"
                data-layout-action="View"
                data-layout-label="Riley &amp; Casey"
              >
                View
              </button>
            </li>
            <li>
              <button
                type="button"
                class="dropdown-item"
                data-bs-toggle="modal"
                data-bs-target="#docs-table-action"
                data-layout-action="Edit"
                data-layout-label="Riley &amp; Casey"
              >
                Edit
              </button>
            </li>
            <li>
              <button
                type="button"
                class="dropdown-item text-danger-500"
                data-bs-toggle="modal"
                data-bs-target="#docs-table-action"
                data-layout-action="Delete"
                data-layout-label="Riley &amp; Casey"
              >
                Delete
              </button>
            </li>
          </ul>
        </div>
      </div>
    </article>
    <article
      data-layout-record="ellis-robin"
      data-layout-search-text="Ellis &amp; Robin ellis-robin"
      data-layout-state="public"
      class="wu-mobile-album d-none"
      hidden
    >
      <div class="wu-mobile-album-top">
        <div class="wu-album-cell">
          <div class="wu-thumb">
            <img
              src="../../public/assets/images/memory-05.webp"
              alt=""
              width="64"
              height="64"
              loading="lazy"
              decoding="async"
            />
          </div>
          <div>
            <div class="wu-album-name">Ellis &amp; Robin</div>
            <div class="wu-album-folder">Drive Folder: ellis-robin</div>
            <div class="wu-album-date">10 Jul 2027</div>
          </div>
        </div>
      </div>
      <div class="wu-mobile-album-meta">
        <span class="badge wu-badge wu-badge--primary-fill">Public</span>
        <span>Guestbook · Voicemail</span>
      </div>
      <div class="wu-mobile-album-actions">
        <div class="wu-action-menu dropdown">
          <button
            class="wu-button wu-button--outline wu-button-sm"
            type="button"
            data-bs-toggle="dropdown"
            aria-expanded="false"
            data-bs-config='{"popperConfig":{"strategy":"fixed"}}'
          >
            Actions
            <i class="wu-icon wu-icon--chevron-down wu-icon--xs" aria-hidden="true"></i>
            <span class="visually-hidden">for Ellis &amp; Robin</span>
          </button>
          <ul class="dropdown-menu dropdown-menu-end">
            <li>
              <button
                type="button"
                class="dropdown-item"
                data-bs-toggle="modal"
                data-bs-target="#docs-table-action"
                data-layout-action="View"
                data-layout-label="Ellis &amp; Robin"
              >
                View
              </button>
            </li>
            <li>
              <button
                type="button"
                class="dropdown-item"
                data-bs-toggle="modal"
                data-bs-target="#docs-table-action"
                data-layout-action="Edit"
                data-layout-label="Ellis &amp; Robin"
              >
                Edit
              </button>
            </li>
            <li>
              <button
                type="button"
                class="dropdown-item text-danger-500"
                data-bs-toggle="modal"
                data-bs-target="#docs-table-action"
                data-layout-action="Delete"
                data-layout-label="Ellis &amp; Robin"
              >
                Delete
              </button>
            </li>
          </ul>
        </div>
      </div>
    </article>
    <article
      data-layout-record="lena-drew"
      data-layout-search-text="Lena &amp; Drew lena-drew"
      data-layout-state="public"
      class="wu-mobile-album d-none"
      hidden
    >
      <div class="wu-mobile-album-top">
        <div class="wu-album-cell">
          <div class="wu-thumb">
            <img
              src="../../public/assets/images/memory-03.webp"
              alt=""
              width="64"
              height="64"
              loading="lazy"
              decoding="async"
            />
          </div>
          <div>
            <div class="wu-album-name">Lena &amp; Drew</div>
            <div class="wu-album-folder">Drive Folder: lena-drew</div>
            <div class="wu-album-date">17 Jul 2027</div>
          </div>
        </div>
      </div>
      <div class="wu-mobile-album-meta">
        <span class="badge wu-badge wu-badge--primary-fill">Public</span>
        <span>Guestbook · Voicemail</span>
      </div>
      <div class="wu-mobile-album-actions">
        <div class="wu-action-menu dropdown">
          <button
            class="wu-button wu-button--outline wu-button-sm"
            type="button"
            data-bs-toggle="dropdown"
            aria-expanded="false"
            data-bs-config='{"popperConfig":{"strategy":"fixed"}}'
          >
            Actions
            <i class="wu-icon wu-icon--chevron-down wu-icon--xs" aria-hidden="true"></i>
            <span class="visually-hidden">for Lena &amp; Drew</span>
          </button>
          <ul class="dropdown-menu dropdown-menu-end">
            <li>
              <button
                type="button"
                class="dropdown-item"
                data-bs-toggle="modal"
                data-bs-target="#docs-table-action"
                data-layout-action="View"
                data-layout-label="Lena &amp; Drew"
              >
                View
              </button>
            </li>
            <li>
              <button
                type="button"
                class="dropdown-item"
                data-bs-toggle="modal"
                data-bs-target="#docs-table-action"
                data-layout-action="Edit"
                data-layout-label="Lena &amp; Drew"
              >
                Edit
              </button>
            </li>
            <li>
              <button
                type="button"
                class="dropdown-item text-danger-500"
                data-bs-toggle="modal"
                data-bs-target="#docs-table-action"
                data-layout-action="Delete"
                data-layout-label="Lena &amp; Drew"
              >
                Delete
              </button>
            </li>
          </ul>
        </div>
      </div>
    </article>
  </div>
  <p class="wu-help p-3 mb-0 d-none" data-layout-empty hidden>
    No sample albums match. Clear the search or choose All visibility.
  </p>
  <div class="wu-pagination">
    <p class="text-neutral-700 mb-0 d-none d-sm-block" data-layout-range>Showing 1–3 of 6</p>
    <nav aria-label="Sample album pages">
      <ul class="pagination justify-content-center mb-0">
        <li class="page-item disabled">
          <button class="page-link" type="button" data-layout-page="previous" disabled>
            Previous
          </button>
        </li>
        <li class="page-item">
          <button class="page-link active" type="button" data-layout-page="1" aria-current="page">
            1
          </button>
        </li>
        <li class="page-item">
          <button class="page-link" type="button" data-layout-page="2">2</button>
        </li>
        <li class="page-item">
          <button class="page-link" type="button" data-layout-page="next">Next</button>
        </li>
      </ul>
    </nav>
  </div>
</section>
<!-- Related Bootstrap dialogs: place after .wu-app, before </body>; include once. -->
<div
  class="wu-modal modal fade"
  id="docs-table-action"
  tabindex="-1"
  aria-labelledby="docs-table-action-title"
  aria-describedby="docs-table-action-message"
  data-layout-action-dialog
>
  <div class="modal-dialog modal-dialog-centered">
    <div class="modal-content">
      <div class="wu-modal-head modal-header">
        <h2 class="text-bronze-600 fw-bold" id="docs-table-action-title">Demo action</h2>
        <button class="btn-close" type="button" data-bs-dismiss="modal" aria-label="Close"></button>
      </div>
      <div class="wu-modal-body modal-body">
        <p class="mb-0" id="docs-table-action-message" data-layout-action-message>
          This example does not change records.
        </p>
      </div>
      <div class="wu-modal-foot modal-footer">
        <button
          class="wu-button wu-button-md wu-button--outline"
          type="button"
          data-bs-dismiss="modal"
        >
          Close demo
        </button>
      </div>
    </div>
  </div>
</div>
CSS reference & dependencies

.wu-card.wu-card-head.wu-count-badge.wu-toolbar.wu-toolbar-left.wu-select.wu-search.wu-icon.wu-icon--search-gold.wu-icon--sm.wu-input.wu-card-body.wu-help.wu-table-wrap.wu-table.wu-album-cell.wu-thumb.wu-album-name.wu-album-folder.wu-album-date.wu-album-qr.wu-badge.wu-badge--primary-fill.wu-row-actions.wu-action-menu.wu-button.wu-button--outline.wu-button-sm.wu-icon--chevron-down.wu-icon--xs.wu-mobile-albums.wu-mobile-album.wu-mobile-album-top.wu-mobile-album-meta.wu-mobile-album-actions.wu-pagination.wu-modal.wu-modal-head.wu-modal-body.wu-modal-foot.wu-button-md

Stylesheets · in this order

  • https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css
  • assets/css/wu-icons.css
  • assets/css/wu-components.css
  • assets/css/wu-form-controls.css
  • application/assets/css/application-shell.css
  • application/assets/css/application-features.css

Scripts · once, in this order

  • https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/js/bootstrap.bundle.min.js
  • documentation/assets/js/layout-examples.js

The reference lists use project-root paths. The copyable dependency block and HTML below use paths relative to documentation/starters/, so they work in the delivered starter files. Load each dependency once; keep scripts after content. When moving your starter to public/ or application/, adjust those paths together. Keep its shell controller; a content-only preview does not need to reload it.

Dependencies
<link
  href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css"
  rel="stylesheet"
/>
<link href="../../assets/css/wu-icons.css" rel="stylesheet" />
<link href="../../assets/css/wu-components.css" rel="stylesheet" />
<link href="../../assets/css/wu-form-controls.css" rel="stylesheet" />
<link href="../../application/assets/css/application-shell.css" rel="stylesheet" />
<link href="../../application/assets/css/application-features.css" rel="stylesheet" />
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/js/bootstrap.bundle.min.js"></script>
<script src="../assets/js/layout-examples.js"></script>

Documentation sample composition using existing source classes. Sample text, record IDs and demo-only hooks are local to this example.

Application · Repeating media cards

Source arrangement: application/moderation.html · .wu-guest-gallery-grid > figure.wu-guest-media; .wu-guest-media__caption; .wu-guest-media__actions

Live preview
Open preview ↗
  • Paste inside the Application starter main.wu-page. Use body class="wu-application wu-page-moderation wu-page-album" with data-page="new-page". These are the styling scopes already used by Moderation, not a new gallery theme.
  • Keep the starter CSS, then load public/assets/css/guest-album.css and application/assets/css/application-album.css in the listed order. The Application reuses the Guest gallery figure styles; Guest JavaScript is not required here.
  • This is the source CSS multi-column gallery: three columns, two at ≤991.98px, one below 768px. It is not a row-aligned Bootstrap card grid. Keep each image, filename caption and actions inside the same figure.
  • View opens a Bootstrap image preview filled from the selected figure. Hide opens a clearly labelled demo dialog. Include both related overlay blocks; Bootstrap owns opening/closing, backdrop and focus.
  • Load layout-examples.js once after Bootstrap. Do not add guest-album.js or moderation.js just for this layout: their full-page controllers have separate feature roots. Original WebP crops, loading and decoding attributes are kept.
  • Place the related dialog blocks after .wu-app, before </body>, as in the Application starter. Keep each dialog ID unique when composing examples.
HTML example Ready for the supplied page starter
HTML
<!-- Paste inside Application starter main.wu-page (inside the existing shell). Asset paths below target documentation/starters/. -->
<section aria-labelledby="docs-grid-title">
  <div class="wu-page-head">
    <div>
      <h2 class="wu-page-title" id="docs-grid-title">Moments from the celebration</h2>
      <p class="wu-page-copy">
        Six sample photographs. Repeat a figure for each record; use View to inspect a photo.
      </p>
    </div>
  </div>
  <p class="wu-help">
    Documentation demo: Hide only explains the action. No media is removed or changed.
  </p>
  <div class="wu-guest-gallery-grid">
    <figure class="wu-guest-media">
      <img
        src="../../public/assets/images/memory-01.webp"
        width="960"
        height="645"
        loading="lazy"
        decoding="async"
        alt="Friends sharing a wedding selfie"
      />
      <figcaption class="wu-guest-media__caption">Celebration_01.jpg</figcaption>
      <div class="wu-guest-media__actions">
        <button
          class="wu-button wu-button-sm wu-button--primary"
          type="button"
          data-bs-toggle="modal"
          data-bs-target="#docs-media-preview"
          data-layout-media-open
          aria-label="Preview Celebration_01.jpg"
        >
          View
        </button>
        <button
          type="button"
          class="wu-button wu-button-sm wu-button--danger"
          data-bs-toggle="modal"
          data-bs-target="#docs-grid-action"
          data-layout-action="Hide"
          data-layout-label="Celebration_01.jpg"
        >
          Hide
        </button>
      </div>
    </figure>
    <figure class="wu-guest-media">
      <img
        src="../../public/assets/images/memory-02.webp"
        width="478"
        height="698"
        loading="lazy"
        decoding="async"
        alt="Guests celebrating with the couple"
      />
      <figcaption class="wu-guest-media__caption">Celebration_02.jpg</figcaption>
      <div class="wu-guest-media__actions">
        <button
          class="wu-button wu-button-sm wu-button--primary"
          type="button"
          data-bs-toggle="modal"
          data-bs-target="#docs-media-preview"
          data-layout-media-open
          aria-label="Preview Celebration_02.jpg"
        >
          View
        </button>
        <button
          type="button"
          class="wu-button wu-button-sm wu-button--danger"
          data-bs-toggle="modal"
          data-bs-target="#docs-grid-action"
          data-layout-action="Hide"
          data-layout-label="Celebration_02.jpg"
        >
          Hide
        </button>
      </div>
    </figure>
    <figure class="wu-guest-media">
      <img
        src="../../public/assets/images/memory-01.webp"
        width="960"
        height="650"
        loading="lazy"
        decoding="async"
        alt="Wedding party gathering together"
      />
      <figcaption class="wu-guest-media__caption">Celebration_03.jpg</figcaption>
      <div class="wu-guest-media__actions">
        <button
          class="wu-button wu-button-sm wu-button--primary"
          type="button"
          data-bs-toggle="modal"
          data-bs-target="#docs-media-preview"
          data-layout-media-open
          aria-label="Preview Celebration_03.jpg"
        >
          View
        </button>
        <button
          type="button"
          class="wu-button wu-button-sm wu-button--danger"
          data-bs-toggle="modal"
          data-bs-target="#docs-grid-action"
          data-layout-action="Hide"
          data-layout-label="Celebration_03.jpg"
        >
          Hide
        </button>
      </div>
    </figure>
    <figure class="wu-guest-media">
      <img
        src="../../public/assets/images/memory-05.webp"
        width="756"
        height="978"
        loading="lazy"
        decoding="async"
        alt="Bride smiling with friends"
      />
      <figcaption class="wu-guest-media__caption">Celebration_04.jpg</figcaption>
      <div class="wu-guest-media__actions">
        <button
          class="wu-button wu-button-sm wu-button--primary"
          type="button"
          data-bs-toggle="modal"
          data-bs-target="#docs-media-preview"
          data-layout-media-open
          aria-label="Preview Celebration_04.jpg"
        >
          View
        </button>
        <button
          type="button"
          class="wu-button wu-button-sm wu-button--danger"
          data-bs-toggle="modal"
          data-bs-target="#docs-grid-action"
          data-layout-action="Hide"
          data-layout-label="Celebration_04.jpg"
        >
          Hide
        </button>
      </div>
    </figure>
    <figure class="wu-guest-media">
      <img
        src="../../public/assets/images/memory-04.webp"
        width="833"
        height="952"
        loading="lazy"
        decoding="async"
        alt="Newlyweds together outdoors"
      />
      <figcaption class="wu-guest-media__caption">Celebration_05.jpg</figcaption>
      <div class="wu-guest-media__actions">
        <button
          class="wu-button wu-button-sm wu-button--primary"
          type="button"
          data-bs-toggle="modal"
          data-bs-target="#docs-media-preview"
          data-layout-media-open
          aria-label="Preview Celebration_05.jpg"
        >
          View
        </button>
        <button
          type="button"
          class="wu-button wu-button-sm wu-button--danger"
          data-bs-toggle="modal"
          data-bs-target="#docs-grid-action"
          data-layout-action="Hide"
          data-layout-label="Celebration_05.jpg"
        >
          Hide
        </button>
      </div>
    </figure>
    <figure class="wu-guest-media">
      <img
        src="../../public/assets/images/memory-02.webp"
        width="960"
        height="650"
        loading="lazy"
        decoding="async"
        alt="Guests smiling during the celebration"
      />
      <figcaption class="wu-guest-media__caption">Celebration_06.jpg</figcaption>
      <div class="wu-guest-media__actions">
        <button
          class="wu-button wu-button-sm wu-button--primary"
          type="button"
          data-bs-toggle="modal"
          data-bs-target="#docs-media-preview"
          data-layout-media-open
          aria-label="Preview Celebration_06.jpg"
        >
          View
        </button>
        <button
          type="button"
          class="wu-button wu-button-sm wu-button--danger"
          data-bs-toggle="modal"
          data-bs-target="#docs-grid-action"
          data-layout-action="Hide"
          data-layout-label="Celebration_06.jpg"
        >
          Hide
        </button>
      </div>
    </figure>
  </div>
</section>
<!-- Related Bootstrap dialogs: place after .wu-app, before </body>; include once. -->
<div
  class="wu-modal modal fade"
  id="docs-media-preview"
  tabindex="-1"
  aria-labelledby="docs-media-preview-title"
  data-layout-media-dialog
>
  <div class="modal-dialog modal-dialog-centered modal-dialog-scrollable">
    <div class="modal-content">
      <div class="wu-modal-head modal-header">
        <h2 class="text-bronze-600 fw-bold" id="docs-media-preview-title" data-layout-media-title>
          Sample photo
        </h2>
        <button class="btn-close" type="button" data-bs-dismiss="modal" aria-label="Close"></button>
      </div>
      <div class="modal-body">
        <div class="wu-guest-lightbox">
          <img
            data-layout-media-image
            src="../../public/assets/images/memory-01.webp"
            alt="Friends sharing a wedding selfie"
          />
        </div>
      </div>
      <div class="wu-modal-foot modal-footer">
        <button
          class="wu-button wu-button-md wu-button--outline"
          type="button"
          data-bs-dismiss="modal"
        >
          Close preview
        </button>
      </div>
    </div>
  </div>
</div>
<div
  class="wu-modal modal fade"
  id="docs-grid-action"
  tabindex="-1"
  aria-labelledby="docs-grid-action-title"
  aria-describedby="docs-grid-action-message"
  data-layout-action-dialog
>
  <div class="modal-dialog modal-dialog-centered">
    <div class="modal-content">
      <div class="wu-modal-head modal-header">
        <h2 class="text-bronze-600 fw-bold" id="docs-grid-action-title">Demo action</h2>
        <button class="btn-close" type="button" data-bs-dismiss="modal" aria-label="Close"></button>
      </div>
      <div class="wu-modal-body modal-body">
        <p class="mb-0" id="docs-grid-action-message" data-layout-action-message>
          This example does not change records.
        </p>
      </div>
      <div class="wu-modal-foot modal-footer">
        <button
          class="wu-button wu-button-md wu-button--outline"
          type="button"
          data-bs-dismiss="modal"
        >
          Close demo
        </button>
      </div>
    </div>
  </div>
</div>
CSS reference & dependencies

.wu-page-head.wu-page-title.wu-page-copy.wu-help.wu-guest-gallery-grid.wu-guest-media.wu-guest-media__caption.wu-guest-media__actions.wu-button.wu-button-sm.wu-button--primary.wu-button--danger.wu-modal.wu-modal-head.wu-guest-lightbox.wu-modal-foot.wu-button-md.wu-button--outline.wu-modal-body

Stylesheets · in this order

  • https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css
  • assets/css/wu-icons.css
  • assets/css/wu-components.css
  • assets/css/wu-form-controls.css
  • application/assets/css/application-shell.css
  • application/assets/css/application-features.css
  • public/assets/css/guest-album.css
  • application/assets/css/application-album.css

Scripts · once, in this order

  • https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/js/bootstrap.bundle.min.js
  • documentation/assets/js/layout-examples.js

The reference lists use project-root paths. The copyable dependency block and HTML below use paths relative to documentation/starters/, so they work in the delivered starter files. Load each dependency once; keep scripts after content. When moving your starter to public/ or application/, adjust those paths together. Keep its shell controller; a content-only preview does not need to reload it.

Dependencies
<link
  href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css"
  rel="stylesheet"
/>
<link href="../../assets/css/wu-icons.css" rel="stylesheet" />
<link href="../../assets/css/wu-components.css" rel="stylesheet" />
<link href="../../assets/css/wu-form-controls.css" rel="stylesheet" />
<link href="../../application/assets/css/application-shell.css" rel="stylesheet" />
<link href="../../application/assets/css/application-features.css" rel="stylesheet" />
<link href="../../public/assets/css/guest-album.css" rel="stylesheet" />
<link href="../../application/assets/css/application-album.css" rel="stylesheet" />
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/js/bootstrap.bundle.min.js"></script>
<script src="../assets/js/layout-examples.js"></script>

Documentation sample composition using existing source classes. Sample text, record IDs and demo-only hooks are local to this example.

Additional existing section references

The following Pricing and Public form references remain unchanged. Their original source-relative paths and context dependencies are retained.

Feature detail section

Source: public/pricing.html · .wu-feature-detail > .wu-feature-detail-grid

Live preview
Open preview ↗
  • This repeatable pricing feature pattern is used for multiple feature blocks on the Pricing page. pricing-enhanced.css is a context dependency.
  • It is not a global Application card; retain the source media/copy order and responsive CSS.
HTML example
HTML
<section class="wu-feature-detail" data-feature-section="standard-features" id="standard-features">
  <div
    class="wu-feature-detail-grid"
    data-aos="zoom-in-left"
    data-aos-delay="300"
    data-aos-duration="500"
  >
    <div class="wu-feature-detail-copy">
      <div class="wu-feature-detail-number">01</div>
      <span class="wu-feature-tag wu-feature-tag--included">Included</span>
      <h2>Core Collection</h2>
      <p>
        <strong>Everything needed to start collecting memories is included.</strong>
        <br />
        Guests contribute without an app or account, uploads can remain in original quality, each
        album has a unique URL and QR code, and files transfer into the connected Google Drive.
      </p>
      <ul class="wu-feature-points">
        <li class="wu-feature-point">
          <i class="wu-icon wu-icon--cloud-check wu-icon--sm" aria-hidden="true"></i>
          <span>No guest app or guest account required</span>
        </li>
        <li class="wu-feature-point">
          <i class="wu-icon wu-icon--cloud-check wu-icon--sm" aria-hidden="true"></i>
          <span>Real-time gallery as new guest uploads arrive</span>
        </li>
        <li class="wu-feature-point">
          <i class="wu-icon wu-icon--cloud-check wu-icon--sm" aria-hidden="true"></i>
          <span>Unique album link + QR code + printable sharing signs</span>
        </li>
        <li class="wu-feature-point">
          <i class="wu-icon wu-icon--cloud-check wu-icon--sm" aria-hidden="true"></i>
          <span>Unlimited guest contributors and multiple albums</span>
        </li>
        <li class="wu-feature-point">
          <i class="wu-icon wu-icon--cloud-check wu-icon--sm" aria-hidden="true"></i>
          <span>Guest uploads become available in the connected Google Drive</span>
        </li>
      </ul>
      <a class="wu-text-link" href="guest-template-1.html">See it in the demo guest album →</a>
    </div>
    <div class="wu-feature-detail-visual wu-v-standard">
      <img
        class="d-none d-sm-block d-md-none d-lg-block"
        src="assets/images/02-pricing-features/feature-01.webp"
        alt=""
        decoding="async"
        loading="lazy"
      />
      <img
        class="d-block d-sm-none d-md-block d-lg-none"
        src="assets/images/02-pricing-features/feature-01-ipad.webp"
        alt=""
        decoding="async"
        loading="lazy"
      />
    </div>
  </div>
</section>
CSS reference & dependencies

.wu-feature-detail.wu-feature-detail-grid.wu-feature-detail-copy.wu-feature-detail-number.wu-feature-tag.wu-feature-tag--included.wu-feature-points.wu-feature-point.wu-icon.wu-icon--cloud-check.wu-icon--sm.wu-text-link

Stylesheets · in this order

  • https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css
  • public/assets/css/components.css
  • public/assets/css/public.css
  • public/assets/css/pages.css
  • public/assets/css/signature.css
  • public/assets/css/pricing-enhanced.css
  • public/assets/css/site-shell.css
  • assets/css/wu-icons.css

Scripts · once, in this order

  • No component JavaScript required.

Dependency paths below are relative to the project root. Source snippet asset paths are relative to public/. Adjust paths when moving a snippet.

Dependencies
<link
  href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css"
  rel="stylesheet"
/>
<link href="public/assets/css/components.css" rel="stylesheet" />
<link href="public/assets/css/public.css" rel="stylesheet" />
<link href="public/assets/css/pages.css" rel="stylesheet" />
<link href="public/assets/css/signature.css" rel="stylesheet" />
<link href="public/assets/css/pricing-enhanced.css" rel="stylesheet" />
<link href="public/assets/css/site-shell.css" rel="stylesheet" />
<link href="assets/css/wu-icons.css" rel="stylesheet" />

Source excerpt; no component class renaming.

Public form section

Source: public/contact.html · .wu-contact-card .wu-field

Live preview
Open preview ↗
  • Public contact layout uses .wu-field and its Public styling; Application fields use the shared Bootstrap form theme. Do not load both context stacks into the same page.
  • This preview keeps native browser validation. A documentation guard pauses the final submission; it does not send a support message.
HTML example
HTML
<form class="wu-contact-card" data-aos="fade-left" data-aos-duration="500">
  <div class="wu-contact-two">
    <div class="wu-field">
      <label for="firstName">First name</label>
      <input
        autocomplete="given-name"
        class="wu-input"
        id="firstName"
        placeholder="Input your first name"
      />
    </div>
    <div class="wu-field">
      <label for="lastName">Last name</label>
      <input
        autocomplete="family-name"
        class="wu-input"
        id="lastName"
        placeholder="Input your last name"
      />
    </div>
  </div>
  <div class="wu-field">
    <label for="email">Email address</label>
    <input
      autocomplete="email"
      class="wu-input"
      id="email"
      type="email"
      placeholder="Input your Email Address"
    />
  </div>
  <div class="wu-field">
    <label for="topic">What can we help with?</label>
    <select class="wu-select" id="topic">
      <option>General question</option>
      <option>Album / upload help</option>
      <option>Google Drive connection</option>
      <option>Pricing / purchase</option>
      <option>Feedback or idea</option>
    </select>
  </div>
  <div class="wu-field">
    <label for="message">Your message</label>
    <textarea class="wu-textarea" id="message" placeholder="Write a message"></textarea>
  </div>
  <button class="wu-button wu-button--primary wu-button-lg" type="button">Send message →</button>
</form>
CSS reference & dependencies

.wu-contact-card.wu-contact-two.wu-field.wu-input.wu-select.wu-textarea.wu-button.wu-button--primary.wu-button-lg

Stylesheets · in this order

  • https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css
  • public/assets/css/components.css
  • public/assets/css/public.css
  • public/assets/css/pages.css
  • public/assets/css/signature.css
  • public/assets/css/responsive.css
  • public/assets/css/site-shell.css
  • public/assets/css/public-layout.css
  • assets/css/wu-icons.css

Scripts · once, in this order

  • No component JavaScript required.

Dependency paths below are relative to the project root. Source snippet asset paths are relative to public/. Adjust paths when moving a snippet.

Dependencies
<link
  href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css"
  rel="stylesheet"
/>
<link href="public/assets/css/components.css" rel="stylesheet" />
<link href="public/assets/css/public.css" rel="stylesheet" />
<link href="public/assets/css/pages.css" rel="stylesheet" />
<link href="public/assets/css/signature.css" rel="stylesheet" />
<link href="public/assets/css/responsive.css" rel="stylesheet" />
<link href="public/assets/css/site-shell.css" rel="stylesheet" />
<link href="public/assets/css/public-layout.css" rel="stylesheet" />
<link href="assets/css/wu-icons.css" rel="stylesheet" />

Source excerpt; no component class renaming.