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