@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,340 @@
1
+ {
2
+ "action.align-bottom": "置底",
3
+ "action.align-center-horizontal": "水平置中",
4
+ "action.align-center-horizontal.short": "水平置中",
5
+ "action.align-center-vertical": "垂直置中",
6
+ "action.align-center-vertical.short": "垂直置中",
7
+ "action.align-left": "置左",
8
+ "action.align-right": "置右",
9
+ "action.align-top": "置頂",
10
+ "action.back-to-content": "回到內容",
11
+ "action.bring-forward": "前移一層",
12
+ "action.bring-to-front": "移至頂層",
13
+ "action.convert-to-bookmark": "轉換為書籤",
14
+ "action.convert-to-embed": "轉換為嵌入",
15
+ "action.copy": "複製",
16
+ "action.copy-as-json": "複製為 JSON",
17
+ "action.copy-as-json.short": "JSON",
18
+ "action.copy-as-png": "複製為 PNG",
19
+ "action.copy-as-png.short": "PNG",
20
+ "action.copy-as-svg": "複製為 SVG",
21
+ "action.copy-as-svg.short": "SVG",
22
+ "action.cut": "剪下",
23
+ "action.delete": "刪除",
24
+ "action.distribute-horizontal": "水平分布",
25
+ "action.distribute-horizontal.short": "水平分布",
26
+ "action.distribute-vertical": "垂直分布",
27
+ "action.distribute-vertical.short": "垂直分布",
28
+ "action.duplicate": "複製",
29
+ "action.edit-link": "編輯連結",
30
+ "action.exit-pen-mode": "退出畫筆模式",
31
+ "action.export-all-as-json": "全部匯出成 JSON",
32
+ "action.export-all-as-json.short": "JSON",
33
+ "action.export-all-as-png": "全部匯出成 PNG",
34
+ "action.export-all-as-png.short": "PNG",
35
+ "action.export-all-as-svg": "全部匯出成 SVG",
36
+ "action.export-all-as-svg.short": "SVG",
37
+ "action.export-as-json": "匯出成 JSON",
38
+ "action.export-as-json.short": "JSON",
39
+ "action.export-as-png": "匯出成 PNG",
40
+ "action.export-as-png.short": "PNG",
41
+ "action.export-as-svg": "匯出成 SVG",
42
+ "action.export-as-svg.short": "SVG",
43
+ "action.fit-frame-to-content": "貼合內容大小",
44
+ "action.flip-horizontal": "水平翻轉",
45
+ "action.flip-horizontal.short": "水平翻轉",
46
+ "action.flip-vertical": "垂直翻轉",
47
+ "action.flip-vertical.short": "垂直翻轉",
48
+ "action.group": "群組",
49
+ "action.insert-media": "上傳媒體檔",
50
+ "action.new-project": "新建專案",
51
+ "action.new-shared-project": "新建共享專案",
52
+ "action.open-embed-link": "開啟連結",
53
+ "action.open-file": "開啟檔案",
54
+ "action.pack": "打包",
55
+ "action.paste": "貼上",
56
+ "action.print": "列印",
57
+ "action.redo": "取消復原",
58
+ "action.remove-frame": "移除框架",
59
+ "action.rename": "重新命名",
60
+ "action.rotate-ccw": "逆時針旋轉",
61
+ "action.rotate-cw": "順時針旋轉",
62
+ "action.save-copy": "存為副本",
63
+ "action.select-all": "全選",
64
+ "action.select-none": "取消選取",
65
+ "action.send-backward": "後移一層",
66
+ "action.send-to-back": "移至底層",
67
+ "action.share-project": "共享此專案",
68
+ "action.stack-horizontal": "水平堆疊",
69
+ "action.stack-horizontal.short": "水平堆疊",
70
+ "action.stack-vertical": "垂直堆疊",
71
+ "action.stack-vertical.short": "垂直堆疊",
72
+ "action.stop-following": "取消追蹤",
73
+ "action.stretch-horizontal": "水平延展",
74
+ "action.stretch-horizontal.short": "水平延展",
75
+ "action.stretch-vertical": "垂直延展",
76
+ "action.stretch-vertical.short": "垂直延展",
77
+ "action.toggle-auto-size": "切換自動大小",
78
+ "action.toggle-dark-mode": "切換深色模式",
79
+ "action.toggle-dark-mode.menu": "深色模式",
80
+ "action.toggle-debug-mode": "切換除錯模式",
81
+ "action.toggle-debug-mode.menu": "除錯模式",
82
+ "action.toggle-focus-mode": "切換專注模式",
83
+ "action.toggle-focus-mode.menu": "專注模式",
84
+ "action.toggle-grid": "切換網格",
85
+ "action.toggle-grid.menu": "顯示網格",
86
+ "action.toggle-snap-mode": "切換始終貼齊",
87
+ "action.toggle-snap-mode.menu": "始終貼齊",
88
+ "action.toggle-tool-lock": "切換工具鎖定",
89
+ "action.toggle-tool-lock.menu": "工具鎖定",
90
+ "action.toggle-transparent": "切換透明背景",
91
+ "action.toggle-transparent.context-menu": "透明",
92
+ "action.toggle-transparent.menu": "透明",
93
+ "action.undo": "復原",
94
+ "action.ungroup": "取消群組",
95
+ "action.unlock-all": "全部解鎖",
96
+ "action.zoom-in": "放大",
97
+ "action.zoom-out": "縮小",
98
+ "action.zoom-to-100": "縮放至 100%",
99
+ "action.zoom-to-fit": "縮放至適當大小",
100
+ "action.zoom-to-selection": "縮放至選取範圍",
101
+ "actions-menu.title": "操作",
102
+ "align-style.end": "末端",
103
+ "align-style.justify": "兩端",
104
+ "align-style.middle": "置中",
105
+ "align-style.start": "前端",
106
+ "arrowheadEnd-style.arrow": "箭頭",
107
+ "arrowheadEnd-style.bar": "條狀",
108
+ "arrowheadEnd-style.diamond": "菱形",
109
+ "arrowheadEnd-style.dot": "點",
110
+ "arrowheadEnd-style.inverted": "反轉",
111
+ "arrowheadEnd-style.none": "無",
112
+ "arrowheadEnd-style.pipe": "管狀",
113
+ "arrowheadEnd-style.square": "正方形",
114
+ "arrowheadEnd-style.triangle": "三角形",
115
+ "arrowheadStart-style.arrow": "箭頭",
116
+ "arrowheadStart-style.bar": "條狀",
117
+ "arrowheadStart-style.diamond": "菱形",
118
+ "arrowheadStart-style.dot": "點",
119
+ "arrowheadStart-style.inverted": "反轉",
120
+ "arrowheadStart-style.none": "無",
121
+ "arrowheadStart-style.pipe": "管狀",
122
+ "arrowheadStart-style.square": "正方形",
123
+ "arrowheadStart-style.triangle": "三角形",
124
+ "assets.files.upload-failed": "上傳失敗",
125
+ "color-style.black": "黑色",
126
+ "color-style.blue": "藍色",
127
+ "color-style.green": "綠色",
128
+ "color-style.grey": "灰色",
129
+ "color-style.light-blue": "淺藍色",
130
+ "color-style.light-green": "淺綠色",
131
+ "color-style.light-red": "淺紅色",
132
+ "color-style.light-violet": "淺紫色",
133
+ "color-style.orange": "橘色",
134
+ "color-style.red": "紅色",
135
+ "color-style.violet": "紫色",
136
+ "color-style.yellow": "黃色",
137
+ "context-menu.arrange": "佈局",
138
+ "context-menu.copy-as": "複製成",
139
+ "context-menu.edit": "編輯",
140
+ "context-menu.export-as": "匯出成",
141
+ "context-menu.move-to-page": "移至頁面",
142
+ "context-menu.reorder": "重新排序",
143
+ "context.pages.new-page": "新頁面",
144
+ "dash-style.dashed": "虛線",
145
+ "dash-style.dotted": "虛點",
146
+ "dash-style.draw": "手繪",
147
+ "dash-style.solid": "實線",
148
+ "debug-panel.more": "更多",
149
+ "document.default-name": "無標題",
150
+ "edit-link-dialog.cancel": "取消",
151
+ "edit-link-dialog.clear": "清除",
152
+ "edit-link-dialog.detail": "連結將在新分頁開啟。",
153
+ "edit-link-dialog.invalid-url": "連結必須是有效網址。",
154
+ "edit-link-dialog.save": "繼續",
155
+ "edit-link-dialog.title": "編輯連結",
156
+ "edit-link-dialog.url": "網址",
157
+ "edit-pages-dialog.move-down": "下移",
158
+ "edit-pages-dialog.move-up": "上移",
159
+ "embed-dialog.back": "返回",
160
+ "embed-dialog.cancel": "取消",
161
+ "embed-dialog.create": "建立",
162
+ "embed-dialog.instruction": "貼上網站連結以建立嵌入。",
163
+ "embed-dialog.invalid-url": "我們沒辦法從該網址建立嵌入。",
164
+ "embed-dialog.title": "建立嵌入",
165
+ "embed-dialog.url": "網址",
166
+ "file-system.confirm-clear.cancel": "取消",
167
+ "file-system.confirm-clear.continue": "繼續",
168
+ "file-system.confirm-clear.description": "建立新專案將清除當前專案,任何未儲存的更動都會消失。您確定要繼續嗎?",
169
+ "file-system.confirm-clear.dont-show-again": "不再詢問",
170
+ "file-system.confirm-clear.title": "清除當前專案?",
171
+ "file-system.confirm-open.cancel": "取消",
172
+ "file-system.confirm-open.description": "開啟檔案將置換您的當前專案,任何未儲存的更動都會消失。您確定要繼續嗎?",
173
+ "file-system.confirm-open.dont-show-again": "不再詢問",
174
+ "file-system.confirm-open.open": "開啟檔案",
175
+ "file-system.confirm-open.title": "覆蓋當前檔案?",
176
+ "file-system.file-open-error.file-format-version-too-new": "你嘗試開啟的檔案來自新版 tldraw。請重新載入頁面,然後再試一次。",
177
+ "file-system.file-open-error.generic-corrupted-file": "您嘗試開啟的檔案已損毀。",
178
+ "file-system.file-open-error.not-a-tldraw-file": "您嘗試開啟的檔案不像 tldraw 檔。",
179
+ "file-system.file-open-error.title": "無法開啟檔案",
180
+ "file-system.shared-document-file-open-error.description": "不支援從共享專案開啟檔案。",
181
+ "file-system.shared-document-file-open-error.title": "無法開啟檔案",
182
+ "fill-style.none": "無",
183
+ "fill-style.pattern": "圖案",
184
+ "fill-style.semi": "半填滿",
185
+ "fill-style.solid": "填滿",
186
+ "focus-mode.toggle-focus-mode": "切換專注模式",
187
+ "font-style.draw": "手繪",
188
+ "font-style.mono": "等寬",
189
+ "font-style.sans": "無襯線",
190
+ "font-style.serif": "襯線",
191
+ "geo-style.arrow-down": "向下箭頭",
192
+ "geo-style.arrow-left": "向左箭頭",
193
+ "geo-style.arrow-right": "向右箭頭",
194
+ "geo-style.arrow-up": "向上箭頭",
195
+ "geo-style.diamond": "菱形 2",
196
+ "geo-style.ellipse": "橢圓形",
197
+ "geo-style.hexagon": "六邊形",
198
+ "geo-style.octagon": "八邊形",
199
+ "geo-style.oval": "卵形",
200
+ "geo-style.pentagon": "五邊形",
201
+ "geo-style.rectangle": "矩形",
202
+ "geo-style.rhombus": "菱形",
203
+ "geo-style.rhombus-2": "菱形 2",
204
+ "geo-style.star": "星形",
205
+ "geo-style.trapezoid": "梯形",
206
+ "geo-style.triangle": "三角形",
207
+ "geo-style.x-box": "X 框",
208
+ "help-menu.about": "關於",
209
+ "help-menu.discord": "Discord",
210
+ "help-menu.github": "GitHub",
211
+ "help-menu.keyboard-shortcuts": "鍵盤快捷鍵",
212
+ "help-menu.title": "幫助和資源",
213
+ "help-menu.twitter": "Twitter",
214
+ "home-project-dialog.ok": "好的",
215
+ "menu.copy-as": "複製成",
216
+ "menu.edit": "編輯",
217
+ "menu.export-as": "匯出成",
218
+ "menu.file": "檔案",
219
+ "menu.language": "語言",
220
+ "menu.preferences": "選項",
221
+ "menu.title": "選單",
222
+ "menu.view": "檢視",
223
+ "navigation-zone.toggle-minimap": "切換小地圖",
224
+ "navigation-zone.zoom": "縮放",
225
+ "opacity-style.0.1": "10%",
226
+ "opacity-style.0.25": "25%",
227
+ "opacity-style.0.5": "50%",
228
+ "opacity-style.0.75": "75%",
229
+ "opacity-style.1": "100%",
230
+ "page-menu.create-new-page": "建立新頁面",
231
+ "page-menu.edit-done": "完成",
232
+ "page-menu.edit-start": "編輯",
233
+ "page-menu.go-to-page": "轉到頁面",
234
+ "page-menu.max-page-count-reached": "達到上限頁數",
235
+ "page-menu.new-page-initial-name": "頁面 1",
236
+ "page-menu.submenu.delete": "刪除",
237
+ "page-menu.submenu.duplicate-page": "複製",
238
+ "page-menu.submenu.move-down": "下移",
239
+ "page-menu.submenu.move-up": "上移",
240
+ "page-menu.submenu.rename": "重新命名",
241
+ "page-menu.submenu.title": "選單",
242
+ "page-menu.title": "頁面",
243
+ "people-menu.change-color": "更改顏色",
244
+ "people-menu.change-name": "更改名稱",
245
+ "people-menu.follow": "追蹤",
246
+ "people-menu.invite": "邀請其他人",
247
+ "people-menu.title": "人員",
248
+ "people-menu.user": "(您)",
249
+ "rename-project-dialog.cancel": "取消",
250
+ "rename-project-dialog.rename": "重新命名",
251
+ "rename-project-dialog.title": "重新命名專案",
252
+ "share-menu.copied": "已複製連結!",
253
+ "share-menu.copy-link": "複製連結",
254
+ "share-menu.copy-link-note": "任何人透過連結都能檢視和編輯此專案。",
255
+ "share-menu.copy-readonly-link": "複製唯讀連結",
256
+ "share-menu.copy-readonly-link-note": "任何人透過連結都能檢視(但不能編輯)此專案。",
257
+ "share-menu.create-snapshot-link": "建立快照連結",
258
+ "share-menu.creating-project": "正在新建專案…",
259
+ "share-menu.fork-note": "基於此快照建立新的共享專案。",
260
+ "share-menu.offline-note": "共享此專案將建立即時副本,並產生新網址。您可以分享網址,與其他至多三十人一起檢視和編輯副本。",
261
+ "share-menu.project-too-large": "抱歉,無法共享此專案,因為檔案過大。我們已在調整這件事!",
262
+ "share-menu.readonly-link": "唯讀",
263
+ "share-menu.save-note": "將此專案作為 .tldr 檔下載到您的電腦。",
264
+ "share-menu.share-project": "共享此專案",
265
+ "share-menu.title": "共享",
266
+ "shortcuts-dialog.edit": "編輯",
267
+ "shortcuts-dialog.file": "檔案",
268
+ "shortcuts-dialog.preferences": "選項",
269
+ "shortcuts-dialog.title": "鍵盤快捷鍵",
270
+ "shortcuts-dialog.tools": "工具",
271
+ "shortcuts-dialog.transform": "轉換",
272
+ "shortcuts-dialog.view": "檢視",
273
+ "size-style.l": "大",
274
+ "size-style.m": "中",
275
+ "size-style.s": "小",
276
+ "size-style.xl": "特大",
277
+ "spline-style.cubic": "立方體",
278
+ "spline-style.line": "直線",
279
+ "status.offline": "斷線",
280
+ "status.online": "已連線",
281
+ "style-panel.align": "對齊",
282
+ "style-panel.arrowhead-end": "末端",
283
+ "style-panel.arrowhead-start": "前端",
284
+ "style-panel.arrowheads": "箭頭",
285
+ "style-panel.color": "顏色",
286
+ "style-panel.dash": "虛線",
287
+ "style-panel.fill": "填充",
288
+ "style-panel.font": "字型",
289
+ "style-panel.geo": "形狀",
290
+ "style-panel.mixed": "混合",
291
+ "style-panel.opacity": "不透明度",
292
+ "style-panel.position": "位置",
293
+ "style-panel.size": "大小",
294
+ "style-panel.spline": "曲線",
295
+ "style-panel.title": "樣式",
296
+ "toast.close": "關閉",
297
+ "toast.error.copy-fail.desc": "圖片複製失敗",
298
+ "toast.error.copy-fail.title": "複製失敗",
299
+ "toast.error.export-fail.desc": "圖片匯出失敗",
300
+ "toast.error.export-fail.title": "匯出失敗",
301
+ "tool-panel.drawing": "繪圖",
302
+ "tool-panel.more": "更多",
303
+ "tool-panel.shapes": "形狀",
304
+ "tool.arrow": "箭頭",
305
+ "tool.arrow-down": "向下箭頭",
306
+ "tool.arrow-left": "向左箭頭",
307
+ "tool.arrow-right": "向右箭頭",
308
+ "tool.arrow-up": "向上箭頭",
309
+ "tool.asset": "資源",
310
+ "tool.diamond": "菱形 2",
311
+ "tool.draw": "手繪",
312
+ "tool.ellipse": "橢圓形",
313
+ "tool.embed": "嵌入",
314
+ "tool.eraser": "橡皮擦",
315
+ "tool.frame": "框架",
316
+ "tool.hand": "抓取",
317
+ "tool.hexagon": "六邊形",
318
+ "tool.line": "直線",
319
+ "tool.note": "便利貼",
320
+ "tool.octagon": "八邊形",
321
+ "tool.oval": "卵形",
322
+ "tool.pentagon": "五邊形",
323
+ "tool.rectangle": "矩形",
324
+ "tool.rhombus": "菱形",
325
+ "tool.select": "選取",
326
+ "tool.star": "星形",
327
+ "tool.text": "文字",
328
+ "tool.trapezoid": "梯形",
329
+ "tool.triangle": "三角形",
330
+ "tool.x-box": "X 框",
331
+ "verticalAlign-style.end": "置底",
332
+ "verticalAlign-style.middle": "置中",
333
+ "verticalAlign-style.start": "置頂",
334
+ "vscode.file-open.backup": "備份",
335
+ "vscode.file-open.backup-failed": "備份失敗:這不是 .tldr 檔。",
336
+ "vscode.file-open.backup-saved": "已備份",
337
+ "vscode.file-open.desc": "此檔案由較早版本的 tldraw 所建立。您想要更新它以用於新版本上嗎?",
338
+ "vscode.file-open.dont-show-again": "不再詢問",
339
+ "vscode.file-open.open": "繼續"
340
+ }
@@ -0,0 +1,22 @@
1
+ import { Plugin } from "@dxos/app-framework";
2
+ import { meta } from "#meta";
3
+ import { AppActivationEvents, AppPlugin } from "@dxos/app-toolkit";
4
+ import { SketchVariant, TldrawSettings } from "#capabilities";
5
+ import { translations } from "#translations";
6
+ import { Tldraw } from "#types";
7
+ //#endregion
8
+ //#region src/TldrawPlugin.tsx
9
+ var TldrawPlugin = Plugin.define(meta).pipe(Plugin.addModule({
10
+ id: "sketch-variant",
11
+ activatesOn: AppActivationEvents.SetupSchema,
12
+ activate: SketchVariant
13
+ }), AppPlugin.addSchemaModule({ schema: [Tldraw.Canvas] }), AppPlugin.addSettingsModule({ activate: TldrawSettings }), AppPlugin.addTranslationsModule({ translations }), AppPlugin.addPluginAssetModule({ asset: {
14
+ pluginId: meta.profile.key,
15
+ path: "PLUGIN.mdl",
16
+ content: "---\nid: org.dxos.plugin.tldraw\nname: TldrawPlugin\nversion: 0.1.0\n---\n\nA collaborative whiteboard plugin for `DXOS` Composer — powered by tldraw, persisted in ECHO, and available as a first-class workspace object.\n\n## Extensions\n\nThe following extension dialects are used in this document.\nEach extension is defined in the Appendix or resolved via its URI.\n\n| Term | URI |\n|-------------|--------------------------------|\n| `type` | `org.dxos.mdl.type@1.0` |\n| `feat` | `org.dxos.mdl.feat@1.0` |\n| `test` | `org.dxos.mdl.test@1.0` |\n| `component` | `org.dxos.mdl.component@1.0` |\n| `op` | `org.dxos.mdl.op@1.0` |\n\n## Types\n\n```mdl\ntype Canvas\n desc: Low-level drawing document backed by a tldraw store.\n fields:\n schema?: string # external schema reference (default: tldraw.com/2)\n content: Map<string, any> # tldraw store snapshot — shapes, bindings, assets\n```\n\n```mdl\ntype Sketch\n desc: User-facing whiteboard object that wraps a Canvas.\n fields:\n name?: string\n canvas: Ref<Canvas> # reference to the tldraw content store\n```\n\n```mdl\ntype SketchGrid\n literals: mesh | dotted\n```\n\n```mdl\ntype Settings\n fields:\n showGrid?: boolean # display a background grid on the canvas\n gridType?: SketchGrid # mesh or dotted pattern\n```\n\n```mdl\ntype Scene\n desc: |\n Backend-neutral scene DSL (src/model). A diagram is a set of world objects\n (\"face\", \"hat\") composed of elements in object-local units; a compiler maps\n the scene to tldraw records with identity stamped in record meta\n ({ object, element, kind, scale, dialect }) so edits address shapes by id.\n fields:\n objects: WorldObject[]\n```\n\n```mdl\ntype WorldObject\n fields:\n id: string # semantic id (\"face\"); addressing key for edits\n origin?: Point # canvas px; derived from bbox top-left on read\n scale?: number # canvas px per local unit (default 1)\n elements: Element[] # rect | ellipse | circle | diamond | triangle |\n # line | curve | arc | text | arrow\n```\n\n```mdl\ntype Command\n desc: Scene edit commands (D2-Oracle-style, addressed by id).\n literals: upsert-object | upsert-elements | remove-elements | remove-object | move-object\n```\n\n## Components\n\n```mdl\ncomponent SketchArticle\n desc: Full-screen whiteboard surface for a Sketch object. Renders inside article, section, and slide roles.\n props:\n subject: Sketch\n settings: Settings\n attendableId: string\n role: article | section | slide\n state:\n editor?: Editor # tldraw Editor instance\n hasAttention: boolean\n slots:\n toolbar?: ReactNode # injected tldraw toolbar actions\n actions:\n createThread() # opens a comment thread anchored to a selection\n layout: |\n ┌─────────────────────────────────┐\n │ tldraw toolbar (when attended) │\n ├─────────────────────────────────┤\n │ │\n │ infinite canvas (tldraw) │\n │ shapes / freehand / text │\n │ │\n │ [comment thread anchors] │\n │ │\n └─────────────────────────────────┘\n```\n\n```mdl\ncomponent SketchSettings\n desc: Settings panel for the Sketch plugin — controls grid visibility and type.\n props:\n settings: Settings\n onSettingsChange?: (updater: (s: Settings) => Settings) => void\n```\n\n## Operations\n\n```mdl\nop createSketch\n desc: Creates a new Sketch with an associated Canvas and adds it to the target space or collection.\n input:\n name?: string\n schema?: string # tldraw schema version (default: tldraw.com/2)\n content?: Map<string, any> # optional initial tldraw store snapshot\n output: Sketch\n effects: [echo:write]\n```\n\n```mdl\nop readSketch\n desc: |\n Returns the derived Scene (world objects with object-local coordinates) read\n from the live canvas records, plus a count of unmanaged (hand-drawn) shapes.\n Origins derive from bounding boxes, so the scene stays coherent after users\n drag shapes. The agent calls this before editing an existing sketch.\n input:\n sketch: Ref<Sketch>\n output: { scene: Scene, unmanaged: number }\n requires: [Database]\n```\n\n```mdl\nop editSketch\n desc: |\n Applies scene commands atomically (one Obj.update): upsert/move/remove world\n objects or individual elements by id. Returns the resulting scene so the\n agent can maintain its mental model across turns.\n input:\n sketch: Ref<Sketch>\n commands: Command[]\n output: { scene: Scene, unmanaged: number, upserted: string[], removed: number }\n effects: [echo:write]\n requires: [Database]\n```\n\n## Features\n\n```mdl\nfeat F-1: Whiteboard Canvas\n\n req F-1.1: Each Sketch owns exactly one Canvas; the Canvas holds the full tldraw store snapshot.\n req F-1.2: Canvas content is stored as a plain record in ECHO — no binary blobs.\n req F-1.3: All tldraw shape types (freehand, geometric, text, arrow, image) are supported.\n```\n\n```mdl\nfeat F-2: ECHO Persistence\n\n req F-2.1:\n when: user makes any edit in the whiteboard\n then: Canvas.content is updated in ECHO within the debounce window\n\n req F-2.2:\n when: Sketch is opened after a page reload\n then: tldraw store is hydrated from Canvas.content; no drawing is lost\n\n req F-2.3: Canvas is a separate ECHO object from Sketch so it can be replicated independently.\n```\n\n```mdl\nfeat F-3: Real-time Collaboration\n\n req F-3.1:\n when: two or more peers open the same Sketch\n then: edits by each peer appear on the other's canvas via ECHO replication\n\n req F-3.2:\n when: a peer is offline and makes edits\n then: changes merge with remote state on reconnection using ECHO CRDT semantics\n```\n\n```mdl\nfeat F-4: Roles and Presentation\n\n req F-4.1:\n when: role is article\n then: full tldraw toolbar shown when the sketch has attention; hidden otherwise\n\n req F-4.2:\n when: role is slide\n then: canvas is read-only; zoom capped at 1.5×\n\n req F-4.3:\n when: role is section\n then: canvas auto-zooms to fit content; no toolbar shown\n```\n\n```mdl\nfeat F-5: Comment Threads\n\n req F-5.1:\n when: user activates the thread tool in the toolbar\n then: a new comment thread is created anchored to the current selection\n\n req F-5.2: Thread anchor positions are stored alongside the drawing so they survive reloads.\n```\n\n```mdl\nfeat F-6: Grid Settings\n\n req F-6.1:\n when: Settings.showGrid is true\n then: a background grid rendered beneath drawing content\n\n req F-6.2:\n when: Settings.gridType is mesh\n then: a square-mesh grid is shown\n\n req F-6.3:\n when: Settings.gridType is dotted\n then: a dotted grid is shown\n```\n\n```mdl\nfeat F-7: Create Sketch Operation\n\n req F-7.1: Plugin contributes op:createSketch to the operation registry.\n req F-7.2:\n when: op:createSketch is invoked\n then: a Sketch + Canvas pair is created and returned; the Sketch is added to the target collection\n```\n\n```mdl\nfeat F-8: Scene DSL and Agent Skill\n\n req F-8.1: The scene model (src/model) is backend-neutral — no tldraw imports in scene.ts;\n the tldraw compiler (render.ts/read.ts) is one backend, Excalidraw can be added later.\n req F-8.2: Every DSL-generated tldraw record carries meta { object, element, kind, scale, dialect };\n record ids are deterministic (shape:<object>/<element>) so re-rendering an element reuses its id.\n req F-8.3:\n when: op:editSketch upserts elements of an existing object\n then: only records with matching element ids are replaced; sibling elements are untouched\n req F-8.4:\n when: a shape bound by an arrow is removed\n then: its bindings are removed too; no dangling binding records remain\n req F-8.5:\n when: op:readSketch runs after a user drags shapes in the UI\n then: the derived scene reflects the moved geometry (origin = bbox top-left)\n req F-8.6: Plugin contributes the org.dxos.skill.sketch skill (create/read/edit tools +\n DSL instructions: object-local units, semantic ids, read-before-edit workflow).\n req F-8.7: A dialect registry (scene only for now) reserves the extension point for\n mermaid / d2 / sequence / uml-class compilers that emit scene commands.\n```\n\n## Acceptance\n\n```mdl\ntest T-1: Create and open sketch\n given: a Composer space is active\n when: op:createSketch runs with name \"My Diagram\"\n then:\n - a Sketch object is created with name \"My Diagram\"\n - Sketch.canvas references a new Canvas with empty content\n - Sketch appears in the space object list\n```\n\n```mdl\ntest T-2: Drawing persists across reload\n given: a Sketch is open and the user draws a freehand stroke\n when: the page is reloaded and the Sketch is reopened\n then:\n - the stroke is visible on the canvas\n - Canvas.content is non-empty\n```\n\n```mdl\ntest T-3: Collaborative edit\n given: two peers have the same Sketch open\n when: peer A draws a rectangle\n then:\n - peer B sees the rectangle appear within the ECHO sync window\n - no data loss if both peers edit simultaneously\n```\n\n```mdl\ntest T-4: Read-only slide role\n given: a Sketch is rendered in role slide\n then:\n - tldraw toolbar is not shown\n - all drawing tools are disabled\n - zoom is capped at 1.5×\n```\n\n```mdl\ntest T-5: Grid toggle\n given: SketchSettings panel is open\n when: user enables the grid and selects \"dotted\"\n then:\n - Settings.showGrid === true\n - Settings.gridType === dotted\n - dotted grid appears on the canvas immediately\n```\n\n```mdl\ntest T-6: Attention-aware toolbar\n given: a Sketch is open in article role alongside other articles\n when: user clicks on the sketch to give it attention\n then: tldraw toolbar becomes visible\n when: user clicks away, removing attention\n then: tldraw toolbar is hidden\n```\n\n```mdl\ntest T-7: Scene DSL round-trip\n given: an empty Sketch\n when: editSketch upserts a \"face\" object (head/eyes/smile), then upserts a \"hat\" object and\n replaces only the \"smile\" element, then removes the \"hat\"\n then:\n - readSketch returns the face with derived origin and all element ids\n - the untouched face elements are byte-identical across the hat edit\n - removing the hat removes exactly its records and no bindings dangle\n # Covered by src/operations/operations.test.ts and src/model/scene.test.ts.\n```\n\n```mdl\ntest T-8: Conversational drawing (live AI)\n given: the stories-assistant Sketch storybook (config.remote) with the sketch skill bound\n when: the user prompts \"Draw a smiley face\", then \"Add a hat\"\n then:\n - the agent creates a \"face\" world object via editSketch\n - the follow-up adds a \"hat\" object WITHOUT redrawing the face (mental-model test)\n # Manual: stories/stories-assistant/Sketch → DrawAndUpdateTest / Reflection (tags: ['!test']).\n # Verified live 2026-07-23 (remote EDGE, claude-opus-4-8): face drawn, hat composed on top,\n # face records untouched.\n```\n\n---\n\n## Appendix: Extension Definitions\n\n```mdl\next type\n uri: org.dxos.mdl.type@1.0\n desc: A named data structure with typed fields and optional literals.\n fields:\n desc?: Prose\n fields?: FieldMap\n literals?: UnionList\n extends?: TypeRef[]\n```\n\n```mdl\next feat\n uri: org.dxos.mdl.feat@1.0\n desc: A named feature grouping one or more requirements.\n fields:\n desc?: Prose\n req: RequirementList\n nesting: self\n```\n\n```mdl\next test\n uri: org.dxos.mdl.test@1.0\n desc: An acceptance scenario expressed as given / when / then steps.\n fields:\n given?: Step | Step[]\n when?: Step | Step[]\n then: Step | Step[]\n tags?: TagList\n```\n\n```mdl\next component\n uri: org.dxos.mdl.component@1.0\n desc: A UI component with props, internal state, slots, actions, and events.\n fields:\n desc?: Prose\n props?: FieldMap\n state?: FieldMap\n slots?: FieldMap\n actions?: ActionMap\n emits?: EventMap\n layout?: CodeBlock\n```\n\n```mdl\next op\n uri: org.dxos.mdl.op@1.0\n desc: |\n A named operation with typed inputs, outputs, and declared errors.\n Pure ops have no effects or requires. Effectful ops declare both.\n fields:\n desc?: Prose\n input?: FieldMap\n output?: TypeExpr\n errors?: ErrorMap\n effects?: EffectList\n requires?: ServiceList\n note?: Prose\n```\n",
17
+ mimeType: "application/x-mdl"
18
+ } }), Plugin.make);
19
+ //#endregion
20
+ export { TldrawPlugin, TldrawPlugin as default };
21
+
22
+ //# sourceMappingURL=TldrawPlugin.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TldrawPlugin.mjs","names":[],"sources":["../../src/TldrawPlugin.tsx"],"sourcesContent":["//\n// Copyright 2023 DXOS.org\n//\n\nimport { Plugin } from '@dxos/app-framework';\nimport { AppActivationEvents, AppPlugin } from '@dxos/app-toolkit';\n\nimport { SketchVariant, TldrawSettings } from '#capabilities';\nimport { meta } from '#meta';\nimport { translations } from '#translations';\nimport { Tldraw } from '#types';\n\n// eslint-disable-next-line import/no-relative-packages\nimport pluginSpec from '../PLUGIN.mdl?raw';\n\nexport const TldrawPlugin = Plugin.define(meta).pipe(\n Plugin.addModule({\n id: 'sketch-variant',\n activatesOn: AppActivationEvents.SetupSchema,\n activate: SketchVariant,\n }),\n AppPlugin.addSchemaModule({ schema: [Tldraw.Canvas] }),\n AppPlugin.addSettingsModule({ activate: TldrawSettings }),\n AppPlugin.addTranslationsModule({ translations }),\n AppPlugin.addPluginAssetModule({\n asset: { pluginId: meta.profile.key, path: 'PLUGIN.mdl', content: pluginSpec, mimeType: 'application/x-mdl' },\n }),\n Plugin.make,\n);\n\nexport default TldrawPlugin;\n"],"mappings":";;;;;;;;AAeA,IAAa,eAAe,OAAO,OAAO,IAAI,CAAC,CAAC,KAC9C,OAAO,UAAU;CACf,IAAI;CACJ,aAAa,oBAAoB;CACjC,UAAU;AACZ,CAAC,GACD,UAAU,gBAAgB,EAAE,QAAQ,CAAC,OAAO,MAAM,EAAE,CAAC,GACrD,UAAU,kBAAkB,EAAE,UAAU,eAAe,CAAC,GACxD,UAAU,sBAAsB,EAAE,aAAa,CAAC,GAChD,UAAU,qBAAqB,EAC7B,OAAO;CAAE,UAAU,KAAK,QAAQ;CAAK,MAAM;CAAc,SAAS;CAAY,UAAU;AAAoB,EAC9G,CAAC,GACD,OAAO,IACT"}
@@ -0,0 +1,24 @@
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
+ }
24
+ /*$vite$:1*/
@@ -0,0 +1,8 @@
1
+ import { Capability } from "@dxos/app-framework";
2
+ //#region src/capabilities/index.ts
3
+ var SketchVariant = Capability.lazy("SketchVariant", () => import("./chunk-sketch-variant.mjs"));
4
+ var TldrawSettings = Capability.lazy("TldrawSettings", () => import("./chunk-settings.mjs"));
5
+ //#endregion
6
+ export { SketchVariant, TldrawSettings };
7
+
8
+ //# sourceMappingURL=capabilities.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.mjs","names":[],"sources":["../../src/capabilities/index.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Capability } from '@dxos/app-framework';\n\nexport const SketchVariant = Capability.lazy('SketchVariant', () => import('./sketch-variant'));\nexport const TldrawSettings = Capability.lazy('TldrawSettings', () => import('./settings'));\n"],"mappings":";;AAMA,IAAa,gBAAgB,WAAW,KAAK,uBAAuB,OAAO,6BAAmB;AAC9F,IAAa,iBAAiB,WAAW,KAAK,wBAAwB,OAAO,uBAAa"}
@@ -0,0 +1,60 @@
1
+ import { isTauri } from "@dxos/util";
2
+ import { invariant } from "@dxos/invariant";
3
+ import { Obj } from "@dxos/echo";
4
+ import { Tldraw, TldrawCapabilities } from "#types";
5
+ import "react";
6
+ import { Flex, Panel, composable, composableProps } from "@dxos/react-ui";
7
+ import { jsx } from "react/jsx-runtime";
8
+ import { useAtomCapability } from "@dxos/app-framework/ui";
9
+ import { AppSurface, useAppGraph } from "@dxos/app-toolkit/ui";
10
+ import { useActions } from "@dxos/plugin-graph";
11
+ import { useAttention } from "@dxos/react-ui-attention";
12
+ import { CanvasComponent } from "#components";
13
+ //#region src/containers/TldrawArticle/TldrawArticle.tsx
14
+ var __dxlog_file = "/Users/burdon/Code/dxos/dxos/.claude/worktrees/peaceful-allen-9b542f/packages/plugins/plugin-tldraw/src/containers/TldrawArticle/TldrawArticle.tsx";
15
+ var TldrawArticle = ({ role, attendableId, sketch, canvas, extrinsic }) => {
16
+ invariant(Obj.instanceOf(Tldraw.Canvas, canvas), void 0, {
17
+ "~LogMeta": "~LogMeta",
18
+ F: __dxlog_file,
19
+ L: 24,
20
+ S: void 0,
21
+ A: ["Obj.instanceOf(Tldraw.Canvas, canvas)", ""]
22
+ });
23
+ const settings = useAtomCapability(TldrawCapabilities.Settings);
24
+ const id = Obj.getURI(sketch);
25
+ const { hasAttention } = useAttention(attendableId);
26
+ const section = role === AppSurface.Section.role;
27
+ const props = {
28
+ readonly: role === AppSurface.Slide.role,
29
+ autoCenter: section ? true : void 0
30
+ };
31
+ const { graph } = useAppGraph();
32
+ const handleThreadCreate = useActions(graph, id).find((action) => action.id === `${id}/comment`)?.data;
33
+ const content = /* @__PURE__ */ jsx(CanvasComponent, {
34
+ classNames: "dx-attention-surface",
35
+ canvas,
36
+ settings,
37
+ hideUi: section ? !hasAttention : !hasAttention && !isTauri(),
38
+ onThreadCreate: handleThreadCreate,
39
+ ...props
40
+ }, id);
41
+ return section ? /* @__PURE__ */ jsx(Container, {
42
+ fill: extrinsic,
43
+ children: content
44
+ }) : /* @__PURE__ */ jsx(Article, { children: content });
45
+ };
46
+ var Article = composable((props, forwardedRef) => /* @__PURE__ */ jsx(Panel.Root, {
47
+ ...composableProps(props, { classNames: "aspect-square" }),
48
+ ref: forwardedRef,
49
+ children: /* @__PURE__ */ jsx(Panel.Content, { children: props.children })
50
+ }));
51
+ var Container = composable(({ fill, ...props }, forwardedRef) => /* @__PURE__ */ jsx(Flex, {
52
+ ...composableProps(props, { classNames: [fill ? "h-full w-full" : "aspect-square", "overflow-hidden"] }),
53
+ ref: forwardedRef,
54
+ children: props.children
55
+ }));
56
+ TldrawArticle.displayName = "TldrawArticle";
57
+ //#endregion
58
+ export { TldrawArticle as default };
59
+
60
+ //# sourceMappingURL=chunk-TldrawArticle.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-TldrawArticle.mjs","names":[],"sources":["../../src/containers/TldrawArticle/TldrawArticle.tsx"],"sourcesContent":["//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { type PropsWithChildren } from 'react';\n\nimport { useAtomCapability } from '@dxos/app-framework/ui';\nimport { AppSurface, useAppGraph } from '@dxos/app-toolkit/ui';\nimport { Obj } from '@dxos/echo';\nimport { invariant } from '@dxos/invariant';\nimport { useActions } from '@dxos/plugin-graph';\nimport { type SketchVariantSurfaceProps } from '@dxos/plugin-illustrator/types';\nimport { Flex, Panel } from '@dxos/react-ui';\nimport { composable, composableProps } from '@dxos/react-ui';\nimport { useAttention } from '@dxos/react-ui-attention';\nimport { isTauri } from '@dxos/util';\n\nimport { CanvasComponent } from '#components';\nimport { Tldraw, TldrawCapabilities } from '#types';\n\nexport type TldrawArticleProps = SketchVariantSurfaceProps;\n\nexport const TldrawArticle = ({ role, attendableId, sketch, canvas, extrinsic }: TldrawArticleProps) => {\n invariant(Obj.instanceOf(Tldraw.Canvas, canvas));\n const settings = useAtomCapability(TldrawCapabilities.Settings);\n const id = Obj.getURI(sketch as Obj.Any);\n const { hasAttention } = useAttention(attendableId);\n const section = role === AppSurface.Section.role;\n\n const props = {\n readonly: role === AppSurface.Slide.role,\n autoCenter: section ? true : undefined,\n };\n\n // TODO(wittjosiah): Genericize tldraw toolbar actions w/ graph.\n const { graph } = useAppGraph();\n const actions = useActions(graph, id);\n const handleThreadCreate = actions.find((action) => action.id === `${id}/comment`)?.data;\n\n const content = (\n <CanvasComponent\n // Force instance per canvas object. Otherwise, sketches share the same instance.\n key={id}\n classNames='dx-attention-surface'\n canvas={canvas}\n settings={settings}\n // Section embeds render read-only (no controls/grid) until focused, on every platform; the\n // isTauri allowance (always-on UI) applies only to the full article/slide roles.\n // TODO(wittjosiah): Ensure attention works as expected on the mobile app.\n hideUi={section ? !hasAttention : !hasAttention && !isTauri()}\n onThreadCreate={handleThreadCreate}\n {...props}\n />\n );\n\n // An extrinsically-sized embed fills its (possibly non-square) box; otherwise it falls back to a\n // square so the intrinsic embed has a sensible height.\n return section ? <Container fill={extrinsic}>{content}</Container> : <Article>{content}</Article>;\n};\n\nconst Article = composable<HTMLDivElement, PropsWithChildren>((props, forwardedRef) => (\n <Panel.Root {...composableProps(props, { classNames: 'aspect-square' })} ref={forwardedRef}>\n <Panel.Content>{props.children}</Panel.Content>\n </Panel.Root>\n));\n\nconst Container = composable<HTMLDivElement, PropsWithChildren<{ fill?: boolean }>>(\n ({ fill, ...props }, forwardedRef) => (\n <Flex\n {...composableProps(props, { classNames: [fill ? 'h-full w-full' : 'aspect-square', 'overflow-hidden'] })}\n ref={forwardedRef}\n >\n {props.children}\n </Flex>\n ),\n);\n\nTldrawArticle.displayName = 'TldrawArticle';\n"],"mappings":";;;;;;;;;;;;;;AAsBA,IAAa,iBAAiB,EAAE,MAAM,cAAc,QAAQ,QAAQ,gBAAoC;CACtG,UAAU,IAAI,WAAW,OAAO,QAAQ,MAAM,GAAA,KAAA,GAAA;EAAA,YAAA;EAAA,GAAA;EAAA,GAAA;EAAA,GAAA,KAAA;EAAA,GAAA,CAAA,yCAAA,EAAA;CAAA,CAAC;CAC/C,MAAM,WAAW,kBAAkB,mBAAmB,QAAQ;CAC9D,MAAM,KAAK,IAAI,OAAO,MAAiB;CACvC,MAAM,EAAE,iBAAiB,aAAa,YAAY;CAClD,MAAM,UAAU,SAAS,WAAW,QAAQ;CAE5C,MAAM,QAAQ;EACZ,UAAU,SAAS,WAAW,MAAM;EACpC,YAAY,UAAU,OAAO,KAAA;CAC/B;CAGA,MAAM,EAAE,UAAU,YAAY;CAE9B,MAAM,qBADU,WAAW,OAAO,EACP,CAAA,CAAQ,MAAM,WAAW,OAAO,OAAO,GAAG,GAAG,SAAS,CAAC,EAAE;CAEpF,MAAM,UACJ,oBAAC,iBAAD;EAGE,YAAW;EACH;EACE;EAIV,QAAQ,UAAU,CAAC,eAAe,CAAC,gBAAgB,CAAC,QAAQ;EAC5D,gBAAgB;EAChB,GAAI;CACL,GAVM,EAUN;CAKH,OAAO,UAAU,oBAAC,WAAD;EAAW,MAAM;YAAY;CAAmB,CAAA,IAAI,oBAAC,SAAD,EAAA,UAAU,QAAiB,CAAA;AAClG;AAEA,IAAM,UAAU,YAA+C,OAAO,iBACpE,oBAAC,MAAM,MAAP;CAAY,GAAI,gBAAgB,OAAO,EAAE,YAAY,gBAAgB,CAAC;CAAG,KAAK;WAC5E,oBAAC,MAAM,SAAP,EAAA,UAAgB,MAAM,SAAwB,CAAA;AACpC,CAAA,CACb;AAED,IAAM,YAAY,YACf,EAAE,MAAM,GAAG,SAAS,iBACnB,oBAAC,MAAD;CACE,GAAI,gBAAgB,OAAO,EAAE,YAAY,CAAC,OAAO,kBAAkB,iBAAiB,iBAAiB,EAAE,CAAC;CACxG,KAAK;WAEJ,MAAM;AACH,CAAA,CAEV;AAEA,cAAc,cAAc"}
@@ -0,0 +1,35 @@
1
+ import { invariant } from "@dxos/invariant";
2
+ import { Obj } from "@dxos/echo";
3
+ import { Tldraw } from "#types";
4
+ import "react";
5
+ import { Card } from "@dxos/react-ui";
6
+ import { jsx } from "react/jsx-runtime";
7
+ import { CanvasComponent } from "#components";
8
+ //#region src/containers/TldrawCard/TldrawCard.tsx
9
+ var __dxlog_file = "/Users/burdon/Code/dxos/dxos/.claude/worktrees/peaceful-allen-9b542f/packages/plugins/plugin-tldraw/src/containers/TldrawCard/TldrawCard.tsx";
10
+ var TldrawCard = ({ canvas, editable = false }) => {
11
+ invariant(Obj.instanceOf(Tldraw.Canvas, canvas), void 0, {
12
+ "~LogMeta": "~LogMeta",
13
+ F: __dxlog_file,
14
+ L: 18,
15
+ S: void 0,
16
+ A: ["Obj.instanceOf(Tldraw.Canvas, canvas)", ""]
17
+ });
18
+ return /* @__PURE__ */ jsx(Card.Body, { children: /* @__PURE__ */ jsx(Card.Section, {
19
+ classNames: "aspect-square",
20
+ children: /* @__PURE__ */ jsx(Card.Row, {
21
+ fullWidth: true,
22
+ children: /* @__PURE__ */ jsx(CanvasComponent, {
23
+ canvas,
24
+ autoCenter: true,
25
+ readonly: !editable,
26
+ hideUi: !editable
27
+ })
28
+ })
29
+ }) });
30
+ };
31
+ TldrawCard.displayName = "TldrawCard";
32
+ //#endregion
33
+ export { TldrawCard as default };
34
+
35
+ //# sourceMappingURL=chunk-TldrawCard.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-TldrawCard.mjs","names":[],"sources":["../../src/containers/TldrawCard/TldrawCard.tsx"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\nimport React from 'react';\n\nimport { Obj } from '@dxos/echo';\nimport { invariant } from '@dxos/invariant';\nimport { type SketchVariantSurfaceProps } from '@dxos/plugin-illustrator/types';\nimport { Card } from '@dxos/react-ui';\n\nimport { CanvasComponent } from '#components';\nimport { Tldraw } from '#types';\n\nexport type TldrawCardProps = SketchVariantSurfaceProps;\n\nexport const TldrawCard = ({ canvas, editable = false }: TldrawCardProps) => {\n invariant(Obj.instanceOf(Tldraw.Canvas, canvas));\n return (\n <Card.Body>\n <Card.Section classNames='aspect-square'>\n <Card.Row fullWidth>\n <CanvasComponent canvas={canvas} autoCenter readonly={!editable} hideUi={!editable} />\n </Card.Row>\n </Card.Section>\n </Card.Body>\n );\n};\n\nexport default TldrawCard;\n\nTldrawCard.displayName = 'TldrawCard';\n"],"mappings":";;;;;;;;;AAgBA,IAAa,cAAc,EAAE,QAAQ,WAAW,YAA6B;CAC3E,UAAU,IAAI,WAAW,OAAO,QAAQ,MAAM,GAAA,KAAA,GAAA;EAAA,YAAA;EAAA,GAAA;EAAA,GAAA;EAAA,GAAA,KAAA;EAAA,GAAA,CAAA,yCAAA,EAAA;CAAA,CAAC;CAC/C,OACE,oBAAC,KAAK,MAAN,EAAA,UACE,oBAAC,KAAK,SAAN;EAAc,YAAW;YACvB,oBAAC,KAAK,KAAN;GAAU,WAAA;aACR,oBAAC,iBAAD;IAAyB;IAAQ,YAAA;IAAW,UAAU,CAAC;IAAU,QAAQ,CAAC;GAAW,CAAA;EAC7E,CAAA;CACE,CAAA,EACL,CAAA;AAEf;AAIA,WAAW,cAAc"}
@@ -0,0 +1,40 @@
1
+ import { Plugin } from "@dxos/app-framework";
2
+ import { Config2 } from "@dxos/app-framework/config";
3
+ import { trim } from "@dxos/util";
4
+ //#region dx.config.ts
5
+ var dx_config_default = Config2.make({ plugin: {
6
+ key: "org.dxos.plugin.tldraw",
7
+ name: "tldraw",
8
+ author: "DXOS",
9
+ description: trim`
10
+ tldraw is the canvas renderer that powers collaborative whiteboards in DXOS Composer,
11
+ giving every workspace a full-featured infinite canvas. Draw freehand strokes, place
12
+ geometric shapes, add text and arrows, and organise ideas visually — all within the same
13
+ local-first environment as the rest of your documents.
14
+
15
+ The plugin contributes a sketch variant to the Illustrator plugin: the base \`Sketch\`
16
+ object references a tldraw Canvas whose content is stored as a plain JSON record in ECHO,
17
+ so no binary blobs or external storage are required. Toolbar actions, grid settings, and
18
+ custom tools are wired through the Composer plugin system, and a builder maps the
19
+ Illustrator scene DSL onto tldraw records so agents can draw and edit diagrams.
20
+
21
+ Because Canvas data lives in ECHO, every edit is replicated peer-to-peer in real time.
22
+ Collaborators see each other's strokes as they draw, and changes made offline merge
23
+ automatically when connectivity is restored using ECHO's CRDT semantics.
24
+ `,
25
+ source: "https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-tldraw",
26
+ dependsOn: ["org.dxos.plugin.illustrator"],
27
+ icon: {
28
+ key: "ph--compass-tool--regular",
29
+ hue: "indigo"
30
+ },
31
+ spec: "PLUGIN.mdl",
32
+ screenshots: [{ dark: "https://dxos.network/plugin-details-sketch-dark.png" }]
33
+ } });
34
+ //#endregion
35
+ //#region src/meta.ts
36
+ var meta = Plugin.getMetaFromConfig(dx_config_default);
37
+ //#endregion
38
+ export { meta as t };
39
+
40
+ //# sourceMappingURL=chunk-meta.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-meta.mjs","names":[],"sources":["../../dx.config.ts","../../src/meta.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Config2 } from '@dxos/app-framework/config';\nimport { trim } from '@dxos/util';\n\nexport default Config2.make({\n plugin: {\n key: 'org.dxos.plugin.tldraw',\n name: 'tldraw',\n author: 'DXOS',\n description: trim`\n tldraw is the canvas renderer that powers collaborative whiteboards in DXOS Composer,\n giving every workspace a full-featured infinite canvas. Draw freehand strokes, place\n geometric shapes, add text and arrows, and organise ideas visually — all within the same\n local-first environment as the rest of your documents.\n\n The plugin contributes a sketch variant to the Illustrator plugin: the base \\`Sketch\\`\n object references a tldraw Canvas whose content is stored as a plain JSON record in ECHO,\n so no binary blobs or external storage are required. Toolbar actions, grid settings, and\n custom tools are wired through the Composer plugin system, and a builder maps the\n Illustrator scene DSL onto tldraw records so agents can draw and edit diagrams.\n\n Because Canvas data lives in ECHO, every edit is replicated peer-to-peer in real time.\n Collaborators see each other's strokes as they draw, and changes made offline merge\n automatically when connectivity is restored using ECHO's CRDT semantics.\n `,\n source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-tldraw',\n dependsOn: ['org.dxos.plugin.illustrator'],\n icon: { key: 'ph--compass-tool--regular', hue: 'indigo' },\n spec: 'PLUGIN.mdl',\n screenshots: [{ dark: 'https://dxos.network/plugin-details-sketch-dark.png' }],\n },\n});\n","//\n// Copyright 2023 DXOS.org\n//\n\nimport { Plugin } from '@dxos/app-framework';\n\nimport config from '../dx.config';\n\nexport const meta = Plugin.getMetaFromConfig(config);\n"],"mappings":";;;;AAOA,IAAA,oBAAe,QAAQ,KAAK,EAC1B,QAAQ;CACN,KAAK;CACL,MAAM;CACN,QAAQ;CACR,aAAa,IAAI;;;;;;;;;;;;;;;;CAgBjB,QAAQ;CACR,WAAW,CAAC,6BAA6B;CACzC,MAAM;EAAE,KAAK;EAA6B,KAAK;CAAS;CACxD,MAAM;CACN,aAAa,CAAC,EAAE,MAAM,sDAAsD,CAAC;AAC/E,EACF,CAAC;;;AC1BD,IAAa,OAAO,OAAO,kBAAkB,iBAAM"}
@@ -0,0 +1,23 @@
1
+ import { Capability } from "@dxos/app-framework";
2
+ import { meta } from "#meta";
3
+ import { AppCapabilities } from "@dxos/app-toolkit";
4
+ import { Settings, TldrawCapabilities } from "#types";
5
+ import * as Effect from "effect/Effect";
6
+ import { createKvsStore } from "@dxos/effect";
7
+ //#region src/capabilities/settings.ts
8
+ var settings_default = Capability.makeModule(() => Effect.sync(() => {
9
+ const settingsAtom = createKvsStore({
10
+ key: meta.profile.key,
11
+ schema: Settings.Settings,
12
+ defaultValue: () => ({})
13
+ });
14
+ return [Capability.contributes(TldrawCapabilities.Settings, settingsAtom), Capability.contributes(AppCapabilities.Settings, {
15
+ prefix: meta.profile.key,
16
+ schema: Settings.Settings,
17
+ atom: settingsAtom
18
+ })];
19
+ }));
20
+ //#endregion
21
+ export { settings_default as default };
22
+
23
+ //# sourceMappingURL=chunk-settings.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-settings.mjs","names":[],"sources":["../../src/capabilities/settings.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability } from '@dxos/app-framework';\nimport { AppCapabilities } from '@dxos/app-toolkit';\nimport { createKvsStore } from '@dxos/effect';\n\nimport { meta } from '#meta';\nimport { Settings, TldrawCapabilities } from '#types';\n\nexport default Capability.makeModule(() =>\n Effect.sync(() => {\n const settingsAtom = createKvsStore({\n key: meta.profile.key,\n schema: Settings.Settings,\n defaultValue: () => ({}),\n });\n\n return [\n Capability.contributes(TldrawCapabilities.Settings, settingsAtom),\n Capability.contributes(AppCapabilities.Settings, {\n prefix: meta.profile.key,\n schema: Settings.Settings,\n atom: settingsAtom,\n }),\n ];\n }),\n);\n"],"mappings":";;;;;;;AAaA,IAAA,mBAAe,WAAW,iBACxB,OAAO,WAAW;CAChB,MAAM,eAAe,eAAe;EAClC,KAAK,KAAK,QAAQ;EAClB,QAAQ,SAAS;EACjB,qBAAqB,CAAC;CACxB,CAAC;CAED,OAAO,CACL,WAAW,YAAY,mBAAmB,UAAU,YAAY,GAChE,WAAW,YAAY,gBAAgB,UAAU;EAC/C,QAAQ,KAAK,QAAQ;EACrB,QAAQ,SAAS;EACjB,MAAM;CACR,CAAC,CACH;AACF,CAAC,CACH"}