您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

types.ts 3.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. import React from "react"
  2. export interface Data {
  3. isReadOnly: boolean
  4. camera: {
  5. point: number[]
  6. zoom: number
  7. }
  8. brush?: Bounds
  9. currentPageId: string
  10. selectedIds: Set<string>
  11. pointedId?: string
  12. document: {
  13. pages: Record<string, Page>
  14. }
  15. }
  16. export interface Page {
  17. id: string
  18. type: "page"
  19. childIndex: number
  20. name: string
  21. shapes: Record<string, Shape>
  22. }
  23. export enum ShapeType {
  24. Dot = "dot",
  25. Circle = "circle",
  26. Ellipse = "ellipse",
  27. Line = "line",
  28. Ray = "ray",
  29. Polyline = "polyline",
  30. Rectangle = "rectangle",
  31. // Glob = "glob",
  32. // Spline = "spline",
  33. // Cubic = "cubic",
  34. // Conic = "conic",
  35. }
  36. export interface BaseShape {
  37. id: string
  38. type: ShapeType
  39. parentId: string
  40. childIndex: number
  41. name: string
  42. point: number[]
  43. rotation: number
  44. style: Partial<React.SVGProps<SVGUseElement>>
  45. }
  46. export interface DotShape extends BaseShape {
  47. type: ShapeType.Dot
  48. }
  49. export interface CircleShape extends BaseShape {
  50. type: ShapeType.Circle
  51. radius: number
  52. }
  53. export interface EllipseShape extends BaseShape {
  54. type: ShapeType.Ellipse
  55. radiusX: number
  56. radiusY: number
  57. }
  58. export interface LineShape extends BaseShape {
  59. type: ShapeType.Line
  60. vector: number[]
  61. }
  62. export interface RayShape extends BaseShape {
  63. type: ShapeType.Ray
  64. vector: number[]
  65. }
  66. export interface PolylineShape extends BaseShape {
  67. type: ShapeType.Polyline
  68. points: number[][]
  69. }
  70. export interface RectangleShape extends BaseShape {
  71. type: ShapeType.Rectangle
  72. size: number[]
  73. }
  74. export type Shape =
  75. | DotShape
  76. | CircleShape
  77. | EllipseShape
  78. | LineShape
  79. | RayShape
  80. | PolylineShape
  81. | RectangleShape
  82. export interface Bounds {
  83. minX: number
  84. minY: number
  85. maxX: number
  86. maxY: number
  87. width: number
  88. height: number
  89. }
  90. export interface ShapeBounds extends Bounds {
  91. id: string
  92. }
  93. export interface PointSnapshot extends Bounds {
  94. nx: number
  95. nmx: number
  96. ny: number
  97. nmy: number
  98. }
  99. export interface BoundsSnapshot extends PointSnapshot {
  100. nw: number
  101. nh: number
  102. }
  103. export interface Shapes extends Record<ShapeType, Shape> {
  104. [ShapeType.Dot]: DotShape
  105. [ShapeType.Circle]: CircleShape
  106. [ShapeType.Ellipse]: EllipseShape
  107. [ShapeType.Line]: LineShape
  108. [ShapeType.Ray]: RayShape
  109. [ShapeType.Polyline]: PolylineShape
  110. [ShapeType.Rectangle]: RectangleShape
  111. }
  112. export type Difference<A, B> = A extends B ? never : A
  113. export type ShapeSpecificProps<T extends Shape> = Pick<
  114. T,
  115. Difference<keyof T, keyof BaseShape>
  116. >
  117. export type ShapeIndicatorProps<T extends Shape> = ShapeSpecificProps<T>
  118. export type ShapeUtil<K extends Shape> = {
  119. create(props: Partial<K>): K
  120. getBounds(shape: K): Bounds
  121. hitTest(shape: K, test: number[]): boolean
  122. hitTestBounds(shape: K, bounds: Bounds): boolean
  123. rotate(shape: K): K
  124. translate(shape: K, delta: number[]): K
  125. scale(shape: K, scale: number): K
  126. stretch(shape: K, scaleX: number, scaleY: number): K
  127. render(shape: K): JSX.Element
  128. }
  129. export interface PointerInfo {
  130. target: string
  131. pointerId: number
  132. origin: number[]
  133. point: number[]
  134. shiftKey: boolean
  135. ctrlKey: boolean
  136. metaKey: boolean
  137. altKey: boolean
  138. }
  139. export enum TransformEdge {
  140. Top = "top_edge",
  141. Right = "right_edge",
  142. Bottom = "bottom_edge",
  143. Left = "left_edge",
  144. }
  145. export enum TransformCorner {
  146. TopLeft = "top_left_corner",
  147. TopRight = "top_right_corner",
  148. BottomRight = "bottom_right_corner",
  149. BottomLeft = "bottom_left_corner",
  150. }