= 1.2.1 =
* Momentum coasting now stops crisply: stronger tail friction kicks in below a velocity threshold, removing the visible frame-stepping at the end of a flick. Flick distance is nearly unchanged.

= 1.2.0 =
* Frames are preloaded, decoded, and drawn from in-memory images so rotation no longer flashes white between frames.
* A flick now coasts with friction (lazy-susan inertia) until it slows to a stop; grabbing again takes over immediately.

= 1.1.1 =
* Spin frames now upload to /uploads/product-spins/product-{id}/ rather than a slug-named folder. A slug folder went stale as soon as a product was renamed — frames already uploaded stayed under the old name while later ones landed under the new one, splitting a single product's frames across two folders. Nothing broke, since attachments carry their own paths, but the folder stopped matching the product, which is the only reason to have the folder. Existing files are not moved and continue to work.

= 1.1.0 =
* First gallery slide placement: inject the spin as an extra first slide without replacing the theme gallery, zoom, lightbox, or thumbnails.
* Falls back to below-summary when the theme does not run the standard WooCommerce gallery filter.
* Catalog 360° badge on shop and category thumbnails for products that have frames (opt out under WooCommerce → Settings → Products). Viewer assets are not loaded on archives.
* Viewer init is idempotent for cloned/replaced gallery slides; preload waits until the container has a non-zero size.

= 1.0.0 =
* Initial release.
* Product metabox for attaching and ordering media-library frames.
* Shortcode `[product_spin]`.
* Optional product tab and below-summary placements.
* Vanilla JS viewer: drag, touch, keyboard, optional autoplay, lazy preload.
* Media-library hygiene for spin frames.
* Uploads from the metabox go to `uploads/product-spins/{product-slug}/`.
