Conversation
Carry over the v1 design.json tokens/brand/authority and principles.md verbatim, port all 9 components (Button, Field, Card, Badge, ComposerPicker, ChatBubble, ChatComposer, ChatThread, ExampleScreen) from raw-CSS attrs.style to v3 Auto Layout with token-bound layout/appearance, and add a v3 colophon.jsonc presentation profile. Adds the idempotent Colophon pointer block to AGENTS.md. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
|
🦞👀 Pull request received. I will update this pull request when review starts. ClawSweeper review completeClawSweeper finished reviewing this revision. The review result is being finalized. |
|
Codex review: needs changes before merge. Reviewed September 17, 2026, 1:49 AM ET / 05:49 UTC (Revision 14). ClawSweeper reviewWhat this changesAdds Fluent design tokens, ten interactive component previews, Colophon presentation metadata, and agent guidance for translating the catalog into native Windows UI. Merge readiness⛔ Needs changes before merge - 7 items remain The design seed remains useful and is absent from current main. All five prior findings remain unresolved, and the latest glyph change introduces an additional styling defect. Priority: P3 Review scores
Verification
How this fits togetherThe design catalog feeds Colophon’s preview canvas and guides agents implementing Windows UI. The native WinUI and Reactor application remains the canonical shipping implementation. flowchart LR
A[Shipping Windows UI] --> B[Fluent design tokens]
B --> C[Component catalog]
C --> D[Colophon renderer]
E[Preview interactions] --> D
D --> F[Design canvas]
B --> G[Agent implementation guidance]
Before merge
Findings
Agent review detailsSecurityNone. Review metrics
Technical reviewBest possible solution: Keep the catalog aligned with native Windows behavior, using supported Colophon interactions and accurate build guidance without introducing a new consumer or changing application code. Do we have a high-confidence way to reproduce the issue? Yes, source inspection establishes the picker’s missing selection behavior and the glyph style replacement in the actual Colophon consumer; no runtime reproduction or tests were executed. Is this the best way to solve the issue? Not yet: the design-only boundary is appropriate, but the catalog must use working consumer contracts and describe the repository’s actual build workflow. Full review comments:
Overall correctness: patch is incorrect AGENTS.md: found and applied where relevant. Codex review notes: model internal, reasoning medium; reviewed against 3c43751b2bac. LabelsLabel justifications:
EvidenceAcceptance criteria:
What I checked:
Likely related people:
Rank-up movesOptional improvements that raise the rating; they are not merge blockers.
Rating scale
Overall follows the weaker of proof and patch quality. Workflow
HistoryReview history (13 earlier review cycles; latest 8 shown)
|
ComposerPicker now follows the Fluent ComboBox pattern (bordered control fill + hairline border, ink value, right-aligned muted chevron). ChatComposer and ChatThread are realigned to the actual ReactorChatComposer/ReactorChatTimeline implementation: - ChatComposer toolbar: adds session picker, speaker, and settings; notes the Send<->Stop toggle; binds ControlFill/ControlStroke (control/controlLine) instead of Card resources; 12px outer margin. - ChatThread/ChatBubble: user bubble uses the softer accentSubtle (AccentFillColorSecondaryBrush) with a hover Copy; assistant bubble uses subtleHover fill + controlLine border, adds Read aloud, and max-width 720. Adds 3 tokens the system did not cover: control (ControlFillColorDefaultBrush), controlLine (ControlStrokeColorDefaultBrush), accentSubtle (AccentFillColorSecondaryBrush). Preview hex only; code binds the resource keys. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: ac8d03a2-7198-43dc-8506-709986d6e1d3
…AppCli Reactor port of the design system's ComposerPicker into the shipping composer: ReactorChatComposer.PickerButton now renders a bordered Fluent ComboBox (ControlFill fill, ControlStroke hairline border, primary-text value, right-aligned muted chevron pinned by a Star/Auto grid, radius 4, MinWidth 64, padding 12/8) instead of a borderless subtle button. Session/model/reasoning selection still opens the existing MenuFlyout of RadioMenuItems. design.json: add a winapp (WinAppCli, https://github.com/microsoft/WinAppCli) tooling reference to authority and a toolingSource on both the default WinUI 3 port and the Reactor chat override, since XAML and Reactor now build/package through winapp. Update the composer chevron contract test to assert the ComboBox styling. Remove em dashes from the Colophon pointer block in AGENTS.md so the repo doc validator (no em dashes in user-facing docs) passes. Validation: build.ps1 OK; OpenClaw.Shared.Tests 3989 passed; OpenClaw.Tray.Tests 2897 passed; design-system validators (componentsio/profileio/validateDesignDir) OK; rubber-duck review clean. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: ac8d03a2-7198-43dc-8506-709986d6e1d3
The bordered Fluent ComboBox port regressed the composer's session/model/reasoning selectors. Restore the subtle inline dropdown the surface is meant to ship: ReactorChatComposer.PickerButton goes back to a borderless, transparent button (SubtleFillColorTransparent resting, subtle hover/press, muted value + trailing chevron with a small right/up offset). Update the design system's ComposerPicker to the same subtle pattern (transparent fill, no border, muted text/chevron, gap/padding tokens 1/2) and rename the contract test to ReactorComposer_StylesPickersAsSubtleDropdown. The WinAppCli port authority (design.json) is unchanged. Validation: build.ps1 OK; OpenClaw.Shared.Tests 3989 passed; OpenClaw.Tray.Tests 2897 passed; design-system validators OK. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: ac8d03a2-7198-43dc-8506-709986d6e1d3
This PR is design-system seeding only. Restore src/OpenClaw.Tray.WinUI/Chat/ReactorChatComposer.cs and tests/OpenClaw.Tray.Tests/ChatTimelinePresentationTests.cs to their main state, removing the composer picker code port entirely. The design system (.agents/design/*) still describes the subtle inline dropdown that the app actually ships, and design.json keeps the WinAppCli port authority. No production code or tests are changed by this PR. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: ac8d03a2-7198-43dc-8506-709986d6e1d3
Update the ChatComposer sample values and placeholder to mirror the real Reactor composer (Message Assistant placeholder; Main session / Claude Sonnet 5 / Default pickers), and note that a picker with a single option (the session picker with one session) renders disabled so its label reads lighter than its enabled neighbours. Design data only; no code or token changes. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: ac8d03a2-7198-43dc-8506-709986d6e1d3
The ComposerPicker and the chat icon/send/copy buttons rendered with the browser default button bevel in the Colophon preview because they were the only authored el:button nodes without the canonical ds-btn reset class (border: 1px solid transparent). Adding it drops the retro OS chrome so the subtle borderless pickers render as intended; inline appearance still drives radius, color, and the Send accent fill. Design-only, no production changes. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: ac8d03a2-7198-43dc-8506-709986d6e1d3
The composer pickers and toolbar icon buttons ship as WinUI subtle DropDownButtons / transparent Buttons (SubtleFillColorTransparent rest, SubtleFillColorSecondary hover, SubtleFillColorTertiary press, ControlCornerRadius, TextFillColorSecondary glyph) - verified against the canonical ReactorChatComposer PickerButton and WinUI Fluent resources. In the web preview these were rendering as native <button>s (browser chrome plus the ds-btn web button weight), which read as Fluent-web rather than Fluent-Windows. Represent them as role-annotated elements so the transparent WinUI rest state shows cleanly; only the filled primary Send stays a real button. Notes now name the WinUI control and resource ladder explicitly. Design-only, no production or test changes. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: ac8d03a2-7198-43dc-8506-709986d6e1d3
The composer message input was a raw <textarea>, so the preview showed the browser's default field border. The design intent is a borderless, transparent WinUI TextBox (the hairline border belongs to the outer control panel, not the input). Render it as a borderless contenteditable textbox (role=textbox) showing the muted placeholder, so no field border shows in any theme, while keeping it typeable. Design-only, no production or test changes. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: ac8d03a2-7198-43dc-8506-709986d6e1d3
Clicking the composer input showed the browser's :focus outline ring, a web-Fluent artifact that only appeared because contenteditable made the div focusable. A Windows Fluent TextBox has no such ring. Render the preview input as a non-focusable role=textbox div (drop contenteditable) so no focus outline shows on click, keeping the static borderless rest-state representation. The real focus cue (accent underline) ships on port. Design-only. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: ac8d03a2-7198-43dc-8506-709986d6e1d3
Interactive editability is the point of the web preview, so keep the composer input contenteditable (typeable). The browser's :focus outline ring that shows on click is a web-Fluent artifact the static renderer cannot suppress from design-only JSON (appearance has no outline key; raw style attrs are rejected). Document that caveat and route the fix (suppress web outline / show a Windows accent-underline focus cue) to the Colophon extension, tracked in karkarl/colophon#14. Design-only. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: ac8d03a2-7198-43dc-8506-709986d6e1d3
…ickers Re-express the chat composer's borderless input, subtle picker/icon buttons, and picker flyout using the schema-pure interaction keys (control/states/on) from the colophon #16 components schema, replacing the earlier focus-ring-routing workaround. No raw CSS; all tokens bind to design.json. - ComposerPicker root is now a real transparent button: control.chrome none removes the web button border, control.focus supplies the Windows accent focus rectangle, and states carry WinUI subtleHover/subtlePressed plus a disabled shade. on.click opens a representative single-select ComposerPickerOptions flyout (targets take no props). - New ComposerPickerOptions component: WinUI RadioMenuItem-style flyout on a surface sheet with md radius/shadow. - chat-composer-input renders borderless and typeable with an accent underline on focus (control.chrome none + control.focus underline), dropping the web focus ring. - The four subtle icon buttons (add context, dictate, read aloud, chat settings) become real buttons with transparent rest state and WinUI hover/pressed/hoverPressed states. - Notes refreshed to describe the real button + control model and drop the obsolete combobox-div and web-ring caveats. Design-only: no production or test files touched. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: ac8d03a2-7198-43dc-8506-709986d6e1d3
Replace the radio-dot selection indicator in ComposerPickerOptions with a reserved leading glyph column that renders an accent checkmark on the selected row, matching WinUI RadioMenuItem selection. Preserves menuitemradio/aria-checked semantics. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: ac8d03a2-7198-43dc-8506-709986d6e1d3
Use the Fluent icon CheckMark (U+E73E) in the Segoe Fluent Icons font for the selected ComposerPickerOptions row instead of a generic Unicode check, matching WinUI menu selection glyphs. Document the icon font as an 'icon' typography family (SymbolThemeFontFamily provenance); the glyph keeps its accent color token-bound and applies the icon font via a font-family-only raw style, since the token appearance.fontFamily is capped to display/body/mono. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: ac8d03a2-7198-43dc-8506-709986d6e1d3
Summary
Seeds a fresh v3-schema Colophon design system into
.agents/design/for the OpenClaw Windows Hub app, carrying over the design decisions from the earlier v1 seed (PR #962, closed/unmerged) and re-expressing the component patterns in the updated v3 schema. Branches offmain.This PR is design-system seeding only. It adds
.agents/design/*and the idempotent Colophon pointer block in repo-rootAGENTS.md. No application code, tests, or build files are modified.What's here
design.json— carried over from the v1 seed (tokens format is unchanged in v3): Fluent color tokens (each with itsresourceThemeResource key + light/dark/highContrast themes),authorityport targets, brand, typography, spacing, radii, shadows, principles. Preview hex is preview-only; shipping code binds the Fluentresourcekeys. Now carries 15 color tokens (12 from the v1 seed +control/controlLine/accentSubtlefor inputs/chat) and a WinAppCli entry in the portauthority(see below).principles.md— carried over verbatim from the v1 seed.components.jsonc— 10 components authored to v3 (meta.version: 3): Button, Field, Card, Badge, ComposerPicker, ComposerPickerOptions, ChatBubble, ChatComposer, ChatThread, ExampleScreen. Every raw-CSSattrs.stylestring is replaced with semantic, token-boundlayout/position/appearance. Every object node has a stable uniqueid. WinUI-provenance and Reactor-port notes are preserved; ExampleScreen uses a v3 freeform status board to exercise absolute positioning alongside Auto Layout.colophon.jsonc— new v3 presentation profile (schemaVersion: 1,extends: "colophon/default") mapping OpenClaw tokens to theme roles for light + dark, brand, navigation, and component template config.AGENTS.md— idempotent Colophon pointer block; em dashes removed so the repo doc validator (no em dashes in user-facing docs) passes.Chat components reconciled to the shipping Reactor UI (design data only)
The chat entries in
components.jsoncdescribe what the app actually ships today, so the design stays in sync with the implementation:SubtleFillColorTransparent), hoversubtleHover/ presssubtlePressed,mutedvalue text with a trailingmutedchevron,smradius, gap/padding tokens1/2. Opens a flyout of single-select options in-app (Reactor port note).control/controlLinewith a 12px margin; note documents the Send↔Stop toggle.accentSubtlewith a hover Copy; assistant bubble usessubtleHoverfill +controlLineborder with a Read-aloud footer andmax-width720.resourcekeys):control→ControlFillColorDefaultBrush,controlLine→ControlStrokeColorDefaultBrush,accentSubtle→AccentFillColorSecondaryBrush.Composer input + pickers use the colophon #16 interaction model (design data only)
The composer's input, subtle buttons, and picker flyout are expressed with the schema-pure interaction keys (
control/states/on) from the colophon #16 components schema, so the preview matches Windows Fluent (not Fluent-web) behavior with no raw CSS:chat-composer-input(acontenteditabletextbox) setscontrol.chrome: noneto drop the web button/input border andcontrol.focus: { kind: underline, color: accent }for a Windows accent underline on focus instead of a web focus ring. It stays selectable and editable in the canvas.buttonelements with a transparent rest state ($none),control.chrome: none+control.focusoutline, andstatescarryingsubtleHover/subtlePressed(hover / pressed / hoverPressed). ComposerPicker also gets adisabledshade for single-choice selectors.on: { click: { open: "ComposerPickerOptions" } }opens the new ComposerPickerOptions component, a WinUI RadioMenuItem-style single-select flyout on asurfacesheet withmdradius/shadow. Flyout targets take no props, so it is a representative shared model list; the real per-picker option sets are a Reactor port note.WinAppCli in the port authority (design data)
Per the maintainer, XAML and Reactor now build/package through winapp (WinAppCli, https://github.com/microsoft/WinAppCli).
design.json'sauthoritygains atoolingdescriptor and atoolingSourceon the default WinUI 3 port and the Reactor chat override. This is design-system metadata about how the design ports to code; it changes no code. The design→codesyncSourcereferences (win-dev-skills / microsoft-ui-reactor) are unchanged.px → token approximations (worth a human eye)
Raw WinUI pixel padding snapped to the nearest 4px token, each recorded in the component
note: ButtonButtonPadding11,5,11,6 →3/1(MinWidth 100= port note); FieldTextControlThemePadding10,5,6,6 →2/1(MinHeight 32= port note); Card 16,12 →4/3(exact). Chat bubble/composermax-width/min-heightgrowth values have no token equivalent and remain Reactor port notes. The 3 input/chat tokens' preview hex are approximations of the real Fluent brushes; shipping code binds theresourcekeys, so the hex is preview-only.Required proof pools
none— this PR only adds framework-agnostic design-system data files under.agents/design/plus theAGENTS.mdpointer. No shipping UI, MCP, node, setup, pairing, or gateway code changes, so the app-behavior proof pools indocs/PROOF_POOLS.mddon't apply.Validation
Validated against the Colophon extension's own read-only validators (
componentsio.mjs,profileio.mjs,validate.mjs):components.jsoncparses atmeta.version: 3;validateComponentsDoc(doc, { tokens })passes (allappearance/states/controltoken refs, including the 3 new tokens, resolve againstdesign.json; everyon.click.opentarget resolves to a defined component); all 10 componentsexpandInstancesuccessfully; guard confirms no raw"style"attrs remain.colophon.jsonc$schemamatchesPROFILE_SCHEMA_URL;validatePresentationProfilepasses.validateDesignDir('.agents/design')→ ok: true, 0 errors, 0 warnings.mainmerge-base, this branch changes only.agents/design/*andAGENTS.md(verified viagit diff --stat). No C#, test, or build files are touched, so repo build/test suites are not applicable to this change.Real behavior proof
The design system renders in the Colophon canvas from these files; the extension validators above exercise the same parse/validate/expand path the canvas uses. No runtime app behavior changes in this PR.
Co-authored-by: Copilot App 223556219+Copilot@users.noreply.github.com