Name the bounded frame: fill:true on the shell, and the contract minor that ships it
CI / full-gate (push) Successful in 2m52s

This commit is contained in:
2026-09-08 17:27:21 +02:00
parent 706abf1204
commit 11ba843ab1
13 changed files with 117 additions and 39 deletions
+9 -7
View File
@@ -47,7 +47,7 @@ folder under `plugins/` goes live after a restart. Create `plugins/hello/plugin.
import { definePlugin } from "@plainpages/plugin-api";
export default definePlugin({
apiVersion: "0.3.0",
apiVersion: "0.4.0",
nav: [{ href: "/hello", id: "hello", label: "Hello", public: true }],
routes: [
{ method: "GET", path: "/", public: true, handler: () => ({ html: "<h1>Hello from my plugin</h1>" }) },
@@ -350,7 +350,7 @@ import { definePlugin } from "@plainpages/plugin-api";
import { listThings, createThings } from "./handlers.ts";
export default definePlugin({
apiVersion: "0.3.0", // semver string of the host contract this plugin was built against (see Versioning)
apiVersion: "0.4.0", // semver string of the host contract this plugin was built against (see Versioning)
// Nav fragment, merged into the global menu and gate-filtered per user.
// `icon` is a Lucide icon by its sprite id (src/ui/icons.ts).
@@ -471,7 +471,7 @@ import { definePlugin } from "@plainpages/plugin-api";
import { landing, board } from "./pages.ts";
export default definePlugin({
apiVersion: "0.3.0",
apiVersion: "0.4.0",
home: landing, // owns "/" — the public front page
dashboard: board, // owns "/dashboard" — the post-login app home
});
@@ -757,7 +757,7 @@ camel humps both becoming underscores — so `upstream` on the `scheduling` plug
```ts
export default definePlugin({
apiVersion: "0.3.0",
apiVersion: "0.4.0",
settings: [
{ key: "upstream", type: "url", required: true, description: "Base URL of the backend" },
{ key: "pageSize", type: "number", default: 25 },
@@ -811,7 +811,7 @@ import { definePlugin } from "@plainpages/plugin-api";
let sql: ReturnType<typeof postgres>;
export default definePlugin({
apiVersion: "0.3.0",
apiVersion: "0.4.0",
storage: true,
hooks: {
onBoot: async (boot) => {
@@ -934,8 +934,10 @@ anonymous visitor. The sidebar collapses to a burger on a narrow screen; a page
chrome-free layout opts out with the shell's `menu: false`.
**The document scrolls.** The sidebar and topbar stay put on their own, and a page is reachable
below the fold without adding a scroll region. A region that should scroll *inside* the page — a
board of full-height columns, a table whose header stays put — sets its own height and `overflow`.
below the fold without adding a scroll region of its own. A page that is a bounded frame instead — a
board of full-height columns, a table whose header must stay put — passes **`fill: true`** to the
shell: the viewport becomes the page, and a region inside it scrolls. `data-table`'s sticky header
needs it, since a header can only stick to a scrollport that moves.
## Building blocks