Initial commit: Tauri + CanvasKit + React editor scaffold
- Tauri v2 desktop shell with 1280x800 window
- CanvasKit WASM (Skia) rendering via WebGL2
- Scene graph with typed nodes (Frame, Rectangle, Ellipse, Line, etc.)
- Skia renderer with fills, strokes, rounded corners, opacity, rotation
- Selection system with resize handles
- Undo/redo manager (inverse command pattern with batching)
- Bottom toolbar (Select, Frame, Rect, Ellipse, Line) matching Figma UI3
- Left layers panel, right properties panel
- Pan (scroll), zoom (Ctrl+scroll toward cursor)
- Keyboard shortcuts: V/F/R/O/L for tools, Cmd+Z undo, Backspace delete
- 5 demo shapes rendered on canvas
2026-02-27 12:48:29 +00:00
|
|
|
{
|
|
|
|
|
"name": "open-pencil-app",
|
|
|
|
|
"private": true,
|
2026-04-08 19:04:22 +00:00
|
|
|
"version": "0.11.6",
|
2026-03-02 05:31:54 +00:00
|
|
|
"license": "MIT",
|
Initial commit: Tauri + CanvasKit + React editor scaffold
- Tauri v2 desktop shell with 1280x800 window
- CanvasKit WASM (Skia) rendering via WebGL2
- Scene graph with typed nodes (Frame, Rectangle, Ellipse, Line, etc.)
- Skia renderer with fills, strokes, rounded corners, opacity, rotation
- Selection system with resize handles
- Undo/redo manager (inverse command pattern with batching)
- Bottom toolbar (Select, Frame, Rect, Ellipse, Line) matching Figma UI3
- Left layers panel, right properties panel
- Pan (scroll), zoom (Ctrl+scroll toward cursor)
- Keyboard shortcuts: V/F/R/O/L for tools, Cmd+Z undo, Backspace delete
- 5 demo shapes rendered on canvas
2026-02-27 12:48:29 +00:00
|
|
|
"type": "module",
|
Sync specs & docs: variables, image export, CLI, core extraction
- Update specs: scene-graph (variables/collections/modes/bindings/.fig import),
editor-ui (VariablesPanel, ExportSection, splash), canvas-rendering
(variable resolution, image export, sceneVersion/renderVersion),
desktop-app (monorepo), tooling (Bun workspace), testing (variable tests)
- Create cli spec: info, tree, find, export commands
- Update docs: features, figma-comparison (79/150), roadmap (Phase 4 ✅,
Phase 5 🟡), keyboard-shortcuts (⇧⌘E), contributing (monorepo structure)
- Restore vitepress devDependency lost during merge
- Archive sync-variables-export-cli change
2026-02-28 23:17:48 +00:00
|
|
|
"workspaces": [
|
|
|
|
|
"packages/*"
|
|
|
|
|
],
|
Initial commit: Tauri + CanvasKit + React editor scaffold
- Tauri v2 desktop shell with 1280x800 window
- CanvasKit WASM (Skia) rendering via WebGL2
- Scene graph with typed nodes (Frame, Rectangle, Ellipse, Line, etc.)
- Skia renderer with fills, strokes, rounded corners, opacity, rotation
- Selection system with resize handles
- Undo/redo manager (inverse command pattern with batching)
- Bottom toolbar (Select, Frame, Rect, Ellipse, Line) matching Figma UI3
- Left layers panel, right properties panel
- Pan (scroll), zoom (Ctrl+scroll toward cursor)
- Keyboard shortcuts: V/F/R/O/L for tools, Cmd+Z undo, Backspace delete
- 5 demo shapes rendered on canvas
2026-02-27 12:48:29 +00:00
|
|
|
"scripts": {
|
|
|
|
|
"dev": "vite",
|
2026-03-08 20:02:25 +00:00
|
|
|
"build": "bun run lint && vite build",
|
Initial commit: Tauri + CanvasKit + React editor scaffold
- Tauri v2 desktop shell with 1280x800 window
- CanvasKit WASM (Skia) rendering via WebGL2
- Scene graph with typed nodes (Frame, Rectangle, Ellipse, Line, etc.)
- Skia renderer with fills, strokes, rounded corners, opacity, rotation
- Selection system with resize handles
- Undo/redo manager (inverse command pattern with batching)
- Bottom toolbar (Select, Frame, Rect, Ellipse, Line) matching Figma UI3
- Left layers panel, right properties panel
- Pan (scroll), zoom (Ctrl+scroll toward cursor)
- Keyboard shortcuts: V/F/R/O/L for tools, Cmd+Z undo, Backspace delete
- 5 demo shapes rendered on canvas
2026-02-27 12:48:29 +00:00
|
|
|
"preview": "vite preview",
|
Add oxlint, oxfmt, typescript-go
- oxlint with react, react-hooks, typescript, import, unicorn plugins
- oxfmt (no trailing commas, single quotes, sorted imports)
- tsgo (typescript-go native preview) for fast typechecking
- Fix all lint warnings: non-null assertions, unused expressions, stale closures
- Scripts: lint, format, typecheck, check
2026-02-27 12:52:04 +00:00
|
|
|
"tauri": "tauri",
|
2026-03-15 06:13:04 +00:00
|
|
|
"lint": "oxlint -c oxlint.json --type-aware --type-check src/ packages/core/src/ packages/cli/src/ packages/mcp/src/",
|
2026-03-23 08:57:43 +00:00
|
|
|
"format": "oxfmt --write src/ packages/core/src/ packages/cli/src/ packages/mcp/src/ packages/vue/src/",
|
2026-03-30 12:11:14 +00:00
|
|
|
"check": "bun run lint && tsgo --noEmit && bun run check:vue",
|
|
|
|
|
"check:vue": "vue-tsc --noEmit -p tsconfig.json && vue-tsc --noEmit -p packages/vue/tsconfig.json",
|
2026-02-28 04:32:15 +00:00
|
|
|
"test": "playwright test --project=openpencil",
|
|
|
|
|
"test:update": "playwright test --project=openpencil --update-snapshots",
|
|
|
|
|
"test:figma": "playwright test --project=figma",
|
2026-02-28 04:45:50 +00:00
|
|
|
"figma:debug": "open -a Figma --args --remote-debugging-port=9222",
|
2026-02-28 22:21:29 +00:00
|
|
|
"test:unit": "bun test ./tests/engine",
|
2026-03-01 06:34:41 +00:00
|
|
|
"test:coverage": "bun test --coverage ./tests/engine",
|
2026-03-01 07:49:09 +00:00
|
|
|
"test:dupes": "jscpd packages/core/src packages/cli/src src --min-lines 5 --min-tokens 50 --format typescript",
|
Sync specs & docs: variables, image export, CLI, core extraction
- Update specs: scene-graph (variables/collections/modes/bindings/.fig import),
editor-ui (VariablesPanel, ExportSection, splash), canvas-rendering
(variable resolution, image export, sceneVersion/renderVersion),
desktop-app (monorepo), tooling (Bun workspace), testing (variable tests)
- Create cli spec: info, tree, find, export commands
- Update docs: features, figma-comparison (79/150), roadmap (Phase 4 ✅,
Phase 5 🟡), keyboard-shortcuts (⇧⌘E), contributing (monorepo structure)
- Restore vitepress devDependency lost during merge
- Archive sync-variables-export-cli change
2026-02-28 23:17:48 +00:00
|
|
|
"open-pencil": "bun packages/cli/src/index.ts",
|
2026-03-01 12:16:16 +00:00
|
|
|
"docs:dev": "bun --filter @open-pencil/docs dev",
|
|
|
|
|
"docs:build": "bun --filter @open-pencil/docs build",
|
2026-03-04 07:35:44 +00:00
|
|
|
"docs:preview": "bun --filter @open-pencil/docs preview",
|
|
|
|
|
"visual-compare": "bun scripts/visual-compare.ts"
|
Initial commit: Tauri + CanvasKit + React editor scaffold
- Tauri v2 desktop shell with 1280x800 window
- CanvasKit WASM (Skia) rendering via WebGL2
- Scene graph with typed nodes (Frame, Rectangle, Ellipse, Line, etc.)
- Skia renderer with fills, strokes, rounded corners, opacity, rotation
- Selection system with resize handles
- Undo/redo manager (inverse command pattern with batching)
- Bottom toolbar (Select, Frame, Rect, Ellipse, Line) matching Figma UI3
- Left layers panel, right properties panel
- Pan (scroll), zoom (Ctrl+scroll toward cursor)
- Keyboard shortcuts: V/F/R/O/L for tools, Cmd+Z undo, Backspace delete
- 5 demo shapes rendered on canvas
2026-02-27 12:48:29 +00:00
|
|
|
},
|
|
|
|
|
"dependencies": {
|
Multi-provider AI, sucrase JSX, Figma zoom shortcuts (#72)
* Add multi-provider AI support (Anthropic, OpenAI, Google AI, OpenAI-compatible)
- Add AI_PROVIDERS registry with per-provider model lists, key placeholders, and URLs
- Refactor use-chat composable: provider factory creates the right AI SDK model
- Per-provider API key storage in localStorage with automatic legacy migration
- New ProviderSetup.vue replaces APIKeySetup.vue with provider selector
- New ProviderSettings.vue popover accessible from gear icon in chat input
- OpenAI-compatible provider with custom base URL and model ID fields
- Install @ai-sdk/anthropic and @ai-sdk/google dependencies
- Update E2E tests for new provider setup flow
* Fix reactivity, key masking, missing model ID field, and chat reset on model change
- Use ref instead of computed for apiKey — computed getter over localStorage
wasn't triggering reactivity when the key was set
- Load stored key for new provider in providerId watcher
- Reset chat on modelId and customModelId change, not just provider switch
- Add custom model ID field to ProviderSetup.vue for OpenAI-compatible
- Simplify ProviderSettings key field — empty input with contextual placeholder
instead of fragile dot-masking that broke on partial edits
- Use data-test-id locator for model selector in E2E test
* Use useLocalStorage from vueuse instead of manual ref + watch + localStorage
Replaces 5 hand-rolled ref/watch/localStorage sync pairs with useLocalStorage.
API key uses a computed storage key that rebinds when the provider changes.
* Use useLocalStorage for collab name persistence
* Review fixes: changelog placement, remove dead class, cursor-pointer
* Extract ProviderSelect component and uiInput helper
- ProviderSelect.vue: shared select dropdown for AI providers
- ui/input.ts: shared input styling (sm/md sizes)
- Remove 7 duplicated input class strings across chat components
* Use uppercase acronyms: keyURL, customBaseURL, supportsCustomBaseURL
* Match select dropdown width to trigger via --reka-select-trigger-width
Move min-w-[var(--reka-select-trigger-width)] into selectContent base
style so all selects get it by default. Remove per-component overrides.
* Uppercase acronyms in variable names, improve setup form layout
- providerID, modelID, customModelID, setAPIKey, AIProviderID
- Keep apiKey lowercase at start (standard JS convention)
- Compact setup form: single column, full-width Connect button
- Fix grammar: 'a OpenRouter' → 'an OpenRouter'
- Shorter promo text
* Allow text selection in chat panel
* Fix chat E2E test: Save → Connect button text
* Disable mermaid in chat markdown renderer
Alias mermaid and beautiful-mermaid to empty shims in Vite config,
preventing vue-stream-markdown from attempting to load them.
* Interleave text and tool calls in chat messages
Render message parts in order instead of grouping all tool calls
first then all text. Use SDK's isToolUIPart/isTextUIPart/getToolName
instead of custom type guards. Fix error state: output-error, not error.
* Implement figma.viewport.scrollAndZoomIntoView()
Figma Plugin API method that centers the viewport on given nodes.
Reuses the same bounding box logic as the viewport_zoom_to_fit tool.
* Catch tool execution errors and return them to the AI
Instead of crashing with an unhandled exception, tool errors are
caught and returned as { error: message } so the AI can retry or
explain the failure. UI detects error outputs and shows them in red
with the error message when expanded.
* Replace esbuild with sucrase for JSX transform
Sucrase is a pure JS transform (201 KB / 46 KB gzip) that works in
both Node/Bun and the browser. Replaces esbuild (13 MB WASM) which
only worked in Node/Bun.
- buildComponent() and renderJSX() are now synchronous
- render tool works in browser AI chat (no more 'esbuild required')
- Handles full JS expressions (map, ternaries, Array.from, etc.)
* Update system prompt to prioritize render tool with JSX
Document available tags, props, layout, text, and sizing options.
Instruct the AI to use full JS expressions in JSX for complex layouts.
* Fix zoom shortcuts to match Figma
Cmd+0: Zoom to 100% (was incorrectly mapped to Zoom to fit)
Cmd+1: Zoom to fit
Cmd+2: Zoom to selection
Shift+1 / Shift+2: same as Cmd+1 / Cmd+2
Add zoomTo100() and zoomToSelection() to editor store.
Refactor zoomToFit() to use shared zoomToBounds() helper.
* Refactor keyboard shortcuts to useMagicKeys
Replace manual keydown handler with VueUse useMagicKeys + whenever
for declarative shortcut registration.
- mod() helper for cross-platform Meta/Control shortcuts
- plain() helper for modifier-free keys
- Proper modifier exclusion (⌘G vs ⌘⇧G no longer conflict)
- Add E2E tests: duplicate, zoom (⌘0/⌘1/⌘2/⇧1/⇧2), auto-layout (⇧A)
- All 26 keyboard shortcut tests pass
* Fix scrollAndZoomIntoView to actually zoom
Match Figma Plugin API behavior (equivalent to Shift-1): compute
zoom level that fits all nodes with padding, capped at 100%.
Previously only set center without adjusting zoom.
2026-03-08 19:05:18 +00:00
|
|
|
"@ai-sdk/anthropic": "^3.0.58",
|
|
|
|
|
"@ai-sdk/google": "^3.0.43",
|
2026-03-01 07:31:57 +00:00
|
|
|
"@ai-sdk/openai": "^3.0.37",
|
2026-03-01 08:45:27 +00:00
|
|
|
"@ai-sdk/valibot": "^2.0.17",
|
2026-03-01 07:31:57 +00:00
|
|
|
"@ai-sdk/vue": "^3.0.105",
|
2026-03-17 05:46:23 +00:00
|
|
|
"@atlaskit/pragmatic-drag-and-drop": "^1.7.9",
|
|
|
|
|
"@atlaskit/pragmatic-drag-and-drop-hitbox": "^1.1.0",
|
2026-02-28 23:12:19 +00:00
|
|
|
"@open-pencil/cli": "workspace:*",
|
|
|
|
|
"@open-pencil/core": "workspace:*",
|
2026-03-16 14:24:45 +00:00
|
|
|
"@open-pencil/vue": "workspace:*",
|
2026-03-01 07:31:57 +00:00
|
|
|
"@openrouter/ai-sdk-provider": "^2.2.3",
|
2026-02-27 21:54:38 +00:00
|
|
|
"@tailwindcss/vite": "^4.2.1",
|
2026-02-28 23:12:19 +00:00
|
|
|
"@tanstack/vue-table": "^8.21.3",
|
Initial commit: Tauri + CanvasKit + React editor scaffold
- Tauri v2 desktop shell with 1280x800 window
- CanvasKit WASM (Skia) rendering via WebGL2
- Scene graph with typed nodes (Frame, Rectangle, Ellipse, Line, etc.)
- Skia renderer with fills, strokes, rounded corners, opacity, rotation
- Selection system with resize handles
- Undo/redo manager (inverse command pattern with batching)
- Bottom toolbar (Select, Frame, Rect, Ellipse, Line) matching Figma UI3
- Left layers panel, right properties panel
- Pan (scroll), zoom (Ctrl+scroll toward cursor)
- Keyboard shortcuts: V/F/R/O/L for tools, Cmd+Z undo, Backspace delete
- 5 demo shapes rendered on canvas
2026-02-27 12:48:29 +00:00
|
|
|
"@tauri-apps/api": "^2",
|
2026-02-28 10:54:21 +00:00
|
|
|
"@tauri-apps/plugin-dialog": "^2.6.0",
|
|
|
|
|
"@tauri-apps/plugin-fs": "^2.4.5",
|
Initial commit: Tauri + CanvasKit + React editor scaffold
- Tauri v2 desktop shell with 1280x800 window
- CanvasKit WASM (Skia) rendering via WebGL2
- Scene graph with typed nodes (Frame, Rectangle, Ellipse, Line, etc.)
- Skia renderer with fills, strokes, rounded corners, opacity, rotation
- Selection system with resize handles
- Undo/redo manager (inverse command pattern with batching)
- Bottom toolbar (Select, Frame, Rect, Ellipse, Line) matching Figma UI3
- Left layers panel, right properties panel
- Pan (scroll), zoom (Ctrl+scroll toward cursor)
- Keyboard shortcuts: V/F/R/O/L for tools, Cmd+Z undo, Backspace delete
- 5 demo shapes rendered on canvas
2026-02-27 12:48:29 +00:00
|
|
|
"@tauri-apps/plugin-opener": "^2",
|
2026-03-14 07:20:15 +00:00
|
|
|
"@tauri-apps/plugin-shell": "^2.3.5",
|
2026-03-06 17:54:48 +00:00
|
|
|
"@unhead/vue": "^2.1.10",
|
Migrate React → Vue 3 + VueUse + Reka UI
- Vue 3 SFC components with <script setup>
- Reactive store (Vue reactivity) replacing React refs/state
- Composables: useCanvas, useCanvasInput, useKeyboard
- Components: EditorCanvas, LayersPanel, PropertiesPanel, Toolbar
- Floating toolbar (Figma UI3 style) with pill shape + shadow
- Properties panel with Design/Prototype tabs + zoom display
- Sections: Position, Rotation, Layout, Appearance, Fill, Stroke, Effects, Export
- CSS custom properties for theming (--panel-bg, --border, --accent, etc.)
- Add Figma UI3 CDP inspection findings (toolbar, panels, sections)
2026-02-27 18:25:31 +00:00
|
|
|
"@vueuse/core": "^14.2.1",
|
2026-03-16 19:21:21 +00:00
|
|
|
"ai": "^6.0.116",
|
Initial commit: Tauri + CanvasKit + React editor scaffold
- Tauri v2 desktop shell with 1280x800 window
- CanvasKit WASM (Skia) rendering via WebGL2
- Scene graph with typed nodes (Frame, Rectangle, Ellipse, Line, etc.)
- Skia renderer with fills, strokes, rounded corners, opacity, rotation
- Selection system with resize handles
- Undo/redo manager (inverse command pattern with batching)
- Bottom toolbar (Select, Frame, Rect, Ellipse, Line) matching Figma UI3
- Left layers panel, right properties panel
- Pan (scroll), zoom (Ctrl+scroll toward cursor)
- Keyboard shortcuts: V/F/R/O/L for tools, Cmd+Z undo, Backspace delete
- 5 demo shapes rendered on canvas
2026-02-27 12:48:29 +00:00
|
|
|
"canvaskit-wasm": "^0.40.0",
|
2026-02-28 05:08:04 +00:00
|
|
|
"culori": "^4.0.2",
|
2026-03-01 08:30:30 +00:00
|
|
|
"dedent": "^1.7.1",
|
2026-02-27 20:01:35 +00:00
|
|
|
"fflate": "^0.8.2",
|
|
|
|
|
"fzstd": "^0.1.1",
|
2026-03-01 13:44:37 +00:00
|
|
|
"lib0": "^0.2.117",
|
2026-03-06 05:50:38 +00:00
|
|
|
"motion-v": "^2.0.0",
|
2026-04-08 12:35:00 +00:00
|
|
|
"opentype.js": "^1.3.4",
|
2026-03-01 09:12:45 +00:00
|
|
|
"prismjs": "^1.30.0",
|
2026-03-04 17:52:30 +00:00
|
|
|
"reka-ui": "^2.9.0",
|
2026-03-06 16:01:14 +00:00
|
|
|
"tailwind-merge": "^3.5.0",
|
|
|
|
|
"tailwind-variants": "^3.2.2",
|
2026-02-27 21:54:38 +00:00
|
|
|
"tailwindcss": "^4.2.1",
|
2026-03-01 14:25:46 +00:00
|
|
|
"trystero": "^0.22.0",
|
2026-03-01 08:45:27 +00:00
|
|
|
"valibot": "^1.2.0",
|
Migrate React → Vue 3 + VueUse + Reka UI
- Vue 3 SFC components with <script setup>
- Reactive store (Vue reactivity) replacing React refs/state
- Composables: useCanvas, useCanvasInput, useKeyboard
- Components: EditorCanvas, LayersPanel, PropertiesPanel, Toolbar
- Floating toolbar (Figma UI3 style) with pill shape + shadow
- Properties panel with Design/Prototype tabs + zoom display
- Sections: Position, Rotation, Layout, Appearance, Fill, Stroke, Effects, Export
- CSS custom properties for theming (--panel-bg, --border, --accent, etc.)
- Add Figma UI3 CDP inspection findings (toolbar, panels, sections)
2026-02-27 18:25:31 +00:00
|
|
|
"vue": "^3.5.29",
|
2026-03-01 14:15:08 +00:00
|
|
|
"vue-router": "^5.0.3",
|
2026-03-16 19:21:21 +00:00
|
|
|
"vue-stream-markdown": "^0.6.5",
|
2026-03-01 14:25:46 +00:00
|
|
|
"y-indexeddb": "^9.0.12",
|
2026-03-01 13:44:37 +00:00
|
|
|
"y-protocols": "^1.0.7",
|
|
|
|
|
"yjs": "^13.6.29",
|
2026-03-14 07:34:26 +00:00
|
|
|
"yoga-layout": "npm:@open-pencil/yoga-layout@3.3.0-grid.2",
|
2026-03-16 19:21:21 +00:00
|
|
|
"zod": "^4.3.6"
|
Initial commit: Tauri + CanvasKit + React editor scaffold
- Tauri v2 desktop shell with 1280x800 window
- CanvasKit WASM (Skia) rendering via WebGL2
- Scene graph with typed nodes (Frame, Rectangle, Ellipse, Line, etc.)
- Skia renderer with fills, strokes, rounded corners, opacity, rotation
- Selection system with resize handles
- Undo/redo manager (inverse command pattern with batching)
- Bottom toolbar (Select, Frame, Rect, Ellipse, Line) matching Figma UI3
- Left layers panel, right properties panel
- Pan (scroll), zoom (Ctrl+scroll toward cursor)
- Keyboard shortcuts: V/F/R/O/L for tools, Cmd+Z undo, Backspace delete
- 5 demo shapes rendered on canvas
2026-02-27 12:48:29 +00:00
|
|
|
},
|
|
|
|
|
"devDependencies": {
|
2026-03-03 17:45:58 +00:00
|
|
|
"@agentclientprotocol/sdk": "^0.14.1",
|
2026-03-07 11:30:12 +00:00
|
|
|
"@hono/node-server": "^1.19.11",
|
2026-02-28 05:24:42 +00:00
|
|
|
"@iconify-json/lucide": "^1.2.94",
|
2026-03-02 18:07:25 +00:00
|
|
|
"@modelcontextprotocol/sdk": "^1.27.1",
|
2026-03-16 18:54:08 +00:00
|
|
|
"@open-pencil/mcp": "workspace:*",
|
2026-02-28 04:32:15 +00:00
|
|
|
"@playwright/test": "^1.58.2",
|
Add oxlint, oxfmt, typescript-go
- oxlint with react, react-hooks, typescript, import, unicorn plugins
- oxfmt (no trailing commas, single quotes, sorted imports)
- tsgo (typescript-go native preview) for fast typechecking
- Fix all lint warnings: non-null assertions, unused expressions, stale closures
- Scripts: lint, format, typecheck, check
2026-02-27 12:52:04 +00:00
|
|
|
"@tauri-apps/cli": "^2",
|
2026-02-28 08:37:02 +00:00
|
|
|
"@types/culori": "^4.0.1",
|
|
|
|
|
"@types/node": "^25.3.2",
|
2026-04-08 12:35:00 +00:00
|
|
|
"@types/opentype.js": "^1.3.9",
|
2026-03-01 09:12:45 +00:00
|
|
|
"@types/prismjs": "^1.26.6",
|
2026-03-07 11:30:12 +00:00
|
|
|
"@types/ws": "^8.18.1",
|
2026-02-28 08:37:02 +00:00
|
|
|
"@typescript/native-preview": "^7.0.0-dev.20260228.1",
|
2026-03-12 19:13:30 +00:00
|
|
|
"@vitejs/plugin-vue": "^6.0.5",
|
2026-03-30 13:21:50 +00:00
|
|
|
"unplugin-vue": "^7.1.1",
|
|
|
|
|
"unplugin-raw": "^0.6.4",
|
JSX renderer in @open-pencil/core
TreeNode builder functions (Frame, Text, Rectangle, etc.) produce a
lightweight tree structure. Two rendering paths:
- renderTreeNode(): tree → scene graph (browser, no deps)
- renderJsx(): JSX string → esbuild → tree → scene graph (CLI/headless)
Tailwind-like shorthand props: w/h, bg, rounded, flex, gap, p/px/py,
justify, items, shadow, blur, etc.
27 tests covering all node types, layout props, effects, and nesting.
2026-03-01 07:42:06 +00:00
|
|
|
"esbuild": "^0.27.3",
|
2026-03-07 11:30:12 +00:00
|
|
|
"hono": "^4.12.5",
|
2026-03-01 07:49:09 +00:00
|
|
|
"jscpd": "^4.0.8",
|
2026-03-08 23:58:24 +00:00
|
|
|
"mitata": "^1.0.34",
|
Add oxlint, oxfmt, typescript-go
- oxlint with react, react-hooks, typescript, import, unicorn plugins
- oxfmt (no trailing commas, single quotes, sorted imports)
- tsgo (typescript-go native preview) for fast typechecking
- Fix all lint warnings: non-null assertions, unused expressions, stale closures
- Scripts: lint, format, typecheck, check
2026-02-27 12:52:04 +00:00
|
|
|
"oxfmt": "^0.35.0",
|
|
|
|
|
"oxlint": "^1.50.0",
|
2026-03-08 20:02:25 +00:00
|
|
|
"oxlint-tsgolint": "^0.16.0",
|
2026-03-01 08:03:51 +00:00
|
|
|
"tw-animate-css": "^1.4.0",
|
Initial commit: Tauri + CanvasKit + React editor scaffold
- Tauri v2 desktop shell with 1280x800 window
- CanvasKit WASM (Skia) rendering via WebGL2
- Scene graph with typed nodes (Frame, Rectangle, Ellipse, Line, etc.)
- Skia renderer with fills, strokes, rounded corners, opacity, rotation
- Selection system with resize handles
- Undo/redo manager (inverse command pattern with batching)
- Bottom toolbar (Select, Frame, Rect, Ellipse, Line) matching Figma UI3
- Left layers panel, right properties panel
- Pan (scroll), zoom (Ctrl+scroll toward cursor)
- Keyboard shortcuts: V/F/R/O/L for tools, Cmd+Z undo, Backspace delete
- 5 demo shapes rendered on canvas
2026-02-27 12:48:29 +00:00
|
|
|
"typescript": "~5.8.3",
|
2026-02-28 05:24:42 +00:00
|
|
|
"unplugin-icons": "^23.0.1",
|
2026-02-28 05:29:39 +00:00
|
|
|
"unplugin-vue-components": "^31.0.0",
|
2026-03-12 19:13:30 +00:00
|
|
|
"vite": "^8.0.0",
|
feat: mobile layout, PWA support (#27) (#27)
- Mobile-responsive editor with bottom drawer, ribbon nav, HUD overlay
- Touch support: single-finger tools, two-finger pinch-zoom
- PWA: manifest, service worker, installability
- Extract LayerTree from LayersPanel, shared utils (colorToCSS, initials, toolIcons)
- Constants moved to src/constants.ts, clipboard state to editor store
- reka-ui Popover/DropdownMenu in MobileHud
Co-authored-by: Danila Poyarkov <dev@dannote.net>
2026-03-05 16:51:51 +00:00
|
|
|
"vite-plugin-pwa": "^1.2.0",
|
2026-03-16 18:54:08 +00:00
|
|
|
"vue-tsc": "^3.2.5",
|
2026-03-30 13:21:50 +00:00
|
|
|
"tsdown": "^0.21.7",
|
2026-03-07 11:30:12 +00:00
|
|
|
"workbox-window": "^7.4.0",
|
2026-03-16 18:54:08 +00:00
|
|
|
"ws": "^8.19.0"
|
Initial commit: Tauri + CanvasKit + React editor scaffold
- Tauri v2 desktop shell with 1280x800 window
- CanvasKit WASM (Skia) rendering via WebGL2
- Scene graph with typed nodes (Frame, Rectangle, Ellipse, Line, etc.)
- Skia renderer with fills, strokes, rounded corners, opacity, rotation
- Selection system with resize handles
- Undo/redo manager (inverse command pattern with batching)
- Bottom toolbar (Select, Frame, Rect, Ellipse, Line) matching Figma UI3
- Left layers panel, right properties panel
- Pan (scroll), zoom (Ctrl+scroll toward cursor)
- Keyboard shortcuts: V/F/R/O/L for tools, Cmd+Z undo, Backspace delete
- 5 demo shapes rendered on canvas
2026-02-27 12:48:29 +00:00
|
|
|
}
|
2026-03-15 06:32:16 +00:00
|
|
|
}
|