@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.
- package/LICENSE +105 -0
- package/PLUGIN.mdl +412 -0
- package/README.md +3 -0
- package/dist/assets/embed-icons/codepen.png +0 -0
- package/dist/assets/embed-icons/codesandbox.png +0 -0
- package/dist/assets/embed-icons/desmos.png +0 -0
- package/dist/assets/embed-icons/excalidraw.png +0 -0
- package/dist/assets/embed-icons/felt.png +0 -0
- package/dist/assets/embed-icons/figma.png +0 -0
- package/dist/assets/embed-icons/github_gist.png +0 -0
- package/dist/assets/embed-icons/google_calendar.png +0 -0
- package/dist/assets/embed-icons/google_maps.png +0 -0
- package/dist/assets/embed-icons/google_slides.png +0 -0
- package/dist/assets/embed-icons/observable.png +0 -0
- package/dist/assets/embed-icons/replit.png +0 -0
- package/dist/assets/embed-icons/scratch.png +0 -0
- package/dist/assets/embed-icons/spotify.png +0 -0
- package/dist/assets/embed-icons/tldraw.png +0 -0
- package/dist/assets/embed-icons/val_town.png +0 -0
- package/dist/assets/embed-icons/vimeo.png +0 -0
- package/dist/assets/embed-icons/youtube.png +0 -0
- package/dist/assets/fonts/IBMPlexMono-Medium.woff2 +0 -0
- package/dist/assets/fonts/IBMPlexSans-Medium.woff2 +0 -0
- package/dist/assets/fonts/IBMPlexSerif-Medium.woff2 +0 -0
- package/dist/assets/fonts/Montserrat-Regular.woff2 +0 -0
- package/dist/assets/fonts/Shantell_Sans-Tldrawish.woff2 +0 -0
- package/dist/assets/icons/icon/0_merged.svg +1 -0
- package/dist/assets/icons/icon/align-bottom.svg +1 -0
- package/dist/assets/icons/icon/align-center-horizontal.svg +1 -0
- package/dist/assets/icons/icon/align-center-vertical.svg +1 -0
- package/dist/assets/icons/icon/align-left.svg +1 -0
- package/dist/assets/icons/icon/align-right.svg +1 -0
- package/dist/assets/icons/icon/align-top.svg +1 -0
- package/dist/assets/icons/icon/arrow-left.svg +1 -0
- package/dist/assets/icons/icon/arrowhead-arrow.svg +1 -0
- package/dist/assets/icons/icon/arrowhead-bar.svg +1 -0
- package/dist/assets/icons/icon/arrowhead-diamond.svg +1 -0
- package/dist/assets/icons/icon/arrowhead-dot.svg +1 -0
- package/dist/assets/icons/icon/arrowhead-none.svg +1 -0
- package/dist/assets/icons/icon/arrowhead-square.svg +1 -0
- package/dist/assets/icons/icon/arrowhead-triangle-inverted.svg +1 -0
- package/dist/assets/icons/icon/arrowhead-triangle.svg +1 -0
- package/dist/assets/icons/icon/blob.svg +1 -0
- package/dist/assets/icons/icon/bring-forward.svg +1 -0
- package/dist/assets/icons/icon/bring-to-front.svg +1 -0
- package/dist/assets/icons/icon/broken.svg +1 -0
- package/dist/assets/icons/icon/chat-teardrop-text.svg +1 -0
- package/dist/assets/icons/icon/check-circle.svg +1 -0
- package/dist/assets/icons/icon/check.svg +1 -0
- package/dist/assets/icons/icon/chevron-down.svg +1 -0
- package/dist/assets/icons/icon/chevron-left.svg +1 -0
- package/dist/assets/icons/icon/chevron-right.svg +1 -0
- package/dist/assets/icons/icon/chevron-up.svg +1 -0
- package/dist/assets/icons/icon/chevrons-ne.svg +1 -0
- package/dist/assets/icons/icon/chevrons-sw.svg +1 -0
- package/dist/assets/icons/icon/clipboard-copied.svg +1 -0
- package/dist/assets/icons/icon/clipboard-copy.svg +1 -0
- package/dist/assets/icons/icon/color.svg +1 -0
- package/dist/assets/icons/icon/cross-2.svg +1 -0
- package/dist/assets/icons/icon/cross-circle.svg +1 -0
- package/dist/assets/icons/icon/dash-dashed.svg +1 -0
- package/dist/assets/icons/icon/dash-dotted.svg +1 -0
- package/dist/assets/icons/icon/dash-draw.svg +1 -0
- package/dist/assets/icons/icon/dash-solid.svg +1 -0
- package/dist/assets/icons/icon/disconnected.svg +1 -0
- package/dist/assets/icons/icon/discord.svg +1 -0
- package/dist/assets/icons/icon/distribute-horizontal.svg +1 -0
- package/dist/assets/icons/icon/distribute-vertical.svg +1 -0
- package/dist/assets/icons/icon/dot.svg +1 -0
- package/dist/assets/icons/icon/dots-horizontal.svg +1 -0
- package/dist/assets/icons/icon/dots-vertical.svg +1 -0
- package/dist/assets/icons/icon/drag-handle-dots.svg +1 -0
- package/dist/assets/icons/icon/duplicate.svg +1 -0
- package/dist/assets/icons/icon/edit.svg +1 -0
- package/dist/assets/icons/icon/external-link.svg +1 -0
- package/dist/assets/icons/icon/fill-fill.svg +1 -0
- package/dist/assets/icons/icon/fill-none.svg +1 -0
- package/dist/assets/icons/icon/fill-pattern.svg +1 -0
- package/dist/assets/icons/icon/fill-semi.svg +1 -0
- package/dist/assets/icons/icon/fill-solid.svg +1 -0
- package/dist/assets/icons/icon/follow.svg +1 -0
- package/dist/assets/icons/icon/following.svg +1 -0
- package/dist/assets/icons/icon/font-draw.svg +8 -0
- package/dist/assets/icons/icon/font-mono.svg +1 -0
- package/dist/assets/icons/icon/font-sans.svg +1 -0
- package/dist/assets/icons/icon/font-serif.svg +1 -0
- package/dist/assets/icons/icon/geo-arrow-down.svg +1 -0
- package/dist/assets/icons/icon/geo-arrow-left.svg +1 -0
- package/dist/assets/icons/icon/geo-arrow-right.svg +1 -0
- package/dist/assets/icons/icon/geo-arrow-up.svg +1 -0
- package/dist/assets/icons/icon/geo-check-box.svg +1 -0
- package/dist/assets/icons/icon/geo-cloud.svg +1 -0
- package/dist/assets/icons/icon/geo-diamond.svg +1 -0
- package/dist/assets/icons/icon/geo-ellipse.svg +1 -0
- package/dist/assets/icons/icon/geo-heart.svg +1 -0
- package/dist/assets/icons/icon/geo-hexagon.svg +1 -0
- package/dist/assets/icons/icon/geo-octagon.svg +1 -0
- package/dist/assets/icons/icon/geo-oval.svg +1 -0
- package/dist/assets/icons/icon/geo-pentagon.svg +1 -0
- package/dist/assets/icons/icon/geo-rectangle.svg +1 -0
- package/dist/assets/icons/icon/geo-rhombus-2.svg +1 -0
- package/dist/assets/icons/icon/geo-rhombus.svg +1 -0
- package/dist/assets/icons/icon/geo-star.svg +1 -0
- package/dist/assets/icons/icon/geo-trapezoid.svg +1 -0
- package/dist/assets/icons/icon/geo-triangle.svg +1 -0
- package/dist/assets/icons/icon/geo-x-box.svg +1 -0
- package/dist/assets/icons/icon/github.svg +1 -0
- package/dist/assets/icons/icon/group.svg +1 -0
- package/dist/assets/icons/icon/horizontal-align-end.svg +1 -0
- package/dist/assets/icons/icon/horizontal-align-middle.svg +1 -0
- package/dist/assets/icons/icon/horizontal-align-start.svg +1 -0
- package/dist/assets/icons/icon/icon-names.json +143 -0
- package/dist/assets/icons/icon/info-circle.svg +1 -0
- package/dist/assets/icons/icon/leading.svg +1 -0
- package/dist/assets/icons/icon/link.svg +1 -0
- package/dist/assets/icons/icon/lock.svg +1 -0
- package/dist/assets/icons/icon/menu.svg +1 -0
- package/dist/assets/icons/icon/minus.svg +1 -0
- package/dist/assets/icons/icon/mixed.svg +1 -0
- package/dist/assets/icons/icon/pack.svg +1 -0
- package/dist/assets/icons/icon/plus.svg +1 -0
- package/dist/assets/icons/icon/question-mark-circle.svg +1 -0
- package/dist/assets/icons/icon/question-mark.svg +1 -0
- package/dist/assets/icons/icon/redo.svg +1 -0
- package/dist/assets/icons/icon/reset-zoom.svg +1 -0
- package/dist/assets/icons/icon/rotate-ccw.svg +1 -0
- package/dist/assets/icons/icon/rotate-cw.svg +1 -0
- package/dist/assets/icons/icon/send-backward.svg +1 -0
- package/dist/assets/icons/icon/send-to-back.svg +1 -0
- package/dist/assets/icons/icon/share-1.svg +1 -0
- package/dist/assets/icons/icon/size-extra-large.svg +1 -0
- package/dist/assets/icons/icon/size-large.svg +1 -0
- package/dist/assets/icons/icon/size-medium.svg +1 -0
- package/dist/assets/icons/icon/size-small.svg +1 -0
- package/dist/assets/icons/icon/spline-cubic.svg +1 -0
- package/dist/assets/icons/icon/spline-line.svg +1 -0
- package/dist/assets/icons/icon/stack-horizontal.svg +1 -0
- package/dist/assets/icons/icon/stack-vertical.svg +1 -0
- package/dist/assets/icons/icon/status-offline.svg +1 -0
- package/dist/assets/icons/icon/stretch-horizontal.svg +1 -0
- package/dist/assets/icons/icon/stretch-vertical.svg +1 -0
- package/dist/assets/icons/icon/text-align-center.svg +1 -0
- package/dist/assets/icons/icon/text-align-left.svg +1 -0
- package/dist/assets/icons/icon/text-align-right.svg +1 -0
- package/dist/assets/icons/icon/toggle-off.svg +1 -0
- package/dist/assets/icons/icon/toggle-on.svg +1 -0
- package/dist/assets/icons/icon/tool-arrow.svg +1 -0
- package/dist/assets/icons/icon/tool-eraser.svg +1 -0
- package/dist/assets/icons/icon/tool-frame.svg +1 -0
- package/dist/assets/icons/icon/tool-hand.svg +1 -0
- package/dist/assets/icons/icon/tool-highlight.svg +1 -0
- package/dist/assets/icons/icon/tool-laser.svg +1 -0
- package/dist/assets/icons/icon/tool-line.svg +1 -0
- package/dist/assets/icons/icon/tool-media.svg +1 -0
- package/dist/assets/icons/icon/tool-note.svg +1 -0
- package/dist/assets/icons/icon/tool-pencil.svg +1 -0
- package/dist/assets/icons/icon/tool-pointer.svg +1 -0
- package/dist/assets/icons/icon/tool-screenshot.svg +1 -0
- package/dist/assets/icons/icon/tool-text.svg +1 -0
- package/dist/assets/icons/icon/trash.svg +1 -0
- package/dist/assets/icons/icon/twitter.svg +1 -0
- package/dist/assets/icons/icon/undo.svg +1 -0
- package/dist/assets/icons/icon/ungroup.svg +1 -0
- package/dist/assets/icons/icon/unlock.svg +1 -0
- package/dist/assets/icons/icon/vertical-align-end.svg +1 -0
- package/dist/assets/icons/icon/vertical-align-middle.svg +1 -0
- package/dist/assets/icons/icon/vertical-align-start.svg +1 -0
- package/dist/assets/icons/icon/warning-triangle.svg +1 -0
- package/dist/assets/icons/icon/zoom-in.svg +1 -0
- package/dist/assets/icons/icon/zoom-out.svg +1 -0
- package/dist/assets/translations/ar.json +295 -0
- package/dist/assets/translations/ca.json +295 -0
- package/dist/assets/translations/cs.json +352 -0
- package/dist/assets/translations/da.json +160 -0
- package/dist/assets/translations/de.json +310 -0
- package/dist/assets/translations/en.json +1 -0
- package/dist/assets/translations/es.json +299 -0
- package/dist/assets/translations/fa.json +384 -0
- package/dist/assets/translations/fi.json +312 -0
- package/dist/assets/translations/fr.json +372 -0
- package/dist/assets/translations/gl.json +349 -0
- package/dist/assets/translations/he.json +86 -0
- package/dist/assets/translations/hi-in.json +290 -0
- package/dist/assets/translations/hr.json +358 -0
- package/dist/assets/translations/hu.json +365 -0
- package/dist/assets/translations/id.json +373 -0
- package/dist/assets/translations/it.json +330 -0
- package/dist/assets/translations/ja.json +351 -0
- package/dist/assets/translations/ko-kr.json +396 -0
- package/dist/assets/translations/ku.json +93 -0
- package/dist/assets/translations/languages.json +150 -0
- package/dist/assets/translations/main.json +396 -0
- package/dist/assets/translations/my.json +112 -0
- package/dist/assets/translations/ne.json +295 -0
- package/dist/assets/translations/no.json +62 -0
- package/dist/assets/translations/pl.json +113 -0
- package/dist/assets/translations/pt-br.json +333 -0
- package/dist/assets/translations/pt-pt.json +86 -0
- package/dist/assets/translations/ro.json +371 -0
- package/dist/assets/translations/ru.json +375 -0
- package/dist/assets/translations/sl.json +373 -0
- package/dist/assets/translations/sv.json +96 -0
- package/dist/assets/translations/te.json +112 -0
- package/dist/assets/translations/th.json +295 -0
- package/dist/assets/translations/tr.json +355 -0
- package/dist/assets/translations/uk.json +375 -0
- package/dist/assets/translations/vi.json +295 -0
- package/dist/assets/translations/zh-cn.json +386 -0
- package/dist/assets/translations/zh-tw.json +340 -0
- package/dist/lib/TldrawPlugin.mjs +22 -0
- package/dist/lib/TldrawPlugin.mjs.map +1 -0
- package/dist/lib/assets/plugin-tldraw-BDrn_mrV.css +24 -0
- package/dist/lib/capabilities.mjs +8 -0
- package/dist/lib/capabilities.mjs.map +1 -0
- package/dist/lib/chunk-TldrawArticle.mjs +60 -0
- package/dist/lib/chunk-TldrawArticle.mjs.map +1 -0
- package/dist/lib/chunk-TldrawCard.mjs +35 -0
- package/dist/lib/chunk-TldrawCard.mjs.map +1 -0
- package/dist/lib/chunk-meta.mjs +40 -0
- package/dist/lib/chunk-meta.mjs.map +1 -0
- package/dist/lib/chunk-settings.mjs +23 -0
- package/dist/lib/chunk-settings.mjs.map +1 -0
- package/dist/lib/chunk-sketch-variant.mjs +23 -0
- package/dist/lib/chunk-sketch-variant.mjs.map +1 -0
- package/dist/lib/chunk-types.mjs +73 -0
- package/dist/lib/chunk-types.mjs.map +1 -0
- package/dist/lib/components.mjs +443 -0
- package/dist/lib/components.mjs.map +1 -0
- package/dist/lib/containers.mjs +8 -0
- package/dist/lib/containers.mjs.map +1 -0
- package/dist/lib/hooks.mjs +116 -0
- package/dist/lib/hooks.mjs.map +1 -0
- package/dist/lib/index.mjs +4 -0
- package/dist/lib/meta.mjs +2 -0
- package/dist/lib/model.mjs +905 -0
- package/dist/lib/model.mjs.map +1 -0
- package/dist/lib/plugin.mjs +8 -0
- package/dist/lib/plugin.mjs.map +1 -0
- package/dist/lib/testing.mjs +246 -0
- package/dist/lib/testing.mjs.map +1 -0
- package/dist/lib/translations.mjs +10 -0
- package/dist/lib/translations.mjs.map +1 -0
- package/dist/lib/types.mjs +2 -0
- package/dist/types/dx.config.d.ts +28 -0
- package/dist/types/dx.config.d.ts.map +1 -0
- package/dist/types/src/TldrawPlugin.d.ts +4 -0
- package/dist/types/src/TldrawPlugin.d.ts.map +1 -0
- package/dist/types/src/capabilities/index.d.ts +4 -0
- package/dist/types/src/capabilities/index.d.ts.map +1 -0
- package/dist/types/src/capabilities/settings.d.ts +5 -0
- package/dist/types/src/capabilities/settings.d.ts.map +1 -0
- package/dist/types/src/capabilities/sketch-variant.d.ts +5 -0
- package/dist/types/src/capabilities/sketch-variant.d.ts.map +1 -0
- package/dist/types/src/components/Canvas/Canvas.d.ts +17 -0
- package/dist/types/src/components/Canvas/Canvas.d.ts.map +1 -0
- package/dist/types/src/components/Canvas/Canvas.stories.d.ts +15 -0
- package/dist/types/src/components/Canvas/Canvas.stories.d.ts.map +1 -0
- package/dist/types/src/components/Canvas/index.d.ts +4 -0
- package/dist/types/src/components/Canvas/index.d.ts.map +1 -0
- package/dist/types/src/components/actions.d.ts +6 -0
- package/dist/types/src/components/actions.d.ts.map +1 -0
- package/dist/types/src/components/custom/CustomGrid.d.ts +12 -0
- package/dist/types/src/components/custom/CustomGrid.d.ts.map +1 -0
- package/dist/types/src/components/custom/CustomMenu.d.ts +4 -0
- package/dist/types/src/components/custom/CustomMenu.d.ts.map +1 -0
- package/dist/types/src/components/custom/CustomStylePanel.d.ts +4 -0
- package/dist/types/src/components/custom/CustomStylePanel.d.ts.map +1 -0
- package/dist/types/src/components/custom/CustomToolbar.d.ts +10 -0
- package/dist/types/src/components/custom/CustomToolbar.d.ts.map +1 -0
- package/dist/types/src/components/custom/DottedGrid.d.ts +4 -0
- package/dist/types/src/components/custom/DottedGrid.d.ts.map +1 -0
- package/dist/types/src/components/custom/MeshGrid.d.ts +4 -0
- package/dist/types/src/components/custom/MeshGrid.d.ts.map +1 -0
- package/dist/types/src/components/custom/index.d.ts +6 -0
- package/dist/types/src/components/custom/index.d.ts.map +1 -0
- package/dist/types/src/components/index.d.ts +2 -0
- package/dist/types/src/components/index.d.ts.map +1 -0
- package/dist/types/src/containers/TldrawArticle/TldrawArticle.d.ts +8 -0
- package/dist/types/src/containers/TldrawArticle/TldrawArticle.d.ts.map +1 -0
- package/dist/types/src/containers/TldrawArticle/index.d.ts +2 -0
- package/dist/types/src/containers/TldrawArticle/index.d.ts.map +1 -0
- package/dist/types/src/containers/TldrawCard/TldrawCard.d.ts +9 -0
- package/dist/types/src/containers/TldrawCard/TldrawCard.d.ts.map +1 -0
- package/dist/types/src/containers/TldrawCard/TldrawCard.stories.d.ts +15 -0
- package/dist/types/src/containers/TldrawCard/TldrawCard.stories.d.ts.map +1 -0
- package/dist/types/src/containers/TldrawCard/index.d.ts +2 -0
- package/dist/types/src/containers/TldrawCard/index.d.ts.map +1 -0
- package/dist/types/src/containers/index.d.ts +4 -0
- package/dist/types/src/containers/index.d.ts.map +1 -0
- package/dist/types/src/hooks/adapter.d.ts +15 -0
- package/dist/types/src/hooks/adapter.d.ts.map +1 -0
- package/dist/types/src/hooks/adapter.test.d.ts +2 -0
- package/dist/types/src/hooks/adapter.test.d.ts.map +1 -0
- package/dist/types/src/hooks/index.d.ts +3 -0
- package/dist/types/src/hooks/index.d.ts.map +1 -0
- package/dist/types/src/hooks/useStoreAdapter.d.ts +11 -0
- package/dist/types/src/hooks/useStoreAdapter.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +4 -0
- package/dist/types/src/index.d.ts.map +1 -0
- package/dist/types/src/meta.d.ts +33 -0
- package/dist/types/src/meta.d.ts.map +1 -0
- package/dist/types/src/migrations/index.d.ts +3 -0
- package/dist/types/src/migrations/index.d.ts.map +1 -0
- package/dist/types/src/migrations/migrate.d.ts +9 -0
- package/dist/types/src/migrations/migrate.d.ts.map +1 -0
- package/dist/types/src/migrations/schema.d.ts +7 -0
- package/dist/types/src/migrations/schema.d.ts.map +1 -0
- package/dist/types/src/model/TldrawBuilder.d.ts +110 -0
- package/dist/types/src/model/TldrawBuilder.d.ts.map +1 -0
- package/dist/types/src/model/TldrawBuilder.test.d.ts +2 -0
- package/dist/types/src/model/TldrawBuilder.test.d.ts.map +1 -0
- package/dist/types/src/model/apply.d.ts +5 -0
- package/dist/types/src/model/apply.d.ts.map +1 -0
- package/dist/types/src/model/builder.d.ts +3 -0
- package/dist/types/src/model/builder.d.ts.map +1 -0
- package/dist/types/src/model/index.d.ts +6 -0
- package/dist/types/src/model/index.d.ts.map +1 -0
- package/dist/types/src/model/read.d.ts +8 -0
- package/dist/types/src/model/read.d.ts.map +1 -0
- package/dist/types/src/model/render.d.ts +27 -0
- package/dist/types/src/model/render.d.ts.map +1 -0
- package/dist/types/src/model/scene.test.d.ts +2 -0
- package/dist/types/src/model/scene.test.d.ts.map +1 -0
- package/dist/types/src/plugin.d.ts +3 -0
- package/dist/types/src/plugin.d.ts.map +1 -0
- package/dist/types/src/testing/data.d.ts +242 -0
- package/dist/types/src/testing/data.d.ts.map +1 -0
- package/dist/types/src/testing/index.d.ts +2 -0
- package/dist/types/src/testing/index.d.ts.map +1 -0
- package/dist/types/src/testing/schema.d.ts +7 -0
- package/dist/types/src/testing/schema.d.ts.map +1 -0
- package/dist/types/src/translations.d.ts +9 -0
- package/dist/types/src/translations.d.ts.map +1 -0
- package/dist/types/src/types/Settings.d.ts +10 -0
- package/dist/types/src/types/Settings.d.ts.map +1 -0
- package/dist/types/src/types/Tldraw.d.ts +25 -0
- package/dist/types/src/types/Tldraw.d.ts.map +1 -0
- package/dist/types/src/types/TldrawCapabilities.d.ts +4 -0
- package/dist/types/src/types/TldrawCapabilities.d.ts.map +1 -0
- package/dist/types/src/types/index.d.ts +4 -0
- package/dist/types/src/types/index.d.ts.map +1 -0
- package/dist/types/src/types/types.d.ts +6 -0
- package/dist/types/src/types/types.d.ts.map +1 -0
- package/dist/types/src/variant.test.d.ts +2 -0
- package/dist/types/src/variant.test.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -0
- package/dx.config.ts +35 -0
- package/package.json +157 -0
- package/src/TldrawPlugin.tsx +31 -0
- package/src/capabilities/index.ts +8 -0
- package/src/capabilities/settings.ts +31 -0
- package/src/capabilities/sketch-variant.ts +29 -0
- package/src/components/Canvas/Canvas.stories.tsx +101 -0
- package/src/components/Canvas/Canvas.tsx +284 -0
- package/src/components/Canvas/index.ts +9 -0
- package/src/components/Canvas/theme.css +23 -0
- package/src/components/actions.ts +42 -0
- package/src/components/custom/CustomGrid.tsx +61 -0
- package/src/components/custom/CustomMenu.tsx +31 -0
- package/src/components/custom/CustomStylePanel.tsx +38 -0
- package/src/components/custom/CustomToolbar.tsx +88 -0
- package/src/components/custom/DottedGrid.tsx +53 -0
- package/src/components/custom/MeshGrid.tsx +47 -0
- package/src/components/custom/index.ts +9 -0
- package/src/components/index.ts +5 -0
- package/src/containers/TldrawArticle/TldrawArticle.tsx +78 -0
- package/src/containers/TldrawArticle/index.ts +5 -0
- package/src/containers/TldrawCard/TldrawCard.stories.tsx +53 -0
- package/src/containers/TldrawCard/TldrawCard.tsx +32 -0
- package/src/containers/TldrawCard/index.ts +5 -0
- package/src/containers/index.ts +8 -0
- package/src/hooks/adapter.test.ts +20 -0
- package/src/hooks/adapter.ts +83 -0
- package/src/hooks/index.ts +6 -0
- package/src/hooks/useStoreAdapter.ts +55 -0
- package/src/index.ts +7 -0
- package/src/meta.ts +9 -0
- package/src/migrations/index.ts +6 -0
- package/src/migrations/migrate.ts +49 -0
- package/src/migrations/schema.ts +98 -0
- package/src/model/TldrawBuilder.test.ts +72 -0
- package/src/model/TldrawBuilder.ts +443 -0
- package/src/model/apply.ts +132 -0
- package/src/model/builder.ts +31 -0
- package/src/model/index.ts +9 -0
- package/src/model/read.ts +203 -0
- package/src/model/render.ts +191 -0
- package/src/model/scene.test.ts +222 -0
- package/src/plugin.ts +9 -0
- package/src/testing/data.ts +238 -0
- package/src/testing/index.ts +5 -0
- package/src/testing/schema.ts +98 -0
- package/src/translations.ts +18 -0
- package/src/types/Settings.ts +32 -0
- package/src/types/Tldraw.ts +38 -0
- package/src/types/TldrawCapabilities.ts +17 -0
- package/src/types/index.ts +8 -0
- package/src/types/types.ts +11 -0
- package/src/typings.d.ts +8 -0
- package/src/variant.test.ts +142 -0
- package/src/vite-env.d.ts +10 -0
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
export const data = {
|
|
6
|
+
v1: {
|
|
7
|
+
'document:document': { gridSize: 10, name: '', meta: {}, id: 'document:document', typeName: 'document' },
|
|
8
|
+
'page:4erp5FF7mts21Njur5UKw': {
|
|
9
|
+
meta: {},
|
|
10
|
+
id: 'page:4erp5FF7mts21Njur5UKw',
|
|
11
|
+
name: 'Page 1',
|
|
12
|
+
index: 'a1',
|
|
13
|
+
typeName: 'page',
|
|
14
|
+
},
|
|
15
|
+
'shape:_-1kyVBGSUAeNrcxiGAbw': {
|
|
16
|
+
x: 0,
|
|
17
|
+
y: 0,
|
|
18
|
+
rotation: 0,
|
|
19
|
+
isLocked: false,
|
|
20
|
+
opacity: 1,
|
|
21
|
+
meta: {},
|
|
22
|
+
id: 'shape:_-1kyVBGSUAeNrcxiGAbw',
|
|
23
|
+
type: 'geo',
|
|
24
|
+
props: {
|
|
25
|
+
w: 160,
|
|
26
|
+
h: 160,
|
|
27
|
+
geo: 'rectangle',
|
|
28
|
+
color: 'black',
|
|
29
|
+
labelColor: 'black',
|
|
30
|
+
fill: 'none',
|
|
31
|
+
dash: 'dotted',
|
|
32
|
+
size: 'l',
|
|
33
|
+
font: 'draw',
|
|
34
|
+
text: 'ECHO',
|
|
35
|
+
align: 'middle',
|
|
36
|
+
verticalAlign: 'middle',
|
|
37
|
+
growY: 0,
|
|
38
|
+
url: '',
|
|
39
|
+
},
|
|
40
|
+
parentId: 'page:4erp5FF7mts21Njur5UKw',
|
|
41
|
+
index: 'a1',
|
|
42
|
+
typeName: 'shape',
|
|
43
|
+
},
|
|
44
|
+
'shape:kXmGpjXqyzlg1savamgn8': {
|
|
45
|
+
x: 320,
|
|
46
|
+
y: 0,
|
|
47
|
+
rotation: 0,
|
|
48
|
+
isLocked: false,
|
|
49
|
+
opacity: 1,
|
|
50
|
+
meta: {},
|
|
51
|
+
id: 'shape:kXmGpjXqyzlg1savamgn8',
|
|
52
|
+
type: 'geo',
|
|
53
|
+
props: {
|
|
54
|
+
w: 160,
|
|
55
|
+
h: 160,
|
|
56
|
+
geo: 'star',
|
|
57
|
+
color: 'yellow',
|
|
58
|
+
labelColor: 'black',
|
|
59
|
+
fill: 'none',
|
|
60
|
+
dash: 'draw',
|
|
61
|
+
size: 'm',
|
|
62
|
+
font: 'draw',
|
|
63
|
+
text: 'DXOS',
|
|
64
|
+
align: 'middle',
|
|
65
|
+
verticalAlign: 'middle',
|
|
66
|
+
growY: 0,
|
|
67
|
+
url: '',
|
|
68
|
+
},
|
|
69
|
+
parentId: 'page:4erp5FF7mts21Njur5UKw',
|
|
70
|
+
index: 'a2',
|
|
71
|
+
typeName: 'shape',
|
|
72
|
+
},
|
|
73
|
+
'shape:eYiyZDA7Iwoi16QjTkJUE': {
|
|
74
|
+
x: 0,
|
|
75
|
+
y: 240,
|
|
76
|
+
rotation: -15 * (Math.PI / 180),
|
|
77
|
+
isLocked: false,
|
|
78
|
+
opacity: 1,
|
|
79
|
+
meta: {},
|
|
80
|
+
id: 'shape:eYiyZDA7Iwoi16QjTkJUE',
|
|
81
|
+
type: 'text',
|
|
82
|
+
props: {
|
|
83
|
+
color: 'light-green',
|
|
84
|
+
size: 'xl',
|
|
85
|
+
w: 320,
|
|
86
|
+
text: 'DXOS!',
|
|
87
|
+
font: 'mono',
|
|
88
|
+
align: 'middle',
|
|
89
|
+
autoSize: true,
|
|
90
|
+
scale: 1,
|
|
91
|
+
},
|
|
92
|
+
parentId: 'page:4erp5FF7mts21Njur5UKw',
|
|
93
|
+
index: 'a4',
|
|
94
|
+
typeName: 'shape',
|
|
95
|
+
},
|
|
96
|
+
|
|
97
|
+
// NOTE: This record will fail to be migrated.
|
|
98
|
+
'shape:F_o1eH6pS_ABcU3-JPadv': {
|
|
99
|
+
x: 0,
|
|
100
|
+
y: 240,
|
|
101
|
+
rotation: -15 * (Math.PI / 180),
|
|
102
|
+
isLocked: false,
|
|
103
|
+
opacity: 1,
|
|
104
|
+
meta: {},
|
|
105
|
+
id: 'shape:F_o1eH6pS_ABcU3-JPadv',
|
|
106
|
+
type: 'arrow',
|
|
107
|
+
parentId: 'page:4erp5FF7mts21Njur5UKw',
|
|
108
|
+
index: 'a3',
|
|
109
|
+
props: {
|
|
110
|
+
dash: 'draw',
|
|
111
|
+
size: 's',
|
|
112
|
+
fill: 'none',
|
|
113
|
+
color: 'blue',
|
|
114
|
+
labelColor: 'black',
|
|
115
|
+
bend: 0,
|
|
116
|
+
start: {
|
|
117
|
+
// Incompatible with v2 migration.
|
|
118
|
+
type: 'binding',
|
|
119
|
+
boundShapeId: 'shape:_-1kyVBGSUAeNrcxiGAbw',
|
|
120
|
+
normalizedAnchor: { x: 0.5, y: 0.5 },
|
|
121
|
+
isExact: false,
|
|
122
|
+
},
|
|
123
|
+
end: {
|
|
124
|
+
// Incompatible with v2 migration.
|
|
125
|
+
type: 'binding',
|
|
126
|
+
boundShapeId: 'shape:kXmGpjXqyzlg1savamgn8',
|
|
127
|
+
normalizedAnchor: { x: 0.5, y: 0.5 },
|
|
128
|
+
isExact: false,
|
|
129
|
+
},
|
|
130
|
+
arrowheadStart: 'none',
|
|
131
|
+
arrowheadEnd: 'arrow',
|
|
132
|
+
text: '',
|
|
133
|
+
font: 'draw',
|
|
134
|
+
},
|
|
135
|
+
typeName: 'shape',
|
|
136
|
+
},
|
|
137
|
+
},
|
|
138
|
+
|
|
139
|
+
v2: {
|
|
140
|
+
'document:document': {
|
|
141
|
+
gridSize: 10,
|
|
142
|
+
name: '',
|
|
143
|
+
meta: {},
|
|
144
|
+
id: 'document:document',
|
|
145
|
+
typeName: 'document',
|
|
146
|
+
},
|
|
147
|
+
'page:1': {
|
|
148
|
+
meta: {},
|
|
149
|
+
id: 'page:4erp5FF7mts21Njur5UKw',
|
|
150
|
+
name: 'Page 1',
|
|
151
|
+
index: 'a1',
|
|
152
|
+
typeName: 'page',
|
|
153
|
+
},
|
|
154
|
+
'shape:_-1kyVBGSUAeNrcxiGAbw': {
|
|
155
|
+
x: 0,
|
|
156
|
+
y: 0,
|
|
157
|
+
rotation: 0,
|
|
158
|
+
isLocked: false,
|
|
159
|
+
opacity: 1,
|
|
160
|
+
meta: {},
|
|
161
|
+
id: 'shape:_-1kyVBGSUAeNrcxiGAbw',
|
|
162
|
+
type: 'geo',
|
|
163
|
+
props: {
|
|
164
|
+
w: 160,
|
|
165
|
+
h: 160,
|
|
166
|
+
geo: 'rectangle',
|
|
167
|
+
color: 'black',
|
|
168
|
+
labelColor: 'black',
|
|
169
|
+
fill: 'none',
|
|
170
|
+
dash: 'dotted',
|
|
171
|
+
size: 'l',
|
|
172
|
+
font: 'draw',
|
|
173
|
+
text: 'ECHO',
|
|
174
|
+
align: 'middle',
|
|
175
|
+
verticalAlign: 'middle',
|
|
176
|
+
growY: 0,
|
|
177
|
+
url: '',
|
|
178
|
+
scale: 1,
|
|
179
|
+
},
|
|
180
|
+
parentId: 'page:4erp5FF7mts21Njur5UKw',
|
|
181
|
+
index: 'a1',
|
|
182
|
+
typeName: 'shape',
|
|
183
|
+
},
|
|
184
|
+
'shape:kXmGpjXqyzlg1savamgn8': {
|
|
185
|
+
x: 320,
|
|
186
|
+
y: 0,
|
|
187
|
+
rotation: 0,
|
|
188
|
+
isLocked: false,
|
|
189
|
+
opacity: 1,
|
|
190
|
+
meta: {},
|
|
191
|
+
id: 'shape:kXmGpjXqyzlg1savamgn8',
|
|
192
|
+
type: 'geo',
|
|
193
|
+
props: {
|
|
194
|
+
w: 160,
|
|
195
|
+
h: 160,
|
|
196
|
+
geo: 'star',
|
|
197
|
+
color: 'yellow',
|
|
198
|
+
labelColor: 'black',
|
|
199
|
+
fill: 'none',
|
|
200
|
+
dash: 'draw',
|
|
201
|
+
size: 'm',
|
|
202
|
+
font: 'draw',
|
|
203
|
+
text: 'DXOS',
|
|
204
|
+
align: 'middle',
|
|
205
|
+
verticalAlign: 'middle',
|
|
206
|
+
growY: 0,
|
|
207
|
+
url: '',
|
|
208
|
+
scale: 1,
|
|
209
|
+
},
|
|
210
|
+
parentId: 'page:4erp5FF7mts21Njur5UKw',
|
|
211
|
+
index: 'a2',
|
|
212
|
+
typeName: 'shape',
|
|
213
|
+
},
|
|
214
|
+
'shape:eYiyZDA7Iwoi16QjTkJUE': {
|
|
215
|
+
x: 0,
|
|
216
|
+
y: 240,
|
|
217
|
+
rotation: -15 * (Math.PI / 180),
|
|
218
|
+
isLocked: false,
|
|
219
|
+
opacity: 1,
|
|
220
|
+
meta: {},
|
|
221
|
+
id: 'shape:eYiyZDA7Iwoi16QjTkJUE',
|
|
222
|
+
type: 'text',
|
|
223
|
+
props: {
|
|
224
|
+
color: 'light-green',
|
|
225
|
+
size: 'xl',
|
|
226
|
+
w: 320,
|
|
227
|
+
text: 'DXOS!',
|
|
228
|
+
font: 'mono',
|
|
229
|
+
autoSize: true,
|
|
230
|
+
scale: 1,
|
|
231
|
+
textAlign: 'middle',
|
|
232
|
+
},
|
|
233
|
+
parentId: 'page:4erp5FF7mts21Njur5UKw',
|
|
234
|
+
index: 'a4',
|
|
235
|
+
typeName: 'shape',
|
|
236
|
+
},
|
|
237
|
+
},
|
|
238
|
+
};
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
export const DEFAULT_VERSION = 1;
|
|
6
|
+
export const CURRENT_VERSION = 2;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* TLDraw schema.
|
|
10
|
+
*/
|
|
11
|
+
export const schema: Record<number, any> = {
|
|
12
|
+
1: {
|
|
13
|
+
schemaVersion: 1,
|
|
14
|
+
storeVersion: 4,
|
|
15
|
+
recordVersions: {
|
|
16
|
+
asset: {
|
|
17
|
+
version: 1,
|
|
18
|
+
subTypeKey: 'type',
|
|
19
|
+
subTypeVersions: {
|
|
20
|
+
image: 2,
|
|
21
|
+
video: 2,
|
|
22
|
+
bookmark: 0,
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
camera: {
|
|
26
|
+
version: 1,
|
|
27
|
+
},
|
|
28
|
+
document: {
|
|
29
|
+
version: 2,
|
|
30
|
+
},
|
|
31
|
+
instance: {
|
|
32
|
+
version: 22,
|
|
33
|
+
},
|
|
34
|
+
instance_page_state: {
|
|
35
|
+
version: 5,
|
|
36
|
+
},
|
|
37
|
+
page: {
|
|
38
|
+
version: 1,
|
|
39
|
+
},
|
|
40
|
+
shape: {
|
|
41
|
+
version: 3,
|
|
42
|
+
subTypeKey: 'type',
|
|
43
|
+
subTypeVersions: {
|
|
44
|
+
group: 0,
|
|
45
|
+
text: 1,
|
|
46
|
+
bookmark: 1,
|
|
47
|
+
draw: 1,
|
|
48
|
+
geo: 7,
|
|
49
|
+
note: 4,
|
|
50
|
+
line: 1,
|
|
51
|
+
frame: 0,
|
|
52
|
+
arrow: 2,
|
|
53
|
+
highlight: 0,
|
|
54
|
+
embed: 4,
|
|
55
|
+
image: 2,
|
|
56
|
+
video: 1,
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
instance_presence: {
|
|
60
|
+
version: 5,
|
|
61
|
+
},
|
|
62
|
+
pointer: {
|
|
63
|
+
version: 1,
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
2: {
|
|
68
|
+
schemaVersion: 2,
|
|
69
|
+
sequences: {
|
|
70
|
+
'com.tldraw.store': 4,
|
|
71
|
+
'com.tldraw.asset': 1,
|
|
72
|
+
'com.tldraw.camera': 1,
|
|
73
|
+
'com.tldraw.document': 2,
|
|
74
|
+
'com.tldraw.instance': 24,
|
|
75
|
+
'com.tldraw.instance_page_state': 5,
|
|
76
|
+
'com.tldraw.page': 1,
|
|
77
|
+
'com.tldraw.instance_presence': 5,
|
|
78
|
+
'com.tldraw.pointer': 1,
|
|
79
|
+
'com.tldraw.shape': 4,
|
|
80
|
+
'com.tldraw.asset.bookmark': 1,
|
|
81
|
+
'com.tldraw.asset.image': 3,
|
|
82
|
+
'com.tldraw.asset.video': 3,
|
|
83
|
+
'com.tldraw.shape.group': 0,
|
|
84
|
+
'com.tldraw.shape.text': 1,
|
|
85
|
+
'com.tldraw.shape.bookmark': 2,
|
|
86
|
+
'com.tldraw.shape.draw': 1,
|
|
87
|
+
'com.tldraw.shape.geo': 8,
|
|
88
|
+
'com.tldraw.shape.note': 6,
|
|
89
|
+
'com.tldraw.shape.line': 4,
|
|
90
|
+
'com.tldraw.shape.frame': 0,
|
|
91
|
+
'com.tldraw.shape.arrow': 3,
|
|
92
|
+
'com.tldraw.shape.highlight': 0,
|
|
93
|
+
'com.tldraw.shape.embed': 4,
|
|
94
|
+
'com.tldraw.shape.image': 3,
|
|
95
|
+
'com.tldraw.shape.video': 2,
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2023 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { type Resource } from '@dxos/react-ui';
|
|
6
|
+
|
|
7
|
+
import { meta } from '#meta';
|
|
8
|
+
|
|
9
|
+
export const translations = [
|
|
10
|
+
{
|
|
11
|
+
'en-US': {
|
|
12
|
+
[meta.profile.key]: {
|
|
13
|
+
'plugin.name': 'tldraw',
|
|
14
|
+
'settings.hover-tools.label': 'Auto hide controls',
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
] as const satisfies Resource[];
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2023 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
// @import-as-namespace
|
|
6
|
+
|
|
7
|
+
import * as Schema from 'effect/Schema';
|
|
8
|
+
|
|
9
|
+
export const GridSchema = Schema.Union(
|
|
10
|
+
Schema.Literal('mesh').annotations({ title: 'Mesh' }),
|
|
11
|
+
Schema.Literal('dotted').annotations({ title: 'Dotted' }),
|
|
12
|
+
);
|
|
13
|
+
export type GridType = Schema.Schema.Type<typeof GridSchema>;
|
|
14
|
+
|
|
15
|
+
export const Settings = Schema.mutable(
|
|
16
|
+
Schema.Struct({
|
|
17
|
+
showGrid: Schema.optional(
|
|
18
|
+
Schema.Boolean.annotations({
|
|
19
|
+
title: 'Show grid',
|
|
20
|
+
description: 'Display a background grid on the sketch canvas.',
|
|
21
|
+
}),
|
|
22
|
+
),
|
|
23
|
+
gridType: Schema.optional(
|
|
24
|
+
GridSchema.annotations({
|
|
25
|
+
title: 'Grid type',
|
|
26
|
+
description: 'Choose between a mesh or dotted background grid.',
|
|
27
|
+
}),
|
|
28
|
+
),
|
|
29
|
+
}),
|
|
30
|
+
);
|
|
31
|
+
|
|
32
|
+
export interface Settings extends Schema.Schema.Type<typeof Settings> {}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
// @import-as-namespace
|
|
6
|
+
|
|
7
|
+
import * as Schema from 'effect/Schema';
|
|
8
|
+
|
|
9
|
+
import { DXN, Obj, Type } from '@dxos/echo';
|
|
10
|
+
import { HiddenAnnotation } from '@dxos/echo/Annotation';
|
|
11
|
+
|
|
12
|
+
export const TLDRAW_SCHEMA = 'tldraw.com/2';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Persisted tldraw canvas: an opaque map of RecordId → TLRecord managed by the store adapter.
|
|
16
|
+
* Referenced by the base `Sketch` (plugin-illustrator) as its renderer-specific canvas.
|
|
17
|
+
* Keeps the pre-variant typename (`org.dxos.type.canvas`) so existing stored sketches load
|
|
18
|
+
* without a data migration.
|
|
19
|
+
*/
|
|
20
|
+
export class Canvas extends Type.makeObject<Canvas>(DXN.make('org.dxos.type.canvas', '0.1.0'))(
|
|
21
|
+
Schema.Struct({
|
|
22
|
+
/** Fully qualified external schema reference. */
|
|
23
|
+
// TODO(wittjosiah): Remove once the schema is fully internalized.
|
|
24
|
+
schema: Schema.String.pipe(Schema.optional),
|
|
25
|
+
content: Schema.Record({ key: Schema.String, value: Schema.Any }),
|
|
26
|
+
}).pipe(HiddenAnnotation.set(true)),
|
|
27
|
+
) {}
|
|
28
|
+
|
|
29
|
+
export type MakeOptions = Partial<Obj.MakeProps<typeof Canvas>>;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Creates an empty {@link Canvas}.
|
|
33
|
+
*/
|
|
34
|
+
export const makeCanvas = ({ schema = TLDRAW_SCHEMA, content = {} }: MakeOptions = {}): Canvas =>
|
|
35
|
+
Obj.make(Canvas, { schema, content });
|
|
36
|
+
|
|
37
|
+
/** Type guard for {@link Canvas} objects. */
|
|
38
|
+
export const isCanvas = (object: unknown): object is Canvas => Obj.instanceOf(Canvas, object);
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
// @import-as-namespace
|
|
6
|
+
|
|
7
|
+
import { type Atom } from '@effect-atom/atom-react';
|
|
8
|
+
|
|
9
|
+
import { Capability } from '@dxos/app-framework';
|
|
10
|
+
|
|
11
|
+
import { meta } from '#meta';
|
|
12
|
+
|
|
13
|
+
// Inline import to avoid `Settings` namespace alias colliding with the
|
|
14
|
+
// `Settings` capability export below.
|
|
15
|
+
export const Settings = Capability.make<Atom.Writable<import('./Settings').Settings>>(
|
|
16
|
+
`${meta.profile.key}.capability.settings`,
|
|
17
|
+
);
|
package/src/typings.d.ts
ADDED
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { Registry } from '@effect-atom/atom-react';
|
|
6
|
+
import { it } from '@effect/vitest';
|
|
7
|
+
import * as Effect from 'effect/Effect';
|
|
8
|
+
import * as Layer from 'effect/Layer';
|
|
9
|
+
import { describe } from 'vitest';
|
|
10
|
+
|
|
11
|
+
import { AssistantTestLayer } from '@dxos/agent-runtime/testing';
|
|
12
|
+
import { Capability, CapabilityManager } from '@dxos/app-framework';
|
|
13
|
+
import { Operation } from '@dxos/compute';
|
|
14
|
+
import { Database, Ref, Type } from '@dxos/echo';
|
|
15
|
+
import { TestHelpers } from '@dxos/effect/testing';
|
|
16
|
+
import { EntityId } from '@dxos/keys';
|
|
17
|
+
import {
|
|
18
|
+
IllustratorCapabilities,
|
|
19
|
+
IllustratorOperationHandlerSet,
|
|
20
|
+
Sketch,
|
|
21
|
+
SketchOperation,
|
|
22
|
+
} from '@dxos/plugin-illustrator';
|
|
23
|
+
|
|
24
|
+
import { tldrawBuilder } from '#model';
|
|
25
|
+
|
|
26
|
+
import { Tldraw } from './types';
|
|
27
|
+
|
|
28
|
+
EntityId.dangerouslyDisableRandomness();
|
|
29
|
+
|
|
30
|
+
const TestLayer = AssistantTestLayer({
|
|
31
|
+
operationHandlers: IllustratorOperationHandlerSet,
|
|
32
|
+
extraServices: Layer.sync(Capability.Service, () => capabilityService()),
|
|
33
|
+
types: [Sketch.Sketch, Tldraw.Canvas],
|
|
34
|
+
disableLlmMemoization: true,
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
/** Capability manager pre-loaded with the tldraw sketch variant, as the plugin would contribute it. */
|
|
38
|
+
const capabilityService = () => {
|
|
39
|
+
const manager = CapabilityManager.make({ registry: Registry.make() });
|
|
40
|
+
manager.contribute({
|
|
41
|
+
interface: IllustratorCapabilities.VariantProvider,
|
|
42
|
+
implementation: {
|
|
43
|
+
id: Type.getTypename(Tldraw.Canvas),
|
|
44
|
+
label: 'tldraw',
|
|
45
|
+
canvasType: Tldraw.Canvas,
|
|
46
|
+
createCanvas: () => Effect.sync(() => Tldraw.makeCanvas()),
|
|
47
|
+
builder: tldrawBuilder,
|
|
48
|
+
},
|
|
49
|
+
module: 'test',
|
|
50
|
+
});
|
|
51
|
+
return manager;
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Deterministic version of the storybook mental-model loop: draw a face, read the scene back,
|
|
56
|
+
* add a hat and edit the smile by id, and confirm the untouched face elements survive.
|
|
57
|
+
* Exercises the illustrator operations end-to-end through the tldraw builder.
|
|
58
|
+
*/
|
|
59
|
+
describe('tldraw sketch variant', () => {
|
|
60
|
+
it.effect(
|
|
61
|
+
'create → edit → read round-trip preserves untouched objects',
|
|
62
|
+
Effect.fnUntraced(
|
|
63
|
+
function* ({ expect }) {
|
|
64
|
+
const { object: sketch } = yield* Operation.invoke(SketchOperation.Create, { name: 'Portrait' });
|
|
65
|
+
yield* Database.add(sketch);
|
|
66
|
+
yield* Database.flush();
|
|
67
|
+
const ref = Ref.make(sketch);
|
|
68
|
+
|
|
69
|
+
// Draw a face.
|
|
70
|
+
const face = yield* Operation.invoke(SketchOperation.Edit, {
|
|
71
|
+
sketch: ref,
|
|
72
|
+
commands: [
|
|
73
|
+
{
|
|
74
|
+
op: 'upsert-object',
|
|
75
|
+
object: {
|
|
76
|
+
id: 'face',
|
|
77
|
+
origin: { x: 100, y: 100 },
|
|
78
|
+
scale: 2,
|
|
79
|
+
elements: [
|
|
80
|
+
{ kind: 'circle', id: 'head', cx: 50, cy: 50, r: 50, color: 'yellow', fill: 'solid' },
|
|
81
|
+
{ kind: 'circle', id: 'left-eye', cx: 30, cy: 35, r: 6, fill: 'solid' },
|
|
82
|
+
{ kind: 'circle', id: 'right-eye', cx: 70, cy: 35, r: 6, fill: 'solid' },
|
|
83
|
+
{ kind: 'arc', id: 'smile', cx: 50, cy: 55, r: 25, startAngle: 30, endAngle: 150 },
|
|
84
|
+
],
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
],
|
|
88
|
+
});
|
|
89
|
+
expect(face.upserted).toEqual(['face']);
|
|
90
|
+
expect(face.scene.objects).toHaveLength(1);
|
|
91
|
+
|
|
92
|
+
// Read the scene (what the agent would do before a follow-up edit).
|
|
93
|
+
const read = yield* Operation.invoke(SketchOperation.Read, { sketch: ref });
|
|
94
|
+
const readFace = read.scene.objects.find((object) => object.id === 'face');
|
|
95
|
+
expect(readFace?.origin).toEqual({ x: 100, y: 100 });
|
|
96
|
+
expect(readFace?.elements.map((element) => element.id)).toEqual(['head', 'left-eye', 'right-eye', 'smile']);
|
|
97
|
+
|
|
98
|
+
// Add a hat above the face and turn the smile into a frown — by id, without resending the face.
|
|
99
|
+
const edit = yield* Operation.invoke(SketchOperation.Edit, {
|
|
100
|
+
sketch: ref,
|
|
101
|
+
commands: [
|
|
102
|
+
{
|
|
103
|
+
op: 'upsert-object',
|
|
104
|
+
object: {
|
|
105
|
+
id: 'hat',
|
|
106
|
+
origin: { x: 120, y: 40 },
|
|
107
|
+
scale: 2,
|
|
108
|
+
elements: [
|
|
109
|
+
{ kind: 'rect', id: 'brim', x: 0, y: 25, w: 80, h: 6, color: 'blue', fill: 'solid' },
|
|
110
|
+
{ kind: 'rect', id: 'crown', x: 20, y: 0, w: 40, h: 25, color: 'blue', fill: 'solid' },
|
|
111
|
+
],
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
op: 'upsert-elements',
|
|
116
|
+
objectId: 'face',
|
|
117
|
+
elements: [{ kind: 'arc', id: 'smile', cx: 50, cy: 70, r: 20, startAngle: 210, endAngle: 330 }],
|
|
118
|
+
},
|
|
119
|
+
],
|
|
120
|
+
});
|
|
121
|
+
expect([...edit.upserted].sort()).toEqual(['face', 'hat']);
|
|
122
|
+
expect(edit.scene.objects.map((object) => object.id).sort()).toEqual(['face', 'hat']);
|
|
123
|
+
|
|
124
|
+
// The face's untouched elements survived the follow-up edit.
|
|
125
|
+
const after = edit.scene.objects.find((object) => object.id === 'face');
|
|
126
|
+
expect(after?.elements.find((element) => element.id === 'head')).toEqual(
|
|
127
|
+
readFace?.elements.find((element) => element.id === 'head'),
|
|
128
|
+
);
|
|
129
|
+
|
|
130
|
+
// Remove the hat again.
|
|
131
|
+
const removed = yield* Operation.invoke(SketchOperation.Edit, {
|
|
132
|
+
sketch: ref,
|
|
133
|
+
commands: [{ op: 'remove-object', objectId: 'hat' }],
|
|
134
|
+
});
|
|
135
|
+
expect(removed.scene.objects.map((object) => object.id)).toEqual(['face']);
|
|
136
|
+
expect(removed.removed).toBe(2);
|
|
137
|
+
},
|
|
138
|
+
Effect.provide(TestLayer),
|
|
139
|
+
TestHelpers.provideTestContext,
|
|
140
|
+
),
|
|
141
|
+
);
|
|
142
|
+
});
|