@supersuit/artifacts 0.4.3 → 0.4.5

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.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,31 @@
3
3
  `@supersuit/artifacts`. One entry per version, newest first. Each entry says what changed, how a
4
4
  host can tell whether it is affected (DETECTOR), what a host does about it (REMEDY), and the tests.
5
5
 
6
+ ## 0.4.5 (2026-09-27)
7
+
8
+ **The bubble ground looks as it did in 0.4.2, and stays smooth.**
9
+
10
+ - The palette and layout changes of 0.4.3 and 0.4.4 are reverted: the six original pastels, the
11
+ original stacking and gradient. What stays is the performance fix, done differently: each bubble
12
+ carries its own `filter: blur(40px)` on its own layer (`will-change: transform`), so it is
13
+ rasterised once and slid, instead of one blur over the whole screen re-rasterised every frame.
14
+ The hard-light blend stays off; side by side the render is indistinguishable.
15
+ - **DETECTOR:** the ground shows saturated magenta, teal or pink bubbles (0.4.3/0.4.4).
16
+ - **REMEDY:** update the dependency.
17
+ - **Tests:** the blur sits on the bubble, never on a full-screen wrapper; no blend; one bubble per
18
+ default colour.
19
+
20
+ ## 0.4.4 (2026-09-26)
21
+
22
+ **The glow stays on the cool-to-magenta arc.**
23
+
24
+ - 0.4.3's nine colours included coral, amber and lime, which put the warm half of the spectrum on
25
+ the page and read as a rainbow. `GLOW_PASTELS` is now brand blue, magenta, teal, purple, pink,
26
+ cyan, violet, sky and lavender: as many colours, none of them red, orange, yellow or green.
27
+ - **DETECTOR:** the animated ground shows orange, yellow or green.
28
+ - **REMEDY:** update the dependency. A pack that passes its own `backdrop.colors` keeps them.
29
+ - **Tests:** every default colour's hue sits between cyan and pink.
30
+
6
31
  ## 0.4.3 (2026-09-26)
7
32
 
8
33
  **The bubble ground runs smooth on a phone, and the glow runs the whole spectrum.**
@@ -1,6 +1,6 @@
1
1
  import type { Backdrop } from './pack.js';
2
- /** The Freedom Glow: a blue core and the full spectrum it separates into, one bubble per colour.
3
- * Saturated rather than pastel; the veil is what keeps a light page reading as light. */
2
+ /** The Freedom Glow's colours (a blue core and the spectrum it separates into), mixed most of
3
+ * the way to cream so a light page still reads as light. */
4
4
  export declare const GLOW_PASTELS: string[];
