Commit graph

2069 commits

Author SHA1 Message Date
Danila Poyarkov 8c31d5ed87 feat(figma-api): expose vector paths and modes
- Return SVG path data for imported vector geometry

- Report explicit and inherited variable modes on node proxies
2026-07-22 15:07:20 +03:00
Danila Poyarkov 7124d0045f fix(cli): populate lazy FIG pages
- Populate requested pages for scoped reads and all pages for document-wide operations

- Export whole FIG documents by default while keeping explicit page exports partial
2026-07-22 14:56:58 +03:00
Danila Poyarkov 072c159fdb fix(fig): preserve independent bound padding
- Treat leading-edge variable bindings as independent padding values

- Serialize trailing padding when raw layout metadata would collapse it
2026-07-21 10:49:54 +03:00
Danila Poyarkov b61957dff9 fix(fig): preserve swapped instance appearance
- Copy component visual and clipping properties during imported swaps

- Keep placed bounds and size-variable bindings authoritative
2026-07-21 10:30:58 +03:00
Danila Poyarkov 8561d73eaf fix(demo): restore showcase validation
- Replace nested tone branches with a typed color map

- Cover the rebuilt component library and analytics demo
2026-07-21 02:32:03 +03:00
Danila Poyarkov f6e4dd4c83 fix(fig): preserve derived instance geometry
- Keep placed instance bounds authoritative over root symbol overrides

- Reject size-only positions outside the target parent

- Avoid applying constraint scale twice to derived vector paths
2026-07-21 02:31:44 +03:00
Danila Poyarkov 0ef64fea3a Merge branch 'demo-showcase'
Rebuild the demo as a cohesive product showcase:
- Component Library: Button/Badge/Avatar/Nav/Toggle as real components
- App — Analytics: a modern dashboard assembled from instances with real
  auto-layout and semantic variables, teaching the OpenPencil workflow
- Correct stat badge tones and component captions
2026-07-21 02:13:52 +03:00
Danila Poyarkov 56f99cbc47 feat(demo): correct stat badge tones via recorded fill overrides
Apply success/accent/danger tones to the stat badges after layout with the
label fill recorded as an override, so component sync preserves them.
Badges now read +14% green, +8% blue, -3% red.
2026-07-21 02:13:22 +03:00
Danila Poyarkov bc2beeea22 feat(demo): tighten component library with captions
Shrink the library section to fit its content and label each component so
the library-to-app relationship reads clearly.
2026-07-21 01:55:11 +03:00
Danila Poyarkov 96de4e5fdb fix(fig): preserve regenerated override lineage
- Remap descendant clone sources when instance branches are repopulated

- Keep same-name component-property siblings distinct

- Name swapped variants after their component sets
2026-07-21 01:51:27 +03:00
Danila Poyarkov 3597c9382c feat(demo): rebuild as cohesive product showcase
Replace the grab-bag demo (3 disconnected feature boxes) with a real product
screen that teaches the OpenPencil workflow by example:

- Component Library: Button (primary/secondary), Badge, Avatar, Nav item,
  Toggle as actual COMPONENTs
- App — Analytics: a modern dashboard assembled from INSTANCEs of those
  components, laid out with real auto-layout (sidebar, stat row, chart,
  callout), themed via bound semantic variables
- Single restrained palette (one accent + surfaces/text/semantic tones)
- Instance text set with recorded overrides so component sync keeps labels

Editing a variable re-themes the screen; resizing frames demonstrates live
auto-layout reflow.
2026-07-21 01:48:15 +03:00
Danila Poyarkov 584400e017 fix(fig): preserve variable references on export
- Reuse imported collection, mode, and variable GUIDs when safe

- Keep raw paint asset refs instead of promoting incomplete library bindings

- Retain GUID conversion only for effect aliases required by Kiwi
2026-07-21 01:16:37 +03:00
Danila Poyarkov 74d662d560 fix(fig): target nested instance overrides
- Resolve repeated descendants through source-component paths

- Replay property overrides after component swaps stabilize

- Preserve clone lineage for property-only synchronization
2026-07-21 01:16:17 +03:00
Danila Poyarkov e704343f13 fix(fig): honor node-scoped variable modes
- Import and round-trip per-node variable mode overrides

- Resolve fill and stroke aliases through the nearest mode scope

- Preserve mode maps across cloning and instance synchronization
2026-07-21 00:23:00 +03:00
Danila Poyarkov 9db46f919b test(typography): refresh formatting snapshots 2026-07-20 22:40:43 +03:00
Danila Poyarkov 00d80f3bdc fix(automation): keep expected bridge closures quiet
- Reconnect after normal closures without reporting them as browser errors
2026-07-20 22:40:43 +03:00
Danila Poyarkov e029bebd1c docs: note text creation and rendering fixes 2026-07-20 22:21:29 +03:00
Danila Poyarkov adffdd791c fix(automation): reconnect after bridge closure
- Retry normal WebSocket closures unless disconnect was intentional
2026-07-20 22:19:27 +03:00
Danila Poyarkov 72dee43e44 fix(text): share fonts across canvas layers
- Register loaded faces with both scene and overlay renderers\n- Keep provider registration state isolated per CanvasKit provider
2026-07-20 22:19:27 +03:00
Danila Poyarkov a9c44afc20 refactor(properties): static section titles and headerless font-feature toggles
- Section titles are no longer collapsible triggers — they render as static
  text like Figma, so clicking a section header no longer collapses it
