Danila Poyarkov
f06631489f
Wire AI tools to editor store with valibot schemas
...
10 tools: create_shape, set_fill, set_stroke, update_node, set_layout,
delete_node, select_nodes, get_page_tree, get_selection, rename_node.
Uses @ai-sdk/valibot for schema integration with ToolLoopAgent.
2026-03-01 11:45:27 +03:00
Danila Poyarkov
4032108be0
Move AI models to @open-pencil/core constants, add Kimi K2.5 (vision+code), benchmark-ranked tags
2026-03-01 11:38:40 +03:00
Danila Poyarkov
9b59d8e816
Update model list to current versions (Claude 4.6, Gemini 3.1, GPT-5.3, DeepSeek V3.2, Qwen 3.5)
2026-03-01 11:34:38 +03:00
Danila Poyarkov
299b668e7b
Show selected model name in selector trigger
2026-03-01 11:33:12 +03:00
Danila Poyarkov
f6434bc4f9
Fix chat reactivity (markRaw), add Playwright tests with mock transport
...
Use markRaw to prevent Vue from deep-proxying the Chat class
instance, which broke its internal Vue refs. Add dedent for
multiline prompts.
Tests use mock transport by default. Set TEST_REAL_LLM=1 and
OPENROUTER_API_KEY to run against real OpenRouter.
2026-03-01 11:30:30 +03:00
Danila Poyarkov
c18ced5dcf
Rename ApiKeySetup → APIKeySetup
2026-03-01 11:12:37 +03:00
Danila Poyarkov
c08cbe5c0f
Split ChatPanel into ChatMessage, ChatInput, ApiKeySetup
2026-03-01 11:11:46 +03:00
Danila Poyarkov
f0c482ac5c
Add model selector with curated list (Claude, Gemini, GPT, DeepSeek, Llama)
2026-03-01 11:08:47 +03:00
Danila Poyarkov
61cd018353
Fix empty state vertical centering in chat panel
2026-03-01 11:05:09 +03:00
Danila Poyarkov
2145af5280
Use reka-ui Tabs/ScrollArea/Collapsible/Tooltip, tw-animate-css, vue-stream-markdown
2026-03-01 11:03:51 +03:00
Danila Poyarkov
9235a75e6f
Report app name to OpenRouter via X-OpenRouter-Title header
2026-03-01 10:58:22 +03:00
Danila Poyarkov
b10785fdee
Extract DesignPanel from PropertiesPanel
2026-03-01 10:55:52 +03:00
Danila Poyarkov
bf5c905134
Move AI chat to Design/AI tab in properties panel
2026-03-01 10:54:51 +03:00
Danila Poyarkov
5d23c3e834
AI chat panel with ⌘J toggle, DirectChatTransport, OpenRouter
...
- ChatPanel.vue: message list, tool timeline, typing indicator, API key setup
- use-chat.ts: Chat + DirectChatTransport + ToolLoopAgent (no backend)
- App.vue: toggle between PropertiesPanel and ChatPanel in same splitter slot
- ⌘J keyboard shortcut to open/close chat
2026-03-01 10:31:57 +03:00
Danila Poyarkov
cc5dda29d9
AI chat: no backend, direct OpenRouter from browser, Stronghold for key storage
2026-03-01 10:23:53 +03:00
Danila Poyarkov
7dcc5822f8
Merge cli-commands: analyze, node, pages, variables commands
2026-03-01 10:19:46 +03:00
Danila Poyarkov
9873580a04
Reference plan.md from AGENTS.md
2026-03-01 10:19:38 +03:00
Danila Poyarkov
f1806f6f33
Add test:coverage script
2026-03-01 10:19:38 +03:00
Danila Poyarkov
36e3f14ac4
CLI: add analyze, node, pages, and variables commands
...
- analyze colors: color palette usage with clustering
- analyze typography: font/size/weight distribution
- analyze spacing: gap/padding values with grid check
- analyze clusters: repeated patterns (potential components)
- node: detailed properties by ID
- pages: list pages with node counts
- variables: list design variables and collections
2026-03-01 10:19:38 +03:00
Danila Poyarkov
9b97346aa2
Remove .env from tracking, add to .gitignore
2026-03-01 10:14:48 +03:00
Danila Poyarkov
017b0aa3c1
Move AI chat design into plan.md Phase 5
2026-03-01 10:14:40 +03:00
Danila Poyarkov
af6a98ca56
AI chat: JSX-first rendering, guardrail tools, workflow from figma-use
2026-03-01 10:12:01 +03:00
Danila Poyarkov
4fb929073a
AI chat design document
2026-03-01 10:09:09 +03:00
Danila Poyarkov
0df5492542
Document kiwi decoder benchmark: JS vs Rust findings
2026-03-01 10:08:14 +03:00
Danila Poyarkov
f24f6e0dc6
Add .fig test fixtures (LFS) and fix O(n²) import bottleneck
...
- Add Material 3 Design Kit and Nuxt UI v4 community files as test fixtures
- Track tests/fixtures/*.fig with Git LFS
- Fix O(n²) getChildren() in fig-import: build children index upfront
- material3.fig (87K nodes): 37s → 535ms (69x faster)
- nuxtui.fig (314K nodes): minutes → 2.3s
- Optimize kiwi ByteBuffer: inline readVarUint, use TextDecoder for strings
2026-03-01 09:55:07 +03:00
Danila Poyarkov
88bfacdc9e
Rich text style runs with per-selection bold/italic/underline
...
StyleRun model: array of {start, length, style} with
CharacterStyleOverride (fontWeight, italic, textDecoration, etc.).
Renderer uses ParagraphBuilder.pushStyle/pop for mixed-style text.
TextEditor delegates paragraph building to renderer.buildParagraph().
⌘B/I/U apply to selection range when text is selected, or toggle
whole-node style when no selection. Style runs adjust on
insert/delete to preserve formatting across edits.
Fig roundtrip: import characterStyleIDs + styleOverrideTable from
TextData, export back with deduped style table.
B/I/U/S toggle buttons in TypographySection.
2026-03-01 09:03:38 +03:00
Danila Poyarkov
33d3defcef
Canvas-native text editing with phantom textarea
...
TextEditor class in core — cursor positioning, selection, word
boundaries, line navigation via CanvasKit Paragraph API
(getGlyphPositionAtCoordinate, getRectsForRange).
Renderer draws selection highlights and blinking caret directly
on the canvas. Blue outline around text node during editing.
Phantom textarea captures input, IME composition, clipboard,
arrow keys, Home/End, word/line movement (⌥/⌘ modifiers).
Replaces the old visible <textarea> overlay.
2026-03-01 03:46:43 +03:00
Danila Poyarkov
4e03d262c0
Register system font faces for CSS preview, fix picker highlight width
2026-03-01 03:25:50 +03:00
Danila Poyarkov
621e38e178
Font picker: start with empty search, scroll to current font
2026-03-01 02:59:17 +03:00
Danila Poyarkov
326f5d194d
Preload system fonts on app startup
...
Cache font list in Rust via OnceLock, fire preload request from
main.ts so the font list is ready before user opens the picker.
2026-03-01 02:57:58 +03:00
Danila Poyarkov
5ccae709a0
Add system font enumeration via font-kit
...
Rust: list_system_fonts and load_system_font Tauri commands using
font-kit crate for cross-platform system font access.
TS: font shim detects Tauri runtime and uses invoke() for font
listing/loading instead of queryLocalFonts (unavailable in WKWebView).
2026-03-01 02:56:12 +03:00
Danila Poyarkov
f7d1d59dc1
Rename Cargo crate to open_pencil, binary to OpenPencil
...
Fixes macOS Dock showing 'open-pencil-app' instead of 'OpenPencil'.
2026-03-01 02:42:12 +03:00
Danila Poyarkov
faf7ba6387
Fix app name in macOS Dock: open-pencil-app → OpenPencil
2026-03-01 02:39:32 +03:00
Danila Poyarkov
20544366c7
Add undo/redo for all variable operations
...
Push undo entries for: create/delete variable, create collection,
rename variable, rename collection, change color/value.
2026-03-01 02:38:31 +03:00
Danila Poyarkov
6d407820eb
Fix variables table not updating on create/delete
...
The variables computed was missing the sceneVersion dependency,
so it never re-evaluated when addVariable bumped sceneVersion.
2026-03-01 02:33:42 +03:00
Danila Poyarkov
f9d5c43586
Fix missing type icons in variables table
...
Import lucide icon components explicitly for TanStack Table h() cells.
The icon-[lucide--*] CSS class syntax doesn't work with unplugin-icons.
2026-03-01 02:21:40 +03:00
Danila Poyarkov
2695cffe6a
Extract ColorInput component, fix alpha slider checkerboard
...
New ColorInput component (swatch + hex, optional editable mode)
replaces duplicated ColorPicker + hex input pattern in:
- PageSection, StrokeSection, EffectsSection
- VariablesDialog (color variable cells use ColorInput with picker)
Fix ColorPicker alpha slider: add checkerboard background behind
transparent-to-color gradient, matching FillPicker's implementation.
2026-03-01 02:18:23 +03:00
Danila Poyarkov
52a31cff2f
Use TanStack Table for variables dialog with resizable columns
...
Replace hand-rolled flex layout with @tanstack/vue-table:
- Proper <table> with column resizing (drag header borders)
- Sticky header row
- FlexRender for cell content (reka-ui Editable inline editing)
- Use culori via parseColor instead of manual hex parsing
2026-03-01 02:12:19 +03:00
Danila Poyarkov
e3f8ff623e
Redesign variables dialog to match Figma's table layout
...
- Column per mode (Name | Mode 1 | Mode 2 | ...)
- Color swatch inside value cells, not next to name
- Search bar in top-right header area
- Single '+ Create variable' button at bottom
- Wider dialog (800px) for multi-mode tables
2026-03-01 02:08:13 +03:00
Danila Poyarkov
0ed1bfdf63
Add variable collections to demo: primitives, semantic tokens, spacing
...
Three collections with multi-mode support:
- Primitives (Light/Dark): 9 color variables with dark mode values
- Semantic (aliases): Background, Text, Border, Accent, Success, Error
- Spacing (Default/Compact): 8 number variables for space + radius tokens
Binds variables to dashboard sidebar, header, frame, and titles.
2026-03-01 02:04:41 +03:00
Danila Poyarkov
04b0efd020
Double-click to rename collection tabs in variables dialog
2026-03-01 02:03:24 +03:00
Danila Poyarkov
ff48c03d5a
Fix addCollection not triggering reactivity
2026-03-01 01:59:01 +03:00
Danila Poyarkov
5c4c6d7289
Move variables UI to dialog opened from page properties
...
Match Figma's pattern: Variables section in page-level properties
panel with settings icon that opens a full dialog (reka-ui Dialog +
Tabs + Editable). Remove sidebar panel approach.
2026-03-01 01:54:57 +03:00
Danila Poyarkov
e322d53ee3
Merge branch 'tauri-icon'
2026-03-01 01:52:14 +03:00
Danila Poyarkov
d30ab4c5d5
Add variables support: collections, modes, bindings, UI panel
...
Core:
- Variable, VariableCollection types on SceneGraph
- resolveVariable with alias chain resolution + cycle detection
- Mode switching (activeMode per collection)
- Bind/unbind variables to node properties (fills/strokes colors)
- Renderer resolves variable bindings before painting
Import:
- Parse VARIABLE type NodeChanges from .fig files
- Extract paint variable bindings (fills/strokes)
UI:
- VariablesPanel with reka-ui Tabs (collections) + Editable (names/values)
- FillSection: variable picker (reka-ui Popover + Combobox)
- Bound fills show purple variable name badge with detach button
- Toggle variables panel from bottom of layers sidebar
7 new unit tests (83 total)
2026-03-01 01:47:52 +03:00
Danila Poyarkov
88765bd078
Use pencil loader icon as Tauri app icon
2026-03-01 01:37:01 +03:00
Danila Poyarkov
aa083206d9
Add minimalist splash loader during WASM initialization
2026-03-01 01:30:01 +03:00
Danila Poyarkov
97428949fc
Update README and AGENTS.md for monorepo structure and CLI
2026-03-01 01:28:24 +03:00
Danila Poyarkov
eb6f8914a6
Point core exports to src/index.ts for Vite compatibility
2026-03-01 01:27:04 +03:00
Danila Poyarkov
22e9e7af87
Prepare packages for npm publishing
...
- Core: conditional exports (bun→src, import→dist), prepublishOnly builds
- CLI: publishConfig, files field
- bun publish resolves workspace:* → actual versions
2026-03-01 01:24:54 +03:00