@dxos/plugin-tldraw 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (401) hide show
  1. package/LICENSE +105 -0
  2. package/PLUGIN.mdl +412 -0
  3. package/README.md +3 -0
  4. package/dist/assets/embed-icons/codepen.png +0 -0
  5. package/dist/assets/embed-icons/codesandbox.png +0 -0
  6. package/dist/assets/embed-icons/desmos.png +0 -0
  7. package/dist/assets/embed-icons/excalidraw.png +0 -0
  8. package/dist/assets/embed-icons/felt.png +0 -0
  9. package/dist/assets/embed-icons/figma.png +0 -0
  10. package/dist/assets/embed-icons/github_gist.png +0 -0
  11. package/dist/assets/embed-icons/google_calendar.png +0 -0
  12. package/dist/assets/embed-icons/google_maps.png +0 -0
  13. package/dist/assets/embed-icons/google_slides.png +0 -0
  14. package/dist/assets/embed-icons/observable.png +0 -0
  15. package/dist/assets/embed-icons/replit.png +0 -0
  16. package/dist/assets/embed-icons/scratch.png +0 -0
  17. package/dist/assets/embed-icons/spotify.png +0 -0
  18. package/dist/assets/embed-icons/tldraw.png +0 -0
  19. package/dist/assets/embed-icons/val_town.png +0 -0
  20. package/dist/assets/embed-icons/vimeo.png +0 -0
  21. package/dist/assets/embed-icons/youtube.png +0 -0
  22. package/dist/assets/fonts/IBMPlexMono-Medium.woff2 +0 -0
  23. package/dist/assets/fonts/IBMPlexSans-Medium.woff2 +0 -0
  24. package/dist/assets/fonts/IBMPlexSerif-Medium.woff2 +0 -0
  25. package/dist/assets/fonts/Montserrat-Regular.woff2 +0 -0
  26. package/dist/assets/fonts/Shantell_Sans-Tldrawish.woff2 +0 -0
  27. package/dist/assets/icons/icon/0_merged.svg +1 -0
  28. package/dist/assets/icons/icon/align-bottom.svg +1 -0
  29. package/dist/assets/icons/icon/align-center-horizontal.svg +1 -0
  30. package/dist/assets/icons/icon/align-center-vertical.svg +1 -0
  31. package/dist/assets/icons/icon/align-left.svg +1 -0
  32. package/dist/assets/icons/icon/align-right.svg +1 -0
  33. package/dist/assets/icons/icon/align-top.svg +1 -0
  34. package/dist/assets/icons/icon/arrow-left.svg +1 -0
  35. package/dist/assets/icons/icon/arrowhead-arrow.svg +1 -0
  36. package/dist/assets/icons/icon/arrowhead-bar.svg +1 -0
  37. package/dist/assets/icons/icon/arrowhead-diamond.svg +1 -0
  38. package/dist/assets/icons/icon/arrowhead-dot.svg +1 -0
  39. package/dist/assets/icons/icon/arrowhead-none.svg +1 -0
  40. package/dist/assets/icons/icon/arrowhead-square.svg +1 -0
  41. package/dist/assets/icons/icon/arrowhead-triangle-inverted.svg +1 -0
  42. package/dist/assets/icons/icon/arrowhead-triangle.svg +1 -0
  43. package/dist/assets/icons/icon/blob.svg +1 -0
  44. package/dist/assets/icons/icon/bring-forward.svg +1 -0
  45. package/dist/assets/icons/icon/bring-to-front.svg +1 -0
  46. package/dist/assets/icons/icon/broken.svg +1 -0
  47. package/dist/assets/icons/icon/chat-teardrop-text.svg +1 -0
  48. package/dist/assets/icons/icon/check-circle.svg +1 -0
  49. package/dist/assets/icons/icon/check.svg +1 -0
  50. package/dist/assets/icons/icon/chevron-down.svg +1 -0
  51. package/dist/assets/icons/icon/chevron-left.svg +1 -0
  52. package/dist/assets/icons/icon/chevron-right.svg +1 -0
  53. package/dist/assets/icons/icon/chevron-up.svg +1 -0
  54. package/dist/assets/icons/icon/chevrons-ne.svg +1 -0
  55. package/dist/assets/icons/icon/chevrons-sw.svg +1 -0
  56. package/dist/assets/icons/icon/clipboard-copied.svg +1 -0
  57. package/dist/assets/icons/icon/clipboard-copy.svg +1 -0
  58. package/dist/assets/icons/icon/color.svg +1 -0
  59. package/dist/assets/icons/icon/cross-2.svg +1 -0
  60. package/dist/assets/icons/icon/cross-circle.svg +1 -0
  61. package/dist/assets/icons/icon/dash-dashed.svg +1 -0
  62. package/dist/assets/icons/icon/dash-dotted.svg +1 -0
  63. package/dist/assets/icons/icon/dash-draw.svg +1 -0
  64. package/dist/assets/icons/icon/dash-solid.svg +1 -0
  65. package/dist/assets/icons/icon/disconnected.svg +1 -0
  66. package/dist/assets/icons/icon/discord.svg +1 -0
  67. package/dist/assets/icons/icon/distribute-horizontal.svg +1 -0
  68. package/dist/assets/icons/icon/distribute-vertical.svg +1 -0
  69. package/dist/assets/icons/icon/dot.svg +1 -0
  70. package/dist/assets/icons/icon/dots-horizontal.svg +1 -0
  71. package/dist/assets/icons/icon/dots-vertical.svg +1 -0
  72. package/dist/assets/icons/icon/drag-handle-dots.svg +1 -0
  73. package/dist/assets/icons/icon/duplicate.svg +1 -0
  74. package/dist/assets/icons/icon/edit.svg +1 -0
  75. package/dist/assets/icons/icon/external-link.svg +1 -0
  76. package/dist/assets/icons/icon/fill-fill.svg +1 -0
  77. package/dist/assets/icons/icon/fill-none.svg +1 -0
  78. package/dist/assets/icons/icon/fill-pattern.svg +1 -0
  79. package/dist/assets/icons/icon/fill-semi.svg +1 -0
  80. package/dist/assets/icons/icon/fill-solid.svg +1 -0
  81. package/dist/assets/icons/icon/follow.svg +1 -0
  82. package/dist/assets/icons/icon/following.svg +1 -0
  83. package/dist/assets/icons/icon/font-draw.svg +8 -0
  84. package/dist/assets/icons/icon/font-mono.svg +1 -0
  85. package/dist/assets/icons/icon/font-sans.svg +1 -0
  86. package/dist/assets/icons/icon/font-serif.svg +1 -0
  87. package/dist/assets/icons/icon/geo-arrow-down.svg +1 -0
  88. package/dist/assets/icons/icon/geo-arrow-left.svg +1 -0
  89. package/dist/assets/icons/icon/geo-arrow-right.svg +1 -0
  90. package/dist/assets/icons/icon/geo-arrow-up.svg +1 -0
  91. package/dist/assets/icons/icon/geo-check-box.svg +1 -0
  92. package/dist/assets/icons/icon/geo-cloud.svg +1 -0
  93. package/dist/assets/icons/icon/geo-diamond.svg +1 -0
  94. package/dist/assets/icons/icon/geo-ellipse.svg +1 -0
  95. package/dist/assets/icons/icon/geo-heart.svg +1 -0
  96. package/dist/assets/icons/icon/geo-hexagon.svg +1 -0
  97. package/dist/assets/icons/icon/geo-octagon.svg +1 -0
  98. package/dist/assets/icons/icon/geo-oval.svg +1 -0
  99. package/dist/assets/icons/icon/geo-pentagon.svg +1 -0
  100. package/dist/assets/icons/icon/geo-rectangle.svg +1 -0
  101. package/dist/assets/icons/icon/geo-rhombus-2.svg +1 -0
  102. package/dist/assets/icons/icon/geo-rhombus.svg +1 -0
  103. package/dist/assets/icons/icon/geo-star.svg +1 -0
  104. package/dist/assets/icons/icon/geo-trapezoid.svg +1 -0
  105. package/dist/assets/icons/icon/geo-triangle.svg +1 -0
  106. package/dist/assets/icons/icon/geo-x-box.svg +1 -0
  107. package/dist/assets/icons/icon/github.svg +1 -0
  108. package/dist/assets/icons/icon/group.svg +1 -0
  109. package/dist/assets/icons/icon/horizontal-align-end.svg +1 -0
  110. package/dist/assets/icons/icon/horizontal-align-middle.svg +1 -0
  111. package/dist/assets/icons/icon/horizontal-align-start.svg +1 -0
  112. package/dist/assets/icons/icon/icon-names.json +143 -0
  113. package/dist/assets/icons/icon/info-circle.svg +1 -0
  114. package/dist/assets/icons/icon/leading.svg +1 -0
  115. package/dist/assets/icons/icon/link.svg +1 -0
  116. package/dist/assets/icons/icon/lock.svg +1 -0
  117. package/dist/assets/icons/icon/menu.svg +1 -0
  118. package/dist/assets/icons/icon/minus.svg +1 -0
  119. package/dist/assets/icons/icon/mixed.svg +1 -0
  120. package/dist/assets/icons/icon/pack.svg +1 -0
  121. package/dist/assets/icons/icon/plus.svg +1 -0
  122. package/dist/assets/icons/icon/question-mark-circle.svg +1 -0
  123. package/dist/assets/icons/icon/question-mark.svg +1 -0
  124. package/dist/assets/icons/icon/redo.svg +1 -0
  125. package/dist/assets/icons/icon/reset-zoom.svg +1 -0
  126. package/dist/assets/icons/icon/rotate-ccw.svg +1 -0
  127. package/dist/assets/icons/icon/rotate-cw.svg +1 -0
  128. package/dist/assets/icons/icon/send-backward.svg +1 -0
  129. package/dist/assets/icons/icon/send-to-back.svg +1 -0
  130. package/dist/assets/icons/icon/share-1.svg +1 -0
  131. package/dist/assets/icons/icon/size-extra-large.svg +1 -0
  132. package/dist/assets/icons/icon/size-large.svg +1 -0
  133. package/dist/assets/icons/icon/size-medium.svg +1 -0
  134. package/dist/assets/icons/icon/size-small.svg +1 -0
  135. package/dist/assets/icons/icon/spline-cubic.svg +1 -0
  136. package/dist/assets/icons/icon/spline-line.svg +1 -0
  137. package/dist/assets/icons/icon/stack-horizontal.svg +1 -0
  138. package/dist/assets/icons/icon/stack-vertical.svg +1 -0
  139. package/dist/assets/icons/icon/status-offline.svg +1 -0
  140. package/dist/assets/icons/icon/stretch-horizontal.svg +1 -0
  141. package/dist/assets/icons/icon/stretch-vertical.svg +1 -0
  142. package/dist/assets/icons/icon/text-align-center.svg +1 -0
  143. package/dist/assets/icons/icon/text-align-left.svg +1 -0
  144. package/dist/assets/icons/icon/text-align-right.svg +1 -0
  145. package/dist/assets/icons/icon/toggle-off.svg +1 -0
  146. package/dist/assets/icons/icon/toggle-on.svg +1 -0
  147. package/dist/assets/icons/icon/tool-arrow.svg +1 -0
  148. package/dist/assets/icons/icon/tool-eraser.svg +1 -0
  149. package/dist/assets/icons/icon/tool-frame.svg +1 -0
  150. package/dist/assets/icons/icon/tool-hand.svg +1 -0
  151. package/dist/assets/icons/icon/tool-highlight.svg +1 -0
  152. package/dist/assets/icons/icon/tool-laser.svg +1 -0
  153. package/dist/assets/icons/icon/tool-line.svg +1 -0
  154. package/dist/assets/icons/icon/tool-media.svg +1 -0
  155. package/dist/assets/icons/icon/tool-note.svg +1 -0
  156. package/dist/assets/icons/icon/tool-pencil.svg +1 -0
  157. package/dist/assets/icons/icon/tool-pointer.svg +1 -0
  158. package/dist/assets/icons/icon/tool-screenshot.svg +1 -0
  159. package/dist/assets/icons/icon/tool-text.svg +1 -0
  160. package/dist/assets/icons/icon/trash.svg +1 -0
  161. package/dist/assets/icons/icon/twitter.svg +1 -0
  162. package/dist/assets/icons/icon/undo.svg +1 -0
  163. package/dist/assets/icons/icon/ungroup.svg +1 -0
  164. package/dist/assets/icons/icon/unlock.svg +1 -0
  165. package/dist/assets/icons/icon/vertical-align-end.svg +1 -0
  166. package/dist/assets/icons/icon/vertical-align-middle.svg +1 -0
  167. package/dist/assets/icons/icon/vertical-align-start.svg +1 -0
  168. package/dist/assets/icons/icon/warning-triangle.svg +1 -0
  169. package/dist/assets/icons/icon/zoom-in.svg +1 -0
  170. package/dist/assets/icons/icon/zoom-out.svg +1 -0
  171. package/dist/assets/translations/ar.json +295 -0
  172. package/dist/assets/translations/ca.json +295 -0
  173. package/dist/assets/translations/cs.json +352 -0
  174. package/dist/assets/translations/da.json +160 -0
  175. package/dist/assets/translations/de.json +310 -0
  176. package/dist/assets/translations/en.json +1 -0
  177. package/dist/assets/translations/es.json +299 -0
  178. package/dist/assets/translations/fa.json +384 -0
  179. package/dist/assets/translations/fi.json +312 -0
  180. package/dist/assets/translations/fr.json +372 -0
  181. package/dist/assets/translations/gl.json +349 -0
  182. package/dist/assets/translations/he.json +86 -0
  183. package/dist/assets/translations/hi-in.json +290 -0
  184. package/dist/assets/translations/hr.json +358 -0
  185. package/dist/assets/translations/hu.json +365 -0
  186. package/dist/assets/translations/id.json +373 -0
  187. package/dist/assets/translations/it.json +330 -0
  188. package/dist/assets/translations/ja.json +351 -0
  189. package/dist/assets/translations/ko-kr.json +396 -0
  190. package/dist/assets/translations/ku.json +93 -0
  191. package/dist/assets/translations/languages.json +150 -0
  192. package/dist/assets/translations/main.json +396 -0
  193. package/dist/assets/translations/my.json +112 -0
  194. package/dist/assets/translations/ne.json +295 -0
  195. package/dist/assets/translations/no.json +62 -0
  196. package/dist/assets/translations/pl.json +113 -0
  197. package/dist/assets/translations/pt-br.json +333 -0
  198. package/dist/assets/translations/pt-pt.json +86 -0
  199. package/dist/assets/translations/ro.json +371 -0
  200. package/dist/assets/translations/ru.json +375 -0
  201. package/dist/assets/translations/sl.json +373 -0
  202. package/dist/assets/translations/sv.json +96 -0
  203. package/dist/assets/translations/te.json +112 -0
  204. package/dist/assets/translations/th.json +295 -0
  205. package/dist/assets/translations/tr.json +355 -0
  206. package/dist/assets/translations/uk.json +375 -0
  207. package/dist/assets/translations/vi.json +295 -0
  208. package/dist/assets/translations/zh-cn.json +386 -0
  209. package/dist/assets/translations/zh-tw.json +340 -0
  210. package/dist/lib/TldrawPlugin.mjs +22 -0
  211. package/dist/lib/TldrawPlugin.mjs.map +1 -0
  212. package/dist/lib/assets/plugin-tldraw-BDrn_mrV.css +24 -0
  213. package/dist/lib/capabilities.mjs +8 -0
  214. package/dist/lib/capabilities.mjs.map +1 -0
  215. package/dist/lib/chunk-TldrawArticle.mjs +60 -0
  216. package/dist/lib/chunk-TldrawArticle.mjs.map +1 -0
  217. package/dist/lib/chunk-TldrawCard.mjs +35 -0
  218. package/dist/lib/chunk-TldrawCard.mjs.map +1 -0
  219. package/dist/lib/chunk-meta.mjs +40 -0
  220. package/dist/lib/chunk-meta.mjs.map +1 -0
  221. package/dist/lib/chunk-settings.mjs +23 -0
  222. package/dist/lib/chunk-settings.mjs.map +1 -0
  223. package/dist/lib/chunk-sketch-variant.mjs +23 -0
  224. package/dist/lib/chunk-sketch-variant.mjs.map +1 -0
  225. package/dist/lib/chunk-types.mjs +73 -0
  226. package/dist/lib/chunk-types.mjs.map +1 -0
  227. package/dist/lib/components.mjs +443 -0
  228. package/dist/lib/components.mjs.map +1 -0
  229. package/dist/lib/containers.mjs +8 -0
  230. package/dist/lib/containers.mjs.map +1 -0
  231. package/dist/lib/hooks.mjs +116 -0
  232. package/dist/lib/hooks.mjs.map +1 -0
  233. package/dist/lib/index.mjs +4 -0
  234. package/dist/lib/meta.mjs +2 -0
  235. package/dist/lib/model.mjs +905 -0
  236. package/dist/lib/model.mjs.map +1 -0
  237. package/dist/lib/plugin.mjs +8 -0
  238. package/dist/lib/plugin.mjs.map +1 -0
  239. package/dist/lib/testing.mjs +246 -0
  240. package/dist/lib/testing.mjs.map +1 -0
  241. package/dist/lib/translations.mjs +10 -0
  242. package/dist/lib/translations.mjs.map +1 -0
  243. package/dist/lib/types.mjs +2 -0
  244. package/dist/types/dx.config.d.ts +28 -0
  245. package/dist/types/dx.config.d.ts.map +1 -0
  246. package/dist/types/src/TldrawPlugin.d.ts +4 -0
  247. package/dist/types/src/TldrawPlugin.d.ts.map +1 -0
  248. package/dist/types/src/capabilities/index.d.ts +4 -0
  249. package/dist/types/src/capabilities/index.d.ts.map +1 -0
  250. package/dist/types/src/capabilities/settings.d.ts +5 -0
  251. package/dist/types/src/capabilities/settings.d.ts.map +1 -0
  252. package/dist/types/src/capabilities/sketch-variant.d.ts +5 -0
  253. package/dist/types/src/capabilities/sketch-variant.d.ts.map +1 -0
  254. package/dist/types/src/components/Canvas/Canvas.d.ts +17 -0
  255. package/dist/types/src/components/Canvas/Canvas.d.ts.map +1 -0
  256. package/dist/types/src/components/Canvas/Canvas.stories.d.ts +15 -0
  257. package/dist/types/src/components/Canvas/Canvas.stories.d.ts.map +1 -0
  258. package/dist/types/src/components/Canvas/index.d.ts +4 -0
  259. package/dist/types/src/components/Canvas/index.d.ts.map +1 -0
  260. package/dist/types/src/components/actions.d.ts +6 -0
  261. package/dist/types/src/components/actions.d.ts.map +1 -0
  262. package/dist/types/src/components/custom/CustomGrid.d.ts +12 -0
  263. package/dist/types/src/components/custom/CustomGrid.d.ts.map +1 -0
  264. package/dist/types/src/components/custom/CustomMenu.d.ts +4 -0
  265. package/dist/types/src/components/custom/CustomMenu.d.ts.map +1 -0
  266. package/dist/types/src/components/custom/CustomStylePanel.d.ts +4 -0
  267. package/dist/types/src/components/custom/CustomStylePanel.d.ts.map +1 -0
  268. package/dist/types/src/components/custom/CustomToolbar.d.ts +10 -0
  269. package/dist/types/src/components/custom/CustomToolbar.d.ts.map +1 -0
  270. package/dist/types/src/components/custom/DottedGrid.d.ts +4 -0
  271. package/dist/types/src/components/custom/DottedGrid.d.ts.map +1 -0
  272. package/dist/types/src/components/custom/MeshGrid.d.ts +4 -0
  273. package/dist/types/src/components/custom/MeshGrid.d.ts.map +1 -0
  274. package/dist/types/src/components/custom/index.d.ts +6 -0
  275. package/dist/types/src/components/custom/index.d.ts.map +1 -0
  276. package/dist/types/src/components/index.d.ts +2 -0
  277. package/dist/types/src/components/index.d.ts.map +1 -0
  278. package/dist/types/src/containers/TldrawArticle/TldrawArticle.d.ts +8 -0
  279. package/dist/types/src/containers/TldrawArticle/TldrawArticle.d.ts.map +1 -0
  280. package/dist/types/src/containers/TldrawArticle/index.d.ts +2 -0
  281. package/dist/types/src/containers/TldrawArticle/index.d.ts.map +1 -0
  282. package/dist/types/src/containers/TldrawCard/TldrawCard.d.ts +9 -0
  283. package/dist/types/src/containers/TldrawCard/TldrawCard.d.ts.map +1 -0
  284. package/dist/types/src/containers/TldrawCard/TldrawCard.stories.d.ts +15 -0
  285. package/dist/types/src/containers/TldrawCard/TldrawCard.stories.d.ts.map +1 -0
  286. package/dist/types/src/containers/TldrawCard/index.d.ts +2 -0
  287. package/dist/types/src/containers/TldrawCard/index.d.ts.map +1 -0
  288. package/dist/types/src/containers/index.d.ts +4 -0
  289. package/dist/types/src/containers/index.d.ts.map +1 -0
  290. package/dist/types/src/hooks/adapter.d.ts +15 -0
  291. package/dist/types/src/hooks/adapter.d.ts.map +1 -0
  292. package/dist/types/src/hooks/adapter.test.d.ts +2 -0
  293. package/dist/types/src/hooks/adapter.test.d.ts.map +1 -0
  294. package/dist/types/src/hooks/index.d.ts +3 -0
  295. package/dist/types/src/hooks/index.d.ts.map +1 -0
  296. package/dist/types/src/hooks/useStoreAdapter.d.ts +11 -0
  297. package/dist/types/src/hooks/useStoreAdapter.d.ts.map +1 -0
  298. package/dist/types/src/index.d.ts +4 -0
  299. package/dist/types/src/index.d.ts.map +1 -0
  300. package/dist/types/src/meta.d.ts +33 -0
  301. package/dist/types/src/meta.d.ts.map +1 -0
  302. package/dist/types/src/migrations/index.d.ts +3 -0
  303. package/dist/types/src/migrations/index.d.ts.map +1 -0
  304. package/dist/types/src/migrations/migrate.d.ts +9 -0
  305. package/dist/types/src/migrations/migrate.d.ts.map +1 -0
  306. package/dist/types/src/migrations/schema.d.ts +7 -0
  307. package/dist/types/src/migrations/schema.d.ts.map +1 -0
  308. package/dist/types/src/model/TldrawBuilder.d.ts +110 -0
  309. package/dist/types/src/model/TldrawBuilder.d.ts.map +1 -0
  310. package/dist/types/src/model/TldrawBuilder.test.d.ts +2 -0
  311. package/dist/types/src/model/TldrawBuilder.test.d.ts.map +1 -0
  312. package/dist/types/src/model/apply.d.ts +5 -0
  313. package/dist/types/src/model/apply.d.ts.map +1 -0
  314. package/dist/types/src/model/builder.d.ts +3 -0
  315. package/dist/types/src/model/builder.d.ts.map +1 -0
  316. package/dist/types/src/model/index.d.ts +6 -0
  317. package/dist/types/src/model/index.d.ts.map +1 -0
  318. package/dist/types/src/model/read.d.ts +8 -0
  319. package/dist/types/src/model/read.d.ts.map +1 -0
  320. package/dist/types/src/model/render.d.ts +27 -0
  321. package/dist/types/src/model/render.d.ts.map +1 -0
  322. package/dist/types/src/model/scene.test.d.ts +2 -0
  323. package/dist/types/src/model/scene.test.d.ts.map +1 -0
  324. package/dist/types/src/plugin.d.ts +3 -0
  325. package/dist/types/src/plugin.d.ts.map +1 -0
  326. package/dist/types/src/testing/data.d.ts +242 -0
  327. package/dist/types/src/testing/data.d.ts.map +1 -0
  328. package/dist/types/src/testing/index.d.ts +2 -0
  329. package/dist/types/src/testing/index.d.ts.map +1 -0
  330. package/dist/types/src/testing/schema.d.ts +7 -0
  331. package/dist/types/src/testing/schema.d.ts.map +1 -0
  332. package/dist/types/src/translations.d.ts +9 -0
  333. package/dist/types/src/translations.d.ts.map +1 -0
  334. package/dist/types/src/types/Settings.d.ts +10 -0
  335. package/dist/types/src/types/Settings.d.ts.map +1 -0
  336. package/dist/types/src/types/Tldraw.d.ts +25 -0
  337. package/dist/types/src/types/Tldraw.d.ts.map +1 -0
  338. package/dist/types/src/types/TldrawCapabilities.d.ts +4 -0
  339. package/dist/types/src/types/TldrawCapabilities.d.ts.map +1 -0
  340. package/dist/types/src/types/index.d.ts +4 -0
  341. package/dist/types/src/types/index.d.ts.map +1 -0
  342. package/dist/types/src/types/types.d.ts +6 -0
  343. package/dist/types/src/types/types.d.ts.map +1 -0
  344. package/dist/types/src/variant.test.d.ts +2 -0
  345. package/dist/types/src/variant.test.d.ts.map +1 -0
  346. package/dist/types/tsconfig.tsbuildinfo +1 -0
  347. package/dx.config.ts +35 -0
  348. package/package.json +157 -0
  349. package/src/TldrawPlugin.tsx +31 -0
  350. package/src/capabilities/index.ts +8 -0
  351. package/src/capabilities/settings.ts +31 -0
  352. package/src/capabilities/sketch-variant.ts +29 -0
  353. package/src/components/Canvas/Canvas.stories.tsx +101 -0
  354. package/src/components/Canvas/Canvas.tsx +284 -0
  355. package/src/components/Canvas/index.ts +9 -0
  356. package/src/components/Canvas/theme.css +23 -0
  357. package/src/components/actions.ts +42 -0
  358. package/src/components/custom/CustomGrid.tsx +61 -0
  359. package/src/components/custom/CustomMenu.tsx +31 -0
  360. package/src/components/custom/CustomStylePanel.tsx +38 -0
  361. package/src/components/custom/CustomToolbar.tsx +88 -0
  362. package/src/components/custom/DottedGrid.tsx +53 -0
  363. package/src/components/custom/MeshGrid.tsx +47 -0
  364. package/src/components/custom/index.ts +9 -0
  365. package/src/components/index.ts +5 -0
  366. package/src/containers/TldrawArticle/TldrawArticle.tsx +78 -0
  367. package/src/containers/TldrawArticle/index.ts +5 -0
  368. package/src/containers/TldrawCard/TldrawCard.stories.tsx +53 -0
  369. package/src/containers/TldrawCard/TldrawCard.tsx +32 -0
  370. package/src/containers/TldrawCard/index.ts +5 -0
  371. package/src/containers/index.ts +8 -0
  372. package/src/hooks/adapter.test.ts +20 -0
  373. package/src/hooks/adapter.ts +83 -0
  374. package/src/hooks/index.ts +6 -0
  375. package/src/hooks/useStoreAdapter.ts +55 -0
  376. package/src/index.ts +7 -0
  377. package/src/meta.ts +9 -0
  378. package/src/migrations/index.ts +6 -0
  379. package/src/migrations/migrate.ts +49 -0
  380. package/src/migrations/schema.ts +98 -0
  381. package/src/model/TldrawBuilder.test.ts +72 -0
  382. package/src/model/TldrawBuilder.ts +443 -0
  383. package/src/model/apply.ts +132 -0
  384. package/src/model/builder.ts +31 -0
  385. package/src/model/index.ts +9 -0
  386. package/src/model/read.ts +203 -0
  387. package/src/model/render.ts +191 -0
  388. package/src/model/scene.test.ts +222 -0
  389. package/src/plugin.ts +9 -0
  390. package/src/testing/data.ts +238 -0
  391. package/src/testing/index.ts +5 -0
  392. package/src/testing/schema.ts +98 -0
  393. package/src/translations.ts +18 -0
  394. package/src/types/Settings.ts +32 -0
  395. package/src/types/Tldraw.ts +38 -0
  396. package/src/types/TldrawCapabilities.ts +17 -0
  397. package/src/types/index.ts +8 -0
  398. package/src/types/types.ts +11 -0
  399. package/src/typings.d.ts +8 -0
  400. package/src/variant.test.ts +142 -0
  401. package/src/vite-env.d.ts +10 -0