- Drop the 'Font features' group title; ligature/kerning toggles sit
  directly in the Typography flow
- Update panel specs and snapshots for always-expanded sections
2026-07-20 22:11:45 +03:00
Danila Poyarkov f3fbc94abf feat(text): create text boxes by dragging 2026-07-20 21:22:30 +03:00
Danila Poyarkov 6a0009b25c refactor(typography): prioritize formatting and de-jargon font features 2026-07-20 21:22:30 +03:00
Danila Poyarkov 5b0aae09ac fix(typography): give Text formatting buttons a field background
The B/I/U/S toggle buttons were borderless ghosts while the alignment
controls used a filled segmented container. Wrap them in the same
bg-panel-field container so both toggle groups share one visual style.
2026-07-20 21:02:57 +03:00
Danila Poyarkov a450f7fd87 style(layout): format grid pattern handler 2026-07-20 20:51:51 +03:00
Danila Poyarkov e6b28f1806 test(typography): refresh grouped controls snapshot 2026-07-20 20:50:04 +03:00
Danila Poyarkov d26f04d279 fix(typography): strengthen OpenType group hierarchy
Weight alone (400 vs 600) barely registers at 11px. Recess the toggle items
to 70% opacity so the bright semibold group label stands out clearly.
2026-07-20 20:48:31 +03:00
Danila Poyarkov d21dd13d95 fix(typography): distinguish the OpenType group label from its items
The group header and the toggle rows under it shared the same muted 11px
style, flattening the hierarchy. The OpenType features label is now
semibold surface text while items stay muted.
2026-07-20 20:43:01 +03:00
Danila Poyarkov 2fb6792aa9 fix(layout,typography): restore vertical gaps between control groups
- Layout: gap between the Resizing segmented control and the W/H size fields
- Typography: breathing room between OpenType feature toggle rows and above
  the Text formatting toolbar
2026-07-20 20:29:45 +03:00
Danila Poyarkov 142dbb9647 fix(typography): clear property grouping via spacing ratio
Within-group label→field stays 4px; between-group margin rises from 6px to
12px so each property reads as a distinct unit instead of merging into a
continuous column. Matches Figma's grouping structure without removing the
labels.
2026-07-20 18:30:50 +03:00
Danila Poyarkov 2086bcc3d7 test(app): isolate clipboard notification state 2026-07-20 18:24:32 +03:00
Danila Poyarkov 2348b1c972 test(app): stabilize final interaction coverage
- Isolate the Copy/Paste submenu scenario from prior context-menu state
- Close shared fixture pages safely when a project-level skip bypasses setup
- Refresh the reviewed typography panel snapshot
2026-07-20 16:34:16 +03:00
Danila Poyarkov cff46fbc50 fix(app): restore release validation coverage
- Keep the development MCP bridge alive until Vite shuts down
- Ignore empty host-font responses and cover current browser font policy
- Update interaction selectors, menu labels, resize accounting, and reviewed UI snapshots
2026-07-20 16:26:07 +03:00
Danila Poyarkov 49828cdac1 fix(ui): distinct field background at idle, not just on hover
Fields previously used a transparent idle fill (a misread of Figma, whose
inputs actually keep a visible fill at idle). Editable controls now read as
controls: idle fill #383838 (dark) / #f0f1f3 (light), one step up from the
panel, with a slightly stronger hover and the accent focus border.
2026-07-20 16:09:04 +03:00
Danila Poyarkov d06a8a7049 fix(i18n): translate layout grid controls 2026-07-20 16:07:05 +03:00
Danila Poyarkov 078aa03321 perf(fig): index component property passes
- Iterate assignment-bearing instances instead of rescanning the expanded graph
- Build clone indexes from the SceneGraph instance index
- Reuse static component property maps across convergence passes
2026-07-20 16:00:37 +03:00
Danila Poyarkov df41f60a26 perf(fig): restore large document load performance
- Populate only the first page during initial document reads
- Avoid duplicating immutable instance payloads and opaque source metadata
- Propagate derived text through source-ordered clone chains
2026-07-20 15:36:27 +03:00
Danila Poyarkov 25436249e4 fix(layout): consistent section add buttons and header descender clipping
- Move the Auto layout add/remove button from the section body into the
  section header actions, matching the Layout grid and every other section
- Drop leading-none on section titles so descenders ('g' in 'Layout grid')
  are not clipped by the 32px header band
