feat(ui): Catppuccin themes (View > Theme, command palette); use the masi/craft-libs fork #9

Closed
masi wants to merge 0 commits from debrand into main
Owner
No description provided.
masi added 35 commits 2026-10-20 15:57:51 +00:00
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
set_variables/get_variables with var(--name) fills that follow and undo; create_component,
create_instance, get_components and <x-paper-instance> with automatic overrides;
<x-paper-icon>, search_icons and paper-rs-cli icons add/list/search (Lucide, Tabler, Phosphor,
Heroicons, Material Symbols from npm, licences kept).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Product, crate and binaries are now PaperCraft/papercraft (papercraft-cli, papercraft-mcp);
projects, icon sets and theme in the old paper-rs locations are still read and .paper-rs files
still open. set_variables {mode} and set_variable_mode switch whole themes; lint_design checks
contrast, type scale, 4px grid, touch targets, layer names and hard-coded colors; get_variables
exports css/json tokens; the sidebar gets a Design tab for variables, modes and components.
New app icon, README, docs, ROADMAP and agent skills.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Feedback: notes on layers (inspector box, amber badges, get/add/resolve_feedback, openFeedback in
get_basic_info). Canvas selection unfolds and scrolls the layers panel. box-shadow renders; set_tokens
adds non-color tokens substituted into var(--name) values; table/tr/td lay out as flex rows;
x-paper-instance takes component="Name" and overrides='{"Layer":"text"}'.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The relay (--data <dir>) stores shared projects under /p/{token}; every shared
project polls it and reconciles files through crate::vfs. Home screen gets
Share, Join shared, copy link and stop sharing.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
WebGPU rejects textureSample under non-uniform control flow (the branch on the
per-fragment kind), which left the canvas pipeline invalid and made the first
editor frame fail with Queue.Submit: Invalid CommandBuffer. Take dpdx/dpdy before
the branch and use textureSampleGrad; mip selection is unchanged.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Dockerfile builds the wasm bundle and papercraft-relay, which serves the app, the
agent relay and shared projects (--data on a PV). craft-libs is a private git
dependency, so the build takes host-vendored crates as a build context.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
papercraft-relay --library lists every project in --data at /library and lets a
project be deleted (moved to .trash, kept on disk). A device that opens the site
joins the projects it lacks and shares its local ones, through the existing sync
loops. A deleted project answers 410 and lands in the other devices' trash; one the
server forgot (404 after it had synced) is kept locally and shared again, so losing
the server's disk never deletes anyone's work. Share controls are hidden in library
mode. Meant for a network-bounded, single-user deployment: there are no accounts.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Import and export the OpenDesign design-system package format
(manifest.json + tokens.css + DESIGN.md, schema od-design-system-project/v1).

:root hex colors become variables, [data-theme="x"] blocks become modes and
every other value becomes a token. Two MCP tools: import_design_system
(project-wide, one undo step) and export_design_system (writes the three
files). New Tx::set_design_system keeps the replace in a single undo step and
moves or drops the fills that follow a variable.

Format reimplemented from the published description of nexu-io/open-design
(Apache-2.0); no upstream file copied, attribution in THIRD_PARTY.md.
Verified against the real bundled OpenDesign package: import -> export ->
re-import round-trips byte-stable.
Port the OpenDesign Critique Theater 5-panel contract into PaperCraft:
critic .4 / brand .2 / accessibility .2 / copy .2, designer weight 0,
composite threshold 8.0, max 3 rounds, ship_best fallback, and the
Shipped / Below threshold / Timed out / Interrupted / Degraded statuses.

lint_design and verify_code findings are hard evidence: an error caps the
owning panel at 3.9, a warning at 6.9, and the cap lifts once the finding
is gone. Contract inspired by nexu-io/open-design (Apache-2.0), written
against PaperCraft's own tools.
What OpenDesign ships, which parts are portable file formats and which are
Electron/Next.js-bound, what has landed here, and the ranked candidates for
the next slices (direction presets, craft rulebooks, question-form, pixel
diff wiring, plugin manifest reader).
masi added 1 commit 2026-10-21 02:52:52 +00:00
Floating rounded panels, a shared component kit (buttons, chips, toggles,
selects, sliders), Lottie icon motion ported from NotesCraft, a remade home,
settings, command palette, confirm dialogs, updater, Present mode, and
History / Comments / Agent side views with saved versions.

