- Replace backslashes with forward slashes in noHandRolledColor and
noTypeofWindowCheck rules so file-path exclusions work on Windows
- Fixes Windows CI build failures where color.ts was incorrectly
flagged by no-hand-rolled-color
- Add save_file MCP tool that proxies to the browser app via RPC
- Add save_file RPC handler in the automation server
- Rebuild dist/ to fix stale @open-pencil/core/* self-referencing imports
from before the domain module restructuring
Fixes#184Closes#185 (save_file added; open_file requires File System Access API
which is browser-interactive; new_document needs a store reset method)
- Move clipboard-text-outlines.ts → text/opentype.ts
- Move kiwi/serialize-clipboard-v4.ts → text/clipboard-derived-text.ts
- Delete types-opentype.d.ts in favor of @types/opentype.js
- Add opentype.js to core package dependencies
- Add Vite alias for opentype.js ESM resolution
- Update all imports across core, kiwi, clipboard, and tests
* chore: remove unused pi context file
- Delete .pi/context.md
- Remove an unused local context artifact from the repository
* Add clipboard text v4 export
* fix(clipboard): rebase v4 export branch onto master
- Resolve conflicts after the core text module reorganization
- Fix clipboard text export imports and bundled font asset loading
- Update raw binary expectations for textUserLayoutVersion 4
- Re-run check and unit tests after the rebase
- Document semantic/conventional commit format in AGENTS.md with short subjects and detailed bodies
- Keep commit types lowercase, but start each commit body line with an uppercase word
- Add missing unreleased changelog entries from recent editor and UI fixes
- Tighten unreleased changelog wording to stay concise and user-facing
- Convert button, input, icon-button, toast, surface from flat-string
functions to slot-based { base: string } return pattern
- Convert section from bare TV exports to useSectionUI() with
{ wrapper, label } slots
- Remove standalone select helpers (selectTrigger, selectContent,
selectItem) in favor of useSelectUI()
- Delete use-component-ui.ts — no longer needed
- Update all 20+ call sites across property panels and chat components
Long localized labels like 'По содержимому' overflow the input.
Add sizingHugShort/sizingFillShort i18n keys with abbreviated
translations for all locales. Dropdown items keep full labels.
Replace the separate ScrubInput + AppSelect pair with a single
combined control: the sizing mode (Hug/Fill) shows as an inline
label inside the scrub input, swapping to a chevron on hover.
- ScrubInput: add group class and #suffix slot (stays generic)
- LayoutSection: embed reka-ui Select in the suffix slot with
group-hover toggle between label and chevron
The layout section was gated on node.type === 'FRAME', hiding it for
COMPONENT, COMPONENT_SET, and INSTANCE nodes that also support
auto-layout. Also use copyStyleRuns instead of structuredClone per
project lint rules.
styleRuns were updated on the graph during editing (via syncText) but
commitTextEdit only captured text changes. Now both text and styleRuns
are snapshotted at startTextEditing and restored on undo.
commitTextEdit compared prevText from the scene graph node, but
syncText already updates the node on every keystroke during editing.
This made prevText === newText, so the undo entry was never pushed.
Fix: capture the original text when startTextEditing is called and
use that snapshot for the undo comparison.
RECTANGLE is not a container type, so hit-testing and double-click
never recurse into its children. This prevented selecting the text
labels inside gradient cards by double-clicking on the canvas.
Matches Figma behavior: pressing Enter when a single TEXT node is
selected starts text editing mode and selects all text. Uses rAF
to defer text editing start so the Enter keydown event completes
before the textarea is created and focused, preventing the newline
from being inserted into the selected text.
Closes#181
Guard commitEdit against double invocation: Enter triggers commitEdit
which sets editing=false, removing the input via v-if, which fires
blur → commitEdit again. The second call read from a detached input
(empty value → 0), overwriting the correct value.
Fixes#181
* fix(acp): show install errors for missing agent CLIs (#172)
* Use npm for install commands, toasts for errors, tighten error matching
- Replace bun add -g with npm i -g (universal baseline)
- Replace initError inline banner with toast.show() (consistent with rest of app)
- Remove overly broad 'not found' / 'no such file' from isMissingCommandError
* Refactor toast API to toast.info/warning/error
- Rename panels.sizingFill → panels.fill for paint fill label (was
colliding with the sizing fill key) in all 6 locales
- Add 9 missing keys to de, es, fr, it, pl: clipContent, colorFormat*,
colorHint*, colorPreviewClipped
- Remove duplicate alignLeft/alignRight/alignTop/alignBottom keys from
ru.json (already covered by the canonical alignment keys)
* feat(i18n): Add Simplified Chinese (zh-CN) localization support
* feat(i18n): Update Simplified Chinese localization with additional alignment and color formatting terms
The kiwi binary encoder silently drops layoutWrap (flex-wrap) and
counterAxisSpacing (row-gap) because they were missing from the
schema definition. The serialize/deserialize code already handles
these values correctly — only the schema was incomplete.
Adds:
- StackWrap enum (NO_WRAP, WRAP)
- stackWrap field (476) to NodeChange
- stackCounterSpacing field (477) to NodeChange
- STRETCH value (4) to StackAlign enum
Fixesopen-pencil/open-pencil#165