asciify-engine 4.21.0 → 4.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/README.md +7 -0
  2. package/dist/{animation-presets-DztfFvTc.d.cts → animation-presets-CEdD0FMM.d.cts} +42 -28
  3. package/dist/{animation-presets-Bqupq1Gx.d.ts → animation-presets-KnEWoJ_q.d.ts} +42 -28
  4. package/dist/core.cjs +1 -1
  5. package/dist/core.d.cts +4 -4
  6. package/dist/core.d.ts +4 -4
  7. package/dist/core.js +1 -1
  8. package/dist/{hover-guide-DKRQPtDO.d.cts → hover-guide-CAfsLjFZ.d.cts} +56 -77
  9. package/dist/{hover-guide-DKRQPtDO.d.ts → hover-guide-CAfsLjFZ.d.ts} +56 -77
  10. package/dist/hover.cjs +1 -1
  11. package/dist/hover.d.cts +6 -6
  12. package/dist/hover.d.ts +6 -6
  13. package/dist/hover.js +1 -1
  14. package/dist/index.cjs +1 -1
  15. package/dist/index.d.cts +3 -3
  16. package/dist/index.d.ts +3 -3
  17. package/dist/index.js +1 -1
  18. package/dist/{model-D2L86aNZ.d.ts → model-BHIQYYk-.d.ts} +1 -1
  19. package/dist/{model-BNShxUhx.d.cts → model-BzgEEqzP.d.cts} +1 -1
  20. package/dist/studio.cjs +1 -1
  21. package/dist/studio.d.cts +4 -5
  22. package/dist/studio.d.ts +4 -5
  23. package/dist/studio.js +1 -1
  24. package/dist/{types-Bmu4dXdQ.d.ts → types-C9lka3yC.d.ts} +2 -2
  25. package/dist/{types-Cn3wY-ST.d.cts → types-DOl5f2x3.d.cts} +2 -2
  26. package/package.json +1 -1
  27. package/skills/asciify-engine/SKILL.md +3 -3
  28. package/skills/asciify-engine/references/design-matching.md +1 -1
  29. package/skills/asciify-engine/references/looks.md +2 -2
  30. package/skills/asciify-engine/references/studio-effects.md +21 -6
  31. package/skills/asciify-engine/references/studio-workspace.md +6 -7
  32. package/skills/asciify-engine/references/upgrading.md +6 -0
@@ -1,8 +1,8 @@
1
- import { A as AmbientMotion } from './hover-guide-DKRQPtDO.js';
1
+ import { A as AmbientMotion, L as LegacyAmbientMotion } from './hover-guide-CAfsLjFZ.js';
2
2
 
3
3
  type ColorMode = 'grayscale' | 'fullcolor' | 'matrix' | 'accent';
4
4
  type RenderMode = 'ascii' | 'dots';
5
- type AnimationStyle = AmbientMotion;
5
+ type AnimationStyle = AmbientMotion | LegacyAmbientMotion;
6
6
  /** Core media draws ASCII/dots; use StudioStyle for the 15 render styles. */
7
7
  type ArtStyle = 'classic';
8
8
  type HoverEffect = 'spotlight' | 'magnify' | 'repel' | 'glow' | 'colorShift' | 'attract' | 'shatter' | 'trail' | 'glitchText';
@@ -1,8 +1,8 @@
1
- import { A as AmbientMotion } from './hover-guide-DKRQPtDO.cjs';
1
+ import { A as AmbientMotion, L as LegacyAmbientMotion } from './hover-guide-CAfsLjFZ.cjs';
2
2
 
3
3
  type ColorMode = 'grayscale' | 'fullcolor' | 'matrix' | 'accent';
4
4
  type RenderMode = 'ascii' | 'dots';
5
- type AnimationStyle = AmbientMotion;
5
+ type AnimationStyle = AmbientMotion | LegacyAmbientMotion;
6
6
  /** Core media draws ASCII/dots; use StudioStyle for the 15 render styles. */
7
7
  type ArtStyle = 'classic';
8
8
  type HoverEffect = 'spotlight' | 'magnify' | 'repel' | 'glow' | 'colorShift' | 'attract' | 'shatter' | 'trail' | 'glitchText';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "asciify-engine",
3
- "version": "4.21.0",
3
+ "version": "4.22.0",
4
4
  "description": "Framework-agnostic ASCII art engine. Convert images, videos, and GIFs into ASCII art rendered on canvas, or run full-bleed GPU character fields with a fluid cursor wake.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -2,13 +2,13 @@
