init commit

This commit is contained in:
Carlos
2026-02-21 10:33:18 +01:00
parent c863a943ed
commit 9d955bf338
9512 changed files with 2015317 additions and 1305 deletions

View File

@@ -0,0 +1,31 @@
export type BorderRadiusCorners = {
topLeft: {
horizontal: number;
vertical: number;
};
topRight: {
horizontal: number;
vertical: number;
};
bottomRight: {
horizontal: number;
vertical: number;
};
bottomLeft: {
horizontal: number;
vertical: number;
};
};
export declare function parseBorderRadius({ borderRadius, width, height }: {
borderRadius: string;
width: number;
height: number;
}): BorderRadiusCorners;
export declare function setBorderRadius({ ctx, rect, borderRadius, forceClipEvenWhenZero, computedStyle, backgroundClip }: {
ctx: OffscreenCanvasRenderingContext2D;
rect: DOMRect;
borderRadius: BorderRadiusCorners;
forceClipEvenWhenZero: boolean;
computedStyle: CSSStyleDeclaration;
backgroundClip: string;
}): () => void;

View File

@@ -0,0 +1,40 @@
export type ObjectFit = 'fill' | 'contain' | 'cover' | 'none' | 'scale-down';
export type ObjectFitResult = {
sourceX: number;
sourceY: number;
sourceWidth: number;
sourceHeight: number;
destX: number;
destY: number;
destWidth: number;
destHeight: number;
};
type ObjectFitParams = {
containerSize: {
width: number;
height: number;
left: number;
top: number;
};
intrinsicSize: {
width: number;
height: number;
};
};
/**
* Calculates how to draw an image based on object-fit CSS property.
*
* @param objectFit - The CSS object-fit value
* @param containerSize - The container dimensions (where the image should be drawn)
* @param intrinsicSize - The natural/intrinsic size of the image
* @returns Source and destination rectangles for drawImage
*/
export declare const calculateObjectFit: ({ objectFit, containerSize, intrinsicSize, }: {
objectFit: ObjectFit;
} & ObjectFitParams) => ObjectFitResult;
/**
* Parse an object-fit CSS value string into our ObjectFit type.
* Returns 'fill' as the default if the value is not recognized.
*/
export declare const parseObjectFit: (value: string | null | undefined) => ObjectFit;
export {};

View File

@@ -0,0 +1,21 @@
import type { LinearGradientInfo } from './parse-linear-gradient';
export declare const calculateTransforms: ({ element, rootElement, }: {
element: HTMLElement | SVGElement;
rootElement: HTMLElement | SVGElement;
}) => {
dimensions: DOMRect;
totalMatrix: DOMMatrix;
[Symbol.dispose]: () => void;
nativeTransformOrigin: {
x: number;
y: number;
};
computedStyle: CSSStyleDeclaration;
opacity: number;
maskImageInfo: LinearGradientInfo | null;
precompositing: {
needs3DTransformViaWebGL: boolean;
needsMaskImage: LinearGradientInfo | null;
needsPrecompositing: boolean;
};
};

View File

@@ -0,0 +1,8 @@
export declare const getNarrowerRect: ({ firstRect, secondRect, }: {
firstRect: DOMRect;
secondRect: DOMRect;
}) => DOMRect;
export declare const getWiderRectAndExpand: ({ firstRect, secondRect, }: {
firstRect: DOMRect | null;
secondRect: DOMRect;
}) => DOMRect;

View File

@@ -0,0 +1 @@
export declare function doRectsIntersect(rect1: DOMRect, rect2: DOMRect): boolean;

View File

@@ -0,0 +1,31 @@
export declare const drawBackground: ({ backgroundImage, context, rect, backgroundColor, backgroundClip, element, logLevel, internalState, computedStyle, offsetLeft: parentOffsetLeft, offsetTop: parentOffsetTop, scale, }: {
backgroundImage: string;
context: OffscreenCanvasRenderingContext2D;
rect: DOMRect;
backgroundColor: string;
backgroundClip: string;
element: HTMLElement | SVGElement;
logLevel: "error" | "info" | "trace" | "verbose" | "warn";
internalState: {
getDrawn3dPixels: () => number;
getPrecomposedTiles: () => number;
addPrecompose: ({ canvasWidth, canvasHeight, }: {
canvasWidth: number;
canvasHeight: number;
}) => void;
helperCanvasState: import("../internal-state").HelperCanvasState;
[Symbol.dispose]: () => void;
getWaitForReadyTime: () => number;
addWaitForReadyTime: (time: number) => void;
getAddSampleTime: () => number;
addAddSampleTime: (time: number) => void;
getCreateFrameTime: () => number;
addCreateFrameTime: (time: number) => void;
getAudioMixingTime: () => number;
addAudioMixingTime: (time: number) => void;
};
computedStyle: CSSStyleDeclaration;
offsetLeft: number;
offsetTop: number;
scale: number;
}) => Promise<void>;

