Files
wehub-resource-sync b3a7f98e5a
CI / E2E Cloudflare (4/8) (push) Failing after 0s
CI / E2E Cloudflare (8/8) (push) Failing after 1s
CI / Lint (push) Failing after 1s
Auto Extract / Extract (push) Failing after 4s
CI / Version Check (push) Failing after 9s
CI / Integration Tests (push) Failing after 1s
CI / E2E tests (1/8) (push) Failing after 1s
CI / E2E tests (2/8) (push) Failing after 2s
CI / E2E tests (3/8) (push) Failing after 2s
CI / Browser Tests (push) Failing after 1s
CI / E2E tests (5/8) (push) Failing after 1s
CI / E2E Cloudflare (2/8) (push) Failing after 2s
CI / Typecheck (push) Failing after 1s
CI / Changeset Validation (push) Failing after 2s
CI / E2E Cloudflare (5/8) (push) Failing after 1s
CI / E2E Cloudflare (6/8) (push) Failing after 1s
CI / E2E Cloudflare (7/8) (push) Failing after 1s
CodeQL / Analyze (javascript-typescript) (push) Failing after 1s
Format / Format (push) Failing after 0s
CodeQL / Analyze (actions) (push) Failing after 4s
CI / E2E tests (4/8) (push) Failing after 1s
CI / E2E tests (6/8) (push) Failing after 1s
CI / E2E tests (7/8) (push) Failing after 2s
CI / E2E tests (8/8) (push) Failing after 1s
CI / E2E Cloudflare (1/8) (push) Failing after 1s
CI / E2E Cloudflare (3/8) (push) Failing after 2s
Preview Releases / Publish Preview (push) Failing after 0s
zizmor / Run zizmor (push) Failing after 1s
Release / Release (push) Failing after 2s
CI / Smoke Tests (push) Failing after 5m36s
CI / Tests (push) Failing after 6m36s
Release / Sync Templates (push) Has been skipped
CI / E2E Tests (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:23:53 +08:00
..

EmDash Theme Scaffold

This is a minimal, working EmDash theme that demonstrates correct patterns for:

  • Site settings - Use getSiteSettings() for title, tagline, logo - never hard-code
  • Menus - Use getMenu() for navigation - never hard-code links
  • Image fields - Always access .src and .alt, never the field directly
  • Taxonomy terms - Use getEntryTerms() without a db parameter
  • PortableText - Use the <PortableText> component from emdash/ui

Critical: No Hard-Coded Content

The theme is a shell that displays CMS content. Never hard-code:

  • Site title or tagline (use settings.title, settings.tagline)
  • Navigation links (use getMenu("primary"))
  • Logo or favicon (use settings.logo, settings.favicon)
  • Footer content (use site settings or widget areas)

Usage

When porting a WordPress theme:

  1. Copy this scaffold to your theme directory
  2. Run pnpm install from monorepo root
  3. Verify it builds: pnpm --filter your-theme build
  4. Use these templates as reference for correct API usage

Key Patterns

Image Fields

{/* CORRECT - check .src exists */}
{post.data.featured_image?.src && (
  <img
    src={post.data.featured_image.src}
    alt={post.data.featured_image.alt || post.data.title}
  />
)}

{/* WRONG - field is an object, not a string */}
{post.data.featured_image && (
  <img src={post.data.featured_image} />  // Renders [object Object]
)}

Taxonomy Terms

{/* CORRECT - no db parameter */}
const categories = await getEntryTerms("posts", post.id, "categories");

{/* WRONG - db is not a parameter */}
const categories = await getEntryTerms("posts", post.id, "categories", db);

Seed File Images

{
	"featured_image": {
		"$media": {
			"url": "https://example.com/image.jpg",
			"alt": "Description",
			"filename": "image.jpg"
		}
	}
}

At runtime, this becomes { src: "...", alt: "..." }.

Files

scaffold/
├── package.json           # Working dependency versions
├── astro.config.mjs       # Minimal config
├── tsconfig.json
├── src/
│   ├── env.d.ts
│   ├── live.config.ts     # Collection loader setup
│   ├── styles/global.css  # Minimal styles with comments
│   ├── layouts/Base.astro # Header, footer, menus
│   ├── components/
│   │   └── PostCard.astro # Image field handling example
│   └── pages/
│       ├── index.astro
│       ├── 404.astro
│       ├── posts/
│       │   ├── index.astro
│       │   └── [slug].astro  # Taxonomy terms example
│       ├── pages/[slug].astro
│       ├── categories/[slug].astro
│       └── tags/[slug].astro
├── public/
│   └── favicon.svg
└── .emdash/
    └── seed.json          # All field types demonstrated