2
2
  name: asciify-engine
3
3
  description: Apply Asciify the way asciify.org does - ASCII components and backgrounds that belong in a real interface, inked from the theme, clear around text, inside the page's radii and motion. Use for UI components in characters (loading, status, toasts, tabs, AI states, charts, transitions, pages), animated ASCII backgrounds, and also photo, video and GIF conversion, GPU character fields, artwork looks for wallpapers, posters and prints, art styles and export, hover and motion, layered typography and rendering performance.
4
4
  metadata:
5
- tested-engine: "4.21.0"
5
+ tested-engine: "4.22.0"
6
6
  updated: "2026-10-17"
7
7
  ---
8
8
 
9
9
  # Asciify Engine
10
10
 
11
- Use the published `asciify-engine` npm package. Tested against **4.21.0**. Check the application's installed version and its public types before using newer options; a local checkout can contain unpublished changes.
11
+ Use the published `asciify-engine` npm package. Tested against **4.22.0**. Check the application's installed version and its public types before using newer options; a local checkout can contain unpublished changes.
12
12
 
13
13
  - Agent entry: https://asciify.org/skill (redirects to this Markdown document).
14
14
  - Components: https://asciify.org/components · Looks: https://asciify.org/looks · Backgrounds: https://asciify.org/backgrounds
@@ -153,7 +153,7 @@ Preview it: letter glyph densities differ, so arbitrary words are not automatica
153
153
 
154
154
  The core `HoverEffect` IDs are `spotlight`, `magnify`, `repel`, `glow`, `colorShift`, `attract`, `shatter`, `trail`, and `glitchText`. Those remain valid APIs, but they are **not identical to the current website's enhanced interactions**.
155
155
 
156
- The website offers **Trail, Dissolve, Contour, Emboss, Ripple rings, Ink bleed, Water, Silk, Vortex, Magnetic Pull, Scatter, Elastic, Lens wake, Smudge, Loupe, Reveal, Repel, Tilt, Heat haze, and Off** through an optional studio surface module, each with `scope: 'all' | 'subject' | 'outside'` to keep it on a cut-out subject or around it (`rake` is retired and plays Silk). Its fourteen still-image motions—Caustics, Slow Current, Reveal & Reform, Sheen, Tidal Rings, Living Grain, Parallax, Woven Flow, Print Shift, Contour Light, Relight, Shimmer, Breeze, Unfold—and fine-dither treatments ship in the same `asciify-engine/hover` module. Use its typed options rather than converting display names into engine `hoverEffect` or `animationStyle` values.
156
+ The website offers **Trail, Dissolve, Contour, Emboss, Ripple rings, Ink bleed, Water, Silk, Vortex, Magnetic Pull, Scatter, Elastic, Lens wake, Smudge, Loupe, Reveal, Repel, Tilt, Heat haze, and Off** through an optional studio surface module, each with `scope: 'all' | 'subject' | 'outside'` to keep it on a cut-out subject or around it (`rake` is retired and plays Silk). Its ten photo-aware still-image motions—Relight, Specular sweep, Highlight bloom, Glints, Parallax, Slow push, Focus pull, Mist, Drift, Develop—read the image's own light and depth (retired IDs such as `caustics` load as their closest replacement), and they and the fine-dither treatments ship in the same `asciify-engine/hover` module. Use its typed options rather than converting display names into engine `hoverEffect` or `animationStyle` values.
157
157
 
158
158
  To reproduce those interactions, read [references/studio-effects.md](references/studio-effects.md). Import `mountHover` from `asciify-engine/hover`; no separate download is needed. Keep engine `hoverStrength: 0` and `animationStyle: 'none'` when using it, to avoid applying two effects. Trail is the site's default. Prefer a stationary-grid effect such as Trail or Dissolve when the user wants a wake without spatial displacement.
159
159
 
@@ -82,7 +82,7 @@ A still photo can be made to feel alive, and many users want that. Others want i
82
82
  | API | Living | Still |
83
83
  | --- | --- | --- |
84
84
  | `/field` | `drift: 0.15–0.35` so a photo breathes; or a video `source`; or `scene: 'flow' \| 'orb'` with no media | A media `source`, `drift: 0`, and `hover: 'lantern'` or `'none'`. With no pointer it draws once and stops working |
