# Site Setup Checklist

Post-creation checklist for new Modyo sites. Ensures correct template architecture, CSS token usage, and system snippet integration.

## CSS Architecture

- [ ] **root.css configured with design tokens** — ONLY `-rgb` base tokens (e.g., `--bs-primary-rgb: 76, 29, 149`). NOT the default root.css. No component overrides (`.btn-primary {}`) or hex values (`#4C1D95`).
- [ ] **base.css has custom rules only** — No `:root` blocks. References tokens via `rgb(var(--bs-primary-rgb))`. Contains only CSS rules Bootstrap doesn't cover (gradients, animations, custom layouts).
- [ ] **head snippet loads stylesheets in order** — Dynamic Framework CSS → `root.css` (token overrides) → `base.css` (custom rules).

## System Snippets

- [ ] **System snippet `header` customized** — NOT a new `custom_snippet` named `site_header` or `custom_header`. Keeps built-in functionality: offcanvas mobile menu, session management, notifications, accessibility (ARIA, skip-to-content).
- [ ] **System snippet `footer` customized** — NOT a new `custom_snippet` named `site_footer` or `custom_footer`.
- [ ] **`{% snippet "shared/general/session" %}` integrated in header** — Handles login/logout flow, avatar, dropdown.

## Layouts

- [ ] **Layouts reference system snippets** — Use `{% snippet 'shared/general/header' %}` and `{% snippet 'shared/general/footer' %}`, NOT `{% snippet "site_header" %}`.
- [ ] **Base layout has container** — `<div class="container">{{ content_for_layout }}</div>`
- [ ] **Home layout is full-width** — `{{ content_for_layout }}` without container wrapper.

## User Session

- [ ] **Auth check uses `{% if user %}`** — NOT `{% if user.logged_in %}` (does not exist).
- [ ] **Login/logout URLs use `{{ site.url }}` prefix** — `{{ site.url }}/login`, `{{ site.url }}/logout`.
- [ ] **`site.login_enabled` used for conditional login links** — `{% elsif site.login_enabled %}` for showing login when not authenticated.

## Search & Navigation

- [ ] **Search forms use correct pattern** — `<form action="{{ site.url }}/search" method="get">` with `<input type="hidden" name="commit" value="Search">` and `<input type="text" name="query">`.
- [ ] **Menu syntax correct** — `menus['slug']` + `| visible_items`, NOT `site.menu("slug")`.
- [ ] **Internal links use `{{ site.url }}` prefix** — `{{ site.url }}/blog`, never `/blog`.

## Privacy (if applicable)

- [ ] **If site has realm**: configure site privacy via `realm_id` in `channels-sites-manage`. Site private = requires login for all pages. Page private = only that page requires login.

---

**Document Version**: 1.0.0
**Last Updated**: 2026-02-27
