raven-mcp 1.10.0 → 1.11.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/README.md CHANGED
@@ -10,7 +10,7 @@ A design knowledge MCP server that Claude can query when generating UI. Eight la
10
10
 
11
11
  Raven gives Claude access to a comprehensive design knowledge base:
12
12
 
13
- - **Principles** — Nielsen's 10 Heuristics, all 21 Laws of UX, Gestalt principles, WCAG accessibility, typography rules, color theory, mobile UX, D4D framework, UX writing, service design, and brand
13
+ - **Principles** — Nielsen's 10 Heuristics, all 21 Laws of UX, Gestalt principles, WCAG accessibility, typography rules, color theory, mobile UX, D4D framework, UX writing, service design, brand, color-systems (palette-size discipline), and spacing-systems (base-unit grid + scale limits)
14
14
  - **Patterns** — Proven UI patterns for signup flows, pricing pages, navigation, forms, landing pages, dashboards, modals, empty/error/loading states, CTAs, social proof, mobile conversion — plus content patterns (error messages, empty-state copy, notifications, form validation) and service patterns (service blueprinting, human handoff, signup-as-service, omnichannel continuity, moments of truth)
15
15
  - **Content systems** — Voice & tone guides from publicly documented brand systems: Mailchimp, GOV.UK, Shopify Polaris, and Atlassian
16
16
  - **Research** — Qualitative, quantitative, and usability methods with do/don't protocols and checklists. Metrics frameworks: HEART, AARRR/Pirate, North Star Metric, conversion funnel, RICE, OKRs.
@@ -71,6 +71,7 @@ cd raven-mcp && npm install && npm run build
71
71
  | `audit_content` | Per-item content verdicts (pass/warn/fail) for headings, prose, CTAs, labels, captions, metrics & outcomes against UX-writing principles + deterministic heuristics (metric needs number+unit; CTA action-led ≤4 words; prose flags passive/jargon/hedging; caption-vs-heading duplication) — with a before→after rewrite suggestion per item. Pure offline |
72
72
  | `audit_typography` | Typographic-**scale** report over rendered DOM text nodes (or a supplied snapshot) — detects the dominant modular-scale ratio and flags off-scale sizes, checks line-height consistency vs the body rhythm, and flags weight ladders >4 weights or non-standard values. Goes beyond `audit_page`'s pass/fail typography checks |
73
73
  | `audit_tap_targets` | WCAG 2.5.5 / Apple 44pt **web** tap-target audit — enumerates every interactive element (rendered URL or snapshot) and emits a per-element fix table: selector, role, text, measured w/h, per-axis pixel deficit, and a concrete CSS fix, sorted worst-first |
74
+ | `audit_device_frame` | Flag cropped content in device-mockup frames — `frames` (container box + intrinsic media + object-fit, or a DevTools snippet) detects object-fit:cover crop loss when frame AR ≠ media AR; `clips` (first/last frame PNGs) detects baked-in pan/zoom (Ken Burns); `edge_frames` (PNGs) flags content truncated at a frame edge |
74
75
  | `audit_swiftui` | Audit SwiftUI source against Apple HIG — Dynamic Type, semantic colors, 44pt targets, 4/8pt spacing, AccentColor |
75
76
  | `audit_ios_screen` | Score a rendered iOS screen from an accessibility/view-hierarchy snapshot — 44pt targets + contrast + rhythm, in points |
76
77
  | `audit_ios_privacy` | Audit Info.plist (or Expo app.json) /PRIVACY.md/entitlements/source — usage-string honesty, ATS, Android permissions, bundled secrets, undisclosed default data-egress |