85
- | `/studio` | `motion: { type: 'sheen' \| 'breeze' \| 'relight' \| 'shimmer', speed: 0.4–0.8, amount: 0.3–0.6 }` for calm life; `'current'`, `'tidal'`, `'caustics'` for stronger; or a `STUDIO_ANIMATION_PRESETS` entry such as `quiet-light` | `motion: { type: 'none' }`, and `hover.effect: 'none'` or a stationary one such as `'trail'` |
85
+ | `/studio` | `motion: { type: 'relight' \| 'sheen' \| 'glow' \| 'mist', speed: 0.4–0.8, amount: 0.5–0.9 }` for calm life; `'parallax'`, `'push'`, `'focus'`, `'current'` for depth; or a `STUDIO_ANIMATION_PRESETS` entry such as `quiet-light` | `motion: { type: 'none' }`, and `hover.effect: 'none'` or a stationary one such as `'trail'` |
86
86
  | `/hover` over a core render | `motion: 'sheen'` (any `AmbientMotion`) | `motion: 'none'`; core `animationStyle: 'none'` |
87
87
 
88
88
  Autonomous motion that lasts longer than five seconds needs a visible pause control (WCAG 2.2.2). Prefer slow speeds; motion should be noticed on the second look, not the first.
@@ -858,7 +858,7 @@ const art = await mountStudio(canvas, '/your-video.mp4', {
858
858
  ## wallpaper: Wallpaper
859
859
  Category: Characters
860
860
  Use it for: a living desktop or phone wallpaper, a screensaver, or a full-bleed artwork that moves on its own.
861
- Settings: `studioLook('wallpaper')`: ASCII, `#e6e3da` ink over the source blurred 18px at .4 opacity on `#0b0b0a`, caustics motion at speed .35.
861
+ Settings: `studioLook('wallpaper')`: ASCII, `#e6e3da` ink over the source blurred 18px at .4 opacity on `#0b0b0a`, Relight motion at speed .35 and strength .8.
862
862
 
863
863
  Prompt:
864
864
  “Make [my photo] into a living wallpaper with asciify-engine: ASCII characters over a softened, blurred copy of the photo, with slow caustic light moving through them. Export one seamless loop as a 1920×1440 MP4 and a 3200×2400 PNG still.”
@@ -871,7 +871,7 @@ const media = await loadStudioMedia(file);
871
871
  try {
872
872
  const loop = await exportStudio({ frame: () => media.frame(0) }, settings, {
873
873
  format: 'mp4', width: 1920, height: 1440, referenceWidth: 960, fps: 30,
874
- duration: 12 / settings.motion.speed, maxCells: 131072, // one full caustics cycle loops cleanly
874
+ duration: 12 / settings.motion.speed, maxCells: 131072, // one full Relight orbit loops cleanly
875
875
  });
876
876
  } finally { media.destroy(); }
877
877
  ```
@@ -86,7 +86,22 @@ Coverage is feathered over about 2% of the short side, so a scoped hover fades s
86
86
 
87
87
  ## Still-image motion and dither
88
88
 
89
- The module's `motion` IDs are `none`, `caustics` (traveling light on a fixed grid), `current` (Slow Current), `reform` (Reveal & Reform), `sheen` (diagonal light sweep), `tidal` (Tidal Rings), and `grain` (Living Grain). 4.4 adds `parallax` (shallow drift), `weave` (interlaced flow), `print` (staggered row registration), and `trace` (light that follows source-image tonal contours). Sheen, Living Grain and Contour Light keep the grid anchored. Contour Light uses source luminance; pass `getFrame` for exact source tones when layering a surface over an existing canvas. Keep source-video motion alone unless the user intentionally wants another animation layered onto it. For a still, select one motion and a restrained `motionSpeed`, rather than stacking effects.
89
+ Still-image motion reads the photograph itself (its soft luminance, a relief normal, highlight nearness, local detail and an estimated depth, rebuilt per source frame) so light and movement are motivated by the image instead of laid over it. The `motion` IDs:
90
+
91
+ | ID | Label | Group | What moves | Grid |
92
+ |---|---|---|---|---|
93
+ | `relight` | Relight | Light | A key light circles the subject and models its own relief; flat areas stay put. | anchored |
94
+ | `sheen` | Specular sweep | Light | One slow pass of light across the upper midtones and highlights, bent by their form, then a rest. | anchored |
95
+ | `glow` | Highlight bloom | Light | The brightest areas breathe a halo outward; deep shadows stay deep. | anchored |
96
+ | `shimmer` | Glints | Light | Sparse, phased glints only on bright fine detail (water, metal, eyes). | anchored |
97
+ | `parallax` | Parallax | Depth | Slow camera drift; near and far move against each other. | resampled |
98
+ | `push` | Slow push | Depth | Ken Burns push toward the subject's center and back; nearer areas move slightly more. Never samples outside the frame. | resampled |
99
+ | `focus` | Focus pull | Depth | Focus racks from subject to background and back; out-of-focus areas flatten toward their neighbourhood. | anchored |
100
+ | `mist` | Mist | Atmosphere | Soft mist drifts through the distance and plain areas only. | anchored |
101
+ | `current` | Drift | Atmosphere | Cinemagraph flow in smooth, distant areas; the detailed subject holds. | resampled |
102
+ | `develop` | Develop | Reveal | Holds, fades, then develops back in from highlights to shadows. | anchored |
103
+
104
+ "Anchored" motions change light only. "Resampled" motions move the image through a fixed character grid, so every glyph stays aligned and readable. Light motions mostly brighten the ink and change character density for only part of the shift, so light glows instead of flickering. Every motion except Relight, Glints and Mist shows the untouched still at time 0, which is what reduced motion and a paused preview display. Retired IDs still load as their closest replacement (`DEPRECATED_STUDIO_MOTIONS`): `caustics` → `sheen`, `grain` → `shimmer`, `trace` → `relight`, `tidal`/`weave`/`breeze` → `current`, `reform`/`print`/`unfold` → `develop`. Keep source-video motion alone unless the user intentionally wants another animation layered onto it. For a still, select one motion and a restrained `motionSpeed`, rather than stacking effects.
90
105
 
91
106
  For the website's fine-dither treatment, use the module's `fineDither: true` and `ditherStrength` after matching the backing canvas's character settings. This is separate from the core renderer’s built-in dither behavior. Check a still and a moving scene for flicker before choosing the default.
92
107
 
@@ -105,19 +120,19 @@ Version 1.3.0 adds text-shaped charcoal cutouts (`textMask`), peripheral scanlin
105
120
 
106
121
  ## Catalogs and useful combinations (4.4)
107
122
 
108
- Build controls from `STUDIO_HOVERS`, `HOVER_SCOPES` and `STUDIO_MOTIONS`, exported by `/studio` and `/hover`. Each entry includes `value`, `label` and `description` (hovers also a `group`). Show the scope control as a segmented choice next to the hover settings. Use the `value` as the API ID; “Emboss” is `etch` and “Contour Light” is `trace`. Do not maintain a second hard-coded menu or use the legacy core hover IDs for these interactions.
123
+ Build controls from `STUDIO_HOVERS`, `HOVER_SCOPES` and `STUDIO_MOTIONS`, exported by `/studio` and `/hover`. Each entry includes `value`, `label` and `description` (hovers also a `group`). Show the scope control as a segmented choice next to the hover settings. Use the `value` as the API ID; “Emboss” is `etch`, “Specular sweep” is `sheen` and “Drift” is `current`. Do not maintain a second hard-coded menu or use the legacy core hover IDs for these interactions.
109
124
 
110
- For a fixed grid, try Contour Light with Emboss. For continuous spatial movement, try Parallax with Elastic. For a fabric-like treatment, try Woven Flow with Rake. These are combinations of two independent settings, not additional art styles. Keep strength restrained until you have checked the source at actual display size.
125
+ For a fixed grid, try Relight with Emboss. For depth, try Parallax or Slow push with Tilt. For water and sky, try Drift with Ripple rings. These are combinations of two independent settings, not additional art styles. Keep strength restrained until you have checked the source at actual display size.
111
126
 
112
127
  All ambient modes repeat after `12 / speed` seconds. Looping the motion does not guarantee that a source video, film grain, dust, glitch or animated dither has the same boundary. Exported PNG/JPEG captures one frame; MP4/WebM/GIF carries autonomous motion, not live pointer movement. For complete composition export, use `/studio` rather than capturing the hover overlay.
113
128
 
114
129
  The pointer simulations have bounded storage. Elastic allocates its two velocity buffers only when first selected; idle effects stop. This is not a device-independent FPS promise. Test dense grids, fast reversal and the actual finish stack on the target device.
115
130
 
116
- ## Lively images (4.10)
131
+ ## Lively images
117
132
 
118
- The catalogs contain nineteen active hover effects and fourteen active ambient motions, plus Off for each. New motion IDs are `relight`, `shimmer`, `breeze`, and `unfold`. Relight models midtones with a rotating light field; Shimmer slowly animates source highlights. Both keep geometry stationary. Breeze bends the image with a traveling sway. Unfold closes and opens staggered panels, then holds the complete image. All use deterministic 12-second base cycles; `motion.speed` changes cycle duration, `motion.amount` changes strength. These are local image treatments, not AI-generated scene or subject motion.
133
+ The catalogs contain nineteen active hover effects and ten active ambient motions, plus Off for each (see the table above). All use deterministic 12-second base cycles; `motion.speed` changes cycle duration, `motion.amount` (0–2) changes strength. These are local image treatments driven by the photo's own light and depth estimate, not AI-generated scene or subject motion; the depth estimate favours a subject found from alpha or a plain ground, then sharp, central, lower detail.
119
134
 
120
- `STUDIO_ANIMATION_PRESETS` is exported by `/studio` and `/hover`. Its six entries have `id`, `label`, `description`, `motion: {type,speed,amount}`, and `hover: {effect,radius,strength}`. These are editable combinations, not additional renderer styles. Do not overwrite the rest of a user's settings to apply one:
135
+ `STUDIO_ANIMATION_PRESETS` is exported by `/studio` and `/hover`. Its seven entries have `id`, `label`, `description`, `motion: {type,speed,amount}`, and `hover: {effect,radius,strength}`. These are editable combinations, not additional renderer styles. Do not overwrite the rest of a user's settings to apply one:
121
136
 
122
137
  ```ts
123
138
  import { mountStudio, STUDIO_ANIMATION_PRESETS } from 'asciify-engine/studio';
@@ -113,7 +113,7 @@ For PNG/JPEG, pass `time: player.time` and `motionTime: player.motionTime` to `e
113
113
 
114
114
  ## Still-image motion (3.0)
115
115
 
116
- Import `STUDIO_MOTIONS` from `/studio` to populate controls; each item has `value`, `label`, and `description`. Use `motion: { type: 'caustics' | 'current' | 'reform' | 'none', speed: 1 }`. Off is the default. Caustics preserves the grid, Current introduces fluid displacement, and Reform uses a staggered dissolve with a readable hold. Loops last 12 / speed seconds and preserve source/accent/gray color choice. Speed is 0.1–3. Do not combine source video with ambient motion unless requested. Hover remains independently configurable. Retired saved motion names normalize to Off. See [upgrading.md](upgrading.md) before moving an existing integration to 3.0.
116
+ Import `STUDIO_MOTIONS` from `/studio` to populate controls; each item has `value`, `label`, and `description`. Use `motion: { type: 'relight' | 'sheen' | 'glow' | 'shimmer' | 'parallax' | 'push' | 'focus' | 'mist' | 'current' | 'develop' | 'none', speed: 1 }`. Off is the default. Every motion reads the photo's own light and depth ([studio-effects.md](studio-effects.md#still-image-motion-and-dither)); retired IDs such as `caustics` load as their closest replacement. Loops last 12 / speed seconds and preserve source/accent/gray color choice. Speed is 0.1–3. Do not combine source video with ambient motion unless requested. Hover remains independently configurable. Names retired in 3.0 normalize to Off; later retired names map to a current motion. See [upgrading.md](upgrading.md) before moving an existing integration to 3.0.
117
117
 
118
118
  ## Sharp previews (3.0.1)
119
119
 
@@ -166,9 +166,8 @@ and `scatter` (radial, spatially varied scatter that relaxes). Both retain a
166
166
  bounded field after cursor exit; radius and strength control the response.
167
167
  Use `hover.effect` in Studio and `effect` in mountHover. Defaults remain unchanged.
168
168
 
169
- Still-image motion now has six active choices: `caustics`, `current`, `reform`,
170
- `sheen`, `tidal`, and `grain`, plus `none`. Sheen and Living Grain change tone
171
- without displacement; Tidal Rings moves the image with protected edges.
169
+ Still-image motion: see the current catalog in [studio-effects.md](studio-effects.md#still-image-motion-and-dither).
170
+ Light motions change tone without displacement; depth motions move the image through a fixed grid.
172
171
  Set Studio `motion: { type: 'sheen', speed: 0.7, amount: 0.6 }`.
173
172
  Core uses `animationStyle`; mountHover uses `motion` and `motionSpeed`.
174
173
  Base cycles last 12 seconds; speed scales duration. Studio amount scales strength.
@@ -182,9 +181,9 @@ Stationary artwork, masks, lights, backdrops and character bloom are cached whil
182
181
 
183
182
  ## Expanded motion library (4.4)
184
183
 
185
- Use `STUDIO_HOVERS` and `STUDIO_MOTIONS` to show all available hovers and still-image motions, plus Off, grouped by behavior. New hover IDs are `etch`, `elastic`, `rake`; new motion IDs are `parallax`, `weave`, `print`, `trace`. `hover.radius` and `hover.strength` are independent of `motion.speed` and `motion.amount`. All remain serialized in look links and saved projects. A static photo needs no video input or AI service to animate.
184
+ Use `STUDIO_HOVERS` and `STUDIO_MOTIONS` to show all available hovers and still-image motions, plus Off, grouped by behavior. New hover IDs are `etch`, `elastic`, `rake`; the 4.4 motions were later replaced by photo-aware ones (see [upgrading.md](upgrading.md)). `hover.radius` and `hover.strength` are independent of `motion.speed` and `motion.amount`. All remain serialized in look links and saved projects. A static photo needs no video input or AI service to animate.
186
185
 
187
- Example: `player.update({ motion: { type: 'trace', speed: 1, amount: .7 }, hover: { effect: 'etch', radius: .45, strength: .65 } })`. Tone and character choices remain yours. See [effect behaviors and combinations](studio-effects.md#catalogs-and-useful-combinations-44). Do not run several looping thumbnail canvases just to display this catalog; apply the selected treatment to one shared preview.
186
+ Example: `player.update({ motion: { type: 'relight', speed: 1, amount: .7 }, hover: { effect: 'etch', radius: .45, strength: .65 } })`. Tone and character choices remain yours. See [effect behaviors and combinations](studio-effects.md#catalogs-and-useful-combinations-44). Do not run several looping thumbnail canvases just to display this catalog; apply the selected treatment to one shared preview.
188
187
 
189
188
  ## Tonal detail and blue noise (4.5)
190
189
 
@@ -202,7 +201,7 @@ const player = await mountStudio(canvas, '/portrait.jpg', {
202
201
  style: 'dither',
203
202
  color: { gamma: 1.12, shadows: .15, highlights: -.12 },
204
203
  dither: { algorithm: 'blue-noise', palette: 'gray8', scale: 3 },
205
- motion: { type: 'trace', speed: .7, amount: .25 },
204
+ motion: { type: 'relight', speed: .7, amount: .4 },
206
205
  },
207
206
  maxDimension: 960,
208
207
  maxCells: 65536,
@@ -85,3 +85,9 @@ Six additional `STUDIO_STYLES` use optional `print` settings. Existing v1 settin
85
85
  ## 4.10 interaction expansion
86
86
 
87
87
  Adds `lens`, `smudge`, `ripple` hover and `relight`, `shimmer`, `breeze`, `unfold` ambient motion. No IDs are removed and existing defaults remain. `STUDIO_ANIMATION_PRESETS` is exported by Studio and hover; its nested settings are shaped for `player.update`. Core accepts the new ambient IDs through `animationStyle`, with its existing simpler opacity treatment. Do not pass the new surface hover IDs to core `hoverEffect`. Update the npm dependency and refresh the agent skill separately; older packages do not implement these IDs.
88
+
89
+ ## Photo-aware motion and finish (after 4.21)
90
+
91
+ The still-image motions are rebuilt to read the photograph's own light, relief, highlights, detail and depth instead of laying a pattern over it. The catalog is `relight`, `sheen` (Specular sweep), `glow` (Highlight bloom, new), `shimmer` (Glints), `parallax`, `push` (Slow push, new), `focus` (Focus pull, new), `mist` (new), `current` (Drift) and `develop` (new), plus `none`. Retired IDs keep working everywhere (Studio settings, share links, `mountHover` `motion`, core `animationStyle`) and load as their closest replacement, listed in `DEPRECATED_STUDIO_MOTIONS`: `caustics` → `sheen`, `grain` → `shimmer`, `trace` → `relight`, `tidal`, `weave`, `breeze` → `current`, `reform`, `print`, `unfold` → `develop`. Normalized settings store the new ID. Depth motions now move the image through a fixed character grid instead of moving glyphs. `STUDIO_ANIMATION_PRESETS` keeps its six IDs with new pairings and adds `depth-study`; the `wallpaper` look uses Relight.
92
+
93
+ The optical finish's `bloom` is now a wide, soft-kneed halation screened over the image (no offset ghosts), and `grain` is fine triangular film grain weighted to the midtones. IDs and ranges are unchanged; existing looks render slightly softer and cleaner.