openpencil/crates
Kayshen-X d69e9e2eaf feat(shell): editor v0.8.0 batch — layer panel, pen, color picker, brand icons, settings modal, corner radius, perf
restores the 3 reset commits (drag-into-container, layer right-click,
page menu) plus this session's new editor features + performance pass.

layer panel
- cross-parent drag-into-container reparenting with floating ghost
- right-click context menu on layer rows (rename / duplicate / delete /
  group / ungroup / lock / hide)
- right-click context menu on page tabs (rename / duplicate / delete)
- split layer_panel.rs into spine + walkers + paint + tests under
  the 800-line cap

editor features
- pen tool: NodeKind::Path multi-anchor polylines with rubber-band
  preview tracking cursor doc-coords
- HSV color picker overlay (Cmd-Shift-C or fill/stroke swatch click):
  sat/value box + hue strip + hex input, anchored HSV across
  RGB-rounding cycles
- Property panel: Design / Code tab toggle (Cmd-Shift-C) — new
  property_panel_code module
- corner radius: Node.corner_radius field + PropertyFocus::PositionR
  wired through snapshot/commit/seed; canvas Rect paint switches to
  fill_round_rect/stroke_round_rect when radius > 0.5 doc-px

brand icons
- new RenderBackend::fill_svg_path on both native (Canvas::draw_path
  Fill paint) and web backends
- widgets/brand_icons.rs with Claude / OpenAI / Gemini / Copilot
  filled-path glyphs (verbatim from apps/web/src/components/icons/*-
  logo.tsx) + paint_opencode_logo terminal-frame primitive
- agent provider cards swap Lucide approximations for real brand
  logos

settings modal (Cmd+,)
- 880×640 modal with sidebar nav (Agents / MCP / Images / System)
  + scrollable right pane + dim scrim
- Agents tab: 5 provider cards with brand logos, hover-to-reveal
  "断开连接" on connected cards, "+ 添加服务商 / + 添加 Agent" actions
  aligned + inset to clear close X
- MCP tab: server status card (running/stopped indicator + port +
  start/stop button) + 2×3 toggle grid for terminal CLI integrations
- Images tab: Image Search status + collapsible Advanced (Openverse
  OAuth client id/secret + Register link + Test) + Image Generation
  section with empty-state hint
- System tab: read-only Auto-update status card (no real updater
  backend yet — surfacing a togglable switch would lie to the user)
- new widgets/agent_settings_i18n.rs hand-maintained EN/ZH key
  table (~50 keys); generated i18n/{en,zh_cn,...}.rs untouched
- AgentProvider.subtitle_key() drops hard-coded Chinese subtitles
  + drops the fabricated "fini.yang@gmail.com" account line
- web shell paints + dispatches the modal alongside native
- cursor over modal stays on Default pointer (no Move on sidebar
  nav rows)

performance
- history VecDeque (O(1) pop_front, capped at 100) replaces O(n)
  Vec::remove(0)
- redraw scheduler: track dirty flag + skip paint when cursor-move
  produces no visible state change (kills first-click chip flicker)
- cursor-move coalescing: drain pending_cursor_move on
  RedrawRequested + press/release/right-press
- viewport culling: off-screen leaf nodes skip paint with 64px margin
  for stroke/handle overflow
- font cache prewarm: NativeBackend::new walks ~50 chrome CJK
  codepoints through FontMgr::match_family_style_character at startup
  → first cross-tab paint stops stuttering
- i18n returns &'static str (PropertyLabels Copy struct, ~19
  String allocs/frame removed)
- TopBar chip 12px/char + 16px-pad CJK-safe hit area

polish
- close X smaller (16×16) + section-action text right-inset to clear it
- Advanced chevron → lucide ChevronDown/Right (was Unicode v/>)
- Register link arrow → lucide ArrowUpRight (was Unicode ↗)
- INPUT_RADIUS 6→8 for more visible rounded inputs
- dot-status alignment on Image Search header (centred to status
  text optical centre, not title baseline)

testing
- 167 tests passing across shell-core (136) + shell-native (21) +
  document (6) + walkers (4)
- 800-line cap holds on every file
- native + web targets both build clean
2026-05-12 21:26:27 +08:00
..
openpencil-app feat(openpencil-app): skeleton crate (Stage F entry placeholder) 2026-05-03 22:05:00 +08:00
openpencil-desktop feat(shell): editor v0.8.0 batch — layer panel, pen, color picker, brand icons, settings modal, corner radius, perf 2026-05-12 21:26:27 +08:00
openpencil-shell-core feat(shell): editor v0.8.0 batch — layer panel, pen, color picker, brand icons, settings modal, corner radius, perf 2026-05-12 21:26:27 +08:00
openpencil-shell-native feat(shell): editor v0.8.0 batch — layer panel, pen, color picker, brand icons, settings modal, corner radius, perf 2026-05-12 21:26:27 +08:00
openpencil-shell-web feat(shell): editor v0.8.0 batch — layer panel, pen, color picker, brand icons, settings modal, corner radius, perf 2026-05-12 21:26:27 +08:00
pen-codegen chore(workspace): cargo-deny 0.18 activation (Phase 1 Task 1.8 Step 6) 2026-05-03 23:05:00 +08:00
pen-core chore(workspace): cargo-deny 0.18 activation (Phase 1 Task 1.8 Step 6) 2026-05-03 23:05:00 +08:00
pen-engine chore(workspace): cargo-deny 0.18 activation (Phase 1 Task 1.8 Step 6) 2026-05-03 23:05:00 +08:00
pen-figma chore(workspace): cargo-deny 0.18 activation (Phase 1 Task 1.8 Step 6) 2026-05-03 23:05:00 +08:00
pen-types feat(pen-types): skeleton crate (bucket A) 2026-05-03 22:35:00 +08:00
wasm-libc-shim style(shell): cargo fmt --all (rustfmt-clean) 2026-05-10 18:47:33 +08:00
CLAUDE.md docs(shell): note document.rs directory split in crates/CLAUDE.md 2026-05-11 21:42:44 +08:00