Inspector gains Design/Prototype tabs, a drop-shadow Effects section and
prototype links that Present mode follows on click. Narrow windows keep the
canvas usable. Spec output (get_design_spec) now covers icons, svg, sizing
limits, tokens and component instances; adds a delete_pages tool.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
masi added 1 commit 2026-10-21 03:15:54 +00:00
History: saved versions now work in the browser too (kept in the virtual
file system) and can be renamed. Comments: Open/Resolved/All filters, reopen
and delete. Agent: copy-agent-URL button, clear log, failed calls shown in
red; the browser build logs agent calls as well. The inspector's Export "+"
keeps export settings as one-click presets.

Web: the library probe no longer leaves Join shared / Share hidden after a
reload, the share dialog is a modal in the new style, the menu bar folds into
one "Menu" button when the canvas is narrow, the Updates page and empty-home
text no longer talk about native-only things. Verified in Chromium against
papercraft-relay: share, join by link, edits syncing both ways with the
native app.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
masi added 1 commit 2026-10-21 03:20:35 +00:00
masi added 1 commit 2026-10-21 03:38:24 +00:00
Shared projects: when both a folder and the relay changed the same page since they
last agreed, the page is merged (objects by key, nodes by id, child lists as sets,
clashing new ids renumbered) against a base copy kept in .sync-base/, instead of
the last writer winning.

UI: animated "agent is working" pill and canvas glow, layer rows pop in, Settings
gets an interface scale, the toolbar dock stays inside the canvas, the duplicate
header gear is gone in the floating layout, the folded menu is one flat list,
Windows keeps rounded corners and the system shadow without a native frame.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
masi added 1 commit 2026-10-21 03:45:17 +00:00
- docs/shared-libs.md: what PaperCraft and NotesCraft carry twice and the order to move it into craft-libs.
- docs/feature-ideas.md: ranked ideas, done and next.
- skills/papercraft: references/compact-workflow.md (pages and groups, compressing, design-code sync, few tokens, shared work).
- Command palette: Interface scale entries.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
masi added 1 commit 2026-10-21 03:48:07 +00:00
masi added 1 commit 2026-10-21 03:55:09 +00:00
masi added 1 commit 2026-10-21 03:56:08 +00:00
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
masi added 1 commit 2026-10-21 04:02:20 +00:00
masi added 1 commit 2026-10-21 04:06:02 +00:00
masi added 1 commit 2026-10-21 12:45:22 +00:00
masi added 4 commits 2026-10-21 18:00:31 +00:00
Group an agent's editing calls into runs. Each page is saved as an auto
version before the run first touches it. The Agent view lists runs and
opens a review (id-paired diff, grouped by frame) with per-change undo,
Revert run and Accept all. The canvas outlines added, changed and
removed layers during review, and a toast announces a finished run.
Runs persist under runs/ and are pruned to the newest 50.

Also fixes version restore dropping variable, mode and token changes,
and stops lint_design advertising readOnlyHint (fix: true edits).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
masi added 3 commits 2026-10-21 20:55:11 +00:00
Variables move to a project-level design.json: collections with their
own modes, slash groups, color/number/string/boolean types and aliases.
Pages keep a derived cache, every writer goes through one path, and a
change reaches every page in one undo step per page. Strokes, text
color, size, gap, padding, radius, font size, line height, opacity and
visibility can bind to variables. Projects migrate to version 2.

Components work across pages, and any file can publish itself as a
library that other files enable, update after review, or disable.

New Variables and Libraries modals, an Assets view grouped by name
prefix, variable pickers in the inspector, and a slimmer Design tab.

papercraft-cli runs tools in-process when the app is closed, with a
`shell` command for interactive sessions and scripts.

Also centres the sidebar footer and title bar text on their icons.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
masi added 3 commits 2026-10-22 01:43:22 +00:00
A Design | Chat layout (Cmd+J): a chat column next to the live canvas.
Agents run through PaperCraft's own tools, so agent runs, undo, review
and revert work as for any MCP client. The thread shows streamed text,
reasoning, tool cards grouped into steps, the agent's plan, approvals
for destructive tools, checkpoints with Restore to here, run cards and
usage. Chats are saved in the project under chats/.

