<%# Dashboard: the gated post-login app home. The built-in default is a short instructional starter — what /dashboard is and how to replace it from a plugin. Composes the app shell (the one global menu via model.nav) around the prose. A plugin owns the real dashboard via a `dashboard` handler; this renders until then. Data: chrome (PageChrome). %><% const nav = include("partials/nav-tree", { nodes: chrome.nav }); // These four messages carry markup ( spans), so they render raw — the documented // markup-carrying case. They interpolate nothing, so there is no untrusted data to escape. const body = `

${t("dashboard.starter.title")}

${t("dashboard.starter.intro")}

${t("dashboard.starter.replace")}

export default definePlugin({
  apiVersion: "0.4.0",
  // view names plugins/<id>/views/<view>.ejs, rendered in this same shell
  dashboard: (ctx) => ({ view: "dashboard", data: { /* … */ } }),
});

${t("dashboard.starter.reference")}

`; -%> <%- include("partials/shell", { body, brand: chrome.brand, breadcrumbs: [{ label: t("dashboard.title") }], csrfToken: chrome.csrfToken, nav, theme: chrome.theme, title: t("dashboard.title"), user: chrome.user, }) %>