Commit graph

861 commits

Author SHA1 Message Date
Danila Poyarkov 858e6451de fix(storage): parse S3 responses as XML
- Replace regex-based list and error parsing with xmldom

- Decode entities through the parser and support namespaced pagination responses

- Treat malformed listing documents as empty pages
2026-07-27 19:04:50 +03:00
Danila Poyarkov a6940bcab8 feat(app): convert image layers to vectors
- Add secure Recraft and fal.ai clients with centralized credentials and Media settings

- Replace image rectangles with editable vector frames in one undoable operation

- Bound desktop proxy responses, timeouts, and redirects for provider downloads

- Cover provider parsing, placement, settings, context-menu visibility, and undo

Co-authored-by: Rob Coenen <753704+rcoenen@users.noreply.github.com>
2026-07-27 16:22:05 +03:00
Danila Poyarkov 49b2d49e40 fix(storage): preserve durable sync work
- Resume persisted outbox jobs at startup without dropping writes when credentials are unavailable

- Serialize IndexedDB revisions and guard sync completion against concurrent saves

- Reconcile tombstones without reviving deleted documents and bound S3 metadata requests

- Require explicit CORS configuration instead of overwriting bucket rules during connection tests

- Keep ACP agents exclusive to the Design role and normalize invalid model limits
2026-07-26 23:43:38 +03:00
Danila Poyarkov e56727c22c feat(ai): configure reusable model profiles
- Separate provider connections, model profiles, capabilities, and role assignments

- Replace role-specific forms with a reusable model library and assignment table

- Resolve credentials lazily per connection and preserve existing Design settings

- Route Design chat through the assigned profile while exposing Review, Fast, and Vision runtimes
2026-07-26 22:53:45 +03:00
Danila Poyarkov a22d1edf8b refactor(ui): unify full-area placeholders
- Add one themed placeholder primitive for page, panel, dialog, and setup states

- Vertically center chat, code, assets, variables, and storage placeholders

- Let Vue replace the static boot splash instead of mutating global DOM from views
2026-07-26 17:02:29 +03:00
Danila Poyarkov 050978029b fix(app): clarify storage workspace setup
- Show one centered setup action instead of simultaneous error and empty states

- Refresh configuration after closing Settings without requiring route remount

- Keep document creation and refresh unavailable until setup is complete
2026-07-26 15:17:48 +03:00
Danila Poyarkov c45e5e5cef refactor(app): share document source access types
- Reuse one named source-state contract across save and source actions

- Keep storage bindings and local source identity typed without duplicated shapes
2026-07-26 15:09:26 +03:00
Danila Poyarkov ca80b0e787 feat(app): add storage workspace
- List local and remote documents from an explicit storage workspace route

- Open remote .fig documents into deduplicated storage-bound editor tabs

- Create locally durable documents only after storage configuration is complete

- Cover unconfigured guidance and mocked S3 document opening end to end

Co-authored-by: Rob Coenen <753704+rcoenen@users.noreply.github.com>
2026-07-26 15:06:01 +03:00
Danila Poyarkov 7a6c4cf8cb fix(app): label storage credential fields
- Give shared inputs explicit ID and accessible-label support

- Associate storage key labels with their password fields
2026-07-26 14:53:54 +03:00
Danila Poyarkov b4a82239a3 feat(app): persist storage-bound documents locally first
- Track remote storage bindings without replacing local file identity

- Route saves and autosaves through the durable local cache before enqueueing uploads

- Clear storage bindings on Save As and cover ordering and identity behavior

Co-authored-by: Rob Coenen <753704+rcoenen@users.noreply.github.com>
2026-07-26 14:46:38 +03:00
Danila Poyarkov f31341d488 feat(app): add background storage sync engine
- Drain local outbox jobs through the active registered storage adapter

- Preserve revision guards, retry backoff, tombstones, progress, and offline recovery

- Resolve the active adapter and credentials for each queued operation

Co-authored-by: Rob Coenen <753704+rcoenen@users.noreply.github.com>
2026-07-26 14:40:36 +03:00
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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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