Backends: Claude Code (claude -p stream-json) and Codex (codex exec
--json) with the app's MCP server, using their own logins; or any API
endpoint in Anthropic Messages or OpenAI Chat Completions format with a
key kept in the OS keychain. Settings > Chat configures them.

Also: the offline CLI no longer saves a camera fitted to a fake window,
and top-level shapes without a position go to the next free spot.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
masi added 3 commits 2026-10-22 08:37:32 +00:00
Chat: agents are found on the login-shell PATH, so apps launched from
the Dock see claude, codex and Homebrew CLIs. A generic Agent Client
Protocol backend runs OpenCode, Gemini CLI, Cursor, Pi (pi-acp) and
others from a data registry, plus custom agents; papercraft tools are
auto-approved only when announced and not destructive. New agent panel
and Settings > Chat layout, sign-in card, several @ selections, no
install instructions. Fixes Send silently doing nothing when the CLI
path was set in Settings.

Annotations: numbered notes with leader lines that explain a design.
Categories drive the look; templates (project default, per-page) choose
which kinds are used. Annotate tool (N), side view, Customize, inspector
section, Annotate with AI, view modes (Cmd+Shift+A). MCP: annotate
(batched), get/update/delete, get/set_annotation_template; notes appear
in get_design_spec and get_jsx and in agent-run review and revert.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
masi added 1 commit 2026-10-22 12:29:08 +00:00
masi added 1 commit 2026-10-22 12:33:03 +00:00
masi added 1 commit 2026-10-23 03:51:56 +00:00
masi added 1 commit 2026-10-23 04:03:25 +00:00
masi added 1 commit 2026-10-23 04:07:16 +00:00
masi added 5 commits 2026-10-24 22:06:30 +00:00
- Lazy project loading: the page in view first, the rest in the background;
  fix the endless repaint and memoise layer heights.
- Annotations: placement off screens, straight routing inside the target's
  screen, zoom-stable lines, badges below 60% zoom, Tidy, custom templates
  (upsert/delete_annotation_template).
- Chat: design-system digest each turn, Actions menu on a selection (fix lint,
  bind to tokens, use components, rename layers, agent prompts), Pick / area
  chips with crops, ⌥-click, ⌘K Ask, live agent outlines and counts, one run
  per MCP client with per-run revert, Stop shown as Stopped.
- MCP: set_viewport, viewport in get_basic_info/get_selection, screenshots
  with annotations, find_nodes substring search, get_tree_summary fullText,
  annotate tidy returns tidied count, not-an-instance lint.
- Fixes: write_html links cross-page components instead of copying them;
  instance roots keep their own layout when synced or swapped; CLI saves
  screenshots itself (the app writing to a removable volume froze it behind a
  macOS prompt), offline write lock, version check, --online.
- tools/install-local.sh installs the CLI and signs with a stable identity
  when present; Dockerfile adds the D-Bus packages the relay needs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Images: paste from the clipboard into the chat, thumbnails and a lightbox for
what is sent, image-only messages, attachments sent at 1568px with the
original kept for zoom_image.

Brief and finish: ask_user question cards (swatches, reference tiles, the
recommended answer), chat rules for a brief, design system first, density,
short reports and next steps.

Research: the composer's Web chip, fetch_reference_images (public addresses
only; icons, logos and backdrops dropped), a References gallery, and a Haiku
researcher sub-agent on Claude Code.

Image generation (opt-in): Codex, Google Flow (gf) or a custom command.

Plugins page: Avataaars, DiceBear, Iconify, Lorem Picsum, Flags and QR codes
through <x-plugin>; SVG import draws masked groups as images.

Tokens: lean Claude Code sessions, deferred tool schemas and context editing
on the API, a fresh session with a recap past 120k or on demand, per-turn and
chat totals, a 1M context meter, a turn budget, model and effort pickers.

Also: page switcher in Chat, no flicker while steps run, desktop target size
in lint, the installer keeps papercraft-mcp current.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
masi added 1 commit 2026-10-24 22:12:09 +00:00
The project, library asset and version rename fields asked for focus every
frame before checking `lost_focus()`. In egui 0.36 `lost_focus()` reads the
focus as it is at the call, so taking it back first hid Enter, Escape and a
click elsewhere: the field could not be left. Focus is now taken back only
while the edit goes on.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
masi added 1 commit 2026-10-24 22:42:36 +00:00
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
masi added 2 commits 2026-10-24 23:52:09 +00:00
- Code links on main components (import plus React and egui usage templates);
  linked instances export as library code and the AI spec lists them as
  library components instead of their layers.
