@fluritheme/grinch 0.0.0-stage → 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.
@@ -0,0 +1,67 @@
1
+ import type { Options } from './options.js';
2
+ import type { Box, GiftState, GrinchEvent, GrinchEventData, GrinchPhase, Point } from './types.js';
3
+ export declare const clamp: (n: number, a: number, b: number) => number;
4
+ export declare const distance: (a: Point, b: Point) => number;
5
+ export interface Gift {
6
+ id: string;
7
+ position: Point;
8
+ state: GiftState;
9
+ visible: boolean;
10
+ color: string;
11
+ returning: {
12
+ from: Point;
13
+ age: number;
14
+ } | null;
15
+ element?: HTMLElement;
16
+ }
17
+ export interface Shelter {
18
+ id: string;
19
+ box: Box;
20
+ }
21
+ export interface Actor extends Point {
22
+ phase: GrinchPhase;
23
+ age: number;
24
+ gait: number;
25
+ facing: number;
26
+ behind: boolean;
27
+ visible: boolean;
28
+ destination: Point;
29
+ rope: Point | null;
30
+ }
31
+ type Emit = (event: GrinchEvent, data: GrinchEventData) => void;
32
+ export declare class Mischief {
33
+ private readonly options;
34
+ private readonly emit;
35
+ readonly actor: Actor;
36
+ gifts: Gift[];
37
+ totalStolen: number;
38
+ caught: number;
39
+ time: number;
40
+ private nextHeist;
41
+ private lastCatch;
42
+ private target;
43
+ private shelter;
44
+ private initialized;
45
+ private afterClimb;
46
+ constructor(options: Options, emit?: Emit);
47
+ get held(): Gift | undefined;
48
+ get stolen(): number;
49
+ change(phase: GrinchPhase): void;
50
+ spawn(view: Box, quiet?: boolean): void;
51
+ settleEntrance(): void;
52
+ steal(gift?: Gift): boolean;
53
+ private hand;
54
+ private sack;
55
+ giftPoint(gift: Gift): Point;
56
+ private returnGift;
57
+ returnGifts(immediate?: boolean): void;
58
+ redeem(immediate?: boolean): void;
59
+ shoo(immediate?: boolean): void;
60
+ wave(): void;
61
+ private move;
62
+ private hide;
63
+ dispose(): void;
64
+ step(dt: number, view: Box, shelters: readonly Shelter[], pointer: Point | null, quiet?: boolean): void;
65
+ }
66
+ export {};
67
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"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"}
package/dist/model.js ADDED
@@ -0,0 +1,404 @@
1
+ export const clamp = (n, a, b) => Math.max(a, Math.min(b, n));
2
+ export const distance = (a, b) => Math.hypot(a.x - b.x, a.y - b.y);
3
+ export class Mischief {
4
+ options;
5
+ emit;
6
+ actor = {
7
+ x: 0,
8
+ y: 0,
9
+ phase: 'idle',
10
+ age: 0,
11
+ gait: 0,
12
+ facing: 1,
13
+ behind: false,
14
+ visible: true,
15
+ destination: { x: 0, y: 0 },
16
+ rope: null,
17
+ };
18
+ gifts = [];
19
+ totalStolen = 0;
20
+ caught = 0;
21
+ time = 0;
22
+ nextHeist = 1.4;
23
+ lastCatch = -10;
24
+ target = null;
25
+ shelter = null;
26
+ initialized = false;
27
+ afterClimb = 'reaching';
28
+ constructor(options, emit = () => { }) {
29
+ this.options = options;
30
+ this.emit = emit;
31
+ }
32
+ get held() {
33
+ return this.gifts.find((g) => g.state === 'held');
34
+ }
35
+ get stolen() {
36
+ return this.gifts.filter((g) => g.state === 'stolen').length;
37
+ }
38
+ change(phase) {
39
+ this.actor.phase = phase;
40
+ this.actor.age = 0;
41
+ this.emit('phase', { phase });
42
+ }
43
+ spawn(view, quiet = false) {
44
+ if (this.initialized || view.width < 1 || view.height < 1)
45
+ return;
46
+ this.initialized = true;
47
+ const first = this.gifts.find((g) => g.visible);
48
+ const landing = {
49
+ x: clamp((first?.position.x ?? view.x + view.width * 0.65) - 65 * this.options.size, view.x + 35, view.x + Math.max(36, view.width - 35)),
50
+ y: first?.position.y ?? view.y + view.height * 0.72,
51
+ };
52
+ this.actor.destination = landing;
53
+ if (quiet || this.options.entrance === 'appear') {
54
+ Object.assign(this.actor, landing);
55
+ this.change('idle');
56
+ }
57
+ else if (this.options.entrance === 'rope') {
58
+ this.actor.x = landing.x;
59
+ this.actor.y = view.y - 130;
60
+ this.actor.rope = { x: landing.x, y: view.y - 20 };
61
+ this.change('arriving');
62
+ }
63
+ else {
64
+ this.actor.x = view.x - 55;
65
+ this.actor.y = landing.y;
66
+ this.change('arriving');
67
+ }
68
+ }
69
+ settleEntrance() {
70
+ if (this.actor.phase === 'arriving') {
71
+ Object.assign(this.actor, this.actor.destination);
72
+ this.actor.rope = null;
73
+ this.change('idle');
74
+ }
75
+ }
76
+ steal(gift) {
77
+ if (this.options.mood !== 'mischievous' ||
78
+ !['idle', 'waving', 'peeking'].includes(this.actor.phase))
79
+ return false;
80
+ const chosen = gift ??
81
+ this.gifts
82
+ .filter((g) => g.visible && g.state === 'available' && distance(g.position, this.actor) < 1200)
83
+ .sort((a, b) => distance(a.position, this.actor) - distance(b.position, this.actor))[0];
84
+ if (!chosen || chosen.state !== 'available' || !chosen.visible)
85
+ return false;
86
+ this.target = chosen;
87
+ this.actor.behind = false;
88
+ this.actor.rope = null;
89
+ this.change('sneaking');
90
+ this.emit('theft:start', { giftId: chosen.id });
91
+ return true;
92
+ }
93
+ hand() {
94
+ return {
95
+ x: this.actor.x + this.actor.facing * 23 * this.options.size,
96
+ y: this.actor.y - 51 * this.options.size,
97
+ };
98
+ }
99
+ sack() {
100
+ return {
101
+ x: this.actor.x - this.actor.facing * 22 * this.options.size,
102
+ y: this.actor.y - 39 * this.options.size,
103
+ };
104
+ }
105
+ giftPoint(gift) {
106
+ const r = gift.returning;
107
+ if (r) {
108
+ const t = clamp(r.age / 0.85, 0, 1), ease = t * t * (3 - 2 * t);
109
+ return {
110
+ x: r.from.x + (gift.position.x - r.from.x) * ease,
111
+ y: r.from.y +
112
+ (gift.position.y - r.from.y) * ease -
113
+ Math.sin(t * Math.PI) * 65 * this.options.size,
114
+ };
115
+ }
116
+ if (gift.state === 'held') {
117
+ const hand = this.hand();
118
+ if (this.actor.phase === 'stealing') {
119
+ const t = clamp(this.actor.age / 0.65, 0, 1);
120
+ return {
121
+ x: gift.position.x + (hand.x - gift.position.x) * t,
122
+ y: gift.position.y + (hand.y - gift.position.y) * t - Math.sin(t * Math.PI) * 12,
123
+ };
124
+ }
125
+ if (this.actor.phase === 'stashing') {
126
+ const t = clamp(this.actor.age / 0.7, 0, 1), sack = this.sack();
127
+ return {
128
+ x: hand.x + (sack.x - hand.x) * t,
129
+ y: hand.y + (sack.y - hand.y) * t - Math.sin(t * Math.PI) * 18,
130
+ };
131
+ }
132
+ return hand;
133
+ }
134
+ return { ...gift.position };
135
+ }
136
+ returnGift(gift, immediate = false) {
137
+ if (gift.state === 'available' || gift.state === 'returning')
138
+ return;
139
+ const from = gift.state === 'held' ? this.giftPoint(gift) : this.sack();
140
+ gift.state = immediate ? 'available' : 'returning';
141
+ gift.returning = immediate ? null : { from, age: 0 };
142
+ if (immediate)
143
+ this.emit('gift:returned', { giftId: gift.id });
144
+ }
145
+ returnGifts(immediate = false) {
146
+ for (const gift of this.gifts)
147
+ this.returnGift(gift, immediate);
148
+ this.target = null;
149
+ this.actor.rope = null;
150
+ this.nextHeist = this.time + this.options.cooldown;
151
+ if (this.actor.phase !== 'warming')
152
+ this.change('waving');
153
+ }
154
+ redeem(immediate = false) {
155
+ this.options.mood = 'friendly';
156
+ this.returnGifts(immediate);
157
+ this.change('warming');
158
+ this.emit('redeemed', {});
159
+ if (immediate)
160
+ this.change('idle');
161
+ }
162
+ shoo(immediate = false) {
163
+ if (this.time - this.lastCatch < 1)
164
+ return;
165
+ const gift = this.held ?? [...this.gifts].reverse().find((g) => g.state === 'stolen');
166
+ if (gift)
167
+ this.returnGift(gift, immediate);
168
+ this.lastCatch = this.time;
169
+ this.caught++;
170
+ this.target = null;
171
+ this.actor.rope = null;
172
+ this.change('caught');
173
+ this.emit('caught', {});
174
+ }
175
+ wave() {
176
+ if (this.held)
177
+ this.returnGifts();
178
+ this.target = null;
179
+ this.actor.rope = null;
180
+ this.change('waving');
181
+ this.nextHeist = this.time + 3;
182
+ }
183
+ move(to, dt, rate) {
184
+ const a = this.actor, dx = to.x - a.x, dy = to.y - a.y, len = Math.hypot(dx, dy), travel = Math.min(len, dt * rate * this.options.speed);
185
+ if (Math.abs(dx) > 1)
186
+ a.facing = dx > 0 ? 1 : -1;
187
+ if (len > 0.01) {
188
+ a.x += (dx / len) * travel;
189
+ a.y += (dy / len) * travel;
190
+ a.gait += travel * 0.11;
191
+ }
192
+ return len < 2;
193
+ }
194
+ hide(shelters) {
195
+ const size = this.options.size;
196
+ this.shelter =
197
+ shelters
198
+ .filter((s) => s.box.height > 155 * size &&
199
+ s.box.width > 80 * size &&
200
+ distance({ x: s.box.x + s.box.width / 2, y: s.box.y + s.box.height / 2 }, this.actor) <
201
+ 650)
202
+ .sort((a, b) => distance(a.box, this.actor) - distance(b.box, this.actor))[0] ?? null;
203
+ if (this.shelter) {
204
+ const b = this.shelter.box;
205
+ this.actor.destination = { x: b.x + b.width * 0.5, y: b.y + b.height - 8 };
206
+ this.actor.behind = true;
207
+ this.change('escaping');
208
+ }
209
+ else {
210
+ this.actor.behind = false;
211
+ this.change('waving');
212
+ this.nextHeist = this.time + this.options.cooldown;
213
+ }
214
+ }
215
+ dispose() {
216
+ this.gifts = [];
217
+ this.target = null;
218
+ this.shelter = null;
219
+ this.actor.rope = null;
220
+ }
221
+ step(dt, view, shelters, pointer, quiet = false) {
222
+ if (!this.initialized)
223
+ this.spawn(view, quiet);
224
+ if (!this.initialized)
225
+ return;
226
+ const a = this.actor, size = this.options.size;
227
+ a.visible =
228
+ a.x > view.x - 70 &&
229
+ a.x < view.x + view.width + 70 &&
230
+ a.y > view.y - 30 &&
231
+ a.y - 145 * size < view.y + view.height;
232
+ if (quiet) {
233
+ this.settleEntrance();
234
+ return;
235
+ }
236
+ if (!(dt > 0))
237
+ return;
238
+ dt = clamp(dt, 0, 0.05);
239
+ this.time += dt;
240
+ this.actor.age += dt;
241
+ for (const gift of this.gifts)
242
+ if (gift.returning) {
243
+ gift.returning.age += dt;
244
+ if (gift.returning.age >= 0.85) {
245
+ gift.returning = null;
246
+ gift.state = 'available';
247
+ this.emit('gift:returned', { giftId: gift.id });
248
+ }
249
+ }
250
+ if (this.shelter) {
251
+ const live = shelters.find((s) => s.id === this.shelter.id);
252
+ if (live)
253
+ this.shelter = live;
254
+ else {
255
+ this.shelter = null;
256
+ a.behind = false;
257
+ if (['hiding', 'peeking', 'escaping'].includes(a.phase))
258
+ this.change('idle');
259
+ }
260
+ }
261
+ if (pointer &&
262
+ this.options.fearRadius > 0 &&
263
+ a.visible &&
264
+ !a.behind &&
265
+ !['caught', 'warming', 'arriving'].includes(a.phase) &&
266
+ this.time - this.lastCatch > 3 &&
267
+ distance({ x: a.x, y: a.y - 60 * size }, pointer) < this.options.fearRadius)
268
+ this.shoo();
269
+ if (this.target && !this.gifts.includes(this.target)) {
270
+ this.target = null;
271
+ a.rope = null;
272
+ this.change('idle');
273
+ this.nextHeist = this.time + 2;
274
+ }
275
+ const gift = this.target;
276
+ switch (a.phase) {
277
+ case 'arriving':
278
+ if (this.move(a.destination, dt, this.options.entrance === 'rope' ? 180 : 95)) {
279
+ a.rope = null;
280
+ this.change('waving');
281
+ this.nextHeist = this.time + 1.5;
282
+ }
283
+ break;
284
+ case 'idle':
285
+ if (this.options.mood === 'mischievous' &&
286
+ this.options.autoSteal &&
287
+ this.time > this.nextHeist &&
288
+ a.visible)
289
+ this.steal();
290
+ else if (this.options.mood === 'friendly' && a.age > 5)
291
+ this.wave();
292
+ break;
293
+ case 'sneaking':
294
+ case 'climbing': {
295
+ if (!gift && this.afterClimb === 'idle' && a.phase === 'climbing') {
296
+ if (this.move(a.destination, dt, 95)) {
297
+ a.rope = null;
298
+ a.behind = false;
299
+ this.change('idle');
300
+ }
301
+ break;
302
+ }
303
+ if (!gift || !gift.visible || gift.state !== 'available') {
304
+ this.target = null;
305
+ a.rope = null;
306
+ this.change('idle');
307
+ this.nextHeist = this.time + 2;
308
+ break;
309
+ }
310
+ const side = gift.position.x >= a.x ? 1 : -1;
311
+ const to = { x: gift.position.x - side * 28 * size, y: gift.position.y };
312
+ if (a.phase === 'sneaking' && Math.abs(to.y - a.y) > 32) {
313
+ if (Math.abs(to.x - a.x) > 65 * size)
314
+ this.move({ x: to.x, y: a.y }, dt, 80);
315
+ else {
316
+ this.afterClimb = 'reaching';
317
+ a.rope = { x: to.x, y: to.y - 8 };
318
+ this.change('climbing');
319
+ }
320
+ }
321
+ else if (this.move(to, dt, a.phase === 'climbing' ? 105 : 80)) {
322
+ a.facing = gift.position.x >= a.x ? 1 : -1;
323
+ a.rope = null;
324
+ this.change('reaching');
325
+ }
326
+ break;
327
+ }
328
+ case 'reaching':
329
+ if (!gift || !gift.visible || gift.state !== 'available') {
330
+ this.target = null;
331
+ this.change('idle');
332
+ }
333
+ else if (distance(a, { x: gift.position.x - a.facing * 28 * size, y: gift.position.y }) >
334
+ 20 * size)
335
+ this.change('sneaking');
336
+ else if (a.age > 0.55) {
337
+ gift.state = 'held';
338
+ this.change('stealing');
339
+ }
340
+ break;
341
+ case 'stealing':
342
+ if (a.age > 0.65)
343
+ this.change('stashing');
344
+ break;
345
+ case 'stashing':
346
+ if (a.age > 0.7 && gift?.state === 'held') {
347
+ gift.state = 'stolen';
348
+ this.totalStolen++;
349
+ this.nextHeist = this.time + this.options.cooldown;
350
+ this.emit('gift:stolen', { giftId: gift.id, totalStolen: this.totalStolen });
351
+ this.target = null;
352
+ this.change('gloating');
353
+ }
354
+ break;
355
+ case 'gloating':
356
+ if (a.age > 1.0)
357
+ this.hide(shelters);
358
+ break;
359
+ case 'caught':
360
+ if (a.age > 1.1)
361
+ this.hide(shelters);
362
+ break;
363
+ case 'escaping':
364
+ if (this.shelter) {
365
+ const b = this.shelter.box;
366
+ a.destination = { x: b.x + b.width * 0.5, y: b.y + b.height - 8 };
367
+ if (this.move(a.destination, dt, 155))
368
+ this.change('hiding');
369
+ }
370
+ else
371
+ this.change('idle');
372
+ break;
373
+ case 'hiding':
374
+ if (a.age > 1.0)
375
+ this.change('peeking');
376
+ break;
377
+ case 'peeking':
378
+ if (this.shelter) {
379
+ const b = this.shelter.box, to = { x: b.x - 14 * size, y: b.y + b.height - 8 };
380
+ if (this.move(to, dt, 95) && a.age > 2.5) {
381
+ a.destination = { x: to.x, y: b.y };
382
+ a.rope = { x: to.x, y: b.y };
383
+ this.afterClimb = 'idle';
384
+ this.target = null;
385
+ this.change('climbing');
386
+ }
387
+ }
388
+ else
389
+ this.change('idle');
390
+ break;
391
+ case 'warming':
392
+ if (a.age > 2.0) {
393
+ a.behind = false;
394
+ this.change('waving');
395
+ }
396
+ break;
397
+ case 'waving':
398
+ if (a.age > 1.35)
399
+ this.change('idle');
400
+ break;
401
+ }
402
+ }
403
+ }
404
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { GrinchOptions, GrinchTuning } from './types.js';
2
+ export declare const defaults: {
3
+ readonly territory: "page";
4
+ readonly objects: "[data-grinch-object], [data-grinch-gift], [data-weather-surface], article, .card, button, img, pre";
5
+ readonly maxGifts: 5;
6
+ readonly size: 1;
7
+ readonly mobileScale: 0.85;
8
+ readonly speed: 1;
9
+ readonly cooldown: 10;
10
+ readonly fearRadius: 90;
11
+ readonly mood: "mischievous";
12
+ readonly autoSteal: true;
13
+ readonly entrance: "sneak";
14
+ readonly motion: "system";
15
+ readonly observe: true;
16
+ readonly zIndex: 140;
17
+ readonly furColor: "#79ad30";
18
+ readonly coatColor: "#c92c42";
19
+ readonly controls: false;
20
+ };
21
+ export type Options = Omit<Required<GrinchOptions>, 'root' | 'targets'>;
22
+ export declare const tuningKeys: Set<string>;
23
+ export declare function selector(value: unknown): asserts value is string;
24
+ export declare function resolveOptions(input?: GrinchOptions): Options;
25
+ export declare function validateTuning(patch: GrinchTuning): void;
26
+ //# sourceMappingURL=options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC9D,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;CAmBX,CAAC;AACX,MAAM,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAExE,eAAO,MAAM,UAAU,aAUrB,CAAC;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,MAAM,CAGhE;AACD,wBAAgB,cAAc,CAAC,KAAK,GAAE,aAAkB,GAAG,OAAO,CA4CjE;AACD,wBAAgB,cAAc,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAQxD"}
@@ -0,0 +1,89 @@
1
+ export const defaults = {
2
+ territory: 'page',
3
+ objects: '[data-grinch-object], [data-grinch-gift], [data-weather-surface], article, .card, button, img, pre',
4
+ maxGifts: 5,
5
+ size: 1,
6
+ mobileScale: 0.85,
7
+ speed: 1,
8
+ cooldown: 10,
9
+ fearRadius: 90,
10
+ mood: 'mischievous',
11
+ autoSteal: true,
12
+ entrance: 'sneak',
13
+ motion: 'system',
14
+ observe: true,
15
+ zIndex: 140,
16
+ furColor: '#79ad30',
17
+ coatColor: '#c92c42',
18
+ controls: false,
19
+ };
20
+ const keys = new Set([...Object.keys(defaults), 'root', 'targets']);
21
+ export const tuningKeys = new Set([
22
+ 'size',
23
+ 'mobileScale',
24
+ 'speed',
25
+ 'cooldown',
26
+ 'fearRadius',
27
+ 'mood',
28
+ 'autoSteal',
29
+ 'furColor',
30
+ 'coatColor',
31
+ ]);
32
+ export function selector(value) {
33
+ if (typeof value !== 'string' || !value.trim() || value.length > 512)
34
+ throw new TypeError('Grinch: selectors must contain 1–512 characters.');
35
+ }
36
+ export function resolveOptions(input = {}) {
37
+ if (!input || typeof input !== 'object' || Array.isArray(input))
38
+ throw new TypeError('Grinch: options must be an object.');
39
+ if (Object.keys(input).some((k) => !keys.has(k)))
40
+ throw new TypeError('Grinch: unknown option.');
41
+ const result = { ...defaults, ...input };
42
+ const bounds = {
43
+ maxGifts: [1, 12],
44
+ size: [0.6, 1.8],
45
+ mobileScale: [0.6, 1],
46
+ speed: [0.25, 2],
47
+ cooldown: [3, 120],
48
+ fearRadius: [0, 240],
49
+ zIndex: [-2147483648, 2147483647],
50
+ };
51
+ for (const key of Object.keys(bounds)) {
52
+ const value = result[key], [min, max] = bounds[key];
53
+ if (typeof value !== 'number' || !Number.isFinite(value) || value < min || value > max)
54
+ throw new RangeError(`Grinch: ${key} must be between ${min} and ${max}.`);
55
+ }
56
+ for (const key of ['maxGifts', 'zIndex'])
57
+ if (!Number.isInteger(result[key]))
58
+ throw new TypeError(`Grinch: ${key} must be an integer.`);
59
+ for (const key of ['observe', 'autoSteal', 'controls'])
60
+ if (typeof result[key] !== 'boolean')
61
+ throw new TypeError(`Grinch: ${key} must be boolean.`);
62
+ if (!['mischievous', 'friendly'].includes(result.mood))
63
+ throw new TypeError('Grinch: invalid mood.');
64
+ if (!['system', 'full', 'none'].includes(result.motion))
65
+ throw new TypeError('Grinch: invalid motion.');
66
+ if (!['sneak', 'rope', 'appear'].includes(result.entrance))
67
+ throw new TypeError('Grinch: invalid entrance.');
68
+ if (!['page', 'root'].includes(result.territory))
69
+ throw new TypeError('Grinch: invalid territory.');
70
+ for (const key of ['furColor', 'coatColor'])
71
+ if (typeof result[key] !== 'string' || !/^#[a-f\d]{6}$/i.test(result[key]))
72
+ throw new TypeError(`Grinch: ${key} must be a six-digit hex color.`);
73
+ selector(result.objects);
74
+ if (input.targets !== undefined &&
75
+ typeof input.targets !== 'string' &&
76
+ !Array.isArray(input.targets))
77
+ throw new TypeError('Grinch: targets must be a selector or array of elements.');
78
+ if (typeof input.targets === 'string')
79
+ selector(input.targets);
80
+ return result;
81
+ }
82
+ export function validateTuning(patch) {
83
+ if (!patch ||
84
+ typeof patch !== 'object' ||
85
+ Array.isArray(patch) ||
86
+ Object.keys(patch).some((k) => !tuningKeys.has(k)))
87
+ throw new TypeError('Grinch: update accepts tuning options only.');
88
+ }
89
+ //# sourceMappingURL=options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { Options } from './options.js';
2
+ import { type Mischief } from './model.js';
3
+ import type { Point } from './types.js';
4
+ export declare function paintGift(ctx: CanvasRenderingContext2D, point: Point, color: string, size?: number, scale?: number): void;
5
+ /** Original procedural character artwork, with expressive poses instead of downloaded sprites. */
6
+ export declare function paintGrinch(ctx: CanvasRenderingContext2D, model: Mischief, options: Options, quiet: boolean): void;
7
+ export declare function paintPresents(ctx: CanvasRenderingContext2D, model: Mischief, size: number, held: boolean): void;
8
+ export declare function giftColor(index: number): string;
9
+ //# sourceMappingURL=paint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paint.d.ts","sourceRoot":"","sources":["../src/paint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAS,KAAK,QAAQ,EAAa,MAAM,YAAY,CAAC;AAC7D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,wBAAgB,SAAS,CACvB,GAAG,EAAE,wBAAwB,EAC7B,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,IAAI,SAAI,EACR,KAAK,SAAI,GACR,IAAI,CA+BN;AAmBD,kGAAkG;AAClG,wBAAgB,WAAW,CACzB,GAAG,EAAE,wBAAwB,EAC7B,KAAK,EAAE,QAAQ,EACf,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,OAAO,GACb,IAAI,CAuUN;AACD,wBAAgB,aAAa,CAC3B,GAAG,EAAE,wBAAwB,EAC7B,KAAK,EAAE,QAAQ,EACf,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,OAAO,GACZ,IAAI,CAWN;AACD,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C"}