Opinions
Our own take: a Kanban, a combobox, a data grid.
All 108
Scroll to browse, or jump by letterScribeActive Now
Harbour rebrand > Tasks
Drafting the launch checklist.
PlannerActive Now
Tideline mobile > Files
Reading the crew interview notes.
CourierActive Now
Crew interviews > Tasks
Comparing two signage quotes.
AuditorGhost
Rota export > Files
LinkerActive Now
Depot signage > Tasks
Summarising the week for Maya.
TaggerIdle 30mins
Harbour rebrand > Files
Checking the palette against the brand guide.
Tideline assistant
JW
What slipped on the mobile release this week?
AI
Two things. Offline sync is in review and the crew-interview notes are late.
Build one
- Identify the actual state machine first — what are the real modes, and what triggers a transition between them?
- Delegate to a Radix primitive when one already models your interaction, instead of hand-rolling focus management and keyboard handling.
- Still carry
data-rebar-component/data-rebar-part/data-rebar-state, forwarddata-*/aria-*, and style only through--rebar-*tokens. - Support controlled/uncontrolled for whatever value the state machine ultimately produces, the same convention every other tier follows.
- Write real tests covering state transitions and keyboard operability, not just a snapshot of one static render.
Contribute it
Open an issue first for anything this size — a new Opinion is rarely a small fix. No write access to this repo is required to start: fork it, build the construct there, then open an issue linking your fork or branch asking for it to be adopted into the main project.
Once you're building a component:
- Add it under
packages/core/src/components/Name.tsx, export it frompackages/core/src/index.ts, and add its filename toapps/docs/scripts/generate-props.mjs's scan list. - Classify it
"opinion"inapps/docs/src/data/constructTier.ts'sCONSTRUCT_TIER.componentmap. - Add a reference page under
apps/docs/src/app/opinions/<kebab-name>/page.tsxwith a real, live, interactive example — a static screenshot doesn't prove a state machine works.
For a block that needs live-data binding instead:
- Add the shape to
Constructinpackages/placement/src/schema.ts, including a realsourceand/oron<Verb>field resolved viaresolveSource/resolveHandleragainstBlockRenderer'sdata/handlersprops in its render case — never add a field shaped like one without actually wiring it, since that silently lies about the block's own tier. - Classify its type
"opinion"inapps/docs/src/data/constructTier.ts'sCONSTRUCT_TIER.blockmap —tsc --noEmitfails immediately if this ever disagrees with whatpackages/placement/src/opinions.tscomputes mechanically from the schema. - Update the block table in
packages/placement's ownREADME.md, and add a reference page with a real live example.
Run pnpm run lint, test, build, and typecheck at the repo root before opening the PR — the same four checks CI runs, in that order.