You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

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