Commit graph

2098 commits

Author SHA1 Message Date
Danila Poyarkov bac1b79a6b feat(app): add storage integration settings
- Add schema-driven S3 preferences and status-only credential controls to unified Settings

- Keep storage preferences persistent while secrets remain in the selected credential backend

- Include storage credentials when browser persistence changes and test session behavior

Co-authored-by: Rob Coenen <753704+rcoenen@users.noreply.github.com>
2026-07-26 14:39:24 +03:00
Danila Poyarkov 56a3b77ac5 feat(app): add local-first storage substrate
- Recover the IndexedDB and in-memory document cache behind the storage domain

- Add persistent outbox supersession, cache eviction, import validation, and naming helpers

- Keep the substrate provider-neutral and cover its pure behavior

Co-authored-by: Rob Coenen <753704+rcoenen@users.noreply.github.com>
2026-07-26 14:30:39 +03:00
Danila Poyarkov d315547f2b feat(app): register S3-compatible storage
- Adapt the contributed S3 client behind the neutral storage provider contract

- Resolve access credentials lazily for each storage operation

- Preserve namespace isolation, CORS setup, pagination, progress, and metadata fallbacks

Co-authored-by: Rob Coenen <753704+rcoenen@users.noreply.github.com>
2026-07-26 14:26:44 +03:00
Danila Poyarkov a4a8eab46e feat(app): add storage provider registry
- Define backend-neutral document storage and provider schema contracts

- Keep provider preferences separate from credential references

- Resolve declared secrets lazily through the shared credential service
2026-07-26 14:21:11 +03:00
Danila Poyarkov 266f85a73c feat(app): unify integration settings
- Open one Settings dialog for AI providers, agents, and media credentials

- Resolve secrets only when requests start and keep settings on status-only credential APIs

- Make browser persistence explicit and default fresh web sessions to memory

- Move provider controls into the settings domain and cover setup, reload, and clearing
2026-07-26 14:07:48 +03:00
Danila Poyarkov 4c5cd0a678 refactor(ai): register direct model providers
- Move provider-specific model construction behind typed adapters

- Keep OpenAI- and Anthropic-compatible configuration reusable

- Verify every direct provider is registered while ACP agents stay separate
2026-07-26 14:07:35 +03:00
Danila Poyarkov 95a920197e feat(app): add cross-platform credential storage
- Store desktop secrets in native OS credential services through a narrow Tauri bridge

- Provide session-only and encrypted remembered browser stores with explicit switching

- Migrate legacy plaintext keys only after verified writes and cover failure recovery
2026-07-26 14:07:26 +03:00
Danila Poyarkov 0a46ff64eb feat(ui): add shared dialog shells
- Build typed Reka-based dialog and alert-dialog anatomy with shared theme slots

- Migrate variables, asset details, and ACP permissions to the common shell

- Add Storybook coverage for reusable dialog states
2026-07-26 14:07:15 +03:00
Danila Poyarkov 1436b9cb23 Merge branch 'figma-layout-hierarchy' 2026-07-26 12:43:02 +03:00
Danila Poyarkov 0071c32544 feat(vue): add responsive property grids
- Add a headless PropertyGrid primitive with themed app composition

- Keep composite paint details full-width and show remove actions consistently