- apply_ui_kit builds shadcn/ui, Ant Design, React Bits and egui kits; the
  chat brief asks for the code library and builds from its components.
- report_issue drafts and a Report a PaperCraft issue form file on the
  configured repository (keychain token or tea login), de-duplicated by title.
- design_rules looks up design-playbook rules through the playbook CLI; the
  brief asks whether to follow it.
- Top bar: project name and page picker on one centred row, so the bar no
  longer overflows onto the canvas.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
masi added 1 commit 2026-10-25 00:45:06 +00:00
- Claude Code chats get a Sonnet qa sub-agent that lints and screenshots
  built frames and returns only findings.
- delegate hands qa, read or build tasks to a helper agent CLI (pi with
  MiniMax M3.1 Flash, opencode, any command taking {prompt}) that drives
  PaperCraft through papercraft-cli; Settings, Chat, Helper. The chat's Stop
  button also ends a running helper and what it started.
- move_nodes to another page keeps component keys, relinks every instance
  and takes the moved nodes' annotations along; rename_file renames a
  project. Closes #10, closes #12.
- A nested instance swapped inside an instance is a swap override that
  survives edits to the outer main, copies and the code export. Closes #11.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
masi added 1 commit 2026-10-25 00:50:18 +00:00
Add (or Enter) while a turn works queues the message; it goes out with the
agent's next PaperCraft tool result for that chat, so every backend reads it
mid-turn. The composer shows each as Waiting or Seen; what no tool call
picked up is sent next when the turn ends, or returns to the box after Stop.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
masi added 1 commit 2026-10-25 01:04:39 +00:00
get_components uses, the design-system digest, the AI spec's instanceOf,
the component list in exports and set_code_link read a swapped nested
instance's swap target instead of its place in the outer main.

Test screenshots go to the build's temp folder; PAPERCRAFT_UPDATE_SHOTS=1
writes docs/screenshots as before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
masi added 1 commit 2026-10-25 01:26:18 +00:00
Auto (a composer chip) answers the questions a turn ends on with their
recommended options and goes on, until Stop or the turn budget; the agent
is told to put its recommendation first and default what only the user
knows. The Present button draws a play icon on the shared icon grid, and
the composer's Enter hint hides when the chips need the room.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
masi added 1 commit 2026-10-25 02:56:42 +00:00
masi added 1 commit 2026-10-25 03:08:22 +00:00
- PAPERCRAFT_HOME also holds the chat settings (/.config),
  so a test copy never touches the installed app's.
- get_computed_styles reports a text colour bound to a variable as
  var(--name). Closes #13.
- Composer chips wrap instead of running under Stop and Add; the agent pill
  drops its text when it would run under the top bar's buttons.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
masi added 1 commit 2026-10-25 03:22:28 +00:00
masi added 1 commit 2026-10-25 06:54:23 +00:00
- write_html fits an <svg> viewBox into its width and height. Closes #14.
- A note whose target sits straight in its artboard treats the artboard as
  the screen, so tidy keeps cards off it. Closes #15.
- not-an-instance needs the same icon, and its fix names the
  <x-paper-instance> to write. Closes #16.
- Instances with their own text re-measure it when the main changes.
  Closes #17.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
masi added 1 commit 2026-10-25 06:58:58 +00:00
lint_design warns on a border whose hex equals a color variable, and
fix: true binds it (stroke), so switching the variable mode reaches it.
Closes #18.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
masi added 1 commit 2026-10-25 15:21:14 +00:00
- Settings, Chat, Follow agents (on by default): the canvas pans and
  switches page to the layer any agent changes, in both modes.
- Claude Code and the API announce a tool call as it starts streaming
  (ToolDraft, ToolInput); the canvas shows a skeleton over its target, or
  where a new artboard goes, until it has run. New agent content comes in
  through a fading skeleton, so an outline never frames empty space.
- Top bar: the title and agent pill leave room measured from the right-hand
  buttons.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