View File

@@ -0,0 +1,7 @@
import type { BorderRadiusCorners } from './border-radius';
export declare const drawBorder: ({ ctx, rect, borderRadius, computedStyle, }: {
ctx: OffscreenCanvasRenderingContext2D;
rect: DOMRect;
borderRadius: BorderRadiusCorners;
computedStyle: CSSStyleDeclaration;
}) => void;

View File

@@ -0,0 +1,17 @@
import type { BorderRadiusCorners } from './border-radius';
interface BoxShadow {
offsetX: number;
offsetY: number;
blurRadius: number;
color: string;
inset: boolean;
}
export declare const parseBoxShadow: (boxShadowValue: string) => BoxShadow[];
export declare const drawBorderRadius: ({ ctx, rect, borderRadius, computedStyle, logLevel, }: {
ctx: OffscreenCanvasRenderingContext2D;
rect: DOMRect;
borderRadius: BorderRadiusCorners;
computedStyle: CSSStyleDeclaration;
logLevel: "error" | "info" | "trace" | "verbose" | "warn";
}) => void;
export {};

View File

@@ -0,0 +1,2 @@
import type { DrawFn } from './drawn-fn';
export declare const drawDomElement: (node: HTMLElement | SVGElement) => DrawFn;

View File

@@ -0,0 +1,33 @@
import type { DrawFn } from './drawn-fn';
export declare const drawElement: ({ rect, computedStyle, context, draw, opacity, totalMatrix, parentRect, logLevel, element, internalState, scale, }: {
rect: DOMRect;
computedStyle: CSSStyleDeclaration;
context: OffscreenCanvasRenderingContext2D;
opacity: number;
totalMatrix: DOMMatrix;
draw: DrawFn;
parentRect: DOMRect;
logLevel: "error" | "info" | "trace" | "verbose" | "warn";
element: HTMLElement | SVGElement;
internalState: {
getDrawn3dPixels: () => number;
getPrecomposedTiles: () => number;
addPrecompose: ({ canvasWidth, canvasHeight, }: {
canvasWidth: number;
canvasHeight: number;
}) => void;
helperCanvasState: import("../internal-state").HelperCanvasState;
[Symbol.dispose]: () => void;
getWaitForReadyTime: () => number;
addWaitForReadyTime: (time: number) => void;
getAddSampleTime: () => number;
addAddSampleTime: (time: number) => void;
getCreateFrameTime: () => number;
addCreateFrameTime: (time: number) => void;
getAudioMixingTime: () => number;
addAudioMixingTime: (time: number) => void;
};
scale: number;
}) => Promise<{
cleanupAfterChildren: () => void;
}>;

View File

@@ -0,0 +1,9 @@
import type { BorderRadiusCorners } from './border-radius';
export declare const parseOutlineWidth: (value: string) => number;
export declare const parseOutlineOffset: (value: string) => number;
export declare const drawOutline: ({ ctx, rect, borderRadius, computedStyle, }: {
ctx: OffscreenCanvasRenderingContext2D;
rect: DOMRect;
borderRadius: BorderRadiusCorners;
computedStyle: CSSStyleDeclaration;
}) => void;

View File

@@ -0,0 +1,9 @@
import type { BorderRadiusCorners } from './border-radius';
export declare const drawRoundedRectPath: ({ ctx, x, y, width, height, borderRadius, }: {
ctx: OffscreenCanvasRenderingContext2D;
x: number;
y: number;
width: number;
height: number;
borderRadius: BorderRadiusCorners;
}) => void;

View File

@@ -0,0 +1,5 @@
export type DrawFn = ({ computedStyle, contextToDraw, dimensions }: {
dimensions: DOMRect;
computedStyle: CSSStyleDeclaration;
contextToDraw: OffscreenCanvasRenderingContext2D;
}) => Promise<void> | void;

View File

@@ -0,0 +1,12 @@
export declare const fitSvgIntoItsContainer: ({ containerSize, elementSize, }: {
containerSize: DOMRect;
elementSize: {
width: number;
height: number;
};
}) => {
width: number;
height: number;
top: number;
left: number;
};

View File

@@ -0,0 +1,8 @@
export declare const getBackgroundFill: ({ backgroundColor, backgroundImage, contextToDraw, boundingRect, offsetLeft, offsetTop, }: {
backgroundImage: string;
backgroundColor: string;
contextToDraw: OffscreenCanvasRenderingContext2D;
boundingRect: DOMRect;
offsetLeft: number;
offsetTop: number;
}) => string | CanvasGradient | null;

View File