2026-07-20 15:33:11 +03:00
Danila Poyarkov b17467cdb4 Merge branch 'text-resize-grids'
Wire two engine-supported features into the properties panel:
- Text auto-resize: a Resizing segmented control for text nodes (Auto width
  / Auto height / Fixed size) backed by the existing textAutoResize engine
- Layout grids: a full editor section for frames (pattern, count, gutter/
  section size, margin, visibility) using the existing canvas renderer
2026-07-20 15:11:42 +03:00
Danila Poyarkov efa784a039 feat(layout): layout-grid editor section
Add a Layout grid section for frames/components with pattern (columns/rows/
grid), count, gutter/section size, and margin, plus visibility and remove
actions. The canvas already rendered layout grids from imported files; this
wires creation and editing through the standard panel list pattern with
undo support and icon+tooltip pattern options.
2026-07-20 15:09:28 +03:00
Danila Poyarkov 14d4a17a33 feat(layout): text auto-resize control in Layout section
Surface the engine's textAutoResize as a Resizing segmented control for
text nodes, mapping Figma's three modes: Auto width (WIDTH_AND_HEIGHT),
Auto height/wrap (HEIGHT), Fixed size (NONE). Icon + tooltip options match
the panel's segmented-control language. The engine already reflows text on
content changes; this wires the control to it with undo support.
2026-07-20 14:21:12 +03:00
Danila Poyarkov cf857dbf80 fix(text): preserve local font rendering (#395)
- Reject text pictures captured before the current font generation
- Keep text visible when CanvasKit must synthesize a missing italic face
2026-07-20 14:07:47 +03:00
Danila Poyarkov 721b7b2191 test(ui): keep runtime theme import dependency-safe 2026-07-20 14:07:32 +03:00
Danila Poyarkov 1c9e0e4fba docs: consolidate unreleased changelog 2026-07-20 14:07:11 +03:00
Danila Poyarkov 11de539087 Merge branch 'ui-polish'
Comprehensive UI polish: unified design tokens, transparent-idle fields,
24px/11px control density, banded section headers, shadow-elevation for
floating surfaces, dropdown scroll affordances, segmented-control and
icon-button consistency, accessible names for icon buttons, and a ruler
light-theme fix. Updates panel snapshots and adds a theme regression test.
2026-07-18 10:56:24 +03:00
Danila Poyarkov e00ba55bc4 test(ui): update panel snapshots for the new control density and add ruler theme regression
- Update design/properties panel snapshots for the 24px control height and
  section header bands, and the appearance field test to expect 24px
- Add a light-theme regression test asserting the canvas ruler theme tracks
  the active theme tokens instead of staying on the dark fallback
2026-07-18 10:55:51 +03:00
Danila Poyarkov 965f206991 fix(a11y): add accessible names to icon-only buttons
Layer lock/visibility actions, toolbar tools, tool flyout triggers, and
the app UI toggle rendered icon-only buttons with no accessible name, so
screen readers and role-based selectors could not identify them. Each now
exposes an aria-label from the existing i18n/tool labels.
2026-07-18 10:37:26 +03:00
Danila Poyarkov f365f30f06 fix(ui): chrome polish — menubar contrast, menu/tab/tooltip type scale
- Menubar items render in surface text instead of muted (looked disabled),
  at the 11px UI scale
- Menu items, document tabs, and tooltips normalized to 11px to match the
  panel type scale; menu items use the 5px control radius
- Share button uses the control radius and 11px; presence popover drops its
  border for the floating shadow
2026-07-18 10:16:49 +03:00
Danila Poyarkov 3bfeef7c97 fix(ui): segmented control track no longer reads as a filled bar
The segmented-control root used the field recipe, so text-alignment and
vertical-alignment toggles rendered as one heavy dark bar. The root is now
transparent at idle with a hover wash, and only the active segment carries
the subtle fill — matching Figma's segmented-toggle appearance.
2026-07-18 09:56:47 +03:00
Danila Poyarkov 5d9645fead feat(ui): section header bands and dropdown polish
- Section headers become full 32px bands (title + trailing actions
  vertically centered) instead of an 11px line crammed against fields,
  giving each section a clear structural band like Figma
- Select dropdowns adopt the floating-surface elevation (12px radius, no
  border, deep shadow), 24px flush items, and scroll up/down buttons for
  long lists (blend modes)
- Font-settings gear trigger drops its hardcoded dark bg+border for the
  ghost icon-button recipe
- Segmented-control active state uses neutral hover fill instead of the
  blue-grey selection color
2026-07-18 09:41:32 +03:00
Danila Poyarkov f1af81962c feat(ui): shadow-elevation for floating surfaces and blend-mode fit
- Menus, popovers, dialogs, tooltips, and the toolbar drop the hard 1px
  border for the established deep floating shadow (0 8px 30px /40%) and a
  unified rounded-xl, so overlays read as floating rather than outlined
- Appearance section pairs Blend mode with Opacity on a 7fr/5fr grid so
  'Pass through' no longer truncates at the denser 24px control height
- Normalize AppSelect text to 11px to match the panel type scale
2026-07-18 08:51:28 +03:00