masi added 1 commit 2026-10-25 15:33:50 +00:00
- A clipping frame draws its border after its children. Closes #19.
- border: ... var(--x) binds the stroke; reads show var(--x); find_nodes
  says when it stopped at 500. Closes #20.
- Hug frames grow around flex-grow children; a min height stays and the
  growing child fills it. Closes #21.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
masi added 1 commit 2026-10-25 15:44:50 +00:00
A frame's scroll flag (overflow: auto|scroll) keeps it fixed height and
clipped; the wheel over it scrolls its content, then pans when the content
ends. The offset is view state and flows through parent_origin, so hit
tests and overlays follow. Toggles beside each screen, on a selected frame
and for every screen on the page. Agents keep screens at their size.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
masi added 1 commit 2026-10-25 16:01:36 +00:00
Main components define properties; instances keep values as overrides, so
main edits keep them and definition changes re-apply everywhere. Enum
options use the overrides format and can restyle, retext, show, hide or
re-icon any layer. Templates: text, active (tab bars, navs), status.
set_component_props, set_instance_props, props= on <x-paper-instance>,
get_components lists them, {Prop} in code links, inspector controls.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
masi added 1 commit 2026-10-25 16:05:15 +00:00
A hug frame whose width comes from its parent kept the height measured
while its text was narrow (1404px instead of 84px). After arranging, a
stale hug child lays out again and the frame measures once more.
Closes #22.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
masi added 1 commit 2026-10-25 16:13:44 +00:00
merge_variants turns per-state components into one with an enum property:
variant differences by layer path become options, instances on every page
move to the base with their value, emptied variants are deleted. Absolute
children of a scrolling screen stay put while its content scrolls.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
masi added 1 commit 2026-10-25 16:20:30 +00:00
Such differences cannot be an option's changes and would be lost; the
variant stays as it was and the warning names the properties. A main's
own canvas position is ignored.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
masi added 1 commit 2026-10-25 16:29:11 +00:00
Layers a variant has and the base lacks are copied into the base hidden,
and that option shows them. Icons are compared as one unit. A base that
already has the enum keeps its options and gains the new ones; its
instances keep their values. Fewer than two mergeable variants changes
nothing. Removing a property clears its values on instances.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
masi added 1 commit 2026-10-25 16:38:11 +00:00
An empty base takes the variant's arrangement when it gains that variant's
layers, so a check lands centred like in the variant.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
masi added 1 commit 2026-10-25 16:49:09 +00:00
- Sync converted away an instance written over a nested one (older
  storage: its own root, no swap) and lost it; it now becomes a swap of
  the main's child at that place.
- The parser lowercases attribute names, so icon and plugin code never
  dropped the SVG's own viewBox; with the viewBox fit that scaled icons
  twice. Compare names without case.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
masi added 1 commit 2026-10-25 17:06:52 +00:00
masi added 1 commit 2026-10-25 18:46:15 +00:00
masi added 1 commit 2026-10-25 18:52:44 +00:00
An instance moved from a variant kept only its overrides, so texts that
came from the variant turned into the base's. They are restored now
(except state texts). A nested instance's property values (a badge's
Tone) are compared and become props in the options.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
masi added 1 commit 2026-10-25 18:58:04 +00:00
masi added 1 commit 2026-10-25 19:05:06 +00:00
A badge inside a row links to a layer of the row's main; its properties
live on the component that layer is an instance of. Follow the links.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
masi added 1 commit 2026-10-25 19:09:39 +00:00
masi added 1 commit 2026-10-25 19:21:26 +00:00
The properties modal gets a tab per property, a Table view (colour cells
pick project variables, visibility toggles, icon, image and text fields)
and a Source view with JSON highlighting, neutral styling and one text
size. Canvas overlays move below modals; segmented controls key ids by
their labels so two in one row both respond. The status template writes
known colours as variables.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
masi added 4 commits 2026-10-26 22:05:27 +00:00
get_design_spec {format:"compact"} renders one line per node with tokens used, kit
components, component definitions and notes; no reference code or per-node enforcement
prose. About 12x fewer tokens than the JSON spec (a 1440x960 screen: ~7k vs ~93k).

