Files
upstream-tldraw/templates/agent/shared/format/FocusedFontSize.ts
upstream-mirror a774ac673a
Some checks failed
Deploy analytics worker / Deploy analytics worker to ${{ (github.ref == 'refs/heads/production' && 'production') || (github.ref == 'refs/heads/main' && 'staging') || 'preview' }} (push) Failing after 1s
i18n upload strings / Upload latest strings (push) Failing after 1s
Deploy bemo / Deploy bemo to ${{ (github.ref == 'refs/heads/bemo-production' && 'production') || (github.ref == 'refs/heads/main' && 'staging') || 'preview' }} (push) Failing after 1s
Deploy grafana resources / ${{ github.event_name == 'push' && 'Deploy grafana resources' || 'Validate grafana resources (dry run)' }} (push) Failing after 0s
End to end tests (dotcom) / Check for relevant changes (push) Failing after 0s
End to end tests (examples) / Check for relevant changes (push) Failing after 0s
End to end tests (mermaid readability) / Check for relevant changes (push) Failing after 1s
End to end tests (perf) / Check for relevant changes (push) Failing after 0s
Publish editor extensions / Publish editor extensions (push) Failing after 1s
Publish SDK packages / Remove the publish-packages label (push) Has been skipped
Checks / Tests & checks (push) Has been cancelled
Checks / Build all projects (push) Has been cancelled
Deploy templates / Deploy templates (push) Has been cancelled
End to end tests (dotcom) / End to end tests (dotcom) (push) Has been cancelled
End to end tests (mermaid readability) / End to end tests (mermaid readability) (push) Has been cancelled
End to end tests (perf) / End to end tests (perf) (push) Has been cancelled
Deploy .com / Deploy dotcom to ${{ (github.ref == 'refs/heads/production' && 'production') || (github.ref == 'refs/heads/main' && 'staging') || 'preview' }} (push) Has been cancelled
End to end tests (examples) / End to end tests (examples) (push) Has been cancelled
Publish SDK packages / Publish SDK packages (push) Has been cancelled
Publish SDK packages / Tell user released version (push) Has been cancelled
Publish SDK packages / Publishes code templates to separate repositories (push) Has been cancelled
Publish SDK packages / Deploys the template demos with the new SDK version (push) Has been cancelled
snapshot of https://github.com/tldraw/tldraw.git (main, 2026-09-23; blobs > 131072B omitted)
2026-09-23 16:12:52 +05:00

87 lines
2.6 KiB
TypeScript

import {
createShapeId,
Editor,
getDisplayValues,
IndexKey,
TLDefaultSizeStyle,
TLTextShape,
TextShapeUtil,
TextShapeUtilDisplayValues,
} from 'tldraw'
import { z } from 'zod'
const TEXT_SIZE_STYLES = ['s', 'm', 'l', 'xl'] as const satisfies readonly TLDefaultSizeStyle[]
export const FocusedFontSize = z.number()
/**
* Calculates the closest predefined font size and scale combination to achieve a target font size
* @param editor - The tldraw editor instance
* @param targetFontSize - The desired font size in pixels
* @param textProps - The text shape props to use when resolving display values
* @returns An object containing the closest predefined font size key and the scale factor
*/
export function convertFocusedFontSizeToTldrawFontSizeAndScale(
editor: Editor,
targetFontSize: number,
textProps?: Partial<TLTextShape['props']>
) {
const fontSizeEntries = TEXT_SIZE_STYLES.map(
(size) => [size, getTextShapeDisplayFontSize(editor, { ...textProps, size })] as const
)
let closestSize = fontSizeEntries[0]
let closestPixelSize = closestSize[1]
let minDifference = Math.abs(targetFontSize - closestPixelSize)
for (const [size, pixelSize] of fontSizeEntries) {
const difference = Math.abs(targetFontSize - pixelSize)
if (difference < minDifference) {
minDifference = difference
closestSize = [size, pixelSize]
closestPixelSize = pixelSize
}
}
const textSize = closestSize[0] as TLDefaultSizeStyle
const scale = targetFontSize / closestPixelSize
return { textSize, scale }
}
/**
* Converts a tldraw font size and scale to a focused font size
* @param editor - The tldraw editor instance
* @param shape - The text shape to convert
* @returns The focused font size
*/
export function convertTldrawFontSizeAndScaleToFocusedFontSize(editor: Editor, shape: TLTextShape) {
const util = editor.getShapeUtil<TextShapeUtil>('text')
const displayValues = getDisplayValues<TLTextShape, TextShapeUtilDisplayValues>(util, shape)
return Math.round(displayValues.fontSize * shape.props.scale)
}
function getTextShapeDisplayFontSize(
editor: Editor,
textProps?: Partial<TLTextShape['props']>
): number {
const util = editor.getShapeUtil<TextShapeUtil>('text')
const shape: TLTextShape = {
id: createShapeId('agent-font-size'),
typeName: 'shape',
type: 'text',
x: 0,
y: 0,
rotation: 0,
index: 'a1' as IndexKey,
parentId: editor.getCurrentPageId(),
isLocked: false,
opacity: 1,
props: {
...util.getDefaultProps(),
...textProps,
},
meta: {},
}
return getDisplayValues<TLTextShape, TextShapeUtilDisplayValues>(util, shape).fontSize
}