openpencil/crates
Kayshen-X 0948e97de9 feat(panels,canvas): editable gradients/effects + SVG/image import + locale-aware dialogs
Continues the gradient + property-panel polish from the previous
commit and rounds out two new flows the TS app already has:

Gradient stops + effects:
- ColorTarget gains GradientStop(i) + EffectColor(i); HSV picker
  preserves alpha across hue/SV drags so a transparent stop stays
  transparent. Hex pill stays 6-char; alpha is reattached at commit
  and the swatch sits on a 2x2 alpha checker so #00000000 reads as
  transparent rather than empty.
- Effects section reflowed into card-style blocks (image #9 spec):
  title + minus, X/Y and Blur/Spread 2-col grids, color row with
  swatch + rgba(...) text; clicking the swatch opens an HSV picker
  bound to that effect index via SetEffectColor.
- Press dispatch on both hosts anchors picker overlays at the
  clicked y so they pop adjacent to the swatch instead of the top.

Image + SVG import (toolbar + Fill section "图片" row):
- New FileAction::ImportImageOrSvg / PickFillImage; persistence_image
  pops rfd, decodes raster as data: URL, inserts an Image node or
  rewrites the selected node's primary fill.
- ImageNode actually renders on the canvas: NodePayload + SceneNode
  carry image_src, canvas_viewport_paint.rs decodes the data URL
  once and hands raw bytes to RenderBackend::draw_image with a
  src-hash cache id. Grey placeholder paints only when decode fails
  so transparent PNGs don't get a grey matte underneath.
- SVG import ported to TS-parity (packages/pen-engine svg-parser):
  recursive <g> tree walk with inherited fill/stroke/style="...",
  viewBox-aware scaling with maxDim cap, multi-subpath split, raw
  d preserved on PathNode. Imports land wrapped in a Group named
  after the source file.

Locale-aware first run:
- settings_io detects the OS locale (LC_ALL/LANG/LC_MESSAGES with
  zh-Hans/zh-Hant heuristics) and seeds editor_ui.locale before
  settings.json is read; persisted user choice still wins.
- macOS bundle declares CFBundleLocalizations + AllowMixedLocalizations
  so NSOpenPanel / NSSavePanel render in the same language as the
  rest of the chrome.

Web host kept exhaustive across the new variants (PickFillImage,
OpenEffectColorPicker, ColorTarget::EffectColor, GradientStop). Two
new files: persistence_image.rs (file-pick handlers, ≤120 lines) and
svg_path_data.rs (path-d tokenizer + bbox + normaliser, split from
svg_import.rs to stay under the 800-line cap). 277 op-editor-core
tests pass.
2026-05-23 23:11:38 +08:00
..
op-acp style: clear clippy lints for the workspace -D warnings gate 2026-05-17 23:12:16 +08:00
op-ai feat(ai): chat image attachments + per-provider thinking/effort 2026-05-17 22:44:28 +08:00
op-ai-skills style: clear clippy lints for the workspace -D warnings gate 2026-05-17 23:12:16 +08:00
op-app refactor(rust): add op-app composition-root crate 2026-05-16 23:57:03 +08:00
op-cli feat: close six TS-parity gaps in the Rust shell 2026-05-17 13:03:11 +08:00
op-codegen feat(editor): add Design-MD panel and complete i18n coverage 2026-05-19 22:29:22 +08:00
op-design-lint feat(panels,canvas): editable gradients/effects + SVG/image import + locale-aware dialogs 2026-05-23 23:11:38 +08:00
op-editor-core feat(panels,canvas): editable gradients/effects + SVG/image import + locale-aware dialogs 2026-05-23 23:11:38 +08:00
op-editor-ui feat(panels,canvas): editable gradients/effects + SVG/image import + locale-aware dialogs 2026-05-23 23:11:38 +08:00
op-figma feat(editor): add Design-MD panel and complete i18n coverage 2026-05-19 22:29:22 +08:00
op-git Merge branch 's3a-orchestrator' into v0.8.0-new 2026-05-23 01:27:30 +08:00
op-host-desktop feat(panels,canvas): editable gradients/effects + SVG/image import + locale-aware dialogs 2026-05-23 23:11:38 +08:00
op-host-native feat(panels,canvas): editable gradients/effects + SVG/image import + locale-aware dialogs 2026-05-23 23:11:38 +08:00
op-host-web feat(panels,canvas): editable gradients/effects + SVG/image import + locale-aware dialogs 2026-05-23 23:11:38 +08:00
op-i18n Merge branch 's3a-orchestrator' into v0.8.0-new 2026-05-23 01:27:30 +08:00
op-mcp fix(ai): keep debug_validation_report out of the production MCP catalog 2026-05-23 18:39:09 +08:00
op-opmerge Merge branch 's3a-orchestrator' into v0.8.0-new 2026-05-23 01:27:30 +08:00
op-orchestrator feat(panels,canvas): editable gradients/effects + SVG/image import + locale-aware dialogs 2026-05-23 23:11:38 +08:00
op-pen-loader feat(panels,canvas): editable gradients/effects + SVG/image import + locale-aware dialogs 2026-05-23 23:11:38 +08:00
wasm-libc-shim fix: clear clippy -D warnings across the workspace 2026-05-17 01:26:29 +08:00
CLAUDE.md docs: fix stale i18n + renderer paths flagged by Codex review 2026-05-16 15:45:54 +08:00