@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
+ :root {
2
+ .tl-theme__dark {
3
+ --color-background: transparent;
4
+
5
+ .tlui-toolbar__tools,
6
+ .tlui-menu,
7
+ .tlui-style-panel__wrapper {
8
+ box-shadow: none;
9
+ border: 1px solid var(--color-separator);
10
+ }
11
+ }
12
+
13
+ .tl-theme__light {
14
+ --color-background: transparent;
15
+
16
+ .tlui-toolbar__tools,
17
+ .tlui-menu,
18
+ .tlui-style-panel__wrapper {
19
+ box-shadow: none;
20
+ border: 1px solid var(--color-separator);
21
+ }
22
+ }
23
+ }
@@ -0,0 +1,42 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import type { TLRecord } from '@tldraw/tldraw';
6
+ import { isShape } from '@tldraw/tlschema';
7
+
8
+ import { Doc } from '@dxos/echo-doc';
9
+ import { getDeep } from '@dxos/util';
10
+
11
+ import type { Tldraw } from '#types';
12
+
13
+ /**
14
+ * Snap to grid.
15
+ */
16
+ export const handleSnap = async (canvas: Tldraw.Canvas) => {
17
+ const snap = (value: number, tolerance = 40) => {
18
+ return Math.round(value / tolerance) * tolerance;
19
+ };
20
+
21
+ // TODO(burdon): Use context to access document.
22
+ const accessor = Doc.createAccessor(canvas, ['content']);
23
+ accessor.handle.change((doc) => {
24
+ const map = getDeep<Record<string, TLRecord>>(doc, accessor.path);
25
+ Object.entries(map ?? {}).forEach(([_id, item]) => {
26
+ if (isShape(item)) {
27
+ const { x, y, props } = item;
28
+ item.x = snap(x);
29
+ item.y = snap(y);
30
+ type Rect = { geo: string; w: number; h: number };
31
+ const { geo, w, h } = props as Rect;
32
+ switch (geo) {
33
+ case 'rectangle': {
34
+ const rect = props as Rect;
35
+ rect.w = snap(w);
36
+ rect.h = snap(h);
37
+ }
38
+ }
39
+ }
40
+ });
41
+ });
42
+ };
@@ -0,0 +1,61 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { type TLGridProps } from '@tldraw/editor';
6
+ import { useDefaultColorTheme } from '@tldraw/tldraw';
7
+ import { modulate } from '@tldraw/utils';
8
+ import React from 'react';
9
+
10
+ export const GRID_STEPS = [
11
+ { min: -1, mid: 0.15, step: 64 },
12
+ { min: 0.05, mid: 0.375, step: 16 },
13
+ { min: 0.15, mid: 1, step: 4 },
14
+ { min: 0.7, mid: 2.5, step: 1 },
15
+ ];
16
+
17
+ /**
18
+ * https://tldraw.dev/examples/ui/custom-grid
19
+ */
20
+ export const CustomGrid = ({ x, y, z, size }: TLGridProps) => {
21
+ const theme = useDefaultColorTheme();
22
+
23
+ return (
24
+ <svg className='tl-grid' version='1.1' xmlns='http://www.w3.org/2000/svg'>
25
+ <defs>
26
+ {GRID_STEPS.map(({ min, mid, step }, i) => {
27
+ const s = step * size * z;
28
+ const xo = 0.5 + x * z;
29
+ const yo = 0.5 + y * z;
30
+ const gxo = xo > 0 ? xo % s : s + (xo % s);
31
+ const gyo = yo > 0 ? yo % s : s + (yo % s);
32
+ const opacity = (z < mid ? modulate(z, [min, mid], [0, 1]) : 1) * 0.25;
33
+
34
+ return (
35
+ <pattern key={`grid-pattern-${i}`} id={`grid-${step}`} width={s} height={s} patternUnits='userSpaceOnUse'>
36
+ <line
37
+ style={{ stroke: theme.grey.solid }}
38
+ x1={gxo - s}
39
+ y1={gyo}
40
+ x2={gxo + s}
41
+ y2={gyo}
42
+ opacity={opacity}
43
+ />
44
+ <line
45
+ style={{ stroke: theme.grey.solid }}
46
+ x1={gxo}
47
+ y1={gyo - s}
48
+ x2={gxo}
49
+ y2={gyo + s}
50
+ opacity={opacity}
51
+ />
52
+ </pattern>
53
+ );
54
+ })}
55
+ </defs>
56
+ {GRID_STEPS.map(({ step }, i) => {
57
+ return <rect key={`grid-rect-${i}`} width='100%' height='100%' fill={`url(#grid-${step})`} />;
58
+ })}
59
+ </svg>
60
+ );
61
+ };
@@ -0,0 +1,31 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import {
6
+ DefaultQuickActions,
7
+ DefaultQuickActionsContent,
8
+ TldrawUiMenuItem,
9
+ type TLUiStylePanelProps,
10
+ useActions,
11
+ useReadonly,
12
+ } from '@tldraw/tldraw';
13
+ import React from 'react';
14
+
15
+ export const CustomMenu = ({ isMobile }: TLUiStylePanelProps) => {
16
+ const actions = useActions();
17
+ const isReadonlyMode = useReadonly();
18
+
19
+ return (
20
+ <div className='tlui-style-panel__wrapper'>
21
+ <div className='tlui-menu'>
22
+ <div className='tlui-buttons__horizontal' data-ismobile={isMobile}>
23
+ <DefaultQuickActions>
24
+ <DefaultQuickActionsContent />
25
+ <TldrawUiMenuItem {...actions.snap} disabled={isReadonlyMode} />
26
+ </DefaultQuickActions>
27
+ </div>
28
+ </div>
29
+ </div>
30
+ );
31
+ };
@@ -0,0 +1,38 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import { useEditor } from '@tldraw/editor';
6
+ import { DefaultStylePanelContent, type TLUiStylePanelProps, useRelevantStyles } from '@tldraw/tldraw';
7
+ import React, { memo, useCallback } from 'react';
8
+
9
+ import { mx } from '@dxos/ui-theme';
10
+
11
+ export const CustomStylePanel = memo(({ isMobile }: TLUiStylePanelProps) => {
12
+ const editor = useEditor();
13
+ const styles = useRelevantStyles();
14
+ const handlePointerLeave = useCallback(() => {
15
+ if (!isMobile) {
16
+ editor.updateInstanceState({ isChangingStyle: false });
17
+ }
18
+ }, [editor, isMobile]);
19
+
20
+ if (!styles) {
21
+ return null;
22
+ }
23
+
24
+ // TODO(burdon): Currently the global STYLES (fonts, colors, etc.) are not pluggable.
25
+ // TODO(burdon): Implement custom style panel to replace fonts.
26
+ // https://github.com/tldraw/tldraw/blob/main/apps/examples/src/examples/custom-style-panel/CustomStylePanelExample.tsx
27
+ return (
28
+ <div
29
+ className={mx('tlui-style-panel', !isMobile && 'tlui-style-panel__wrapper')}
30
+ data-ismobile={isMobile}
31
+ onPointerLeave={handlePointerLeave}
32
+ >
33
+ {/* <CommonStylePickerSet theme={theme} styles={styles} /> */}
34
+ {/* {!hideText && <TextStylePickerSet theme={theme} styles={styles} />} */}
35
+ <DefaultStylePanelContent styles={styles} />
36
+ </div>
37
+ );
38
+ });
@@ -0,0 +1,88 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import {
6
+ ArrowDownToolbarItem,
7
+ ArrowLeftToolbarItem,
8
+ ArrowRightToolbarItem,
9
+ ArrowToolbarItem,
10
+ ArrowUpToolbarItem,
11
+ AssetToolbarItem,
12
+ CheckBoxToolbarItem,
13
+ CloudToolbarItem,
14
+ DiamondToolbarItem,
15
+ DrawToolbarItem,
16
+ EllipseToolbarItem,
17
+ EraserToolbarItem,
18
+ FrameToolbarItem,
19
+ HandToolbarItem,
20
+ HexagonToolbarItem,
21
+ HighlightToolbarItem,
22
+ LaserToolbarItem,
23
+ LineToolbarItem,
24
+ NoteToolbarItem,
25
+ OvalToolbarItem,
26
+ RectangleToolbarItem,
27
+ RhombusToolbarItem,
28
+ SelectToolbarItem,
29
+ StarToolbarItem,
30
+ TextToolbarItem,
31
+ TldrawUiMenuItem,
32
+ TriangleToolbarItem,
33
+ XBoxToolbarItem,
34
+ useTools,
35
+ } from '@tldraw/tldraw';
36
+ import React, { memo } from 'react';
37
+
38
+ type ToolSplice = { toolId: string; position: number };
39
+
40
+ const DefaultToolbarContent = memo(({ toolsToSplice }: { toolsToSplice: ToolSplice[] }) => {
41
+ const tools = useTools();
42
+
43
+ const toolNodes = [
44
+ <SelectToolbarItem key='select' />,
45
+ <HandToolbarItem key='hand' />,
46
+ <DrawToolbarItem key='draw' />,
47
+ <EraserToolbarItem key='eraser' />,
48
+ <ArrowToolbarItem key='arrow' />,
49
+ <TextToolbarItem key='text' />,
50
+ <NoteToolbarItem key='note' />,
51
+ <AssetToolbarItem key='asset' />,
52
+ <RectangleToolbarItem key='rectangle' />,
53
+ <EllipseToolbarItem key='ellipse' />,
54
+ <TriangleToolbarItem key='triangle' />,
55
+ <DiamondToolbarItem key='diamond' />,
56
+ <HexagonToolbarItem key='hexagon' />,
57
+ <OvalToolbarItem key='oval' />,
58
+ <RhombusToolbarItem key='rhombus' />,
59
+ <StarToolbarItem key='star' />,
60
+ <CloudToolbarItem key='cloud' />,
61
+ <XBoxToolbarItem key='xbox' />,
62
+ <CheckBoxToolbarItem key='checkbox' />,
63
+ <ArrowLeftToolbarItem key='arrowLeft' />,
64
+ <ArrowUpToolbarItem key='arrowUp' />,
65
+ <ArrowDownToolbarItem key='arrowDown' />,
66
+ <ArrowRightToolbarItem key='arrowRight' />,
67
+ <LineToolbarItem key='line' />,
68
+ <HighlightToolbarItem key='highlight' />,
69
+ <LaserToolbarItem key='laser' />,
70
+ <FrameToolbarItem key='frame' />,
71
+ ];
72
+
73
+ toolsToSplice.forEach((splice) => {
74
+ if (splice.position >= 0 && splice.position <= toolNodes.length) {
75
+ toolNodes.splice(
76
+ splice.position,
77
+ 0,
78
+ <TldrawUiMenuItem key={splice.toolId} {...tools[splice.toolId as keyof typeof tools]} />,
79
+ );
80
+ }
81
+ });
82
+
83
+ return <>{toolNodes}</>;
84
+ });
85
+
86
+ DefaultToolbarContent.displayName = 'DefaultToolbarContent';
87
+
88
+ export { DefaultToolbarContent };
@@ -0,0 +1,53 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import { type TLGridProps, useDefaultColorTheme } from '@tldraw/tldraw';
6
+ import { modulate } from '@tldraw/utils';
7
+ import React, { useId } from 'react';
8
+
9
+ const GRID_STEPS = [
10
+ { min: -1, mid: 0.15, step: 64 },
11
+ { min: 0.05, mid: 0.375, step: 16 },
12
+ { min: 0.15, mid: 1, step: 4 },
13
+ { min: 0.7, mid: 2.5, step: 1 },
14
+ ];
15
+
16
+ // This is a modified version of the default grid from tldraw:
17
+ // https://github.com/tldraw/tldraw/blob/main/packages/editor/src/lib/components/default-components/DefaultGrid.tsx
18
+ //
19
+ // We're overriding it to work around a state coupling bug in tldraw where multiple grid instances
20
+ // on the same page interfere with each other due to shared IDs. Our solution uses React.useId()
21
+ // to generate unique IDs for each grid instance, preventing conflicts.
22
+ //
23
+ // TODO(Zan): Revert this to the default implementation once the issue has been fixed upstream in tldraw.
24
+ export const DottedGrid = ({ x, y, z, size }: TLGridProps) => {
25
+ const theme = useDefaultColorTheme();
26
+ const stroke = theme.grey.solid;
27
+ const id = useId();
28
+
29
+ return (
30
+ <svg id={id} className='tl-grid' version='1.1' xmlns='http://www.w3.org/2000/svg'>
31
+ <defs>
32
+ {GRID_STEPS.map(({ min, mid, step }) => {
33
+ const s = step * size * z;
34
+ const xo = 0.5 + x * z;
35
+ const yo = 0.5 + y * z;
36
+ const gxo = xo > 0 ? xo % s : s + (xo % s);
37
+ const gyo = yo > 0 ? yo % s : s + (yo % s);
38
+ const opacity = z < mid ? modulate(z, [min, mid], [0, 1]) : 1;
39
+ const patternId = `${id}-step-${step}`;
40
+ return (
41
+ <pattern key={patternId} id={patternId} width={s} height={s} patternUnits='userSpaceOnUse'>
42
+ <circle className='tl-grid-dot' cx={gxo} cy={gyo} r={1} opacity={opacity} fill={stroke} stroke={stroke} />
43
+ </pattern>
44
+ );
45
+ })}
46
+ </defs>
47
+ {GRID_STEPS.map(({ step }) => {
48
+ const patternId = `${id}-step-${step}`;
49
+ return <rect key={patternId} width='100%' height='100%' fill={`url(#${patternId})`} />;
50
+ })}
51
+ </svg>
52
+ );
53
+ };
@@ -0,0 +1,47 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import { type TLGridProps } from '@tldraw/editor';
6
+ import { useDefaultColorTheme } from '@tldraw/tldraw';
7
+ import { modulate } from '@tldraw/utils';
8
+ import React, { useId } from 'react';
9
+
10
+ const GRID_STEPS = [
11
+ { min: -1, mid: 0.15, step: 64 },
12
+ { min: 0.05, mid: 0.375, step: 16 },
13
+ { min: 0.15, mid: 1, step: 4 },
14
+ { min: 0.7, mid: 2.5, step: 1 },
15
+ ];
16
+
17
+ export const MeshGrid = ({ x, y, z, size }: TLGridProps) => {
18
+ const theme = useDefaultColorTheme();
19
+ const stroke = theme.grey.solid;
20
+ const id = useId();
21
+
22
+ return (
23
+ <svg id={id} className='tl-grid' version='1.1' xmlns='http://www.w3.org/2000/svg'>
24
+ <defs id={id}>
25
+ {GRID_STEPS.map(({ min, mid, step }, i) => {
26
+ const s = step * size * z;
27
+ const xo = 0.5 + x * z;
28
+ const yo = 0.5 + y * z;
29
+ const gxo = xo > 0 ? xo % s : s + (xo % s);
30
+ const gyo = yo > 0 ? yo % s : s + (yo % s);
31
+ const opacity = (z < mid ? modulate(z, [min, mid], [0, 1]) : 1) * 0.15;
32
+ const patternId = `${id}-step-${step}`;
33
+ return (
34
+ <pattern key={patternId} id={patternId} width={s} height={s} patternUnits='userSpaceOnUse'>
35
+ <line style={{ stroke }} x1={gxo - s} y1={gyo} x2={gxo + s} y2={gyo} opacity={opacity} />
36
+ <line style={{ stroke }} x1={gxo} y1={gyo - s} x2={gxo} y2={gyo + s} opacity={opacity} />
37
+ </pattern>
38
+ );
39
+ })}
40
+ </defs>
41
+ {GRID_STEPS.map(({ step }) => {
42
+ const patternId = `${id}-step-${step}`;
43
+ return <rect key={patternId} width='100%' height='100%' fill={`url(#${patternId})`} />;
44
+ })}
45
+ </svg>
46
+ );
47
+ };
@@ -0,0 +1,9 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ export * from './CustomMenu';
6
+ export * from './CustomStylePanel';
7
+ export * from './CustomToolbar';
8
+ export * from './DottedGrid';
9
+ export * from './MeshGrid';
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ export * from './Canvas';
@@ -0,0 +1,78 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import React, { type PropsWithChildren } from 'react';
6
+
7
+ import { useAtomCapability } from '@dxos/app-framework/ui';
8
+ import { AppSurface, useAppGraph } from '@dxos/app-toolkit/ui';
9
+ import { Obj } from '@dxos/echo';
10
+ import { invariant } from '@dxos/invariant';
11
+ import { useActions } from '@dxos/plugin-graph';
12
+ import { type SketchVariantSurfaceProps } from '@dxos/plugin-illustrator/types';
13
+ import { Flex, Panel } from '@dxos/react-ui';
14
+ import { composable, composableProps } from '@dxos/react-ui';
15
+ import { useAttention } from '@dxos/react-ui-attention';
16
+ import { isTauri } from '@dxos/util';
17
+
18
+ import { CanvasComponent } from '#components';
19
+ import { Tldraw, TldrawCapabilities } from '#types';
20
+
21
+ export type TldrawArticleProps = SketchVariantSurfaceProps;
22
+
23
+ export const TldrawArticle = ({ role, attendableId, sketch, canvas, extrinsic }: TldrawArticleProps) => {
24
+ invariant(Obj.instanceOf(Tldraw.Canvas, canvas));
25
+ const settings = useAtomCapability(TldrawCapabilities.Settings);
26
+ const id = Obj.getURI(sketch as Obj.Any);
27
+ const { hasAttention } = useAttention(attendableId);
28
+ const section = role === AppSurface.Section.role;
29
+
30
+ const props = {
31
+ readonly: role === AppSurface.Slide.role,
32
+ autoCenter: section ? true : undefined,
33
+ };
34
+
35
+ // TODO(wittjosiah): Genericize tldraw toolbar actions w/ graph.
36
+ const { graph } = useAppGraph();
37
+ const actions = useActions(graph, id);
38
+ const handleThreadCreate = actions.find((action) => action.id === `${id}/comment`)?.data;
39
+
40
+ const content = (
41
+ <CanvasComponent
42
+ // Force instance per canvas object. Otherwise, sketches share the same instance.
43
+ key={id}
44
+ classNames='dx-attention-surface'
45
+ canvas={canvas}
46
+ settings={settings}
47
+ // Section embeds render read-only (no controls/grid) until focused, on every platform; the
48
+ // isTauri allowance (always-on UI) applies only to the full article/slide roles.
49
+ // TODO(wittjosiah): Ensure attention works as expected on the mobile app.
50
+ hideUi={section ? !hasAttention : !hasAttention && !isTauri()}
51
+ onThreadCreate={handleThreadCreate}
52
+ {...props}
53
+ />
54
+ );
55
+
56
+ // An extrinsically-sized embed fills its (possibly non-square) box; otherwise it falls back to a
57
+ // square so the intrinsic embed has a sensible height.
58
+ return section ? <Container fill={extrinsic}>{content}</Container> : <Article>{content}</Article>;
59
+ };
60
+
61
+ const Article = composable<HTMLDivElement, PropsWithChildren>((props, forwardedRef) => (
62
+ <Panel.Root {...composableProps(props, { classNames: 'aspect-square' })} ref={forwardedRef}>
63
+ <Panel.Content>{props.children}</Panel.Content>
64
+ </Panel.Root>
65
+ ));
66
+
67
+ const Container = composable<HTMLDivElement, PropsWithChildren<{ fill?: boolean }>>(
68
+ ({ fill, ...props }, forwardedRef) => (
69
+ <Flex
70
+ {...composableProps(props, { classNames: [fill ? 'h-full w-full' : 'aspect-square', 'overflow-hidden'] })}
71
+ ref={forwardedRef}
72
+ >
73
+ {props.children}
74
+ </Flex>
75
+ ),
76
+ );
77
+
78
+ TldrawArticle.displayName = 'TldrawArticle';
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ export { TldrawArticle as default } from './TldrawArticle';
@@ -0,0 +1,53 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import React, { useMemo } from 'react';
7
+
8
+ import { Sketch } from '@dxos/plugin-illustrator/types';
9
+ import { CardContainer } from '@dxos/react-ui-mosaic/testing';
10
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
11
+
12
+ import { meta as pluginMeta } from '#meta';
13
+ import { TldrawBuilder } from '#model';
14
+ import { Tldraw } from '#types';
15
+
16
+ import { TldrawCard } from './TldrawCard';
17
+
18
+ const CardStory = () => {
19
+ const { sketch, canvas } = useMemo(() => {
20
+ const canvas = Tldraw.makeCanvas({
21
+ content: new TldrawBuilder()
22
+ .rectangle({ id: 'a', x: 0, y: 0, text: 'DXOS', color: 'blue', fill: 'solid' })
23
+ .ellipse({ id: 'b', x: 360, y: 0, text: 'ECHO', color: 'green' })
24
+ .geo('star', { id: 'c', x: 180, y: 280, text: 'EDGE', color: 'yellow' })
25
+ .arrow({ from: 'a', to: 'b' })
26
+ .arrow({ from: 'b', to: 'c' })
27
+ .build(),
28
+ });
29
+ return { sketch: Sketch.make({ canvas }), canvas };
30
+ }, []);
31
+
32
+ return (
33
+ <CardContainer role='popover' icon={pluginMeta.profile.icon?.key}>
34
+ <TldrawCard role='card--content' sketch={sketch} canvas={canvas} />
35
+ </CardContainer>
36
+ );
37
+ };
38
+
39
+ const meta = {
40
+ title: 'plugins/plugin-tldraw/containers/TldrawCard',
41
+ render: () => <CardStory />,
42
+ decorators: [withTheme(), withLayout({ layout: 'column' })],
43
+ parameters: {
44
+ layout: 'fullscreen',
45
+ },
46
+ tags: ['cards'],
47
+ } satisfies Meta;
48
+
49
+ export default meta;
50
+
51
+ type Story = StoryObj<typeof meta>;
52
+
53
+ export const Popover: Story = {};
@@ -0,0 +1,32 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import React from 'react';
6
+
7
+ import { Obj } from '@dxos/echo';
8
+ import { invariant } from '@dxos/invariant';
9
+ import { type SketchVariantSurfaceProps } from '@dxos/plugin-illustrator/types';
10
+ import { Card } from '@dxos/react-ui';
11
+
12
+ import { CanvasComponent } from '#components';
13
+ import { Tldraw } from '#types';
14
+
15
+ export type TldrawCardProps = SketchVariantSurfaceProps;
16
+
17
+ export const TldrawCard = ({ canvas, editable = false }: TldrawCardProps) => {
18
+ invariant(Obj.instanceOf(Tldraw.Canvas, canvas));
19
+ return (
20
+ <Card.Body>
21
+ <Card.Section classNames='aspect-square'>
22
+ <Card.Row fullWidth>
23
+ <CanvasComponent canvas={canvas} autoCenter readonly={!editable} hideUi={!editable} />
24
+ </Card.Row>
25
+ </Card.Section>
26
+ </Card.Body>
27
+ );
28
+ };
29
+
30
+ export default TldrawCard;
31
+
32
+ TldrawCard.displayName = 'TldrawCard';
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ export { TldrawCard as default } from './TldrawCard';
@@ -0,0 +1,8 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { type ComponentType, lazy } from 'react';
6
+
7
+ export const TldrawArticle: ComponentType<any> = lazy(() => import('./TldrawArticle'));
8
+ export const TldrawCard: ComponentType<any> = lazy(() => import('./TldrawCard'));
@@ -0,0 +1,20 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ // TODO(burdon): Doesn't work with vitest.
6
+ // import { createTLStore, defaultShapeUtils } from '@tldraw/tldraw';
7
+
8
+ import { describe, expect, test } from 'vitest';
9
+
10
+ // TODO(burdon): Named export 'EventEmitter' not found. (running vitest).
11
+ // TODO(burdon): TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts" (running p test).
12
+ // TODO(burdon): Storybook broken: Cannot read properties of undefined (reading 'getDocAccessor')
13
+
14
+ describe('storage adapter', () => {
15
+ test('migration', async () => {
16
+ // const store = createTLStore({ shapeUtils: defaultShapeUtils });
17
+ // expect(store.schema.currentStoreVersion).to.eq(4);
18
+ expect(true).to.be.true;
19
+ });
20
+ });