Tldraw/packages/tlschema/src/shapes/TLTextShape.ts

74 wiersze
1.5 KiB
TypeScript

import { defineMigrations } from '@tldraw/tlstore'
import { T } from '@tldraw/validate'
import { TLAlignType, TLColorType, TLFontType, TLOpacityType, TLSizeType } from '../style-types'
import {
alignValidator,
colorValidator,
fontValidator,
opacityValidator,
sizeValidator,
} from '../validation'
import { TLBaseShape, createShapeValidator } from './shape-validation'
/** @public */
export type TLTextShapeProps = {
color: TLColorType
size: TLSizeType
font: TLFontType
align: TLAlignType
opacity: TLOpacityType
w: number
text: string
scale: number
autoSize: boolean
}
/** @public */
export type TLTextShape = TLBaseShape<'text', TLTextShapeProps>
/** @public */
export const textShapeTypeValidator: T.Validator<TLTextShape> = createShapeValidator(
'text',
T.object({
color: colorValidator,
size: sizeValidator,
font: fontValidator,
align: alignValidator,
opacity: opacityValidator,
w: T.nonZeroNumber,
text: T.string,
scale: T.nonZeroNumber,
autoSize: T.boolean,
})
)
const Versions = {
RemoveJustify: 1,
} as const
/** @public */
export const textShapeTypeMigrations = defineMigrations({
currentVersion: Versions.RemoveJustify,
migrators: {
[Versions.RemoveJustify]: {
up: (shape) => {
let newAlign = shape.props.align
if (newAlign === 'justify') {
newAlign = 'start'
}
return {
...shape,
props: {
...shape.props,
align: newAlign,
},
}
},
down: (shape) => {
return { ...shape }
},
},
},
})