tldraw/types.ts

356 lines
7.1 KiB
TypeScript
Raw Normal View History

2021-05-28 20:30:27 +00:00
import * as monaco from 'monaco-editor/esm/vs/editor/editor.api'
2021-05-14 22:56:41 +00:00
2021-05-28 20:30:27 +00:00
import React from 'react'
2021-05-12 21:11:17 +00:00
2021-05-17 10:01:11 +00:00
/* -------------------------------------------------- */
/* Client State */
/* -------------------------------------------------- */
2021-05-09 21:22:25 +00:00
export interface Data {
2021-05-13 06:44:52 +00:00
isReadOnly: boolean
2021-05-14 22:56:41 +00:00
settings: {
fontSize: number
2021-05-17 21:27:18 +00:00
isDarkMode: boolean
isCodeOpen: boolean
2021-05-26 10:34:10 +00:00
isStyleOpen: boolean
2021-05-28 20:30:27 +00:00
nudgeDistanceSmall: number
nudgeDistanceLarge: number
isToolLocked: boolean
isPenLocked: boolean
2021-05-14 22:56:41 +00:00
}
2021-05-26 10:34:10 +00:00
currentStyle: ShapeStyles
2021-05-09 13:04:42 +00:00
camera: {
point: number[]
zoom: number
}
2021-05-10 12:16:57 +00:00
brush?: Bounds
2021-05-18 08:32:20 +00:00
boundsRotation: number
2021-05-12 11:27:33 +00:00
selectedIds: Set<string>
2021-05-10 12:16:57 +00:00
pointedId?: string
2021-05-14 22:56:41 +00:00
hoveredId?: string
2021-05-16 08:33:08 +00:00
currentPageId: string
currentCodeFileId: string
2021-05-17 10:01:11 +00:00
codeControls: Record<string, CodeControl>
2021-05-09 21:22:25 +00:00
document: {
pages: Record<string, Page>
2021-05-14 22:56:41 +00:00
code: Record<string, CodeFile>
2021-05-09 21:22:25 +00:00
}
}
2021-05-17 10:01:11 +00:00
/* -------------------------------------------------- */
/* Document */
/* -------------------------------------------------- */
2021-05-14 22:56:41 +00:00
2021-05-09 21:22:25 +00:00
export interface Page {
id: string
2021-05-28 20:30:27 +00:00
type: 'page'
2021-05-09 21:22:25 +00:00
childIndex: number
name: string
shapes: Record<string, Shape>
}
export enum ShapeType {
2021-05-28 20:30:27 +00:00
Dot = 'dot',
Circle = 'circle',
Ellipse = 'ellipse',
Line = 'line',
Ray = 'ray',
Polyline = 'polyline',
Rectangle = 'rectangle',
Draw = 'draw',
2021-05-31 19:13:43 +00:00
Arrow = 'arrow',
2021-05-09 21:22:25 +00:00
}
2021-05-17 10:01:11 +00:00
// Consider:
// Glob = "glob",
// Spline = "spline",
// Cubic = "cubic",
// Conic = "conic",
2021-05-26 10:34:10 +00:00
export type ShapeStyles = Partial<React.SVGProps<SVGUseElement>>
2021-05-09 21:22:25 +00:00
export interface BaseShape {
id: string
type: ShapeType
parentId: string
childIndex: number
2021-05-15 13:02:13 +00:00
isGenerated: boolean
2021-05-09 21:22:25 +00:00
name: string
point: number[]
2021-05-13 18:22:16 +00:00
rotation: number
2021-05-31 19:13:43 +00:00
bindings?: Record<string, ShapeBinding>
handles?: Record<string, ShapeHandle>
2021-05-26 10:34:10 +00:00
style: ShapeStyles
isLocked: boolean
isHidden: boolean
isAspectRatioLocked: boolean
2021-05-09 21:22:25 +00:00
}
export interface DotShape extends BaseShape {
type: ShapeType.Dot
}
export interface CircleShape extends BaseShape {
type: ShapeType.Circle
radius: number
}
export interface EllipseShape extends BaseShape {
type: ShapeType.Ellipse
radiusX: number
radiusY: number
}
export interface LineShape extends BaseShape {
type: ShapeType.Line
2021-05-14 21:05:21 +00:00
direction: number[]
2021-05-09 21:22:25 +00:00
}
export interface RayShape extends BaseShape {
type: ShapeType.Ray
2021-05-14 21:05:21 +00:00
direction: number[]
2021-05-09 21:22:25 +00:00
}
export interface PolylineShape extends BaseShape {
type: ShapeType.Polyline
points: number[][]
2021-05-09 21:22:25 +00:00
}
export interface RectangleShape extends BaseShape {
type: ShapeType.Rectangle
size: number[]
2021-05-26 10:34:10 +00:00
radius: number
2021-05-09 13:04:42 +00:00
}
2021-05-09 21:22:25 +00:00
2021-05-27 17:59:40 +00:00
export interface DrawShape extends BaseShape {
type: ShapeType.Draw
points: number[][]
}
2021-05-31 19:13:43 +00:00
export interface ArrowShape extends BaseShape {
type: ShapeType.Arrow
points: number[][]
handles: Record<string, ShapeHandle>
bend: number
decorations?: {
start: Decoration
end: Decoration
middle: Decoration
}
}
2021-05-25 11:16:01 +00:00
export type MutableShape =
| DotShape
2021-05-09 21:22:25 +00:00
| CircleShape
| EllipseShape
| LineShape
| RayShape
| PolylineShape
2021-05-27 17:59:40 +00:00
| DrawShape
2021-05-09 21:22:25 +00:00
| RectangleShape
2021-05-31 19:13:43 +00:00
| ArrowShape
2021-05-25 11:16:01 +00:00
export type Shape = Readonly<MutableShape>
2021-05-10 12:16:57 +00:00
export interface Shapes {
2021-05-25 11:16:01 +00:00
[ShapeType.Dot]: Readonly<DotShape>
[ShapeType.Circle]: Readonly<CircleShape>
[ShapeType.Ellipse]: Readonly<EllipseShape>
[ShapeType.Line]: Readonly<LineShape>
[ShapeType.Ray]: Readonly<RayShape>
[ShapeType.Polyline]: Readonly<PolylineShape>
2021-05-27 17:59:40 +00:00
[ShapeType.Draw]: Readonly<DrawShape>
2021-05-25 11:16:01 +00:00
[ShapeType.Rectangle]: Readonly<RectangleShape>
2021-05-31 19:13:43 +00:00
[ShapeType.Arrow]: Readonly<ArrowShape>
2021-05-17 10:01:11 +00:00
}
export type ShapeByType<T extends ShapeType> = Shapes[T]
2021-05-17 10:01:11 +00:00
export interface CodeFile {
id: string
name: string
code: string
}
2021-05-31 19:13:43 +00:00
export enum Decoration {
Arrow,
}
export interface ShapeBinding {
id: string
index: number
point: number[]
}
export interface ShapeHandle {
id: string
index: number
point: number[]
}
2021-05-17 10:01:11 +00:00
/* -------------------------------------------------- */
/* Editor UI */
/* -------------------------------------------------- */
export interface PointerInfo {
target: string
pointerId: number
origin: number[]
point: number[]
shiftKey: boolean
ctrlKey: boolean
metaKey: boolean
altKey: boolean
}
export enum Edge {
2021-05-28 20:30:27 +00:00
Top = 'top_edge',
Right = 'right_edge',
Bottom = 'bottom_edge',
Left = 'left_edge',
2021-05-17 10:01:11 +00:00
}
export enum Corner {
2021-05-28 20:30:27 +00:00
TopLeft = 'top_left_corner',
TopRight = 'top_right_corner',
BottomRight = 'bottom_right_corner',
BottomLeft = 'bottom_left_corner',
2021-05-17 10:01:11 +00:00
}
2021-05-10 12:16:57 +00:00
export interface Bounds {
minX: number
minY: number
maxX: number
maxY: number
width: number
height: number
}
2021-05-18 08:32:20 +00:00
export interface RotatedBounds extends Bounds {
rotation: number
}
2021-05-14 12:44:23 +00:00
export interface ShapeBounds extends Bounds {
id: string
}
export interface PointSnapshot extends Bounds {
nx: number
nmx: number
ny: number
nmy: number
}
export interface BoundsSnapshot extends PointSnapshot {
nw: number
nh: number
}
export type Difference<A, B> = A extends B ? never : A
export type ShapeSpecificProps<T extends Shape> = Pick<
T,
Difference<keyof T, keyof BaseShape>
>
2021-05-12 11:27:33 +00:00
export type ShapeIndicatorProps<T extends Shape> = ShapeSpecificProps<T>
2021-05-12 21:11:17 +00:00
2021-05-14 12:44:23 +00:00
export type ShapeUtil<K extends Shape> = {
2021-05-13 18:22:16 +00:00
create(props: Partial<K>): K
getBounds(shape: K): Bounds
hitTest(shape: K, test: number[]): boolean
hitTestBounds(shape: K, bounds: Bounds): boolean
rotate(shape: K): K
translate(shape: K, delta: number[]): K
scale(shape: K, scale: number): K
stretch(shape: K, scaleX: number, scaleY: number): K
render(shape: K): JSX.Element
2021-05-12 21:11:17 +00:00
}
2021-05-23 17:09:23 +00:00
export enum MoveType {
Backward,
Forward,
ToFront,
ToBack,
}
2021-05-26 19:20:52 +00:00
export enum AlignType {
Top,
CenterVertical,
Bottom,
Left,
CenterHorizontal,
Right,
}
export enum StretchType {
Horizontal,
Vertical,
}
export enum DistributeType {
Horizontal,
Vertical,
}
2021-05-17 10:01:11 +00:00
/* -------------------------------------------------- */
/* Code Editor */
/* -------------------------------------------------- */
2021-05-13 06:44:52 +00:00
2021-05-17 10:01:11 +00:00
export type IMonaco = typeof monaco
export type IMonacoEditor = monaco.editor.IStandaloneCodeEditor
export enum ControlType {
2021-05-28 20:30:27 +00:00
Number = 'number',
Vector = 'vector',
Text = 'text',
Select = 'select',
2021-05-13 06:44:52 +00:00
}
2021-05-14 12:44:23 +00:00
2021-05-17 10:01:11 +00:00
export interface BaseCodeControl {
id: string
type: ControlType
label: string
2021-05-14 12:44:23 +00:00
}
2021-05-17 10:01:11 +00:00
export interface NumberCodeControl extends BaseCodeControl {
type: ControlType.Number
min?: number
max?: number
value: number
step: number
format?: (value: number) => number
2021-05-14 12:44:23 +00:00
}
2021-05-14 22:56:41 +00:00
2021-05-17 10:01:11 +00:00
export interface VectorCodeControl extends BaseCodeControl {
type: ControlType.Vector
value: number[]
isNormalized: boolean
format?: (value: number[]) => number[]
}
2021-05-14 22:56:41 +00:00
2021-05-17 10:01:11 +00:00
export interface TextCodeControl extends BaseCodeControl {
type: ControlType.Text
value: string
format?: (value: string) => string
}
2021-05-28 20:30:27 +00:00
export interface SelectCodeControl<T extends string = ''>
2021-05-17 10:01:11 +00:00
extends BaseCodeControl {
type: ControlType.Select
value: T
options: T[]
format?: (string: T) => string
}
export type CodeControl =
| NumberCodeControl
| VectorCodeControl
| TextCodeControl
| SelectCodeControl
export type PropsOfType<T extends object, K> = {
[K in keyof T]: T[K] extends boolean ? K : never
}[keyof T]