@@ -0,0 +1,23 @@
1
+ import { i as makeCanvas, n as Canvas } from "./chunk-types.mjs";
2
+ import { Capability } from "@dxos/app-framework";
3
+ import { Type } from "@dxos/echo";
4
+ import * as Effect from "effect/Effect";
5
+ import { IllustratorCapabilities } from "@dxos/plugin-illustrator/types";
6
+ import { TldrawArticle, TldrawCard } from "#containers";
7
+ import { tldrawBuilder } from "#model";
8
+ //#region src/capabilities/sketch-variant.ts
9
+ var variant = {
10
+ id: Type.getTypename(Canvas),
11
+ label: "tldraw",
12
+ icon: "ph--compass-tool--regular",
13
+ canvasType: Canvas,
14
+ createCanvas: () => Effect.sync(() => makeCanvas()),
15
+ builder: tldrawBuilder,
16
+ card: TldrawCard,
17
+ article: TldrawArticle
18
+ };
19
+ var sketch_variant_default = Capability.makeModule(() => Effect.succeed(Capability.contributes(IllustratorCapabilities.VariantProvider, variant)));
20
+ //#endregion
21
+ export { sketch_variant_default as default };
22
+
23
+ //# sourceMappingURL=chunk-sketch-variant.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-sketch-variant.mjs","names":[],"sources":["../../src/capabilities/sketch-variant.ts"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability } from '@dxos/app-framework';\nimport { Type } from '@dxos/echo';\nimport { IllustratorCapabilities, type SketchVariant } from '@dxos/plugin-illustrator/types';\n\nimport { TldrawArticle, TldrawCard } from '#containers';\nimport { tldrawBuilder } from '#model';\n\nimport { Tldraw } from '../types';\n\nconst variant: SketchVariant = {\n id: Type.getTypename(Tldraw.Canvas),\n label: 'tldraw',\n icon: 'ph--compass-tool--regular',\n canvasType: Tldraw.Canvas,\n createCanvas: () => Effect.sync(() => Tldraw.makeCanvas()),\n builder: tldrawBuilder,\n card: TldrawCard,\n article: TldrawArticle,\n};\n\nexport default Capability.makeModule(() =>\n Effect.succeed(Capability.contributes(IllustratorCapabilities.VariantProvider, variant)),\n);\n"],"mappings":";;;;;;;;AAeA,IAAM,UAAyB;CAC7B,IAAI,KAAK,YAAY,MAAa;CAClC,OAAO;CACP,MAAM;CACN,YAAY;CACZ,oBAAoB,OAAO,WAAW,WAAkB,CAAC;CACzD,SAAS;CACT,MAAM;CACN,SAAS;AACX;AAEA,IAAA,yBAAe,WAAW,iBACxB,OAAO,QAAQ,WAAW,YAAY,wBAAwB,iBAAiB,OAAO,CAAC,CACzF"}
@@ -0,0 +1,73 @@
1
+ import { Capability } from "@dxos/app-framework";
2
+ import { DXN, Obj, Type } from "@dxos/echo";
3
+ import * as Schema from "effect/Schema";
4
+ import { HiddenAnnotation } from "@dxos/echo/Annotation";
5
+ import { meta } from "#meta";
6
+ //#region \0rolldown/runtime.js
7
+ var __defProp = Object.defineProperty;
8
+ var __exportAll = (all, no_symbols) => {
9
+ let target = {};
10
+ for (var name in all) __defProp(target, name, {
11
+ get: all[name],
12
+ enumerable: true
13
+ });
14
+ if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
15
+ return target;
16
+ };
17
+ //#endregion
18
+ //#region src/types/Settings.ts
19
+ var Settings_exports = /* @__PURE__ */ __exportAll({
20
+ GridSchema: () => GridSchema,
21
+ Settings: () => Settings$1
22
+ });
23
+ var GridSchema = Schema.Union(Schema.Literal("mesh").annotations({ title: "Mesh" }), Schema.Literal("dotted").annotations({ title: "Dotted" }));
24
+ var Settings$1 = Schema.mutable(Schema.Struct({
25
+ showGrid: Schema.optional(Schema.Boolean.annotations({
26
+ title: "Show grid",
27
+ description: "Display a background grid on the sketch canvas."
28
+ })),
29
+ gridType: Schema.optional(GridSchema.annotations({
30
+ title: "Grid type",
31
+ description: "Choose between a mesh or dotted background grid."
32
+ }))
33
+ }));
34
+ //#endregion
35
+ //#region src/types/Tldraw.ts
36
+ var Tldraw_exports = /* @__PURE__ */ __exportAll({
37
+ Canvas: () => Canvas,
38
+ TLDRAW_SCHEMA: () => TLDRAW_SCHEMA,
39
+ isCanvas: () => isCanvas,
40
+ makeCanvas: () => makeCanvas
41
+ });
42
+ var TLDRAW_SCHEMA = "tldraw.com/2";
43
+ /**
44
+ * Persisted tldraw canvas: an opaque map of RecordId → TLRecord managed by the store adapter.
45
+ * Referenced by the base `Sketch` (plugin-illustrator) as its renderer-specific canvas.
46
+ * Keeps the pre-variant typename (`org.dxos.type.canvas`) so existing stored sketches load
47
+ * without a data migration.
48
+ */
49
+ var Canvas = class extends Type.makeObject(DXN.make("org.dxos.type.canvas", "0.1.0"))(Schema.Struct({
50
+ /** Fully qualified external schema reference. */
51
+ schema: Schema.String.pipe(Schema.optional),
52
+ content: Schema.Record({
53
+ key: Schema.String,
54
+ value: Schema.Any
55
+ })
56
+ }).pipe(HiddenAnnotation.set(true))) {};
57
+ /**
58
+ * Creates an empty {@link Canvas}.
59
+ */
60
+ var makeCanvas = ({ schema = TLDRAW_SCHEMA, content = {} } = {}) => Obj.make(Canvas, {
61
+ schema,
62
+ content
63
+ });
64
+ /** Type guard for {@link Canvas} objects. */
65
+ var isCanvas = (object) => Obj.instanceOf(Canvas, object);
66
+ //#endregion
67
+ //#region src/types/TldrawCapabilities.ts
68
+ var TldrawCapabilities_exports = /* @__PURE__ */ __exportAll({ Settings: () => Settings });
69
+ var Settings = Capability.make(`${meta.profile.key}.capability.settings`);
70
+ //#endregion
71
+ export { Settings_exports as a, makeCanvas as i, Canvas as n, __exportAll as o, Tldraw_exports as r, TldrawCapabilities_exports as t };
72
+
73
+ //# sourceMappingURL=chunk-types.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-types.mjs","names":[],"sources":["../../src/types/Settings.ts","../../src/types/Tldraw.ts","../../src/types/TldrawCapabilities.ts"],"sourcesContent":["//\n// Copyright 2023 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Schema from 'effect/Schema';\n\nexport const GridSchema = Schema.Union(\n Schema.Literal('mesh').annotations({ title: 'Mesh' }),\n Schema.Literal('dotted').annotations({ title: 'Dotted' }),\n);\nexport type GridType = Schema.Schema.Type<typeof GridSchema>;\n\nexport const Settings = Schema.mutable(\n Schema.Struct({\n showGrid: Schema.optional(\n Schema.Boolean.annotations({\n title: 'Show grid',\n description: 'Display a background grid on the sketch canvas.',\n }),\n ),\n gridType: Schema.optional(\n GridSchema.annotations({\n title: 'Grid type',\n description: 'Choose between a mesh or dotted background grid.',\n }),\n ),\n }),\n);\n\nexport interface Settings extends Schema.Schema.Type<typeof Settings> {}\n","//\n// Copyright 2024 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Schema from 'effect/Schema';\n\nimport { DXN, Obj, Type } from '@dxos/echo';\nimport { HiddenAnnotation } from '@dxos/echo/Annotation';\n\nexport const TLDRAW_SCHEMA = 'tldraw.com/2';\n\n/**\n * Persisted tldraw canvas: an opaque map of RecordId → TLRecord managed by the store adapter.\n * Referenced by the base `Sketch` (plugin-illustrator) as its renderer-specific canvas.\n * Keeps the pre-variant typename (`org.dxos.type.canvas`) so existing stored sketches load\n * without a data migration.\n */\nexport class Canvas extends Type.makeObject<Canvas>(DXN.make('org.dxos.type.canvas', '0.1.0'))(\n Schema.Struct({\n /** Fully qualified external schema reference. */\n // TODO(wittjosiah): Remove once the schema is fully internalized.\n schema: Schema.String.pipe(Schema.optional),\n content: Schema.Record({ key: Schema.String, value: Schema.Any }),\n }).pipe(HiddenAnnotation.set(true)),\n) {}\n\nexport type MakeOptions = Partial<Obj.MakeProps<typeof Canvas>>;\n\n/**\n * Creates an empty {@link Canvas}.\n */\nexport const makeCanvas = ({ schema = TLDRAW_SCHEMA, content = {} }: MakeOptions = {}): Canvas =>\n Obj.make(Canvas, { schema, content });\n\n/** Type guard for {@link Canvas} objects. */\nexport const isCanvas = (object: unknown): object is Canvas => Obj.instanceOf(Canvas, object);\n","//\n// Copyright 2025 DXOS.org\n//\n\n// @import-as-namespace\n\nimport { type Atom } from '@effect-atom/atom-react';\n\nimport { Capability } from '@dxos/app-framework';\n\nimport { meta } from '#meta';\n\n// Inline import to avoid `Settings` namespace alias colliding with the\n// `Settings` capability export below.\nexport const Settings = Capability.make<Atom.Writable<import('./Settings').Settings>>(\n `${meta.profile.key}.capability.settings`,\n);\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAQA,IAAa,aAAa,OAAO,MAC/B,OAAO,QAAQ,MAAM,CAAC,CAAC,YAAY,EAAE,OAAO,OAAO,CAAC,GACpD,OAAO,QAAQ,QAAQ,CAAC,CAAC,YAAY,EAAE,OAAO,SAAS,CAAC,CAC1D;AAGA,IAAa,aAAW,OAAO,QAC7B,OAAO,OAAO;CACZ,UAAU,OAAO,SACf,OAAO,QAAQ,YAAY;EACzB,OAAO;EACP,aAAa;CACf,CAAC,CACH;CACA,UAAU,OAAO,SACf,WAAW,YAAY;EACrB,OAAO;EACP,aAAa;CACf,CAAC,CACH;AACF,CAAC,CACH;;;;;;;;;AClBA,IAAa,gBAAgB;;;;;;;AAQ7B,IAAa,SAAb,cAA4B,KAAK,WAAmB,IAAI,KAAK,wBAAwB,OAAO,CAAC,CAAC,CAC5F,OAAO,OAAO;;CAGZ,QAAQ,OAAO,OAAO,KAAK,OAAO,QAAQ;CAC1C,SAAS,OAAO,OAAO;EAAE,KAAK,OAAO;EAAQ,OAAO,OAAO;CAAI,CAAC;AAClE,CAAC,CAAC,CAAC,KAAK,iBAAiB,IAAI,IAAI,CAAC,CACpC,CAAC,CAAC,CAAC;;;;AAOH,IAAa,cAAc,EAAE,SAAS,eAAe,UAAU,CAAC,MAAmB,CAAC,MAClF,IAAI,KAAK,QAAQ;CAAE;CAAQ;AAAQ,CAAC;;AAGtC,IAAa,YAAY,WAAsC,IAAI,WAAW,QAAQ,MAAM;;;;ACvB5F,IAAa,WAAW,WAAW,KACjC,GAAG,KAAK,QAAQ,IAAI,qBACtB"}
@@ -0,0 +1,443 @@
1
+ import { getDeep } from "@dxos/util";
2
+ import { Obj } from "@dxos/echo";
3
+ import "@tldraw/tldraw/tldraw.css";
4
+ import { getAssetUrls } from "@tldraw/assets/selfHosted";
5
+ import { ArrowDownToolbarItem, ArrowLeftToolbarItem, ArrowRightToolbarItem, ArrowToolbarItem, ArrowUpToolbarItem, AssetToolbarItem, CheckBoxToolbarItem, CloudToolbarItem, DefaultQuickActions, DefaultQuickActionsContent, DefaultStylePanelContent, DefaultToolbar, DiamondToolbarItem, DrawToolbarItem, EllipseToolbarItem, EraserToolbarItem, FrameToolbarItem, HandToolbarItem, HexagonToolbarItem, HighlightToolbarItem, LaserToolbarItem, LineToolbarItem, NoteToolbarItem, OvalToolbarItem, RectangleToolbarItem, RhombusToolbarItem, SelectToolbarItem, StarToolbarItem, TextToolbarItem, Tldraw, TldrawUiMenuItem, TriangleToolbarItem, XBoxToolbarItem, useActions, useDefaultColorTheme, useReadonly, useRelevantStyles, useTools } from "@tldraw/tldraw";
6
+ import defaultsDeep from "lodash.defaultsdeep";
7
+ import { memo, useCallback, useEffect, useId, useMemo, useState } from "react";
8
+ import { useResizeDetector } from "react-resize-detector";
9
+ import { useMergeRefs } from "@dxos/react-hooks";
10
+ import { composable, composableProps } from "@dxos/react-ui";
11
+ import { useStoreAdapter } from "#hooks";
12
+ import { isShape } from "@tldraw/tlschema";
13
+ import { Doc } from "@dxos/echo-doc";
14
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
15
+ import { useEditor } from "@tldraw/editor";
16
+ import { mx } from "@dxos/ui-theme";
17
+ import { modulate } from "@tldraw/utils";
18
+ //#region src/components/actions.ts
19
+ /**
20
+ * Snap to grid.
21
+ */
22
+ var handleSnap = async (canvas) => {
23
+ const snap = (value, tolerance = 40) => {
24
+ return Math.round(value / tolerance) * tolerance;
25
+ };
26
+ const accessor = Doc.createAccessor(canvas, ["content"]);
27
+ accessor.handle.change((doc) => {
28
+ const map = getDeep(doc, accessor.path);
29
+ Object.entries(map ?? {}).forEach(([_id, item]) => {
30
+ if (isShape(item)) {
31
+ const { x, y, props } = item;
32
+ item.x = snap(x);
33
+ item.y = snap(y);
34
+ const { geo, w, h } = props;
35
+ switch (geo) {
36
+ case "rectangle": {
37
+ const rect = props;
38
+ rect.w = snap(w);
39
+ rect.h = snap(h);
40
+ }
41
+ }
42
+ }
43
+ });
44
+ });
45
+ };
46
+ //#endregion
47
+ //#region src/components/custom/CustomMenu.tsx
48
+ var CustomMenu = ({ isMobile }) => {
49
+ const actions = useActions();
50
+ const isReadonlyMode = useReadonly();
51
+ return /* @__PURE__ */ jsx("div", {
52
+ className: "tlui-style-panel__wrapper",
53
+ children: /* @__PURE__ */ jsx("div", {
54
+ className: "tlui-menu",
55
+ children: /* @__PURE__ */ jsx("div", {
56
+ className: "tlui-buttons__horizontal",
57
+ "data-ismobile": isMobile,
58
+ children: /* @__PURE__ */ jsxs(DefaultQuickActions, { children: [/* @__PURE__ */ jsx(DefaultQuickActionsContent, {}), /* @__PURE__ */ jsx(TldrawUiMenuItem, {
59
+ ...actions.snap,
60
+ disabled: isReadonlyMode
61
+ })] })
62
+ })
63
+ })
64
+ });
65
+ };
66
+ //#endregion
67
+ //#region src/components/custom/CustomStylePanel.tsx
68
+ var CustomStylePanel = memo(({ isMobile }) => {
69
+ const editor = useEditor();
70
+ const styles = useRelevantStyles();
71
+ const handlePointerLeave = useCallback(() => {
72
+ if (!isMobile) editor.updateInstanceState({ isChangingStyle: false });
73
+ }, [editor, isMobile]);
74
+ if (!styles) return null;
75
+ return /* @__PURE__ */ jsx("div", {
76
+ className: mx("tlui-style-panel", !isMobile && "tlui-style-panel__wrapper"),
77
+ "data-ismobile": isMobile,
78
+ onPointerLeave: handlePointerLeave,
79
+ children: /* @__PURE__ */ jsx(DefaultStylePanelContent, { styles })
80
+ });
81
+ });
82
+ //#endregion
83
+ //#region src/components/custom/CustomToolbar.tsx
84
+ var DefaultToolbarContent = memo(({ toolsToSplice }) => {
85
+ const tools = useTools();
86
+ const toolNodes = [
87
+ /* @__PURE__ */ jsx(SelectToolbarItem, {}, "select"),
88
+ /* @__PURE__ */ jsx(HandToolbarItem, {}, "hand"),
89
+ /* @__PURE__ */ jsx(DrawToolbarItem, {}, "draw"),
90
+ /* @__PURE__ */ jsx(EraserToolbarItem, {}, "eraser"),
91
+ /* @__PURE__ */ jsx(ArrowToolbarItem, {}, "arrow"),
92
+ /* @__PURE__ */ jsx(TextToolbarItem, {}, "text"),
93
+ /* @__PURE__ */ jsx(NoteToolbarItem, {}, "note"),
94
+ /* @__PURE__ */ jsx(AssetToolbarItem, {}, "asset"),
95
+ /* @__PURE__ */ jsx(RectangleToolbarItem, {}, "rectangle"),
96
+ /* @__PURE__ */ jsx(EllipseToolbarItem, {}, "ellipse"),
97
+ /* @__PURE__ */ jsx(TriangleToolbarItem, {}, "triangle"),
98
+ /* @__PURE__ */ jsx(DiamondToolbarItem, {}, "diamond"),
99
+ /* @__PURE__ */ jsx(HexagonToolbarItem, {}, "hexagon"),
100
+ /* @__PURE__ */ jsx(OvalToolbarItem, {}, "oval"),
101
+ /* @__PURE__ */ jsx(RhombusToolbarItem, {}, "rhombus"),
102
+ /* @__PURE__ */ jsx(StarToolbarItem, {}, "star"),
103
+ /* @__PURE__ */ jsx(CloudToolbarItem, {}, "cloud"),
104
+ /* @__PURE__ */ jsx(XBoxToolbarItem, {}, "xbox"),
105
+ /* @__PURE__ */ jsx(CheckBoxToolbarItem, {}, "checkbox"),
106
+ /* @__PURE__ */ jsx(ArrowLeftToolbarItem, {}, "arrowLeft"),
107
+ /* @__PURE__ */ jsx(ArrowUpToolbarItem, {}, "arrowUp"),
108
+ /* @__PURE__ */ jsx(ArrowDownToolbarItem, {}, "arrowDown"),
109
+ /* @__PURE__ */ jsx(ArrowRightToolbarItem, {}, "arrowRight"),
110
+ /* @__PURE__ */ jsx(LineToolbarItem, {}, "line"),
111
+ /* @__PURE__ */ jsx(HighlightToolbarItem, {}, "highlight"),
112
+ /* @__PURE__ */ jsx(LaserToolbarItem, {}, "laser"),
113
+ /* @__PURE__ */ jsx(FrameToolbarItem, {}, "frame")
114
+ ];
115
+ toolsToSplice.forEach((splice) => {
116
+ if (splice.position >= 0 && splice.position <= toolNodes.length) toolNodes.splice(splice.position, 0, /* @__PURE__ */ jsx(TldrawUiMenuItem, { ...tools[splice.toolId] }, splice.toolId));
117
+ });
118
+ return /* @__PURE__ */ jsx(Fragment, { children: toolNodes });
119
+ });
120
+ DefaultToolbarContent.displayName = "DefaultToolbarContent";
121
+ //#endregion
122
+ //#region src/components/custom/DottedGrid.tsx
123
+ var GRID_STEPS$1 = [
124
+ {
125
+ min: -1,
126
+ mid: .15,
127
+ step: 64
128
+ },
129
+ {
130
+ min: .05,
131
+ mid: .375,
132
+ step: 16
133
+ },
134
+ {
135
+ min: .15,
136
+ mid: 1,
137
+ step: 4
138
+ },
139
+ {
140
+ min: .7,
141
+ mid: 2.5,
142
+ step: 1
143
+ }
144
+ ];
145
+ var DottedGrid = ({ x, y, z, size }) => {
146
+ const stroke = useDefaultColorTheme().grey.solid;
147
+ const id = useId();
148
+ return /* @__PURE__ */ jsxs("svg", {
149
+ id,
150
+ className: "tl-grid",
151
+ version: "1.1",
152
+ xmlns: "http://www.w3.org/2000/svg",
153
+ children: [/* @__PURE__ */ jsx("defs", { children: GRID_STEPS$1.map(({ min, mid, step }) => {
154
+ const s = step * size * z;
155
+ const xo = .5 + x * z;
156
+ const yo = .5 + y * z;
157
+ const gxo = xo > 0 ? xo % s : s + xo % s;
158
+ const gyo = yo > 0 ? yo % s : s + yo % s;
159
+ const opacity = z < mid ? modulate(z, [min, mid], [0, 1]) : 1;
160
+ const patternId = `${id}-step-${step}`;
161
+ return /* @__PURE__ */ jsx("pattern", {
162
+ id: patternId,
163
+ width: s,
164
+ height: s,
165
+ patternUnits: "userSpaceOnUse",
166
+ children: /* @__PURE__ */ jsx("circle", {
167
+ className: "tl-grid-dot",
168
+ cx: gxo,
169
+ cy: gyo,
170
+ r: 1,
171
+ opacity,
172
+ fill: stroke,
173
+ stroke
174
+ })
175
+ }, patternId);
176
+ }) }), GRID_STEPS$1.map(({ step }) => {
177
+ const patternId = `${id}-step-${step}`;
178
+ return /* @__PURE__ */ jsx("rect", {
179
+ width: "100%",
180
+ height: "100%",
181
+ fill: `url(#${patternId})`
182
+ }, patternId);
183
+ })]
184
+ });
185
+ };
186
+ //#endregion
187
+ //#region src/components/custom/MeshGrid.tsx
188
+ var GRID_STEPS = [
189
+ {
190
+ min: -1,
191
+ mid: .15,
192
+ step: 64
193
+ },
194
+ {
195
+ min: .05,
196
+ mid: .375,
197
+ step: 16
198
+ },
199
+ {
200
+ min: .15,
201
+ mid: 1,
202
+ step: 4
203
+ },
204
+ {
205
+ min: .7,
206
+ mid: 2.5,
207
+ step: 1
208
+ }
209
+ ];
210
+ var MeshGrid = ({ x, y, z, size }) => {
211
+ const stroke = useDefaultColorTheme().grey.solid;
212
+ const id = useId();
213
+ return /* @__PURE__ */ jsxs("svg", {
214
+ id,
215
+ className: "tl-grid",
216
+ version: "1.1",
217
+ xmlns: "http://www.w3.org/2000/svg",
218
+ children: [/* @__PURE__ */ jsx("defs", {
219
+ id,
220
+ children: GRID_STEPS.map(({ min, mid, step }, i) => {
221
+ const s = step * size * z;
222
+ const xo = .5 + x * z;
223
+ const yo = .5 + y * z;
224
+ const gxo = xo > 0 ? xo % s : s + xo % s;
225
+ const gyo = yo > 0 ? yo % s : s + yo % s;
226
+ const opacity = (z < mid ? modulate(z, [min, mid], [0, 1]) : 1) * .15;
227
+ const patternId = `${id}-step-${step}`;
228
+ return /* @__PURE__ */ jsxs("pattern", {
229
+ id: patternId,
230
+ width: s,
231
+ height: s,
232
+ patternUnits: "userSpaceOnUse",
233
+ children: [/* @__PURE__ */ jsx("line", {
234
+ style: { stroke },
235
+ x1: gxo - s,
236
+ y1: gyo,
237
+ x2: gxo + s,
238
+ y2: gyo,
239
+ opacity
240
+ }), /* @__PURE__ */ jsx("line", {
241
+ style: { stroke },
242
+ x1: gxo,
243
+ y1: gyo - s,
244
+ x2: gxo,
245
+ y2: gyo + s,
246
+ opacity
247
+ })]
248
+ }, patternId);
249
+ })
250
+ }), GRID_STEPS.map(({ step }) => {
251
+ const patternId = `${id}-step-${step}`;
252
+ return /* @__PURE__ */ jsx("rect", {
253
+ width: "100%",
254
+ height: "100%",
255
+ fill: `url(#${patternId})`
256
+ }, patternId);
257
+ })]
258
+ });
259
+ };
260
+ //#endregion
261
+ //#region src/components/Canvas/Canvas.tsx
262
+ var threadToolId = "thread";
263
+ var gridComponents = {
264
+ mesh: MeshGrid,
265
+ dotted: DottedGrid
266
+ };
267
+ var CanvasComponent = composable(({ canvas, readonly = false, autoCenter = true, hideUi = false, assetsBaseUrl = "/assets/plugin-tldraw", settings, onThreadCreate, ...props }, forwardedRef) => {
268
+ const adapter = useStoreAdapter(canvas);
269
+ const [editor, setEditor] = useState();
270
+ useEffect(() => {
271
+ hideUi ? editor?.blur() : editor?.focus();
272
+ }, [hideUi, editor]);
273
+ useEffect(() => {
274
+ if (!settings) return;
275
+ const cleanup = editor?.store.listen(({ changes: { updated } }) => {
276
+ for (const [id, [from, to]] of Object.entries(updated)) if (id === "instance:instance") {
277
+ const fromInstance = from;
278
+ const toInstance = to;
279
+ if (fromInstance.isGridMode !== toInstance.isGridMode) settings.showGrid = toInstance.isGridMode;
280
+ }
281
+ }, {
282
+ source: "user",
283
+ scope: "all"
284
+ });
285
+ return () => cleanup?.();
286
+ }, [settings, editor]);
287
+ useEffect(() => {
288
+ const handleEvent = ({ type, name }) => {
289
+ if (type === "pointer" && name === "pointer_up") setTimeout(() => adapter.save());
290
+ };
291
+ editor?.on("event", handleEvent);
292
+ return () => {
293
+ editor?.off("event", handleEvent);
294
+ };
295
+ }, [adapter, editor]);
296
+ useEffect(() => {
297
+ if (editor) {
298
+ editor.user.updateUserPreferences({ isSnapMode: true });
299
+ editor.updateInstanceState({
300
+ isGridMode: settings?.showGrid !== false && !hideUi,
301
+ isReadonly: readonly || hideUi
302
+ });
303
+ if (readonly || hideUi) editor.setCurrentTool("hand");
304
+ }
305
+ }, [
306
+ editor,
307
+ settings,
308
+ hideUi,
309
+ readonly
310
+ ]);
311
+ const { ref: resizeRef, width = 0, height } = useResizeDetector();
312
+ const containerRef = useMergeRefs([forwardedRef, resizeRef]);
313
+ const [ready, setReady] = useState(!autoCenter);
314
+ useEffect(() => {
315
+ if (!editor || !adapter || width === void 0 || height === void 0) return;
316
+ const isLocked = readonly || hideUi;
317
+ editor.setCameraOptions({ isLocked: false });
318
+ editor.setCamera({
319
+ x: -1,
320
+ y: -1,
321
+ z: 1
322
+ }, { animation: { duration: 0 } });
323
+ editor.resetZoom();
324
+ setReady(true);
325
+ if (!autoCenter) {
326
+ editor.setCameraOptions({ isLocked });
327
+ return;
328
+ }
329
+ const zoom = () => {
330
+ zoomToFit(editor, width, height, false);
331
+ };
332
+ zoom();
333
+ editor.setCameraOptions({ isLocked });
334
+ let timer;
335
+ const onUpdate = () => {
336
+ clearTimeout(timer);
337
+ timer = setTimeout(() => {
338
+ editor.setCameraOptions({ isLocked: false });
339
+ zoom();
340
+ editor.setCameraOptions({ isLocked });
341
+ }, 200);
342
+ };
343
+ const subscription = isLocked ? adapter.store?.listen(() => onUpdate(), { scope: "document" }) : void 0;
344
+ return () => {
345
+ clearTimeout(timer);
346
+ subscription?.();
347
+ };
348
+ }, [
349
+ editor,
350
+ adapter,
351
+ width,
352
+ height,
353
+ autoCenter,
354
+ readonly,
355
+ hideUi
356
+ ]);
357
+ const assetUrls = useMemo(() => {
358
+ if (!assetsBaseUrl) return;
359
+ return defaultsDeep({
360
+ fonts: { draw: `${assetsBaseUrl}/fonts/Montserrat-Regular.woff2` },
361
+ icons: { "thread-icon": `${assetsBaseUrl}/icons/icon/chat-teardrop-text.svg` }
362
+ }, getAssetUrls({ baseUrl: assetsBaseUrl }));
363
+ }, [assetsBaseUrl]);
364
+ const overrides = useMemo(() => ({
365
+ actions: (_editor, actions, _helpers) => ({
366
+ ...actions,
367
+ snap: {
368
+ id: "grid-snap",
369
+ label: "Snap",
370
+ kbd: "s",
371
+ icon: "horizontal-align-middle",
372
+ onSelect: () => {
373
+ handleSnap(canvas);
374
+ }
375
+ }
376
+ }),
377
+ tools: (_editor, tools) => {
378
+ const newTools = { ...tools };
379
+ newTools[threadToolId] = {
380
+ id: threadToolId,
381
+ icon: "thread-icon",
382
+ label: "Comment",
383
+ onSelect: () => onThreadCreate?.()
384
+ };
385
+ return newTools;
386
+ }
387
+ }), [canvas, onThreadCreate]);
388
+ const components = useMemo(() => ({
389
+ DebugPanel: null,
390
+ Grid: gridComponents[settings?.gridType ?? "mesh"],
391
+ HelpMenu: null,
392
+ MenuPanel: CustomMenu,
393
+ NavigationPanel: null,
394
+ StylePanel: CustomStylePanel,
395
+ TopPanel: null,
396
+ ZoomMenu: null,
397
+ Toolbar: (props) => /* @__PURE__ */ jsx(DefaultToolbar, {
398
+ ...props,
399
+ children: /* @__PURE__ */ jsx(DefaultToolbarContent, { toolsToSplice: [{
400
+ toolId: "thread",
401
+ position: 8
402
+ }] })
403
+ })
404
+ }), [settings]);
405
+ if (!adapter.store) return null;
406
+ return /* @__PURE__ */ jsx("div", {
407
+ ...composableProps(props, { classNames: "dx-expander" }),
408
+ style: { visibility: ready ? "visible" : "hidden" },
409
+ ref: containerRef,
410
+ children: /* @__PURE__ */ jsx(Tldraw, {
411
+ store: adapter.store,
412
+ hideUi,
413
+ inferDarkMode: true,
414
+ className: "outline-hidden!",
415
+ maxAssetSize: 1024 * 1024,
416
+ assetUrls,
417
+ overrides,
418
+ components,
419
+ onMount: setEditor
420
+ }, `${Obj.getURI(canvas)}:${adapter.store.id}`)
421
+ });
422
+ });
423
+ /**
424
+ * Fit content within the viewport and center it, zooming out for oversized content but never
425
+ * magnifying past 100% (zoom is capped at 1).
426
+ */
427
+ var zoomToFit = (editor, width, height, animate = true) => {
428
+ const commonBounds = editor.getCurrentPageBounds();
429
+ if (width && height && commonBounds?.width && commonBounds?.height) {
430
+ const padding = 60;
431
+ const zoom = Math.min(1, (width - padding) / commonBounds.width, (height - padding) / commonBounds.height);
432
+ const center = {
433
+ x: (width - commonBounds.width * zoom) / 2 / zoom - commonBounds.minX,
434
+ y: (height - commonBounds.height * zoom) / 2 / zoom - commonBounds.minY,
435
+ z: zoom
436
+ };
437
+ editor.setCamera(center, animate ? { animation: { duration: 250 } } : void 0);
438
+ }
439
+ };
440
+ //#endregion
441
+ export { CanvasComponent };
442
+
443
+ //# sourceMappingURL=components.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components.mjs","names":[],"sources":["../../src/components/actions.ts","../../src/components/custom/CustomMenu.tsx","../../src/components/custom/CustomStylePanel.tsx","../../src/components/custom/CustomToolbar.tsx","../../src/components/custom/DottedGrid.tsx","../../src/components/custom/MeshGrid.tsx","../../src/components/Canvas/Canvas.tsx"],"sourcesContent":["//\n// Copyright 2024 DXOS.org\n//\n\nimport type { TLRecord } from '@tldraw/tldraw';\nimport { isShape } from '@tldraw/tlschema';\n\nimport { Doc } from '@dxos/echo-doc';\nimport { getDeep } from '@dxos/util';\n\nimport type { Tldraw } from '#types';\n\n/**\n * Snap to grid.\n */\nexport const handleSnap = async (canvas: Tldraw.Canvas) => {\n const snap = (value: number, tolerance = 40) => {\n return Math.round(value / tolerance) * tolerance;\n };\n\n // TODO(burdon): Use context to access document.\n const accessor = Doc.createAccessor(canvas, ['content']);\n accessor.handle.change((doc) => {\n const map = getDeep<Record<string, TLRecord>>(doc, accessor.path);\n Object.entries(map ?? {}).forEach(([_id, item]) => {\n if (isShape(item)) {\n const { x, y, props } = item;\n item.x = snap(x);\n item.y = snap(y);\n type Rect = { geo: string; w: number; h: number };\n const { geo, w, h } = props as Rect;\n switch (geo) {\n case 'rectangle': {\n const rect = props as Rect;\n rect.w = snap(w);\n rect.h = snap(h);\n }\n }\n }\n });\n });\n};\n","//\n// Copyright 2024 DXOS.org\n//\n\nimport {\n DefaultQuickActions,\n DefaultQuickActionsContent,\n TldrawUiMenuItem,\n type TLUiStylePanelProps,\n useActions,\n useReadonly,\n} from '@tldraw/tldraw';\nimport React from 'react';\n\nexport const CustomMenu = ({ isMobile }: TLUiStylePanelProps) => {\n const actions = useActions();\n const isReadonlyMode = useReadonly();\n\n return (\n <div className='tlui-style-panel__wrapper'>\n <div className='tlui-menu'>\n <div className='tlui-buttons__horizontal' data-ismobile={isMobile}>\n <DefaultQuickActions>\n <DefaultQuickActionsContent />\n <TldrawUiMenuItem {...actions.snap} disabled={isReadonlyMode} />\n </DefaultQuickActions>\n </div>\n </div>\n </div>\n );\n};\n","//\n// Copyright 2024 DXOS.org\n//\n\nimport { useEditor } from '@tldraw/editor';\nimport { DefaultStylePanelContent, type TLUiStylePanelProps, useRelevantStyles } from '@tldraw/tldraw';\nimport React, { memo, useCallback } from 'react';\n\nimport { mx } from '@dxos/ui-theme';\n\nexport const CustomStylePanel = memo(({ isMobile }: TLUiStylePanelProps) => {\n const editor = useEditor();\n const styles = useRelevantStyles();\n const handlePointerLeave = useCallback(() => {\n if (!isMobile) {\n editor.updateInstanceState({ isChangingStyle: false });\n }\n }, [editor, isMobile]);\n\n if (!styles) {\n return null;\n }\n\n // TODO(burdon): Currently the global STYLES (fonts, colors, etc.) are not pluggable.\n // TODO(burdon): Implement custom style panel to replace fonts.\n // https://github.com/tldraw/tldraw/blob/main/apps/examples/src/examples/custom-style-panel/CustomStylePanelExample.tsx\n return (\n <div\n className={mx('tlui-style-panel', !isMobile && 'tlui-style-panel__wrapper')}\n data-ismobile={isMobile}\n onPointerLeave={handlePointerLeave}\n >\n {/* <CommonStylePickerSet theme={theme} styles={styles} /> */}\n {/* {!hideText && <TextStylePickerSet theme={theme} styles={styles} />} */}\n <DefaultStylePanelContent styles={styles} />\n </div>\n );\n});\n","//\n// Copyright 2024 DXOS.org\n//\n\nimport {\n ArrowDownToolbarItem,\n ArrowLeftToolbarItem,\n ArrowRightToolbarItem,\n ArrowToolbarItem,\n ArrowUpToolbarItem,\n AssetToolbarItem,\n CheckBoxToolbarItem,\n CloudToolbarItem,\n DiamondToolbarItem,\n DrawToolbarItem,\n EllipseToolbarItem,\n EraserToolbarItem,\n FrameToolbarItem,\n HandToolbarItem,\n HexagonToolbarItem,\n HighlightToolbarItem,\n LaserToolbarItem,\n LineToolbarItem,\n NoteToolbarItem,\n OvalToolbarItem,\n RectangleToolbarItem,\n RhombusToolbarItem,\n SelectToolbarItem,\n StarToolbarItem,\n TextToolbarItem,\n TldrawUiMenuItem,\n TriangleToolbarItem,\n XBoxToolbarItem,\n useTools,\n} from '@tldraw/tldraw';\nimport React, { memo } from 'react';\n\ntype ToolSplice = { toolId: string; position: number };\n\nconst DefaultToolbarContent = memo(({ toolsToSplice }: { toolsToSplice: ToolSplice[] }) => {\n const tools = useTools();\n\n const toolNodes = [\n <SelectToolbarItem key='select' />,\n <HandToolbarItem key='hand' />,\n <DrawToolbarItem key='draw' />,\n <EraserToolbarItem key='eraser' />,\n <ArrowToolbarItem key='arrow' />,\n <TextToolbarItem key='text' />,\n <NoteToolbarItem key='note' />,\n <AssetToolbarItem key='asset' />,\n <RectangleToolbarItem key='rectangle' />,\n <EllipseToolbarItem key='ellipse' />,\n <TriangleToolbarItem key='triangle' />,\n <DiamondToolbarItem key='diamond' />,\n <HexagonToolbarItem key='hexagon' />,\n <OvalToolbarItem key='oval' />,\n <RhombusToolbarItem key='rhombus' />,\n <StarToolbarItem key='star' />,\n <CloudToolbarItem key='cloud' />,\n <XBoxToolbarItem key='xbox' />,\n <CheckBoxToolbarItem key='checkbox' />,\n <ArrowLeftToolbarItem key='arrowLeft' />,\n <ArrowUpToolbarItem key='arrowUp' />,\n <ArrowDownToolbarItem key='arrowDown' />,\n <ArrowRightToolbarItem key='arrowRight' />,\n <LineToolbarItem key='line' />,\n <HighlightToolbarItem key='highlight' />,\n <LaserToolbarItem key='laser' />,\n <FrameToolbarItem key='frame' />,\n ];\n\n toolsToSplice.forEach((splice) => {\n if (splice.position >= 0 && splice.position <= toolNodes.length) {\n toolNodes.splice(\n splice.position,\n 0,\n <TldrawUiMenuItem key={splice.toolId} {...tools[splice.toolId as keyof typeof tools]} />,\n );\n }\n });\n\n return <>{toolNodes}</>;\n});\n\nDefaultToolbarContent.displayName = 'DefaultToolbarContent';\n\nexport { DefaultToolbarContent };\n","//\n// Copyright 2024 DXOS.org\n//\n\nimport { type TLGridProps, useDefaultColorTheme } from '@tldraw/tldraw';\nimport { modulate } from '@tldraw/utils';\nimport React, { useId } from 'react';\n\nconst GRID_STEPS = [\n { min: -1, mid: 0.15, step: 64 },\n { min: 0.05, mid: 0.375, step: 16 },\n { min: 0.15, mid: 1, step: 4 },\n { min: 0.7, mid: 2.5, step: 1 },\n];\n\n// This is a modified version of the default grid from tldraw:\n// https://github.com/tldraw/tldraw/blob/main/packages/editor/src/lib/components/default-components/DefaultGrid.tsx\n//\n// We're overriding it to work around a state coupling bug in tldraw where multiple grid instances\n// on the same page interfere with each other due to shared IDs. Our solution uses React.useId()\n// to generate unique IDs for each grid instance, preventing conflicts.\n//\n// TODO(Zan): Revert this to the default implementation once the issue has been fixed upstream in tldraw.\nexport const DottedGrid = ({ x, y, z, size }: TLGridProps) => {\n const theme = useDefaultColorTheme();\n const stroke = theme.grey.solid;\n const id = useId();\n\n return (\n <svg id={id} className='tl-grid' version='1.1' xmlns='http://www.w3.org/2000/svg'>\n <defs>\n {GRID_STEPS.map(({ min, mid, step }) => {\n const s = step * size * z;\n const xo = 0.5 + x * z;\n const yo = 0.5 + y * z;\n const gxo = xo > 0 ? xo % s : s + (xo % s);\n const gyo = yo > 0 ? yo % s : s + (yo % s);\n const opacity = z < mid ? modulate(z, [min, mid], [0, 1]) : 1;\n const patternId = `${id}-step-${step}`;\n return (\n <pattern key={patternId} id={patternId} width={s} height={s} patternUnits='userSpaceOnUse'>\n <circle className='tl-grid-dot' cx={gxo} cy={gyo} r={1} opacity={opacity} fill={stroke} stroke={stroke} />\n </pattern>\n );\n })}\n </defs>\n {GRID_STEPS.map(({ step }) => {\n const patternId = `${id}-step-${step}`;\n return <rect key={patternId} width='100%' height='100%' fill={`url(#${patternId})`} />;\n })}\n </svg>\n );\n};\n","//\n// Copyright 2024 DXOS.org\n//\n\nimport { type TLGridProps } from '@tldraw/editor';\nimport { useDefaultColorTheme } from '@tldraw/tldraw';\nimport { modulate } from '@tldraw/utils';\nimport React, { useId } from 'react';\n\nconst GRID_STEPS = [\n { min: -1, mid: 0.15, step: 64 },\n { min: 0.05, mid: 0.375, step: 16 },\n { min: 0.15, mid: 1, step: 4 },\n { min: 0.7, mid: 2.5, step: 1 },\n];\n\nexport const MeshGrid = ({ x, y, z, size }: TLGridProps) => {\n const theme = useDefaultColorTheme();\n const stroke = theme.grey.solid;\n const id = useId();\n\n return (\n <svg id={id} className='tl-grid' version='1.1' xmlns='http://www.w3.org/2000/svg'>\n <defs id={id}>\n {GRID_STEPS.map(({ min, mid, step }, i) => {\n const s = step * size * z;\n const xo = 0.5 + x * z;\n const yo = 0.5 + y * z;\n const gxo = xo > 0 ? xo % s : s + (xo % s);\n const gyo = yo > 0 ? yo % s : s + (yo % s);\n const opacity = (z < mid ? modulate(z, [min, mid], [0, 1]) : 1) * 0.15;\n const patternId = `${id}-step-${step}`;\n return (\n <pattern key={patternId} id={patternId} width={s} height={s} patternUnits='userSpaceOnUse'>\n <line style={{ stroke }} x1={gxo - s} y1={gyo} x2={gxo + s} y2={gyo} opacity={opacity} />\n <line style={{ stroke }} x1={gxo} y1={gyo - s} x2={gxo} y2={gyo + s} opacity={opacity} />\n </pattern>\n );\n })}\n </defs>\n {GRID_STEPS.map(({ step }) => {\n const patternId = `${id}-step-${step}`;\n return <rect key={patternId} width='100%' height='100%' fill={`url(#${patternId})`} />;\n })}\n </svg>\n );\n};\n","//\n// Copyright 2024 DXOS.org\n//\n\nimport '@tldraw/tldraw/tldraw.css';\nimport './theme.css';\n\nimport { getAssetUrls } from '@tldraw/assets/selfHosted';\nimport { type TLEventInfo, type TLGridProps, type TLInstance } from '@tldraw/editor';\nimport { DefaultToolbar, type Editor, Tldraw as TldrawEditor, type TLUiAssetUrlOverrides } from '@tldraw/tldraw';\nimport defaultsDeep from 'lodash.defaultsdeep';\nimport React, { type FC, useEffect, useMemo, useState } from 'react';\nimport { useResizeDetector } from 'react-resize-detector';\n\nimport { Obj } from '@dxos/echo';\nimport { useMergeRefs } from '@dxos/react-hooks';\nimport { composable, composableProps } from '@dxos/react-ui';\n\nimport { useStoreAdapter } from '#hooks';\nimport { type Settings, type Tldraw } from '#types';\n\nimport { handleSnap } from '../actions';\nimport { CustomMenu, CustomStylePanel, DefaultToolbarContent, DottedGrid, MeshGrid } from '../custom';\n\nconst threadToolId = 'thread';\n\nconst gridComponents: Record<Settings.GridType, FC<TLGridProps>> = {\n mesh: MeshGrid,\n dotted: DottedGrid,\n};\n\nexport type CanvasProps = {\n canvas: Tldraw.Canvas;\n readonly?: boolean;\n autoCenter?: boolean;\n hideUi?: boolean;\n assetsBaseUrl?: string | null;\n settings?: Settings.Settings;\n onThreadCreate?: () => void;\n};\n\nexport const CanvasComponent = composable<HTMLDivElement, CanvasProps>(\n (\n {\n canvas,\n readonly = false,\n autoCenter = true,\n hideUi = false,\n assetsBaseUrl = '/assets/plugin-tldraw',\n settings,\n onThreadCreate,\n ...props\n },\n forwardedRef,\n ) => {\n const adapter = useStoreAdapter(canvas);\n const [editor, setEditor] = useState<Editor>();\n\n // Focus.\n useEffect(() => {\n hideUi ? editor?.blur() : editor?.focus();\n }, [hideUi, editor]);\n\n // Editor State.\n useEffect(() => {\n if (!settings) {\n return;\n }\n\n const cleanup = editor?.store.listen(\n ({ changes: { updated } }) => {\n for (const [id, [from, to]] of Object.entries(updated)) {\n if (id === 'instance:instance') {\n const fromInstance = from as TLInstance;\n const toInstance = to as TLInstance;\n if (fromInstance.isGridMode !== toInstance.isGridMode) {\n settings.showGrid = toInstance.isGridMode;\n }\n }\n }\n },\n { source: 'user', scope: 'all' },\n );\n\n // TODO(burdon): Combine.\n return () => cleanup?.();\n }, [settings, editor]);\n\n // Editor events.\n useEffect(() => {\n // https://tldraw.dev/examples/editor-api/canvas-events\n const handleEvent = ({ type, name }: TLEventInfo) => {\n if (type === 'pointer' && name === 'pointer_up') {\n // Defer: the 'event' stream fires before the active tool commits its shape to the\n // store, so an immediate save flushes one gesture behind (losing the final stroke).\n setTimeout(() => adapter.save());\n }\n };\n\n editor?.on('event', handleEvent);\n return () => {\n editor?.off('event', handleEvent);\n };\n }, [adapter, editor]);\n\n // UI state.\n useEffect(() => {\n if (editor) {\n editor.user.updateUserPreferences({\n // TODO(burdon): Adjust snap threshold.\n isSnapMode: true,\n });\n editor.updateInstanceState({\n isGridMode: settings?.showGrid !== false && !hideUi,\n isReadonly: readonly || hideUi,\n });\n if (readonly || hideUi) {\n editor.setCurrentTool('hand');\n }\n }\n }, [editor, settings, hideUi, readonly]);\n\n // Zoom to fit.\n const { ref: resizeRef, width = 0, height } = useResizeDetector();\n const containerRef = useMergeRefs([forwardedRef, resizeRef]);\n const [ready, setReady] = useState(!autoCenter);\n useEffect(() => {\n if (!editor || !adapter || width === undefined || height === undefined) {\n return;\n }\n\n const isLocked = readonly || hideUi;\n\n // Unlock to allow programmatic camera positioning.\n editor.setCameraOptions({ isLocked: false });\n\n // Set frame so that top left of grid is inset with our border (if no content).\n editor.setCamera({ x: -1, y: -1, z: 1 }, { animation: { duration: 0 } });\n editor.resetZoom();\n\n setReady(true);\n if (!autoCenter) {\n editor.setCameraOptions({ isLocked: isLocked });\n return;\n }\n\n const zoom = () => {\n zoomToFit(editor, width, height, false);\n };\n\n zoom();\n editor.setCameraOptions({ isLocked: isLocked });\n\n let timer: ReturnType<typeof setTimeout> | undefined;\n const onUpdate = () => {\n clearTimeout(timer);\n timer = setTimeout(() => {\n editor.setCameraOptions({ isLocked: false });\n zoom();\n editor.setCameraOptions({ isLocked: isLocked });\n }, 200);\n };\n const subscription = isLocked ? adapter.store?.listen(() => onUpdate(), { scope: 'document' }) : undefined;\n return () => {\n clearTimeout(timer);\n subscription?.();\n };\n }, [editor, adapter, width, height, autoCenter, readonly, hideUi]);\n\n // NOTE: Currently copying assets to composer-app public/assets/tldraw.\n // https://tldraw.dev/installation#Self-hosting-static-assets\n const assetUrls: TLUiAssetUrlOverrides = useMemo(() => {\n if (!assetsBaseUrl) {\n return undefined;\n }\n\n return defaultsDeep(\n {\n // Change default draw font.\n // TODO(burdon): Change icon to match font.\n fonts: { draw: `${assetsBaseUrl}/fonts/Montserrat-Regular.woff2` },\n icons: {\n 'thread-icon': `${assetsBaseUrl}/icons/icon/chat-teardrop-text.svg`,\n },\n },\n getAssetUrls({ baseUrl: assetsBaseUrl }),\n );\n }, [assetsBaseUrl]);\n\n const overrides = useMemo(\n () => ({\n actions: (_editor: Editor, actions: any, _helpers: any) => ({\n ...actions,\n snap: {\n id: 'grid-snap',\n label: 'Snap',\n kbd: 's',\n icon: 'horizontal-align-middle',\n onSelect: () => {\n void handleSnap(canvas);\n },\n },\n }),\n tools: (_editor: Editor, tools: any) => {\n const newTools = { ...tools };\n newTools[threadToolId] = {\n id: threadToolId,\n icon: 'thread-icon',\n label: 'Comment', // TODO(Zan): Use translation lookup here.\n onSelect: () => onThreadCreate?.(),\n };\n return newTools;\n },\n }),\n [canvas, onThreadCreate],\n );\n\n const components = useMemo(\n () => ({\n DebugPanel: null,\n Grid: gridComponents[settings?.gridType ?? 'mesh'],\n HelpMenu: null,\n MenuPanel: CustomMenu,\n NavigationPanel: null,\n StylePanel: CustomStylePanel,\n TopPanel: null,\n ZoomMenu: null,\n Toolbar: (props: any) => (\n <DefaultToolbar {...props}>\n <DefaultToolbarContent toolsToSplice={[{ toolId: 'thread', position: 8 }]} />\n </DefaultToolbar>\n ),\n }),\n [settings],\n );\n\n if (!adapter.store) {\n return null;\n }\n\n return (\n <div\n {...composableProps(props, { classNames: 'dx-expander' })}\n style={{ visibility: ready ? 'visible' : 'hidden' }}\n ref={containerRef}\n >\n <TldrawEditor\n // Rebind when the adapter recreates its store (e.g. an effect-churn reopen) — a stale\n // binding draws into an orphaned store whose change listeners are gone, so saves no-op.\n key={`${Obj.getURI(canvas)}:${adapter.store.id}`}\n store={adapter.store}\n hideUi={hideUi}\n inferDarkMode\n className='outline-hidden!'\n maxAssetSize={1024 * 1024}\n assetUrls={assetUrls}\n overrides={overrides}\n components={components}\n onMount={setEditor}\n />\n </div>\n );\n },\n);\n\n/**\n * Fit content within the viewport and center it, zooming out for oversized content but never\n * magnifying past 100% (zoom is capped at 1).\n */\nconst zoomToFit = (editor: Editor, width: number, height: number, animate = true) => {\n const commonBounds = editor.getCurrentPageBounds();\n if (width && height && commonBounds?.width && commonBounds?.height) {\n const padding = 60;\n // Zoom out to fit oversized content; cap at 1 so small content is never zoomed in.\n const zoom = Math.min(1, (width - padding) / commonBounds.width, (height - padding) / commonBounds.height);\n const center = {\n x: (width - commonBounds.width * zoom) / 2 / zoom - commonBounds.minX,\n y: (height - commonBounds.height * zoom) / 2 / zoom - commonBounds.minY,\n z: zoom,\n };\n\n editor.setCamera(center, animate ? { animation: { duration: 250 } } : undefined);\n }\n};\n"],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { lazy } from "react";
2
+ //#region src/containers/index.ts
3
+ var TldrawArticle = lazy(() => import("./chunk-TldrawArticle.mjs"));
4
+ var TldrawCard = lazy(() => import("./chunk-TldrawCard.mjs"));
5
+ //#endregion
6
+ export { TldrawArticle, TldrawCard };
7
+
8
+ //# sourceMappingURL=containers.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"containers.mjs","names":[],"sources":["../../src/containers/index.ts"],"sourcesContent":["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type ComponentType, lazy } from 'react';\n\nexport const TldrawArticle: ComponentType<any> = lazy(() => import('./TldrawArticle'));\nexport const TldrawCard: ComponentType<any> = lazy(() => import('./TldrawCard'));\n"],"mappings":";;AAMA,IAAa,gBAAoC,WAAW,OAAO,4BAAkB;AACrF,IAAa,aAAiC,WAAW,OAAO,yBAAe"}