- Tighten color picker and Design-panel field sizing without clipping values
2026-07-26 12:42:50 +03:00
Danila Poyarkov c9cadf6fdd fix(ui): expose auto-layout flow choices 2026-07-26 11:15:57 +03:00
Danila Poyarkov 80750e65fc fix(ui): align layout sections with Figma 2026-07-26 10:52:48 +03:00
Danila Poyarkov a23e58d785 fix(ui): prevent overlapping tooltips
- Let nested actions claim tooltip ownership from parent controls
- Keep only one tooltip visible across pointer and keyboard focus
- Cover composite property fields and preserve WebKit behavior
2026-07-26 10:31:05 +03:00
Danila Poyarkov 5b2334ba2d
fix(acp): launch Windows command shims (#425)
- Route npm-installed ACP and MCP launchers through cmd on Windows
- Preserve inherited agent environment and current MCP transport settings
- Cover Windows process resolution and document the user-facing fix

Co-authored-by: Damián Briones <insertnickname1@gmail.com>
2026-07-26 08:47:20 +03:00
Danila Poyarkov 57eb59769d
feat(components): match Figma asset browsing (#424)
* feat(components): match Figma asset browsing

- Add thumbnail grid and list views grouped by source page
- Support component drag insertion and main-component navigation
- Keep asset previews working across document pages
- Cover views, context actions, and drag-to-canvas behavior

* fix(components): remove redundant Assets heading

* fix(components): render crisp asset thumbnails

- Render preview images at twice their display dimensions
- Preserve the existing grid and list thumbnail sizes

* fix(render): exclude ancestors from selection exports

- Reparent selected export roots directly under the extracted page
- Preserve absolute positions without drawing ancestor backgrounds
- Cover transparent selection export around nested components

* fix(components): address Assets panel review

- Handle thumbnail export failures without stale previews
- Share page lookup and thumbnail sizing across asset views
- Make list actions keyboard accessible and honor requested export pages
2026-07-26 01:18:27 +03:00
Danila Poyarkov f6e446a789
fix(app): reuse tabs for repeated file opens (#423)
- Match documents by desktop path or File System Access handle
- Share concurrent duplicate loads while allowing unrelated files to load in parallel
- Publish source identity only after successful opens and saves

Co-authored-by: Joseph Cumines <joeycumines@gmail.com>
2026-07-26 00:22:36 +03:00
Luca Candela 18899ff13c
feat(editor): add Figma-style frame presets (#418)
Add frame preset creation and resizing with constraint-aware layout, undo/redo, toolbar flyouts, localization, documentation, and regression coverage.
2026-07-26 00:05:57 +03:00
Danila Poyarkov 0cd0ee6356
fix(text): center glyphs within line height (#422)
Enable CanvasKit half-leading for solid and gradient paragraph rendering while preserving the existing font fallback system.\n\nCo-authored-by: jongwong <jongwong@aliyun.com>
2026-07-25 23:52:01 +03:00
Danila Poyarkov 33fa9ee320 fix(mcp): complete local transport integration
- Resolve MCP workspace subpaths during Vite development

- Remove discovery state before shutdown and close upgraded sockets

- Cover discovery cleanup with a connected WebSocket client

Co-authored-by: Joseph Cumines <joeycumines@gmail.com>
2026-07-25 23:01:40 +03:00
Danila Poyarkov 9c9e4fae08 refactor(mcp): align transport domain structure
- Group server, stdio, and transport implementation by ownership

- Mirror those domains in engine tests and centralize shared MCP fixtures
2026-07-25 22:59:59 +03:00
Danila Poyarkov a46ade4361 Merge MCP transport hardening 2026-07-25 21:29:34 +03:00
Danila Poyarkov 2b32a8c7d3 feat(mcp): add local transport discovery
- Prefer private Unix sockets with TCP fallback for local MCP clients

- Unify HTTP and WebSocket lifecycle, authentication, and cleanup

- Discover transport details from an owner-only runtime file
2026-07-25 21:29:03 +03:00
Danila Poyarkov 5e8d189f2e fix(mcp): harden local file and token access
- Resolve configured root paths through symlinks before file operations

- Compare authentication tokens through fixed-length digests
2026-07-25 21:03:29 +03:00
Danila Poyarkov cc9b2eb84c Merge branch 'fig-corner-clipping' 2026-07-24 15:36:55 +03:00
Danila Poyarkov bc73b15f0c revert(demo): restore the visual-features showcase demo
Roll back the Pulse music-app demo to the prior standalone showcase
(Components / App Preview / Effects) which cleanly demonstrates gradients,
drop/inner shadows, blend modes, masks, and corner smoothing. Also removed the
Pulse JSX showcase file and restored the matching demo test.
2026-07-24 15:29:43 +03:00
Danila Poyarkov 49fa36ec12 fix(design-jsx): scale inline <svg> icons to their explicit w/h
<svg> icons always rendered at the 24px default because the size fell back
to 24 even when w/h were given. Prefer explicit w/h over the default so icon
content scales to fit its frame.
2026-07-24 15:25:35 +03:00
Danila Poyarkov f31e51f987 fix(fig): preserve vector winding rules
- Align imported and derived geometry with vector-region winding

- Cover even-odd holes with unit and reviewed canvas snapshots
2026-07-22 16:36:30 +03:00
Danila Poyarkov 8dfed26d16 fix(fig): preserve paint variable overrides
- Carry paint bindings through symbol overrides and clone synchronization

- Keep explicit instance strokes and resolved variable opacity intact
2026-07-22 15:51:46 +03:00
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 3cfc86371d feat(design-jsx): masks, inline <svg> vectors, and instance overrides
Fill the three biggest gaps that blocked authoring real designs in JSX:

- mask prop on any node: <Ellipse mask> / mask="luminance" / mask="vector"
  sets isMask + maskType so sibling content clips (Figma's mask model)
- <svg> element rendering inline SVG markup into vector nodes, reusing the
  iconify path pipeline (extractPaths + parseSVGPath + scalePathInfos)
- Instance overrides: <Instance of="X" overrides={{ 'childName:prop': v }} />
  applies child overrides by name and records them so component sync keeps them

Adds gap tests and the shared scalePathInfos/finishIconRender helpers to
avoid duplicating the iconify pipeline.
2026-07-21 11:40:13 +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