@@ -0,0 +1 @@
export declare const getBoxBasedOnBackgroundClip: (rect: DOMRect, computedStyle: CSSStyleDeclaration, backgroundClip: string | undefined) => DOMRect;

View File

@@ -0,0 +1 @@
export declare function getPreTransformRect(targetRect: DOMRect, matrix: DOMMatrix): DOMRect | null;

View File

@@ -0,0 +1,30 @@
export declare const getPrecomposeRectFor3DTransform: ({ element, parentRect, matrix, }: {
element: HTMLElement | SVGElement;
parentRect: DOMRect;
matrix: DOMMatrix;
}) => DOMRect | null;
export declare const handle3dTransform: ({ matrix, sourceRect, tempCanvas, rectAfterTransforms, internalState, scale, }: {
matrix: DOMMatrix;
sourceRect: DOMRect;
tempCanvas: OffscreenCanvas;
rectAfterTransforms: DOMRect;
internalState: {
getDrawn3dPixels: () => number;
getPrecomposedTiles: () => number;
addPrecompose: ({ canvasWidth, canvasHeight, }: {
canvasWidth: number;
canvasHeight: number;
}) => void;
helperCanvasState: import("../internal-state").HelperCanvasState;
[Symbol.dispose]: () => void;
getWaitForReadyTime: () => number;
addWaitForReadyTime: (time: number) => void;
getAddSampleTime: () => number;
addAddSampleTime: (time: number) => void;
getCreateFrameTime: () => number;
addCreateFrameTime: (time: number) => void;
getAudioMixingTime: () => number;
addAudioMixingTime: (time: number) => void;
};
scale: number;
}) => OffscreenCanvas | null;

View File

@@ -0,0 +1,9 @@
import type { LinearGradientInfo } from './parse-linear-gradient';
export declare const getPrecomposeRectForMask: (element: HTMLElement | SVGElement) => DOMRect;
export declare const handleMask: ({ gradientInfo, rect, precomposeRect, tempContext, scale, }: {
gradientInfo: LinearGradientInfo;
rect: DOMRect;
precomposeRect: DOMRect;
tempContext: OffscreenCanvasRenderingContext2D;
scale: number;
}) => void;

View File

@@ -0,0 +1,4 @@
export declare const hasTransformCssValue: (style: CSSStyleDeclaration) => boolean;
export declare const hasRotateCssValue: (style: CSSStyleDeclaration) => boolean;
export declare const hasScaleCssValue: (style: CSSStyleDeclaration) => boolean;
export declare const hasAnyTransformCssValue: (style: CSSStyleDeclaration) => boolean;

View File

@@ -0,0 +1,3 @@
import type { LinearGradientInfo } from './parse-linear-gradient';
export declare const getMaskImageValue: (computedStyle: CSSStyleDeclaration) => string | null;
export declare const parseMaskImage: (maskImageValue: string) => LinearGradientInfo | null;

View File

@@ -0,0 +1,4 @@
export declare const setOpacity: ({ ctx, opacity, }: {
ctx: OffscreenCanvasRenderingContext2D;
opacity: number;
}) => () => void;

View File

@@ -0,0 +1,9 @@
import type { BorderRadiusCorners } from './border-radius';
export declare const setOverflowHidden: ({ ctx, rect, borderRadius, overflowHidden, computedStyle, backgroundClip, }: {
ctx: OffscreenCanvasRenderingContext2D;
rect: DOMRect;
borderRadius: BorderRadiusCorners;
overflowHidden: boolean;
computedStyle: CSSStyleDeclaration;
backgroundClip: string;
}) => () => void;

View File

@@ -0,0 +1,16 @@
export interface ColorStop {
color: string;
position: number;
}
export interface LinearGradientInfo {
angle: number;
colorStops: ColorStop[];
}
export declare const parseLinearGradient: (backgroundImage: string) => LinearGradientInfo | null;
export declare const createCanvasGradient: ({ ctx, rect, gradientInfo, offsetLeft, offsetTop, }: {
ctx: OffscreenCanvasRenderingContext2D;
rect: DOMRect;
gradientInfo: LinearGradientInfo;
offsetLeft: number;
offsetTop: number;
}) => CanvasGradient;

View File

@@ -0,0 +1,4 @@
export declare const parseTransformOrigin: (transformOrigin: string) => {
x: number;
y: number;
} | null;

View File

