--- name: brutalist-academic-ui description: Skriptoteket-specific brutalist/academic UI design for the Vue 3 + Vite SPA. Uses Tailwind v4 utilities mapped to HuleEdu tokens and SPA primitives. --- # Brutalist Academic UI Opinionated design skill for interfaces where intellectual rigor, typographic precision, and structural honesty matter. ## Skriptoteket Compatibility (must follow) - Vue 3 + Vite SPA only. SSR/HTMX is removed; do not re-introduce it. - Tailwind CSS v4 with `@theme inline` token bridge. Prefer utilities in templates over custom CSS. - Tokens are canonical: `src/skriptoteket/web/static/css/huleedu-design-tokens.css` (do not edit directly). - SPA entry point: `frontend/apps/skriptoteket/src/assets/main.css` (import Tailwind + tokens + theme once). - Use SPA primitives before inventing new ones: - Buttons: `.btn-primary`, `.btn-cta`, `.btn-ghost` - Panels (nested): `.panel-inset`, `.panel-inset-canvas` - Messages: `.toast-*` (via `ToastHost`), `.system-message*` (via `SystemMessage`) - Badges: `.status-pill` - Page text: `.page-title`, `.page-description` - **No stacked brutal shadows**: only the outermost “panel/card” gets `shadow-brutal*`. Panels/fields nested inside a shadowed surface must use `shadow-none` + thicker, uniform borders (`panel-inset*`, or `border-2 border-navy/20`) to keep the UI calm and readable. - No Tailwind default palette leakage in product UI: avoid `bg-slate-*`, `text-gray-*`, etc. Use token-mapped utilities (`bg-canvas`, `text-navy`, `shadow-brutal-sm`) or CSS variables (`var(--color-*)`, `var(--huleedu-*)`). - Editor ergonomics: full-height editor routes require `min-h-0` + `overflow` discipline; follow the Script Editor layout patterns (`route-stage--editor`, `AuthLayout`). ## When to Use Activate when user: - Builds websites, landing pages, dashboards, documentation sites - Needs institutional or academic visual language - Mentions: "brutalist", "academic", "minimal", "serious UI" - Wants to avoid generic startup aesthetics (gradients, soft shadows, pill-everything) ## I Need To... | Task | Read | |------|------| | Token + Tailwind mapping rules | `.agent/rules/045-huleedu-design-system.md` | | Tailwind v4 token bridge ADR | `docs/adr/adr-0032-tailwind-4-theme-tokens.md` | | Canonical tokens | `src/skriptoteket/web/static/css/huleedu-design-tokens.css` | | SPA token bridge | `frontend/apps/skriptoteket/src/styles/tokens.css` + `frontend/apps/skriptoteket/src/styles/tailwind-theme.css` | | SPA primitives (buttons, toasts, system messages) | `frontend/apps/skriptoteket/src/assets/main.css` | | Well-aligned editor layout example | `frontend/apps/skriptoteket/src/views/admin/ScriptEditorView.vue` | | Workspace panel (IDE layout) | `frontend/apps/skriptoteket/src/components/editor/EditorWorkspacePanel.vue` | | Grid/typography/color principles | [fundamentals.md](fundamentals.md) | | Layout patterns | [patterns.md](patterns.md) | | Components | [examples/components.md](examples/components.md) | | Tables + ledgers | [examples/tables-ledgers.md](examples/tables-ledgers.md) | ## Quick Reference ### Do - Use token-mapped utilities: `bg-canvas`, `text-navy`, `border-navy`, `shadow-brutal-sm`, `font-serif`. - Use CSS variables when a token is not mapped: `p-[var(--huleedu-space-4)]`, `text-[var(--huleedu-text-sm)]`. - Use the SPA button primitives for actions. - Prefer opacity-only transitions (hard borders/shadows shimmer when translated). - Prefer **one** brutal shadow per major surface (page card / editor workspace / modal). Nested sections get borders, not shadows. ### Avoid - Tailwind default palette (`bg-slate-*`, `text-gray-*`) in product UI. - Hardcoded hex colors or ad-hoc shadows. - Large radii, blur/backdrop filters, or decorative gradients. - Motion/hover transforms that distort “hard” edges (`translate`, `scale`) unless there’s a strong UX reason. ### Font Stack Use token fonts via Tailwind utilities: `font-sans`, `font-serif`, `font-mono`. ### Button Primitives ```html ``` ### Utility Buttons (Toolbars / Micro UI) Use `.btn-ghost` as a base and override size/shadow for dense controls: ```html ``` ## Core Principle The best interface is one where you notice the content, not the interface. Every element earns its place. Typography does the work. Whitespace is structure.