Before: pasteLayersFromClipboard clamped each item's w / h individually to the target bounds, then re-centred any item whose box landed out-of-bounds. With multiple copied items, this: - Collapsed every out-of-bounds item onto the same centred position (lost their relative positions). - Gave each item a different effective scale (lost their relative sizes). So a "Copy All" → cross-mode paste turned a tidy 4-layer composition into a pile of overlapping clamped boxes. Now: compute the bounding box once across every clipboard item, pick a single scale (only shrinks — never enlarges — so a paste into a larger target keeps items at their original size), and apply one shared translation that centres the (possibly scaled) bbox in the target. Both axes use the same scale, preserving the group's aspect ratio. Items missing w / h fall back to 70%-of-target uniformly, so the default-size path can't desync either. Result: - Two items copied with their original gap and a 2:1 size ratio retain that gap and ratio after paste, regardless of target size. - A wide cover → narrow disc paste shrinks everything proportionally rather than collapsing edges onto the centre. - Same-mode paste with everything already in-bounds is unchanged (scale stays at 1; translation is identity). TODO.md: move the resolved colour-picker work to "Shipped (recent)". Co-Authored-By: Claude Opus 4.7 <[email protected]>
4.7 KiB
Artstr Studio — TODO
Running list of deferred work. Detailed specs for the larger items live in
docs/. Each entry notes scope and where the spec is (if any).
Adam's working list
- Slide deck PDF export. Add multi-slide PDF export for slide presentations, producing one page per slide.
- Copy / paste transform consistency. Audit Copy, Paste, Copy All, and cross-target paste so copied objects keep consistent position and scale relative to the other copied objects, without unexpected misalignment or rescaling.
QR code layer — remaining phases
Phases A and B shipped (the qr layer type: data, error-correction level,
quiet zone, module / background colors, transparent background, renders
on every surface + canvas export, JSON round-trip; plus "Insert npub" and
"Insert share link" buttons under the QR data field).
- Phase C — visual polish. Optional center logo overlay and rounded modules. Riskier: a logo eats into the error-correction budget, so it should nudge the ECC level up. Skippable.
Editor / tool UX
Small editor-usability improvements — no spec doc; scoped here.
Shipped: on-canvas drag-resize handles for every layer type, text-box resize that never rescales the point size, the expanded Text tool panel (font / size / color / alignment / bold / italic), a collapsible sidebar toggle that fits the early-web aesthetic. Add new editor-UX items below.
Profile pages — deferred polish
(Core profile pages at /u/<npub> already shipped.)
- Make author chips clickable in the community thread view (comments and
reposts) — currently only feed-card and preview-meta author chips route to
openProfilePage. - About-text clamp — long bios overflow the profile header; clamp to ~4 lines with a "Show more" toggle.
- Profile-grid pagination — an author with 100+ designs renders them all at once; cap the initial render and add a "Show more" pager.
Edit-published-designs — deferred polish
(Core edit-in-place via NIP-33 replaceable semantics already shipped.)
- Replace the remaining
confirm()calls in the edit / publish flow with the styled in-app modal pattern, for consistency with the close-project and publish-confirm modals. - "Editing a previously-deleted design" warning — if the user opens Edit on a design they had tombstoned with a kind-5, warn that publishing will republish it.
Drafted-but-unbuilt features
Each has a full spec in docs/.
- Private (encrypted) publishing —
docs/PRIVATE_PUBLISHING_FEATURE.md. Publish any design encrypted, readable only by the author (Phase 1 "private to me"). The agreed next build; Phase 0 is a validation spike. - Artstr Stacks —
docs/STACKS_FEATURE.md. Interactive fullscreen page/card stacks (HyperCard for Nostr) — the Slide Deck extended with layer actions and an interactive viewer. Queued after private publishing. - Badges (NIP-58) —
docs/BADGES_FEATURE.md. Award / display Nostr badges on profile pages. - Collections (NIP-51 sets) —
docs/COLLECTIONS_FEATURE.md. Let users organize favorite community templates into named sets. - Zap-gated premium templates —
docs/ZAP_GATED_TEMPLATES_FEATURE.md. Creators mark a template premium with a minimum-zap threshold. - Zaps via Nostr Wallet Connect —
docs/ZAPS_NWC_FEATURE.md. In-app zapping without the wallet handoff. (Tracked LNURL-pay tips already ship; this would be the NWC path.)
Shipped (recent)
-
Pixel-editor colour picker — ported the OS native
<input type="color">over from the vector tools (same swatch styling; opens the OS picker with its built-in eyedropper on click). Removed the Screen-Capture-API screen- eyedropper workaround (~170 lines of dead code). Palette swatches and the in-canvas eyedropper tool now sync the picker too, so grabbing a palette colour as the starting point for a tweaked variant just works. -
Pixel Art —
docs/PIXEL_ART_FEATURE.md. Phases A–D all shipped: embeddedpixelartlayer + standalonecasewrap-pixelartdesign, PNG / sprite-sheet / GIF export, drawing tools (line / rect / ellipse, flip / rotate, grid resize), animation (multi-frame timeline, playback, onion-skin), image → pixelize, and animated previews in every preview surface. Undo / redo integrated with the top-level toolbar. -
Pixel editor layout expansion — addressed by the collapsible sidebar (gives both the pixel and vector editors a lot more breathing room when needed).
-
Print / Save event ID wrapping — the event-id
<dd>already usesoverflow-wrap: anywhere; word-break: break-word, so no horizontal scroll. -
TMDB auto-fill cleanup —
docs/TMDB_AUTOFILL_FEATURE.mdremoved.