get_inventory returns every page's screens with a size class (mobile, tablet, desktop,
email, pdf-a4), component/instance/annotation counts, notes still marked `? (team)`,
every component and the token group sizes in one call.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
strip_token_declaration_blocks sliced rest[..n] on a byte index that could fall inside a
multibyte char; a screen whose labels say "Rótulo" took the app down mid-call. Regression test
with a ~10 KB multi-file React module.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
verify_code flagged every shadcn/Tailwind screen as hard-coded because it only looked for
var(--name) and --color-name in the code text.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
masi added 1 commit 2026-10-27 21:02:26 +00:00
Appearance: acrylic material with popup and modal backing, corner radius,
UI font (bundled DM Sans, Figtree, Fredoka, Geist, Nunito, Quicksand,
Varela Round), accent colour. Icons on buttons, code targets and agent
logos; redesigned fill/gradient and auto-layout rows; compact topbar.

Chat: agent logo in the header, history popup with search and recency
groups, new-chat button, issue outcomes saved with the chat and issue
bodies shown as fields, question cards with one-click answers, number
keys, an inline other-answer field and an answered state.

Layers: right-click context menu. Performance: virtualised layer reveal,
pruned hit-testing, glyph cache. Settings > Performance: FPS, frame time,
RAM, CPU and GPU overlay with a slow-frame warning.

MCP: compact spec writes bound strokes as variables (#23), lint contrast
averages gradient and translucent backgrounds (#24), lint flags light/dark
theme copies (#25).

Closes #23, closes #24, closes #25

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
masi added 1 commit 2026-10-28 01:55:48 +00:00
- Screens: frames can be declared screens or overlays (set_screens, inspector toggles,
  "Declare N screens"). Agent edits to layers hidden behind a drawer/modal in a screen
  are refused unless allowHidden; partly covered ones are reported. get_basic_info lists
  screens, get_node_info reports visibility, lint skips hidden layers, On click lists
  screens, nested screens get canvas labels. Spec in specs/screens.
- Pages and versions are stored as zstd-compressed compact JSON (.json.zst, format v3);
  legacy .json still reads and is replaced on save.
- Editor keeps a per-layer change log; the scene cache re-tessellates only changed layers
  and no longer keeps a copy of every node (less RAM).
- Canvas perf: zoom settle and LOD, 24-byte vertices, vsync-paced redraws, idle hover
  skip, malloc relief when idle, off-screen frame labels skipped, layer-panel heights
  memoized across frames, run recount on a background thread.
- Frame labels: no label on tiny frames, overlapping labels dropped, ellipsis.
- Selects: menu sizes to content (capped), path labels keep the name, scroll, tooltips.
- Settings: performance monitor page, agent logos, chat page scroll fix.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
masi added 1 commit 2026-10-28 01:57:46 +00:00
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
masi added 1 commit 2026-10-28 04:13:51 +00:00
- Drop the separate title bar: minimize/maximize/close sit at the toolbar's right,
  its empty middle drags the window (double-click maximizes). Home gets the same.
- Linux is undecorated too, with edge resize.
- Settings pages fill the modal height and scroll (Appearance rendered empty).
- Checkbox, toggle, select and the acrylic material now come from craft-ui.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
masi added 2 commits 2026-10-28 04:16:09 +00:00
The performance overlay showed n/a for RAM and CPU on Windows: the readings
existed only for macOS and Linux. They now come from GetProcessMemoryInfo
(working set) and GetProcessTimes (kernel plus user time).

The "Warn below" chips become "Refresh rate" and now go up to 144, 165, 240
and 360, for high-refresh monitors. The default stays 60.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The tab ran the design lint over every node, and scanned every node for open
comments, on every frame. On a 12.6k-node page that cost hundreds of ms per
frame (377 ms worst) while the tab was open. Both results are now kept per
(doc_stamp, active page); the open-feedback count of other pages refreshes once
a second.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
masi added 1 commit 2026-10-28 04:18:58 +00:00
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
masi added 1 commit 2026-10-28 11:55:40 +00:00
masi added 1 commit 2026-10-28 13:04:41 +00:00
masi added 2 commits 2026-10-28 15:25:54 +00:00
masi added 1 commit 2026-10-28 15:34:12 +00:00
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
masi added 1 commit 2026-10-28 15:40:37 +00:00
masi closed this pull request 2026-10-28 15:43:51 +00:00
masi deleted branch debrand 2026-10-28 15:43:52 +00:00

Pull request closed

Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: masi/papercraft#9