Commit graph

2027 commits

Author SHA1 Message Date
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
Danila Poyarkov d8952eb515 refactor(ui): replace sizing design tokens with plain utilities
Drop the spacing/radius sizing tokens (--spacing-control, --spacing-panel-*,
--radius-panel) and their generated classes (h-control, px-panel-x, gap-panel,
rounded-panel, etc.) in favor of direct Tailwind utilities (h-6, px-3, gap-1.5,
rounded). Color tokens are kept since they drive dark/light theming.

Behavior-preserving: 24px controls, 5px radius, identical computed layout.
2026-07-18 08:35:32 +03:00
Danila Poyarkov 708152e33f fix(canvas): rulers follow the active theme
Rulers stayed dark in light theme because the canvas ruler theme was only
pushed to the editor store at theme-apply time, before any editor existed,
and the renderer fell back to a hardcoded dark color.

- Push the ruler theme to the active editor whenever it registers or the
  theme changes, via a reactive active-store ref (keeps the no-browser-
  globals-in-core boundary intact)
- Refresh the light ruler palette for proper contrast on the light canvas
2026-07-18 08:12:58 +03:00
Danila Poyarkov 64b7a106db feat(ui): accent underline indicator for properties tabs
- Selected Design/Code/AI tab now shows an accent underline instead of
  only a weight/color change, giving a clear active affordance
- Normalize tab text to 11px to match the panel type scale
2026-07-18 07:45:15 +03:00
Danila Poyarkov 55965ac556 feat(ui): confident selection and consistent panel headers
- Layer/page rows use the unified accent selection, 5px radius, airier
  1.5 padding, and 11px labels
- Panel headers (Layers, Assets, Pages) drop the uppercase tracked style
  for a single 11px/semibold/surface dialect matching section headers
- Segmented control md size uses 11px to match the rest of the panel
2026-07-18 07:40:06 +03:00
Danila Poyarkov 828a1a7ae4 refactor(ui): single field recipe and 11px panel typography
- input tone=default now uses panelFieldBase so every input shares the
  transparent-idle / hover-fill / accent-focus recipe (fixes divergent
  black inputs with stuck accent border, e.g. AI provider setup)
- Normalize field/select/number-field text to 11px; paint-field uses the
  shared transparent field recipe instead of bg-input + undefined shadow
- NumberField root sets 11px so the container no longer inherits body 13px
2026-07-18 07:37:28 +03:00
Danila Poyarkov a170a780da feat(ui): unify accent tokens and transparent-idle field colors
- Unify all blues to a single accent: panel-focus and panel-selected now
  derive from the brand accent instead of one-off #4c8dff / #0d64d8
- Make panel-field transparent at idle (hover/focus fill) for a quieter,
  Figma-grade properties panel; panel-field-hover becomes the intent fill
