Design — the Public page room in project settings: where a project admin edits the tagline, tags and README on app.motir.co (the entrance, the room, its states)
Opened by Zhu Yue ·
Proposed by motir run MOTIR-4171 on 2026-09-02, where guard #3 (the design-reference rule) fired: MOTIR-4171 builds an application-side authoring surface for a project's public overview, and no asset draws one. The only drawn editor — design/public-projects/public-projects.mock.html panels 1b / 1c / 1d (Story 6.16, in-place editing) — sat on the app-hosted public page that MOTIR-3951 deleted, and Panel 6 of the same asset draws Settings' door to it as a link (/p/<key>?edit=1) that 404s on app.motir.co today. This card draws the surface MOTIR-4171 then builds.
The placement is DECIDED — draw it, do not re-open it
Recorded on MOTIR-4171 (2026-09-02, rungs 1–2): the overview is edited in the application's project settings, as its own room — Settings › Project › Public page at /settings/project/public, scoped to the ACTIVE project like every other settings room, registered as one entry in lib/settings/projectSettingsNav.ts (the registry that drives the rail, the command palette and the totality test), and saving through PATCH /api/projects/{key}/public-overview with that project's key. A project-keyed route outside settings was rejected: no shipped precedent in app/(authed)/, a second navigation model for one screen, and the case the key-routed service was written for ("looking at one project's public page while another is active") no longer arises once the public page hosts no editor.
Before drawing — check reality, then compose from it
- RENDER the shipped parents first (design-against-shipped-reality step 0): the project-settings rail in its settings mode, and
Settings › Project › Memberswith the project public (BuildInPublicManageRow+PublicShareSectioninapp/(authed)/settings/project/members/_components/ProjectMembersSettings.tsx). Compose the entrance panels from the REAL rail and the REAL cards — mirror their markup, never a redrawn stand-in. - Read the live field rules from
projectsService.setPublicOverview(lib/services/projectsService.ts~:929) — the tagline cap, the tag count/length caps, the body cap — and render them as the fields' hints. Do not copy numbers from the 6.16 panels; MOTIR-982 changed one. - Read panels 1c / 1d of
design/public-projects/public-projects.mock.htmlfor the editor ELEMENTS already decided (tagline input, removable tag chips + add input, the shippedMarkdownEditor, unsaved-changes tracking) and REUSE them by citation. Do not re-render or amend that asset.
What to draw — a NEW asset set under design/projects/
design/projects/public-page.mock.html + design/projects/public-page.png (same basename) + a new section in design/projects/design-notes.md. A new surface is a new asset: settings-area.mock.html and public-projects.mock.html stay frozen and are cited, never amended in place.
- Panel A — the entrance, drawn as real affordances (three doors): (1) the new "Public page" row in the project-settings rail, in its shipped position and with the same admin gating the other manage-only rows carry (read the registry's conventions and the 2026-08-08 amendment: no read-only view of an administrative surface); (2) the Members room's Panel-6 "Hero & overview" row, whose "Edit on the public page →" link becomes the door into this room; (3) the "Building in public" row's "View public page" link, retargeted to the public host (
https://motir.co/p/<key>, MOTIR-3877) — the/p/<key>path it shows today no longer exists onapp.motir.co. Halo each door. - Panel B — the room: page header in the settings shell; tagline; tags; README body via
MarkdownEditor(write / preview); the shipped settings save pattern (Save / Cancel with unsaved-changes tracking, as 1c decided). Copy in both locales; the product's noun is "work item", never "issue" or "card". - Panel C — states: empty (nothing authored yet — say what the public page shows instead); unsaved changes; saving; per-field save error (the three service errors — overview too long, tagline too long, tags invalid — each at its field); saved; project not yet public (the room is reachable — an overview is authored before publishing — with a quiet pointer to the Members room's access control). In the NOTES, not drawn: non-admin (the row and the room are absent, no read-only view) and self-hosted (
MOTIR_CLOUDunset ⇒ the capability is absent, MOTIR-3908 — nothing renders). - Panel D — from motir.co: a compact three-moment strip: the public page on
motir.coshows NO edit affordance (public-surface-hosts.mdamendment row 7) → the admin signs in toapp.motir.coand picks the project →Settings › Public page. This is the answer MOTIR-4171's criteria ask for ("what a manager arriving from motir.co sees").
Acceptance criteria
design/projects/public-page.mock.htmlanddesign/projects/public-page.pngexist on the branch, anddesign/projects/design-notes.mdgains a section for this room that cites panels 1c / 1d ofdesign/public-projects/public-projects.mock.htmlfor every editor element it reuses and names each one it changes.- Panel A draws all three doors as real affordances inside the shipped parents (the rail row, the Members-room "Hero & overview" door, the retargeted "View public page" link) — drawn, not described in prose.
- Panel B's field hints carry the caps read from
projectsService.setPublicOverview, and the notes quote the line they were read from. - Panel C draws empty, unsaved-changes, saving, per-field error, saved and not-yet-public; the notes state the non-admin and self-hosted arms as ABSENT and cite the gate for each.
- The notes name the registry entry to add in
lib/settings/projectSettingsNav.ts(key, href, label key, icon, gate) and the two link retargets inProjectMembersSettings.tsx. - No visible string reads "tracker", "issue" or "card" for a work item; both locales' copy is listed in the notes.
pnpm vitest run --config vitest.design.config.tsis green on the branch, run after any temporary render harness is deleted.- The design result is published onto this card with
publish_design_result(mock + image + the notes section) and the returned evidence id is written on the card. - GIVES / TAKES: the notes list what this asset hands MOTIR-4171 (the route, the registry entry, the three retargeted or new doors, the i18n keys, the state set) and re-check MOTIR-4171's sizing (5 SP / 90 min) against that list, amending it on the record if the asset outgrew it.
Context refs
motir-core/design/public-projects/public-projects.mock.htmlpanels 1b–1d, 6 +design-notes.md§ "In-place public-page editing (Story 6.16)" — the editor elements already decided; frozen, cite onlymotir-core/design/projects/settings-area.mock.html+design-notes.md— the settings area's asset of record and its railmotir-core/lib/settings/projectSettingsNav.ts— the registry the new row is added to, and its gating conventionsmotir-core/app/(authed)/settings/project/members/_components/ProjectMembersSettings.tsx~:690–:790 —BuildInPublicManageRowandPublicShareSection, the two shipped parents carrying the dead/p/<key>linksmotir-core/lib/services/projectsService.tssetPublicOverview— the live field rulesmotir-core/app/api/projects/[key]/public-overview/route.ts— the door the room saves through, and its header on why it is an application routemotir-core/docs/decisions/public-surface-hosts.md— the affordance table (row 7) and §Fmotir-core/docs/decisions/billing-tiering.md§6 + MOTIR-3908 — the cloud gate the self-hosted arm follows- MOTIR-4171 — the card this design unblocks; its "Decision" section is the placement record
Discussion
No comments yet.
Adding to this discussion signs you in on app.motir.co and brings you back to this request.