Motion foundation + expressive entrance/interaction polish for the
webapp, following a "balanced" direction (restrained chrome, expressive
canvas).
Foundation
- Motion tokens: --ease-*/--dur-* CSS vars (styles.css) mirrored as JS
constants/presets in lib/motion.ts; prefers-reduced-motion respected.
- Shared Reveal/RevealGroup primitive (components/motion) — fade-up +
stagger.
Chrome & navigation
- Global route fade (components/motion/page-transition) keyed by
section.
- Sidebar active-indicator slide via framer layoutId + icon hover.
Pages
- Home: hero/eyebrow reveal, staggered launcher cards, spring lift/press
hover, double-bezel cards, nested arrow chip.
- Auth: AuthHeader staggers in (login+signup); form blocks cascade
after.
- Pricing: wire the orphaned data-reveal hero through the real Reveal.
- Library: sliding active indicator on tab/filter switchers (layoutId),
shimmer-sweep loading skeleton.
Pagescene entrance animations (user-drop only)
- EntranceAnimator: meshes get a transform-based pop/rise/fall drop with
a rubbery squash overshoot; splats get a per-gaussian radial settle
(Spark dyno) with center-out fade + height drop. Dev-only speed slider.
Gallery + asset drag-under UX
- On drag-start the gallery/asset modal becomes pointer-transparent so
the drag passes under onto the canvas; steps back to translucent (reopen
on) or eases fully out (reopen off), all interpolated. Shared DragGhost
(lift/tilt/follow) feeds both DnD systems. Media fades to placeholders
so thumbnails don't block the canvas. Asset modal always reopens fully
visible.
PageDraw: entrance fade on add + workspace vignette.
Dev-only (local testing): drop setDevelopment() API host pin; add /__cdn
proxy + maybeProxyCdnUrl so CDN splat/GLB assets dodge CORS.
The netlify_build.sh referenced by the Netlify build command was never
committed, so the build failed with "No such file or directory".
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add bitrate selector to video create page
- Add bitrate / bitrate_options / bitrate_default to OmniGenApi TS types
- Add bitrate to video UI store (sticky + persisted)
- Send bitrate in generate and cost-estimate requests
- Render Bitrate popover (desktop) and drawer section (mobile), shown
only when the model returns bitrate_options
Swap the underline for a shared MarkerHighlight SVG stroke behind the word. Desktop reveal wipes left-to-right via clip-path instead of scaleX so the stroke is uncovered, not stretched.
…y CTA
- Manifesto: drop "3D" and animate a blue underline on "control"
- Feature cards: scroll-driven stacking deck (scale back + fade once
covered)
- Use Every Model: fill chips from canonical model list with correct
brand icons
- Use Every Model: alternating-direction marquees, highlight on hover
- Stop renting: italicize "renting"; make the good/bad comparison read
clearly
- Community CTA: "Join our community" banner restyled to fit site + not
steal focus from final CTA
Align the shared @storyteller/ui-moodboard surface with the webapp's design
language across both hosts (Tauri desktop + webapp), plus several UX fixes.
Theming & layout
- Use `var(--st-bg, hsl(0 0% 9%))` for the workspace/grid background so desktop
follows the active theme while the webapp falls back to its --background token
(replaces the desktop-only bg-ui-background class).
- Fix desktop overflow: the fixed TopBar is 56px, so the moodboard tab now uses
h-screen + pt-[56px] + overflow-hidden, killing the stray vertical/horizontal
scrollbars on an empty board. Grid view root clips too.
Empty state & toolbars
- Empty-state Upload / From-library CTAs now use the shared Button, matching the
webapp create pages (h-12, pill, semibold; primary + secondary).
- Restyle SelectionBar to match the library multiselect bar (solid pill, filled
bg-ui-controls buttons, red Delete, round clear); align the "Move to"
menu/items/Kbd to the same idiom.
- Restyle SmartSearchBar (bg-ui-controls, rounded-xl) and tighten ToolbarShell
padding.
- Add a tooltip to the toolbar's Add Color button to match the sibling buttons.
Notes
- Adding a note creates an empty, immediately-editable note (autofocusing inline
textarea; commit on blur/Enter, Shift+Enter newline, Esc reverts); double-click
re-enters edit mode — no more stuck "New note".
- Pad the note's top so the selection check no longer overlaps the first line.
Selection
- Clicks accumulate: clicking an item adds it to the selection (clicking again
removes it), so multi-select builds up without a modifier; background click
clears. "Use as reference" only shows when the selection has a
reference-capable image.
Item inspector
- Redesign ItemInspector to mirror the shared LightboxModal: a bounded, centered,
draggable/resizable Modal with media on a dark plate, hover nav arrows, and a
fixed info/actions column using shared Buttons.
Webapp homepage
- Add a Moodboard card next to Edit Video on the webapp home page.