@@ -0,0 +1,34 @@
import type { DrawFn } from './drawn-fn';
export type ProcessNodeReturnValue = {
type: 'continue';
cleanupAfterChildren: null | (() => void);
} | {
type: 'skip-children';
};
export declare const processNode: ({ element, context, draw, logLevel, parentRect, internalState, rootElement, scale, }: {
element: HTMLElement | SVGElement;
context: OffscreenCanvasRenderingContext2D;
draw: DrawFn;
logLevel: "error" | "info" | "trace" | "verbose" | "warn";
parentRect: DOMRect;
internalState: {
getDrawn3dPixels: () => number;
getPrecomposedTiles: () => number;
addPrecompose: ({ canvasWidth, canvasHeight, }: {
canvasWidth: number;
canvasHeight: number;
}) => void;
helperCanvasState: import("../internal-state").HelperCanvasState;
[Symbol.dispose]: () => void;
getWaitForReadyTime: () => number;
addWaitForReadyTime: (time: number) => void;
getAddSampleTime: () => number;
addAddSampleTime: (time: number) => void;
getCreateFrameTime: () => number;
addCreateFrameTime: (time: number) => void;
getAudioMixingTime: () => number;
addAudioMixingTime: (time: number) => void;
};
rootElement: HTMLElement | SVGElement;
scale: number;
}) => Promise<ProcessNodeReturnValue>;

View File

@@ -0,0 +1 @@
export declare const roundToExpandRect: (rect: DOMRect) => DOMRect;

View File

@@ -0,0 +1,4 @@
export declare const scaleRect: ({ rect, scale, }: {
rect: DOMRect;
scale: number;
}) => DOMRect;

View File

@@ -0,0 +1 @@
export declare const applyTextTransform: (text: string, transform: string) => string;

View File

@@ -0,0 +1,7 @@
import type { DrawFn } from '../drawn-fn';
export declare const drawText: ({ span, logLevel, onlyBackgroundClipText, parentRect, }: {
span: HTMLSpanElement;
logLevel: "error" | "info" | "trace" | "verbose" | "warn";
parentRect: DOMRect;
onlyBackgroundClipText: boolean;
}) => DrawFn;

View File

@@ -0,0 +1,6 @@
type Token = {
text: string;
rect: DOMRect;
};
export declare const findWords: (span: HTMLSpanElement) => Token[];
export {};

View File

@@ -0,0 +1,28 @@
import type { ProcessNodeReturnValue } from '../process-node';
export declare const handleTextNode: ({ node, context, logLevel, parentRect, internalState, rootElement, onlyBackgroundClipText, scale, }: {
node: Text;
context: OffscreenCanvasRenderingContext2D;
logLevel: "error" | "info" | "trace" | "verbose" | "warn";
parentRect: DOMRect;
internalState: {
getDrawn3dPixels: () => number;
getPrecomposedTiles: () => number;
addPrecompose: ({ canvasWidth, canvasHeight, }: {
canvasWidth: number;
canvasHeight: number;
}) => void;
helperCanvasState: import("../../internal-state").HelperCanvasState;
[Symbol.dispose]: () => void;
getWaitForReadyTime: () => number;
addWaitForReadyTime: (time: number) => void;
getAddSampleTime: () => number;
addAddSampleTime: (time: number) => void;
getCreateFrameTime: () => number;
addCreateFrameTime: (time: number) => void;
getAudioMixingTime: () => number;
addAudioMixingTime: (time: number) => void;
};
rootElement: HTMLElement | SVGElement;
onlyBackgroundClipText: boolean;
scale: number;
}) => Promise<ProcessNodeReturnValue>;

View File

@@ -0,0 +1,26 @@
import type { HelperCanvasState } from '../internal-state';
export declare const transformIn3d: ({ matrix, sourceCanvas, sourceRect, destRect, internalState, scale, }: {
sourceRect: DOMRect;
matrix: DOMMatrix;
sourceCanvas: OffscreenCanvas;
destRect: DOMRect;
internalState: {
getDrawn3dPixels: () => number;
getPrecomposedTiles: () => number;
addPrecompose: ({ canvasWidth, canvasHeight, }: {
canvasWidth: number;
canvasHeight: number;
}) => void;
helperCanvasState: HelperCanvasState;
[Symbol.dispose]: () => void;
getWaitForReadyTime: () => number;
addWaitForReadyTime: (time: number) => void;
getAddSampleTime: () => number;
addAddSampleTime: (time: number) => void;
getCreateFrameTime: () => number;
addCreateFrameTime: (time: number) => void;
getAudioMixingTime: () => number;
addAudioMixingTime: (time: number) => void;
};
scale: number;
}) => OffscreenCanvas;

View File

@@ -0,0 +1,4 @@
export declare function transformDOMRect({ rect, matrix }: {
rect: DOMRect;
matrix: DOMMatrix;
}): DOMRect;

View File

@@ -0,0 +1,6 @@
export declare const setTransform: ({ ctx, transform, parentRect, scale, }: {
ctx: OffscreenCanvasRenderingContext2D;
transform: DOMMatrix;
parentRect: DOMRect;
scale: number;
}) => () => void;

View File

@@ -0,0 +1 @@
export declare const turnSvgIntoDrawable: (svg: SVGSVGElement) => Promise<HTMLImageElement>;