hyperframes 0.8.162 → 0.8.163
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/dist/{add-UW7GCPQF.js → add-Y7BGO2MK.js} +11 -11
- package/dist/{animatedGifPrep-YAJTDXB7.js → animatedGifPrep-NUU6VMFL.js} +5 -5
- package/dist/api.js +11 -11
- package/dist/{asset-TWBPYQOL.js → asset-OONPCZS5.js} +2 -2
- package/dist/{assetCataloger-BIDQA34M.js → assetCataloger-YWJRJK23.js} +2 -2
- package/dist/{audio-DJIE4YLH.js → audio-KPTXNHDC.js} +10 -10
- package/dist/{auth-VTCEZYBT.js → auth-UKXSZ4WA.js} +1 -1
- package/dist/{autoUpdate-JA3SV472.js → autoUpdate-4MRUONUQ.js} +2 -2
- package/dist/{backgroundChecks-J3WJDPQJ.js → backgroundChecks-X5M7Z6L7.js} +3 -3
- package/dist/backgroundChecksWorker.js +3 -3
- package/dist/{batchRender-C2JCG5EK.js → batchRender-GJ65EZ26.js} +3 -3
- package/dist/{beats-QVJVXZV5.js → beats-EQNT7OZE.js} +4 -4
- package/dist/{benchmark-WNBAKOXS.js → benchmark-WXWALVZJ.js} +8 -8
- package/dist/{browser-VJOTRIXL.js → browser-ZSNFVRC3.js} +3 -3
- package/dist/{bundleWithLocalizedFonts-SLBVWQ7O.js → bundleWithLocalizedFonts-O3BXZLCD.js} +2 -2
- package/dist/{capture-GUO23PVN.js → capture-JFFYE7XM.js} +2 -2
- package/dist/{capture-M5ZAD3BI.js → capture-TKWJBFGC.js} +9 -9
- package/dist/{catalog-SAC4GFIN.js → catalog-LK5MNUQY.js} +11 -11
- package/dist/{catch-up-T5RIRFJF.js → catch-up-ISTWIF6K.js} +4 -4
- package/dist/{check-IRETF27J.js → check-YVEBXKNY.js} +30 -30
- package/dist/{checkBrowser-5IXR4QCK.js → checkBrowser-OJAXYTRD.js} +28 -27
- package/dist/{chunk-VXVRPIJA.js → chunk-23IS5QVP.js} +69 -1
- package/dist/{chunk-B5FZ2CQM.js → chunk-2ALJMIFW.js} +1 -1
- package/dist/{chunk-ZEWX3GHP.js → chunk-2XIPB4MP.js} +1 -1
- package/dist/{chunk-RTS7BGEC.js → chunk-3E3VMAAM.js} +1 -1
- package/dist/{chunk-MMV6IY6U.js → chunk-3KY7FUSS.js} +2 -2
- package/dist/{chunk-XTLV6UVP.js → chunk-3TKNBY6K.js} +2 -2
- package/dist/{chunk-LYIG2GZ5.js → chunk-42AER3PM.js} +1 -1
- package/dist/{chunk-5K34RPE5.js → chunk-43H7XDO6.js} +2 -2
- package/dist/{chunk-B7RUGHBT.js → chunk-4LXWLCIX.js} +1 -1
- package/dist/{chunk-GS5EXZBV.js → chunk-54E2ELUA.js} +9 -9
- package/dist/{chunk-4ID635FL.js → chunk-5K5YH6M7.js} +1 -1
- package/dist/{chunk-GJQHHAAX.js → chunk-74H5SHQL.js} +3 -3
- package/dist/{chunk-PLEMSN3E.js → chunk-A356JY2J.js} +29 -19
- package/dist/{chunk-OMJA7JP6.js → chunk-AFPGUKMN.js} +4 -4
- package/dist/{chunk-RGYEL7QD.js → chunk-AXATVUCD.js} +3 -3
- package/dist/{chunk-GG37I7B3.js → chunk-BHGIBGUZ.js} +1 -1
- package/dist/{chunk-5YSHR4XC.js → chunk-CXVBPW5F.js} +6 -6
- package/dist/{chunk-GIPNECWL.js → chunk-D5PUMG2P.js} +1 -1
- package/dist/{chunk-D33YJZOH.js → chunk-DSXDYQQV.js} +1 -1
- package/dist/{chunk-PPF65XAF.js → chunk-GD7VU7CY.js} +1 -1
- package/dist/{chunk-ERTJPFCH.js → chunk-H3JGPRWA.js} +1 -1
- package/dist/{chunk-EVRUR7DW.js → chunk-H45RC6HN.js} +1 -1
- package/dist/{chunk-DJZEIVAP.js → chunk-H46R2BND.js} +1 -1
- package/dist/{chunk-YLBV2PXM.js → chunk-HQMWZNO2.js} +12 -1
- package/dist/{chunk-XWWYGXJ5.js → chunk-JEW5CCRU.js} +2 -2
- package/dist/{chunk-FF5TAEPT.js → chunk-JYR3YAAK.js} +1 -1
- package/dist/{chunk-JJYFRAI4.js → chunk-LHETZ63N.js} +1 -1
- package/dist/{chunk-G642IIVK.js → chunk-LMHXUDSR.js} +1 -1
- package/dist/{chunk-NQR5SBXX.js → chunk-M4237QMQ.js} +1 -1
- package/dist/{chunk-YJKUE3LV.js → chunk-NU4PDQ6G.js} +1 -1
- package/dist/{chunk-Q3TFX4OZ.js → chunk-NZ7K76Y2.js} +1 -1
- package/dist/{chunk-MP676E4B.js → chunk-O2CXBATN.js} +4 -3
- package/dist/{chunk-PBNV5V5G.js → chunk-OFD2XWIQ.js} +13 -2
- package/dist/{chunk-KAKBRDU4.js → chunk-OGGPNDGO.js} +2 -2
- package/dist/{chunk-3LQEZ4EI.js → chunk-OZUYK6IS.js} +1 -1
- package/dist/{chunk-N2NDDTYW.js → chunk-QGYAHDOR.js} +2 -2
- package/dist/{chunk-ON2HYNGB.js → chunk-QXAXCRK5.js} +6 -6
- package/dist/{chunk-2ZLYSXZC.js → chunk-R64V3KQN.js} +10 -9
- package/dist/{chunk-T65MIV36.js → chunk-SQN7N27A.js} +3 -3
- package/dist/{chunk-KIJO75L4.js → chunk-TQMJKZS5.js} +18 -4
- package/dist/{chunk-P4QE7SSN.js → chunk-ULAB77ZO.js} +1 -1
- package/dist/{chunk-YU2QRNWN.js → chunk-UZOZ2W2E.js} +3 -2
- package/dist/{chunk-3NSVHCOH.js → chunk-VG3ZMY2H.js} +2 -2
- package/dist/{chunk-GNFWKGSQ.js → chunk-WJVDUUH2.js} +2 -2
- package/dist/{chunk-S6OLD4SL.js → chunk-WMXOKTGO.js} +7 -7
- package/dist/{chunk-T5BG7PYZ.js → chunk-Z6P5OVCF.js} +1 -1
- package/dist/{chunk-SB5DX6AD.js → chunk-Z6VBXCYN.js} +2 -2
- package/dist/{chunk-P47XYVEQ.js → chunk-ZJO4SLHC.js} +1 -1
- package/dist/{chunk-AAUK5GDI.js → chunk-ZVOCFUPA.js} +9 -9
- package/dist/{clean-WB62QULT.js → clean-PGEA3UPT.js} +11 -11
- package/dist/cli.js +53 -53
- package/dist/{cloud-E5WB4DWZ.js → cloud-SAODZ2PK.js} +4 -4
- package/dist/{cloudrun-BIQXBUDO.js → cloudrun-RMBT2JQK.js} +3 -3
- package/dist/commands/layout-audit.browser.js +347 -20
- package/dist/{compare-GHFVHZ5A.js → compare-R7X7LXCX.js} +22 -22
- package/dist/{compiler-57M6W5WY.js → compiler-RKH75FZH.js} +2 -2
- package/dist/{component-ZGCC3MHX.js → component-DTVCMTLX.js} +3 -3
- package/dist/{compositions-THPEDDIX.js → compositions-UXS2ISGS.js} +9 -9
- package/dist/{delete-6FWT7DZX.js → delete-LIGHRH4L.js} +2 -2
- package/dist/{dist-4JFB3WAR.js → dist-P5OHBFEV.js} +2 -2
- package/dist/{doctor-RDGDOUC4.js → doctor-6VR5JUWZ.js} +7 -7
- package/dist/{events-VHXICDA2.js → events-YP2MRCPP.js} +2 -2
- package/dist/{events-CU6FDXHC.js → events-ZQFIOH5Z.js} +3 -3
- package/dist/{feedback-PUPN6EKP.js → feedback-47UEIUOO.js} +7 -7
- package/dist/{figma-ZKWBF7QH.js → figma-ZTHHEDY5.js} +3 -3
- package/dist/fontLocalizeCli.js +7 -7
- package/dist/{get-JHIBQRPM.js → get-EZGQNT7G.js} +2 -2
- package/dist/{gpuPolicy-VGE3I5J4.js → gpuPolicy-SYV7N237.js} +5 -5
- package/dist/{grade-compare-GPLUXDPW.js → grade-compare-SEFOAA4E.js} +22 -22
- package/dist/{help-GO6RGM37.js → help-WIZONGVE.js} +1 -1
- package/dist/{history-RUTC4SH5.js → history-PE45CSGA.js} +6 -6
- package/dist/hyperframe-runtime.js +23 -23
- package/dist/hyperframe.manifest.json +1 -1
- package/dist/hyperframe.runtime.iife.js +23 -23
- package/dist/hyperframes-player.global.js +1 -1
- package/dist/{info-773VXW37.js → info-WIRSMQKB.js} +7 -7
- package/dist/{init-YXSIRYZI.js → init-N26RW4YN.js} +20 -20
- package/dist/{inspect-L4RRJEAA.js → inspect-XHQUASDV.js} +23 -23
- package/dist/{installer-T3STEB4U.js → installer-QWK7EA5M.js} +4 -4
- package/dist/{keyframes-P5IOQ6AM.js → keyframes-RNTYYHMK.js} +6 -6
- package/dist/{lambda-RAJA6ZNA.js → lambda-LQHGF3LK.js} +4 -4
- package/dist/{layout-OH2VTN5E.js → layout-YRCKPNAO.js} +23 -23
- package/dist/{lint-YEEPVE6Q.js → lint-HLOZHJVM.js} +6 -6
- package/dist/{list-QURRZTVN.js → list-X7NTQB32.js} +2 -2
- package/dist/{login-DFT4L5YY.js → login-S7PVNUEB.js} +4 -4
- package/dist/{media-treatment-ERQ2PBIN.js → media-treatment-465Y6CWE.js} +8 -8
- package/dist/{models-OA4MXEYG.js → models-J2FZXHMD.js} +8 -8
- package/dist/{motionShot-C2YDYRNB.js → motionShot-K6OBEZ2N.js} +11 -11
- package/dist/{normalize-audio-R23VODOA.js → normalize-audio-VODIXLAC.js} +4 -4
- package/dist/{open-GEOB4L3S.js → open-K5OZGYJ7.js} +4 -4
- package/dist/{parakeetRunner-DBLHMD5T.js → parakeetRunner-NDIU5PKO.js} +8 -8
- package/dist/{pipeline-FSY65OQ4.js → pipeline-UKGI44NN.js} +5 -5
- package/dist/{play-BYUS37GA.js → play-QOXKOZ6L.js} +16 -16
- package/dist/{present-BZLRNHDY.js → present-7CVCJIS3.js} +12 -12
- package/dist/{preview-TXML6PQ7.js → preview-HX5F6RGT.js} +15 -15
- package/dist/{producer-C5V2A3YL.js → producer-66MQWVVQ.js} +1 -1
- package/dist/{projectConfig-X2IEHCSK.js → projectConfig-EVBNJKPS.js} +6 -6
- package/dist/{publication-JEANCWBW.js → publication-F6BOBZMI.js} +2 -2
- package/dist/{publish-VX5OH4ST.js → publish-6KTQDKL6.js} +8 -8
- package/dist/{remove-background-IXCISD26.js → remove-background-TJTKY3YM.js} +6 -6
- package/dist/{render-57SXH6NS.js → render-TRU75TVB.js} +42 -29
- package/dist/{render-ISUT7Q3X.js → render-X4MWSR5L.js} +3 -3
- package/dist/{render-JTY7XQFQ.js → render-XS22VQHC.js} +9 -9
- package/dist/{render-batch-2C6RUP3F.js → render-batch-VKFOIMV5.js} +3 -3
- package/dist/{resolver-KTNKZVIB.js → resolver-VGAM26OR.js} +4 -4
- package/dist/{sherpa-GFRG3TMM.js → sherpa-3OI5VMCY.js} +9 -7
- package/dist/skills/hyperframes-cli/references/lint-validate-inspect.md +1 -1
- package/dist/{skills-2LBVMKVY.js → skills-RKDR4AXV.js} +5 -5
- package/dist/{skillsUpdateCheck-5DRXL565.js → skillsUpdateCheck-QWIERB7M.js} +3 -3
- package/dist/{snapshot-V2L77FCF.js → snapshot-SSSF334Y.js} +25 -25
- package/dist/{src-GPUDUKY6.js → src-LZXECBBQ.js} +4 -4
- package/dist/{src-IMCQRH4P.js → src-RQPKPFRO.js} +6 -6
- package/dist/{staticProjectServer-4CQ3KDQK.js → staticProjectServer-DMG2CER4.js} +12 -12
- package/dist/studio/assets/{hyperframes-player-CAclPB6q.js → hyperframes-player-oCk9rjq9.js} +1 -1
- package/dist/studio/assets/{index-DCwGKghK.js → index-BOQPXBQ0.js} +1 -1
- package/dist/studio/assets/{index-B82aOvgB.js → index-DK2wgdLx.js} +4 -4
- package/dist/studio/index.html +1 -1
- package/dist/{studio-api-RYCDLEOR.js → studio-api-KRPBPUYQ.js} +6 -6
- package/dist/{studioServer-B7H7EQ4U.js → studioServer-KWNULEM4.js} +54 -41
- package/dist/{telemetry-WVHWY3DU.js → telemetry-4G6CD3X7.js} +3 -3
- package/dist/{timeline-EDXJ5L45.js → timeline-TKPBJ4EP.js} +13 -13
- package/dist/{tokens-UNJONAXT.js → tokens-TX7THSB7.js} +2 -2
- package/dist/{transcribe-VX7ZE2IZ.js → transcribe-7DBONX4C.js} +12 -12
- package/dist/{transcribe-FL6NGWHF.js → transcribe-HOLKYWY5.js} +6 -6
- package/dist/{updateCheck-NLH5E44Q.js → updateCheck-64D7B73Z.js} +2 -2
- package/dist/{upgrade-RGQJA2B4.js → upgrade-MXQDGGYO.js} +2 -2
- package/dist/{urlDownloader-KDJGLR2Y.js → urlDownloader-Z435W35E.js} +4 -4
- package/dist/{validate-4AN4PDV7.js → validate-5ZNGP5QO.js} +17 -17
- package/dist/{video-AHO4CDCK.js → video-62JJK3XL.js} +5 -5
- package/package.json +1 -1
|
@@ -1026,14 +1026,46 @@
|
|
|
1026
1026
|
return { x: objectPositionOffset(x, freeX), y: objectPositionOffset(y, freeY) };
|
|
1027
1027
|
}
|
|
1028
1028
|
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
//
|
|
1032
|
-
function
|
|
1033
|
-
|
|
1034
|
-
const
|
|
1029
|
+
const IDENTITY_FLIP = { flipX: false, flipY: false };
|
|
1030
|
+
|
|
1031
|
+
// 2D CSS matrix components [a, b, c, d], or null when the transform is 3D or unparsed.
|
|
1032
|
+
function transformMatrix(value) {
|
|
1033
|
+
if (!value || value === "none") return [1, 0, 0, 1];
|
|
1034
|
+
const match = /^matrix\(([^)]*)\)$/.exec(value.trim());
|
|
1035
|
+
if (!match) return null;
|
|
1036
|
+
const parts = match[1].split(",").map(Number);
|
|
1037
|
+
return parts.length === 6 && parts.every(Number.isFinite) ? parts.slice(0, 4) : null;
|
|
1038
|
+
}
|
|
1039
|
+
|
|
1040
|
+
// Which axes the element's paint is mirrored on, or null when a rotation, skew or 3D transform
|
|
1041
|
+
// (on it or an ancestor) means its bounding box no longer maps axis-aligned onto its pixels.
|
|
1042
|
+
function paintFlips(element) {
|
|
1043
|
+
let flipX = false;
|
|
1044
|
+
let flipY = false;
|
|
1045
|
+
for (let current = element; current; current = current.parentElement) {
|
|
1046
|
+
const style = getComputedStyle(current);
|
|
1047
|
+
const matrix = transformMatrix(style.transform);
|
|
1048
|
+
if (!matrix) return null;
|
|
1049
|
+
const [a, b, c, d] = matrix;
|
|
1050
|
+
if (Math.abs(b) > 1e-6 || Math.abs(c) > 1e-6) return null;
|
|
1051
|
+
if (style.rotate && style.rotate !== "none" && parseFloat(style.rotate) !== 0) return null;
|
|
1052
|
+
const scale = String(style.scale || "none")
|
|
1053
|
+
.trim()
|
|
1054
|
+
.split(/\s+/)
|
|
1055
|
+
.map(Number);
|
|
1056
|
+
const scaleX = Number.isFinite(scale[0]) ? scale[0] : 1;
|
|
1057
|
+
const scaleY = Number.isFinite(scale[1]) ? scale[1] : scaleX;
|
|
1058
|
+
if (a * scaleX < 0) flipX = !flipX;
|
|
1059
|
+
if (d * scaleY < 0) flipY = !flipY;
|
|
1060
|
+
}
|
|
1061
|
+
return flipX || flipY ? { flipX, flipY } : IDENTITY_FLIP;
|
|
1062
|
+
}
|
|
1063
|
+
|
|
1064
|
+
function paintedSourceMapping(element, sourceWidth, sourceHeight) {
|
|
1035
1065
|
const rect = element.getBoundingClientRect();
|
|
1036
1066
|
if (!sourceWidth || !sourceHeight || !rect.width || !rect.height) return null;
|
|
1067
|
+
const flips = paintFlips(element);
|
|
1068
|
+
if (!flips) return null;
|
|
1037
1069
|
|
|
1038
1070
|
const style = getComputedStyle(element);
|
|
1039
1071
|
const fit = style.objectFit || "fill";
|
|
@@ -1061,9 +1093,48 @@
|
|
|
1061
1093
|
rect.width - paintedWidth,
|
|
1062
1094
|
rect.height - paintedHeight,
|
|
1063
1095
|
);
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1096
|
+
return {
|
|
1097
|
+
rect: { left: rect.left, top: rect.top, right: rect.right, bottom: rect.bottom },
|
|
1098
|
+
offsets,
|
|
1099
|
+
...flips,
|
|
1100
|
+
paintedWidth,
|
|
1101
|
+
paintedHeight,
|
|
1102
|
+
scaleX,
|
|
1103
|
+
scaleY,
|
|
1104
|
+
sourceWidth,
|
|
1105
|
+
sourceHeight,
|
|
1106
|
+
};
|
|
1107
|
+
}
|
|
1108
|
+
|
|
1109
|
+
// The source pixel painted at a viewport point, or null outside the painted content box.
|
|
1110
|
+
function sourcePixelAt(mapping, x, y) {
|
|
1111
|
+
const { rect, offsets } = mapping;
|
|
1112
|
+
const localX = (mapping.flipX ? rect.right - x : x - rect.left) - offsets.x;
|
|
1113
|
+
const localY = (mapping.flipY ? rect.bottom - y : y - rect.top) - offsets.y;
|
|
1114
|
+
if (
|
|
1115
|
+
localX < 0 ||
|
|
1116
|
+
localY < 0 ||
|
|
1117
|
+
localX >= mapping.paintedWidth ||
|
|
1118
|
+
localY >= mapping.paintedHeight
|
|
1119
|
+
) {
|
|
1120
|
+
return null;
|
|
1121
|
+
}
|
|
1122
|
+
return {
|
|
1123
|
+
x: Math.min(mapping.sourceWidth - 1, Math.max(0, Math.floor(localX / mapping.scaleX))),
|
|
1124
|
+
y: Math.min(mapping.sourceHeight - 1, Math.max(0, Math.floor(localY / mapping.scaleY))),
|
|
1125
|
+
};
|
|
1126
|
+
}
|
|
1127
|
+
|
|
1128
|
+
// Return the alpha painted by an <img> at a viewport point. `null` means the
|
|
1129
|
+
// browser would not let us inspect the image (not loaded or cross-origin), in
|
|
1130
|
+
// which case callers preserve the conservative opaque fallback.
|
|
1131
|
+
function imageAlphaAt(element, x, y) {
|
|
1132
|
+
const sourceWidth = element.naturalWidth;
|
|
1133
|
+
const sourceHeight = element.naturalHeight;
|
|
1134
|
+
const mapping = paintedSourceMapping(element, sourceWidth, sourceHeight);
|
|
1135
|
+
if (!mapping) return null;
|
|
1136
|
+
const pixel = sourcePixelAt(mapping, x, y);
|
|
1137
|
+
if (!pixel) return 0;
|
|
1067
1138
|
|
|
1068
1139
|
try {
|
|
1069
1140
|
let cached = imageAlphaCanvases.get(element);
|
|
@@ -1083,25 +1154,129 @@
|
|
|
1083
1154
|
cached = { context, width: sourceWidth, height: sourceHeight, source };
|
|
1084
1155
|
imageAlphaCanvases.set(element, cached);
|
|
1085
1156
|
}
|
|
1086
|
-
|
|
1087
|
-
const sourceY = Math.min(sourceHeight - 1, Math.max(0, Math.floor(localY / scaleY)));
|
|
1088
|
-
return cached.context.getImageData(sourceX, sourceY, 1, 1).data[3] / 255;
|
|
1157
|
+
return cached.context.getImageData(pixel.x, pixel.y, 1, 1).data[3] / 255;
|
|
1089
1158
|
} catch {
|
|
1090
1159
|
return null;
|
|
1091
1160
|
}
|
|
1092
1161
|
}
|
|
1093
1162
|
|
|
1163
|
+
const OCCLUDING_ALPHA = 0.6;
|
|
1164
|
+
const VIDEO_ALPHA_MAX_SIDE = 480;
|
|
1165
|
+
let videoAlphaFrames = new Map();
|
|
1166
|
+
let videoAlphaScratch = null;
|
|
1167
|
+
|
|
1168
|
+
function videoAlphaContext(width, height) {
|
|
1169
|
+
if (!videoAlphaScratch) {
|
|
1170
|
+
const canvas = document.createElement("canvas");
|
|
1171
|
+
const context = canvas.getContext("2d", { willReadFrequently: true });
|
|
1172
|
+
if (!context) return null;
|
|
1173
|
+
videoAlphaScratch = { canvas, context };
|
|
1174
|
+
}
|
|
1175
|
+
videoAlphaScratch.canvas.width = width;
|
|
1176
|
+
videoAlphaScratch.canvas.height = height;
|
|
1177
|
+
return videoAlphaScratch.context;
|
|
1178
|
+
}
|
|
1179
|
+
|
|
1180
|
+
// Read once per audit call, so per sample time, and only for a video some text probe lands under.
|
|
1181
|
+
function videoAlphaFrame(video) {
|
|
1182
|
+
let frame = videoAlphaFrames.get(video);
|
|
1183
|
+
if (!frame) {
|
|
1184
|
+
frame = readVideoAlphaFrame(video);
|
|
1185
|
+
videoAlphaFrames.set(video, frame);
|
|
1186
|
+
}
|
|
1187
|
+
return frame;
|
|
1188
|
+
}
|
|
1189
|
+
|
|
1190
|
+
function unreadVideoFrame(reason) {
|
|
1191
|
+
return { kind: "unread", reason };
|
|
1192
|
+
}
|
|
1193
|
+
|
|
1194
|
+
// "opaque" keeps a video's whole box occluding; "matte" judges each point by the decoded
|
|
1195
|
+
// frame's alpha; "unread" falls back to opaque and is reported, never guessed.
|
|
1196
|
+
function readVideoAlphaFrame(video) {
|
|
1197
|
+
if (video.seeking) return unreadVideoFrame("the seek had not landed");
|
|
1198
|
+
if (video.readyState < 2) return unreadVideoFrame("no frame was decoded at this time");
|
|
1199
|
+
if (!video.videoWidth || !video.videoHeight)
|
|
1200
|
+
return unreadVideoFrame("the video has no frame size");
|
|
1201
|
+
const mapping = paintedSourceMapping(video, video.videoWidth, video.videoHeight);
|
|
1202
|
+
if (!mapping) return unreadVideoFrame("it is rotated, skewed or transformed in 3D");
|
|
1203
|
+
const downscale = Math.min(
|
|
1204
|
+
1,
|
|
1205
|
+
VIDEO_ALPHA_MAX_SIDE / Math.max(mapping.sourceWidth, mapping.sourceHeight),
|
|
1206
|
+
);
|
|
1207
|
+
const width = Math.max(1, Math.round(mapping.sourceWidth * downscale));
|
|
1208
|
+
const height = Math.max(1, Math.round(mapping.sourceHeight * downscale));
|
|
1209
|
+
let rgba;
|
|
1210
|
+
try {
|
|
1211
|
+
const context = videoAlphaContext(width, height);
|
|
1212
|
+
if (!context) return unreadVideoFrame("no 2D canvas was available");
|
|
1213
|
+
context.clearRect(0, 0, width, height);
|
|
1214
|
+
context.drawImage(video, 0, 0, width, height);
|
|
1215
|
+
rgba = context.getImageData(0, 0, width, height).data;
|
|
1216
|
+
} catch (error) {
|
|
1217
|
+
return unreadVideoFrame(
|
|
1218
|
+
error && error.name === "SecurityError"
|
|
1219
|
+
? "its source is cross-origin"
|
|
1220
|
+
: "its frame could not be drawn",
|
|
1221
|
+
);
|
|
1222
|
+
}
|
|
1223
|
+
return classifyVideoAlpha(rgba, width, height, mapping, opacityChain(video));
|
|
1224
|
+
}
|
|
1225
|
+
|
|
1226
|
+
function classifyVideoAlpha(rgba, width, height, mapping, opacity) {
|
|
1227
|
+
const alpha = new Uint8Array(width * height);
|
|
1228
|
+
let clear = 0;
|
|
1229
|
+
let painted = 0;
|
|
1230
|
+
for (let index = 0; index < alpha.length; index++) {
|
|
1231
|
+
alpha[index] = rgba[index * 4 + 3];
|
|
1232
|
+
if (alpha[index] < OCCLUDING_ALPHA * 255) clear += 1;
|
|
1233
|
+
if (alpha[index] > 0) painted += 1;
|
|
1234
|
+
}
|
|
1235
|
+
if (clear === 0) return { kind: "opaque" };
|
|
1236
|
+
if (painted === 0) return unreadVideoFrame("its frame read back fully transparent");
|
|
1237
|
+
return {
|
|
1238
|
+
kind: "matte",
|
|
1239
|
+
alpha,
|
|
1240
|
+
width,
|
|
1241
|
+
height,
|
|
1242
|
+
opacity,
|
|
1243
|
+
mapping: {
|
|
1244
|
+
...mapping,
|
|
1245
|
+
sourceWidth: width,
|
|
1246
|
+
sourceHeight: height,
|
|
1247
|
+
scaleX: mapping.paintedWidth / width,
|
|
1248
|
+
scaleY: mapping.paintedHeight / height,
|
|
1249
|
+
},
|
|
1250
|
+
};
|
|
1251
|
+
}
|
|
1252
|
+
|
|
1253
|
+
function matteOccludesAt(frame, x, y) {
|
|
1254
|
+
const pixel = sourcePixelAt(frame.mapping, x, y);
|
|
1255
|
+
if (!pixel) return false;
|
|
1256
|
+
return (frame.alpha[pixel.y * frame.width + pixel.x] / 255) * frame.opacity >= OCCLUDING_ALPHA;
|
|
1257
|
+
}
|
|
1258
|
+
|
|
1259
|
+
// A video with an opaque CSS background paints that background behind its clear pixels.
|
|
1260
|
+
function matteFrameFor(element) {
|
|
1261
|
+
if (element.tagName !== "VIDEO") return null;
|
|
1262
|
+
if (hasOpaqueBackground(getComputedStyle(element))) return null;
|
|
1263
|
+
const frame = videoAlphaFrame(element);
|
|
1264
|
+
return frame.kind === "matte" ? frame : null;
|
|
1265
|
+
}
|
|
1266
|
+
|
|
1094
1267
|
// An element hides text beneath it when it paints opaque pixels at near-full
|
|
1095
1268
|
// opacity: raster content (img/video/canvas), a background image, or a solid
|
|
1096
1269
|
// background colour. Low-opacity overlays (grain, scrims) do not occlude.
|
|
1097
1270
|
function isOpaqueOccluder(element, x, y) {
|
|
1098
1271
|
const opacity = opacityChain(element);
|
|
1099
|
-
if (opacity <
|
|
1272
|
+
if (opacity < OCCLUDING_ALPHA) return false;
|
|
1100
1273
|
if (IGNORE_TAGS.has(element.tagName)) return false;
|
|
1101
1274
|
if (element.tagName === "IMG") {
|
|
1102
1275
|
const alpha = imageAlphaAt(element, x, y);
|
|
1103
|
-
if (alpha !== null) return alpha * opacity >=
|
|
1276
|
+
if (alpha !== null) return alpha * opacity >= OCCLUDING_ALPHA;
|
|
1104
1277
|
}
|
|
1278
|
+
const matte = matteFrameFor(element);
|
|
1279
|
+
if (matte) return matteOccludesAt(matte, x, y);
|
|
1105
1280
|
if (RASTER_TAGS.has(element.tagName)) return true;
|
|
1106
1281
|
return hasOpaqueBackground(getComputedStyle(element));
|
|
1107
1282
|
}
|
|
@@ -1150,7 +1325,7 @@
|
|
|
1150
1325
|
// there is related to the text, non-opaque, sharing a 3D context with it, or
|
|
1151
1326
|
// part of a transient crossfade overlap.
|
|
1152
1327
|
// fallow-ignore-next-line complexity
|
|
1153
|
-
function occluderAt(element, x, y) {
|
|
1328
|
+
function occluderAt(element, x, y, seenMattes) {
|
|
1154
1329
|
// Walk the paint-ordered stack: a transparent layer on top must not mask an opaque one below it.
|
|
1155
1330
|
const stack =
|
|
1156
1331
|
typeof document.elementsFromPoint === "function"
|
|
@@ -1163,6 +1338,8 @@
|
|
|
1163
1338
|
// Pair-specific exemptions excuse this hit only; keep walking for deeper occluders.
|
|
1164
1339
|
if (sharedPreserve3d(element, hit)) continue;
|
|
1165
1340
|
if (isCrossSceneTransitionOverlap(element, hit)) continue;
|
|
1341
|
+
const matte = seenMattes && matteFrameFor(hit);
|
|
1342
|
+
if (matte && !seenMattes.has(matte)) seenMattes.set(matte, hit);
|
|
1166
1343
|
if (isOpaqueOccluder(hit, x, y)) return hit;
|
|
1167
1344
|
}
|
|
1168
1345
|
return null;
|
|
@@ -1196,21 +1373,162 @@
|
|
|
1196
1373
|
function occlusionCoverage(element, textRects) {
|
|
1197
1374
|
let occluder = null;
|
|
1198
1375
|
let hits = 0;
|
|
1376
|
+
let opaqueHits = 0;
|
|
1377
|
+
// Every matte above the text, including where its alpha is clear: a feature narrower than the
|
|
1378
|
+
// probe grid (an arm, a mic stand) can hide a word between two probe columns.
|
|
1379
|
+
const seenMattes = new Map();
|
|
1199
1380
|
for (const textRect of textRects) {
|
|
1200
1381
|
for (const yFraction of OCCLUSION_PROBE_Y_FRACTIONS) {
|
|
1201
1382
|
const y = textRect.top + textRect.height * yFraction;
|
|
1202
1383
|
for (const xFraction of OCCLUSION_PROBE_X_FRACTIONS) {
|
|
1203
|
-
const
|
|
1384
|
+
const x = textRect.left + textRect.width * xFraction;
|
|
1385
|
+
const hit = occluderAt(element, x, y, seenMattes);
|
|
1204
1386
|
if (!hit) continue;
|
|
1205
1387
|
hits += 1;
|
|
1206
1388
|
if (!occluder) occluder = hit;
|
|
1389
|
+
if (!matteFrameFor(hit)) opaqueHits += 1;
|
|
1207
1390
|
}
|
|
1208
1391
|
}
|
|
1209
1392
|
}
|
|
1393
|
+
const judgeByMatte = opaqueHits === 0 && seenMattes.size > 0;
|
|
1210
1394
|
return {
|
|
1211
|
-
occluder,
|
|
1395
|
+
occluder: occluder || (judgeByMatte ? seenMattes.values().next().value : null),
|
|
1212
1396
|
coveredFraction: round(hits / (OCCLUSION_GRID_POINTS * textRects.length)),
|
|
1397
|
+
mattes: judgeByMatte ? [...seenMattes.keys()] : [],
|
|
1398
|
+
};
|
|
1399
|
+
}
|
|
1400
|
+
|
|
1401
|
+
// Thresholds from measuring rendered words against real subject mattes: a word reads as
|
|
1402
|
+
// deliberately tucked behind the subject at 30-55% covered, and is lost at 80%, or when it
|
|
1403
|
+
// and its neighbour are both half covered.
|
|
1404
|
+
const MATTE_WORD_LOST_COVERAGE = 0.8;
|
|
1405
|
+
const MATTE_PAIR_LOST_COVERAGE = 0.5;
|
|
1406
|
+
const MATTE_MAX_SAMPLES_PER_AXIS = 48;
|
|
1407
|
+
|
|
1408
|
+
function wordClientRects(element) {
|
|
1409
|
+
const words = [];
|
|
1410
|
+
for (const node of directTextNodes(element)) {
|
|
1411
|
+
for (const match of (node.textContent || "").matchAll(/\S+/g)) {
|
|
1412
|
+
const range = document.createRange();
|
|
1413
|
+
range.setStart(node, match.index);
|
|
1414
|
+
range.setEnd(node, match.index + match[0].length);
|
|
1415
|
+
const rects = Array.from(range.getClientRects()).filter(
|
|
1416
|
+
(rect) => rect.width > 0.5 && rect.height > 0.5,
|
|
1417
|
+
);
|
|
1418
|
+
range.detach();
|
|
1419
|
+
if (rects.length > 0) words.push({ word: match[0], rects });
|
|
1420
|
+
}
|
|
1421
|
+
}
|
|
1422
|
+
return words;
|
|
1423
|
+
}
|
|
1424
|
+
|
|
1425
|
+
function matteSampleCount(length, mattes) {
|
|
1426
|
+
const pitch = Math.max(1, Math.min(...mattes.map((matte) => matte.mapping.scaleX)));
|
|
1427
|
+
return Math.max(1, Math.min(MATTE_MAX_SAMPLES_PER_AXIS, Math.ceil(length / pitch)));
|
|
1428
|
+
}
|
|
1429
|
+
|
|
1430
|
+
// Area-weighted share of the rects under any matte's occluding alpha, sampled at the matte's resolution.
|
|
1431
|
+
function matteCoverage(rects, mattes) {
|
|
1432
|
+
let coveredArea = 0;
|
|
1433
|
+
let totalArea = 0;
|
|
1434
|
+
for (const rect of rects) {
|
|
1435
|
+
const cols = matteSampleCount(rect.width, mattes);
|
|
1436
|
+
const rows = matteSampleCount(rect.height, mattes);
|
|
1437
|
+
let covered = 0;
|
|
1438
|
+
for (let row = 0; row < rows; row++) {
|
|
1439
|
+
const y = rect.top + ((row + 0.5) * rect.height) / rows;
|
|
1440
|
+
for (let col = 0; col < cols; col++) {
|
|
1441
|
+
const x = rect.left + ((col + 0.5) * rect.width) / cols;
|
|
1442
|
+
if (mattes.some((matte) => matteOccludesAt(matte, x, y))) covered += 1;
|
|
1443
|
+
}
|
|
1444
|
+
}
|
|
1445
|
+
const area = rect.width * rect.height;
|
|
1446
|
+
coveredArea += (area * covered) / (rows * cols);
|
|
1447
|
+
totalArea += area;
|
|
1448
|
+
}
|
|
1449
|
+
return totalArea > 0 ? round(coveredArea / totalArea) : 0;
|
|
1450
|
+
}
|
|
1451
|
+
|
|
1452
|
+
function lostNeighbourPair(words) {
|
|
1453
|
+
for (let index = 1; index < words.length; index++) {
|
|
1454
|
+
const pair = [words[index - 1], words[index]];
|
|
1455
|
+
if (pair.every((word) => word.coverage >= MATTE_PAIR_LOST_COVERAGE)) return pair;
|
|
1456
|
+
}
|
|
1457
|
+
return null;
|
|
1458
|
+
}
|
|
1459
|
+
|
|
1460
|
+
function percent(fraction) {
|
|
1461
|
+
return `${Math.round(fraction * 100)}%`;
|
|
1462
|
+
}
|
|
1463
|
+
|
|
1464
|
+
function lostWordsMessage(lostWord, pair) {
|
|
1465
|
+
if (lostWord) {
|
|
1466
|
+
return `"${lostWord.word}" is ${percent(lostWord.coverage)} behind a transparent video's matte.`;
|
|
1467
|
+
}
|
|
1468
|
+
return `Neighbouring words "${pair[0].word}" and "${pair[1].word}" are ${percent(pair[0].coverage)} and ${percent(pair[1].coverage)} behind a transparent video's matte.`;
|
|
1469
|
+
}
|
|
1470
|
+
|
|
1471
|
+
function markMatteWordsLost(issue, lostWord, pair) {
|
|
1472
|
+
issue.severity = "error";
|
|
1473
|
+
issue.message = lostWordsMessage(lostWord, pair);
|
|
1474
|
+
issue.fixHint =
|
|
1475
|
+
"Move or resize the text so no word is 80% behind the matte and no two neighbouring words are each half behind it, or mark intentional layering with data-layout-allow-occlusion.";
|
|
1476
|
+
}
|
|
1477
|
+
|
|
1478
|
+
// Text behind a cutout is judged per rendered word against the decoded alpha: partial cover is
|
|
1479
|
+
// reported as info with its share, a lost word is an error.
|
|
1480
|
+
function matteOcclusionIssue(element, time, textRect, text, occluder, mattes) {
|
|
1481
|
+
const words = wordClientRects(element).map(({ word, rects }) => ({
|
|
1482
|
+
word,
|
|
1483
|
+
coverage: matteCoverage(rects, mattes),
|
|
1484
|
+
}));
|
|
1485
|
+
if (words.length === 0) return null;
|
|
1486
|
+
const peak = words.reduce((top, word) => (word.coverage > top.coverage ? word : top));
|
|
1487
|
+
if (peak.coverage <= 0) return null;
|
|
1488
|
+
const issue = {
|
|
1489
|
+
code: "text_occluded",
|
|
1490
|
+
severity: "info",
|
|
1491
|
+
time,
|
|
1492
|
+
selector: uniqueSelectorFor(element),
|
|
1493
|
+
containerSelector: uniqueSelectorFor(occluder),
|
|
1494
|
+
text,
|
|
1495
|
+
message: `Text sits partly behind a transparent video's matte; its most covered word "${peak.word}" is ${percent(peak.coverage)} hidden.`,
|
|
1496
|
+
rect: textRect,
|
|
1497
|
+
coveredFraction: peak.coverage,
|
|
1213
1498
|
};
|
|
1499
|
+
const lostWord = peak.coverage >= MATTE_WORD_LOST_COVERAGE ? peak : null;
|
|
1500
|
+
const pair = lostNeighbourPair(words);
|
|
1501
|
+
if (lostWord || pair) markMatteWordsLost(issue, lostWord, pair);
|
|
1502
|
+
return { issue, first: words[0], last: words[words.length - 1] };
|
|
1503
|
+
}
|
|
1504
|
+
|
|
1505
|
+
// Captions often render one word per element, so the neighbour rule also spans sibling elements.
|
|
1506
|
+
function markLostSiblingWords(matteResults) {
|
|
1507
|
+
for (const [element, result] of matteResults) {
|
|
1508
|
+
const next = element.nextElementSibling && matteResults.get(element.nextElementSibling);
|
|
1509
|
+
if (!next) continue;
|
|
1510
|
+
const pair = [result.last, next.first];
|
|
1511
|
+
if (!pair.every((word) => word.coverage >= MATTE_PAIR_LOST_COVERAGE)) continue;
|
|
1512
|
+
for (const { issue } of [result, next]) {
|
|
1513
|
+
if (issue.severity !== "error") markMatteWordsLost(issue, null, pair);
|
|
1514
|
+
}
|
|
1515
|
+
}
|
|
1516
|
+
}
|
|
1517
|
+
|
|
1518
|
+
function unreadVideoIssues(time) {
|
|
1519
|
+
const issues = [];
|
|
1520
|
+
for (const [video, frame] of videoAlphaFrames) {
|
|
1521
|
+
if (frame.kind !== "unread") continue;
|
|
1522
|
+
issues.push({
|
|
1523
|
+
code: "video_alpha_unread",
|
|
1524
|
+
severity: "info",
|
|
1525
|
+
time,
|
|
1526
|
+
selector: uniqueSelectorFor(video),
|
|
1527
|
+
message: `Could not read this video's frame alpha (${frame.reason}), so text under it was judged as if the video were opaque.`,
|
|
1528
|
+
rect: toRect(video.getBoundingClientRect()),
|
|
1529
|
+
});
|
|
1530
|
+
}
|
|
1531
|
+
return issues;
|
|
1214
1532
|
}
|
|
1215
1533
|
|
|
1216
1534
|
// pointer-events:none hides elements from elementFromPoint — both probed text AND occluders.
|
|
@@ -1240,18 +1558,23 @@
|
|
|
1240
1558
|
}
|
|
1241
1559
|
|
|
1242
1560
|
// text_occluded: atomic labels flag at any hit; prose needs coveredFraction >= proseCoverageFloor (default 0.15).
|
|
1243
|
-
function occludedTextIssue(element, time, proseCoverageFloor) {
|
|
1561
|
+
function occludedTextIssue(element, time, proseCoverageFloor, matteResults) {
|
|
1244
1562
|
if (hasAllowOcclusionFlag(element)) return null;
|
|
1245
1563
|
if (!hasVisibleTextInk(element)) return null;
|
|
1246
1564
|
const textRect = textRectFor(element, true);
|
|
1247
1565
|
if (!textRect) return null;
|
|
1248
1566
|
const textRects = textClientRects(element, true);
|
|
1249
1567
|
const text = textContentFor(element, true);
|
|
1250
|
-
const { occluder, coveredFraction } = occlusionCoverage(
|
|
1568
|
+
const { occluder, coveredFraction, mattes } = occlusionCoverage(
|
|
1251
1569
|
element,
|
|
1252
1570
|
textRects.length > 0 ? textRects : [textRect],
|
|
1253
1571
|
);
|
|
1254
1572
|
if (!occluder) return null;
|
|
1573
|
+
if (mattes.length > 0) {
|
|
1574
|
+
const result = matteOcclusionIssue(element, time, textRect, text, occluder, mattes);
|
|
1575
|
+
if (result) matteResults.set(element, result);
|
|
1576
|
+
return result ? result.issue : null;
|
|
1577
|
+
}
|
|
1255
1578
|
if (!isAtomicLabel(text) && coveredFraction < proseCoverageFloor) return null;
|
|
1256
1579
|
return {
|
|
1257
1580
|
code: "text_occluded",
|
|
@@ -2015,6 +2338,8 @@
|
|
|
2015
2338
|
isVisibleElement(element, 0.05),
|
|
2016
2339
|
);
|
|
2017
2340
|
const issues = [];
|
|
2341
|
+
const matteResults = new Map();
|
|
2342
|
+
videoAlphaFrames = new Map();
|
|
2018
2343
|
|
|
2019
2344
|
const restoreHits = restoreHitTesting(root);
|
|
2020
2345
|
try {
|
|
@@ -2023,7 +2348,7 @@
|
|
|
2023
2348
|
const clipped = clippedTextIssue(element, time, tolerance);
|
|
2024
2349
|
if (clipped) issues.push(clipped);
|
|
2025
2350
|
issues.push(...textOverflowIssues(element, root, rootRect, time, tolerance, clipped));
|
|
2026
|
-
const occluded = occludedTextIssue(element, time, proseCoverageFloor);
|
|
2351
|
+
const occluded = occludedTextIssue(element, time, proseCoverageFloor, matteResults);
|
|
2027
2352
|
if (occluded) issues.push(occluded);
|
|
2028
2353
|
const invisible = invisibleTextIssue(element, time);
|
|
2029
2354
|
if (invisible) issues.push(invisible);
|
|
@@ -2031,6 +2356,8 @@
|
|
|
2031
2356
|
} finally {
|
|
2032
2357
|
restoreHits();
|
|
2033
2358
|
}
|
|
2359
|
+
markLostSiblingWords(matteResults);
|
|
2360
|
+
issues.push(...unreadVideoIssues(time));
|
|
2034
2361
|
|
|
2035
2362
|
issues.push(...containerOverflowIssues(root, time, tolerance));
|
|
2036
2363
|
issues.push(...contentOverlapIssues(root, time));
|
|
@@ -16,42 +16,42 @@ import "./chunk-MRF4AMKD.js";
|
|
|
16
16
|
import {
|
|
17
17
|
openSettledCompositionPage,
|
|
18
18
|
seekCompositionTimeline
|
|
19
|
-
} from "./chunk-
|
|
20
|
-
import "./chunk-
|
|
19
|
+
} from "./chunk-QXAXCRK5.js";
|
|
20
|
+
import "./chunk-2ALJMIFW.js";
|
|
21
21
|
import "./chunk-FH7WODJH.js";
|
|
22
|
-
import "./chunk-
|
|
22
|
+
import "./chunk-H3JGPRWA.js";
|
|
23
23
|
import "./chunk-WPNE5NEP.js";
|
|
24
24
|
import "./chunk-K2FLNJVB.js";
|
|
25
25
|
import {
|
|
26
26
|
serveStaticProjectHtml
|
|
27
|
-
} from "./chunk-
|
|
27
|
+
} from "./chunk-AXATVUCD.js";
|
|
28
28
|
import "./chunk-X7MTZ4T2.js";
|
|
29
|
-
import "./chunk-
|
|
30
|
-
import "./chunk-
|
|
29
|
+
import "./chunk-JEW5CCRU.js";
|
|
30
|
+
import "./chunk-Z6VBXCYN.js";
|
|
31
31
|
import "./chunk-442JNXRM.js";
|
|
32
32
|
import "./chunk-XUHOIDKG.js";
|
|
33
|
-
import "./chunk-
|
|
34
|
-
import "./chunk-
|
|
33
|
+
import "./chunk-CXVBPW5F.js";
|
|
34
|
+
import "./chunk-D5PUMG2P.js";
|
|
35
35
|
import "./chunk-6JR2XUEE.js";
|
|
36
36
|
import "./chunk-C6TPGUWD.js";
|
|
37
|
-
import "./chunk-
|
|
37
|
+
import "./chunk-5K5YH6M7.js";
|
|
38
38
|
import "./chunk-JGYHWVXQ.js";
|
|
39
39
|
import "./chunk-FFDC5OWV.js";
|
|
40
|
-
import "./chunk-
|
|
40
|
+
import "./chunk-BHGIBGUZ.js";
|
|
41
41
|
import "./chunk-XT7X6QCP.js";
|
|
42
42
|
import "./chunk-4YYJOFKS.js";
|
|
43
43
|
import "./chunk-HVW7ABXD.js";
|
|
44
|
-
import "./chunk-
|
|
45
|
-
import "./chunk-
|
|
46
|
-
import "./chunk-
|
|
44
|
+
import "./chunk-DSXDYQQV.js";
|
|
45
|
+
import "./chunk-QGYAHDOR.js";
|
|
46
|
+
import "./chunk-H45RC6HN.js";
|
|
47
47
|
import "./chunk-AWDFDFI3.js";
|
|
48
48
|
import "./chunk-P6LJ4Y32.js";
|
|
49
49
|
import "./chunk-GMECXFAN.js";
|
|
50
50
|
import "./chunk-5CS4T6C6.js";
|
|
51
51
|
import {
|
|
52
52
|
trackCompareSheet
|
|
53
|
-
} from "./chunk-
|
|
54
|
-
import "./chunk-
|
|
53
|
+
} from "./chunk-HQMWZNO2.js";
|
|
54
|
+
import "./chunk-2XIPB4MP.js";
|
|
55
55
|
import "./chunk-VWG7OQKU.js";
|
|
56
56
|
import "./chunk-QWQ6GQTI.js";
|
|
57
57
|
import {
|
|
@@ -69,21 +69,21 @@ import "./chunk-EOOEC32M.js";
|
|
|
69
69
|
import "./chunk-TJSTGSAW.js";
|
|
70
70
|
import {
|
|
71
71
|
withMeta
|
|
72
|
-
} from "./chunk-
|
|
72
|
+
} from "./chunk-Z6P5OVCF.js";
|
|
73
73
|
import "./chunk-K4WIOZFP.js";
|
|
74
74
|
import "./chunk-XUXGIA7H.js";
|
|
75
75
|
import "./chunk-WERLJGIC.js";
|
|
76
76
|
import "./chunk-ISN5GRYI.js";
|
|
77
|
-
import "./chunk-
|
|
77
|
+
import "./chunk-VG3ZMY2H.js";
|
|
78
78
|
import "./chunk-EOVYQ3IG.js";
|
|
79
79
|
import "./chunk-XT6MXC7A.js";
|
|
80
|
-
import "./chunk-
|
|
81
|
-
import "./chunk-
|
|
80
|
+
import "./chunk-A356JY2J.js";
|
|
81
|
+
import "./chunk-42AER3PM.js";
|
|
82
82
|
import "./chunk-KCF6GHJP.js";
|
|
83
83
|
import "./chunk-JYVGYKXG.js";
|
|
84
84
|
import "./chunk-7KDQAD2W.js";
|
|
85
|
-
import "./chunk-
|
|
86
|
-
import "./chunk-
|
|
85
|
+
import "./chunk-NZ7K76Y2.js";
|
|
86
|
+
import "./chunk-ZJO4SLHC.js";
|
|
87
87
|
import "./chunk-VC76R6W2.js";
|
|
88
88
|
import "./chunk-UJKQWGFF.js";
|
|
89
89
|
import "./chunk-ALLKNYC3.js";
|
|
@@ -287,7 +287,7 @@ function cleanupPreparedCompareVariants(variants) {
|
|
|
287
287
|
}
|
|
288
288
|
async function renderCompareVariant(variant, opts) {
|
|
289
289
|
try {
|
|
290
|
-
const { bundleToSingleHtml } = await import("./compiler-
|
|
290
|
+
const { bundleToSingleHtml } = await import("./compiler-RKH75FZH.js");
|
|
291
291
|
const html = await bundleToSingleHtml(variant.projectDir);
|
|
292
292
|
const server = await serveStaticProjectHtml(variant.projectDir, html);
|
|
293
293
|
try {
|
|
@@ -24,7 +24,7 @@ import {
|
|
|
24
24
|
scopeCssToComposition,
|
|
25
25
|
validateHyperframeHtmlContract,
|
|
26
26
|
wrapScopedCompositionScript
|
|
27
|
-
} from "./chunk-
|
|
27
|
+
} from "./chunk-42AER3PM.js";
|
|
28
28
|
import "./chunk-KCF6GHJP.js";
|
|
29
29
|
import {
|
|
30
30
|
AFTER_FONTS_SCRIPT_TYPE,
|
|
@@ -56,7 +56,7 @@ import {
|
|
|
56
56
|
shouldClampResolvedMediaDuration,
|
|
57
57
|
stripEmbeddedRuntimeScripts,
|
|
58
58
|
styleElementsFor
|
|
59
|
-
} from "./chunk-
|
|
59
|
+
} from "./chunk-ZJO4SLHC.js";
|
|
60
60
|
import "./chunk-VC76R6W2.js";
|
|
61
61
|
import "./chunk-UJKQWGFF.js";
|
|
62
62
|
import "./chunk-ALLKNYC3.js";
|
|
@@ -7,7 +7,7 @@ var __dirname = __hf_dirname(__filename);
|
|
|
7
7
|
import {
|
|
8
8
|
downloadRender,
|
|
9
9
|
runAssetImport
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-OGGPNDGO.js";
|
|
11
11
|
import {
|
|
12
12
|
FigmaClientError,
|
|
13
13
|
createFigmaClient,
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
readBindings,
|
|
17
17
|
resolveBindings,
|
|
18
18
|
withFigmaErrors
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-OZUYK6IS.js";
|
|
20
20
|
import "./chunk-K2FLNJVB.js";
|
|
21
21
|
import {
|
|
22
22
|
defineCommand
|
|
@@ -159,7 +159,7 @@ var component_default = defineCommand({
|
|
|
159
159
|
`${result.unresolved.length} binding(s) reference tokens not yet imported \u2014 colors baked as literals (flagged data-figma-unresolved). Run \`hyperframes figma tokens\` on the source/library file, then re-import to link them.`
|
|
160
160
|
);
|
|
161
161
|
}
|
|
162
|
-
const { trackFigmaImport } = await import("./telemetry-
|
|
162
|
+
const { trackFigmaImport } = await import("./telemetry-4G6CD3X7.js");
|
|
163
163
|
trackFigmaImport({
|
|
164
164
|
phase: "component",
|
|
165
165
|
unresolvedBindings: result.unresolved.length,
|
|
@@ -6,13 +6,13 @@ var __filename = __hf_fileURLToPath(import.meta.url);
|
|
|
6
6
|
var __dirname = __hf_dirname(__filename);
|
|
7
7
|
import {
|
|
8
8
|
resolveProject
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-NU4PDQ6G.js";
|
|
10
10
|
import "./chunk-K2FLNJVB.js";
|
|
11
11
|
import {
|
|
12
12
|
ensureDOMParser
|
|
13
13
|
} from "./chunk-442JNXRM.js";
|
|
14
|
-
import "./chunk-
|
|
15
|
-
import "./chunk-
|
|
14
|
+
import "./chunk-HQMWZNO2.js";
|
|
15
|
+
import "./chunk-2XIPB4MP.js";
|
|
16
16
|
import "./chunk-VWG7OQKU.js";
|
|
17
17
|
import "./chunk-QWQ6GQTI.js";
|
|
18
18
|
import {
|
|
@@ -25,22 +25,22 @@ import {
|
|
|
25
25
|
} from "./chunk-ZTZA4UWZ.js";
|
|
26
26
|
import {
|
|
27
27
|
withMeta
|
|
28
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-Z6P5OVCF.js";
|
|
29
29
|
import "./chunk-K4WIOZFP.js";
|
|
30
30
|
import "./chunk-XUXGIA7H.js";
|
|
31
31
|
import "./chunk-WERLJGIC.js";
|
|
32
32
|
import "./chunk-ISN5GRYI.js";
|
|
33
|
-
import "./chunk-
|
|
33
|
+
import "./chunk-VG3ZMY2H.js";
|
|
34
34
|
import "./chunk-XT6MXC7A.js";
|
|
35
35
|
import {
|
|
36
36
|
resolveReferencedStart
|
|
37
|
-
} from "./chunk-
|
|
38
|
-
import "./chunk-
|
|
37
|
+
} from "./chunk-A356JY2J.js";
|
|
38
|
+
import "./chunk-42AER3PM.js";
|
|
39
39
|
import "./chunk-KCF6GHJP.js";
|
|
40
40
|
import "./chunk-JYVGYKXG.js";
|
|
41
41
|
import "./chunk-7KDQAD2W.js";
|
|
42
|
-
import "./chunk-
|
|
43
|
-
import "./chunk-
|
|
42
|
+
import "./chunk-NZ7K76Y2.js";
|
|
43
|
+
import "./chunk-ZJO4SLHC.js";
|
|
44
44
|
import "./chunk-VC76R6W2.js";
|
|
45
45
|
import "./chunk-UJKQWGFF.js";
|
|
46
46
|
import "./chunk-ALLKNYC3.js";
|
|
@@ -25,12 +25,12 @@ import {
|
|
|
25
25
|
} from "./chunk-ZTZA4UWZ.js";
|
|
26
26
|
import {
|
|
27
27
|
withMeta
|
|
28
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-Z6P5OVCF.js";
|
|
29
29
|
import "./chunk-K4WIOZFP.js";
|
|
30
30
|
import "./chunk-XUXGIA7H.js";
|
|
31
31
|
import "./chunk-WERLJGIC.js";
|
|
32
32
|
import "./chunk-ISN5GRYI.js";
|
|
33
|
-
import "./chunk-
|
|
33
|
+
import "./chunk-VG3ZMY2H.js";
|
|
34
34
|
import "./chunk-BXCMXMJQ.js";
|
|
35
35
|
import "./chunk-EOVYQ3IG.js";
|
|
36
36
|
import "./chunk-OFQWTKPW.js";
|