dotmote 0.1.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.
- package/LICENSE +21 -0
- package/README.md +178 -0
- package/README.zh-CN.md +155 -0
- package/dist/Dotmote.d.ts +16 -0
- package/dist/Dotmote.d.ts.map +1 -0
- package/dist/Dotmote.js +142 -0
- package/dist/Dotmote.js.map +1 -0
- package/dist/core/createDotMatrixCore.d.ts +37 -0
- package/dist/core/createDotMatrixCore.d.ts.map +1 -0
- package/dist/core/createDotMatrixCore.js +541 -0
- package/dist/core/createDotMatrixCore.js.map +1 -0
- package/dist/core/index.d.ts +4 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +3 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/physics.d.ts +58 -0
- package/dist/core/physics.d.ts.map +1 -0
- package/dist/core/physics.js +177 -0
- package/dist/core/physics.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/themes.d.ts +21 -0
- package/dist/themes.d.ts.map +1 -0
- package/dist/themes.js +79 -0
- package/dist/themes.js.map +1 -0
- package/dist/types.d.ts +162 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1,541 @@
|
|
|
1
|
+
import { clamp, easeOutCubic, isTickerMotion, stepBodies, stepRoam, stepTicker, } from './physics.js';
|
|
2
|
+
/** Responsive defaults, mirrored from the React component's props. */
|
|
3
|
+
export const DEFAULT_BREAKPOINTS = {
|
|
4
|
+
small: 372,
|
|
5
|
+
medium: 640,
|
|
6
|
+
smallSpacing: 8,
|
|
7
|
+
mediumSpacing: 9,
|
|
8
|
+
largeSpacing: 12,
|
|
9
|
+
};
|
|
10
|
+
/** Default content: five neutral letters. */
|
|
11
|
+
export const DEFAULT_ITEMS = [
|
|
12
|
+
{ kind: 'text', value: 'A' },
|
|
13
|
+
{ kind: 'text', value: 'B' },
|
|
14
|
+
{ kind: 'text', value: 'C' },
|
|
15
|
+
{ kind: 'text', value: 'D' },
|
|
16
|
+
{ kind: 'text', value: 'E' },
|
|
17
|
+
];
|
|
18
|
+
/** Default (neutral) initial velocities / angles for the first five bodies. */
|
|
19
|
+
const DEFAULT_ANGLES = [-2.46, -0.72, 2.36, 0.58, -2.78];
|
|
20
|
+
/** Self-sufficient defaults so the core works even without a React wrapper. */
|
|
21
|
+
const DEFAULT_CORE_OPTIONS = {
|
|
22
|
+
items: DEFAULT_ITEMS,
|
|
23
|
+
dot: 'rgba(128, 128, 128, 0.5)',
|
|
24
|
+
glow: ['rgba(120, 120, 120, 0.9)', 'rgba(170, 170, 170, 0.9)', 'rgba(220, 220, 220, 0.9)'],
|
|
25
|
+
background: undefined,
|
|
26
|
+
dotRadius: undefined,
|
|
27
|
+
glowStrength: 1,
|
|
28
|
+
speed: 1,
|
|
29
|
+
motion: 'drift',
|
|
30
|
+
fontFamily: '"Trebuchet MS", ui-rounded, sans-serif',
|
|
31
|
+
fontSizeOverride: undefined,
|
|
32
|
+
fontSizeMin: 207,
|
|
33
|
+
fontSizeMax: 270,
|
|
34
|
+
breakpoints: { ...DEFAULT_BREAKPOINTS },
|
|
35
|
+
spacingScale: 1,
|
|
36
|
+
introDurationMs: 520,
|
|
37
|
+
};
|
|
38
|
+
function fontString(fontSize, family) {
|
|
39
|
+
return `900 ${fontSize}px ${family}`;
|
|
40
|
+
}
|
|
41
|
+
/** Acquire a 2D context or throw — returns a non-nullable type so closures stay sound. */
|
|
42
|
+
function requireCtx(ctx, label) {
|
|
43
|
+
if (!ctx) {
|
|
44
|
+
throw new Error(`Dotmote: unable to acquire a 2D canvas context (${label}).`);
|
|
45
|
+
}
|
|
46
|
+
return ctx;
|
|
47
|
+
}
|
|
48
|
+
function resolveSpacing(options, width) {
|
|
49
|
+
const b = options.breakpoints;
|
|
50
|
+
if (width < b.small)
|
|
51
|
+
return b.smallSpacing;
|
|
52
|
+
if (width < b.medium)
|
|
53
|
+
return b.mediumSpacing;
|
|
54
|
+
return b.largeSpacing;
|
|
55
|
+
}
|
|
56
|
+
function resolveFontSize(options, width) {
|
|
57
|
+
const { fontSize, fontSizeOverride, fontSizeMin, fontSizeMax, breakpoints } = options;
|
|
58
|
+
if (fontSize != null)
|
|
59
|
+
return fontSize;
|
|
60
|
+
if (fontSizeOverride != null) {
|
|
61
|
+
return typeof fontSizeOverride === 'function'
|
|
62
|
+
? fontSizeOverride(width)
|
|
63
|
+
: fontSizeOverride;
|
|
64
|
+
}
|
|
65
|
+
if (width < breakpoints.small)
|
|
66
|
+
return 135;
|
|
67
|
+
if (width < breakpoints.medium)
|
|
68
|
+
return 162;
|
|
69
|
+
return clamp(width * 0.195, fontSizeMin, fontSizeMax);
|
|
70
|
+
}
|
|
71
|
+
function getInitialAngle(index) {
|
|
72
|
+
if (index < DEFAULT_ANGLES.length)
|
|
73
|
+
return DEFAULT_ANGLES[index];
|
|
74
|
+
// Deterministic golden-angle spread for any additional bodies.
|
|
75
|
+
return (index * 2.39996) % (Math.PI * 2);
|
|
76
|
+
}
|
|
77
|
+
function measureItemSize(ctx, item, fontSize, family) {
|
|
78
|
+
switch (item.kind) {
|
|
79
|
+
case 'text': {
|
|
80
|
+
ctx.font = fontString(fontSize, family);
|
|
81
|
+
const w = ctx.measureText(item.value).width;
|
|
82
|
+
return { width: w, height: fontSize * 1.3 };
|
|
83
|
+
}
|
|
84
|
+
case 'emoji':
|
|
85
|
+
return { width: fontSize * 1.25, height: fontSize * 1.25 };
|
|
86
|
+
case 'shape': {
|
|
87
|
+
const r = item.radius ?? fontSize * 0.45;
|
|
88
|
+
return { width: r * 2, height: r * 2 };
|
|
89
|
+
}
|
|
90
|
+
case 'path':
|
|
91
|
+
return { width: fontSize, height: fontSize };
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
function drawShape(ctx, value, b, fontSize) {
|
|
95
|
+
const r = b.item.radius ?? fontSize * 0.45;
|
|
96
|
+
const cx = b.centerX;
|
|
97
|
+
const cy = b.centerY;
|
|
98
|
+
ctx.beginPath();
|
|
99
|
+
switch (value) {
|
|
100
|
+
case 'circle':
|
|
101
|
+
ctx.arc(cx, cy, r, 0, Math.PI * 2);
|
|
102
|
+
break;
|
|
103
|
+
case 'square':
|
|
104
|
+
ctx.rect(cx - r, cy - r, r * 2, r * 2);
|
|
105
|
+
break;
|
|
106
|
+
case 'triangle':
|
|
107
|
+
ctx.moveTo(cx, cy - r);
|
|
108
|
+
ctx.lineTo(cx - r, cy + r);
|
|
109
|
+
ctx.lineTo(cx + r, cy + r);
|
|
110
|
+
ctx.closePath();
|
|
111
|
+
break;
|
|
112
|
+
case 'diamond':
|
|
113
|
+
ctx.moveTo(cx, cy - r);
|
|
114
|
+
ctx.lineTo(cx + r, cy);
|
|
115
|
+
ctx.lineTo(cx, cy + r);
|
|
116
|
+
ctx.lineTo(cx - r, cy);
|
|
117
|
+
ctx.closePath();
|
|
118
|
+
break;
|
|
119
|
+
case 'star': {
|
|
120
|
+
const inner = r * 0.5;
|
|
121
|
+
for (let i = 0; i < 10; i++) {
|
|
122
|
+
const rr = i % 2 === 0 ? r : inner;
|
|
123
|
+
const a = (Math.PI / 5) * i - Math.PI / 2;
|
|
124
|
+
const x = cx + Math.cos(a) * rr;
|
|
125
|
+
const y = cy + Math.sin(a) * rr;
|
|
126
|
+
if (i === 0)
|
|
127
|
+
ctx.moveTo(x, y);
|
|
128
|
+
else
|
|
129
|
+
ctx.lineTo(x, y);
|
|
130
|
+
}
|
|
131
|
+
ctx.closePath();
|
|
132
|
+
break;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
ctx.fill();
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Framework-agnostic canvas core for the dot-matrix glow background.
|
|
139
|
+
*
|
|
140
|
+
* Owns four canvases (three offscreen) and the full render/physic/lifecycle
|
|
141
|
+
* loop. The React component (and any vanilla / miniapp adapter) is a thin
|
|
142
|
+
* wrapper over this. All browser globals (`window`, `document`,
|
|
143
|
+
* `ResizeObserver`, `requestAnimationFrame`) are only touched once a handle is
|
|
144
|
+
* created at runtime — never at module scope — so import-time SSR is safe.
|
|
145
|
+
*/
|
|
146
|
+
export function createDotMatrixCore(canvas, container, initialOptions, config = {}) {
|
|
147
|
+
const canvasFactory = config.canvasFactory ?? (() => document.createElement('canvas'));
|
|
148
|
+
const observeResize = config.observeResize ?? true;
|
|
149
|
+
const mainCtx = requireCtx(canvas.getContext('2d'), 'main');
|
|
150
|
+
const bgCanvas = canvasFactory();
|
|
151
|
+
const bgCtx = requireCtx(bgCanvas.getContext('2d'), 'bg');
|
|
152
|
+
const maskCanvas = canvasFactory();
|
|
153
|
+
const maskCtx = requireCtx(maskCanvas.getContext('2d'), 'mask');
|
|
154
|
+
const lightCanvas = canvasFactory();
|
|
155
|
+
const lightCtx = requireCtx(lightCanvas.getContext('2d'), 'light');
|
|
156
|
+
let options = {
|
|
157
|
+
...DEFAULT_CORE_OPTIONS,
|
|
158
|
+
...initialOptions,
|
|
159
|
+
breakpoints: {
|
|
160
|
+
...DEFAULT_BREAKPOINTS,
|
|
161
|
+
...(initialOptions?.breakpoints ?? {}),
|
|
162
|
+
},
|
|
163
|
+
};
|
|
164
|
+
let cssWidth = 0;
|
|
165
|
+
let cssHeight = 0;
|
|
166
|
+
let dpr = 1;
|
|
167
|
+
let spacing = 12;
|
|
168
|
+
let fontSize = 207;
|
|
169
|
+
let dotRadius = 1;
|
|
170
|
+
let edgePadding = spacing * 1.25;
|
|
171
|
+
let tickerGapPx = 20;
|
|
172
|
+
let bodies = [];
|
|
173
|
+
let pendingItems = null;
|
|
174
|
+
let sizeKnown = false;
|
|
175
|
+
let running = false;
|
|
176
|
+
let rafId = 0;
|
|
177
|
+
let lastTime = null;
|
|
178
|
+
let ro = null;
|
|
179
|
+
function computeDpr() {
|
|
180
|
+
if (typeof window === 'undefined')
|
|
181
|
+
return 1;
|
|
182
|
+
return Math.min(window.devicePixelRatio || 1, 1.75);
|
|
183
|
+
}
|
|
184
|
+
function computeGeometry() {
|
|
185
|
+
dpr = computeDpr();
|
|
186
|
+
const scale = options.spacingScale || 1;
|
|
187
|
+
spacing = resolveSpacing(options, cssWidth) * scale;
|
|
188
|
+
fontSize = resolveFontSize(options, cssWidth);
|
|
189
|
+
dotRadius = options.dotRadius ?? (spacing <= 9 ? 0.82 : 1);
|
|
190
|
+
edgePadding = spacing * 1.25;
|
|
191
|
+
tickerGapPx = Math.max(16, fontSize * 0.5);
|
|
192
|
+
}
|
|
193
|
+
function applyTransform(ctx) {
|
|
194
|
+
ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
|
|
195
|
+
}
|
|
196
|
+
function setCanvasSize(c, ctx) {
|
|
197
|
+
c.width = Math.max(1, Math.round(cssWidth * dpr));
|
|
198
|
+
c.height = Math.max(1, Math.round(cssHeight * dpr));
|
|
199
|
+
applyTransform(ctx);
|
|
200
|
+
}
|
|
201
|
+
function drawDotGrid(ctx, width, height, sp, radius, fillStyle) {
|
|
202
|
+
ctx.clearRect(0, 0, width, height);
|
|
203
|
+
ctx.fillStyle = fillStyle;
|
|
204
|
+
const countX = Math.max(1, Math.round(width / sp));
|
|
205
|
+
const countY = Math.max(1, Math.round(height / sp));
|
|
206
|
+
const startX = (width - (countX - 1) * sp) / 2;
|
|
207
|
+
const startY = (height - (countY - 1) * sp) / 2;
|
|
208
|
+
for (let iy = 0; iy < countY; iy++) {
|
|
209
|
+
const y = startY + iy * sp;
|
|
210
|
+
for (let ix = 0; ix < countX; ix++) {
|
|
211
|
+
const x = startX + ix * sp;
|
|
212
|
+
ctx.beginPath();
|
|
213
|
+
ctx.arc(x, y, radius, 0, Math.PI * 2);
|
|
214
|
+
ctx.fill();
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
function redrawStatic() {
|
|
219
|
+
if (!sizeKnown)
|
|
220
|
+
return;
|
|
221
|
+
drawDotGrid(bgCtx, cssWidth, cssHeight, spacing, dotRadius, options.dot);
|
|
222
|
+
drawDotGrid(maskCtx, cssWidth, cssHeight, spacing, dotRadius, '#ffffff');
|
|
223
|
+
}
|
|
224
|
+
function applyBackground() {
|
|
225
|
+
if (typeof options.background === 'string') {
|
|
226
|
+
canvas.style.backgroundColor = options.background;
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
canvas.style.backgroundColor = 'transparent';
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
function clampCenter(value) {
|
|
233
|
+
const lo = edgePadding;
|
|
234
|
+
const hi = cssWidth - edgePadding;
|
|
235
|
+
// Tiny containers can make the usable band collapse; fall back to center.
|
|
236
|
+
if (hi <= lo)
|
|
237
|
+
return cssWidth / 2;
|
|
238
|
+
return clamp(value, lo, hi);
|
|
239
|
+
}
|
|
240
|
+
function createBodies(items, w, h, opts, startMs) {
|
|
241
|
+
const pad = edgePadding;
|
|
242
|
+
const usableW = Math.max(0, w - 2 * pad);
|
|
243
|
+
const usableH = Math.max(0, h - 2 * pad);
|
|
244
|
+
const ticker = isTickerMotion(opts.motion);
|
|
245
|
+
const row = ticker || opts.motion === 'static';
|
|
246
|
+
const dir = opts.motion === 'ticker-left' ? 1 : -1;
|
|
247
|
+
const base = w < opts.breakpoints.medium ? 90 : 112;
|
|
248
|
+
const gap = tickerGapPx;
|
|
249
|
+
// Measure every item up front so a row/ticker can be laid out centered.
|
|
250
|
+
const metas = items.map((item, i) => {
|
|
251
|
+
const fs = resolveFontSize(opts, w);
|
|
252
|
+
const size = measureItemSize(lightCtx, item, fs, opts.fontFamily);
|
|
253
|
+
return { item, i, fs, size };
|
|
254
|
+
});
|
|
255
|
+
let rowWidth = 0;
|
|
256
|
+
for (const m of metas)
|
|
257
|
+
rowWidth += m.size.width;
|
|
258
|
+
rowWidth += gap * (metas.length - 1);
|
|
259
|
+
let cursor = (w - rowWidth) / 2; // left edge of the first body
|
|
260
|
+
const list = [];
|
|
261
|
+
for (const m of metas) {
|
|
262
|
+
const s = m.size;
|
|
263
|
+
let cx;
|
|
264
|
+
let cy;
|
|
265
|
+
let vx;
|
|
266
|
+
let vy;
|
|
267
|
+
if (row) {
|
|
268
|
+
// One horizontally-aligned row at the vertical center; static is frozen.
|
|
269
|
+
cy = h / 2;
|
|
270
|
+
cx = cursor + s.width / 2;
|
|
271
|
+
cursor += s.width + gap;
|
|
272
|
+
const speed = base * opts.speed;
|
|
273
|
+
vx = ticker ? dir * speed : 0;
|
|
274
|
+
vy = 0;
|
|
275
|
+
}
|
|
276
|
+
else {
|
|
277
|
+
const angle = getInitialAngle(m.i);
|
|
278
|
+
const speed = (base + m.i * 4) * opts.speed;
|
|
279
|
+
vx = Math.cos(angle) * speed;
|
|
280
|
+
vy = Math.sin(angle) * speed;
|
|
281
|
+
cx = pad + (usableW > 0 ? Math.random() * usableW : 0);
|
|
282
|
+
cy = pad + (usableH > 0 ? Math.random() * usableH : 0);
|
|
283
|
+
}
|
|
284
|
+
list.push({
|
|
285
|
+
id: m.i,
|
|
286
|
+
item: m.item,
|
|
287
|
+
centerX: cx,
|
|
288
|
+
centerY: cy,
|
|
289
|
+
width: s.width,
|
|
290
|
+
height: s.height,
|
|
291
|
+
fontSize: m.fs,
|
|
292
|
+
velocityX: vx,
|
|
293
|
+
velocityY: vy,
|
|
294
|
+
colors: [opts.glow[0], opts.glow[1], opts.glow[2]],
|
|
295
|
+
introStart: startMs,
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
return list;
|
|
299
|
+
}
|
|
300
|
+
function rebuildBodies() {
|
|
301
|
+
if (!sizeKnown || cssWidth <= 0)
|
|
302
|
+
return;
|
|
303
|
+
const startMs = typeof performance !== 'undefined' ? performance.now() : 0;
|
|
304
|
+
bodies = createBodies(pendingItems ?? options.items, cssWidth, cssHeight, options, startMs);
|
|
305
|
+
pendingItems = null;
|
|
306
|
+
}
|
|
307
|
+
function refreshBodySizes() {
|
|
308
|
+
if (!bodies.length)
|
|
309
|
+
return;
|
|
310
|
+
for (const b of bodies) {
|
|
311
|
+
const size = measureItemSize(lightCtx, b.item, fontSize, options.fontFamily);
|
|
312
|
+
b.width = size.width;
|
|
313
|
+
b.height = size.height;
|
|
314
|
+
b.fontSize = fontSize;
|
|
315
|
+
b.centerX = clampCenter(b.centerX);
|
|
316
|
+
b.centerY = clampCenter(b.centerY);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
function paintBodyShape(b) {
|
|
320
|
+
const { item, fontSize: fs } = b;
|
|
321
|
+
const x0 = b.centerX - b.width / 2;
|
|
322
|
+
const y0 = b.centerY - b.height / 2;
|
|
323
|
+
const x1 = b.centerX + b.width / 2;
|
|
324
|
+
const y1 = b.centerY + b.height / 2;
|
|
325
|
+
const grad = lightCtx.createLinearGradient(x0, y0, x1, y1);
|
|
326
|
+
grad.addColorStop(0, b.colors[0]);
|
|
327
|
+
grad.addColorStop(0.5, b.colors[1]);
|
|
328
|
+
grad.addColorStop(1, b.colors[2]);
|
|
329
|
+
lightCtx.fillStyle = grad;
|
|
330
|
+
switch (item.kind) {
|
|
331
|
+
case 'text':
|
|
332
|
+
case 'emoji': {
|
|
333
|
+
lightCtx.font = fontString(fs, options.fontFamily);
|
|
334
|
+
lightCtx.textAlign = 'center';
|
|
335
|
+
lightCtx.textBaseline = 'middle';
|
|
336
|
+
lightCtx.fillText(item.value, b.centerX, b.centerY);
|
|
337
|
+
break;
|
|
338
|
+
}
|
|
339
|
+
case 'shape':
|
|
340
|
+
drawShape(lightCtx, item.value, b, fs);
|
|
341
|
+
break;
|
|
342
|
+
case 'path': {
|
|
343
|
+
const path = new Path2D(item.value);
|
|
344
|
+
lightCtx.save();
|
|
345
|
+
lightCtx.translate(b.centerX, b.centerY);
|
|
346
|
+
// NOTE: scales by fontSize/100 — assumes the SVG path is authored near
|
|
347
|
+
// the origin with a ~100-unit scale. See README limitations.
|
|
348
|
+
lightCtx.scale(fs / 100, fs / 100);
|
|
349
|
+
lightCtx.fill(path);
|
|
350
|
+
lightCtx.restore();
|
|
351
|
+
break;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
function drawBody(b, nowMs) {
|
|
356
|
+
const progress = options.introDurationMs > 0
|
|
357
|
+
? (nowMs - b.introStart) / options.introDurationMs
|
|
358
|
+
: 1;
|
|
359
|
+
const intro = easeOutCubic(progress);
|
|
360
|
+
if (intro <= 1e-4)
|
|
361
|
+
return;
|
|
362
|
+
// Treat `glowStrength` as a STRENGTH, not an opacity: >1 layers the same body
|
|
363
|
+
// multiple times with additive compositing so it reads brighter / glowing.
|
|
364
|
+
const strength = options.glowStrength;
|
|
365
|
+
const layers = Math.max(1, Math.ceil(strength));
|
|
366
|
+
const perLayer = Math.min(1, strength) * intro;
|
|
367
|
+
for (let i = 0; i < layers; i++) {
|
|
368
|
+
lightCtx.save();
|
|
369
|
+
lightCtx.globalCompositeOperation = i === 0 ? 'source-over' : 'lighter';
|
|
370
|
+
lightCtx.globalAlpha = perLayer;
|
|
371
|
+
paintBodyShape(b);
|
|
372
|
+
lightCtx.restore();
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
function render(nowMs) {
|
|
376
|
+
if (!sizeKnown || cssWidth <= 0)
|
|
377
|
+
return;
|
|
378
|
+
lightCtx.clearRect(0, 0, cssWidth, cssHeight);
|
|
379
|
+
for (const b of bodies)
|
|
380
|
+
drawBody(b, nowMs);
|
|
381
|
+
lightCtx.setTransform(dpr, 0, 0, dpr, 0, 0);
|
|
382
|
+
lightCtx.globalCompositeOperation = 'destination-in';
|
|
383
|
+
lightCtx.globalAlpha = 1;
|
|
384
|
+
lightCtx.drawImage(maskCanvas, 0, 0, cssWidth, cssHeight);
|
|
385
|
+
lightCtx.globalCompositeOperation = 'source-over';
|
|
386
|
+
mainCtx.clearRect(0, 0, cssWidth, cssHeight);
|
|
387
|
+
mainCtx.setTransform(dpr, 0, 0, dpr, 0, 0);
|
|
388
|
+
mainCtx.globalAlpha = 1;
|
|
389
|
+
mainCtx.globalCompositeOperation = 'source-over';
|
|
390
|
+
mainCtx.drawImage(bgCanvas, 0, 0, cssWidth, cssHeight);
|
|
391
|
+
mainCtx.drawImage(lightCanvas, 0, 0, cssWidth, cssHeight);
|
|
392
|
+
}
|
|
393
|
+
function stepMotion(active, dt) {
|
|
394
|
+
const mode = options.motion;
|
|
395
|
+
if (mode === 'static')
|
|
396
|
+
return;
|
|
397
|
+
if (mode === 'drift') {
|
|
398
|
+
stepBodies(active, dt, cssWidth, cssHeight, edgePadding);
|
|
399
|
+
return;
|
|
400
|
+
}
|
|
401
|
+
if (mode === 'roam') {
|
|
402
|
+
stepRoam(active, dt, cssWidth, cssHeight, edgePadding);
|
|
403
|
+
return;
|
|
404
|
+
}
|
|
405
|
+
const dir = mode === 'ticker-left' ? 1 : -1;
|
|
406
|
+
let sumW = 0;
|
|
407
|
+
for (const b of bodies)
|
|
408
|
+
sumW += b.width;
|
|
409
|
+
const track = sumW + tickerGapPx * bodies.length;
|
|
410
|
+
stepTicker(active, dt, cssWidth, dir, tickerGapPx, track);
|
|
411
|
+
}
|
|
412
|
+
function frame(timestamp) {
|
|
413
|
+
if (!running)
|
|
414
|
+
return;
|
|
415
|
+
rafId = requestAnimationFrame(frame);
|
|
416
|
+
if (!sizeKnown || cssWidth <= 0)
|
|
417
|
+
return;
|
|
418
|
+
if (lastTime == null)
|
|
419
|
+
lastTime = timestamp;
|
|
420
|
+
const dt = Math.min((timestamp - lastTime) / 1000, 0.034);
|
|
421
|
+
lastTime = timestamp;
|
|
422
|
+
const active = bodies.filter((b) => timestamp - b.introStart >= options.introDurationMs);
|
|
423
|
+
stepMotion(active, dt);
|
|
424
|
+
render(timestamp);
|
|
425
|
+
}
|
|
426
|
+
function start() {
|
|
427
|
+
if (running)
|
|
428
|
+
return;
|
|
429
|
+
running = true;
|
|
430
|
+
lastTime = null;
|
|
431
|
+
rafId = requestAnimationFrame(frame);
|
|
432
|
+
}
|
|
433
|
+
function stop() {
|
|
434
|
+
if (!running)
|
|
435
|
+
return;
|
|
436
|
+
running = false;
|
|
437
|
+
if (rafId)
|
|
438
|
+
cancelAnimationFrame(rafId);
|
|
439
|
+
rafId = 0;
|
|
440
|
+
}
|
|
441
|
+
function resize(w, h) {
|
|
442
|
+
let width = w;
|
|
443
|
+
let height = h;
|
|
444
|
+
if (width == null || height == null) {
|
|
445
|
+
const rect = container?.getBoundingClientRect();
|
|
446
|
+
if (rect) {
|
|
447
|
+
width = width ?? rect.width;
|
|
448
|
+
height = height ?? rect.height;
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
if (!width || !height || width <= 0 || height <= 0) {
|
|
452
|
+
sizeKnown = false;
|
|
453
|
+
return;
|
|
454
|
+
}
|
|
455
|
+
cssWidth = width;
|
|
456
|
+
cssHeight = height;
|
|
457
|
+
computeGeometry();
|
|
458
|
+
setCanvasSize(canvas, mainCtx);
|
|
459
|
+
setCanvasSize(bgCanvas, bgCtx);
|
|
460
|
+
setCanvasSize(maskCanvas, maskCtx);
|
|
461
|
+
setCanvasSize(lightCanvas, lightCtx);
|
|
462
|
+
if (pendingItems) {
|
|
463
|
+
rebuildBodies();
|
|
464
|
+
}
|
|
465
|
+
else if (bodies.length) {
|
|
466
|
+
refreshBodySizes();
|
|
467
|
+
}
|
|
468
|
+
redrawStatic();
|
|
469
|
+
applyBackground();
|
|
470
|
+
sizeKnown = true;
|
|
471
|
+
if (running)
|
|
472
|
+
render(typeof performance !== 'undefined' ? performance.now() : 0);
|
|
473
|
+
}
|
|
474
|
+
function configure(next) {
|
|
475
|
+
const itemsChanged = next.items !== options.items;
|
|
476
|
+
const tickerChanged = isTickerMotion(next.motion) !== isTickerMotion(options.motion);
|
|
477
|
+
options = next;
|
|
478
|
+
if (sizeKnown)
|
|
479
|
+
computeGeometry();
|
|
480
|
+
// Theme / color hot-update: keep physics, just recolor each body.
|
|
481
|
+
if (!itemsChanged && !tickerChanged && bodies.length) {
|
|
482
|
+
for (const b of bodies) {
|
|
483
|
+
b.colors = [options.glow[0], options.glow[1], options.glow[2]];
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
// Rebuild only when the body *layout* changes (items or entering/leaving the
|
|
487
|
+
// ticker track). Switching between drift/roam/static keeps positions/velocities.
|
|
488
|
+
if (itemsChanged || tickerChanged) {
|
|
489
|
+
pendingItems = options.items;
|
|
490
|
+
if (sizeKnown)
|
|
491
|
+
rebuildBodies();
|
|
492
|
+
}
|
|
493
|
+
else if (sizeKnown) {
|
|
494
|
+
refreshBodySizes();
|
|
495
|
+
}
|
|
496
|
+
if (sizeKnown) {
|
|
497
|
+
redrawStatic();
|
|
498
|
+
applyBackground();
|
|
499
|
+
// Repaint immediately so a paused theme change still shows.
|
|
500
|
+
render(typeof performance !== 'undefined' ? performance.now() : 0);
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
function onVisibility() {
|
|
504
|
+
if (typeof document === 'undefined')
|
|
505
|
+
return;
|
|
506
|
+
if (document.hidden)
|
|
507
|
+
stop();
|
|
508
|
+
else
|
|
509
|
+
start();
|
|
510
|
+
}
|
|
511
|
+
// Initial paint attempt (adapter with `observeResize: false` relies on resize()).
|
|
512
|
+
resize();
|
|
513
|
+
if (observeResize && typeof ResizeObserver !== 'undefined' && container) {
|
|
514
|
+
ro = new ResizeObserver((entries) => {
|
|
515
|
+
const entry = entries[0];
|
|
516
|
+
if (!entry)
|
|
517
|
+
return;
|
|
518
|
+
const rect = entry.contentRect;
|
|
519
|
+
resize(rect.width, rect.height);
|
|
520
|
+
});
|
|
521
|
+
ro.observe(container);
|
|
522
|
+
document.addEventListener('visibilitychange', onVisibility);
|
|
523
|
+
}
|
|
524
|
+
return {
|
|
525
|
+
configure,
|
|
526
|
+
resize,
|
|
527
|
+
start,
|
|
528
|
+
stop,
|
|
529
|
+
destroy() {
|
|
530
|
+
stop();
|
|
531
|
+
if (ro) {
|
|
532
|
+
ro.disconnect();
|
|
533
|
+
ro = null;
|
|
534
|
+
}
|
|
535
|
+
if (typeof document !== 'undefined') {
|
|
536
|
+
document.removeEventListener('visibilitychange', onVisibility);
|
|
537
|
+
}
|
|
538
|
+
},
|
|
539
|
+
};
|
|
540
|
+
}
|
|
541
|
+
//# sourceMappingURL=createDotMatrixCore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createDotMatrixCore.js","sourceRoot":"","sources":["../../src/core/createDotMatrixCore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { createDotMatrixCore, DEFAULT_BREAKPOINTS, DEFAULT_ITEMS, } from './createDotMatrixCore.js';
|
|
2
|
+
export type { DotMatrixCoreHandle, DotMatrixCoreConfig } from './createDotMatrixCore.js';
|
|
3
|
+
export { normalizeItems, bounce, resolveCollision, stepBodies, stepRoam, stepTicker, isTickerMotion, clamp, easeOutCubic, } from './physics.js';
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,GACd,MAAM,0BAA0B,CAAC;AAClC,YAAY,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEzF,OAAO,EACL,cAAc,EACd,MAAM,EACN,gBAAgB,EAChB,UAAU,EACV,QAAQ,EACR,UAAU,EACV,cAAc,EACd,KAAK,EACL,YAAY,GACb,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { createDotMatrixCore, DEFAULT_BREAKPOINTS, DEFAULT_ITEMS, } from './createDotMatrixCore.js';
|
|
2
|
+
export { normalizeItems, bounce, resolveCollision, stepBodies, stepRoam, stepTicker, isTickerMotion, clamp, easeOutCubic, } from './physics.js';
|
|
3
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,GACd,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EACL,cAAc,EACd,MAAM,EACN,gBAAgB,EAChB,UAAU,EACV,QAAQ,EACR,UAAU,EACV,cAAc,EACd,KAAK,EACL,YAAY,GACb,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { Body, ContentInput, ContentItem, MotionMode } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Normalize loose `items` input into concrete {@link ContentItem}s.
|
|
4
|
+
* Strings become `{ kind: 'text', value }`. Anything already shaped like a
|
|
5
|
+
* `ContentItem` is passed through. Non-string / non-object values are dropped.
|
|
6
|
+
*/
|
|
7
|
+
export declare function normalizeItems(input?: ContentInput[]): ContentItem[];
|
|
8
|
+
/**
|
|
9
|
+
* Reflect a body's velocity component when its center crosses a wall, and
|
|
10
|
+
* clamp its center back onto the boundary line so it can't tunnel.
|
|
11
|
+
*
|
|
12
|
+
* `edgePadding` is the distance from each edge the body stays inside.
|
|
13
|
+
*/
|
|
14
|
+
export declare function bounce(body: Body, width: number, height: number, edgePadding: number): void;
|
|
15
|
+
/**
|
|
16
|
+
* AABB collision test using half-sizes: two bodies overlap only when both
|
|
17
|
+
* `x` and `y` spans intersect. Returns `true` when a collision was resolved.
|
|
18
|
+
*
|
|
19
|
+
* On overlap, the pair is separated along the axis of *smaller* overlap (each
|
|
20
|
+
* moved by half the penetration, in opposite directions) and their velocity
|
|
21
|
+
* components on that axis are **swapped** (a simplified exchange, per spec —
|
|
22
|
+
* not a full elastic impulse).
|
|
23
|
+
*/
|
|
24
|
+
export declare function resolveCollision(a: Body, b: Body): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Advance the *active* bodies by `dt` seconds: integrate position, bounce off
|
|
27
|
+
* the walls, then pairwise-resolve collisions.
|
|
28
|
+
*
|
|
29
|
+
* Returns a NEW array of the same bodies so callers can pass a slice of their
|
|
30
|
+
* `bodies` list (e.g. only the bodies whose intro has finished) without
|
|
31
|
+
* mutating the source ordering.
|
|
32
|
+
*/
|
|
33
|
+
export declare function stepBodies(bodies: Body[], dt: number, width: number, height: number, edgePadding: number): void;
|
|
34
|
+
/**
|
|
35
|
+
* Advance bodies by `dt` seconds with WALL bounce only — no pairwise collision,
|
|
36
|
+
* so bodies can pass through each other (the `roam` motion).
|
|
37
|
+
*/
|
|
38
|
+
export declare function stepRoam(bodies: Body[], dt: number, width: number, height: number, edgePadding: number): void;
|
|
39
|
+
/**
|
|
40
|
+
* Advance bodies for the horizontal ticker (marquee) modes: move along X (the
|
|
41
|
+
* velocity already encodes direction) and wrap around a horizontal track.
|
|
42
|
+
*
|
|
43
|
+
* `dir` is `+1` for left→right and `-1` for right→left; `gap` is the padding
|
|
44
|
+
* between a body and the screen edge that triggers a wrap. `track` is the loop
|
|
45
|
+
* length (sum of body widths + `n * gap`), which keeps the first/last gap even.
|
|
46
|
+
*/
|
|
47
|
+
export declare function stepTicker(bodies: Body[], dt: number, width: number, dir: 1 | -1, gap: number, track?: number): void;
|
|
48
|
+
/** Whether a motion mode is one of the horizontal ticker (marquee) modes. */
|
|
49
|
+
export declare function isTickerMotion(mode: MotionMode): boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Clamp a value into `[min, max]`.
|
|
52
|
+
*/
|
|
53
|
+
export declare function clamp(value: number, min: number, max: number): number;
|
|
54
|
+
/**
|
|
55
|
+
* A short ease-out curve for the intro fade-in (0..1 input → 0..1 output).
|
|
56
|
+
*/
|
|
57
|
+
export declare function easeOutCubic(t: number): number;
|
|
58
|
+
//# sourceMappingURL=physics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"physics.d.ts","sourceRoot":"","sources":["../../src/core/physics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE5E;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,CAAC,EAAE,YAAY,EAAE,GAAG,WAAW,EAAE,CA2BpE;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CACpB,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,GAClB,IAAI,CAgBN;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,CAAC,EAAE,IAAI,EACP,CAAC,EAAE,IAAI,GACN,OAAO,CAyBT;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,IAAI,EAAE,EACd,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,GAClB,IAAI,CAaN;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CACtB,MAAM,EAAE,IAAI,EAAE,EACd,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,GAClB,IAAI,CAON;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,IAAI,EAAE,EACd,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,EACX,GAAG,EAAE,MAAM,EACX,KAAK,CAAC,EAAE,MAAM,GACb,IAAI,CAeN;AAED,6EAA6E;AAC7E,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAExD;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAErE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAG9C"}
|