5
5
  export declare function Bubbles({ backdrop }: {
6
6
  backdrop: Backdrop;
@@ -1,18 +1,8 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- /** The Freedom Glow: a blue core and the full spectrum it separates into, one bubble per colour.
3
- * Saturated rather than pastel; the veil is what keeps a light page reading as light. */
4
- export const GLOW_PASTELS = [
5
- '90,150,255', // blue
6
- '165,120,245', // violet
7
- '235,110,210', // magenta
8
- '255,120,150', // rose
9
- '255,150,110', // coral
10
- '255,195,90', // amber
11
- '170,225,100', // lime
12
- '90,215,170', // mint
13
- '80,200,240', // cyan
14
- ];
15
- // [animation, duration s, transform-origin] per bubble, after animate-ui's six plus three more.
2
+ /** The Freedom Glow's colours (a blue core and the spectrum it separates into), mixed most of
3
+ * the way to cream so a light page still reads as light. */
4
+ export const GLOW_PASTELS = ['150,190,255', '215,185,240', '160,225,220', '250,195,180', '250,215,160', '190,210,255'];
5
+ // [animation, duration s, transform-origin] per bubble, after the original's six.
16
6
  const MOTION = [
17
7
  ['a-bubble-v', 30, 'center center'],
18
8
  ['a-bubble-c', 20, 'calc(50% - 400px) center'],
@@ -20,24 +10,17 @@ const MOTION = [
20
10
  ['a-bubble-h', 40, 'calc(50% - 200px) center'],
21
11
  ['a-bubble-c', 20, 'calc(50% - 800px) calc(50% + 200px)'],
22
12
  ['a-bubble-v', 35, 'calc(50% + 300px) calc(50% - 200px)'],
23
- ['a-bubble-h', 45, 'calc(50% + 200px) calc(50% + 300px)'],
24
- ['a-bubble-c', 30, 'calc(50% + 600px) calc(50% - 300px)'],
25
- ['a-bubble-v', 25, 'calc(50% - 300px) calc(50% + 400px)'],
26
- ];
27
- // [top %, left %] per bubble: spread over the page so neighbours overlap at their edges only.
28
- // Stacked in the middle, nine translucent hues average to grey.
29
- const HOME = [
30
- [-10, -15], [-15, 45], [15, 20], [30, -20], [35, 50], [55, 10], [65, 45], [80, -15], [85, 35],
31
13
  ];
32
- // Only `transform` animates, on its own layer, so the browser moves finished bitmaps and never
33
- // repaints. The first version put a 40px blur over the whole viewport and hard-light blended every
34
- // bubble, which re-rasterised the full screen each frame and stuttered on a phone; the radial
35
- // gradients already fade to nothing, so neither was buying softness.
14
+ // Each bubble is blurred on its OWN layer and only `transform` animates, so the browser rasterises
15
+ // it once and slides the bitmap. The first version blurred a full-screen parent and hard-light
16
+ // blended every bubble, which re-rasterised the whole viewport each frame and stuttered on a
17
+ // phone (2026-09-26). The colours and layout are unchanged from that version on purpose: an
18
+ // attempt to also widen the palette was reverted the same night ("really not a fan").
36
19
  const CSS = `
37
20
  @keyframes a-bubble-v{0%,100%{transform:translate3d(0,-50%,0)}50%{transform:translate3d(0,50%,0)}}
38
21
  @keyframes a-bubble-c{0%{transform:rotate(0deg)}50%{transform:rotate(180deg)}100%{transform:rotate(360deg)}}
39
22
  @keyframes a-bubble-h{0%,100%{transform:translate3d(-50%,-10%,0)}50%{transform:translate3d(50%,10%,0)}}
40
- [data-artifact-backdrop] .a-bubble{position:absolute;width:70%;height:60%;border-radius:9999px;will-change:transform;backface-visibility:hidden;animation-timing-function:ease-in-out;animation-iteration-count:infinite}
23
+ [data-artifact-backdrop] .a-bubble{position:absolute;width:80%;height:80%;top:10%;left:10%;border-radius:9999px;filter:blur(40px);will-change:transform;backface-visibility:hidden;animation-timing-function:ease;animation-iteration-count:infinite}
41
24
  @media (prefers-reduced-motion: reduce){[data-artifact-backdrop] .a-bubble{animation:none!important}}
42
25
  `;
43
26
  export function Bubbles({ backdrop }) {
@@ -46,13 +29,11 @@ export function Bubbles({ backdrop }) {
46
29
  return (_jsxs("div", { "data-artifact-backdrop": "bubbles", "aria-hidden": true, style: { position: 'fixed', inset: 0, zIndex: -1, overflow: 'hidden', background: 'var(--a-ground)', pointerEvents: 'none' }, children: [_jsx("style", { dangerouslySetInnerHTML: { __html: CSS } }), _jsx("div", { style: { position: 'absolute', inset: 0 }, children: colors.map((c, i) => {
47
30
  const [name, secs, origin] = MOTION[i % MOTION.length];
48
31
  return (_jsx("div", { className: "a-bubble", style: {
49
- background: `radial-gradient(closest-side, rgba(${c},0.9) 0%, rgba(${c},0.6) 35%, rgba(${c},0.2) 70%, rgba(${c},0) 100%)`,
32
+ background: `radial-gradient(circle at center, rgba(${c},0.8) 0, rgba(${c},0) 50%)`,
50
33
  animationName: name,
51
34
  animationDuration: `${secs}s`,
52
35
  animationDirection: i % 2 ? 'reverse' : 'normal',
53
36
  transformOrigin: origin,
54
- top: `${HOME[i % HOME.length][0]}%`,
55
- left: `${HOME[i % HOME.length][1]}%`,
56
37
  } }, i));
57
38
  }) }), _jsx("div", { style: { position: 'absolute', inset: 0, background: `color-mix(in srgb, var(--a-ground) ${veil}%, transparent)` } })] }));
58
39
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@supersuit/artifacts",
3
- "version": "0.4.3",
3
+ "version": "0.4.5",
4
4
  "description": "Publish markdown as branded, read-aloud pages from a Next.js app: the artifacts store, the route factory, the read-along reader, brand packs, password and confidential pages, and share cards.",
5
5
  "license": "MIT",
6
6
  "type": "module",