chat-layout 0.1.4 → 1.0.0-1
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 +200 -6
- package/index.d.mts +195 -110
- package/index.mjs +1304 -590
- package/index.mjs.map +1 -1
- package/package.json +1 -1
package/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["#inner","#top","#bottom","#left","#right","#shift","#width","#lines","#text","#ctx","#lastWidth","#cache","#cancelJumpAnimation","#jumpAnimation","#controlledState"],"sources":["../src/text.ts","../src/utils.ts","../src/registry.ts","../src/nodes.ts","../src/renderer.ts"],"sourcesContent":["import { layoutWithLines, prepareWithSegments } from \"@chenglou/pretext\";\nimport type { Context } from \"./types\";\n\nexport interface TextLayout {\n width: number;\n text: string;\n shift: number;\n}\n\nfunction preprocessSegments(text: string): string[] {\n return text\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter(Boolean);\n}\n\nexport function layoutFirstLine<C extends CanvasRenderingContext2D>(\n ctx: Context<C>,\n text: string,\n maxWidth: number,\n): TextLayout {\n if (maxWidth < 0) {\n maxWidth = 0;\n }\n const segments = preprocessSegments(text);\n const segment = segments[0];\n if (!segment) {\n return { width: 0, text: \"\", shift: 0 };\n }\n const {\n fontBoundingBoxAscent: ascent = 0,\n fontBoundingBoxDescent: descent = 0,\n } = ctx.graphics.measureText(segment);\n const shift = ascent - descent;\n if (maxWidth === 0) {\n return { width: 0, text: \"\", shift };\n }\n const prepared = prepareWithSegments(segment, ctx.graphics.font);\n const { lines } = layoutWithLines(prepared, maxWidth, 0);\n if (lines.length === 0) {\n return { width: 0, text: \"\", shift };\n }\n return { width: lines[0].width, text: lines[0].text, shift };\n}\n\nexport function layoutText<C extends CanvasRenderingContext2D>(\n ctx: Context<C>,\n text: string,\n maxWidth: number,\n): { width: number; lines: TextLayout[] } {\n if (maxWidth < 0) {\n maxWidth = 0;\n }\n\n const segments = preprocessSegments(text);\n if (segments.length === 0 || maxWidth === 0) {\n return { width: 0, lines: [] };\n }\n\n const font = ctx.graphics.font;\n let width = 0;\n const lines: TextLayout[] = [];\n\n for (const segment of segments) {\n const {\n fontBoundingBoxAscent: ascent = 0,\n fontBoundingBoxDescent: descent = 0,\n } = ctx.graphics.measureText(segment);\n const shift = ascent - descent;\n const prepared = prepareWithSegments(segment, font);\n const { lines: segLines } = layoutWithLines(prepared, maxWidth, 0);\n for (const segLine of segLines) {\n width = Math.max(width, segLine.width);\n lines.push({ width: segLine.width, text: segLine.text, shift });\n }\n }\n\n return { width, lines };\n}\n","export function shallow<T extends object>(object: T): T {\n return Object.create(object) as T;\n}\n\nexport function shallowMerge<T extends object, R extends object>(object: T, other: R): T & R {\n return { __proto__: object, ...other } as unknown as T & R;\n}\n","import type { Node } from \"./types\";\n\nconst registry = new WeakMap<Node<any>, Node<any>>();\n\nexport function registerNodeParent<C extends CanvasRenderingContext2D>(\n node: Node<C>,\n parent: Node<C>,\n): void {\n registry.set(node, parent);\n}\n\nexport function unregisterNodeParent<C extends CanvasRenderingContext2D>(node: Node<C>): void {\n registry.delete(node);\n}\n\nexport function getNodeParent<C extends CanvasRenderingContext2D>(node: Node<C>): Node<C> | undefined {\n return registry.get(node);\n}\n","import type { Alignment, Box, Context, DynValue, HitTest, Node } from \"./types\";\nimport { layoutFirstLine, layoutText, type TextLayout } from \"./text\";\nimport { shallow, shallowMerge } from \"./utils\";\nimport { registerNodeParent, unregisterNodeParent } from \"./registry\";\n\nexport abstract class Group<C extends CanvasRenderingContext2D> implements Node<C> {\n constructor(readonly children: Node<C>[]) {\n for (const child of children) {\n registerNodeParent(child, this);\n }\n }\n\n abstract measure(ctx: Context<C>): Box;\n abstract draw(ctx: Context<C>, x: number, y: number): boolean;\n abstract hittest(ctx: Context<C>, test: HitTest): boolean;\n\n get flex(): boolean {\n return this.children.some((item) => item.flex);\n }\n}\n\nexport class VStack<C extends CanvasRenderingContext2D> extends Group<C> {\n constructor(\n children: Node<C>[],\n readonly options: { gap?: number; alignment?: \"left\" | \"center\" | \"right\" } = {},\n ) {\n super(children);\n }\n\n measure(ctx: Context<C>): Box {\n let width = 0;\n let height = 0;\n if (this.options.alignment != null) {\n ctx.alignment = this.options.alignment;\n }\n\n for (const [index, child] of this.children.entries()) {\n if (this.options.gap != null && index !== 0) {\n height += this.options.gap;\n }\n const result = shallow(ctx).measureNode(child);\n height += result.height;\n width = Math.max(width, result.width);\n }\n ctx.remainingWidth -= width;\n return { width, height };\n }\n\n draw(ctx: Context<C>, x: number, y: number): boolean {\n let result = false;\n const fullWidth = ctx.measureNode(this).width;\n const alignment = this.options.alignment ?? ctx.alignment;\n if (this.options.alignment != null) {\n ctx.alignment = this.options.alignment;\n }\n\n for (const [index, child] of this.children.entries()) {\n if (this.options.gap != null && index !== 0) {\n y += this.options.gap;\n }\n const { width, height } = shallow(ctx).measureNode(child);\n const curCtx = shallow(ctx);\n let requestRedraw: boolean;\n if (alignment === \"right\") {\n requestRedraw = child.draw(curCtx, x + fullWidth - width, y);\n } else if (alignment === \"center\") {\n requestRedraw = child.draw(curCtx, x + (fullWidth - width) / 2, y);\n } else {\n requestRedraw = child.draw(curCtx, x, y);\n }\n result ||= requestRedraw;\n y += height;\n }\n return result;\n }\n\n hittest(ctx: Context<C>, test: HitTest): boolean {\n let y = 0;\n const fullWidth = ctx.measureNode(this).width;\n const alignment = this.options.alignment ?? ctx.alignment;\n if (this.options.alignment != null) {\n ctx.alignment = this.options.alignment;\n }\n\n for (const [index, child] of this.children.entries()) {\n if (this.options.gap != null && index !== 0) {\n y += this.options.gap;\n }\n\n const { width, height } = shallow(ctx).measureNode(child);\n const curCtx = shallow(ctx);\n if (test.y >= y && test.y < y + height) {\n let x: number;\n if (alignment === \"right\") {\n x = test.x - fullWidth + width;\n } else if (alignment === \"center\") {\n x = test.x - (fullWidth - width) / 2;\n } else {\n x = test.x;\n }\n if (x < 0 || x >= width) {\n return false;\n }\n return child.hittest(\n curCtx,\n shallowMerge(test, {\n x,\n y: test.y - y,\n }),\n );\n }\n y += height;\n }\n return false;\n }\n}\n\nexport class HStack<C extends CanvasRenderingContext2D> extends Group<C> {\n constructor(\n readonly children: Node<C>[],\n readonly options: { reverse?: boolean; gap?: number } = {},\n ) {\n super(children);\n }\n\n measure(ctx: Context<C>): Box {\n let width = 0;\n let height = 0;\n let firstFlex: Node<C> | undefined;\n\n for (const [index, child] of this.children.entries()) {\n if (this.options.gap != null && index !== 0) {\n width += this.options.gap;\n }\n if (firstFlex == null && child.flex) {\n firstFlex = child;\n continue;\n }\n const curCtx = shallow(ctx);\n curCtx.remainingWidth = ctx.remainingWidth - width;\n const result = curCtx.measureNode(child);\n width += result.width;\n height = Math.max(height, result.height);\n }\n\n if (firstFlex != null) {\n const curCtx = shallow(ctx);\n curCtx.remainingWidth = ctx.remainingWidth - width;\n const result = curCtx.measureNode(firstFlex);\n width += result.width;\n height = Math.max(height, result.height);\n }\n\n return { width, height };\n }\n\n draw(ctx: Context<C>, x: number, y: number): boolean {\n let result = false;\n const reverse = this.options.reverse ?? ctx.reverse;\n if (this.options.reverse) {\n ctx.reverse = this.options.reverse;\n }\n\n if (reverse) {\n x += ctx.measureNode(this).width;\n for (const [index, child] of this.children.entries()) {\n const gap = this.options.gap != null && index !== 0 ? this.options.gap : undefined;\n if (gap) {\n x -= gap;\n ctx.remainingWidth -= gap;\n }\n const { width } = shallow(ctx).measureNode(child);\n x -= width;\n const requestRedraw = child.draw(shallow(ctx), x, y);\n result ||= requestRedraw;\n ctx.remainingWidth -= width;\n }\n } else {\n for (const [index, child] of this.children.entries()) {\n const gap = this.options.gap != null && index !== 0 ? this.options.gap : undefined;\n if (gap) {\n x += gap;\n ctx.remainingWidth -= gap;\n }\n const requestRedraw = child.draw(shallow(ctx), x, y);\n result ||= requestRedraw;\n const { width } = shallow(ctx).measureNode(child);\n ctx.remainingWidth -= width;\n x += width;\n }\n }\n\n return result;\n }\n\n hittest(ctx: Context<C>, test: HitTest): boolean {\n const reverse = this.options.reverse ?? ctx.reverse;\n if (this.options.reverse) {\n ctx.reverse = this.options.reverse;\n }\n\n if (reverse) {\n let x = ctx.measureNode(this).width;\n for (const [index, child] of this.children.entries()) {\n const gap = this.options.gap != null && index !== 0 ? this.options.gap : undefined;\n if (gap) {\n x -= gap;\n ctx.remainingWidth -= gap;\n }\n const { width, height } = shallow(ctx).measureNode(child);\n x -= width;\n if (x <= test.x && test.x < x + width) {\n if (test.y >= height) {\n return false;\n }\n return child.hittest(\n shallow(ctx),\n shallowMerge(test, {\n x: test.x - x,\n }),\n );\n }\n ctx.remainingWidth -= width;\n }\n } else {\n let x = 0;\n for (const [index, child] of this.children.entries()) {\n const gap = this.options.gap != null && index !== 0 ? this.options.gap : undefined;\n if (gap) {\n x += gap;\n ctx.remainingWidth -= gap;\n }\n const { width, height } = shallow(ctx).measureNode(child);\n if (x <= test.x && test.x < x + width) {\n if (test.y >= height) {\n return false;\n }\n return child.hittest(\n shallow(ctx),\n shallowMerge(test, {\n x: test.x - x,\n }),\n );\n }\n x += width;\n ctx.remainingWidth -= width;\n }\n }\n\n return false;\n }\n}\n\nexport class Wrapper<C extends CanvasRenderingContext2D> implements Node<C> {\n #inner: Node<C>;\n\n constructor(inner: Node<C>) {\n this.#inner = inner;\n registerNodeParent(this.#inner, this);\n }\n\n get inner(): Node<C> {\n return this.#inner;\n }\n\n set inner(newNode: Node<C>) {\n if (newNode === this.#inner) {\n return;\n }\n unregisterNodeParent(this.#inner);\n this.#inner = newNode;\n registerNodeParent(newNode, this);\n }\n\n get flex(): boolean {\n return this.inner.flex;\n }\n\n measure(ctx: Context<C>): Box {\n return this.inner.measure(ctx);\n }\n\n draw(ctx: Context<C>, x: number, y: number): boolean {\n return this.inner.draw(ctx, x, y);\n }\n\n hittest(ctx: Context<C>, test: HitTest): boolean {\n return this.inner.hittest(ctx, test);\n }\n}\n\nexport class PaddingBox<C extends CanvasRenderingContext2D> extends Wrapper<C> {\n constructor(\n inner: Node<C>,\n readonly padding: {\n top?: number;\n bottom?: number;\n left?: number;\n right?: number;\n } = {},\n ) {\n super(inner);\n }\n\n get #top(): number {\n return this.padding.top ?? 0;\n }\n\n get #bottom(): number {\n return this.padding.bottom ?? 0;\n }\n\n get #left(): number {\n return this.padding.left ?? 0;\n }\n\n get #right(): number {\n return this.padding.right ?? 0;\n }\n\n measure(ctx: Context<C>): Box {\n ctx.remainingWidth -= this.#left + this.#right;\n const { width, height } = ctx.measureNode(this.inner);\n return {\n width: width + this.#left + this.#right,\n height: height + this.#top + this.#bottom,\n };\n }\n\n draw(ctx: Context<C>, x: number, y: number): boolean {\n ctx.remainingWidth -= this.#left + this.#right;\n return this.inner.draw(ctx, x + this.#left, y + this.#top);\n }\n\n hittest(ctx: Context<C>, test: HitTest): boolean {\n ctx.remainingWidth -= this.#left + this.#right;\n const { width, height } = shallow(ctx).measureNode(this.inner);\n if (0 <= test.x - this.#left && test.x - this.#left < width && 0 <= test.y - this.#top && test.y - this.#top < height) {\n return this.inner.hittest(\n shallow(ctx),\n shallowMerge(test, {\n x: test.x - this.#left,\n y: test.y - this.#top,\n }),\n );\n }\n return false;\n }\n}\n\nexport class AlignBox<C extends CanvasRenderingContext2D> extends Wrapper<C> {\n #shift = 0;\n\n constructor(\n inner: Node<C>,\n readonly options: {\n alignment: Alignment;\n },\n ) {\n super(inner);\n }\n\n measure(ctx: Context<C>): Box {\n ctx.alignment = this.options.alignment;\n const { width, height } = ctx.measureNode(this.inner);\n switch (this.options.alignment) {\n case \"center\":\n this.#shift = (ctx.remainingWidth - width) / 2;\n break;\n case \"right\":\n this.#shift = ctx.remainingWidth - width;\n break;\n default:\n this.#shift = 0;\n }\n return {\n width: ctx.remainingWidth,\n height,\n };\n }\n\n draw(ctx: Context<C>, x: number, y: number): boolean {\n ctx.alignment = this.options.alignment;\n return this.inner.draw(ctx, x + this.#shift, y);\n }\n\n hittest(ctx: Context<C>, test: HitTest): boolean {\n ctx.alignment = this.options.alignment;\n const { width } = shallow(ctx).measureNode(this.inner);\n if (0 <= test.x - this.#shift && test.x - this.#shift < width) {\n return this.inner.hittest(\n shallow(ctx),\n shallowMerge(test, {\n x: test.x - this.#shift,\n }),\n );\n }\n return false;\n }\n}\n\nexport class MultilineText<C extends CanvasRenderingContext2D> implements Node<C> {\n #width = 0;\n #lines: TextLayout[] = [];\n\n constructor(\n readonly text: string,\n readonly options: {\n lineHeight: number;\n font: string;\n alignment: \"left\" | \"center\" | \"right\";\n style: DynValue<C, string>;\n },\n ) {}\n\n get flex(): boolean {\n return true;\n }\n\n measure(ctx: Context<C>): Box {\n return ctx.with((g) => {\n g.font = this.options.font;\n const { width, lines } = layoutText(ctx, this.text, ctx.remainingWidth);\n this.#width = width;\n this.#lines = lines;\n return { width: this.#width, height: this.#lines.length * this.options.lineHeight };\n });\n }\n\n draw(ctx: Context<C>, x: number, y: number): boolean {\n return ctx.with((g) => {\n g.font = this.options.font;\n g.fillStyle = ctx.resolveDynValue(this.options.style);\n switch (this.options.alignment) {\n case \"left\":\n for (const { text, shift } of this.#lines) {\n g.fillText(text, x, y + (this.options.lineHeight + shift) / 2);\n y += this.options.lineHeight;\n }\n break;\n case \"right\":\n x += this.#width;\n g.textAlign = \"right\";\n for (const { text, shift } of this.#lines) {\n g.fillText(text, x, y + (this.options.lineHeight + shift) / 2);\n y += this.options.lineHeight;\n }\n break;\n case \"center\":\n x += this.#width / 2;\n g.textAlign = \"center\";\n for (const { text, shift } of this.#lines) {\n g.fillText(text, x, y + (this.options.lineHeight + shift) / 2);\n y += this.options.lineHeight;\n }\n break;\n }\n return false;\n });\n }\n\n hittest(_ctx: Context<C>, _test: HitTest): boolean {\n return false;\n }\n}\n\nexport class Text<C extends CanvasRenderingContext2D> implements Node<C> {\n #width = 0;\n #text = \"\";\n #shift = 0;\n\n constructor(\n readonly text: string,\n readonly options: {\n lineHeight: number;\n font: string;\n style: DynValue<C, string>;\n },\n ) {}\n\n get flex(): boolean {\n return false;\n }\n\n measure(ctx: Context<C>): Box {\n return ctx.with((g) => {\n g.font = this.options.font;\n const { width, text, shift } = layoutFirstLine(ctx, this.text, ctx.remainingWidth);\n this.#width = width;\n this.#text = text;\n this.#shift = shift;\n return { width: this.#width, height: this.options.lineHeight };\n });\n }\n\n draw(ctx: Context<C>, x: number, y: number): boolean {\n return ctx.with((g) => {\n g.font = this.options.font;\n g.fillStyle = ctx.resolveDynValue(this.options.style);\n g.fillText(this.#text, x, y + (this.options.lineHeight + this.#shift) / 2);\n return false;\n });\n }\n\n hittest(_ctx: Context<C>, _test: HitTest): boolean {\n return false;\n }\n}\n\nexport class Fixed<C extends CanvasRenderingContext2D> implements Node<C> {\n constructor(\n readonly width: number,\n readonly height: number,\n ) {}\n\n get flex(): boolean {\n return false;\n }\n\n measure(_ctx: Context<C>): Box {\n return { width: this.width, height: this.height };\n }\n\n draw(_ctx: Context<C>, _x: number, _y: number): boolean {\n return false;\n }\n\n hittest(_ctx: Context<C>, _test: HitTest): boolean {\n return false;\n }\n}\n","import type { Box, Context, DynValue, HitTest, Node, RenderFeedback, RendererOptions } from \"./types\";\nimport { shallow, shallowMerge } from \"./utils\";\nimport { getNodeParent } from \"./registry\";\n\nexport class BaseRenderer<C extends CanvasRenderingContext2D, O extends {} = {}> {\n graphics: C;\n #ctx: Context<C>;\n #lastWidth: number;\n #cache = new WeakMap<Node<C>, Box>();\n\n protected get context(): Context<C> {\n return shallow(this.#ctx);\n }\n\n constructor(\n graphics: C,\n readonly options: RendererOptions & O,\n ) {\n this.graphics = graphics;\n this.graphics.textRendering = \"optimizeLegibility\";\n const self = this;\n this.#ctx = {\n graphics: this.graphics,\n get remainingWidth() {\n return this.graphics.canvas.clientWidth;\n },\n set remainingWidth(value: number) {\n Object.defineProperty(this, \"remainingWidth\", { value, writable: true });\n },\n alignment: \"left\",\n reverse: false,\n measureNode(node: Node<C>) {\n return self.measureNode(node, this);\n },\n invalidateNode: this.invalidateNode.bind(this),\n resolveDynValue<T>(value: DynValue<C, T>): T {\n if (typeof value === \"function\") {\n return value(this.graphics);\n }\n return value as T;\n },\n with<T>(cb: (g: C) => T): T {\n this.graphics.save();\n try {\n return cb(this.graphics);\n } finally {\n this.graphics.restore();\n }\n },\n };\n this.#lastWidth = this.graphics.canvas.clientWidth;\n }\n\n invalidateNode(node: Node<C>): void {\n this.#cache.delete(node);\n let it: Node<C> | undefined = node;\n while ((it = getNodeParent(it))) {\n this.#cache.delete(it);\n }\n }\n\n measureNode(node: Node<C>, ctx?: Context<C>): Box {\n if (this.#lastWidth !== this.graphics.canvas.clientWidth) {\n this.#cache = new WeakMap<Node<C>, Box>();\n this.#lastWidth = this.graphics.canvas.clientWidth;\n } else {\n const result = this.#cache.get(node);\n if (result != null) {\n return result;\n }\n }\n const result = node.measure(ctx ?? this.context);\n this.#cache.set(node, result);\n return result;\n }\n}\n\nexport class DebugRenderer<C extends CanvasRenderingContext2D> extends BaseRenderer<C> {\n draw(node: Node<C>): boolean {\n const { clientWidth: viewportWidth, clientHeight: viewportHeight } = this.graphics.canvas;\n this.graphics.clearRect(0, 0, viewportWidth, viewportHeight);\n return node.draw(this.context, 0, 0);\n }\n\n hittest(node: Node<C>, test: HitTest): boolean {\n return node.hittest(this.context, test);\n }\n}\n\nexport function memoRenderItem<C extends CanvasRenderingContext2D, T extends {}>(\n renderItem: (item: T) => Node<C>,\n): ((item: T) => Node<C>) & { reset: (key: T) => boolean } {\n const cache = new WeakMap<object, Node<C>>();\n\n function fn(item: T): Node<C> {\n const key = item as unknown as object;\n const cached = cache.get(key);\n if (cached != null) {\n return cached;\n }\n const result = renderItem(item);\n cache.set(key, result);\n return result;\n }\n\n return Object.assign(fn, {\n reset: (key: T) => cache.delete(key as unknown as object),\n });\n}\n\nexport class ListState<T extends {}> {\n offset = 0;\n position = Number.NaN;\n items: T[] = [];\n\n unshift(...items: T[]): void {\n this.unshiftAll(items);\n }\n\n unshiftAll(items: T[]): void {\n this.position += items.length;\n this.items = items.concat(this.items);\n }\n\n push(...items: T[]): void {\n this.pushAll(items);\n }\n\n pushAll(items: T[]): void {\n this.items.push(...items);\n }\n\n reset(): void {\n this.items = [];\n this.offset = 0;\n this.position = Number.NaN;\n }\n\n resetScroll(): void {\n this.offset = 0;\n this.position = Number.NaN;\n }\n\n applyScroll(delta: number): void {\n this.offset += delta;\n }\n}\n\ntype DrawItem<C extends CanvasRenderingContext2D> = {\n idx: number;\n node: Node<C>;\n offset: number;\n height: number;\n};\n\nexport interface JumpToOptions {\n animated?: boolean;\n duration?: number;\n onComplete?: () => void;\n}\n\ntype ControlledState = {\n position: number;\n offset: number;\n};\n\ntype JumpAnimation = {\n startAnchor: number;\n targetAnchor: number;\n startTime: number;\n duration: number;\n needsMoreFrames: boolean;\n onComplete: (() => void) | undefined;\n};\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\nfunction sameState(state: ControlledState, position: number, offset: number): boolean {\n return Object.is(state.position, position) && Object.is(state.offset, offset);\n}\n\nfunction smoothstep(value: number): number {\n return value * value * (3 - 2 * value);\n}\n\nfunction getNow(): number {\n return globalThis.performance?.now() ?? Date.now();\n}\n\nexport abstract class VirtualizedRenderer<C extends CanvasRenderingContext2D, T extends {}> extends BaseRenderer<\n C,\n {\n renderItem: (item: T) => Node<C>;\n list: ListState<T>;\n }\n> {\n static readonly MIN_JUMP_DURATION = 160;\n static readonly MAX_JUMP_DURATION = 420;\n static readonly JUMP_DURATION_PER_ITEM = 28;\n\n #controlledState: ControlledState | undefined;\n #jumpAnimation: JumpAnimation | undefined;\n\n get position(): number {\n return this.options.list.position;\n }\n\n set position(value: number) {\n this.options.list.position = value;\n }\n\n get offset(): number {\n return this.options.list.offset;\n }\n\n set offset(value: number) {\n this.options.list.offset = value;\n }\n\n get items(): T[] {\n return this.options.list.items;\n }\n\n set items(value: T[]) {\n this.options.list.items = value;\n }\n\n abstract render(feedback?: RenderFeedback): boolean;\n abstract hittest(test: HitTest): boolean;\n\n jumpTo(index: number, options: JumpToOptions = {}): void {\n if (this.items.length === 0) {\n this.#cancelJumpAnimation();\n return;\n }\n\n const targetIndex = this._clampItemIndex(index);\n this._prepareAnchorState();\n const targetAnchor = this._getTargetAnchor(targetIndex);\n\n const animated = options.animated ?? true;\n if (!animated) {\n this.#cancelJumpAnimation();\n this._applyAnchor(targetAnchor);\n options.onComplete?.();\n return;\n }\n\n const startAnchor = this._readAnchor();\n if (!Number.isFinite(startAnchor)) {\n this.#cancelJumpAnimation();\n this._applyAnchor(targetAnchor);\n options.onComplete?.();\n return;\n }\n\n const duration = clamp(\n options.duration ??\n VirtualizedRenderer.MIN_JUMP_DURATION +\n Math.abs(targetAnchor - startAnchor) * VirtualizedRenderer.JUMP_DURATION_PER_ITEM,\n 0,\n VirtualizedRenderer.MAX_JUMP_DURATION,\n );\n\n if (duration <= 0 || Math.abs(targetAnchor - startAnchor) <= Number.EPSILON) {\n this.#cancelJumpAnimation();\n this._applyAnchor(targetAnchor);\n options.onComplete?.();\n return;\n }\n\n this.#jumpAnimation = {\n startAnchor,\n targetAnchor,\n startTime: getNow(),\n duration,\n needsMoreFrames: true,\n onComplete: options.onComplete,\n };\n this.#controlledState = {\n position: this.position,\n offset: this.offset,\n };\n }\n\n protected _resetRenderFeedback(feedback?: RenderFeedback): void {\n if (feedback == null) {\n return;\n }\n feedback.minIdx = Number.NaN;\n feedback.maxIdx = Number.NaN;\n feedback.min = Number.NaN;\n feedback.max = Number.NaN;\n }\n\n protected _accumulateRenderFeedback(feedback: RenderFeedback, idx: number, top: number, height: number): void {\n if (!Number.isFinite(top) || !Number.isFinite(height) || height <= 0) {\n return;\n }\n\n const viewportHeight = this.graphics.canvas.clientHeight;\n const visibleTop = clamp(-top, 0, height);\n const visibleBottom = clamp(viewportHeight - top, 0, height);\n if (visibleBottom <= visibleTop) {\n return;\n }\n\n const itemMin = idx + visibleTop / height;\n const itemMax = idx + visibleBottom / height;\n feedback.minIdx = Number.isNaN(feedback.minIdx) ? idx : Math.min(idx, feedback.minIdx);\n feedback.maxIdx = Number.isNaN(feedback.maxIdx) ? idx : Math.max(idx, feedback.maxIdx);\n feedback.min = Number.isNaN(feedback.min) ? itemMin : Math.min(itemMin, feedback.min);\n feedback.max = Number.isNaN(feedback.max) ? itemMax : Math.max(itemMax, feedback.max);\n }\n\n protected _renderDrawList(list: DrawItem<C>[], shift: number, feedback?: RenderFeedback): boolean {\n let result = false;\n const viewportHeight = this.graphics.canvas.clientHeight;\n\n for (const { idx, node, offset, height } of list) {\n const y = offset + shift;\n if (feedback != null) {\n this._accumulateRenderFeedback(feedback, idx, y, height);\n }\n if (y + height < 0 || y > viewportHeight) {\n continue;\n }\n if (node.draw(this.context, 0, y)) {\n result = true;\n }\n }\n\n return result;\n }\n\n protected _prepareRender(): boolean {\n const animation = this.#jumpAnimation;\n if (animation == null) {\n return false;\n }\n if (this.items.length === 0) {\n this.#cancelJumpAnimation();\n return false;\n }\n if (this.#controlledState != null && !sameState(this.#controlledState, this.position, this.offset)) {\n this.#cancelJumpAnimation();\n return false;\n }\n\n const progress = clamp((getNow() - animation.startTime) / animation.duration, 0, 1);\n const eased = progress >= 1 ? 1 : smoothstep(progress);\n const anchor = animation.startAnchor + (animation.targetAnchor - animation.startAnchor) * eased;\n this._applyAnchor(anchor);\n animation.needsMoreFrames = progress < 1;\n return animation.needsMoreFrames;\n }\n\n protected _finishRender(requestRedraw: boolean): boolean {\n const animation = this.#jumpAnimation;\n if (animation == null) {\n return requestRedraw;\n }\n\n if (animation.needsMoreFrames) {\n this.#controlledState = {\n position: this.position,\n offset: this.offset,\n };\n return true;\n }\n\n const onComplete = animation.onComplete;\n this.#cancelJumpAnimation();\n onComplete?.();\n return requestRedraw || this.#jumpAnimation != null;\n }\n\n protected _clampItemIndex(index: number): number {\n return clamp(Number.isFinite(index) ? Math.trunc(index) : 0, 0, this.items.length - 1);\n }\n\n protected _getItemHeight(index: number): number {\n const item = this.items[index];\n const node = this.options.renderItem(item);\n return this.measureNode(node).height;\n }\n\n protected abstract _prepareAnchorState(): void;\n protected abstract _readAnchor(): number;\n protected abstract _applyAnchor(anchor: number): void;\n protected abstract _getTargetAnchor(index: number): number;\n\n #cancelJumpAnimation(): void {\n this.#jumpAnimation = undefined;\n this.#controlledState = undefined;\n }\n}\n\nexport class TimelineRenderer<C extends CanvasRenderingContext2D, T extends {}> extends VirtualizedRenderer<C, T> {\n protected _prepareAnchorState(): void {\n if (this.items.length === 0) {\n return;\n }\n if (!Number.isFinite(this.position)) {\n this.position = 0;\n this.offset = 0;\n return;\n }\n this.position = this._clampItemIndex(this.position);\n if (!Number.isFinite(this.offset)) {\n this.offset = 0;\n }\n }\n\n protected _readAnchor(): number {\n this._prepareAnchorState();\n if (this.items.length === 0) {\n return 0;\n }\n const height = this._getItemHeight(this.position);\n return height > 0 ? this.position - this.offset / height : this.position;\n }\n\n protected _applyAnchor(anchor: number): void {\n if (this.items.length === 0) {\n return;\n }\n const clampedAnchor = clamp(anchor, 0, this.items.length);\n const position = clamp(Math.floor(clampedAnchor), 0, this.items.length - 1);\n const height = this._getItemHeight(position);\n this.position = position;\n const offset = height > 0 ? -(clampedAnchor - position) * height : 0;\n this.offset = Object.is(offset, -0) ? 0 : offset;\n }\n\n protected _getTargetAnchor(index: number): number {\n return index;\n }\n\n render(feedback?: RenderFeedback): boolean {\n const keepAnimating = this._prepareRender();\n const { clientWidth: viewportWidth, clientHeight: viewportHeight } = this.graphics.canvas;\n this.graphics.clearRect(0, 0, viewportWidth, viewportHeight);\n this._resetRenderFeedback(feedback);\n\n let drawLength = 0;\n if (Number.isNaN(this.position)) {\n this.position = 0;\n }\n\n if (this.offset > 0) {\n if (this.position === 0) {\n this.offset = 0;\n } else {\n for (let i = this.position - 1; i >= 0; i -= 1) {\n const item = this.items[i];\n const node = this.options.renderItem(item);\n const { height } = this.measureNode(node);\n this.position = i;\n this.offset -= height;\n if (this.offset <= 0) {\n break;\n }\n }\n if (this.position === 0 && this.offset > 0) {\n this.offset = 0;\n }\n }\n }\n\n let y = this.offset;\n const drawList: DrawItem<C>[] = [];\n for (let i = this.position; i < this.items.length; i += 1) {\n const item = this.items[i];\n const node = this.options.renderItem(item);\n const { height } = this.measureNode(node);\n if (y + height > 0) {\n drawList.push({ idx: i, node, offset: y, height });\n drawLength += height;\n } else {\n this.offset += height;\n this.position = i + 1;\n }\n y += height;\n if (y >= viewportHeight) {\n break;\n }\n }\n\n let shift = 0;\n if (y < viewportHeight) {\n if (this.position === 0 && drawLength < viewportHeight) {\n shift = -this.offset;\n this.offset = 0;\n } else {\n shift = viewportHeight - y;\n y = (this.offset += shift);\n let lastIdx = -1;\n for (let i = this.position - 1; i >= 0; i -= 1) {\n const item = this.items[(lastIdx = i)];\n const node = this.options.renderItem(item);\n const { height } = this.measureNode(node);\n drawLength += height;\n y -= height;\n drawList.push({ idx: i, node, offset: y - shift, height });\n if (y < 0) {\n break;\n }\n }\n if (lastIdx === 0 && drawLength < viewportHeight) {\n shift = -drawList[drawList.length - 1].offset;\n this.position = 0;\n this.offset = 0;\n }\n }\n }\n\n const requestRedraw = this._renderDrawList(drawList, shift, feedback);\n return this._finishRender(keepAnimating || requestRedraw);\n }\n\n hittest(test: HitTest): boolean {\n const viewportHeight = this.graphics.canvas.clientHeight;\n let y = this.offset;\n\n for (let i = this.position; i < this.items.length; i += 1) {\n const item = this.items[i];\n const node = this.options.renderItem(item);\n const { height } = this.measureNode(node);\n if (test.y < y + height) {\n return node.hittest(\n this.context,\n shallowMerge(test, {\n y: test.y - y,\n }),\n );\n }\n y += height;\n if (y >= viewportHeight) {\n break;\n }\n }\n return false;\n }\n}\n\nexport class ChatRenderer<C extends CanvasRenderingContext2D, T extends {}> extends VirtualizedRenderer<C, T> {\n protected _prepareAnchorState(): void {\n if (this.items.length === 0) {\n return;\n }\n if (!Number.isFinite(this.position)) {\n this.position = this.items.length - 1;\n this.offset = 0;\n return;\n }\n this.position = this._clampItemIndex(this.position);\n if (!Number.isFinite(this.offset)) {\n this.offset = 0;\n }\n }\n\n protected _readAnchor(): number {\n this._prepareAnchorState();\n if (this.items.length === 0) {\n return 0;\n }\n const height = this._getItemHeight(this.position);\n return height > 0 ? this.position + 1 - this.offset / height : this.position + 1;\n }\n\n protected _applyAnchor(anchor: number): void {\n if (this.items.length === 0) {\n return;\n }\n const clampedAnchor = clamp(anchor, 0, this.items.length);\n const position = clamp(Math.ceil(clampedAnchor) - 1, 0, this.items.length - 1);\n const height = this._getItemHeight(position);\n this.position = position;\n const offset = height > 0 ? (position + 1 - clampedAnchor) * height : 0;\n this.offset = Object.is(offset, -0) ? 0 : offset;\n }\n\n protected _getTargetAnchor(index: number): number {\n return index + 1;\n }\n\n render(feedback?: RenderFeedback): boolean {\n const keepAnimating = this._prepareRender();\n const { clientWidth: viewportWidth, clientHeight: viewportHeight } = this.graphics.canvas;\n this.graphics.clearRect(0, 0, viewportWidth, viewportHeight);\n this._resetRenderFeedback(feedback);\n\n let drawLength = 0;\n if (Number.isNaN(this.position)) {\n this.position = this.items.length - 1;\n }\n\n if (this.offset < 0) {\n if (this.position === this.items.length - 1) {\n this.offset = 0;\n } else {\n for (let i = this.position + 1; i < this.items.length; i += 1) {\n const item = this.items[i];\n const node = this.options.renderItem(item);\n const { height } = this.measureNode(node);\n this.position = i;\n this.offset += height;\n if (this.offset > 0) {\n break;\n }\n }\n }\n }\n\n let y = viewportHeight + this.offset;\n const drawList: DrawItem<C>[] = [];\n for (let i = this.position; i >= 0; i -= 1) {\n const item = this.items[i];\n const node = this.options.renderItem(item);\n const { height } = this.measureNode(node);\n y -= height;\n if (y <= viewportHeight) {\n drawList.push({ idx: i, node, offset: y, height });\n drawLength += height;\n } else {\n this.offset -= height;\n this.position = i - 1;\n }\n if (y < 0) {\n break;\n }\n }\n\n let shift = 0;\n if (y > 0) {\n shift = -y;\n if (drawLength < viewportHeight) {\n y = drawLength;\n for (let i = this.position + 1; i < this.items.length; i += 1) {\n const item = this.items[i];\n const node = this.options.renderItem(item);\n const { height } = this.measureNode(node);\n drawList.push({ idx: i, node, offset: y - shift, height });\n y = (drawLength += height);\n this.position = i;\n if (y >= viewportHeight) {\n break;\n }\n }\n if (drawLength < viewportHeight) {\n this.offset = 0;\n } else {\n this.offset = drawLength - viewportHeight;\n }\n } else {\n this.offset = drawLength - viewportHeight;\n }\n }\n\n const requestRedraw = this._renderDrawList(drawList, shift, feedback);\n return this._finishRender(keepAnimating || requestRedraw);\n }\n\n hittest(test: HitTest): boolean {\n const viewportHeight = this.graphics.canvas.clientHeight;\n\n let drawLength = 0;\n const heights: Array<readonly [Node<C>, number]> = [];\n for (let i = this.position; i >= 0; i -= 1) {\n const item = this.items[i];\n const node = this.options.renderItem(item);\n const { height } = this.measureNode(node);\n drawLength += height;\n heights.push([node, height]);\n }\n\n let y = drawLength < viewportHeight ? drawLength : viewportHeight + this.offset;\n if (test.y > y) {\n return false;\n }\n\n for (const [node, height] of heights) {\n y -= height;\n if (test.y > y) {\n return node.hittest(\n this.context,\n shallowMerge(test, {\n y: test.y - y,\n }),\n );\n }\n }\n return false;\n }\n}\n"],"mappings":";;AASA,SAAS,mBAAmB,MAAwB;AAClD,QAAO,KACJ,MAAM,KAAK,CACX,KAAK,SAAS,KAAK,MAAM,CAAC,CAC1B,OAAO,QAAQ;;AAGpB,SAAgB,gBACd,KACA,MACA,UACY;AACZ,KAAI,WAAW,EACb,YAAW;CAGb,MAAM,UADW,mBAAmB,KAAK,CAChB;AACzB,KAAI,CAAC,QACH,QAAO;EAAE,OAAO;EAAG,MAAM;EAAI,OAAO;EAAG;CAEzC,MAAM,EACJ,uBAAuB,SAAS,GAChC,wBAAwB,UAAU,MAChC,IAAI,SAAS,YAAY,QAAQ;CACrC,MAAM,QAAQ,SAAS;AACvB,KAAI,aAAa,EACf,QAAO;EAAE,OAAO;EAAG,MAAM;EAAI;EAAO;CAGtC,MAAM,EAAE,UAAU,gBADD,oBAAoB,SAAS,IAAI,SAAS,KAAK,EACpB,UAAU,EAAE;AACxD,KAAI,MAAM,WAAW,EACnB,QAAO;EAAE,OAAO;EAAG,MAAM;EAAI;EAAO;AAEtC,QAAO;EAAE,OAAO,MAAM,GAAG;EAAO,MAAM,MAAM,GAAG;EAAM;EAAO;;AAG9D,SAAgB,WACd,KACA,MACA,UACwC;AACxC,KAAI,WAAW,EACb,YAAW;CAGb,MAAM,WAAW,mBAAmB,KAAK;AACzC,KAAI,SAAS,WAAW,KAAK,aAAa,EACxC,QAAO;EAAE,OAAO;EAAG,OAAO,EAAE;EAAE;CAGhC,MAAM,OAAO,IAAI,SAAS;CAC1B,IAAI,QAAQ;CACZ,MAAM,QAAsB,EAAE;AAE9B,MAAK,MAAM,WAAW,UAAU;EAC9B,MAAM,EACJ,uBAAuB,SAAS,GAChC,wBAAwB,UAAU,MAChC,IAAI,SAAS,YAAY,QAAQ;EACrC,MAAM,QAAQ,SAAS;EAEvB,MAAM,EAAE,OAAO,aAAa,gBADX,oBAAoB,SAAS,KAAK,EACG,UAAU,EAAE;AAClE,OAAK,MAAM,WAAW,UAAU;AAC9B,WAAQ,KAAK,IAAI,OAAO,QAAQ,MAAM;AACtC,SAAM,KAAK;IAAE,OAAO,QAAQ;IAAO,MAAM,QAAQ;IAAM;IAAO,CAAC;;;AAInE,QAAO;EAAE;EAAO;EAAO;;;;AC7EzB,SAAgB,QAA0B,QAAc;AACtD,QAAO,OAAO,OAAO,OAAO;;AAG9B,SAAgB,aAAiD,QAAW,OAAiB;AAC3F,QAAO;EAAE,WAAW;EAAQ,GAAG;EAAO;;;;ACHxC,MAAM,2BAAW,IAAI,SAA+B;AAEpD,SAAgB,mBACd,MACA,QACM;AACN,UAAS,IAAI,MAAM,OAAO;;AAG5B,SAAgB,qBAAyD,MAAqB;AAC5F,UAAS,OAAO,KAAK;;AAGvB,SAAgB,cAAkD,MAAoC;AACpG,QAAO,SAAS,IAAI,KAAK;;;;ACX3B,IAAsB,QAAtB,MAAmF;CACjF,YAAY,UAA8B;AAArB,OAAA,WAAA;AACnB,OAAK,MAAM,SAAS,SAClB,oBAAmB,OAAO,KAAK;;CAQnC,IAAI,OAAgB;AAClB,SAAO,KAAK,SAAS,MAAM,SAAS,KAAK,KAAK;;;AAIlD,IAAa,SAAb,cAAgE,MAAS;CACvE,YACE,UACA,UAA8E,EAAE,EAChF;AACA,QAAM,SAAS;AAFN,OAAA,UAAA;;CAKX,QAAQ,KAAsB;EAC5B,IAAI,QAAQ;EACZ,IAAI,SAAS;AACb,MAAI,KAAK,QAAQ,aAAa,KAC5B,KAAI,YAAY,KAAK,QAAQ;AAG/B,OAAK,MAAM,CAAC,OAAO,UAAU,KAAK,SAAS,SAAS,EAAE;AACpD,OAAI,KAAK,QAAQ,OAAO,QAAQ,UAAU,EACxC,WAAU,KAAK,QAAQ;GAEzB,MAAM,SAAS,QAAQ,IAAI,CAAC,YAAY,MAAM;AAC9C,aAAU,OAAO;AACjB,WAAQ,KAAK,IAAI,OAAO,OAAO,MAAM;;AAEvC,MAAI,kBAAkB;AACtB,SAAO;GAAE;GAAO;GAAQ;;CAG1B,KAAK,KAAiB,GAAW,GAAoB;EACnD,IAAI,SAAS;EACb,MAAM,YAAY,IAAI,YAAY,KAAK,CAAC;EACxC,MAAM,YAAY,KAAK,QAAQ,aAAa,IAAI;AAChD,MAAI,KAAK,QAAQ,aAAa,KAC5B,KAAI,YAAY,KAAK,QAAQ;AAG/B,OAAK,MAAM,CAAC,OAAO,UAAU,KAAK,SAAS,SAAS,EAAE;AACpD,OAAI,KAAK,QAAQ,OAAO,QAAQ,UAAU,EACxC,MAAK,KAAK,QAAQ;GAEpB,MAAM,EAAE,OAAO,WAAW,QAAQ,IAAI,CAAC,YAAY,MAAM;GACzD,MAAM,SAAS,QAAQ,IAAI;GAC3B,IAAI;AACJ,OAAI,cAAc,QAChB,iBAAgB,MAAM,KAAK,QAAQ,IAAI,YAAY,OAAO,EAAE;YACnD,cAAc,SACvB,iBAAgB,MAAM,KAAK,QAAQ,KAAK,YAAY,SAAS,GAAG,EAAE;OAElE,iBAAgB,MAAM,KAAK,QAAQ,GAAG,EAAE;AAE1C,cAAW;AACX,QAAK;;AAEP,SAAO;;CAGT,QAAQ,KAAiB,MAAwB;EAC/C,IAAI,IAAI;EACR,MAAM,YAAY,IAAI,YAAY,KAAK,CAAC;EACxC,MAAM,YAAY,KAAK,QAAQ,aAAa,IAAI;AAChD,MAAI,KAAK,QAAQ,aAAa,KAC5B,KAAI,YAAY,KAAK,QAAQ;AAG/B,OAAK,MAAM,CAAC,OAAO,UAAU,KAAK,SAAS,SAAS,EAAE;AACpD,OAAI,KAAK,QAAQ,OAAO,QAAQ,UAAU,EACxC,MAAK,KAAK,QAAQ;GAGpB,MAAM,EAAE,OAAO,WAAW,QAAQ,IAAI,CAAC,YAAY,MAAM;GACzD,MAAM,SAAS,QAAQ,IAAI;AAC3B,OAAI,KAAK,KAAK,KAAK,KAAK,IAAI,IAAI,QAAQ;IACtC,IAAI;AACJ,QAAI,cAAc,QAChB,KAAI,KAAK,IAAI,YAAY;aAChB,cAAc,SACvB,KAAI,KAAK,KAAK,YAAY,SAAS;QAEnC,KAAI,KAAK;AAEX,QAAI,IAAI,KAAK,KAAK,MAChB,QAAO;AAET,WAAO,MAAM,QACX,QACA,aAAa,MAAM;KACjB;KACA,GAAG,KAAK,IAAI;KACb,CAAC,CACH;;AAEH,QAAK;;AAEP,SAAO;;;AAIX,IAAa,SAAb,cAAgE,MAAS;CACvE,YACE,UACA,UAAwD,EAAE,EAC1D;AACA,QAAM,SAAS;AAHN,OAAA,WAAA;AACA,OAAA,UAAA;;CAKX,QAAQ,KAAsB;EAC5B,IAAI,QAAQ;EACZ,IAAI,SAAS;EACb,IAAI;AAEJ,OAAK,MAAM,CAAC,OAAO,UAAU,KAAK,SAAS,SAAS,EAAE;AACpD,OAAI,KAAK,QAAQ,OAAO,QAAQ,UAAU,EACxC,UAAS,KAAK,QAAQ;AAExB,OAAI,aAAa,QAAQ,MAAM,MAAM;AACnC,gBAAY;AACZ;;GAEF,MAAM,SAAS,QAAQ,IAAI;AAC3B,UAAO,iBAAiB,IAAI,iBAAiB;GAC7C,MAAM,SAAS,OAAO,YAAY,MAAM;AACxC,YAAS,OAAO;AAChB,YAAS,KAAK,IAAI,QAAQ,OAAO,OAAO;;AAG1C,MAAI,aAAa,MAAM;GACrB,MAAM,SAAS,QAAQ,IAAI;AAC3B,UAAO,iBAAiB,IAAI,iBAAiB;GAC7C,MAAM,SAAS,OAAO,YAAY,UAAU;AAC5C,YAAS,OAAO;AAChB,YAAS,KAAK,IAAI,QAAQ,OAAO,OAAO;;AAG1C,SAAO;GAAE;GAAO;GAAQ;;CAG1B,KAAK,KAAiB,GAAW,GAAoB;EACnD,IAAI,SAAS;EACb,MAAM,UAAU,KAAK,QAAQ,WAAW,IAAI;AAC5C,MAAI,KAAK,QAAQ,QACf,KAAI,UAAU,KAAK,QAAQ;AAG7B,MAAI,SAAS;AACX,QAAK,IAAI,YAAY,KAAK,CAAC;AAC3B,QAAK,MAAM,CAAC,OAAO,UAAU,KAAK,SAAS,SAAS,EAAE;IACpD,MAAM,MAAM,KAAK,QAAQ,OAAO,QAAQ,UAAU,IAAI,KAAK,QAAQ,MAAM,KAAA;AACzE,QAAI,KAAK;AACP,UAAK;AACL,SAAI,kBAAkB;;IAExB,MAAM,EAAE,UAAU,QAAQ,IAAI,CAAC,YAAY,MAAM;AACjD,SAAK;IACL,MAAM,gBAAgB,MAAM,KAAK,QAAQ,IAAI,EAAE,GAAG,EAAE;AACpD,eAAW;AACX,QAAI,kBAAkB;;QAGxB,MAAK,MAAM,CAAC,OAAO,UAAU,KAAK,SAAS,SAAS,EAAE;GACpD,MAAM,MAAM,KAAK,QAAQ,OAAO,QAAQ,UAAU,IAAI,KAAK,QAAQ,MAAM,KAAA;AACzE,OAAI,KAAK;AACP,SAAK;AACL,QAAI,kBAAkB;;GAExB,MAAM,gBAAgB,MAAM,KAAK,QAAQ,IAAI,EAAE,GAAG,EAAE;AACpD,cAAW;GACX,MAAM,EAAE,UAAU,QAAQ,IAAI,CAAC,YAAY,MAAM;AACjD,OAAI,kBAAkB;AACtB,QAAK;;AAIT,SAAO;;CAGT,QAAQ,KAAiB,MAAwB;EAC/C,MAAM,UAAU,KAAK,QAAQ,WAAW,IAAI;AAC5C,MAAI,KAAK,QAAQ,QACf,KAAI,UAAU,KAAK,QAAQ;AAG7B,MAAI,SAAS;GACX,IAAI,IAAI,IAAI,YAAY,KAAK,CAAC;AAC9B,QAAK,MAAM,CAAC,OAAO,UAAU,KAAK,SAAS,SAAS,EAAE;IACpD,MAAM,MAAM,KAAK,QAAQ,OAAO,QAAQ,UAAU,IAAI,KAAK,QAAQ,MAAM,KAAA;AACzE,QAAI,KAAK;AACP,UAAK;AACL,SAAI,kBAAkB;;IAExB,MAAM,EAAE,OAAO,WAAW,QAAQ,IAAI,CAAC,YAAY,MAAM;AACzD,SAAK;AACL,QAAI,KAAK,KAAK,KAAK,KAAK,IAAI,IAAI,OAAO;AACrC,SAAI,KAAK,KAAK,OACZ,QAAO;AAET,YAAO,MAAM,QACX,QAAQ,IAAI,EACZ,aAAa,MAAM,EACjB,GAAG,KAAK,IAAI,GACb,CAAC,CACH;;AAEH,QAAI,kBAAkB;;SAEnB;GACL,IAAI,IAAI;AACR,QAAK,MAAM,CAAC,OAAO,UAAU,KAAK,SAAS,SAAS,EAAE;IACpD,MAAM,MAAM,KAAK,QAAQ,OAAO,QAAQ,UAAU,IAAI,KAAK,QAAQ,MAAM,KAAA;AACzE,QAAI,KAAK;AACP,UAAK;AACL,SAAI,kBAAkB;;IAExB,MAAM,EAAE,OAAO,WAAW,QAAQ,IAAI,CAAC,YAAY,MAAM;AACzD,QAAI,KAAK,KAAK,KAAK,KAAK,IAAI,IAAI,OAAO;AACrC,SAAI,KAAK,KAAK,OACZ,QAAO;AAET,YAAO,MAAM,QACX,QAAQ,IAAI,EACZ,aAAa,MAAM,EACjB,GAAG,KAAK,IAAI,GACb,CAAC,CACH;;AAEH,SAAK;AACL,QAAI,kBAAkB;;;AAI1B,SAAO;;;AAIX,IAAa,UAAb,MAA4E;CAC1E;CAEA,YAAY,OAAgB;AAC1B,QAAA,QAAc;AACd,qBAAmB,MAAA,OAAa,KAAK;;CAGvC,IAAI,QAAiB;AACnB,SAAO,MAAA;;CAGT,IAAI,MAAM,SAAkB;AAC1B,MAAI,YAAY,MAAA,MACd;AAEF,uBAAqB,MAAA,MAAY;AACjC,QAAA,QAAc;AACd,qBAAmB,SAAS,KAAK;;CAGnC,IAAI,OAAgB;AAClB,SAAO,KAAK,MAAM;;CAGpB,QAAQ,KAAsB;AAC5B,SAAO,KAAK,MAAM,QAAQ,IAAI;;CAGhC,KAAK,KAAiB,GAAW,GAAoB;AACnD,SAAO,KAAK,MAAM,KAAK,KAAK,GAAG,EAAE;;CAGnC,QAAQ,KAAiB,MAAwB;AAC/C,SAAO,KAAK,MAAM,QAAQ,KAAK,KAAK;;;AAIxC,IAAa,aAAb,cAAoE,QAAW;CAC7E,YACE,OACA,UAKI,EAAE,EACN;AACA,QAAM,MAAM;AAPH,OAAA,UAAA;;CAUX,KAAA,MAAmB;AACjB,SAAO,KAAK,QAAQ,OAAO;;CAG7B,KAAA,SAAsB;AACpB,SAAO,KAAK,QAAQ,UAAU;;CAGhC,KAAA,OAAoB;AAClB,SAAO,KAAK,QAAQ,QAAQ;;CAG9B,KAAA,QAAqB;AACnB,SAAO,KAAK,QAAQ,SAAS;;CAG/B,QAAQ,KAAsB;AAC5B,MAAI,kBAAkB,MAAA,OAAa,MAAA;EACnC,MAAM,EAAE,OAAO,WAAW,IAAI,YAAY,KAAK,MAAM;AACrD,SAAO;GACL,OAAO,QAAQ,MAAA,OAAa,MAAA;GAC5B,QAAQ,SAAS,MAAA,MAAY,MAAA;GAC9B;;CAGH,KAAK,KAAiB,GAAW,GAAoB;AACnD,MAAI,kBAAkB,MAAA,OAAa,MAAA;AACnC,SAAO,KAAK,MAAM,KAAK,KAAK,IAAI,MAAA,MAAY,IAAI,MAAA,IAAU;;CAG5D,QAAQ,KAAiB,MAAwB;AAC/C,MAAI,kBAAkB,MAAA,OAAa,MAAA;EACnC,MAAM,EAAE,OAAO,WAAW,QAAQ,IAAI,CAAC,YAAY,KAAK,MAAM;AAC9D,MAAI,KAAK,KAAK,IAAI,MAAA,QAAc,KAAK,IAAI,MAAA,OAAa,SAAS,KAAK,KAAK,IAAI,MAAA,OAAa,KAAK,IAAI,MAAA,MAAY,OAC7G,QAAO,KAAK,MAAM,QAChB,QAAQ,IAAI,EACZ,aAAa,MAAM;GACjB,GAAG,KAAK,IAAI,MAAA;GACZ,GAAG,KAAK,IAAI,MAAA;GACb,CAAC,CACH;AAEH,SAAO;;;AAIX,IAAa,WAAb,cAAkE,QAAW;CAC3E,SAAS;CAET,YACE,OACA,SAGA;AACA,QAAM,MAAM;AAJH,OAAA,UAAA;;CAOX,QAAQ,KAAsB;AAC5B,MAAI,YAAY,KAAK,QAAQ;EAC7B,MAAM,EAAE,OAAO,WAAW,IAAI,YAAY,KAAK,MAAM;AACrD,UAAQ,KAAK,QAAQ,WAArB;GACE,KAAK;AACH,UAAA,SAAe,IAAI,iBAAiB,SAAS;AAC7C;GACF,KAAK;AACH,UAAA,QAAc,IAAI,iBAAiB;AACnC;GACF,QACE,OAAA,QAAc;;AAElB,SAAO;GACL,OAAO,IAAI;GACX;GACD;;CAGH,KAAK,KAAiB,GAAW,GAAoB;AACnD,MAAI,YAAY,KAAK,QAAQ;AAC7B,SAAO,KAAK,MAAM,KAAK,KAAK,IAAI,MAAA,OAAa,EAAE;;CAGjD,QAAQ,KAAiB,MAAwB;AAC/C,MAAI,YAAY,KAAK,QAAQ;EAC7B,MAAM,EAAE,UAAU,QAAQ,IAAI,CAAC,YAAY,KAAK,MAAM;AACtD,MAAI,KAAK,KAAK,IAAI,MAAA,SAAe,KAAK,IAAI,MAAA,QAAc,MACtD,QAAO,KAAK,MAAM,QAChB,QAAQ,IAAI,EACZ,aAAa,MAAM,EACjB,GAAG,KAAK,IAAI,MAAA,OACb,CAAC,CACH;AAEH,SAAO;;;AAIX,IAAa,gBAAb,MAAkF;CAChF,SAAS;CACT,SAAuB,EAAE;CAEzB,YACE,MACA,SAMA;AAPS,OAAA,OAAA;AACA,OAAA,UAAA;;CAQX,IAAI,OAAgB;AAClB,SAAO;;CAGT,QAAQ,KAAsB;AAC5B,SAAO,IAAI,MAAM,MAAM;AACrB,KAAE,OAAO,KAAK,QAAQ;GACtB,MAAM,EAAE,OAAO,UAAU,WAAW,KAAK,KAAK,MAAM,IAAI,eAAe;AACvE,SAAA,QAAc;AACd,SAAA,QAAc;AACd,UAAO;IAAE,OAAO,MAAA;IAAa,QAAQ,MAAA,MAAY,SAAS,KAAK,QAAQ;IAAY;IACnF;;CAGJ,KAAK,KAAiB,GAAW,GAAoB;AACnD,SAAO,IAAI,MAAM,MAAM;AACrB,KAAE,OAAO,KAAK,QAAQ;AACtB,KAAE,YAAY,IAAI,gBAAgB,KAAK,QAAQ,MAAM;AACrD,WAAQ,KAAK,QAAQ,WAArB;IACE,KAAK;AACH,UAAK,MAAM,EAAE,MAAM,WAAW,MAAA,OAAa;AACzC,QAAE,SAAS,MAAM,GAAG,KAAK,KAAK,QAAQ,aAAa,SAAS,EAAE;AAC9D,WAAK,KAAK,QAAQ;;AAEpB;IACF,KAAK;AACH,UAAK,MAAA;AACL,OAAE,YAAY;AACd,UAAK,MAAM,EAAE,MAAM,WAAW,MAAA,OAAa;AACzC,QAAE,SAAS,MAAM,GAAG,KAAK,KAAK,QAAQ,aAAa,SAAS,EAAE;AAC9D,WAAK,KAAK,QAAQ;;AAEpB;IACF,KAAK;AACH,UAAK,MAAA,QAAc;AACnB,OAAE,YAAY;AACd,UAAK,MAAM,EAAE,MAAM,WAAW,MAAA,OAAa;AACzC,QAAE,SAAS,MAAM,GAAG,KAAK,KAAK,QAAQ,aAAa,SAAS,EAAE;AAC9D,WAAK,KAAK,QAAQ;;AAEpB;;AAEJ,UAAO;IACP;;CAGJ,QAAQ,MAAkB,OAAyB;AACjD,SAAO;;;AAIX,IAAa,OAAb,MAAyE;CACvE,SAAS;CACT,QAAQ;CACR,SAAS;CAET,YACE,MACA,SAKA;AANS,OAAA,OAAA;AACA,OAAA,UAAA;;CAOX,IAAI,OAAgB;AAClB,SAAO;;CAGT,QAAQ,KAAsB;AAC5B,SAAO,IAAI,MAAM,MAAM;AACrB,KAAE,OAAO,KAAK,QAAQ;GACtB,MAAM,EAAE,OAAO,MAAM,UAAU,gBAAgB,KAAK,KAAK,MAAM,IAAI,eAAe;AAClF,SAAA,QAAc;AACd,SAAA,OAAa;AACb,SAAA,QAAc;AACd,UAAO;IAAE,OAAO,MAAA;IAAa,QAAQ,KAAK,QAAQ;IAAY;IAC9D;;CAGJ,KAAK,KAAiB,GAAW,GAAoB;AACnD,SAAO,IAAI,MAAM,MAAM;AACrB,KAAE,OAAO,KAAK,QAAQ;AACtB,KAAE,YAAY,IAAI,gBAAgB,KAAK,QAAQ,MAAM;AACrD,KAAE,SAAS,MAAA,MAAY,GAAG,KAAK,KAAK,QAAQ,aAAa,MAAA,SAAe,EAAE;AAC1E,UAAO;IACP;;CAGJ,QAAQ,MAAkB,OAAyB;AACjD,SAAO;;;AAIX,IAAa,QAAb,MAA0E;CACxE,YACE,OACA,QACA;AAFS,OAAA,QAAA;AACA,OAAA,SAAA;;CAGX,IAAI,OAAgB;AAClB,SAAO;;CAGT,QAAQ,MAAuB;AAC7B,SAAO;GAAE,OAAO,KAAK;GAAO,QAAQ,KAAK;GAAQ;;CAGnD,KAAK,MAAkB,IAAY,IAAqB;AACtD,SAAO;;CAGT,QAAQ,MAAkB,OAAyB;AACjD,SAAO;;;;;AC5gBX,IAAa,eAAb,MAAiF;CAC/E;CACA;CACA;CACA,yBAAS,IAAI,SAAuB;CAEpC,IAAc,UAAsB;AAClC,SAAO,QAAQ,MAAA,IAAU;;CAG3B,YACE,UACA,SACA;AADS,OAAA,UAAA;AAET,OAAK,WAAW;AAChB,OAAK,SAAS,gBAAgB;EAC9B,MAAM,OAAO;AACb,QAAA,MAAY;GACV,UAAU,KAAK;GACf,IAAI,iBAAiB;AACnB,WAAO,KAAK,SAAS,OAAO;;GAE9B,IAAI,eAAe,OAAe;AAChC,WAAO,eAAe,MAAM,kBAAkB;KAAE;KAAO,UAAU;KAAM,CAAC;;GAE1E,WAAW;GACX,SAAS;GACT,YAAY,MAAe;AACzB,WAAO,KAAK,YAAY,MAAM,KAAK;;GAErC,gBAAgB,KAAK,eAAe,KAAK,KAAK;GAC9C,gBAAmB,OAA0B;AAC3C,QAAI,OAAO,UAAU,WACnB,QAAO,MAAM,KAAK,SAAS;AAE7B,WAAO;;GAET,KAAQ,IAAoB;AAC1B,SAAK,SAAS,MAAM;AACpB,QAAI;AACF,YAAO,GAAG,KAAK,SAAS;cAChB;AACR,UAAK,SAAS,SAAS;;;GAG5B;AACD,QAAA,YAAkB,KAAK,SAAS,OAAO;;CAGzC,eAAe,MAAqB;AAClC,QAAA,MAAY,OAAO,KAAK;EACxB,IAAI,KAA0B;AAC9B,SAAQ,KAAK,cAAc,GAAG,CAC5B,OAAA,MAAY,OAAO,GAAG;;CAI1B,YAAY,MAAe,KAAuB;AAChD,MAAI,MAAA,cAAoB,KAAK,SAAS,OAAO,aAAa;AACxD,SAAA,wBAAc,IAAI,SAAuB;AACzC,SAAA,YAAkB,KAAK,SAAS,OAAO;SAClC;GACL,MAAM,SAAS,MAAA,MAAY,IAAI,KAAK;AACpC,OAAI,UAAU,KACZ,QAAO;;EAGX,MAAM,SAAS,KAAK,QAAQ,OAAO,KAAK,QAAQ;AAChD,QAAA,MAAY,IAAI,MAAM,OAAO;AAC7B,SAAO;;;AAIX,IAAa,gBAAb,cAAuE,aAAgB;CACrF,KAAK,MAAwB;EAC3B,MAAM,EAAE,aAAa,eAAe,cAAc,mBAAmB,KAAK,SAAS;AACnF,OAAK,SAAS,UAAU,GAAG,GAAG,eAAe,eAAe;AAC5D,SAAO,KAAK,KAAK,KAAK,SAAS,GAAG,EAAE;;CAGtC,QAAQ,MAAe,MAAwB;AAC7C,SAAO,KAAK,QAAQ,KAAK,SAAS,KAAK;;;AAI3C,SAAgB,eACd,YACyD;CACzD,MAAM,wBAAQ,IAAI,SAA0B;CAE5C,SAAS,GAAG,MAAkB;EAC5B,MAAM,MAAM;EACZ,MAAM,SAAS,MAAM,IAAI,IAAI;AAC7B,MAAI,UAAU,KACZ,QAAO;EAET,MAAM,SAAS,WAAW,KAAK;AAC/B,QAAM,IAAI,KAAK,OAAO;AACtB,SAAO;;AAGT,QAAO,OAAO,OAAO,IAAI,EACvB,QAAQ,QAAW,MAAM,OAAO,IAAyB,EAC1D,CAAC;;AAGJ,IAAa,YAAb,MAAqC;CACnC,SAAS;CACT,WAAW;CACX,QAAa,EAAE;CAEf,QAAQ,GAAG,OAAkB;AAC3B,OAAK,WAAW,MAAM;;CAGxB,WAAW,OAAkB;AAC3B,OAAK,YAAY,MAAM;AACvB,OAAK,QAAQ,MAAM,OAAO,KAAK,MAAM;;CAGvC,KAAK,GAAG,OAAkB;AACxB,OAAK,QAAQ,MAAM;;CAGrB,QAAQ,OAAkB;AACxB,OAAK,MAAM,KAAK,GAAG,MAAM;;CAG3B,QAAc;AACZ,OAAK,QAAQ,EAAE;AACf,OAAK,SAAS;AACd,OAAK,WAAW;;CAGlB,cAAoB;AAClB,OAAK,SAAS;AACd,OAAK,WAAW;;CAGlB,YAAY,OAAqB;AAC/B,OAAK,UAAU;;;AA+BnB,SAAS,MAAM,OAAe,KAAa,KAAqB;AAC9D,QAAO,KAAK,IAAI,KAAK,IAAI,OAAO,IAAI,EAAE,IAAI;;AAG5C,SAAS,UAAU,OAAwB,UAAkB,QAAyB;AACpF,QAAO,OAAO,GAAG,MAAM,UAAU,SAAS,IAAI,OAAO,GAAG,MAAM,QAAQ,OAAO;;AAG/E,SAAS,WAAW,OAAuB;AACzC,QAAO,QAAQ,SAAS,IAAI,IAAI;;AAGlC,SAAS,SAAiB;AACxB,QAAO,WAAW,aAAa,KAAK,IAAI,KAAK,KAAK;;AAGpD,IAAsB,sBAAtB,MAAsB,4BAA8E,aAMlG;CACA,OAAgB,oBAAoB;CACpC,OAAgB,oBAAoB;CACpC,OAAgB,yBAAyB;CAEzC;CACA;CAEA,IAAI,WAAmB;AACrB,SAAO,KAAK,QAAQ,KAAK;;CAG3B,IAAI,SAAS,OAAe;AAC1B,OAAK,QAAQ,KAAK,WAAW;;CAG/B,IAAI,SAAiB;AACnB,SAAO,KAAK,QAAQ,KAAK;;CAG3B,IAAI,OAAO,OAAe;AACxB,OAAK,QAAQ,KAAK,SAAS;;CAG7B,IAAI,QAAa;AACf,SAAO,KAAK,QAAQ,KAAK;;CAG3B,IAAI,MAAM,OAAY;AACpB,OAAK,QAAQ,KAAK,QAAQ;;CAM5B,OAAO,OAAe,UAAyB,EAAE,EAAQ;AACvD,MAAI,KAAK,MAAM,WAAW,GAAG;AAC3B,SAAA,qBAA2B;AAC3B;;EAGF,MAAM,cAAc,KAAK,gBAAgB,MAAM;AAC/C,OAAK,qBAAqB;EAC1B,MAAM,eAAe,KAAK,iBAAiB,YAAY;AAGvD,MAAI,EADa,QAAQ,YAAY,OACtB;AACb,SAAA,qBAA2B;AAC3B,QAAK,aAAa,aAAa;AAC/B,WAAQ,cAAc;AACtB;;EAGF,MAAM,cAAc,KAAK,aAAa;AACtC,MAAI,CAAC,OAAO,SAAS,YAAY,EAAE;AACjC,SAAA,qBAA2B;AAC3B,QAAK,aAAa,aAAa;AAC/B,WAAQ,cAAc;AACtB;;EAGF,MAAM,WAAW,MACf,QAAQ,YACN,oBAAoB,oBAClB,KAAK,IAAI,eAAe,YAAY,GAAG,oBAAoB,wBAC/D,GACA,oBAAoB,kBACrB;AAED,MAAI,YAAY,KAAK,KAAK,IAAI,eAAe,YAAY,IAAI,OAAO,SAAS;AAC3E,SAAA,qBAA2B;AAC3B,QAAK,aAAa,aAAa;AAC/B,WAAQ,cAAc;AACtB;;AAGF,QAAA,gBAAsB;GACpB;GACA;GACA,WAAW,QAAQ;GACnB;GACA,iBAAiB;GACjB,YAAY,QAAQ;GACrB;AACD,QAAA,kBAAwB;GACtB,UAAU,KAAK;GACf,QAAQ,KAAK;GACd;;CAGH,qBAA+B,UAAiC;AAC9D,MAAI,YAAY,KACd;AAEF,WAAS,SAAS;AAClB,WAAS,SAAS;AAClB,WAAS,MAAM;AACf,WAAS,MAAM;;CAGjB,0BAAoC,UAA0B,KAAa,KAAa,QAAsB;AAC5G,MAAI,CAAC,OAAO,SAAS,IAAI,IAAI,CAAC,OAAO,SAAS,OAAO,IAAI,UAAU,EACjE;EAGF,MAAM,iBAAiB,KAAK,SAAS,OAAO;EAC5C,MAAM,aAAa,MAAM,CAAC,KAAK,GAAG,OAAO;EACzC,MAAM,gBAAgB,MAAM,iBAAiB,KAAK,GAAG,OAAO;AAC5D,MAAI,iBAAiB,WACnB;EAGF,MAAM,UAAU,MAAM,aAAa;EACnC,MAAM,UAAU,MAAM,gBAAgB;AACtC,WAAS,SAAS,OAAO,MAAM,SAAS,OAAO,GAAG,MAAM,KAAK,IAAI,KAAK,SAAS,OAAO;AACtF,WAAS,SAAS,OAAO,MAAM,SAAS,OAAO,GAAG,MAAM,KAAK,IAAI,KAAK,SAAS,OAAO;AACtF,WAAS,MAAM,OAAO,MAAM,SAAS,IAAI,GAAG,UAAU,KAAK,IAAI,SAAS,SAAS,IAAI;AACrF,WAAS,MAAM,OAAO,MAAM,SAAS,IAAI,GAAG,UAAU,KAAK,IAAI,SAAS,SAAS,IAAI;;CAGvF,gBAA0B,MAAqB,OAAe,UAAoC;EAChG,IAAI,SAAS;EACb,MAAM,iBAAiB,KAAK,SAAS,OAAO;AAE5C,OAAK,MAAM,EAAE,KAAK,MAAM,QAAQ,YAAY,MAAM;GAChD,MAAM,IAAI,SAAS;AACnB,OAAI,YAAY,KACd,MAAK,0BAA0B,UAAU,KAAK,GAAG,OAAO;AAE1D,OAAI,IAAI,SAAS,KAAK,IAAI,eACxB;AAEF,OAAI,KAAK,KAAK,KAAK,SAAS,GAAG,EAAE,CAC/B,UAAS;;AAIb,SAAO;;CAGT,iBAAoC;EAClC,MAAM,YAAY,MAAA;AAClB,MAAI,aAAa,KACf,QAAO;AAET,MAAI,KAAK,MAAM,WAAW,GAAG;AAC3B,SAAA,qBAA2B;AAC3B,UAAO;;AAET,MAAI,MAAA,mBAAyB,QAAQ,CAAC,UAAU,MAAA,iBAAuB,KAAK,UAAU,KAAK,OAAO,EAAE;AAClG,SAAA,qBAA2B;AAC3B,UAAO;;EAGT,MAAM,WAAW,OAAO,QAAQ,GAAG,UAAU,aAAa,UAAU,UAAU,GAAG,EAAE;EACnF,MAAM,QAAQ,YAAY,IAAI,IAAI,WAAW,SAAS;EACtD,MAAM,SAAS,UAAU,eAAe,UAAU,eAAe,UAAU,eAAe;AAC1F,OAAK,aAAa,OAAO;AACzB,YAAU,kBAAkB,WAAW;AACvC,SAAO,UAAU;;CAGnB,cAAwB,eAAiC;EACvD,MAAM,YAAY,MAAA;AAClB,MAAI,aAAa,KACf,QAAO;AAGT,MAAI,UAAU,iBAAiB;AAC7B,SAAA,kBAAwB;IACtB,UAAU,KAAK;IACf,QAAQ,KAAK;IACd;AACD,UAAO;;EAGT,MAAM,aAAa,UAAU;AAC7B,QAAA,qBAA2B;AAC3B,gBAAc;AACd,SAAO,iBAAiB,MAAA,iBAAuB;;CAGjD,gBAA0B,OAAuB;AAC/C,SAAO,MAAM,OAAO,SAAS,MAAM,GAAG,KAAK,MAAM,MAAM,GAAG,GAAG,GAAG,KAAK,MAAM,SAAS,EAAE;;CAGxF,eAAyB,OAAuB;EAC9C,MAAM,OAAO,KAAK,MAAM;EACxB,MAAM,OAAO,KAAK,QAAQ,WAAW,KAAK;AAC1C,SAAO,KAAK,YAAY,KAAK,CAAC;;CAQhC,uBAA6B;AAC3B,QAAA,gBAAsB,KAAA;AACtB,QAAA,kBAAwB,KAAA;;;AAI5B,IAAa,mBAAb,cAAwF,oBAA0B;CAChH,sBAAsC;AACpC,MAAI,KAAK,MAAM,WAAW,EACxB;AAEF,MAAI,CAAC,OAAO,SAAS,KAAK,SAAS,EAAE;AACnC,QAAK,WAAW;AAChB,QAAK,SAAS;AACd;;AAEF,OAAK,WAAW,KAAK,gBAAgB,KAAK,SAAS;AACnD,MAAI,CAAC,OAAO,SAAS,KAAK,OAAO,CAC/B,MAAK,SAAS;;CAIlB,cAAgC;AAC9B,OAAK,qBAAqB;AAC1B,MAAI,KAAK,MAAM,WAAW,EACxB,QAAO;EAET,MAAM,SAAS,KAAK,eAAe,KAAK,SAAS;AACjD,SAAO,SAAS,IAAI,KAAK,WAAW,KAAK,SAAS,SAAS,KAAK;;CAGlE,aAAuB,QAAsB;AAC3C,MAAI,KAAK,MAAM,WAAW,EACxB;EAEF,MAAM,gBAAgB,MAAM,QAAQ,GAAG,KAAK,MAAM,OAAO;EACzD,MAAM,WAAW,MAAM,KAAK,MAAM,cAAc,EAAE,GAAG,KAAK,MAAM,SAAS,EAAE;EAC3E,MAAM,SAAS,KAAK,eAAe,SAAS;AAC5C,OAAK,WAAW;EAChB,MAAM,SAAS,SAAS,IAAI,EAAE,gBAAgB,YAAY,SAAS;AACnE,OAAK,SAAS,OAAO,GAAG,QAAQ,GAAG,GAAG,IAAI;;CAG5C,iBAA2B,OAAuB;AAChD,SAAO;;CAGT,OAAO,UAAoC;EACzC,MAAM,gBAAgB,KAAK,gBAAgB;EAC3C,MAAM,EAAE,aAAa,eAAe,cAAc,mBAAmB,KAAK,SAAS;AACnF,OAAK,SAAS,UAAU,GAAG,GAAG,eAAe,eAAe;AAC5D,OAAK,qBAAqB,SAAS;EAEnC,IAAI,aAAa;AACjB,MAAI,OAAO,MAAM,KAAK,SAAS,CAC7B,MAAK,WAAW;AAGlB,MAAI,KAAK,SAAS,EAChB,KAAI,KAAK,aAAa,EACpB,MAAK,SAAS;OACT;AACL,QAAK,IAAI,IAAI,KAAK,WAAW,GAAG,KAAK,GAAG,KAAK,GAAG;IAC9C,MAAM,OAAO,KAAK,MAAM;IACxB,MAAM,OAAO,KAAK,QAAQ,WAAW,KAAK;IAC1C,MAAM,EAAE,WAAW,KAAK,YAAY,KAAK;AACzC,SAAK,WAAW;AAChB,SAAK,UAAU;AACf,QAAI,KAAK,UAAU,EACjB;;AAGJ,OAAI,KAAK,aAAa,KAAK,KAAK,SAAS,EACvC,MAAK,SAAS;;EAKpB,IAAI,IAAI,KAAK;EACb,MAAM,WAA0B,EAAE;AAClC,OAAK,IAAI,IAAI,KAAK,UAAU,IAAI,KAAK,MAAM,QAAQ,KAAK,GAAG;GACzD,MAAM,OAAO,KAAK,MAAM;GACxB,MAAM,OAAO,KAAK,QAAQ,WAAW,KAAK;GAC1C,MAAM,EAAE,WAAW,KAAK,YAAY,KAAK;AACzC,OAAI,IAAI,SAAS,GAAG;AAClB,aAAS,KAAK;KAAE,KAAK;KAAG;KAAM,QAAQ;KAAG;KAAQ,CAAC;AAClD,kBAAc;UACT;AACL,SAAK,UAAU;AACf,SAAK,WAAW,IAAI;;AAEtB,QAAK;AACL,OAAI,KAAK,eACP;;EAIJ,IAAI,QAAQ;AACZ,MAAI,IAAI,eACN,KAAI,KAAK,aAAa,KAAK,aAAa,gBAAgB;AACtD,WAAQ,CAAC,KAAK;AACd,QAAK,SAAS;SACT;AACL,WAAQ,iBAAiB;AACzB,OAAK,KAAK,UAAU;GACpB,IAAI,UAAU;AACd,QAAK,IAAI,IAAI,KAAK,WAAW,GAAG,KAAK,GAAG,KAAK,GAAG;IAC9C,MAAM,OAAO,KAAK,MAAO,UAAU;IACnC,MAAM,OAAO,KAAK,QAAQ,WAAW,KAAK;IAC1C,MAAM,EAAE,WAAW,KAAK,YAAY,KAAK;AACzC,kBAAc;AACd,SAAK;AACL,aAAS,KAAK;KAAE,KAAK;KAAG;KAAM,QAAQ,IAAI;KAAO;KAAQ,CAAC;AAC1D,QAAI,IAAI,EACN;;AAGJ,OAAI,YAAY,KAAK,aAAa,gBAAgB;AAChD,YAAQ,CAAC,SAAS,SAAS,SAAS,GAAG;AACvC,SAAK,WAAW;AAChB,SAAK,SAAS;;;EAKpB,MAAM,gBAAgB,KAAK,gBAAgB,UAAU,OAAO,SAAS;AACrE,SAAO,KAAK,cAAc,iBAAiB,cAAc;;CAG3D,QAAQ,MAAwB;EAC9B,MAAM,iBAAiB,KAAK,SAAS,OAAO;EAC5C,IAAI,IAAI,KAAK;AAEb,OAAK,IAAI,IAAI,KAAK,UAAU,IAAI,KAAK,MAAM,QAAQ,KAAK,GAAG;GACzD,MAAM,OAAO,KAAK,MAAM;GACxB,MAAM,OAAO,KAAK,QAAQ,WAAW,KAAK;GAC1C,MAAM,EAAE,WAAW,KAAK,YAAY,KAAK;AACzC,OAAI,KAAK,IAAI,IAAI,OACf,QAAO,KAAK,QACV,KAAK,SACL,aAAa,MAAM,EACjB,GAAG,KAAK,IAAI,GACb,CAAC,CACH;AAEH,QAAK;AACL,OAAI,KAAK,eACP;;AAGJ,SAAO;;;AAIX,IAAa,eAAb,cAAoF,oBAA0B;CAC5G,sBAAsC;AACpC,MAAI,KAAK,MAAM,WAAW,EACxB;AAEF,MAAI,CAAC,OAAO,SAAS,KAAK,SAAS,EAAE;AACnC,QAAK,WAAW,KAAK,MAAM,SAAS;AACpC,QAAK,SAAS;AACd;;AAEF,OAAK,WAAW,KAAK,gBAAgB,KAAK,SAAS;AACnD,MAAI,CAAC,OAAO,SAAS,KAAK,OAAO,CAC/B,MAAK,SAAS;;CAIlB,cAAgC;AAC9B,OAAK,qBAAqB;AAC1B,MAAI,KAAK,MAAM,WAAW,EACxB,QAAO;EAET,MAAM,SAAS,KAAK,eAAe,KAAK,SAAS;AACjD,SAAO,SAAS,IAAI,KAAK,WAAW,IAAI,KAAK,SAAS,SAAS,KAAK,WAAW;;CAGjF,aAAuB,QAAsB;AAC3C,MAAI,KAAK,MAAM,WAAW,EACxB;EAEF,MAAM,gBAAgB,MAAM,QAAQ,GAAG,KAAK,MAAM,OAAO;EACzD,MAAM,WAAW,MAAM,KAAK,KAAK,cAAc,GAAG,GAAG,GAAG,KAAK,MAAM,SAAS,EAAE;EAC9E,MAAM,SAAS,KAAK,eAAe,SAAS;AAC5C,OAAK,WAAW;EAChB,MAAM,SAAS,SAAS,KAAK,WAAW,IAAI,iBAAiB,SAAS;AACtE,OAAK,SAAS,OAAO,GAAG,QAAQ,GAAG,GAAG,IAAI;;CAG5C,iBAA2B,OAAuB;AAChD,SAAO,QAAQ;;CAGjB,OAAO,UAAoC;EACzC,MAAM,gBAAgB,KAAK,gBAAgB;EAC3C,MAAM,EAAE,aAAa,eAAe,cAAc,mBAAmB,KAAK,SAAS;AACnF,OAAK,SAAS,UAAU,GAAG,GAAG,eAAe,eAAe;AAC5D,OAAK,qBAAqB,SAAS;EAEnC,IAAI,aAAa;AACjB,MAAI,OAAO,MAAM,KAAK,SAAS,CAC7B,MAAK,WAAW,KAAK,MAAM,SAAS;AAGtC,MAAI,KAAK,SAAS,EAChB,KAAI,KAAK,aAAa,KAAK,MAAM,SAAS,EACxC,MAAK,SAAS;MAEd,MAAK,IAAI,IAAI,KAAK,WAAW,GAAG,IAAI,KAAK,MAAM,QAAQ,KAAK,GAAG;GAC7D,MAAM,OAAO,KAAK,MAAM;GACxB,MAAM,OAAO,KAAK,QAAQ,WAAW,KAAK;GAC1C,MAAM,EAAE,WAAW,KAAK,YAAY,KAAK;AACzC,QAAK,WAAW;AAChB,QAAK,UAAU;AACf,OAAI,KAAK,SAAS,EAChB;;EAMR,IAAI,IAAI,iBAAiB,KAAK;EAC9B,MAAM,WAA0B,EAAE;AAClC,OAAK,IAAI,IAAI,KAAK,UAAU,KAAK,GAAG,KAAK,GAAG;GAC1C,MAAM,OAAO,KAAK,MAAM;GACxB,MAAM,OAAO,KAAK,QAAQ,WAAW,KAAK;GAC1C,MAAM,EAAE,WAAW,KAAK,YAAY,KAAK;AACzC,QAAK;AACL,OAAI,KAAK,gBAAgB;AACvB,aAAS,KAAK;KAAE,KAAK;KAAG;KAAM,QAAQ;KAAG;KAAQ,CAAC;AAClD,kBAAc;UACT;AACL,SAAK,UAAU;AACf,SAAK,WAAW,IAAI;;AAEtB,OAAI,IAAI,EACN;;EAIJ,IAAI,QAAQ;AACZ,MAAI,IAAI,GAAG;AACT,WAAQ,CAAC;AACT,OAAI,aAAa,gBAAgB;AAC/B,QAAI;AACJ,SAAK,IAAI,IAAI,KAAK,WAAW,GAAG,IAAI,KAAK,MAAM,QAAQ,KAAK,GAAG;KAC7D,MAAM,OAAO,KAAK,MAAM;KACxB,MAAM,OAAO,KAAK,QAAQ,WAAW,KAAK;KAC1C,MAAM,EAAE,WAAW,KAAK,YAAY,KAAK;AACzC,cAAS,KAAK;MAAE,KAAK;MAAG;MAAM,QAAQ,IAAI;MAAO;MAAQ,CAAC;AAC1D,SAAK,cAAc;AACnB,UAAK,WAAW;AAChB,SAAI,KAAK,eACP;;AAGJ,QAAI,aAAa,eACf,MAAK,SAAS;QAEd,MAAK,SAAS,aAAa;SAG7B,MAAK,SAAS,aAAa;;EAI/B,MAAM,gBAAgB,KAAK,gBAAgB,UAAU,OAAO,SAAS;AACrE,SAAO,KAAK,cAAc,iBAAiB,cAAc;;CAG3D,QAAQ,MAAwB;EAC9B,MAAM,iBAAiB,KAAK,SAAS,OAAO;EAE5C,IAAI,aAAa;EACjB,MAAM,UAA6C,EAAE;AACrD,OAAK,IAAI,IAAI,KAAK,UAAU,KAAK,GAAG,KAAK,GAAG;GAC1C,MAAM,OAAO,KAAK,MAAM;GACxB,MAAM,OAAO,KAAK,QAAQ,WAAW,KAAK;GAC1C,MAAM,EAAE,WAAW,KAAK,YAAY,KAAK;AACzC,iBAAc;AACd,WAAQ,KAAK,CAAC,MAAM,OAAO,CAAC;;EAG9B,IAAI,IAAI,aAAa,iBAAiB,aAAa,iBAAiB,KAAK;AACzE,MAAI,KAAK,IAAI,EACX,QAAO;AAGT,OAAK,MAAM,CAAC,MAAM,WAAW,SAAS;AACpC,QAAK;AACL,OAAI,KAAK,IAAI,EACX,QAAO,KAAK,QACV,KAAK,SACL,aAAa,MAAM,EACjB,GAAG,KAAK,IAAI,GACb,CAAC,CACH;;AAGL,SAAO"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["#children","#inner","clampToConstraints","#top","#bottom","#left","#right","#ctx","#lastWidth","#cache","#layoutCache","#textLayoutCache","#clearAllCaches","#syncCachesToViewportWidth","clamp","#cancelJumpAnimation","#jumpAnimation","#controlledState","clamp","clamp","#resolveVisibleWindow","#resolveVisibleWindow"],"sources":["../src/internal/node-registry.ts","../src/nodes/base.ts","../src/layout.ts","../src/utils.ts","../src/nodes/shared.ts","../src/nodes/box.ts","../src/nodes/flex.ts","../src/nodes/place.ts","../src/text.ts","../src/nodes/text.ts","../src/renderer/base.ts","../src/renderer/list-state.ts","../src/renderer/memo.ts","../src/renderer/virtualized/base.ts","../src/renderer/virtualized/solver.ts","../src/renderer/virtualized/chat.ts","../src/renderer/virtualized/timeline.ts"],"sourcesContent":["import type { Node } from \"../types\";\n\nconst registry = new WeakMap<Node<any>, Node<any>>();\nconst revisions = new WeakMap<Node<any>, number>();\n\nfunction getOwnershipError(): Error {\n return new Error(\"A node can only be attached to one parent. Shared nodes are not supported.\");\n}\n\nfunction getDetachOwnershipError(): Error {\n return new Error(\"Cannot detach or replace a node from a parent that does not own it.\");\n}\n\nfunction bumpRevision(node: Node<any>): void {\n revisions.set(node, (revisions.get(node) ?? 0) + 1);\n}\n\nexport function getNodeRevision<C extends CanvasRenderingContext2D>(node: Node<C>): number {\n return revisions.get(node) ?? 0;\n}\n\nexport function attachNodeToParent<C extends CanvasRenderingContext2D>(\n node: Node<C>,\n parent: Node<C>,\n): void {\n if (registry.has(node)) {\n throw getOwnershipError();\n }\n registry.set(node, parent);\n bumpRevision(parent);\n}\n\nexport function attachNodesToParent<C extends CanvasRenderingContext2D>(\n nodes: Iterable<Node<C>>,\n parent: Node<C>,\n): void {\n for (const node of nodes) {\n attachNodeToParent(node, parent);\n }\n}\n\nexport function detachNodeFromParent<C extends CanvasRenderingContext2D>(\n node: Node<C>,\n parent?: Node<C>,\n): void {\n const currentParent = registry.get(node);\n if (currentParent == null) {\n return;\n }\n if (parent != null && currentParent !== parent) {\n throw getDetachOwnershipError();\n }\n registry.delete(node);\n bumpRevision(currentParent);\n}\n\nexport function replaceNodeParent<C extends CanvasRenderingContext2D>(\n previousNode: Node<C>,\n nextNode: Node<C>,\n parent: Node<C>,\n): void {\n if (previousNode === nextNode) {\n return;\n }\n const currentParent = registry.get(previousNode);\n if (currentParent !== parent) {\n throw getDetachOwnershipError();\n }\n if (registry.has(nextNode)) {\n throw getOwnershipError();\n }\n registry.delete(previousNode);\n registry.set(nextNode, parent);\n bumpRevision(parent);\n}\n\nexport function replaceNodesParent<C extends CanvasRenderingContext2D>(\n previousNodes: Iterable<Node<C>>,\n nextNodes: Iterable<Node<C>>,\n parent: Node<C>,\n): void {\n const previousSnapshot = Array.from(previousNodes);\n const nextSnapshot = Array.from(nextNodes);\n if (\n previousSnapshot.length === nextSnapshot.length &&\n previousSnapshot.every((node, index) => node === nextSnapshot[index])\n ) {\n return;\n }\n\n const previousSet = new Set(previousSnapshot);\n const nextSet = new Set<Node<C>>();\n for (const node of nextSnapshot) {\n if (nextSet.has(node)) {\n throw getOwnershipError();\n }\n nextSet.add(node);\n const currentParent = registry.get(node);\n if (currentParent != null && currentParent !== parent) {\n throw getOwnershipError();\n }\n }\n\n for (const node of previousSnapshot) {\n if (!nextSet.has(node)) {\n const currentParent = registry.get(node);\n if (currentParent !== parent) {\n throw getDetachOwnershipError();\n }\n registry.delete(node);\n }\n }\n\n for (const node of nextSnapshot) {\n if (!previousSet.has(node)) {\n registry.set(node, parent);\n }\n }\n\n bumpRevision(parent);\n}\n\nexport function forEachNodeAncestor<C extends CanvasRenderingContext2D>(\n node: Node<C>,\n visitor: (ancestor: Node<C>) => void,\n): void {\n let current: Node<C> | undefined = node;\n while ((current = registry.get(current))) {\n visitor(current);\n }\n}\n\nexport function registerNodeParent<C extends CanvasRenderingContext2D>(\n node: Node<C>,\n parent: Node<C>,\n): void {\n attachNodeToParent(node, parent);\n}\n\nexport function unregisterNodeParent<C extends CanvasRenderingContext2D>(node: Node<C>, parent?: Node<C>): void {\n detachNodeFromParent(node, parent);\n}\n\nexport function getNodeParent<C extends CanvasRenderingContext2D>(node: Node<C>): Node<C> | undefined {\n return registry.get(node);\n}\n","import { attachNodeToParent, replaceNodeParent, replaceNodesParent } from \"../internal/node-registry\";\nimport type { Box, Context, HitTest, Node } from \"../types\";\n\nexport abstract class Group<C extends CanvasRenderingContext2D> implements Node<C> {\n #children: Node<C>[];\n\n constructor(children: Node<C>[]) {\n this.#children = [...children];\n replaceNodesParent([], this.#children, this);\n }\n\n get children(): readonly Node<C>[] {\n return this.#children;\n }\n\n replaceChildren(nextChildren: Node<C>[]): void {\n const nextSnapshot = [...nextChildren];\n replaceNodesParent(this.#children, nextSnapshot, this);\n this.#children = nextSnapshot;\n }\n\n abstract measure(ctx: Context<C>): Box;\n abstract draw(ctx: Context<C>, x: number, y: number): boolean;\n abstract hittest(ctx: Context<C>, test: HitTest): boolean;\n}\n\nexport class Wrapper<C extends CanvasRenderingContext2D> implements Node<C> {\n #inner: Node<C>;\n\n constructor(inner: Node<C>) {\n this.#inner = inner;\n attachNodeToParent(this.#inner, this);\n }\n\n get inner(): Node<C> {\n return this.#inner;\n }\n\n set inner(newNode: Node<C>) {\n if (newNode === this.#inner) {\n return;\n }\n replaceNodeParent(this.#inner, newNode, this);\n this.#inner = newNode;\n }\n\n measure(ctx: Context<C>): Box {\n return this.inner.measure(ctx);\n }\n\n draw(ctx: Context<C>, x: number, y: number): boolean {\n return this.inner.draw(ctx, x, y);\n }\n\n hittest(ctx: Context<C>, test: HitTest): boolean {\n return this.inner.hittest(ctx, test);\n }\n}\n","import type { Box, ChildLayoutResult, FlexLayoutResult, LayoutConstraints, LayoutRect } from \"./types\";\n\n/**\n * 创建 LayoutRect 的辅助函数\n */\nexport function createRect(x: number, y: number, width: number, height: number): LayoutRect {\n return { x, y, width, height };\n}\n\n/**\n * 合并多个 rect 得到包含所有 rect 的最小外接矩形\n */\nexport function mergeRects(rects: LayoutRect[]): LayoutRect {\n if (rects.length === 0) {\n return createRect(0, 0, 0, 0);\n }\n\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n for (const rect of rects) {\n minX = Math.min(minX, rect.x);\n minY = Math.min(minY, rect.y);\n maxX = Math.max(maxX, rect.x + rect.width);\n maxY = Math.max(maxY, rect.y + rect.height);\n }\n\n return createRect(minX, minY, maxX - minX, maxY - minY);\n}\n\n/**\n * 从子节点布局结果计算容器的 contentBox\n */\nexport function computeContentBox<C extends CanvasRenderingContext2D>(\n children: ChildLayoutResult<C>[],\n): LayoutRect {\n return mergeRects(children.map((child) => child.contentBox));\n}\n\n/**\n * 根据约束和实际内容计算最终的 containerBox\n */\nexport function computeContainerBox(\n contentBox: LayoutRect,\n constraints?: LayoutConstraints,\n): LayoutRect {\n let width = contentBox.width;\n let height = contentBox.height;\n\n if (constraints?.minWidth != null) {\n width = Math.max(width, constraints.minWidth);\n }\n if (constraints?.maxWidth != null) {\n width = Math.min(width, constraints.maxWidth);\n }\n if (constraints?.minHeight != null) {\n height = Math.max(height, constraints.minHeight);\n }\n if (constraints?.maxHeight != null) {\n height = Math.min(height, constraints.maxHeight);\n }\n\n return createRect(contentBox.x, contentBox.y, width, height);\n}\n\n/**\n * 将 Box 转换为 LayoutRect(位置为 0,0)\n */\nexport function boxToRect(box: Box): LayoutRect {\n return createRect(0, 0, box.width, box.height);\n}\n\n/**\n * 检查点是否在 rect 内\n */\nexport function pointInRect(x: number, y: number, rect: LayoutRect): boolean {\n return x >= rect.x && x < rect.x + rect.width && y >= rect.y && y < rect.y + rect.height;\n}\n\n/**\n * 平移 rect 的位置\n */\nexport function offsetRect(rect: LayoutRect, dx: number, dy: number): LayoutRect {\n return createRect(rect.x + dx, rect.y + dy, rect.width, rect.height);\n}\n\n/**\n * 读取单子节点布局结果中的唯一 child。\n */\nexport function getSingleChildLayout<C extends CanvasRenderingContext2D>(\n layout: FlexLayoutResult<C>,\n): ChildLayoutResult<C> | undefined {\n return layout.children[0];\n}\n\n/**\n * 在布局结果中按指定盒模型查找命中的 child,并返回局部坐标。\n */\nexport function findChildAtPoint<C extends CanvasRenderingContext2D>(\n children: ChildLayoutResult<C>[],\n x: number,\n y: number,\n box: \"rect\" | \"contentBox\" = \"contentBox\",\n):\n | {\n child: ChildLayoutResult<C>;\n localX: number;\n localY: number;\n }\n | undefined {\n for (let i = children.length - 1; i >= 0; i -= 1) {\n const child = children[i]!;\n const target = box === \"rect\" ? child.rect : child.contentBox;\n if (!pointInRect(x, y, target)) {\n continue;\n }\n return {\n child,\n localX: x - target.x,\n localY: y - target.y,\n };\n }\n return undefined;\n}\n","export function shallow<T extends object>(object: T): T {\n return Object.create(object) as T;\n}\n\nexport function shallowMerge<T extends object, R extends object>(object: T, other: R): T & R {\n return { __proto__: object, ...other } as unknown as T & R;\n}\n","import { findChildAtPoint } from \"../layout\";\nimport type { Context, FlexLayoutResult, HitTest, LayoutConstraints, Node } from \"../types\";\nimport { shallow, shallowMerge } from \"../utils\";\n\ntype LayoutCacheAccess<C extends CanvasRenderingContext2D> = {\n getLayoutResult(node: Node<C>, constraints?: LayoutConstraints): FlexLayoutResult<C> | undefined;\n setLayoutResult(node: Node<C>, result: FlexLayoutResult<C>, constraints?: LayoutConstraints): void;\n};\n\ntype LayoutContext<C extends CanvasRenderingContext2D> = Context<C> & LayoutCacheAccess<C>;\n\nexport function withConstraints<C extends CanvasRenderingContext2D>(\n ctx: Context<C>,\n constraints: LayoutConstraints | undefined,\n): Context<C> {\n const next = shallow(ctx);\n next.constraints = constraints;\n return next;\n}\n\nfunction getLayoutContext<C extends CanvasRenderingContext2D>(ctx: Context<C>): LayoutContext<C> {\n return ctx as LayoutContext<C>;\n}\n\nexport function readLayoutResult<C extends CanvasRenderingContext2D>(\n node: Node<C>,\n ctx: Context<C>,\n): FlexLayoutResult<C> | undefined {\n return getLayoutContext(ctx).getLayoutResult(node, ctx.constraints);\n}\n\nexport function writeLayoutResult<C extends CanvasRenderingContext2D>(\n node: Node<C>,\n ctx: Context<C>,\n result: FlexLayoutResult<C>,\n): void {\n getLayoutContext(ctx).setLayoutResult(node, result, ctx.constraints);\n}\n\nfunction ensureLayoutResult<C extends CanvasRenderingContext2D>(\n node: Node<C>,\n ctx: Context<C>,\n): FlexLayoutResult<C> | undefined {\n return readLayoutResult(node, ctx);\n}\n\nexport function drawLayoutChildren<C extends CanvasRenderingContext2D>(\n node: Node<C>,\n ctx: Context<C>,\n x: number,\n y: number,\n): boolean {\n const layoutResult = ensureLayoutResult(node, ctx);\n if (!layoutResult) {\n return false;\n }\n\n let result = false;\n for (const childResult of layoutResult.children) {\n result ||= childResult.node.draw(\n withConstraints(ctx, childResult.constraints),\n x + childResult.contentBox.x,\n y + childResult.contentBox.y,\n );\n }\n return result;\n}\n\nexport function hittestLayoutChildren<C extends CanvasRenderingContext2D>(\n node: Node<C>,\n ctx: Context<C>,\n test: HitTest,\n box: \"rect\" | \"contentBox\" = \"contentBox\",\n): boolean {\n const layoutResult = ensureLayoutResult(node, ctx);\n if (!layoutResult) {\n return false;\n }\n\n const hit = findChildAtPoint(layoutResult.children, test.x, test.y, box);\n if (!hit) {\n return false;\n }\n\n return hit.child.node.hittest(\n withConstraints(ctx, hit.child.constraints),\n shallowMerge(test, {\n x: hit.localX,\n y: hit.localY,\n }),\n );\n}\n","import { createRect, findChildAtPoint, getSingleChildLayout } from \"../layout\";\nimport type { Box, Context, HitTest, Node } from \"../types\";\nimport { shallowMerge } from \"../utils\";\nimport { Wrapper } from \"./base\";\nimport { readLayoutResult, withConstraints, writeLayoutResult } from \"./shared\";\n\nfunction clampToConstraints(value: number, min?: number, max?: number): number {\n let result = value;\n if (min != null) {\n result = Math.max(result, min);\n }\n if (max != null) {\n result = Math.min(result, max);\n }\n return result;\n}\n\nfunction shrinkConstraint(value: number | undefined, padding: number): number | undefined {\n if (value == null) {\n return undefined;\n }\n return Math.max(0, value - padding);\n}\n\nexport class PaddingBox<C extends CanvasRenderingContext2D> extends Wrapper<C> {\n constructor(\n inner: Node<C>,\n readonly padding: {\n top?: number;\n bottom?: number;\n left?: number;\n right?: number;\n } = {},\n ) {\n super(inner);\n }\n\n get #top(): number {\n return this.padding.top ?? 0;\n }\n\n get #bottom(): number {\n return this.padding.bottom ?? 0;\n }\n\n get #left(): number {\n return this.padding.left ?? 0;\n }\n\n get #right(): number {\n return this.padding.right ?? 0;\n }\n\n measure(ctx: Context<C>): Box {\n const paddingLeft = this.#left;\n const paddingRight = this.#right;\n const paddingTop = this.#top;\n const paddingBottom = this.#bottom;\n const horizontalPadding = paddingLeft + paddingRight;\n const verticalPadding = paddingTop + paddingBottom;\n const childConstraints = ctx.constraints\n ? {\n ...ctx.constraints,\n minWidth: shrinkConstraint(ctx.constraints.minWidth, horizontalPadding),\n maxWidth: shrinkConstraint(ctx.constraints.maxWidth, horizontalPadding),\n minHeight: shrinkConstraint(ctx.constraints.minHeight, verticalPadding),\n maxHeight: shrinkConstraint(ctx.constraints.maxHeight, verticalPadding),\n }\n : undefined;\n const { width, height } = ctx.measureNode(this.inner, childConstraints);\n const containerBox = createRect(\n 0,\n 0,\n clampToConstraints(width + horizontalPadding, ctx.constraints?.minWidth, ctx.constraints?.maxWidth),\n clampToConstraints(height + verticalPadding, ctx.constraints?.minHeight, ctx.constraints?.maxHeight),\n );\n const childRect = createRect(paddingLeft, paddingTop, width, height);\n writeLayoutResult(this, ctx, {\n containerBox,\n contentBox: childRect,\n children: [\n {\n node: this.inner,\n rect: childRect,\n contentBox: childRect,\n constraints: childConstraints,\n },\n ],\n constraints: ctx.constraints,\n });\n return {\n width: containerBox.width,\n height: containerBox.height,\n };\n }\n\n draw(ctx: Context<C>, x: number, y: number): boolean {\n const layoutResult = readLayoutResult(this, ctx);\n if (!layoutResult) {\n return this.inner.draw(ctx, x + this.#left, y + this.#top);\n }\n\n const childResult = getSingleChildLayout(layoutResult);\n if (!childResult) {\n return false;\n }\n\n return childResult.node.draw(\n withConstraints(ctx, childResult.constraints),\n x + childResult.rect.x,\n y + childResult.rect.y,\n );\n }\n\n hittest(ctx: Context<C>, test: HitTest): boolean {\n const layoutResult = readLayoutResult(this, ctx);\n if (!layoutResult) {\n return false;\n }\n\n const hit = findChildAtPoint(layoutResult.children, test.x, test.y, \"rect\");\n if (!hit) {\n return false;\n }\n\n return hit.child.node.hittest(\n withConstraints(ctx, hit.child.constraints),\n shallowMerge(test, {\n x: hit.localX,\n y: hit.localY,\n }),\n );\n }\n}\n\nexport class Fixed<C extends CanvasRenderingContext2D> implements Node<C> {\n constructor(\n readonly width: number,\n readonly height: number,\n ) {}\n\n measure(_ctx: Context<C>): Box {\n return { width: this.width, height: this.height };\n }\n\n draw(_ctx: Context<C>, _x: number, _y: number): boolean {\n return false;\n }\n\n hittest(_ctx: Context<C>, _test: HitTest): boolean {\n return false;\n }\n}\n","import { computeContentBox, createRect } from \"../layout\";\nimport type {\n Axis,\n Box,\n ChildLayoutResult,\n Context,\n CrossAxisAlignment,\n FlexContainerOptions,\n FlexItemOptions,\n HitTest,\n LayoutConstraints,\n Node,\n} from \"../types\";\nimport { Group, Wrapper } from \"./base\";\nimport { drawLayoutChildren, hittestLayoutChildren, writeLayoutResult } from \"./shared\";\n\nfunction getMainSize(axis: Axis, box: Box): number {\n return axis === \"row\" ? box.width : box.height;\n}\n\nfunction getCrossSize(axis: Axis, box: Box): number {\n return axis === \"row\" ? box.height : box.width;\n}\n\nfunction getMinMain(axis: Axis, constraints?: LayoutConstraints): number | undefined {\n return axis === \"row\" ? constraints?.minWidth : constraints?.minHeight;\n}\n\nfunction getMaxMain(axis: Axis, constraints?: LayoutConstraints): number | undefined {\n return axis === \"row\" ? constraints?.maxWidth : constraints?.maxHeight;\n}\n\nfunction getMinCross(axis: Axis, constraints?: LayoutConstraints): number | undefined {\n return axis === \"row\" ? constraints?.minHeight : constraints?.minWidth;\n}\n\nfunction getMaxCross(axis: Axis, constraints?: LayoutConstraints): number | undefined {\n return axis === \"row\" ? constraints?.maxHeight : constraints?.maxWidth;\n}\n\nfunction createAxisConstraints(\n axis: Axis,\n constraints: LayoutConstraints | undefined,\n main: { min?: number; max?: number },\n cross: { min?: number; max?: number } = {},\n): LayoutConstraints | undefined {\n if (\n constraints == null &&\n main.min == null &&\n main.max == null &&\n cross.min == null &&\n cross.max == null\n ) {\n return undefined;\n }\n\n const next: LayoutConstraints = {\n ...constraints,\n };\n if (axis === \"row\") {\n next.minWidth = main.min;\n next.maxWidth = main.max;\n next.minHeight = cross.min;\n next.maxHeight = cross.max;\n } else {\n next.minHeight = main.min;\n next.maxHeight = main.max;\n next.minWidth = cross.min;\n next.maxWidth = cross.max;\n }\n return next;\n}\n\nfunction clampToConstraints(value: number, min?: number, max?: number): number {\n let result = value;\n if (min != null) {\n result = Math.max(result, min);\n }\n if (max != null) {\n result = Math.min(result, max);\n }\n return result;\n}\n\nfunction getCrossAlignment(alignSelf: CrossAxisAlignment | \"auto\" | undefined, alignItems: CrossAxisAlignment): CrossAxisAlignment {\n if (alignSelf == null || alignSelf === \"auto\") {\n return alignItems;\n }\n return alignSelf;\n}\n\nfunction getJustifySpacing(\n justifyContent: NonNullable<FlexContainerOptions[\"justifyContent\"]>,\n freeSpace: number,\n itemCount: number,\n gap: number,\n): { leading: number; between: number } {\n switch (justifyContent) {\n case \"center\":\n return { leading: freeSpace / 2, between: gap };\n case \"end\":\n return { leading: freeSpace, between: gap };\n case \"space-between\":\n return {\n leading: 0,\n between: itemCount > 1 ? gap + freeSpace / (itemCount - 1) : gap,\n };\n case \"space-around\":\n return {\n leading: itemCount > 0 ? freeSpace / itemCount / 2 : 0,\n between: itemCount > 0 ? gap + freeSpace / itemCount : gap,\n };\n case \"space-evenly\":\n return {\n leading: itemCount > 0 ? freeSpace / (itemCount + 1) : 0,\n between: itemCount > 0 ? gap + freeSpace / (itemCount + 1) : gap,\n };\n case \"start\":\n default:\n return { leading: 0, between: gap };\n }\n}\n\nfunction getCrossOffset(align: CrossAxisAlignment, frameCross: number, contentCross: number): number {\n switch (align) {\n case \"center\":\n return (frameCross - contentCross) / 2;\n case \"end\":\n return frameCross - contentCross;\n case \"stretch\":\n case \"start\":\n default:\n return 0;\n }\n}\n\nfunction createRectFromAxis(axis: Axis, main: number, cross: number, mainSize: number, crossSize: number) {\n return axis === \"row\"\n ? createRect(main, cross, mainSize, crossSize)\n : createRect(cross, main, crossSize, mainSize);\n}\n\ntype FlexMeasurement<C extends CanvasRenderingContext2D> = {\n child: Node<C>;\n item: FlexItemOptions;\n measured: Box;\n initialConstraints?: LayoutConstraints;\n finalConstraints?: LayoutConstraints;\n allocatedMain?: number;\n grow: number;\n effectiveAlign: CrossAxisAlignment;\n stretch: boolean;\n frameMain: number;\n frameCross: number;\n};\n\ntype MeasuredLayout<C extends CanvasRenderingContext2D> = {\n box: Box;\n layout: {\n containerBox: ChildLayoutResult<C>[\"rect\"];\n contentBox: ChildLayoutResult<C>[\"contentBox\"];\n children: ChildLayoutResult<C>[];\n constraints?: LayoutConstraints;\n };\n};\n\nfunction readFlexItemOptions<C extends CanvasRenderingContext2D>(child: Node<C>): FlexItemOptions {\n if (child instanceof FlexItem) {\n return child.item;\n }\n return {};\n}\n\nexport function computeFlexLayout<C extends CanvasRenderingContext2D>(\n children: readonly Node<C>[],\n options: FlexContainerOptions,\n constraints: LayoutConstraints | undefined,\n measureChild: (node: Node<C>, constraints?: LayoutConstraints) => Box,\n): MeasuredLayout<C> {\n const axis = options.direction ?? \"row\";\n const gap = options.gap ?? 0;\n const justifyContent = options.justifyContent ?? \"start\";\n const alignItems = options.alignItems ?? \"start\";\n const reverse = options.reverse ?? false;\n const mainAxisSize = options.mainAxisSize ?? \"fill\";\n const orderedChildren = reverse ? [...children].reverse() : children;\n const maxMain = getMaxMain(axis, constraints);\n const minMain = getMinMain(axis, constraints);\n const maxCross = getMaxCross(axis, constraints);\n const minCross = getMinCross(axis, constraints);\n const gapTotal = orderedChildren.length > 1 ? gap * (orderedChildren.length - 1) : 0;\n const finiteMain = maxMain != null;\n const finiteCross = maxCross != null;\n const availableMain = finiteMain ? Math.max(0, maxMain - gapTotal) : undefined;\n let consumedMain = 0;\n let totalGrow = 0;\n const measurements = new Map<Node<C>, FlexMeasurement<C>>();\n\n for (const child of orderedChildren) {\n const item = readFlexItemOptions(child);\n const grow = item.grow ?? 0;\n totalGrow += grow;\n if (grow > 0 && finiteMain) {\n continue;\n }\n\n const effectiveAlign = getCrossAlignment(item.alignSelf, alignItems);\n const stretch = effectiveAlign === \"stretch\";\n const childConstraints = createAxisConstraints(\n axis,\n constraints,\n {\n max: finiteMain && availableMain != null ? Math.max(0, availableMain - consumedMain) : maxMain,\n },\n {\n min: undefined,\n max: maxCross,\n },\n );\n const measured = measureChild(child, childConstraints);\n const frameMain = getMainSize(axis, measured);\n const frameCross = getCrossSize(axis, measured);\n measurements.set(child, {\n child,\n item,\n measured,\n initialConstraints: childConstraints,\n finalConstraints: childConstraints,\n allocatedMain: undefined,\n grow,\n effectiveAlign,\n stretch,\n frameMain,\n frameCross,\n });\n consumedMain += frameMain;\n }\n\n const remainingMain = finiteMain && availableMain != null ? Math.max(0, availableMain - consumedMain) : undefined;\n\n for (const child of orderedChildren) {\n if (measurements.has(child)) {\n continue;\n }\n const item = readFlexItemOptions(child);\n const grow = item.grow ?? 0;\n const effectiveAlign = getCrossAlignment(item.alignSelf, alignItems);\n const stretch = effectiveAlign === \"stretch\";\n const allocatedMain = finiteMain && remainingMain != null && totalGrow > 0 ? (remainingMain * grow) / totalGrow : undefined;\n const childConstraints = createAxisConstraints(\n axis,\n constraints,\n {\n max: allocatedMain,\n },\n {\n min: undefined,\n max: maxCross,\n },\n );\n const measured = measureChild(child, childConstraints);\n const measuredMain = getMainSize(axis, measured);\n const frameMain = allocatedMain ?? measuredMain;\n const frameCross = getCrossSize(axis, measured);\n measurements.set(child, {\n child,\n item,\n measured,\n initialConstraints: childConstraints,\n finalConstraints: childConstraints,\n allocatedMain,\n grow,\n effectiveAlign,\n stretch,\n frameMain,\n frameCross,\n });\n }\n\n let contentMain = gapTotal;\n let contentCross = 0;\n for (const child of orderedChildren) {\n const measurement = measurements.get(child)!;\n contentMain += measurement.frameMain;\n contentCross = Math.max(contentCross, measurement.frameCross);\n }\n\n const containerMain = finiteMain && mainAxisSize === \"fill\"\n ? Math.max(maxMain!, contentMain)\n : clampToConstraints(contentMain, minMain, maxMain);\n const containerCross = clampToConstraints(contentCross, minCross, maxCross);\n if (finiteCross) {\n for (const child of orderedChildren) {\n const measurement = measurements.get(child)!;\n if (!measurement.stretch) {\n continue;\n }\n\n const finalConstraints = createAxisConstraints(\n axis,\n measurement.initialConstraints,\n {\n min: getMinMain(axis, measurement.initialConstraints),\n max: getMaxMain(axis, measurement.initialConstraints),\n },\n {\n min: containerCross,\n max: containerCross,\n },\n );\n const remeasured = measureChild(child, finalConstraints);\n measurement.measured = remeasured;\n measurement.finalConstraints = finalConstraints;\n measurement.frameCross = containerCross;\n measurement.frameMain = measurement.allocatedMain ?? getMainSize(axis, remeasured);\n }\n\n contentMain = gapTotal;\n contentCross = 0;\n for (const child of orderedChildren) {\n const measurement = measurements.get(child)!;\n contentMain += measurement.frameMain;\n contentCross = Math.max(contentCross, getCrossSize(axis, measurement.measured));\n }\n }\n\n const finalContainerMain = finiteMain && mainAxisSize === \"fill\"\n ? Math.max(maxMain!, contentMain)\n : clampToConstraints(contentMain, minMain, maxMain);\n const freeSpace = Math.max(0, finalContainerMain - contentMain);\n const spacing = getJustifySpacing(justifyContent, freeSpace, orderedChildren.length, gap);\n const childResults: ChildLayoutResult<C>[] = [];\n let cursor = spacing.leading;\n\n for (const child of orderedChildren) {\n const measurement = measurements.get(child)!;\n const frameCross = measurement.stretch && finiteCross ? containerCross : measurement.frameCross;\n const contentMainSize = getMainSize(axis, measurement.measured);\n const contentCrossSize = getCrossSize(axis, measurement.measured);\n const rectCross = measurement.stretch ? 0 : getCrossOffset(measurement.effectiveAlign, containerCross, frameCross);\n const contentCrossOffset = rectCross + getCrossOffset(measurement.effectiveAlign, frameCross, contentCrossSize);\n const rect = createRectFromAxis(axis, cursor, rectCross, measurement.frameMain, frameCross);\n const contentBox = createRectFromAxis(axis, cursor, contentCrossOffset, contentMainSize, contentCrossSize);\n\n childResults.push({\n node: child,\n rect,\n contentBox,\n constraints: measurement.finalConstraints,\n });\n cursor += measurement.frameMain + spacing.between;\n }\n\n const containerBox = axis === \"row\"\n ? createRect(0, 0, finalContainerMain, containerCross)\n : createRect(0, 0, containerCross, finalContainerMain);\n const finalContentBox = childResults.length > 0\n ? computeContentBox(childResults)\n : createRect(0, 0, 0, 0);\n\n return {\n box: {\n width: containerBox.width,\n height: containerBox.height,\n },\n layout: {\n containerBox,\n contentBox: finalContentBox,\n children: childResults,\n constraints,\n },\n };\n}\n\nexport class FlexItem<C extends CanvasRenderingContext2D> extends Wrapper<C> {\n constructor(\n inner: Node<C>,\n readonly item: FlexItemOptions = {},\n ) {\n super(inner);\n }\n}\n\nexport class Flex<C extends CanvasRenderingContext2D> extends Group<C> {\n constructor(\n children: Node<C>[],\n readonly options: FlexContainerOptions = {},\n ) {\n super(children);\n }\n\n measure(ctx: Context<C>): Box {\n const result = computeFlexLayout(this.children, this.options, ctx.constraints, (node, constraints) => ctx.measureNode(node, constraints));\n writeLayoutResult(this, ctx, result.layout);\n return result.box;\n }\n\n draw(ctx: Context<C>, x: number, y: number): boolean {\n return drawLayoutChildren(this, ctx, x, y);\n }\n\n hittest(ctx: Context<C>, test: HitTest): boolean {\n return hittestLayoutChildren(this, ctx, test, \"contentBox\");\n }\n}\n","import { createRect, findChildAtPoint, getSingleChildLayout } from \"../layout\";\nimport type { Box, Context, HitTest, Node, TextAlign } from \"../types\";\nimport { shallowMerge } from \"../utils\";\nimport { Wrapper } from \"./base\";\nimport { readLayoutResult, withConstraints, writeLayoutResult } from \"./shared\";\n\nfunction resolveHorizontalOffset(align: TextAlign, availableWidth: number, childWidth: number): number {\n switch (align) {\n case \"center\":\n return (availableWidth - childWidth) / 2;\n case \"end\":\n return availableWidth - childWidth;\n case \"start\":\n return 0;\n }\n}\n\nexport class Place<C extends CanvasRenderingContext2D> extends Wrapper<C> {\n constructor(\n inner: Node<C>,\n readonly options: {\n align?: TextAlign;\n expand?: boolean;\n } = {},\n ) {\n super(inner);\n }\n\n measure(ctx: Context<C>): Box {\n const availableWidth = ctx.constraints?.maxWidth;\n const expand = this.options.expand ?? true;\n const childConstraints = ctx.constraints\n ? {\n ...ctx.constraints,\n }\n : undefined;\n const childBox = ctx.measureNode(this.inner, childConstraints);\n let width = expand && availableWidth != null ? availableWidth : childBox.width;\n if (ctx.constraints?.minWidth != null) {\n width = Math.max(width, ctx.constraints.minWidth);\n }\n if (ctx.constraints?.maxWidth != null) {\n width = Math.min(width, ctx.constraints.maxWidth);\n }\n\n const align = this.options.align ?? \"start\";\n const childRect = createRect(resolveHorizontalOffset(align, width, childBox.width), 0, childBox.width, childBox.height);\n\n writeLayoutResult(this, ctx, {\n containerBox: createRect(0, 0, width, childBox.height),\n contentBox: childRect,\n children: [\n {\n node: this.inner,\n rect: childRect,\n contentBox: createRect(0, 0, childBox.width, childBox.height),\n constraints: childConstraints,\n },\n ],\n constraints: ctx.constraints,\n });\n\n return {\n width,\n height: childBox.height,\n };\n }\n\n draw(ctx: Context<C>, x: number, y: number): boolean {\n const layoutResult = readLayoutResult(this, ctx);\n if (!layoutResult) {\n return this.inner.draw(ctx, x, y);\n }\n\n const childResult = getSingleChildLayout(layoutResult);\n if (!childResult) {\n return false;\n }\n const childCtx = withConstraints(ctx, childResult.constraints);\n return childResult.node.draw(childCtx, x + childResult.rect.x, y + childResult.rect.y);\n }\n\n hittest(ctx: Context<C>, test: HitTest): boolean {\n const layoutResult = readLayoutResult(this, ctx);\n if (!layoutResult) {\n return false;\n }\n\n const hit = findChildAtPoint(layoutResult.children, test.x, test.y, \"rect\");\n if (!hit) {\n return false;\n }\n\n return hit.child.node.hittest(\n withConstraints(ctx, hit.child.constraints),\n shallowMerge(test, {\n x: hit.localX,\n y: hit.localY,\n }),\n );\n }\n}\n","import {\n layoutNextLine,\n layoutWithLines,\n prepareWithSegments,\n walkLineRanges,\n type PreparedTextWithSegments,\n} from \"@chenglou/pretext\";\nimport type { Context, TextWhitespaceMode } from \"./types\";\n\nexport interface TextLayout {\n width: number;\n text: string;\n shift: number;\n}\n\nexport interface TextMeasurement {\n width: number;\n lineCount: number;\n}\n\n// `fontBoundingBox*` depends on the active font, so one fixed probe is enough.\nconst FONT_SHIFT_PROBE = \"M\";\nconst PREPARED_SEGMENT_CACHE_CAPACITY = 512;\nconst FONT_SHIFT_CACHE_CAPACITY = 64;\nconst LINE_START_CURSOR = { segmentIndex: 0, graphemeIndex: 0 } as const;\n\nconst preparedSegmentCache = new Map<string, PreparedTextWithSegments>();\nconst fontShiftCache = new Map<string, number>();\n\nfunction preprocessSegments(text: string, whitespace: TextWhitespaceMode = \"preserve\"): string[] {\n const segments = text.split(\"\\n\");\n if (whitespace === \"trim-and-collapse\") {\n return segments\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n }\n return segments;\n}\n\nfunction readLruValue<T>(cache: Map<string, T>, key: string): T | undefined {\n const cached = cache.get(key);\n if (cached == null) {\n return undefined;\n }\n cache.delete(key);\n cache.set(key, cached);\n return cached;\n}\n\nfunction writeLruValue<T>(cache: Map<string, T>, key: string, value: T, capacity: number): T {\n if (cache.has(key)) {\n cache.delete(key);\n } else if (cache.size >= capacity) {\n const firstKey = cache.keys().next().value;\n if (firstKey != null) {\n cache.delete(firstKey);\n }\n }\n cache.set(key, value);\n return value;\n}\n\nfunction getPreparedSegmentCacheKey(segment: string, font: string): string {\n return `${font}\\u0000${segment}`;\n}\n\nfunction readPreparedSegment(segment: string, font: string): PreparedTextWithSegments {\n const key = getPreparedSegmentCacheKey(segment, font);\n const cached = readLruValue(preparedSegmentCache, key);\n if (cached != null) {\n return cached;\n }\n return writeLruValue(preparedSegmentCache, key, prepareWithSegments(segment, font), PREPARED_SEGMENT_CACHE_CAPACITY);\n}\n\nfunction measureFontShift<C extends CanvasRenderingContext2D>(ctx: Context<C>): number {\n const font = ctx.graphics.font;\n const cached = readLruValue(fontShiftCache, font);\n if (cached != null) {\n return cached;\n }\n const {\n fontBoundingBoxAscent: ascent = 0,\n fontBoundingBoxDescent: descent = 0,\n } = ctx.graphics.measureText(FONT_SHIFT_PROBE);\n return writeLruValue(fontShiftCache, font, ascent - descent, FONT_SHIFT_CACHE_CAPACITY);\n}\n\nexport function layoutFirstLineIntrinsic<C extends CanvasRenderingContext2D>(\n ctx: Context<C>,\n text: string,\n whitespace: TextWhitespaceMode = \"preserve\",\n): TextLayout {\n const segments = preprocessSegments(text, whitespace);\n const segment = segments[0];\n if (!segment) {\n return { width: 0, text: \"\", shift: 0 };\n }\n const shift = measureFontShift(ctx);\n return {\n width: ctx.graphics.measureText(segment).width,\n text: segment,\n shift,\n };\n}\n\nexport function measureTextIntrinsic<C extends CanvasRenderingContext2D>(\n ctx: Context<C>,\n text: string,\n whitespace: TextWhitespaceMode = \"preserve\",\n): TextMeasurement {\n const segments = preprocessSegments(text, whitespace);\n if (segments.length === 0) {\n return { width: 0, lineCount: 0 };\n }\n\n let width = 0;\n for (const segment of segments) {\n width = Math.max(width, ctx.graphics.measureText(segment).width);\n }\n\n return { width, lineCount: segments.length };\n}\n\nexport function layoutTextIntrinsic<C extends CanvasRenderingContext2D>(\n ctx: Context<C>,\n text: string,\n whitespace: TextWhitespaceMode = \"preserve\",\n): { width: number; lines: TextLayout[] } {\n const segments = preprocessSegments(text, whitespace);\n if (segments.length === 0) {\n return { width: 0, lines: [] };\n }\n\n const shift = measureFontShift(ctx);\n let width = 0;\n const lines: TextLayout[] = [];\n for (const segment of segments) {\n const measuredWidth = ctx.graphics.measureText(segment).width;\n width = Math.max(width, measuredWidth);\n lines.push({\n width: measuredWidth,\n text: segment,\n shift,\n });\n }\n\n return { width, lines };\n}\n\nexport function layoutFirstLine<C extends CanvasRenderingContext2D>(\n ctx: Context<C>,\n text: string,\n maxWidth: number,\n whitespace: TextWhitespaceMode = \"preserve\",\n): TextLayout {\n if (maxWidth < 0) {\n maxWidth = 0;\n }\n const segments = preprocessSegments(text, whitespace);\n const segment = segments[0];\n if (!segment) {\n return { width: 0, text: \"\", shift: 0 };\n }\n const shift = measureFontShift(ctx);\n if (maxWidth === 0) {\n return { width: 0, text: \"\", shift };\n }\n const prepared = readPreparedSegment(segment, ctx.graphics.font);\n const line = layoutNextLine(prepared, LINE_START_CURSOR, maxWidth);\n if (line == null) {\n return { width: 0, text: \"\", shift };\n }\n return { width: line.width, text: line.text, shift };\n}\n\nexport function measureText<C extends CanvasRenderingContext2D>(\n ctx: Context<C>,\n text: string,\n maxWidth: number,\n whitespace: TextWhitespaceMode = \"preserve\",\n): TextMeasurement {\n if (maxWidth < 0) {\n maxWidth = 0;\n }\n\n const segments = preprocessSegments(text, whitespace);\n if (segments.length === 0 || maxWidth === 0) {\n return { width: 0, lineCount: 0 };\n }\n\n const font = ctx.graphics.font;\n let width = 0;\n let lineCount = 0;\n\n for (const segment of segments) {\n if (segment.length === 0) {\n lineCount += 1;\n continue;\n }\n const prepared = readPreparedSegment(segment, font);\n lineCount += walkLineRanges(prepared, maxWidth, (line) => {\n width = Math.max(width, line.width);\n });\n }\n\n return { width, lineCount };\n}\n\nexport function layoutText<C extends CanvasRenderingContext2D>(\n ctx: Context<C>,\n text: string,\n maxWidth: number,\n whitespace: TextWhitespaceMode = \"preserve\",\n): { width: number; lines: TextLayout[] } {\n if (maxWidth < 0) {\n maxWidth = 0;\n }\n\n const segments = preprocessSegments(text, whitespace);\n if (segments.length === 0 || maxWidth === 0) {\n return { width: 0, lines: [] };\n }\n\n const font = ctx.graphics.font;\n const shift = measureFontShift(ctx);\n let width = 0;\n const lines: TextLayout[] = [];\n\n for (const segment of segments) {\n if (segment.length === 0) {\n lines.push({ width: 0, text: \"\", shift });\n continue;\n }\n const prepared = readPreparedSegment(segment, font);\n const { lines: segLines } = layoutWithLines(prepared, maxWidth, 0);\n for (const segLine of segLines) {\n width = Math.max(width, segLine.width);\n lines.push({ width: segLine.width, text: segLine.text, shift });\n }\n }\n\n return { width, lines };\n}\n","import {\n layoutFirstLine,\n layoutFirstLineIntrinsic,\n layoutText,\n layoutTextIntrinsic,\n measureText,\n measureTextIntrinsic,\n type TextLayout,\n type TextMeasurement,\n} from \"../text\";\nimport type { Box, Context, MultilineTextOptions, Node, PhysicalTextAlign, TextOptions } from \"../types\";\n\ntype SingleLineLayout = TextLayout;\ntype MultiLineDrawLayout = {\n width: number;\n lines: TextLayout[];\n};\ntype MultiLineMeasureLayout = TextMeasurement;\n\ntype TextLayoutCacheAccess<C extends CanvasRenderingContext2D> = {\n getTextLayout<T>(node: Node<C>, key: string): T | undefined;\n setTextLayout<T>(node: Node<C>, key: string, layout: T): void;\n};\n\nfunction resolvePhysicalTextAlign(\n options: Pick<MultilineTextOptions<any>, \"align\" | \"physicalAlign\">,\n): PhysicalTextAlign {\n if (options.physicalAlign != null) {\n return options.physicalAlign;\n }\n if (options.align != null) {\n switch (options.align) {\n case \"start\":\n return \"left\";\n case \"center\":\n return \"center\";\n case \"end\":\n return \"right\";\n }\n }\n return \"left\";\n}\n\nfunction normalizeTextMaxWidth(maxWidth: number | undefined): number | undefined {\n if (maxWidth == null) {\n return undefined;\n }\n return Math.max(0, maxWidth);\n}\n\nfunction getTextLayoutContext<C extends CanvasRenderingContext2D>(ctx: Context<C>): Context<C> & TextLayoutCacheAccess<C> {\n return ctx as Context<C> & TextLayoutCacheAccess<C>;\n}\n\nfunction readCachedTextLayout<C extends CanvasRenderingContext2D, T>(\n node: Node<C>,\n ctx: Context<C>,\n key: string,\n compute: () => T,\n): T {\n const textCtx = getTextLayoutContext(ctx);\n const cached = textCtx.getTextLayout<T>(node, key);\n if (cached != null) {\n return cached;\n }\n const layout = compute();\n textCtx.setTextLayout(node, key, layout);\n return layout;\n}\n\nfunction getSingleLineLayoutKey(maxWidth: number | undefined): string {\n return maxWidth == null ? \"single:intrinsic\" : `single:${maxWidth}`;\n}\n\nfunction getMultiLineMeasureLayoutKey(maxWidth: number | undefined): string {\n return maxWidth == null ? \"multi:measure:intrinsic\" : `multi:measure:${maxWidth}`;\n}\n\nfunction getMultiLineDrawLayoutKey(maxWidth: number | undefined): string {\n return maxWidth == null ? \"multi:draw:intrinsic\" : `multi:draw:${maxWidth}`;\n}\n\nfunction getSingleLineLayout<C extends CanvasRenderingContext2D>(\n node: Node<C>,\n ctx: Context<C>,\n text: string,\n whitespace: TextOptions<C>[\"whitespace\"],\n): SingleLineLayout {\n const maxWidth = normalizeTextMaxWidth(ctx.constraints?.maxWidth);\n return readCachedTextLayout(node, ctx, getSingleLineLayoutKey(maxWidth), () =>\n maxWidth == null ? layoutFirstLineIntrinsic(ctx, text, whitespace) : layoutFirstLine(ctx, text, maxWidth, whitespace)\n );\n}\n\nfunction getMultiLineMeasureLayout<C extends CanvasRenderingContext2D>(\n node: Node<C>,\n ctx: Context<C>,\n text: string,\n whitespace: MultilineTextOptions<C>[\"whitespace\"],\n): MultiLineMeasureLayout {\n const maxWidth = normalizeTextMaxWidth(ctx.constraints?.maxWidth);\n return readCachedTextLayout(node, ctx, getMultiLineMeasureLayoutKey(maxWidth), () =>\n maxWidth == null ? measureTextIntrinsic(ctx, text, whitespace) : measureText(ctx, text, maxWidth, whitespace)\n );\n}\n\nfunction getMultiLineDrawLayout<C extends CanvasRenderingContext2D>(\n node: Node<C>,\n ctx: Context<C>,\n text: string,\n whitespace: MultilineTextOptions<C>[\"whitespace\"],\n): MultiLineDrawLayout {\n const maxWidth = normalizeTextMaxWidth(ctx.constraints?.maxWidth);\n return readCachedTextLayout(node, ctx, getMultiLineDrawLayoutKey(maxWidth), () =>\n maxWidth == null ? layoutTextIntrinsic(ctx, text, whitespace) : layoutText(ctx, text, maxWidth, whitespace)\n );\n}\n\nexport class MultilineText<C extends CanvasRenderingContext2D> implements Node<C> {\n constructor(\n readonly text: string,\n readonly options: MultilineTextOptions<C>,\n ) {}\n\n measure(ctx: Context<C>): Box {\n return ctx.with((g) => {\n g.font = this.options.font;\n const { width, lineCount } = getMultiLineMeasureLayout(this, ctx, this.text, this.options.whitespace);\n return { width, height: lineCount * this.options.lineHeight };\n });\n }\n\n draw(ctx: Context<C>, x: number, y: number): boolean {\n return ctx.with((g) => {\n g.font = this.options.font;\n g.fillStyle = ctx.resolveDynValue(this.options.style);\n const { width, lines } = getMultiLineDrawLayout(this, ctx, this.text, this.options.whitespace);\n switch (resolvePhysicalTextAlign(this.options)) {\n case \"left\":\n for (const { text, shift } of lines) {\n g.fillText(text, x, y + (this.options.lineHeight + shift) / 2);\n y += this.options.lineHeight;\n }\n break;\n case \"right\": {\n x += width;\n g.textAlign = \"right\";\n for (const { text, shift } of lines) {\n g.fillText(text, x, y + (this.options.lineHeight + shift) / 2);\n y += this.options.lineHeight;\n }\n break;\n }\n case \"center\": {\n x += width / 2;\n g.textAlign = \"center\";\n for (const { text, shift } of lines) {\n g.fillText(text, x, y + (this.options.lineHeight + shift) / 2);\n y += this.options.lineHeight;\n }\n break;\n }\n }\n return false;\n });\n }\n\n hittest(_ctx: Context<C>, _test: { x: number; y: number; type: \"click\" | \"auxclick\" | \"hover\" }): boolean {\n return false;\n }\n}\n\nexport class Text<C extends CanvasRenderingContext2D> implements Node<C> {\n constructor(\n readonly text: string,\n readonly options: TextOptions<C>,\n ) {}\n\n measure(ctx: Context<C>): Box {\n return ctx.with((g) => {\n g.font = this.options.font;\n const { width } = getSingleLineLayout(this, ctx, this.text, this.options.whitespace);\n return { width, height: this.options.lineHeight };\n });\n }\n\n draw(ctx: Context<C>, x: number, y: number): boolean {\n return ctx.with((g) => {\n g.font = this.options.font;\n g.fillStyle = ctx.resolveDynValue(this.options.style);\n const { text, shift } = getSingleLineLayout(this, ctx, this.text, this.options.whitespace);\n g.fillText(text, x, y + (this.options.lineHeight + shift) / 2);\n return false;\n });\n }\n\n hittest(_ctx: Context<C>, _test: { x: number; y: number; type: \"click\" | \"auxclick\" | \"hover\" }): boolean {\n return false;\n }\n}\n","import { forEachNodeAncestor, getNodeRevision } from \"../internal/node-registry\";\nimport type {\n Box,\n Context,\n DynValue,\n FlexLayoutResult,\n HitTest,\n LayoutConstraints,\n Node,\n RendererOptions,\n} from \"../types\";\nimport { shallow } from \"../utils\";\n\nconst MAX_CONSTRAINT_VARIANTS = 8;\n\ntype LayoutCacheAccess<C extends CanvasRenderingContext2D> = {\n getLayoutResult(node: Node<C>, constraints?: LayoutConstraints): FlexLayoutResult<C> | undefined;\n setLayoutResult(node: Node<C>, result: FlexLayoutResult<C>, constraints?: LayoutConstraints): void;\n};\n\ntype TextLayoutCacheAccess<C extends CanvasRenderingContext2D> = {\n getTextLayout<T>(node: Node<C>, key: string): T | undefined;\n setTextLayout<T>(node: Node<C>, key: string, layout: T): void;\n};\n\ntype BoxCacheEntry = {\n revision: number;\n box: Box;\n};\n\ntype LayoutCacheEntry<C extends CanvasRenderingContext2D> = {\n revision: number;\n layout: FlexLayoutResult<C>;\n};\n\ntype TextLayoutCacheEntry = {\n revision: number;\n layout: unknown;\n};\n\ntype RendererContext<C extends CanvasRenderingContext2D> = Context<C> & LayoutCacheAccess<C> & TextLayoutCacheAccess<C>;\n\nfunction constraintKey(constraints: LayoutConstraints | undefined): string {\n if (constraints == null) return \"\";\n return `${constraints.minWidth ?? \"\"},${constraints.maxWidth ?? \"\"},${constraints.minHeight ?? \"\"},${constraints.maxHeight ?? \"\"}`;\n}\n\nexport class BaseRenderer<C extends CanvasRenderingContext2D, O extends {} = {}> {\n graphics: C;\n #ctx: RendererContext<C>;\n #lastWidth: number;\n #cache = new WeakMap<Node<C>, Map<string, BoxCacheEntry>>();\n #layoutCache = new WeakMap<Node<C>, Map<string, LayoutCacheEntry<C>>>();\n #textLayoutCache = new WeakMap<Node<C>, Map<string, TextLayoutCacheEntry>>();\n\n protected get context(): Context<C> {\n return shallow(this.#ctx);\n }\n\n constructor(\n graphics: C,\n readonly options: RendererOptions & O,\n ) {\n this.graphics = graphics;\n this.graphics.textRendering = \"optimizeLegibility\";\n const self = this;\n this.#ctx = {\n graphics: this.graphics,\n measureNode(node: Node<C>, constraints?: LayoutConstraints) {\n return self.measureNode(node, constraints);\n },\n getLayoutResult(node: Node<C>, constraints?: LayoutConstraints) {\n return self.getLayoutResult(node, constraints);\n },\n setLayoutResult(node: Node<C>, result: FlexLayoutResult<C>, constraints?: LayoutConstraints) {\n self.setLayoutResult(node, result, constraints);\n },\n getTextLayout<T>(node: Node<C>, key: string) {\n return self.getTextLayout<T>(node, key);\n },\n setTextLayout<T>(node: Node<C>, key: string, layout: T) {\n self.setTextLayout(node, key, layout);\n },\n invalidateNode: this.invalidateNode.bind(this),\n resolveDynValue<T>(value: DynValue<C, T>): T {\n if (typeof value === \"function\") {\n return value(this.graphics);\n }\n return value as T;\n },\n with<T>(cb: (g: C) => T): T {\n this.graphics.save();\n try {\n return cb(this.graphics);\n } finally {\n this.graphics.restore();\n }\n },\n };\n this.#lastWidth = this.graphics.canvas.clientWidth;\n }\n\n #clearAllCaches(): void {\n this.#cache = new WeakMap<Node<C>, Map<string, BoxCacheEntry>>();\n this.#layoutCache = new WeakMap<Node<C>, Map<string, LayoutCacheEntry<C>>>();\n this.#textLayoutCache = new WeakMap<Node<C>, Map<string, TextLayoutCacheEntry>>();\n }\n\n #syncCachesToViewportWidth(): void {\n const width = this.graphics.canvas.clientWidth;\n if (this.#lastWidth === width) {\n return;\n }\n this.#clearAllCaches();\n this.#lastWidth = width;\n }\n\n protected getRootConstraints(): LayoutConstraints {\n return {\n maxWidth: this.graphics.canvas.clientWidth,\n };\n }\n\n protected getRootContext(): Context<C> {\n const ctx = this.context;\n ctx.constraints = this.getRootConstraints();\n return ctx;\n }\n\n protected measureRootNode(node: Node<C>): Box {\n return this.measureNode(node, this.getRootConstraints());\n }\n\n protected drawRootNode(node: Node<C>, x = 0, y = 0): boolean {\n this.measureRootNode(node);\n return node.draw(this.getRootContext(), x, y);\n }\n\n protected hittestRootNode(node: Node<C>, test: HitTest): boolean {\n this.measureRootNode(node);\n return node.hittest(this.getRootContext(), test);\n }\n\n invalidateNode(node: Node<C>): void {\n this.#syncCachesToViewportWidth();\n this.#cache.delete(node);\n this.#layoutCache.delete(node);\n this.#textLayoutCache.delete(node);\n forEachNodeAncestor(node, (ancestor) => {\n this.#cache.delete(ancestor);\n this.#layoutCache.delete(ancestor);\n this.#textLayoutCache.delete(ancestor);\n });\n }\n\n getLayoutResult(node: Node<C>, constraints?: LayoutConstraints): FlexLayoutResult<C> | undefined {\n this.#syncCachesToViewportWidth();\n const nodeCache = this.#layoutCache.get(node);\n if (nodeCache == null) {\n return undefined;\n }\n const key = constraintKey(constraints);\n const cached = nodeCache.get(key);\n if (cached == null) {\n return undefined;\n }\n if (cached.revision !== getNodeRevision(node)) {\n nodeCache.delete(key);\n return undefined;\n }\n return cached.layout;\n }\n\n setLayoutResult(node: Node<C>, result: FlexLayoutResult<C>, constraints?: LayoutConstraints): void {\n this.#syncCachesToViewportWidth();\n let nodeCache = this.#layoutCache.get(node);\n if (nodeCache == null) {\n nodeCache = new Map();\n this.#layoutCache.set(node, nodeCache);\n } else if (nodeCache.size >= MAX_CONSTRAINT_VARIANTS) {\n const firstKey = nodeCache.keys().next().value!;\n nodeCache.delete(firstKey);\n }\n nodeCache.set(constraintKey(constraints), {\n revision: getNodeRevision(node),\n layout: result,\n });\n }\n\n protected getTextLayout<T>(node: Node<C>, key: string): T | undefined {\n this.#syncCachesToViewportWidth();\n const nodeCache = this.#textLayoutCache.get(node);\n if (nodeCache == null) {\n return undefined;\n }\n const cached = nodeCache.get(key);\n if (cached == null) {\n return undefined;\n }\n if (cached.revision !== getNodeRevision(node)) {\n nodeCache.delete(key);\n return undefined;\n }\n return cached.layout as T;\n }\n\n protected setTextLayout<T>(node: Node<C>, key: string, layout: T): void {\n this.#syncCachesToViewportWidth();\n let nodeCache = this.#textLayoutCache.get(node);\n if (nodeCache == null) {\n nodeCache = new Map();\n this.#textLayoutCache.set(node, nodeCache);\n } else if (nodeCache.size >= MAX_CONSTRAINT_VARIANTS) {\n const firstKey = nodeCache.keys().next().value!;\n nodeCache.delete(firstKey);\n }\n nodeCache.set(key, {\n revision: getNodeRevision(node),\n layout,\n });\n }\n\n measureNode(node: Node<C>, constraints?: LayoutConstraints): Box {\n this.#syncCachesToViewportWidth();\n {\n const nodeCache = this.#cache.get(node);\n if (nodeCache != null) {\n const key = constraintKey(constraints);\n const cached = nodeCache.get(key);\n if (cached != null) {\n if (cached.revision === getNodeRevision(node)) {\n return cached.box;\n }\n nodeCache.delete(key);\n }\n }\n }\n const ctx = this.context;\n if (constraints != null) {\n ctx.constraints = constraints;\n }\n const result = node.measure(ctx);\n const key = constraintKey(constraints);\n let nodeCache = this.#cache.get(node);\n if (nodeCache == null) {\n nodeCache = new Map();\n this.#cache.set(node, nodeCache);\n } else if (nodeCache.size >= MAX_CONSTRAINT_VARIANTS) {\n const firstKey = nodeCache.keys().next().value!;\n nodeCache.delete(firstKey);\n }\n nodeCache.set(key, {\n revision: getNodeRevision(node),\n box: result,\n });\n return result;\n }\n}\n\nexport class DebugRenderer<C extends CanvasRenderingContext2D> extends BaseRenderer<C> {\n draw(node: Node<C>): boolean {\n const { clientWidth: viewportWidth, clientHeight: viewportHeight } = this.graphics.canvas;\n this.graphics.clearRect(0, 0, viewportWidth, viewportHeight);\n return this.drawRootNode(node);\n }\n\n hittest(node: Node<C>, test: HitTest): boolean {\n return this.hittestRootNode(node, test);\n }\n}\n","export class ListState<T extends {}> {\n offset = 0;\n position: number | undefined;\n items: T[] = [];\n\n constructor(items: T[] = []) {\n this.items = [...items];\n }\n\n unshift(...items: T[]): void {\n this.unshiftAll(items);\n }\n\n unshiftAll(items: T[]): void {\n if (this.position != null) {\n this.position += items.length;\n }\n this.items = items.concat(this.items);\n }\n\n push(...items: T[]): void {\n this.pushAll(items);\n }\n\n pushAll(items: T[]): void {\n this.items.push(...items);\n }\n\n setAnchor(position: number, offset = 0): void {\n this.position = Number.isFinite(position) ? Math.trunc(position) : undefined;\n this.offset = Number.isFinite(offset) ? offset : 0;\n }\n\n reset(items: T[] = []): void {\n this.items = [...items];\n this.offset = 0;\n this.position = undefined;\n }\n\n resetScroll(): void {\n this.offset = 0;\n this.position = undefined;\n }\n\n applyScroll(delta: number): void {\n this.offset += delta;\n }\n}\n","import type { Node } from \"../types\";\n\nfunction isWeakMapKey(value: unknown): value is object {\n return (typeof value === \"object\" && value !== null) || typeof value === \"function\";\n}\n\nexport function memoRenderItem<C extends CanvasRenderingContext2D, T extends object>(\n renderItem: (item: T) => Node<C>,\n): ((item: T) => Node<C>) & { reset: (key: T) => boolean } {\n const cache = new WeakMap<object, Node<C>>();\n\n function fn(item: T): Node<C> {\n if (!isWeakMapKey(item)) {\n throw new TypeError(\"memoRenderItem() only supports object items. Use memoRenderItemBy() for primitive keys.\");\n }\n const key = item as unknown as object;\n const cached = cache.get(key);\n if (cached != null) {\n return cached;\n }\n const result = renderItem(item);\n cache.set(key, result);\n return result;\n }\n\n return Object.assign(fn, {\n reset: (key: T) => cache.delete(key as unknown as object),\n });\n}\n\nexport function memoRenderItemBy<C extends CanvasRenderingContext2D, T, K>(\n keyOf: (item: T) => K,\n renderItem: (item: T) => Node<C>,\n): ((item: T) => Node<C>) & { reset: (item: T) => boolean; resetKey: (key: K) => boolean } {\n const cache = new Map<K, Node<C>>();\n\n function fn(item: T): Node<C> {\n const key = keyOf(item);\n const cached = cache.get(key);\n if (cached != null) {\n return cached;\n }\n const result = renderItem(item);\n cache.set(key, result);\n return result;\n }\n\n return Object.assign(fn, {\n reset: (item: T) => cache.delete(keyOf(item)),\n resetKey: (key: K) => cache.delete(key),\n });\n}\n","import type { Node, RenderFeedback } from \"../../types\";\nimport { shallowMerge } from \"../../utils\";\nimport { BaseRenderer } from \"../base\";\nimport { ListState } from \"../list-state\";\nimport type { NormalizedListState, VisibleListState, VisibleWindow } from \"./solver\";\n\nexport interface JumpToOptions {\n animated?: boolean;\n block?: \"start\" | \"center\" | \"end\";\n duration?: number;\n onComplete?: () => void;\n}\n\ntype ControlledState = {\n position?: number;\n offset: number;\n};\n\ntype JumpAnimation = {\n startAnchor: number;\n targetAnchor: number;\n startTime: number;\n duration: number;\n needsMoreFrames: boolean;\n onComplete: (() => void) | undefined;\n};\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\nfunction sameState(state: ControlledState, position: number | undefined, offset: number): boolean {\n return Object.is(state.position, position) && Object.is(state.offset, offset);\n}\n\nfunction smoothstep(value: number): number {\n return value * value * (3 - 2 * value);\n}\n\nfunction getNow(): number {\n return globalThis.performance?.now() ?? Date.now();\n}\n\nexport abstract class VirtualizedRenderer<C extends CanvasRenderingContext2D, T extends {}> extends BaseRenderer<\n C,\n {\n renderItem: (item: T) => Node<C>;\n list: ListState<T>;\n }\n> {\n static readonly MIN_JUMP_DURATION = 160;\n static readonly MAX_JUMP_DURATION = 420;\n static readonly JUMP_DURATION_PER_ITEM = 28;\n\n #controlledState: ControlledState | undefined;\n #jumpAnimation: JumpAnimation | undefined;\n\n get position(): number | undefined {\n return this.options.list.position;\n }\n\n set position(value: number | undefined) {\n this.options.list.position = value;\n }\n\n get offset(): number {\n return this.options.list.offset;\n }\n\n set offset(value: number) {\n this.options.list.offset = value;\n }\n\n get items(): T[] {\n return this.options.list.items;\n }\n\n set items(value: T[]) {\n this.options.list.items = value;\n }\n\n abstract render(feedback?: RenderFeedback): boolean;\n abstract hittest(test: { x: number; y: number; type: \"click\" | \"auxclick\" | \"hover\" }): boolean;\n\n protected _readListState(): VisibleListState {\n return {\n position: this.position,\n offset: this.offset,\n };\n }\n\n protected _commitListState(state: NormalizedListState): void {\n this.position = state.position;\n this.offset = state.offset;\n }\n\n jumpTo(index: number, options: JumpToOptions = {}): void {\n if (this.items.length === 0) {\n this.#cancelJumpAnimation();\n return;\n }\n\n const targetIndex = this._clampItemIndex(index);\n const currentState = this._normalizeListState(this._readListState());\n const targetBlock = options.block ?? this._getDefaultJumpBlock();\n const targetAnchor = this._getTargetAnchor(targetIndex, targetBlock);\n\n const animated = options.animated ?? true;\n if (!animated) {\n this.#cancelJumpAnimation();\n this._applyAnchor(targetAnchor);\n options.onComplete?.();\n return;\n }\n\n const startAnchor = this._readAnchor(currentState);\n if (!Number.isFinite(startAnchor)) {\n this.#cancelJumpAnimation();\n this._applyAnchor(targetAnchor);\n options.onComplete?.();\n return;\n }\n\n const duration = clamp(\n options.duration ??\n VirtualizedRenderer.MIN_JUMP_DURATION +\n Math.abs(targetAnchor - startAnchor) * VirtualizedRenderer.JUMP_DURATION_PER_ITEM,\n 0,\n VirtualizedRenderer.MAX_JUMP_DURATION,\n );\n\n if (duration <= 0 || Math.abs(targetAnchor - startAnchor) <= Number.EPSILON) {\n this.#cancelJumpAnimation();\n this._applyAnchor(targetAnchor);\n options.onComplete?.();\n return;\n }\n\n this.#jumpAnimation = {\n startAnchor,\n targetAnchor,\n startTime: getNow(),\n duration,\n needsMoreFrames: true,\n onComplete: options.onComplete,\n };\n this.#controlledState = this._readListState();\n }\n\n protected _resetRenderFeedback(feedback?: RenderFeedback): void {\n if (feedback == null) {\n return;\n }\n feedback.minIdx = Number.NaN;\n feedback.maxIdx = Number.NaN;\n feedback.min = Number.NaN;\n feedback.max = Number.NaN;\n }\n\n protected _accumulateRenderFeedback(feedback: RenderFeedback, idx: number, top: number, height: number): void {\n if (!Number.isFinite(top) || !Number.isFinite(height) || height <= 0) {\n return;\n }\n\n const viewportHeight = this.graphics.canvas.clientHeight;\n const visibleTop = clamp(-top, 0, height);\n const visibleBottom = clamp(viewportHeight - top, 0, height);\n if (visibleBottom <= visibleTop) {\n return;\n }\n\n const itemMin = idx + visibleTop / height;\n const itemMax = idx + visibleBottom / height;\n feedback.minIdx = Number.isNaN(feedback.minIdx) ? idx : Math.min(idx, feedback.minIdx);\n feedback.maxIdx = Number.isNaN(feedback.maxIdx) ? idx : Math.max(idx, feedback.maxIdx);\n feedback.min = Number.isNaN(feedback.min) ? itemMin : Math.min(itemMin, feedback.min);\n feedback.max = Number.isNaN(feedback.max) ? itemMax : Math.max(itemMax, feedback.max);\n }\n\n protected _renderDrawList(list: VisibleWindow<Node<C>>[\"drawList\"], shift: number, feedback?: RenderFeedback): boolean {\n let result = false;\n const viewportHeight = this.graphics.canvas.clientHeight;\n\n for (const { idx, value: node, offset, height } of list) {\n const y = offset + shift;\n if (feedback != null) {\n this._accumulateRenderFeedback(feedback, idx, y, height);\n }\n if (y + height < 0 || y > viewportHeight) {\n continue;\n }\n if (this.drawRootNode(node, 0, y)) {\n result = true;\n }\n }\n\n return result;\n }\n\n protected _renderVisibleWindow(window: VisibleWindow<Node<C>>, feedback?: RenderFeedback): boolean {\n this._resetRenderFeedback(feedback);\n return this._renderDrawList(window.drawList, window.shift, feedback);\n }\n\n protected _hittestVisibleWindow(window: VisibleWindow<Node<C>>, test: { x: number; y: number; type: \"click\" | \"auxclick\" | \"hover\" }): boolean {\n for (const { value: node, offset, height } of window.drawList) {\n const y = offset + window.shift;\n if (test.y < y || test.y >= y + height) {\n continue;\n }\n return node.hittest(\n this.getRootContext(),\n shallowMerge(test, {\n y: test.y - y,\n }),\n );\n }\n return false;\n }\n\n protected _prepareRender(): boolean {\n const animation = this.#jumpAnimation;\n if (animation == null) {\n return false;\n }\n if (this.items.length === 0) {\n this.#cancelJumpAnimation();\n return false;\n }\n if (this.#controlledState != null && !sameState(this.#controlledState, this.position, this.offset)) {\n this.#cancelJumpAnimation();\n return false;\n }\n\n const progress = clamp((getNow() - animation.startTime) / animation.duration, 0, 1);\n const eased = progress >= 1 ? 1 : smoothstep(progress);\n const anchor = animation.startAnchor + (animation.targetAnchor - animation.startAnchor) * eased;\n this._applyAnchor(anchor);\n animation.needsMoreFrames = progress < 1;\n return animation.needsMoreFrames;\n }\n\n protected _finishRender(requestRedraw: boolean): boolean {\n const animation = this.#jumpAnimation;\n if (animation == null) {\n return requestRedraw;\n }\n\n if (animation.needsMoreFrames) {\n this.#controlledState = this._readListState();\n return true;\n }\n\n const onComplete = animation.onComplete;\n this.#cancelJumpAnimation();\n onComplete?.();\n return requestRedraw || this.#jumpAnimation != null;\n }\n\n protected _clampItemIndex(index: number): number {\n return clamp(Number.isFinite(index) ? Math.trunc(index) : 0, 0, this.items.length - 1);\n }\n\n protected _getItemHeight(index: number): number {\n const item = this.items[index];\n const node = this.options.renderItem(item);\n return this.measureRootNode(node).height;\n }\n\n protected _getAnchorAtOffset(index: number, offset: number): number {\n if (this.items.length === 0) {\n return 0;\n }\n\n let currentIndex = this._clampItemIndex(index);\n let remaining = Number.isFinite(offset) ? offset : 0;\n while (true) {\n if (remaining < 0) {\n if (currentIndex === 0) {\n return 0;\n }\n currentIndex -= 1;\n const height = this._getItemHeight(currentIndex);\n if (height > 0) {\n remaining += height;\n }\n continue;\n }\n\n const height = this._getItemHeight(currentIndex);\n if (height > 0) {\n if (remaining <= height) {\n return currentIndex + remaining / height;\n }\n remaining -= height;\n } else if (remaining === 0) {\n return currentIndex;\n }\n\n if (currentIndex === this.items.length - 1) {\n return this.items.length;\n }\n currentIndex += 1;\n }\n }\n\n protected abstract _normalizeListState(state: VisibleListState): NormalizedListState;\n protected abstract _readAnchor(state: NormalizedListState): number;\n protected abstract _applyAnchor(anchor: number): void;\n protected abstract _getDefaultJumpBlock(): NonNullable<JumpToOptions[\"block\"]>;\n protected abstract _getTargetAnchor(index: number, block: NonNullable<JumpToOptions[\"block\"]>): number;\n\n #cancelJumpAnimation(): void {\n this.#jumpAnimation = undefined;\n this.#controlledState = undefined;\n }\n}\n","export interface VisibleListState {\n position?: number;\n offset: number;\n}\n\nexport interface NormalizedListState {\n position: number;\n offset: number;\n}\n\nexport interface VisibleWindowEntry<T> {\n idx: number;\n value: T;\n offset: number;\n height: number;\n}\n\nexport interface VisibleWindow<T> {\n drawList: VisibleWindowEntry<T>[];\n shift: number;\n}\n\nexport interface VisibleWindowResult<T> {\n normalizedState: NormalizedListState;\n window: VisibleWindow<T>;\n}\n\ntype ResolvedItem<T> = {\n value: T;\n height: number;\n};\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\nfunction normalizeOffset(offset: number): number {\n return Number.isFinite(offset) ? offset : 0;\n}\n\nexport function normalizeTimelineState(itemCount: number, state: VisibleListState): NormalizedListState {\n if (itemCount <= 0) {\n return { position: 0, offset: 0 };\n }\n\n const position = state.position;\n if (typeof position !== \"number\" || !Number.isFinite(position)) {\n return {\n position: 0,\n offset: normalizeOffset(state.offset),\n };\n }\n\n return {\n position: clamp(Math.trunc(position), 0, itemCount - 1),\n offset: normalizeOffset(state.offset),\n };\n}\n\nexport function normalizeChatState(itemCount: number, state: VisibleListState): NormalizedListState {\n if (itemCount <= 0) {\n return { position: 0, offset: 0 };\n }\n\n const position = state.position;\n if (typeof position !== \"number\" || !Number.isFinite(position)) {\n return {\n position: itemCount - 1,\n offset: normalizeOffset(state.offset),\n };\n }\n\n return {\n position: clamp(Math.trunc(position), 0, itemCount - 1),\n offset: normalizeOffset(state.offset),\n };\n}\n\nexport function resolveTimelineVisibleWindow<T, V>(\n items: readonly T[],\n state: VisibleListState,\n viewportHeight: number,\n resolveItem: (item: T, idx: number) => ResolvedItem<V>,\n): VisibleWindowResult<V> {\n const normalizedState = normalizeTimelineState(items.length, state);\n if (items.length === 0) {\n return {\n normalizedState,\n window: { drawList: [], shift: 0 },\n };\n }\n\n let { position, offset } = normalizedState;\n let drawLength = 0;\n\n if (offset > 0) {\n if (position === 0) {\n offset = 0;\n } else {\n for (let i = position - 1; i >= 0; i -= 1) {\n const { height } = resolveItem(items[i]!, i);\n position = i;\n offset -= height;\n if (offset <= 0) {\n break;\n }\n }\n if (position === 0 && offset > 0) {\n offset = 0;\n }\n }\n }\n\n let y = offset;\n const drawList: VisibleWindowEntry<V>[] = [];\n for (let i = position; i < items.length; i += 1) {\n const { value, height } = resolveItem(items[i]!, i);\n if (y + height > 0) {\n drawList.push({ idx: i, value, offset: y, height });\n drawLength += height;\n } else {\n offset += height;\n position = i + 1;\n }\n y += height;\n if (y >= viewportHeight) {\n break;\n }\n }\n\n let shift = 0;\n if (y < viewportHeight) {\n if (position === 0 && drawLength < viewportHeight) {\n shift = -offset;\n offset = 0;\n } else {\n shift = viewportHeight - y;\n y = (offset += shift);\n let lastIdx = -1;\n for (let i = position - 1; i >= 0; i -= 1) {\n const { value, height } = resolveItem(items[i]!, i);\n drawLength += height;\n y -= height;\n drawList.push({ idx: i, value, offset: y - shift, height });\n lastIdx = i;\n if (y < 0) {\n break;\n }\n }\n if (lastIdx === 0 && drawLength < viewportHeight) {\n shift = drawList.at(-1)?.offset == null ? 0 : -drawList.at(-1)!.offset;\n position = 0;\n offset = 0;\n }\n }\n }\n\n return {\n normalizedState: { position, offset },\n window: { drawList, shift },\n };\n}\n\nexport function resolveChatVisibleWindow<T, V>(\n items: readonly T[],\n state: VisibleListState,\n viewportHeight: number,\n resolveItem: (item: T, idx: number) => ResolvedItem<V>,\n): VisibleWindowResult<V> {\n const normalizedState = normalizeChatState(items.length, state);\n if (items.length === 0) {\n return {\n normalizedState,\n window: { drawList: [], shift: 0 },\n };\n }\n\n let { position, offset } = normalizedState;\n let drawLength = 0;\n\n if (offset < 0) {\n if (position === items.length - 1) {\n offset = 0;\n } else {\n for (let i = position + 1; i < items.length; i += 1) {\n const { height } = resolveItem(items[i]!, i);\n position = i;\n offset += height;\n if (offset > 0) {\n break;\n }\n }\n }\n }\n\n let y = viewportHeight + offset;\n const drawList: VisibleWindowEntry<V>[] = [];\n for (let i = position; i >= 0; i -= 1) {\n const { value, height } = resolveItem(items[i]!, i);\n y -= height;\n if (y <= viewportHeight) {\n drawList.push({ idx: i, value, offset: y, height });\n drawLength += height;\n } else {\n offset -= height;\n position = i - 1;\n }\n if (y < 0) {\n break;\n }\n }\n\n let shift = 0;\n if (y > 0) {\n shift = -y;\n if (drawLength < viewportHeight) {\n y = drawLength;\n for (let i = position + 1; i < items.length; i += 1) {\n const { value, height } = resolveItem(items[i]!, i);\n drawList.push({ idx: i, value, offset: y - shift, height });\n y = (drawLength += height);\n position = i;\n if (y >= viewportHeight) {\n break;\n }\n }\n offset = drawLength < viewportHeight ? 0 : drawLength - viewportHeight;\n } else {\n offset = drawLength - viewportHeight;\n }\n }\n\n return {\n normalizedState: { position, offset },\n window: { drawList, shift },\n };\n}\n","import type { HitTest, Node, RenderFeedback } from \"../../types\";\nimport { VirtualizedRenderer } from \"./base\";\nimport type { JumpToOptions } from \"./base\";\nimport {\n normalizeChatState,\n resolveChatVisibleWindow,\n type NormalizedListState,\n type VisibleListState,\n type VisibleWindowResult,\n} from \"./solver\";\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\nexport class ChatRenderer<C extends CanvasRenderingContext2D, T extends {}> extends VirtualizedRenderer<C, T> {\n #resolveVisibleWindow(): VisibleWindowResult<Node<C>> {\n return resolveChatVisibleWindow(\n this.items,\n this._readListState(),\n this.graphics.canvas.clientHeight,\n (item) => {\n const node = this.options.renderItem(item);\n return {\n value: node,\n height: this.measureRootNode(node).height,\n };\n },\n );\n }\n\n protected _getDefaultJumpBlock(): NonNullable<JumpToOptions[\"block\"]> {\n return \"end\";\n }\n\n protected _normalizeListState(state: VisibleListState): NormalizedListState {\n return normalizeChatState(this.items.length, state);\n }\n\n protected _readAnchor(state: NormalizedListState): number {\n if (this.items.length === 0) {\n return 0;\n }\n const height = this._getItemHeight(state.position);\n return height > 0 ? state.position + 1 - state.offset / height : state.position + 1;\n }\n\n protected _applyAnchor(anchor: number): void {\n if (this.items.length === 0) {\n return;\n }\n const clampedAnchor = clamp(anchor, 0, this.items.length);\n const position = clamp(Math.ceil(clampedAnchor) - 1, 0, this.items.length - 1);\n const height = this._getItemHeight(position);\n const offset = height > 0 ? (position + 1 - clampedAnchor) * height : 0;\n this._commitListState({\n position,\n offset: Object.is(offset, -0) ? 0 : offset,\n });\n }\n\n protected _getTargetAnchor(index: number, block: NonNullable<JumpToOptions[\"block\"]>): number {\n const height = this._getItemHeight(index);\n const viewportHeight = this.graphics.canvas.clientHeight;\n\n switch (block) {\n case \"start\":\n return this._getAnchorAtOffset(index, viewportHeight);\n case \"center\":\n return this._getAnchorAtOffset(index, height / 2 + viewportHeight / 2);\n case \"end\":\n return this._getAnchorAtOffset(index, height);\n }\n }\n\n render(feedback?: RenderFeedback): boolean {\n const keepAnimating = this._prepareRender();\n const { clientWidth: viewportWidth, clientHeight: viewportHeight } = this.graphics.canvas;\n this.graphics.clearRect(0, 0, viewportWidth, viewportHeight);\n const solution = this.#resolveVisibleWindow();\n const requestRedraw = this._renderVisibleWindow(solution.window, feedback);\n this._commitListState(solution.normalizedState);\n return this._finishRender(keepAnimating || requestRedraw);\n }\n\n hittest(test: HitTest): boolean {\n return this._hittestVisibleWindow(this.#resolveVisibleWindow().window, test);\n }\n}\n","import type { HitTest, Node, RenderFeedback } from \"../../types\";\nimport { VirtualizedRenderer } from \"./base\";\nimport type { JumpToOptions } from \"./base\";\nimport {\n normalizeTimelineState,\n resolveTimelineVisibleWindow,\n type NormalizedListState,\n type VisibleListState,\n type VisibleWindowResult,\n} from \"./solver\";\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\nexport class TimelineRenderer<C extends CanvasRenderingContext2D, T extends {}> extends VirtualizedRenderer<C, T> {\n #resolveVisibleWindow(): VisibleWindowResult<Node<C>> {\n return resolveTimelineVisibleWindow(\n this.items,\n this._readListState(),\n this.graphics.canvas.clientHeight,\n (item) => {\n const node = this.options.renderItem(item);\n return {\n value: node,\n height: this.measureRootNode(node).height,\n };\n },\n );\n }\n\n protected _getDefaultJumpBlock(): NonNullable<JumpToOptions[\"block\"]> {\n return \"start\";\n }\n\n protected _normalizeListState(state: VisibleListState): NormalizedListState {\n return normalizeTimelineState(this.items.length, state);\n }\n\n protected _readAnchor(state: NormalizedListState): number {\n if (this.items.length === 0) {\n return 0;\n }\n const height = this._getItemHeight(state.position);\n return height > 0 ? state.position - state.offset / height : state.position;\n }\n\n protected _applyAnchor(anchor: number): void {\n if (this.items.length === 0) {\n return;\n }\n const clampedAnchor = clamp(anchor, 0, this.items.length);\n const position = clamp(Math.floor(clampedAnchor), 0, this.items.length - 1);\n const height = this._getItemHeight(position);\n const offset = height > 0 ? -(clampedAnchor - position) * height : 0;\n this._commitListState({\n position,\n offset: Object.is(offset, -0) ? 0 : offset,\n });\n }\n\n protected _getTargetAnchor(index: number, block: NonNullable<JumpToOptions[\"block\"]>): number {\n const height = this._getItemHeight(index);\n const viewportHeight = this.graphics.canvas.clientHeight;\n\n switch (block) {\n case \"start\":\n return this._getAnchorAtOffset(index, 0);\n case \"center\":\n return this._getAnchorAtOffset(index, height / 2 - viewportHeight / 2);\n case \"end\":\n return this._getAnchorAtOffset(index, height - viewportHeight);\n }\n }\n\n render(feedback?: RenderFeedback): boolean {\n const keepAnimating = this._prepareRender();\n const { clientWidth: viewportWidth, clientHeight: viewportHeight } = this.graphics.canvas;\n this.graphics.clearRect(0, 0, viewportWidth, viewportHeight);\n const solution = this.#resolveVisibleWindow();\n const requestRedraw = this._renderVisibleWindow(solution.window, feedback);\n this._commitListState(solution.normalizedState);\n return this._finishRender(keepAnimating || requestRedraw);\n }\n\n hittest(test: HitTest): boolean {\n return this._hittestVisibleWindow(this.#resolveVisibleWindow().window, test);\n }\n}\n"],"mappings":"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"}
|