@@ -0,0 +1,73 @@
1
+ import { type ImageEdgeOptions, type ImageEdgeVerdict } from "./asset-integrity.js";
2
+ export type ObjectFit = "fill" | "cover" | "contain" | "none" | "scale-down";
3
+ export type DeviceFrameSample = {
4
+ selector: string;
5
+ container: {
6
+ w: number;
7
+ h: number;
8
+ };
9
+ media: {
10
+ w: number;
11
+ h: number;
12
+ };
13
+ objectFit?: ObjectFit;
14
+ objectPosition?: {
15
+ x: number;
16
+ y: number;
17
+ };
18
+ };
19
+ export type CropAxis = {
20
+ cropped_fraction: number;
21
+ lost_start: number;
22
+ lost_end: number;
23
+ };
24
+ export type DeviceFrameVerdict = {
25
+ selector: string;
26
+ object_fit: ObjectFit;
27
+ container_ar: number;
28
+ media_ar: number;
29
+ verdict: "fits" | "cropped" | "letterboxed" | "distorted" | "inconclusive";
30
+ cropped_edges: Array<"top" | "bottom" | "left" | "right">;
31
+ crop_fraction: number;
32
+ distortion: number;
33
+ horizontal: CropAxis;
34
+ vertical: CropAxis;
35
+ confidence: number;
36
+ reason: string;
37
+ };
38
+ export type DeviceFrameOptions = {
39
+ cropThreshold?: number;
40
+ distortionThreshold?: number;
41
+ };
42
+ export type ClipMotionInput = {
43
+ label: string;
44
+ firstFramePath: string;
45
+ lastFramePath: string;
46
+ };
47
+ export type MotionVerdict = {
48
+ label: string;
49
+ verdict: "static" | "pan" | "zoom" | "pan-zoom" | "inconclusive";
50
+ mean_displacement: number;
51
+ zoom_ratio: number;
52
+ pan_vector: {
53
+ dx: number;
54
+ dy: number;
55
+ };
56
+ confidence: number;
57
+ warnings: string[];
58
+ reason: string;
59
+ };
60
+ export type MotionOptions = {
61
+ grid?: number;
62
+ searchRadius?: number;
63
+ downsampleWidth?: number;
64
+ staticThreshold?: number;
65
+ zoomThreshold?: number;
66
+ };
67
+ export type FrameEdgeInput = {
68
+ label: string;
69
+ framePath: string;
70
+ };
71
+ export declare function auditDeviceFrames(samples: DeviceFrameSample[], opts?: DeviceFrameOptions): DeviceFrameVerdict[];
72
+ export declare function auditClipMotion(inputs: ClipMotionInput[], opts?: MotionOptions): Promise<MotionVerdict[]>;
73
+ export declare function auditFrameEdges(inputs: FrameEdgeInput[], opts?: ImageEdgeOptions): Promise<ImageEdgeVerdict[]>;
@@ -0,0 +1,483 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { auditImageEdges } from "./asset-integrity.js";
3
+ const EMPTY_AXIS = { cropped_fraction: 0, lost_start: 0, lost_end: 0 };
4
+ const EDGE_EPSILON = 0.000001;
5
+ export function auditDeviceFrames(samples, opts = {}) {
6
+ return (samples || []).map(function (sample) {
7
+ return auditDeviceFrame(sample, opts);
8
+ });
9
+ }
10
+ export async function auditClipMotion(inputs, opts = {}) {
11
+ // @ts-ignore pngjs is intentionally optional; absence falls back to inconclusive-with-warning.
12
+ const pngMod = (await import("pngjs").catch(() => null));
13
+ const readPng = pngMod?.PNG?.sync?.read;
14
+ return (inputs || []).map(function (input) {
15
+ if (!readPng) {
16
+ return inconclusiveMotion(input.label, [
17
+ "pngjs not installed — cannot analyze clip motion"
18
+ ]);
19
+ }
20
+ return auditClipMotionInput(input, readPng, opts);
21
+ });
22
+ }
23
+ export async function auditFrameEdges(inputs, opts = {}) {
24
+ // @ts-ignore pngjs is intentionally optional; absence falls back to inconclusive-with-warning.
25
+ const pngMod = (await import("pngjs").catch(() => null));
26
+ const readPng = pngMod?.PNG?.sync?.read;
27
+ const samples = [];
28
+ const results = [];
29
+ for (let i = 0; i < (inputs || []).length; i += 1) {
30
+ const input = inputs[i];
31
+ if (!readPng) {
32
+ results.push(inconclusiveEdge(input.label, "pngjs not installed — cannot sample frame edges"));
33
+ continue;
34
+ }
35
+ let png;
36
+ try {
37
+ png = readPng(readFileSync(input.framePath));
38
+ }
39
+ catch (error) {
40
+ results.push(inconclusiveEdge(input.label, "Could not read/decode frame PNG: " + errorMessage(error)));
41
+ continue;
42
+ }
43
+ const thickness = Math.max(2, Math.round(Math.min(png.width, png.height) * 0.03));
44
+ samples.push({
45
+ selector: input.label,
46
+ width: png.width,
47
+ height: png.height,
48
+ edges: {
49
+ top: stripLuminanceVariance(png, 0, 0, png.width, Math.min(thickness, png.height)),
50
+ bottom: stripLuminanceVariance(png, 0, Math.max(0, png.height - thickness), png.width, Math.min(thickness, png.height)),
51
+ left: stripLuminanceVariance(png, 0, 0, Math.min(thickness, png.width), png.height),
52
+ right: stripLuminanceVariance(png, Math.max(0, png.width - thickness), 0, Math.min(thickness, png.width), png.height)
53
+ },
54
+ tainted: false
55
+ });
56
+ }
57
+ return results.concat(auditImageEdges(samples, opts));
58
+ }
59
+ function auditDeviceFrame(sample, opts) {
60
+ const cropThreshold = opts.cropThreshold ?? 0.02;
61
+ const distortionThreshold = opts.distortionThreshold ?? 0.02;
62
+ const objectFit = sample.objectFit ?? "fill";
63
+ const cw = sample.container.w;
64
+ const ch = sample.container.h;
65
+ const mw = sample.media.w;
66
+ const mh = sample.media.h;
67
+ const containerAr = ch > 0 ? cw / ch : 0;
68
+ const mediaAr = mh > 0 ? mw / mh : 0;
69
+ const pos = {
70
+ x: clamp(sample.objectPosition?.x ?? 0.5, 0, 1),
71
+ y: clamp(sample.objectPosition?.y ?? 0.5, 0, 1)
72
+ };
73
+ if (cw <= 0 || ch <= 0 || mw <= 0 || mh <= 0) {
74
+ return {
75
+ selector: sample.selector,
76
+ object_fit: objectFit,
77
+ container_ar: containerAr,
78
+ media_ar: mediaAr,
79
+ verdict: "inconclusive",
80
+ cropped_edges: [],
81
+ crop_fraction: 0,
82
+ distortion: 0,
83
+ horizontal: zeroAxis(),
84
+ vertical: zeroAxis(),
85
+ confidence: 0,
86
+ reason: "container and media dimensions must be positive to audit device-frame crop"
87
+ };
88
+ }
89
+ if (objectFit === "cover") {
90
+ return coverVerdict(sample.selector, objectFit, cw, ch, mw, mh, containerAr, mediaAr, pos, cropThreshold);
91
+ }
92
+ if (objectFit === "contain") {
93
+ return containVerdict(sample.selector, objectFit, cw, ch, mw, mh, containerAr, mediaAr, cropThreshold);
94
+ }
95
+ if (objectFit === "none") {
96
+ return noneVerdict(sample.selector, objectFit, cw, ch, mw, mh, containerAr, mediaAr, pos, cropThreshold);
97
+ }
98
+ if (objectFit === "scale-down") {
99
+ if (mw <= cw && mh <= ch) {
100
+ return noneVerdict(sample.selector, objectFit, cw, ch, mw, mh, containerAr, mediaAr, pos, cropThreshold);
101
+ }
102
+ return containVerdict(sample.selector, objectFit, cw, ch, mw, mh, containerAr, mediaAr, cropThreshold);
103
+ }
104
+ return fillVerdict(sample.selector, objectFit, containerAr, mediaAr, distortionThreshold);
105
+ }
106
+ function coverVerdict(selector, objectFit, cw, ch, mw, mh, containerAr, mediaAr, pos, cropThreshold) {
107
+ const scale = Math.max(cw / mw, ch / mh);
108
+ const dispW = mw * scale;
109
+ const dispH = mh * scale;
110
+ const horizontal = splitCrop(Math.max(0, (dispW - cw) / dispW), pos.x);
111
+ const vertical = splitCrop(Math.max(0, (dispH - ch) / dispH), pos.y);
112
+ const cropFraction = clamp(1 - (cw / dispW) * (ch / dispH), 0, 1);
113
+ const verdict = cropFraction > cropThreshold ? "cropped" : "fits";
114
+ const croppedEdges = verdict === "cropped" ? croppedEdgesForAxes(horizontal, vertical, cropThreshold) : [];
115
+ return {
116
+ selector,
117
+ object_fit: objectFit,
118
+ container_ar: containerAr,
119
+ media_ar: mediaAr,
120
+ verdict,
121
+ cropped_edges: croppedEdges,
122
+ crop_fraction: cropFraction,
123
+ distortion: 0,
124
+ horizontal,
125
+ vertical,
126
+ confidence: metricConfidence(cropFraction, cropThreshold, verdict !== "fits"),
127
+ reason: verdict === "cropped"
128
+ ? cropReason(croppedEdges, cropFraction)
129
+ : "cover media fits the frame without meaningful crop"
130
+ };
131
+ }
132
+ function containVerdict(selector, objectFit, cw, ch, mw, mh, containerAr, mediaAr, cropThreshold) {
133
+ const scale = Math.min(cw / mw, ch / mh);
134
+ const dispW = mw * scale;
135
+ const dispH = mh * scale;
136
+ const letterboxTrack = clamp(1 - (dispW * dispH) / (cw * ch), 0, 1);
137
+ const verdict = letterboxTrack > cropThreshold ? "letterboxed" : "fits";
138
+ return {
139
+ selector,
140
+ object_fit: objectFit,
141
+ container_ar: containerAr,
142
+ media_ar: mediaAr,
143
+ verdict,
144
+ cropped_edges: [],
145
+ crop_fraction: 0,
146
+ distortion: 0,
147
+ horizontal: zeroAxis(),
148
+ vertical: zeroAxis(),
149
+ confidence: metricConfidence(letterboxTrack, cropThreshold, verdict !== "fits"),
150
+ reason: verdict === "letterboxed"
151
+ ? "contain media is fully visible with " + percent(letterboxTrack) + " empty letterbox track"
152
+ : "contain media fits the frame without meaningful letterbox track"
153
+ };
154
+ }
155
+ function noneVerdict(selector, objectFit, cw, ch, mw, mh, containerAr, mediaAr, pos, cropThreshold) {
156
+ const horizontal = splitCrop(Math.max(0, (mw - cw) / mw), pos.x);
157
+ const vertical = splitCrop(Math.max(0, (mh - ch) / mh), pos.y);
158
+ const cropFraction = clamp(1 - (Math.min(cw, mw) / mw) * (Math.min(ch, mh) / mh), 0, 1);
159
+ const verdict = cropFraction > cropThreshold ? "cropped" : "fits";
160
+ const croppedEdges = verdict === "cropped" ? croppedEdgesForAxes(horizontal, vertical, cropThreshold) : [];
161
+ return {
162
+ selector,
163
+ object_fit: objectFit,
164
+ container_ar: containerAr,
165
+ media_ar: mediaAr,
166
+ verdict,
167
+ cropped_edges: croppedEdges,
168
+ crop_fraction: cropFraction,
169
+ distortion: 0,
170
+ horizontal,
171
+ vertical,
172
+ confidence: metricConfidence(cropFraction, cropThreshold, verdict !== "fits"),
173
+ reason: verdict === "cropped"
174
+ ? cropReason(croppedEdges, cropFraction)
175
+ : objectFit + " media fits the frame without meaningful crop"
176
+ };
177
+ }
178
+ function fillVerdict(selector, objectFit, containerAr, mediaAr, distortionThreshold) {
179
+ const distortion = Math.abs(containerAr / mediaAr - 1);
180
+ const verdict = distortion > distortionThreshold ? "distorted" : "fits";
181
+ return {
182
+ selector,
183
+ object_fit: objectFit,
184
+ container_ar: containerAr,
185
+ media_ar: mediaAr,
186
+ verdict,
187
+ cropped_edges: [],
188
+ crop_fraction: 0,
189
+ distortion,
190
+ horizontal: zeroAxis(),
191
+ vertical: zeroAxis(),
192
+ confidence: metricConfidence(distortion, distortionThreshold, verdict !== "fits"),
193
+ reason: verdict === "distorted"
194
+ ? "fill stretches media by " + percent(distortion) + " relative aspect-ratio distortion"
195
+ : "fill media does not exceed the distortion threshold"
196
+ };
197
+ }
198
+ function auditClipMotionInput(input, readPng, opts) {
199
+ const warnings = [];
200
+ const grid = Math.max(1, Math.round(opts.grid ?? 6));
201
+ const searchRadius = Math.max(0, Math.round(opts.searchRadius ?? 6));
202
+ const downsampleWidth = Math.max(8, Math.round(opts.downsampleWidth ?? 96));
203
+ const staticThreshold = opts.staticThreshold ?? 0.6;
204
+ const zoomThreshold = opts.zoomThreshold ?? 0.02;
205
+ let first;
206
+ let last;
207
+ try {
208
+ first = readPng(readFileSync(input.firstFramePath));
209
+ }
210
+ catch (error) {
211
+ return inconclusiveMotion(input.label, ["Could not read/decode first frame PNG: " + errorMessage(error)]);
212
+ }
213
+ try {
214
+ last = readPng(readFileSync(input.lastFramePath));
215
+ }
216
+ catch (error) {
217
+ return inconclusiveMotion(input.label, ["Could not read/decode last frame PNG: " + errorMessage(error)]);
218
+ }
219
+ if (first.width <= 0 || first.height <= 0 || last.width <= 0 || last.height <= 0) {
220
+ return inconclusiveMotion(input.label, ["Frame dimensions must be positive to analyze clip motion"]);
221
+ }
222
+ if (first.width !== last.width || first.height !== last.height) {
223
+ warnings.push("Frame dimensions differ — both frames were resampled to the first frame aspect ratio");
224
+ }
225
+ const downsampleHeight = Math.max(1, Math.round(downsampleWidth * first.height / first.width));
226
+ const a = resampleLuma(first, downsampleWidth, downsampleHeight);
227
+ const b = resampleLuma(last, downsampleWidth, downsampleHeight);
228
+ const vectors = blockMotionVectors(a, b, grid, searchRadius);
229
+ if (vectors.length === 0) {
230
+ return inconclusiveMotion(input.label, ["No valid motion blocks could be matched"]);
231
+ }
232
+ let dxTotal = 0;
233
+ let dyTotal = 0;
234
+ let magTotal = 0;
235
+ let dotTotal = 0;
236
+ let radiusSqTotal = 0;
237
+ let radiusTotal = 0;
238
+ for (let i = 0; i < vectors.length; i += 1) {
239
+ const v = vectors[i];
240
+ dxTotal += v.dx;
241
+ dyTotal += v.dy;
242
+ magTotal += v.mag;
243
+ dotTotal += v.dx * v.rx + v.dy * v.ry;
244
+ radiusSqTotal += v.rx * v.rx + v.ry * v.ry;
245
+ radiusTotal += Math.hypot(v.rx, v.ry);
246
+ }
247
+ const panVector = { dx: dxTotal / vectors.length, dy: dyTotal / vectors.length };
248
+ const meanDisplacement = magTotal / vectors.length;
249
+ const zoomRatio = 1 + (radiusSqTotal > 0 ? dotTotal / radiusSqTotal : 0);
250
+ const meanRadius = radiusTotal / vectors.length;
251
+ const panMag = Math.hypot(panVector.dx, panVector.dy);
252
+ const zoomMag = Math.abs(zoomRatio - 1) * meanRadius;
253
+ let verdict;
254
+ if (meanDisplacement < staticThreshold && Math.abs(zoomRatio - 1) < zoomThreshold) {
255
+ verdict = "static";
256
+ }
257
+ else if (panMag > staticThreshold && zoomMag > staticThreshold) {
258
+ verdict = "pan-zoom";
259
+ }
260
+ else if (zoomMag >= panMag) {
261
+ verdict = "zoom";
262
+ }
263
+ else {
264
+ verdict = "pan";
265
+ }
266
+ const decidingMetric = verdict === "static" ? Math.max(meanDisplacement, Math.abs(zoomRatio - 1)) : Math.max(panMag, zoomMag);
267
+ const confidence = verdict === "static"
268
+ ? clamp(1 - Math.max(meanDisplacement / staticThreshold, Math.abs(zoomRatio - 1) / zoomThreshold), 0, 1)
269
+ : Math.max(0.5, clamp(decidingMetric / (staticThreshold * 4), 0, 1));
270
+ return {
271
+ label: input.label,
272
+ verdict,
273
+ mean_displacement: round4(meanDisplacement),
274
+ zoom_ratio: round4(zoomRatio),
275
+ pan_vector: { dx: round4(panVector.dx), dy: round4(panVector.dy) },
276
+ confidence: round2(confidence),
277
+ warnings,
278
+ reason: motionReason(verdict, zoomRatio, panVector, meanDisplacement)
279
+ };
280
+ }
281
+ function blockMotionVectors(a, b, grid, searchRadius) {
282
+ const vectors = [];
283
+ const cellW = a.width / grid;
284
+ const cellH = a.height / grid;
285
+ const blockW = Math.max(3, Math.floor(cellW / 4));
286
+ const blockH = Math.max(3, Math.floor(cellH / 4));
287
+ const centerX = (a.width - 1) / 2;
288
+ const centerY = (a.height - 1) / 2;
289
+ for (let gy = 0; gy < grid; gy += 1) {
290
+ for (let gx = 0; gx < grid; gx += 1) {
291
+ const cx = Math.round((gx + 0.5) * cellW);
292
+ const cy = Math.round((gy + 0.5) * cellH);
293
+ const x0 = clampInt(cx - Math.floor(blockW / 2), 0, a.width - blockW);
294
+ const y0 = clampInt(cy - Math.floor(blockH / 2), 0, a.height - blockH);
295
+ const best = bestBlockOffset(a, b, x0, y0, blockW, blockH, searchRadius);
296
+ vectors.push({
297
+ dx: best.dx,
298
+ dy: best.dy,
299
+ rx: cx - centerX,
300
+ ry: cy - centerY,
301
+ mag: Math.hypot(best.dx, best.dy)
302
+ });
303
+ }
304
+ }
305
+ return vectors;
306
+ }
307
+ function bestBlockOffset(a, b, x0, y0, blockW, blockH, searchRadius) {
308
+ let bestScore = Number.POSITIVE_INFINITY;
309
+ let best = { dx: 0, dy: 0 };
310
+ for (let dy = -searchRadius; dy <= searchRadius; dy += 1) {
311
+ for (let dx = -searchRadius; dx <= searchRadius; dx += 1) {
312
+ const bx = x0 + dx;
313
+ const by = y0 + dy;
314
+ if (bx < 0 || by < 0 || bx + blockW > b.width || by + blockH > b.height) {
315
+ continue;
316
+ }
317
+ const score = blockSad(a, b, x0, y0, bx, by, blockW, blockH);
318
+ if (score < bestScore) {
319
+ bestScore = score;
320
+ best = { dx, dy };
321
+ }
322
+ }
323
+ }
324
+ return best;
325
+ }
326
+ function blockSad(a, b, ax, ay, bx, by, blockW, blockH) {
327
+ let total = 0;
328
+ for (let y = 0; y < blockH; y += 1) {
329
+ for (let x = 0; x < blockW; x += 1) {
330
+ total += Math.abs(a.data[(ay + y) * a.width + ax + x] -
331
+ b.data[(by + y) * b.width + bx + x]);
332
+ }
333
+ }
334
+ return total;
335
+ }
336
+ function resampleLuma(png, targetW, targetH) {
337
+ const data = [];
338
+ for (let y = 0; y < targetH; y += 1) {
339
+ const yStart = Math.floor(y * png.height / targetH);
340
+ const yEnd = Math.max(yStart + 1, Math.ceil((y + 1) * png.height / targetH));
341
+ for (let x = 0; x < targetW; x += 1) {
342
+ const xStart = Math.floor(x * png.width / targetW);
343
+ const xEnd = Math.max(xStart + 1, Math.ceil((x + 1) * png.width / targetW));
344
+ let total = 0;
345
+ let count = 0;
346
+ for (let sy = yStart; sy < yEnd && sy < png.height; sy += 1) {
347
+ for (let sx = xStart; sx < xEnd && sx < png.width; sx += 1) {
348
+ const index = (sy * png.width + sx) * 4;
349
+ total += pixelLuminance(png.data[index], png.data[index + 1], png.data[index + 2]);
350
+ count += 1;
351
+ }
352
+ }
353
+ data.push(count > 0 ? total / count : 0);
354
+ }
355
+ }
356
+ return { width: targetW, height: targetH, data };
357
+ }
358
+ function splitCrop(croppedFraction, position) {
359
+ return {
360
+ cropped_fraction: croppedFraction,
361
+ lost_start: croppedFraction * position,
362
+ lost_end: croppedFraction * (1 - position)
363
+ };
364
+ }
365
+ function croppedEdgesForAxes(horizontal, vertical, cropThreshold) {
366
+ const out = [];
367
+ if (vertical.cropped_fraction > cropThreshold) {
368
+ if (vertical.lost_start > EDGE_EPSILON)
369
+ out.push("top");
370
+ if (vertical.lost_end > EDGE_EPSILON)
371
+ out.push("bottom");
372
+ }
373
+ if (horizontal.cropped_fraction > cropThreshold) {
374
+ if (horizontal.lost_start > EDGE_EPSILON)
375
+ out.push("left");
376
+ if (horizontal.lost_end > EDGE_EPSILON)
377
+ out.push("right");
378
+ }
379
+ return out;
380
+ }
381
+ function zeroAxis() {
382
+ return { ...EMPTY_AXIS };
383
+ }
384
+ function metricConfidence(metric, threshold, nonFit) {
385
+ if (threshold <= 0) {
386
+ return nonFit ? 1 : 0;
387
+ }
388
+ return nonFit
389
+ ? round2(Math.max(0.5, clamp(metric / (threshold * 4), 0, 1)))
390
+ : round2(clamp(1 - metric / threshold, 0, 1));
391
+ }
392
+ function cropReason(edges, cropFraction) {
393
+ const edgeText = edges.length > 0 ? edges.join(" and ") : "frame";
394
+ return "content is cropped at the " + edgeText + " edge(s), hiding " + percent(cropFraction) + " of media area";
395
+ }
396
+ function motionReason(verdict, zoomRatio, panVector, meanDisplacement) {
397
+ if (verdict === "static") {
398
+ return "frames are static; mean block displacement is " + round4(meanDisplacement) + " downsampled px";
399
+ }
400
+ if (verdict === "zoom") {
401
+ return "frame zooms " + zoomDirection(zoomRatio) + " ~" + percent(Math.abs(zoomRatio - 1)) + " (Ken Burns) — composition drifts; content near edges is pushed out of frame";
402
+ }
403
+ if (verdict === "pan") {
404
+ return "frame pans by " + round4(panVector.dx) + "×" + round4(panVector.dy) + " downsampled px — composition drifts inside the clip";
405
+ }
406
+ if (verdict === "pan-zoom") {
407
+ return "frame pans and zooms " + zoomDirection(zoomRatio) + " ~" + percent(Math.abs(zoomRatio - 1)) + " (Ken Burns) — content near edges is pushed out of frame";
408
+ }
409
+ return "clip motion could not be analyzed";
410
+ }
411
+ function zoomDirection(zoomRatio) {
412
+ return zoomRatio >= 1 ? "in" : "out";
413
+ }
414
+ function inconclusiveMotion(label, warnings) {
415
+ return {
416
+ label,
417
+ verdict: "inconclusive",
418
+ mean_displacement: 0,
419
+ zoom_ratio: 1,
420
+ pan_vector: { dx: 0, dy: 0 },
421
+ confidence: 0,
422
+ warnings,
423
+ reason: warnings.join("; ")
424
+ };
425
+ }
426
+ function inconclusiveEdge(label, reason) {
427
+ return {
428
+ selector: label,
429
+ verdict: "inconclusive",
430
+ cut_edge: null,
431
+ confidence: 0,
432
+ edges: { top: 0, bottom: 0, left: 0, right: 0 },
433
+ reason
434
+ };
435
+ }
436
+ function stripLuminanceVariance(png, x0, y0, w, h) {
437
+ const pixelCount = w * h;
438
+ if (pixelCount <= 0) {
439
+ return 0;
440
+ }
441
+ let lumaTotal = 0;
442
+ const luminances = [];
443
+ for (let y = y0; y < y0 + h && y < png.height; y += 1) {
444
+ for (let x = x0; x < x0 + w && x < png.width; x += 1) {
445
+ const index = (y * png.width + x) * 4;
446
+ const luminance = pixelLuminance(png.data[index], png.data[index + 1], png.data[index + 2]);
447
+ luminances.push(luminance);
448
+ lumaTotal += luminance;
449
+ }
450
+ }
451
+ const mean = lumaTotal / luminances.length;
452
+ let squaredDeltaTotal = 0;
453
+ for (let i = 0; i < luminances.length; i += 1) {
454
+ const delta = luminances[i] - mean;
455
+ squaredDeltaTotal += delta * delta;
456
+ }
457
+ return squaredDeltaTotal / luminances.length;
458
+ }
459
+ function pixelLuminance(r, g, b) {
460
+ return 0.2126 * r + 0.7152 * g + 0.0722 * b;
461
+ }
462
+ function percent(value) {
463
+ return Math.round(value * 1000) / 10 + "%";
464
+ }
465
+ function clamp(value, min, max) {
466
+ return Math.min(max, Math.max(min, value));
467
+ }
468
+ function clampInt(value, min, max) {
469
+ return Math.round(Math.min(max, Math.max(min, value)));
470
+ }
471
+ function round2(value) {
472
+ return Math.round(value * 100) / 100;
473
+ }
474
+ function round4(value) {
475
+ return Math.round(value * 10000) / 10000;
476
+ }
477
+ function errorMessage(error) {
478
+ if (error instanceof Error) {
479
+ return error.message;
480
+ }
481
+ return String(error);
482
+ }
483
+ //# sourceMappingURL=device-frame.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-frame.js","sourceRoot":"","sources":["../src/device-frame.ts"],"names":[],"mappings":"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"}