- Denser controls: --spacing-control 26px -> 24px, radius-panel 4px -> 5px
- Neutralize panel-selected-muted (de-blued) for inactive-pane selection
- Mirror the same structure in the light theme
2026-07-18 07:24:50 +03:00
Danila Poyarkov dd3161e44c test(app): isolate context menu interactions
- Close the menu before the next drawing interaction\n- Target the shape created by the preceding test state
2026-07-18 07:09:38 +03:00
Danila Poyarkov 1f22aa3207 fix(app): align layer rows and icon menus
- Let virtualized Layer rows fill the panel width\n- Remove extra root indentation while preserving hierarchy depth\n- Keep icon menu labels beside their icons\n- Refresh reviewed panel snapshots
2026-07-18 05:56:36 +03:00
Danila Poyarkov 33d6a1efd1 fix(app): align property item subcontrols
- Keep Fill and Effects settings inside their shared content rails\n- Use panel spacing tokens instead of ad-hoc offsets\n- Preserve selection when Escape dismisses overlays\n- Label the Font settings trigger for assistive technology
2026-07-18 05:44:52 +03:00
Danila Poyarkov 429a7e5ae2 fix(app): polish variable dialog states
- Restore the empty collection call to action\n- Fill the table width and prevent variable type hint clipping\n- Let dialogs and popup menus handle Escape before editor shortcuts
2026-07-18 05:25:40 +03:00
Danila Poyarkov e0d8efb2a4
Merge pull request #411 from open-pencil/figma-paste-images
fix(clipboard): fetch pasted Figma images on desktop
2026-07-18 05:04:49 +03:00
Danila Poyarkov 71cf3e5aa0
Merge pull request #410 from sadkodev/master
feat(keyboard): add Figma-style opacity shortcuts 1-9/0
2026-07-18 05:04:38 +03:00
Sadko 665e28cbaa
Merge branch 'master' into master 2026-07-17 22:03:09 -04:00
Danila Poyarkov c2812ba136 fix(tauri): preserve request and abort semantics
- Serialize bodies from the normalized Request, including Request inputs\n- Consume late transport failures after an already-aborted signal\n- Handle pre-aborted clipboard test requests
2026-07-18 05:02:51 +03:00
Danila Poyarkov d7a27a894c fix(app): preserve compact paint field sizing
- Keep embedded number fields from crowding color values\n- Cover paint-row geometry in property-panel E2E tests\n- Refresh the reviewed typography panel snapshot for visible variable actions
2026-07-18 04:57:48 +03:00
Danila Poyarkov 45d8cd51f5 Merge branch 'master' into review-pr-410-current 2026-07-18 04:40:38 +03:00
Danila Poyarkov a3127e716b refactor(tauri): share HTTP abort handling
- Make the desktop HTTP adapter honor standard AbortSignal cancellation
- Use AbortSignal.timeout directly for Figma batch and image requests
- Cover resolved, pre-aborted, and in-flight abort behavior
2026-07-18 04:40:15 +03:00
Danila Poyarkov 585b80d023 Merge remote-tracking branch 'origin/master' into review-pr-411-current 2026-07-18 04:36:06 +03:00
Danila Poyarkov fc5cc2d4b8 fix(app): align variable-enabled panel fields
- Keep Apply variable actions visible with restrained hover treatment
- Preserve the shared 26px NumberField height in column layouts
- Anchor variable pickers to their trigger instead of the zero-size contents wrapper
- Cover control dimensions, action visibility, and popover placement end to end
2026-07-18 04:35:52 +03:00
Danila Poyarkov 798a3c2b2c fix(editor): harden opacity shortcuts
- Match numeric keypad input by generated key so NumLock-off navigation remains available
- Coalesce buffered opacity updates into one undo interaction
- Add end-to-end coverage for digit composition, modifiers, and undo
2026-07-18 04:22:38 +03:00
Danila Poyarkov b08e199c85 fix(clipboard): finalize paste before image fetch
- Complete placement and undo registration before awaiting image hydration
- Bound Figma image requests with timeouts and use shared Tauri detection
- Localize missing-image notifications and cover stalled requests
2026-07-18 04:22:38 +03:00
Danila Poyarkov 5bcc44cc91 Merge branch 'master' into review-pr-410-current
# Conflicts:
#	CHANGELOG.md
2026-07-18 04:01:06 +03:00
Danila Poyarkov c8bbdbbb46 Merge branch 'master' into review-pr-411-current 2026-07-18 04:00:57 +03:00
Danila Poyarkov 86d6a63d0f fix(fig): restore strict parse validation
- Reject corrupt compressed Kiwi chunks instead of accepting raw garbage\n- Tolerate legacy source metadata without editedFields in renderer fallbacks\n- Align font, derived glyph, shared style, renderer mock, and ownership tests with current contracts\n- Restore clean quick and heavy unit quality gates
2026-07-18 03:58:18 +03:00
Danila Poyarkov 8ceda4d12f docs: close Fig package boundary track
- Describe complete Fig archive, conversion, instance, and metadata ownership\n- Refresh contributor paths across localized development guides\n- Mark Track D complete in the local master plan
2026-07-18 03:41:17 +03:00
Danila Poyarkov 8b9be17a56 perf(fig): remove large fixture bottlenecks
- Index component property definitions and variable asset references once per export or override context\n- Skip converged instance fill and text propagation and use native binary hex encoding\n- Add a non-populating parse mode for raw fixture validation\n- Reduce the Material 3 round trip from minutes to about twenty seconds
2026-07-18 03:37:58 +03:00
Danila Poyarkov 6c9ef9d103 fix(deps): patch collaboration websocket driver
- Pin websocket-driver 0.7.5 across the Trystero Firebase dependency chain\n- Restore a clean critical dependency audit\n- Reuse the shared font family/style shape exposed by scene-graph
2026-07-18 02:49:22 +03:00
Danila Poyarkov 85c3c8fad1 refactor(fig): own NodeChange export policy
- Move SceneGraph-to-NodeChange conversion, text payload assembly, and blob encoding into @open-pencil/fig\n- Inject core glyph outline lookup through an explicit runtime service\n- Centralize neutral font naming in scene-graph and retain core IO/runtime orchestration
2026-07-18 02:41:35 +03:00
Danila Poyarkov 02b7261c9e refactor(fig): own raw metadata invalidation
- Track normalized edited fields in SceneGraph without naming Figma payload fields\n- Preserve original raw provenance while filtering stale values through Fig-owned effective readers\n- Rewire export and renderer fallbacks and add package, SceneGraph, and exhaustive round-trip coverage
2026-07-18 02:22:01 +03:00
Danila Poyarkov 2bd2304bcb refactor(fig): own instance interpretation
- Move component properties, symbol overrides, derived symbol data, and clone synchronization into @open-pencil/fig\n- Add the public instance-overrides subpath with package tests and packed smoke coverage\n- Remove cross-package forwarding modules and enforce direct owner imports in architecture checks
2026-07-18 02:06:34 +03:00
Danila Poyarkov 22a160bfc3 refactor(fig): own NodeChange import conversion
- Move NodeChange-to-SceneGraph property and style-run policy into @open-pencil/fig\n- Share normalized font-style parsing and model defaults through scene-graph instead of duplicating literals\n- Preserve core compatibility exports while conversion callers migrate
2026-07-18 01:51:13 +03:00
Danila Poyarkov c2f3338877 refactor(fig): own vector blob conversion
- Move vector network blob codecs and NodeChange geometry resolution into @open-pencil/fig\n- Preserve the existing core vector compatibility exports without pass-through wrappers\n- Add package-local round-trip coverage for handle mirroring
2026-07-18 01:41:31 +03:00
Sadko 86d4167cbf
Merge branch 'master' into master 2026-07-17 18:37:59 -04:00
Sadko 6a53935af2
Update CHANGELOG.md 2026-07-17 18:36:07 -04:00
Danila Poyarkov db056317a8 refactor(fig): extract paint import policy
- Move paint/effect normalization and derived glyph conversion into the Fig package\n- Rewire core import and instance paths through the public node-change boundary\n- Keep static renderer evidence pointed at the new format-policy source
2026-07-18 01:36:00 +03:00
Danila Poyarkov a10911c772 refactor(fig): extract NodeChange policy helpers
- Move style references, plugin metadata, text values, and font feature conversion into @open-pencil/fig\n- Add a public node-change subpath with package-local and packed smoke coverage\n- Keep core conversion callers on compatibility exports during the staged migration
2026-07-18 01:32:13 +03:00
Sadko 6e4cff3d1f
Update CHANGELOG.md 2026-07-17 18:28:55 -04:00
Danila Poyarkov f0d10edf69 refactor(fig): own archive assembly
- Add public writeFigArchive API for canvas, thumbnail, metadata, and image entries\n- Reduce core compression to a compatibility re-export\n- Exercise archive writing through package-local and packed smoke tests
2026-07-18 01:23:06 +03:00
Danila Poyarkov f9e2588b84 refactor(fig): own full archive parsing
- Move ZIP canvas and image discovery from Kiwi into @open-pencil/fig\n- Keep Kiwi focused on raw fig-kiwi payload decoding\n- Rewire core and fixture consumers through the public Fig package API
2026-07-18 01:17:21 +03:00
Sadko 2b3b2dbe45
Merge branch 'open-pencil:master' into master 2026-07-17 17:55:24 -04:00
Danila Poyarkov 9ee36efa27 fix(kiwi): preserve unrelated raw metadata
- Invalidate only edited raw Figma fields and dependent geometry or text payloads\n- Prefer untouched component and layout-grid metadata during export\n- Restore exhaustive gold fixture scene parity and refresh coverage baselines
2026-07-18 00:44:49 +03:00
Sadko d78f4bb64e
Merge branch 'open-pencil:master' into master 2026-07-17 17:28:32 -04:00