Skip to content

Themes and Layouts ​

Super Admin includes runtime appearance controls so users can inspect the same modules across different admin-console profiles.

Design Profiles ​

Built-in profiles live in their respective packages/theme-* packages. packages/theme/ owns runtime token application and dependency-light recipes only.

  • Base
  • Crypto
  • Industrial
  • Cyberpunk
  • Newsprint

Profiles define token sets and visual recipes. Base is the neutral starter default; the other profiles provide stronger visual directions. Feature modules should not hard-code profile-specific classes. Use shared primitives and CSS variables so profile switching remains global.

Color Mode ​

The admin app supports light, dark, and system color modes. Color mode is client preference state and belongs in Pinia, not in server/cache state.

Layout Presets ​

The shell supports multiple layout presets, including:

  • tri-column
  • dual-column
  • top-header

Feature pages should expose semantic content regions and avoid depending on a specific shell layout. The shell decides where those regions render.

src/shell/layout-registry.ts is the app-local typed composition root for layouts. Each registration provides LayoutPreset metadata, a Vue component, and preview presentation; AppShell, the Control Center, and Stage Manager previews consume the same registration. Add a layout by adding its component and registry entry, not layout-ID branches in those consumers. A layout component must expose the shared header-actions / workspace slots and cannot require a prop or slot that AppShell does not provide.

An unknown or not-yet-registered LayoutPresetId uses the explicit NeutralLayout; it never masquerades as tri-column or another built-in layout.

Auth Recipes ​

Profile-specific auth portal compositions live under src/modules/auth/components/recipes/ and are composed by auth-recipe-registry.generated.ts. A generated starter keeps only branded recipes for installed themes and always keeps NeutralAuthRecipe.

Register one component when adding a custom profile recipe. Do not add profile-ID branches to AuthLayout.vue, the login page, or the register page. A recipe may require only the shared AuthRecipeProps and default form slot; additional inputs must remain optional. An unknown profile preserves the shared form and Control Center while using the neutral auth recipe.

Preferences ​

Safe UI preferences live in apps/admin/src/stores/.

Persist safe preferences such as:

  • appearance profile
  • color mode
  • layout preset
  • density
  • workspace tab preferences

Do not persist secrets or API response caches in Pinia.