Feature source of truth. Update this when features ship, change, or get cut.
- ✅ Launch screen — recent projects list, open folder
- ✅ Project screen — list components in
linesDir, open/new/rename/delete - ✅ Editor screen — edit a single component, back to project
- ✅ Project detection — reads
components.json+tsconfig.jsonto resolvelinesDir - ✅ Recents — persisted via
@tauri-apps/plugin-store, last 20 projects - ✅
linesDirre-detected on every open (stale recents self-heal) - ✅ Color mode per project (dark / light / system), persisted to store
- ✅ Load reference image (PNG/JPG) as non-exportable background layer
- ✅ Pan (spacebar + drag, or middle-mouse drag)
- ✅ Zoom (scroll wheel, zoom buttons, fit button)
- ✅ SVG canvas with correct viewport/transform (getScreenCTM for pixel-accurate coordinate mapping)
- ✅ Reference image opacity control (topbar slider)
- ✅ Canvas resize dialog — 3×3 anchor grid, W/H inputs, paths and image shift accordingly
- ✅ Crop tool — drag handles to define crop region, Enter to commit, Escape to cancel
- ✅ Code view tab — shows generated component source
- 📋 Fit-to-window on image load
- 📋 Zoom to fit / zoom to 100% keyboard shortcuts
- 📋 Canvas background color toggle (white / dark / transparent grid)
- ✅ Pen tool — click to place points (open polyline)
- ✅ Pen tool — press and drag for freehand continuous stroke (auto-finishes on pointerup)
- ✅ Select tool (click path to select, drag to move)
- ✅ Node edit tool — select individual points on a path, drag to reposition
- ✅ Crop tool — drag handles on canvas to set crop region
- ✅ Finish path (Enter)
- ✅ Cancel active path (Escape)
- ✅ Delete selected path(s) (Delete/Backspace)
- ✅ Delete individual point (Delete/Backspace in node edit mode)
- ✅ Multi-select — shift+click to add/remove paths from selection
- ✅ Select all (⌘A)
- ✅ Duplicate path(s) — ⌘D
- ✅ Copy / Cut / Paste — ⌘C / ⌘X / ⌘V
- ✅ Group paths — ⌘G
- ✅ Z-order — ⌘] / ⌘[ (forward/back), ⌘⇧] / ⌘⇧[ (front/back)
- ✅ Right-click context menu — Duplicate / Delete with selection count
- 📋 Insert point on path segment (click on edge)
- 📋 Bezier curve handles (v2, deferred)
- 📋 Ungroup (⌘⇧G)
- ✅ Tool palette with SVG icons (Select, Node Edit, Draw, Crop)
- ✅ Tool keyboard shortcuts shown in tooltip (V, A, P/D, C)
- ✅ Active tool highlight
- ✅ Canvas section: size stat, "Resize…" button
- ✅ Fill color picker (none / currentColor / shadcn theme tokens)
- ✅ Stroke color picker (none / currentColor / shadcn theme tokens)
- ✅ Stroke width input
- ✅ Opacity slider per path
- ✅ Open / Closed path toggle
- ✅ Point count + selected point index display
- ✅ Style persists to new paths (currentFill / currentStroke / currentStrokeWidth)
- 📋 Path name/label
- ✅ Layers panel (tab alongside Properties)
- ✅ Layer visibility toggle
- ✅ Layer lock toggle
- ✅ Layer opacity slider
- ✅ Add / delete layers
- ✅ Rename layer (inline)
- ✅ Reorder layers (drag or up/down buttons)
- 📋 Layer blend mode (removed from UI — data model retained for future)
- ✅ Color picker offers shadcn CSS var tokens (--foreground, --primary, --muted-foreground, etc.)
- ✅
CssColortype supportsnone,currentColor,hsl(var(--token)),#hex - ✅ Generated component embeds CSS var references directly — inherits consuming project's theme
- 📋 Preview panel renders component in shadcn light and dark themes side by side
- 📋
strokeWidthas a prop on the generated component
- ✅ Save component as
.lines.json+ generated.tsxto project'slinesDir - ✅ Load component from
.lines.json - ✅ Auto-save (debounced, triggers on
isDirty+componentName) - ✅ Component name editable in topbar; only invalid filename chars stripped
- ✅ Generate React
.tsxcomponent from document - 📋 Unsaved changes indicator + confirm-before-close
- 📋 Export plain SVG (no React wrapper)
- 📋 Open existing
.tsx+.lines.jsonfor re-editing (full round-trip)
- ✅ Uses shadcn CSS var color values by default
- ✅
vectorEffect="non-scaling-stroke"on paths - ✅ Single default export named from component name
- ✅ No runtime dependencies — pure SVG in JSX
- 📋
classNameandstrokeWidthprops - 📋 Named color override props
- ✅ macOS universal binary (arm64 + x86_64)
- ✅ GitHub Actions release pipeline (tag push → signed DMG → published release)
- ✅ Homebrew Cask install (
brew install whaleen/tap/lines) - ✅ In-app auto-updater — checks on launch, downloads in background, prompts to relaunch
- ✅ Signed releases (minisign keypair, TAURI_SIGNING_PRIVATE_KEY secret)
- ✅
latest.jsonmanifest auto-updated in homebrew-tap on release publish - 📋 Linux — add
ubuntu-22.04to build matrix, apt deps, AppImage + .deb bundles - 📋 Linux — AUR
-binpackage for Arch users (PKGBUILD auto-updated in release workflow) - 📋 Linux — add
linux-x86_64platform entry tolatest.jsonfor in-app updater
- 📋 File association: double-click
.lines.jsonopens in editor - 📋 Drag-and-drop image onto canvas to set reference
- 📋 Drag-and-drop
.lines.jsononto window to open - 📋 App menu (File, Edit)
- 📋
lines init— createcomponents/lines/dir in current project - 📋
lines add <name>— fetch component +.lines.jsonfrom registry, copy to correct dirs - 📋
lines list— list available components in the registry - 📋
lines remove <name>— delete component and data file from project - 📋 Dry-run flag (
--dry-run) foradd - 📋 Published as
lineson npm
- 📋 Public GitHub repo (
whaleen/lines-registryor similar) - 📋 Each component:
registry/<name>/component.tsx+registry/<name>/component.lines.json - 📋 Registry index:
registry/index.json(name, description, tags, author, preview URL) - 📋 Open contributions via PR
- 📋 Preview site showing all registered components rendered in light/dark
- 📋 CLI fetches from raw GitHub or a CDN-fronted static host
- 📋 Install convention mirrors shadcn: copy source into project (not a node_modules dep)
- 📋 Components land in
components/lines/by default (configurable vialines.config.json) - 📋
lines.config.jsonin project root: output dir, aliases - 📋 Works with any shadcn project out of the box — no extra setup beyond
lines init - 📋 Components use the same CSS variable names as shadcn (
--background,--foreground, etc.)
- Canvas doesn't fit-to-window on image load
- No preview of what the component looks like outside the editor (no theme preview)
- No close path toggle via keyboard (inspector only)