Skip to content

moooon

Motir

Vibe your whole project. Bring an idea — Motir's three AI layers plan it, track it, and ship it, end to end. You're looking at Motir, built in Motir.

  • Vibe Project
  • Open Source
  • AI Agent
  • AI Loop
1
requests
0
upvotes
145
planned
1,361
shipped

Motir · Work items

MOTIR-4113Done

Design — motir.co/p/*: the project page, its five tabs and its two detail pages inside the public chrome

Draw the whole /p/* surface as it will exist on motir.co, inside that site's public chrome, as a three-file design asset in motir-marketing/design/public-projects/.

Nothing draws this surface on this host. motir-core/design/public-projects/ draws it as it was on app.motir.co — inside the application's own chrome, with an account menu and a sign-in modal that assume a session on the same origin. motir-core/design/public-site/ (MOTIR-3880) draws motir.co's chrome and names /explore, /docs and /legal among its nav states. A chrome asset naming a surface is a DOOR, not the room — the same reasoning design/legal/design-notes.md records for /legal. This asset is the room.

Draw the WHOLE surface, every screen this story ships:

screenwhat it holds
/p/<identifier> — the Overviewthe hero (name, org, tagline, tags, stats), the authored README rendered as Markdown, the tab bar, and whatever the amendment made of in-place editing
Board · Items · Tree · Roadmap · Changelogthe five tabs, each with its own list/board shape, its pager, and its empty state
/p/<identifier>/items/<key>one work item as the public sees it
/p/<identifier>/requests/<key>one feature request: body, public comment thread, vote control
the request intakethe submit form and its duplicate-suggestion step

And draw the states, per screen, not once: empty · loading · error · anonymous · signed-in-elsewhere. The error state is not decorative here — public-surface-hosts.md §8 cost 1 says so in terms: "a network hop replaces a Prisma read … the API can be slow, or down, and the renderer is in a different application with a different deploy." A /p/* page with an unreachable API is a REAL state of this surface, and motir-marketing/app/explore/ already ships one to build from.

The act affordances are drawn as the amendment decided them, per row of its table — follow, subscribe, roadmap vote, request upvote, request comment, submit request, in-place overview editing, and the top bar's account/sign-in treatment. Where the amendment sends a visitor to app.motir.co and back, DRAW that hand-off: the control, the destination, and what the visitor sees on return. Do not invent a row the amendment does not carry, and do not soften one it does.

Three files, one per the convention (design/marketing/design-notes.md's ⚠️ note): design-notes.md — the area's note, that exact basename, because classifyDesignPath matches the note on exact basename and a differently-named note is silently never published — plus the *.mock.html source, standalone and re-stating the shipped --el-* values, and a same-basename .png re-exported with pnpm design:render. If the surface needs more than one board, each extra board is another *.mock.html + .png pair under the same area note.

The area rule applies from the first commit: design/marketing/design-notes.md § "A design board's CHROME owes AA" is area-wide in this repository and this asset is held to it; pnpm test:design is the lane that measures it, and jsdom cannot — run the real chromium.

Any deferral in the notes is a card. "the real X lands later", "placeholder", "stays for now" — file it and cite the key in the sentence.

Acceptance criteria

  • motir-marketing/design/public-projects/ holds design-notes.md (that exact basename) plus at least one *.mock.html and its same-basename .png, exported with pnpm design:render at deviceScaleFactor: 2.
  • The notes open with a surface table covering all nine screens above, and each row names the route and the endpoint that feeds it.
  • Every screen is drawn in its empty, loading and error states, and the error state is the unreachable-public-API case, not a generic one.
  • Every affordance in the amendment's table appears with the treatment that amendment chose, and the notes cite the amendment's row for each — including, where the mechanism is a hand-off to app.motir.co, the return path drawn.
  • The asset names the access path: how a visitor reaches this surface (from /explore's cards, from a shared link, from a changelog feed item).
  • The chrome is motir.co's — header, nav and footer as motir-core/design/public-site/ draws them — with the /p/* state of the nav made explicit.
  • pnpm test:design passes on the new asset with no exemption added.
  • The notes carry a ## ⚠️ Planning flags section, and every deferral in the file cites a work-item key that exists.
  • No file outside motir-marketing is touched. (motir-core/design/public-projects/, design/public-site/ and the deleted page tree are EVIDENCE — prior art read while drawing — not deliverables.)

Context refs

  • motir-core/design/public-projects/design-notes.md, public-projects.mock.html, public-changelog.mock.html, public-item-detail.mock.html, public-signin-modal.mock.html: the surface as it was, on the application host
  • motir-core/design/public-site/MOTIR-3880's chrome for motir.co
  • motir-marketing/design/legal/design-notes.md — the closest precedent: a room drawn inside that chrome
  • motir-marketing/design/marketing/design-notes.md — the area-wide AA rule and the design-notes.md basename mechanism
  • motir-marketing/app/explore/ — the shipped error/empty treatment for an unreachable public API
  • motir-marketing/scripts/design/render-design-mock.ts · vitest.design.config.mts
  • the amendment this draws · the page · the tabs · the detail pages · the act affordances