From bcc478b5f7def6e625d8b9794a3675df883dfa39 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Mon, 29 Dec 2025 15:39:32 +0800 Subject: [PATCH] refactor: separate og and db version (#12276) separate og and new version apps remove file sync, tldraw, excalidraw and zotero --- .carve/ignore | 16 +- .../test/logseq/e2e/plugins_basic_test.clj | 3 +- deps/cli/src/logseq/cli/common/graph.cljs | 7 +- deps/common/resources/templates/config.edn | 18 - deps/common/src/logseq/common/config.cljs | 2 +- deps/common/src/logseq/common/graph.cljs | 2 +- deps/db/src/logseq/db/common/view.cljs | 20 +- deps/outliner/src/logseq/outliner/core.cljs | 166 +- deps/outliner/src/logseq/outliner/op.cljs | 25 +- deps/outliner/src/logseq/outliner/page.cljs | 6 +- deps/outliner/src/logseq/outliner/tree.cljs | 2 +- .../test/logseq/outliner/core_test.cljs | 4 +- .../src/logseq/publishing/export.cljs | 2 +- gulpfile.js | 4 - ios/App/App/FsWatcher.swift | 2 +- libs/src/LSPlugin.ts | 2 - package.json | 7 +- packages/tldraw/.editorconfig | 19 - packages/tldraw/.eslintignore | 3 - packages/tldraw/.eslintrc | 19 - packages/tldraw/.gitattributes | 2 - packages/tldraw/.gitignore | 17 - packages/tldraw/.npmignore | 17 - packages/tldraw/.prettierrc | 11 - packages/tldraw/LICENSE.md | 21 - packages/tldraw/README.md | 29 - packages/tldraw/apps/tldraw-logseq/README.md | 3 - packages/tldraw/apps/tldraw-logseq/build.mjs | 29 - .../tldraw/apps/tldraw-logseq/package.json | 42 - .../apps/tldraw-logseq/postcss.config.js | 3 - .../tldraw/apps/tldraw-logseq/src/app.tsx | 148 - .../src/components/ActionBar/ActionBar.tsx | 113 - .../src/components/ActionBar/index.ts | 1 - .../tldraw-logseq/src/components/AppUI.tsx | 20 - .../src/components/BlockLink/BlockLink.tsx | 71 - .../src/components/BlockLink/index.ts | 1 - .../src/components/Button/Button.tsx | 15 - .../src/components/Button/CircleButton.tsx | 26 - .../src/components/Button/index.ts | 2 - .../src/components/ContextBar/ContextBar.tsx | 67 - .../ContextBar/contextBarActionFactory.tsx | 560 --- .../src/components/ContextBar/index.ts | 2 - .../components/ContextMenu/ContextMenu.tsx | 369 -- .../src/components/ContextMenu/index.ts | 1 - .../src/components/Devtools/Devtools.tsx | 56 - .../src/components/Devtools/index.ts | 1 - .../GeometryTools/GeometryTools.tsx | 93 - .../src/components/GeometryTools/index.ts | 1 - .../KeyboardShortcut/KeyboardShortcut.tsx | 16 - .../src/components/KeyboardShortcut/index.ts | 1 - .../src/components/Minimap/Minimap.tsx | 55 - .../src/components/Minimap/index.ts | 1 - .../PopoverButton/PopoverButton.tsx | 39 - .../src/components/PopoverButton/index.ts | 1 - .../components/PrimaryTools/PrimaryTools.tsx | 103 - .../src/components/PrimaryTools/index.ts | 1 - .../src/components/QuickLinks/QuickLinks.tsx | 44 - .../src/components/QuickLinks/index.ts | 1 - .../components/QuickSearch/QuickSearch.tsx | 437 -- .../src/components/QuickSearch/index.ts | 1 - .../src/components/StatusBar/StatusBar.tsx | 16 - .../src/components/StatusBar/index.ts | 1 - .../src/components/ToolButton/ToolButton.tsx | 50 - .../src/components/ToolButton/index.ts | 1 - .../src/components/Tooltip/Tooltip.tsx | 31 - .../src/components/Tooltip/index.ts | 1 - .../src/components/ZoomMenu/ZoomMenu.tsx | 65 - .../src/components/ZoomMenu/index.ts | 1 - .../src/components/icons/TablerIcon.tsx | 35 - .../src/components/icons/index.ts | 1 - .../src/components/inputs/ColorInput.tsx | 122 - .../src/components/inputs/NumberInput.tsx | 12 - .../src/components/inputs/ScaleInput.tsx | 59 - .../src/components/inputs/SelectInput.tsx | 75 - .../src/components/inputs/ShapeLinksInput.tsx | 162 - .../src/components/inputs/TextInput.tsx | 18 - .../components/inputs/ToggleGroupInput.tsx | 76 - .../src/components/inputs/ToggleInput.tsx | 34 - .../src/hooks/useCameraMoving.ts | 6 - .../apps/tldraw-logseq/src/hooks/useCopy.ts | 11 - .../apps/tldraw-logseq/src/hooks/useDrop.ts | 14 - .../apps/tldraw-logseq/src/hooks/usePaste.ts | 515 --- .../tldraw-logseq/src/hooks/useQuickAdd.ts | 12 - .../tldraw/apps/tldraw-logseq/src/index.ts | 18 - .../apps/tldraw-logseq/src/lib/index.ts | 3 - .../tldraw-logseq/src/lib/logseq-context.ts | 70 - .../tldraw-logseq/src/lib/preview-manager.tsx | 148 - .../src/lib/shapes/BindingIndicator.tsx | 32 - .../tldraw-logseq/src/lib/shapes/BoxShape.tsx | 195 - .../tldraw-logseq/src/lib/shapes/DotShape.tsx | 62 - .../src/lib/shapes/EllipseShape.tsx | 223 - .../src/lib/shapes/GroupShape.tsx | 65 - .../src/lib/shapes/HTMLShape.tsx | 159 - .../src/lib/shapes/HighlighterShape.tsx | 116 - .../src/lib/shapes/IFrameShape.tsx | 100 - .../src/lib/shapes/ImageShape.tsx | 119 - .../src/lib/shapes/LineShape.tsx | 252 -- .../src/lib/shapes/LogseqPortalShape.tsx | 605 --- .../tldraw-logseq/src/lib/shapes/PdfShape.tsx | 83 - .../tldraw-logseq/src/lib/shapes/PenShape.tsx | 77 - .../src/lib/shapes/PencilShape.tsx | 163 - .../src/lib/shapes/PolygonShape.tsx | 218 - .../src/lib/shapes/TextShape.tsx | 334 -- .../src/lib/shapes/TweetShape.tsx | 227 - .../src/lib/shapes/VideoShape.tsx | 105 - .../src/lib/shapes/YouTubeShape.tsx | 182 - .../src/lib/shapes/arrow/Arrow.tsx | 87 - .../src/lib/shapes/arrow/ArrowHead.tsx | 24 - .../src/lib/shapes/arrow/arrowHelpers.ts | 59 - .../src/lib/shapes/arrow/constants.ts | 49 - .../tldraw-logseq/src/lib/shapes/index.ts | 76 - .../src/lib/shapes/style-props.tsx | 31 - .../src/lib/shapes/text/LabelMask.tsx | 34 - .../src/lib/shapes/text/TextAreaUtils.ts | 183 - .../src/lib/shapes/text/TextLabel.tsx | 195 - .../src/lib/shapes/text/constants.ts | 1 - .../tldraw-logseq/src/lib/tools/BoxTool.tsx | 9 - .../tldraw-logseq/src/lib/tools/DotTool.tsx | 8 - .../src/lib/tools/EllipseTool.tsx | 9 - .../tldraw-logseq/src/lib/tools/EraseTool.tsx | 8 - .../tldraw-logseq/src/lib/tools/HTMLTool.tsx | 10 - .../src/lib/tools/HighlighterTool.tsx | 11 - .../src/lib/tools/IFrameTool.tsx | 10 - .../tldraw-logseq/src/lib/tools/LineTool.tsx | 10 - .../LogseqPortalTool/LogseqPortalTool.tsx | 21 - .../src/lib/tools/LogseqPortalTool/index.ts | 1 - .../LogseqPortalTool/states/CreatingState.tsx | 78 - .../LogseqPortalTool/states/IdleState.tsx | 18 - .../tools/LogseqPortalTool/states/index.ts | 2 - .../src/lib/tools/PencilTool.tsx | 10 - .../src/lib/tools/PolygonTool.tsx | 8 - .../tldraw-logseq/src/lib/tools/TextTool.tsx | 9 - .../src/lib/tools/YouTubeTool.tsx | 10 - .../apps/tldraw-logseq/src/lib/tools/index.ts | 13 - .../tldraw/apps/tldraw-logseq/src/styles.css | 1178 ------ .../tldraw/apps/tldraw-logseq/tsconfig.json | 19 - .../tldraw/apps/tldraw-logseq/tsup.config.ts | 15 - packages/tldraw/package.json | 44 - packages/tldraw/packages/core/CHANGELOG.md | 91 - packages/tldraw/packages/core/LICENSE.md | 21 - packages/tldraw/packages/core/README.md | 27 - packages/tldraw/packages/core/card-repo.png | Bin 64086 -> 0 bytes packages/tldraw/packages/core/package.json | 63 - .../tldraw/packages/core/scripts/build.js | 71 - packages/tldraw/packages/core/scripts/dev.js | 33 - .../tldraw/packages/core/src/constants.ts | 53 - packages/tldraw/packages/core/src/index.ts | 4 - .../packages/core/src/lib/TLApi/TLApi.ts | 513 --- .../packages/core/src/lib/TLApi/index.ts | 1 - .../packages/core/src/lib/TLApp/TLApp.ts | 1012 ----- .../packages/core/src/lib/TLApp/index.ts | 1 - .../core/src/lib/TLBaseLineBindingState.ts | 235 -- .../tldraw/packages/core/src/lib/TLBush.ts | 6 - .../tldraw/packages/core/src/lib/TLCursors.ts | 26 - .../tldraw/packages/core/src/lib/TLHistory.ts | 135 - .../tldraw/packages/core/src/lib/TLInputs.ts | 125 - .../packages/core/src/lib/TLPage/TLPage.ts | 519 --- .../packages/core/src/lib/TLPage/index.ts | 1 - .../packages/core/src/lib/TLSettings.ts | 28 - .../tldraw/packages/core/src/lib/TLState.ts | 445 -- .../tldraw/packages/core/src/lib/TLTool.tsx | 46 - .../packages/core/src/lib/TLToolState.ts | 32 - .../packages/core/src/lib/TLViewport.ts | 210 - .../tldraw/packages/core/src/lib/index.ts | 14 - .../lib/shapes/TLBoxShape/TLBoxShape.test.ts | 25 - .../src/lib/shapes/TLBoxShape/TLBoxShape.tsx | 75 - .../core/src/lib/shapes/TLBoxShape/index.ts | 1 - .../src/lib/shapes/TLDotShape/TLDotShape.tsx | 68 - .../core/src/lib/shapes/TLDotShape/index.ts | 1 - .../shapes/TLDrawShape/TLDrawShape.test.ts | 29 - .../lib/shapes/TLDrawShape/TLDrawShape.tsx | 162 - .../core/src/lib/shapes/TLDrawShape/index.ts | 1 - .../shapes/TLEllipseShape/TLEllipseShape.ts | 82 - .../src/lib/shapes/TLEllipseShape/index.ts | 1 - .../lib/shapes/TLGroupShape/TLGroupShape.tsx | 62 - .../core/src/lib/shapes/TLGroupShape/index.ts | 1 - .../lib/shapes/TLImageShape/TLImageShape.ts | 116 - .../core/src/lib/shapes/TLImageShape/index.ts | 1 - .../lib/shapes/TLLineShape/TLLineShape.tsx | 88 - .../core/src/lib/shapes/TLLineShape/index.ts | 1 - .../shapes/TLPolygonShape/TLPolygonShape.tsx | 131 - .../src/lib/shapes/TLPolygonShape/index.ts | 1 - .../TLPolylineShape/TLPolylineShape.tsx | 153 - .../src/lib/shapes/TLPolylineShape/index.ts | 1 - .../core/src/lib/shapes/TLShape/TLShape.tsx | 389 -- .../core/src/lib/shapes/TLShape/index.ts | 1 - .../lib/shapes/TLStarShape/TLStarShape.tsx | 52 - .../core/src/lib/shapes/TLStarShape/index.ts | 1 - .../lib/shapes/TLTextShape/TLTextShape.tsx | 32 - .../core/src/lib/shapes/TLTextShape/index.ts | 1 - .../packages/core/src/lib/shapes/index.ts | 12 - .../core/src/lib/tools/TLBoxTool/TLBoxTool.ts | 27 - .../core/src/lib/tools/TLBoxTool/index.ts | 1 - .../tools/TLBoxTool/states/CreatingState.tsx | 114 - .../lib/tools/TLBoxTool/states/IdleState.tsx | 34 - .../tools/TLBoxTool/states/PointingState.tsx | 28 - .../src/lib/tools/TLBoxTool/states/index.ts | 3 - .../core/src/lib/tools/TLDotTool/TLDotTool.ts | 26 - .../core/src/lib/tools/TLDotTool/index.ts | 1 - .../tools/TLDotTool/states/CreatingState.tsx | 64 - .../lib/tools/TLDotTool/states/IdleState.tsx | 34 - .../src/lib/tools/TLDotTool/states/index.ts | 2 - .../src/lib/tools/TLDrawTool/TLDrawTool.tsx | 37 - .../core/src/lib/tools/TLDrawTool/index.ts | 1 - .../tools/TLDrawTool/states/CreatingState.tsx | 121 - .../lib/tools/TLDrawTool/states/IdleState.tsx | 33 - .../tools/TLDrawTool/states/PinchingState.ts | 41 - .../src/lib/tools/TLDrawTool/states/index.ts | 3 - .../src/lib/tools/TLEraseTool/TLEraseTool.tsx | 19 - .../core/src/lib/tools/TLEraseTool/index.ts | 1 - .../tools/TLEraseTool/states/ErasingState.tsx | 51 - .../tools/TLEraseTool/states/IdleState.tsx | 33 - .../TLEraseTool/states/PointingState.tsx | 39 - .../src/lib/tools/TLEraseTool/states/index.ts | 3 - .../src/lib/tools/TLLineTool/TLLineTool.ts | 29 - .../core/src/lib/tools/TLLineTool/index.ts | 1 - .../tools/TLLineTool/states/CreatingState.tsx | 55 - .../lib/tools/TLLineTool/states/IdleState.tsx | 61 - .../tools/TLLineTool/states/PointingState.tsx | 24 - .../src/lib/tools/TLLineTool/states/index.ts | 3 - .../src/lib/tools/TLMoveTool/TLMoveTool.ts | 39 - .../core/src/lib/tools/TLMoveTool/index.ts | 1 - .../tools/TLMoveTool/states/IdleHoldState.tsx | 23 - .../lib/tools/TLMoveTool/states/IdleState.tsx | 29 - .../tools/TLMoveTool/states/PanningState.tsx | 37 - .../tools/TLMoveTool/states/PinchingState.ts | 40 - .../src/lib/tools/TLMoveTool/states/index.ts | 4 - .../lib/tools/TLSelectTool/TLSelectTool.tsx | 66 - .../core/src/lib/tools/TLSelectTool/index.ts | 1 - .../TLSelectTool/states/BrushingState.ts | 90 - .../TLSelectTool/states/ContextMenuState.ts | 36 - .../TLSelectTool/states/EditingShapeState.ts | 84 - .../states/HoveringSelectionHandleState.ts | 104 - .../tools/TLSelectTool/states/IdleState.ts | 171 - .../TLSelectTool/states/PinchingState.ts | 35 - .../states/PointingBoundsBackgroundState.ts | 33 - .../states/PointingCanvasState.ts | 46 - .../states/PointingHandleState.ts | 38 - .../states/PointingMinimapState.ts | 82 - .../states/PointingResizeHandleState.ts | 49 - .../states/PointingRotateHandleState.ts | 54 - .../states/PointingSelectedShapeState.ts | 71 - .../states/PointingShapeBehindBoundsState.ts | 46 - .../TLSelectTool/states/PointingShapeState.ts | 43 - .../TLSelectTool/states/ResizingState.ts | 289 -- .../TLSelectTool/states/RotatingState.ts | 156 - .../states/TranslatingHandleState.ts | 37 - .../TLSelectTool/states/TranslatingState.ts | 206 - .../lib/tools/TLSelectTool/states/index.ts | 19 - .../src/lib/tools/TLTextTool/TLTextTool.ts | 27 - .../core/src/lib/tools/TLTextTool/index.ts | 1 - .../tools/TLTextTool/states/CreatingState.tsx | 60 - .../lib/tools/TLTextTool/states/IdleState.tsx | 34 - .../src/lib/tools/TLTextTool/states/index.ts | 2 - .../packages/core/src/lib/tools/index.ts | 8 - .../packages/core/src/types/TLBaseEventMap.ts | 7 - .../packages/core/src/types/TLCursor.ts | 23 - .../core/src/types/TLEventHandlers.ts | 22 - .../packages/core/src/types/TLEventMap.ts | 22 - .../packages/core/src/types/TLEvents.ts | 17 - .../packages/core/src/types/TLHandle.ts | 6 - .../packages/core/src/types/TLShortcut.ts | 12 - .../core/src/types/TLStateEventHandlers.ts | 12 - .../tldraw/packages/core/src/types/index.ts | 9 - .../tldraw/packages/core/src/types/types.ts | 320 -- .../packages/core/src/utils/BindingUtils.ts | 85 - .../packages/core/src/utils/BoundsUtils.ts | 1032 ----- .../packages/core/src/utils/ColorUtils.ts | 13 - .../packages/core/src/utils/DataUtils.ts | 141 - .../packages/core/src/utils/GeomUtils.ts | 223 - .../packages/core/src/utils/PointUtils.ts | 212 - .../packages/core/src/utils/PolygonUtils.ts | 115 - .../packages/core/src/utils/SvgPathUtils.ts | 111 - .../packages/core/src/utils/TextUtils.ts | 189 - .../tldraw/packages/core/src/utils/cache.ts | 30 - .../packages/core/src/utils/getTextSize.ts | 108 - .../tldraw/packages/core/src/utils/index.ts | 113 - .../tldraw/packages/core/tsconfig.build.json | 21 - packages/tldraw/packages/core/tsconfig.json | 10 - packages/tldraw/packages/react/CHANGELOG.md | 91 - packages/tldraw/packages/react/LICENSE.md | 21 - packages/tldraw/packages/react/README.md | 27 - packages/tldraw/packages/react/card-repo.png | Bin 64086 -> 0 bytes packages/tldraw/packages/react/package.json | 63 - .../tldraw/packages/react/scripts/build.js | 71 - packages/tldraw/packages/react/scripts/dev.js | 33 - .../packages/react/src/components/App.tsx | 50 - .../react/src/components/AppCanvas.tsx | 45 - .../react/src/components/AppProvider.tsx | 15 - .../BacklinksCountContainer.tsx | 59 - .../BacklinksCountContainer/index.ts | 1 - .../react/src/components/Canvas/Canvas.tsx | 272 -- .../react/src/components/Canvas/index.ts | 1 - .../src/components/Container/Container.tsx | 57 - .../react/src/components/Container/index.ts | 1 - .../ContextBarContainer.tsx | 67 - .../components/ContextBarContainer/index.ts | 1 - .../HTMLContainer/HTMLContainer.tsx | 29 - .../src/components/HTMLContainer/index.ts | 1 - .../src/components/HTMLLayer/HTMLLayer.tsx | 28 - .../react/src/components/HTMLLayer/index.ts | 1 - .../src/components/Indicator/Indicator.tsx | 61 - .../react/src/components/Indicator/index.ts | 1 - .../QuickLinksContainer.tsx | 64 - .../components/QuickLinksContainer/index.ts | 1 - .../src/components/Renderer/Renderer.tsx | 28 - .../components/Renderer/RendererContext.tsx | 123 - .../react/src/components/Renderer/index.ts | 1 - .../components/SVGContainer/SVGContainer.tsx | 23 - .../src/components/SVGContainer/index.ts | 1 - .../src/components/SVGLayer/SVGLayer.tsx | 35 - .../react/src/components/SVGLayer/index.ts | 1 - .../SelectionDetailContainer.tsx | 53 - .../SelectionDetailContainer/index.ts | 1 - .../react/src/components/Shape/Shape.tsx | 68 - .../react/src/components/Shape/index.ts | 1 - .../packages/react/src/components/index.ts | 17 - .../react/src/components/ui/Brush/Brush.tsx | 14 - .../react/src/components/ui/Brush/index.ts | 1 - .../react/src/components/ui/Cursor/Cursor.tsx | 5 - .../react/src/components/ui/Cursor/index.ts | 1 - .../DirectionIndicator/DirectionIndicator.tsx | 43 - .../components/ui/DirectionIndicator/index.ts | 1 - .../react/src/components/ui/Grid/Grid.tsx | 67 - .../react/src/components/ui/Grid/index.ts | 1 - .../react/src/components/ui/Handle/Handle.tsx | 21 - .../react/src/components/ui/Handle/index.ts | 1 - .../SelectionBackground.tsx | 24 - .../ui/SelectionBackground/index.ts | 1 - .../ui/SelectionDetail/SelectionDetail.tsx | 46 - .../components/ui/SelectionDetail/index.ts | 1 - .../SelectionForeground.tsx | 174 - .../handles/CloneHandle.tsx | 45 - .../handles/CornerHandle.tsx | 53 - .../handles/EdgeHandle.tsx | 48 - .../handles/RotateCornerHandle.tsx | 36 - .../handles/RotateHandle.tsx | 41 - .../ui/SelectionForeground/handles/index.ts | 4 - .../ui/SelectionForeground/index.ts | 1 - .../packages/react/src/components/ui/index.ts | 8 - .../tldraw/packages/react/src/constants.ts | 31 - .../tldraw/packages/react/src/hooks/index.ts | 19 - .../tldraw/packages/react/src/hooks/useApp.ts | 21 - .../packages/react/src/hooks/useAppSetup.ts | 20 - .../react/src/hooks/useBoundsEvents.ts | 111 - .../react/src/hooks/useCanvasEvents.ts | 111 - .../src/hooks/useCounterScaledPosition.tsx | 29 - .../packages/react/src/hooks/useCursor.ts | 51 - .../packages/react/src/hooks/useDebounced.ts | 18 - .../react/src/hooks/useGestureEvents.ts | 159 - .../react/src/hooks/useHandleEvents.ts | 71 - .../react/src/hooks/useKeyboardEvents.ts | 61 - .../react/src/hooks/useMinimapEvents.ts | 49 - .../react/src/hooks/usePreventNavigation.ts | 76 - .../react/src/hooks/usePropControl.ts | 13 - .../react/src/hooks/useRendererContext.ts | 21 - .../react/src/hooks/useResizeObserver.ts | 90 - .../react/src/hooks/useRestoreCamera.ts | 42 - .../packages/react/src/hooks/useSetup.ts | 56 - .../react/src/hooks/useShapeEvents.ts | 107 - .../packages/react/src/hooks/useStylesheet.ts | 488 --- .../packages/react/src/hooks/useZoom.ts | 23 - packages/tldraw/packages/react/src/index.ts | 33 - .../packages/react/src/lib/TLReactApp.ts | 5 - .../packages/react/src/lib/TLReactShape.tsx | 41 - .../tldraw/packages/react/src/lib/index.ts | 3 - .../tldraw/packages/react/src/lib/shapes.ts | 69 - .../react/src/types/TLReactCustomEvents.ts | 7 - .../react/src/types/TLReactEventHandlers.ts | 19 - .../react/src/types/TLReactEventMap.ts | 11 - .../packages/react/src/types/TLReactEvents.ts | 5 - .../react/src/types/TLReactStateEvents.ts | 11 - .../react/src/types/TLReactSubscriptions.tsx | 43 - .../src/types/TLReactToolConstructor.tsx | 12 - .../react/src/types/component-props.ts | 113 - .../tldraw/packages/react/src/types/index.ts | 8 - .../tldraw/packages/react/tsconfig.build.json | 21 - packages/tldraw/packages/react/tsconfig.json | 14 - .../tldraw/packages/utils/curve/CHANGELOG.md | 5 - .../tldraw/packages/utils/curve/LICENSE.md | 21 - .../tldraw/packages/utils/curve/README.md | 1 - .../tldraw/packages/utils/curve/package.json | 33 - .../packages/utils/curve/scripts/build.js | 63 - .../packages/utils/curve/scripts/dev.js | 31 - .../tldraw/packages/utils/curve/src/index.ts | 345 -- .../packages/utils/curve/tsconfig.build.json | 20 - .../tldraw/packages/utils/curve/tsconfig.json | 8 - .../packages/utils/intersect/CHANGELOG.md | 5 - .../packages/utils/intersect/LICENSE.md | 21 - .../tldraw/packages/utils/intersect/README.md | 1 - .../packages/utils/intersect/package.json | 35 - .../packages/utils/intersect/scripts/build.js | 65 - .../packages/utils/intersect/scripts/dev.js | 31 - .../packages/utils/intersect/src/index.ts | 1352 ------ .../utils/intersect/tsconfig.build.json | 21 - .../packages/utils/intersect/tsconfig.json | 8 - .../tldraw/packages/utils/vec/CHANGELOG.md | 5 - packages/tldraw/packages/utils/vec/LICENSE.md | 21 - packages/tldraw/packages/utils/vec/README.md | 1 - .../tldraw/packages/utils/vec/package.json | 31 - .../packages/utils/vec/scripts/build.js | 63 - .../tldraw/packages/utils/vec/scripts/dev.js | 31 - .../tldraw/packages/utils/vec/src/index.ts | 574 --- .../packages/utils/vec/tsconfig.build.json | 20 - .../tldraw/packages/utils/vec/tsconfig.json | 8 - packages/tldraw/tsconfig.base.json | 35 - packages/tldraw/tsconfig.json | 4 - packages/tldraw/yarn.lock | 3749 ----------------- public/index.html | 2 - resources/index.html | 5 - resources/package.json | 5 +- resources/whiteboard/onboarding.edn | 2338 ---------- .../logseq/tasks/dev/db_and_file_graphs.clj | 5 - scripts/src/logseq/tasks/lang.clj | 17 +- shadow-cljs.edn | 14 +- src/bench/frontend/benchmark_test_runner.cljs | 28 - src/electron/electron/core.cljs | 11 +- src/electron/electron/file_sync_rsapi.cljs | 74 - src/electron/electron/fs_watcher.cljs | 166 - src/electron/electron/git.cljs | 218 - src/electron/electron/handler.cljs | 149 +- src/electron/electron/state.cljs | 28 - src/electron/electron/utils.cljs | 38 +- src/electron/electron/window.cljs | 8 +- src/main/electron/listener.cljs | 31 +- src/main/frontend/commands.cljs | 366 +- src/main/frontend/common/async_util.cljc | 80 +- src/main/frontend/common/file/util.cljs | 17 - src/main/frontend/common/file_based/db.cljs | 37 - src/main/frontend/common/graph_view.cljs | 12 +- src/main/frontend/components/all_pages.cljs | 9 - src/main/frontend/components/block.cljs | 919 +--- .../frontend/components/block/macros.cljs | 38 +- src/main/frontend/components/cmdk/core.cljs | 15 +- src/main/frontend/components/container.cljs | 76 +- src/main/frontend/components/content.cljs | 512 +-- src/main/frontend/components/datepicker.cljs | 45 + src/main/frontend/components/datepicker.css | 9 - src/main/frontend/components/diff.cljs | 93 - src/main/frontend/components/diff.css | 23 - src/main/frontend/components/editor.cljs | 129 +- src/main/frontend/components/encryption.cljs | 241 -- src/main/frontend/components/export.cljs | 116 +- src/main/frontend/components/file.cljs | 20 +- .../frontend/components/file_based/block.cljs | 152 - .../components/file_based/datetime.cljs | 182 - .../frontend/components/file_based/git.cljs | 82 - .../components/file_based/hierarchy.cljs | 66 - .../frontend/components/file_based/query.cljs | 80 - .../components/file_based/query_table.cljs | 263 -- src/main/frontend/components/file_sync.cljs | 858 ---- src/main/frontend/components/header.cljs | 37 +- src/main/frontend/components/icon.cljs | 11 +- src/main/frontend/components/imports.cljs | 82 +- .../frontend/components/left_sidebar.cljs | 56 +- .../frontend/components/onboarding/index.css | 1 + .../components/onboarding/quick_tour.cljs | 285 -- src/main/frontend/components/page.cljs | 311 +- src/main/frontend/components/page_menu.cljs | 65 +- src/main/frontend/components/property.cljs | 5 +- .../frontend/components/property/config.cljs | 9 +- .../frontend/components/property/value.cljs | 20 +- src/main/frontend/components/query.cljs | 52 +- .../frontend/components/query/builder.cljs | 212 +- src/main/frontend/components/reference.cljs | 6 +- .../components/reference_filters.cljs | 18 +- src/main/frontend/components/repo.cljs | 157 +- src/main/frontend/components/select.cljs | 2 +- src/main/frontend/components/selection.cljs | 65 +- src/main/frontend/components/settings.cljs | 297 +- src/main/frontend/components/svg.cljs | 36 +- src/main/frontend/components/theme.cljs | 20 +- src/main/frontend/components/theme.css | 16 - src/main/frontend/components/views.cljs | 134 +- src/main/frontend/components/whiteboard.cljs | 245 -- src/main/frontend/components/whiteboard.css | 270 -- src/main/frontend/config.cljs | 149 +- src/main/frontend/core.cljs | 8 +- src/main/frontend/date.cljs | 43 - src/main/frontend/db.cljs | 8 - src/main/frontend/db/async.cljs | 129 +- src/main/frontend/db/conn.cljs | 3 - src/main/frontend/db/file_based/async.cljs | 58 - src/main/frontend/db/file_based/model.cljs | 221 - src/main/frontend/db/model.cljs | 126 +- src/main/frontend/db/persist.cljs | 26 +- src/main/frontend/db/query_custom.cljs | 42 +- src/main/frontend/db/query_dsl.cljs | 7 +- src/main/frontend/db/query_react.cljs | 1 + src/main/frontend/db/transact.cljs | 6 +- src/main/frontend/db/utils.cljs | 4 +- src/main/frontend/diff.cljs | 14 +- src/main/frontend/encrypt.cljs | 20 - src/main/frontend/extensions/excalidraw.cljs | 169 - src/main/frontend/extensions/fsrs.cljs | 70 +- src/main/frontend/extensions/pdf/assets.cljs | 194 +- src/main/frontend/extensions/pdf/core.cljs | 77 +- src/main/frontend/extensions/pdf/toolbar.cljs | 18 +- src/main/frontend/extensions/srs.cljs | 798 ---- src/main/frontend/extensions/srs.css | 24 - src/main/frontend/extensions/tldraw.cljs | 269 -- src/main/frontend/extensions/zotero.cljs | 502 +-- src/main/frontend/extensions/zotero.css | 70 - src/main/frontend/extensions/zotero/api.cljs | 156 - .../frontend/extensions/zotero/extractor.cljs | 181 - .../frontend/extensions/zotero/handler.cljs | 110 - .../frontend/extensions/zotero/schema.cljs | 15 - .../frontend/extensions/zotero/setting.cljs | 75 - src/main/frontend/external.cljs | 18 - src/main/frontend/external/protocol.cljc | 9 - src/main/frontend/external/roam.cljs | 145 - src/main/frontend/external/roam_export.cljs | 86 - src/main/frontend/format/block.cljs | 26 +- src/main/frontend/format/mldoc.cljs | 32 - src/main/frontend/fs.cljs | 99 +- src/main/frontend/fs/diff_merge.cljs | 194 - src/main/frontend/fs/node.cljs | 17 +- src/main/frontend/fs/sync.cljs | 3322 --------------- src/main/frontend/fs/watcher_handler.cljs | 206 - src/main/frontend/handler.cljs | 29 +- src/main/frontend/handler/assets.cljs | 31 +- src/main/frontend/handler/block.cljs | 43 +- src/main/frontend/handler/code.cljs | 33 +- src/main/frontend/handler/common.cljs | 16 +- .../frontend/handler/common/developer.cljs | 13 +- src/main/frontend/handler/common/page.cljs | 80 +- src/main/frontend/handler/config.cljs | 8 +- .../frontend/handler/db_based/editor.cljs | 6 +- .../frontend/handler/db_based/export.cljs | 3 +- src/main/frontend/handler/db_based/rtc.cljs | 4 +- src/main/frontend/handler/dnd.cljs | 23 +- src/main/frontend/handler/draw.cljs | 67 - src/main/frontend/handler/editor.cljs | 827 +--- src/main/frontend/handler/events.cljs | 79 +- src/main/frontend/handler/events/rtc.cljs | 7 + src/main/frontend/handler/events/ui.cljs | 76 +- src/main/frontend/handler/export.cljs | 210 +- src/main/frontend/handler/export/common.cljs | 9 +- src/main/frontend/handler/export/opml.cljs | 68 +- src/main/frontend/handler/export/text.cljs | 57 +- .../frontend/handler/file_based/editor.cljs | 371 -- .../frontend/handler/file_based/events.cljs | 382 -- .../frontend/handler/file_based/file.cljs | 289 -- .../frontend/handler/file_based/import.cljs | 70 - .../handler/file_based/native_fs.cljs | 290 -- .../frontend/handler/file_based/page.cljs | 55 - .../handler/file_based/page_property.cljs | 87 - .../frontend/handler/file_based/property.cljs | 84 - .../handler/file_based/property/util.cljs | 236 -- .../frontend/handler/file_based/repeated.cljs | 138 - .../frontend/handler/file_based/repo.cljs | 301 -- .../frontend/handler/file_based/status.cljs | 71 - src/main/frontend/handler/file_sync.cljs | 267 -- src/main/frontend/handler/global_config.cljs | 9 +- src/main/frontend/handler/import.cljs | 38 +- src/main/frontend/handler/page.cljs | 178 +- src/main/frontend/handler/paste.cljs | 11 +- src/main/frontend/handler/property.cljs | 67 +- src/main/frontend/handler/property/file.cljs | 54 - src/main/frontend/handler/property/util.cljs | 6 - src/main/frontend/handler/query/builder.cljs | 17 +- src/main/frontend/handler/repo.cljs | 114 +- src/main/frontend/handler/route.cljs | 35 +- src/main/frontend/handler/shell.cljs | 57 +- src/main/frontend/handler/ui.cljs | 27 +- src/main/frontend/handler/user.cljs | 137 +- src/main/frontend/handler/whiteboard.cljs | 411 -- src/main/frontend/handler/worker.cljs | 17 +- src/main/frontend/idb.cljs | 25 +- src/main/frontend/mobile/graph_picker.cljs | 158 - src/main/frontend/mobile/util.cljs | 8 - .../frontend/modules/shortcut/config.cljs | 218 +- src/main/frontend/page.cljs | 86 +- src/main/frontend/persist_db.cljs | 5 +- src/main/frontend/persist_db/browser.cljs | 1 - src/main/frontend/publishing.cljs | 4 - src/main/frontend/pubsub.cljc | 77 - src/main/frontend/routes.cljs | 28 +- src/main/frontend/rum.cljs | 22 - .../schema/handler/common_config.cljc | 3 - src/main/frontend/search.cljs | 49 +- src/main/frontend/search/browser.cljs | 14 +- src/main/frontend/spec/storage.cljc | 3 +- src/main/frontend/state.cljs | 315 +- src/main/frontend/ui.cljs | 19 - src/main/frontend/util.cljc | 134 +- src/main/frontend/util/clock.cljs | 47 + src/main/frontend/util/cursor.cljs | 38 +- src/main/frontend/util/file_based/clock.cljs | 126 - src/main/frontend/util/file_based/drawer.cljs | 139 - .../frontend/util/file_based/priority.cljs | 31 - src/main/frontend/util/fs.cljs | 23 +- src/main/frontend/util/page.cljs | 6 - src/main/frontend/util/persist_var.cljs | 107 - src/main/frontend/util/ref.cljs | 8 +- src/main/frontend/util/text.cljs | 21 +- src/main/frontend/util/thingatpt.cljs | 139 +- src/main/frontend/version.cljs | 2 +- src/main/frontend/worker/db/migrate.cljs | 83 +- src/main/frontend/worker/db_listener.cljs | 25 +- src/main/frontend/worker/db_worker.cljs | 84 +- src/main/frontend/worker/file.cljs | 211 - src/main/frontend/worker/handler/page.cljs | 22 +- .../handler/page/file_based/delete.cljs | 39 - .../worker/handler/page/file_based/page.cljs | 104 - .../handler/page/file_based/rename.cljs | 345 -- src/main/frontend/worker/pipeline.cljs | 71 +- src/main/frontend/worker/rtc/client.cljs | 16 +- src/main/frontend/worker/rtc/client_op.cljs | 8 +- src/main/frontend/worker/rtc/core.cljs | 29 +- .../frontend/worker/rtc/remote_update.cljs | 150 +- src/main/frontend/worker/search.cljs | 16 +- src/main/frontend/worker/state.cljs | 11 - src/main/logseq/api.cljs | 14 - src/main/logseq/api/app.cljs | 8 +- src/main/logseq/api/db.cljs | 1 - src/main/logseq/api/db_based.cljs | 39 +- src/main/logseq/api/editor.cljs | 203 +- src/main/logseq/api/file_based.cljs | 81 - src/main/logseq/api/plugin.cljs | 1 - src/main/logseq/sdk/git.cljs | 28 - src/resources/dicts/af.edn | 10 - src/resources/dicts/ca.edn | 235 -- src/resources/dicts/cs.edn | 241 +- src/resources/dicts/de.edn | 242 -- src/resources/dicts/en.edn | 238 -- src/resources/dicts/es.edn | 235 -- src/resources/dicts/fa.edn | 93 +- src/resources/dicts/fr.edn | 234 - src/resources/dicts/id.edn | 239 +- src/resources/dicts/it.edn | 238 +- src/resources/dicts/ja.edn | 238 -- src/resources/dicts/ko.edn | 53 - src/resources/dicts/nb-no.edn | 237 -- src/resources/dicts/nl.edn | 33 - src/resources/dicts/pl.edn | 237 -- src/resources/dicts/pt-br.edn | 242 +- src/resources/dicts/pt-pt.edn | 55 +- src/resources/dicts/ru.edn | 173 +- src/resources/dicts/sk.edn | 233 - src/resources/dicts/tr.edn | 241 +- src/resources/dicts/uk.edn | 87 +- src/resources/dicts/zh-cn.edn | 143 - src/resources/dicts/zh-hant.edn | 45 - .../components/block/macros_test.cljs | 46 - .../file_based/query_table_test.cljs | 161 - .../frontend/db/file_based/model_test.cljs | 33 - src/test/frontend/db/name_sanity_test.cljs | 11 +- src/test/frontend/db/query_custom_test.cljs | 80 +- src/test/frontend/db/query_dsl_test.cljs | 19 +- .../extensions/zotero/extractor_test.cljs | 85 - src/test/frontend/external/roam_test.cljs | 35 - src/test/frontend/fs/diff_merge_test.cljs | 398 -- src/test/frontend/fs/sync_test.cljs | 45 - src/test/frontend/handler/editor_test.cljs | 67 +- .../file_based/page_property_test.cljs | 104 - src/test/frontend/handler/repo_test.cljs | 76 - .../frontend/modules/outliner/core_test.cljs | 89 +- .../modules/outliner/inline_tag_test.cljs | 8 +- src/test/frontend/test/file.cljs | 89 + .../frontend/test}/file/reset.cljs | 2 +- src/test/frontend/test/helper.cljs | 17 +- src/test/frontend/test/repo.cljs | 46 + .../util/{file_based => }/clock_test.cljs | 7 +- .../util/file_based/priority_test.cljs | 21 - src/test/frontend/util/marker_test.cljs | 28 - src/test/frontend/util/property_test.cljs | 130 - .../handler/page/file_based/rename_test.cljs | 189 - .../worker/rtc/gen_client_op_test.cljs | 15 +- .../frontend/worker/rtc/rtc_fns_test.cljs | 26 +- ssl/ca.pem | 29 - ssl/keystore.jks | Bin 2994 -> 0 bytes ssl/logseq.local-key.pem | 28 - ssl/logseq.local.p12 | Bin 2970 -> 0 bytes ssl/logseq.local.pem | 26 - tailwind.all.css | 1 - yarn.lock | 20 - 677 files changed, 2418 insertions(+), 61831 deletions(-) delete mode 100644 packages/tldraw/.editorconfig delete mode 100644 packages/tldraw/.eslintignore delete mode 100644 packages/tldraw/.eslintrc delete mode 100644 packages/tldraw/.gitattributes delete mode 100644 packages/tldraw/.gitignore delete mode 100644 packages/tldraw/.npmignore delete mode 100644 packages/tldraw/.prettierrc delete mode 100644 packages/tldraw/LICENSE.md delete mode 100644 packages/tldraw/README.md delete mode 100644 packages/tldraw/apps/tldraw-logseq/README.md delete mode 100644 packages/tldraw/apps/tldraw-logseq/build.mjs delete mode 100644 packages/tldraw/apps/tldraw-logseq/package.json delete mode 100644 packages/tldraw/apps/tldraw-logseq/postcss.config.js delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/app.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/components/ActionBar/ActionBar.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/components/ActionBar/index.ts delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/components/AppUI.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/components/BlockLink/BlockLink.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/components/BlockLink/index.ts delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/components/Button/Button.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/components/Button/CircleButton.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/components/Button/index.ts delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/components/ContextBar/ContextBar.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/components/ContextBar/contextBarActionFactory.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/components/ContextBar/index.ts delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/components/ContextMenu/ContextMenu.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/components/ContextMenu/index.ts delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/components/Devtools/Devtools.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/components/Devtools/index.ts delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/components/GeometryTools/GeometryTools.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/components/GeometryTools/index.ts delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/components/KeyboardShortcut/KeyboardShortcut.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/components/KeyboardShortcut/index.ts delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/components/Minimap/Minimap.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/components/Minimap/index.ts delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/components/PopoverButton/PopoverButton.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/components/PopoverButton/index.ts delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/components/PrimaryTools/PrimaryTools.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/components/PrimaryTools/index.ts delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/components/QuickLinks/QuickLinks.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/components/QuickLinks/index.ts delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/components/QuickSearch/QuickSearch.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/components/QuickSearch/index.ts delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/components/StatusBar/StatusBar.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/components/StatusBar/index.ts delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/components/ToolButton/ToolButton.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/components/ToolButton/index.ts delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/components/Tooltip/Tooltip.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/components/Tooltip/index.ts delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/components/ZoomMenu/ZoomMenu.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/components/ZoomMenu/index.ts delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/components/icons/TablerIcon.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/components/icons/index.ts delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/components/inputs/ColorInput.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/components/inputs/NumberInput.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/components/inputs/ScaleInput.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/components/inputs/SelectInput.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/components/inputs/ShapeLinksInput.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/components/inputs/TextInput.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/components/inputs/ToggleGroupInput.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/components/inputs/ToggleInput.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/hooks/useCameraMoving.ts delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/hooks/useCopy.ts delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/hooks/useDrop.ts delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/hooks/usePaste.ts delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/hooks/useQuickAdd.ts delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/index.ts delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/index.ts delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/logseq-context.ts delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/preview-manager.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/shapes/BindingIndicator.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/shapes/BoxShape.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/shapes/DotShape.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/shapes/EllipseShape.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/shapes/GroupShape.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/shapes/HTMLShape.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/shapes/HighlighterShape.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/shapes/IFrameShape.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/shapes/ImageShape.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/shapes/LineShape.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/shapes/LogseqPortalShape.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/shapes/PdfShape.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/shapes/PenShape.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/shapes/PencilShape.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/shapes/PolygonShape.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/shapes/TextShape.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/shapes/TweetShape.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/shapes/VideoShape.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/shapes/YouTubeShape.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/shapes/arrow/Arrow.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/shapes/arrow/ArrowHead.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/shapes/arrow/arrowHelpers.ts delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/shapes/arrow/constants.ts delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/shapes/index.ts delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/shapes/style-props.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/shapes/text/LabelMask.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/shapes/text/TextAreaUtils.ts delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/shapes/text/TextLabel.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/shapes/text/constants.ts delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/tools/BoxTool.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/tools/DotTool.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/tools/EllipseTool.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/tools/EraseTool.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/tools/HTMLTool.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/tools/HighlighterTool.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/tools/IFrameTool.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/tools/LineTool.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/tools/LogseqPortalTool/LogseqPortalTool.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/tools/LogseqPortalTool/index.ts delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/tools/LogseqPortalTool/states/CreatingState.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/tools/LogseqPortalTool/states/IdleState.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/tools/LogseqPortalTool/states/index.ts delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/tools/PencilTool.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/tools/PolygonTool.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/tools/TextTool.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/tools/YouTubeTool.tsx delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/lib/tools/index.ts delete mode 100644 packages/tldraw/apps/tldraw-logseq/src/styles.css delete mode 100644 packages/tldraw/apps/tldraw-logseq/tsconfig.json delete mode 100644 packages/tldraw/apps/tldraw-logseq/tsup.config.ts delete mode 100644 packages/tldraw/package.json delete mode 100644 packages/tldraw/packages/core/CHANGELOG.md delete mode 100644 packages/tldraw/packages/core/LICENSE.md delete mode 100644 packages/tldraw/packages/core/README.md delete mode 100644 packages/tldraw/packages/core/card-repo.png delete mode 100644 packages/tldraw/packages/core/package.json delete mode 100644 packages/tldraw/packages/core/scripts/build.js delete mode 100644 packages/tldraw/packages/core/scripts/dev.js delete mode 100644 packages/tldraw/packages/core/src/constants.ts delete mode 100644 packages/tldraw/packages/core/src/index.ts delete mode 100644 packages/tldraw/packages/core/src/lib/TLApi/TLApi.ts delete mode 100644 packages/tldraw/packages/core/src/lib/TLApi/index.ts delete mode 100644 packages/tldraw/packages/core/src/lib/TLApp/TLApp.ts delete mode 100644 packages/tldraw/packages/core/src/lib/TLApp/index.ts delete mode 100644 packages/tldraw/packages/core/src/lib/TLBaseLineBindingState.ts delete mode 100644 packages/tldraw/packages/core/src/lib/TLBush.ts delete mode 100644 packages/tldraw/packages/core/src/lib/TLCursors.ts delete mode 100644 packages/tldraw/packages/core/src/lib/TLHistory.ts delete mode 100644 packages/tldraw/packages/core/src/lib/TLInputs.ts delete mode 100644 packages/tldraw/packages/core/src/lib/TLPage/TLPage.ts delete mode 100644 packages/tldraw/packages/core/src/lib/TLPage/index.ts delete mode 100644 packages/tldraw/packages/core/src/lib/TLSettings.ts delete mode 100644 packages/tldraw/packages/core/src/lib/TLState.ts delete mode 100644 packages/tldraw/packages/core/src/lib/TLTool.tsx delete mode 100644 packages/tldraw/packages/core/src/lib/TLToolState.ts delete mode 100644 packages/tldraw/packages/core/src/lib/TLViewport.ts delete mode 100644 packages/tldraw/packages/core/src/lib/index.ts delete mode 100644 packages/tldraw/packages/core/src/lib/shapes/TLBoxShape/TLBoxShape.test.ts delete mode 100644 packages/tldraw/packages/core/src/lib/shapes/TLBoxShape/TLBoxShape.tsx delete mode 100644 packages/tldraw/packages/core/src/lib/shapes/TLBoxShape/index.ts delete mode 100644 packages/tldraw/packages/core/src/lib/shapes/TLDotShape/TLDotShape.tsx delete mode 100644 packages/tldraw/packages/core/src/lib/shapes/TLDotShape/index.ts delete mode 100644 packages/tldraw/packages/core/src/lib/shapes/TLDrawShape/TLDrawShape.test.ts delete mode 100644 packages/tldraw/packages/core/src/lib/shapes/TLDrawShape/TLDrawShape.tsx delete mode 100644 packages/tldraw/packages/core/src/lib/shapes/TLDrawShape/index.ts delete mode 100644 packages/tldraw/packages/core/src/lib/shapes/TLEllipseShape/TLEllipseShape.ts delete mode 100644 packages/tldraw/packages/core/src/lib/shapes/TLEllipseShape/index.ts delete mode 100644 packages/tldraw/packages/core/src/lib/shapes/TLGroupShape/TLGroupShape.tsx delete mode 100644 packages/tldraw/packages/core/src/lib/shapes/TLGroupShape/index.ts delete mode 100644 packages/tldraw/packages/core/src/lib/shapes/TLImageShape/TLImageShape.ts delete mode 100644 packages/tldraw/packages/core/src/lib/shapes/TLImageShape/index.ts delete mode 100644 packages/tldraw/packages/core/src/lib/shapes/TLLineShape/TLLineShape.tsx delete mode 100644 packages/tldraw/packages/core/src/lib/shapes/TLLineShape/index.ts delete mode 100644 packages/tldraw/packages/core/src/lib/shapes/TLPolygonShape/TLPolygonShape.tsx delete mode 100644 packages/tldraw/packages/core/src/lib/shapes/TLPolygonShape/index.ts delete mode 100644 packages/tldraw/packages/core/src/lib/shapes/TLPolylineShape/TLPolylineShape.tsx delete mode 100644 packages/tldraw/packages/core/src/lib/shapes/TLPolylineShape/index.ts delete mode 100644 packages/tldraw/packages/core/src/lib/shapes/TLShape/TLShape.tsx delete mode 100644 packages/tldraw/packages/core/src/lib/shapes/TLShape/index.ts delete mode 100644 packages/tldraw/packages/core/src/lib/shapes/TLStarShape/TLStarShape.tsx delete mode 100644 packages/tldraw/packages/core/src/lib/shapes/TLStarShape/index.ts delete mode 100644 packages/tldraw/packages/core/src/lib/shapes/TLTextShape/TLTextShape.tsx delete mode 100644 packages/tldraw/packages/core/src/lib/shapes/TLTextShape/index.ts delete mode 100644 packages/tldraw/packages/core/src/lib/shapes/index.ts delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLBoxTool/TLBoxTool.ts delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLBoxTool/index.ts delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLBoxTool/states/CreatingState.tsx delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLBoxTool/states/IdleState.tsx delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLBoxTool/states/PointingState.tsx delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLBoxTool/states/index.ts delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLDotTool/TLDotTool.ts delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLDotTool/index.ts delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLDotTool/states/CreatingState.tsx delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLDotTool/states/IdleState.tsx delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLDotTool/states/index.ts delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLDrawTool/TLDrawTool.tsx delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLDrawTool/index.ts delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLDrawTool/states/CreatingState.tsx delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLDrawTool/states/IdleState.tsx delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLDrawTool/states/PinchingState.ts delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLDrawTool/states/index.ts delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLEraseTool/TLEraseTool.tsx delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLEraseTool/index.ts delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLEraseTool/states/ErasingState.tsx delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLEraseTool/states/IdleState.tsx delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLEraseTool/states/PointingState.tsx delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLEraseTool/states/index.ts delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLLineTool/TLLineTool.ts delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLLineTool/index.ts delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLLineTool/states/CreatingState.tsx delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLLineTool/states/IdleState.tsx delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLLineTool/states/PointingState.tsx delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLLineTool/states/index.ts delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLMoveTool/TLMoveTool.ts delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLMoveTool/index.ts delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLMoveTool/states/IdleHoldState.tsx delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLMoveTool/states/IdleState.tsx delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLMoveTool/states/PanningState.tsx delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLMoveTool/states/PinchingState.ts delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLMoveTool/states/index.ts delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLSelectTool/TLSelectTool.tsx delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLSelectTool/index.ts delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLSelectTool/states/BrushingState.ts delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLSelectTool/states/ContextMenuState.ts delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLSelectTool/states/EditingShapeState.ts delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLSelectTool/states/HoveringSelectionHandleState.ts delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLSelectTool/states/IdleState.ts delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLSelectTool/states/PinchingState.ts delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLSelectTool/states/PointingBoundsBackgroundState.ts delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLSelectTool/states/PointingCanvasState.ts delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLSelectTool/states/PointingHandleState.ts delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLSelectTool/states/PointingMinimapState.ts delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLSelectTool/states/PointingResizeHandleState.ts delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLSelectTool/states/PointingRotateHandleState.ts delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLSelectTool/states/PointingSelectedShapeState.ts delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLSelectTool/states/PointingShapeBehindBoundsState.ts delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLSelectTool/states/PointingShapeState.ts delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLSelectTool/states/ResizingState.ts delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLSelectTool/states/RotatingState.ts delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLSelectTool/states/TranslatingHandleState.ts delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLSelectTool/states/TranslatingState.ts delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLSelectTool/states/index.ts delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLTextTool/TLTextTool.ts delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLTextTool/index.ts delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLTextTool/states/CreatingState.tsx delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLTextTool/states/IdleState.tsx delete mode 100644 packages/tldraw/packages/core/src/lib/tools/TLTextTool/states/index.ts delete mode 100644 packages/tldraw/packages/core/src/lib/tools/index.ts delete mode 100644 packages/tldraw/packages/core/src/types/TLBaseEventMap.ts delete mode 100644 packages/tldraw/packages/core/src/types/TLCursor.ts delete mode 100644 packages/tldraw/packages/core/src/types/TLEventHandlers.ts delete mode 100644 packages/tldraw/packages/core/src/types/TLEventMap.ts delete mode 100644 packages/tldraw/packages/core/src/types/TLEvents.ts delete mode 100644 packages/tldraw/packages/core/src/types/TLHandle.ts delete mode 100644 packages/tldraw/packages/core/src/types/TLShortcut.ts delete mode 100644 packages/tldraw/packages/core/src/types/TLStateEventHandlers.ts delete mode 100644 packages/tldraw/packages/core/src/types/index.ts delete mode 100644 packages/tldraw/packages/core/src/types/types.ts delete mode 100644 packages/tldraw/packages/core/src/utils/BindingUtils.ts delete mode 100644 packages/tldraw/packages/core/src/utils/BoundsUtils.ts delete mode 100644 packages/tldraw/packages/core/src/utils/ColorUtils.ts delete mode 100644 packages/tldraw/packages/core/src/utils/DataUtils.ts delete mode 100644 packages/tldraw/packages/core/src/utils/GeomUtils.ts delete mode 100644 packages/tldraw/packages/core/src/utils/PointUtils.ts delete mode 100644 packages/tldraw/packages/core/src/utils/PolygonUtils.ts delete mode 100644 packages/tldraw/packages/core/src/utils/SvgPathUtils.ts delete mode 100644 packages/tldraw/packages/core/src/utils/TextUtils.ts delete mode 100644 packages/tldraw/packages/core/src/utils/cache.ts delete mode 100644 packages/tldraw/packages/core/src/utils/getTextSize.ts delete mode 100644 packages/tldraw/packages/core/src/utils/index.ts delete mode 100644 packages/tldraw/packages/core/tsconfig.build.json delete mode 100644 packages/tldraw/packages/core/tsconfig.json delete mode 100644 packages/tldraw/packages/react/CHANGELOG.md delete mode 100644 packages/tldraw/packages/react/LICENSE.md delete mode 100644 packages/tldraw/packages/react/README.md delete mode 100644 packages/tldraw/packages/react/card-repo.png delete mode 100644 packages/tldraw/packages/react/package.json delete mode 100644 packages/tldraw/packages/react/scripts/build.js delete mode 100644 packages/tldraw/packages/react/scripts/dev.js delete mode 100644 packages/tldraw/packages/react/src/components/App.tsx delete mode 100644 packages/tldraw/packages/react/src/components/AppCanvas.tsx delete mode 100644 packages/tldraw/packages/react/src/components/AppProvider.tsx delete mode 100644 packages/tldraw/packages/react/src/components/BacklinksCountContainer/BacklinksCountContainer.tsx delete mode 100644 packages/tldraw/packages/react/src/components/BacklinksCountContainer/index.ts delete mode 100644 packages/tldraw/packages/react/src/components/Canvas/Canvas.tsx delete mode 100644 packages/tldraw/packages/react/src/components/Canvas/index.ts delete mode 100644 packages/tldraw/packages/react/src/components/Container/Container.tsx delete mode 100644 packages/tldraw/packages/react/src/components/Container/index.ts delete mode 100644 packages/tldraw/packages/react/src/components/ContextBarContainer/ContextBarContainer.tsx delete mode 100644 packages/tldraw/packages/react/src/components/ContextBarContainer/index.ts delete mode 100644 packages/tldraw/packages/react/src/components/HTMLContainer/HTMLContainer.tsx delete mode 100644 packages/tldraw/packages/react/src/components/HTMLContainer/index.ts delete mode 100644 packages/tldraw/packages/react/src/components/HTMLLayer/HTMLLayer.tsx delete mode 100644 packages/tldraw/packages/react/src/components/HTMLLayer/index.ts delete mode 100644 packages/tldraw/packages/react/src/components/Indicator/Indicator.tsx delete mode 100644 packages/tldraw/packages/react/src/components/Indicator/index.ts delete mode 100644 packages/tldraw/packages/react/src/components/QuickLinksContainer/QuickLinksContainer.tsx delete mode 100644 packages/tldraw/packages/react/src/components/QuickLinksContainer/index.ts delete mode 100644 packages/tldraw/packages/react/src/components/Renderer/Renderer.tsx delete mode 100644 packages/tldraw/packages/react/src/components/Renderer/RendererContext.tsx delete mode 100644 packages/tldraw/packages/react/src/components/Renderer/index.ts delete mode 100644 packages/tldraw/packages/react/src/components/SVGContainer/SVGContainer.tsx delete mode 100644 packages/tldraw/packages/react/src/components/SVGContainer/index.ts delete mode 100644 packages/tldraw/packages/react/src/components/SVGLayer/SVGLayer.tsx delete mode 100644 packages/tldraw/packages/react/src/components/SVGLayer/index.ts delete mode 100644 packages/tldraw/packages/react/src/components/SelectionDetailContainer/SelectionDetailContainer.tsx delete mode 100644 packages/tldraw/packages/react/src/components/SelectionDetailContainer/index.ts delete mode 100644 packages/tldraw/packages/react/src/components/Shape/Shape.tsx delete mode 100644 packages/tldraw/packages/react/src/components/Shape/index.ts delete mode 100644 packages/tldraw/packages/react/src/components/index.ts delete mode 100644 packages/tldraw/packages/react/src/components/ui/Brush/Brush.tsx delete mode 100644 packages/tldraw/packages/react/src/components/ui/Brush/index.ts delete mode 100644 packages/tldraw/packages/react/src/components/ui/Cursor/Cursor.tsx delete mode 100644 packages/tldraw/packages/react/src/components/ui/Cursor/index.ts delete mode 100644 packages/tldraw/packages/react/src/components/ui/DirectionIndicator/DirectionIndicator.tsx delete mode 100644 packages/tldraw/packages/react/src/components/ui/DirectionIndicator/index.ts delete mode 100644 packages/tldraw/packages/react/src/components/ui/Grid/Grid.tsx delete mode 100644 packages/tldraw/packages/react/src/components/ui/Grid/index.ts delete mode 100644 packages/tldraw/packages/react/src/components/ui/Handle/Handle.tsx delete mode 100644 packages/tldraw/packages/react/src/components/ui/Handle/index.ts delete mode 100644 packages/tldraw/packages/react/src/components/ui/SelectionBackground/SelectionBackground.tsx delete mode 100644 packages/tldraw/packages/react/src/components/ui/SelectionBackground/index.ts delete mode 100644 packages/tldraw/packages/react/src/components/ui/SelectionDetail/SelectionDetail.tsx delete mode 100644 packages/tldraw/packages/react/src/components/ui/SelectionDetail/index.ts delete mode 100644 packages/tldraw/packages/react/src/components/ui/SelectionForeground/SelectionForeground.tsx delete mode 100644 packages/tldraw/packages/react/src/components/ui/SelectionForeground/handles/CloneHandle.tsx delete mode 100644 packages/tldraw/packages/react/src/components/ui/SelectionForeground/handles/CornerHandle.tsx delete mode 100644 packages/tldraw/packages/react/src/components/ui/SelectionForeground/handles/EdgeHandle.tsx delete mode 100644 packages/tldraw/packages/react/src/components/ui/SelectionForeground/handles/RotateCornerHandle.tsx delete mode 100644 packages/tldraw/packages/react/src/components/ui/SelectionForeground/handles/RotateHandle.tsx delete mode 100644 packages/tldraw/packages/react/src/components/ui/SelectionForeground/handles/index.ts delete mode 100644 packages/tldraw/packages/react/src/components/ui/SelectionForeground/index.ts delete mode 100644 packages/tldraw/packages/react/src/components/ui/index.ts delete mode 100644 packages/tldraw/packages/react/src/constants.ts delete mode 100644 packages/tldraw/packages/react/src/hooks/index.ts delete mode 100644 packages/tldraw/packages/react/src/hooks/useApp.ts delete mode 100644 packages/tldraw/packages/react/src/hooks/useAppSetup.ts delete mode 100644 packages/tldraw/packages/react/src/hooks/useBoundsEvents.ts delete mode 100644 packages/tldraw/packages/react/src/hooks/useCanvasEvents.ts delete mode 100644 packages/tldraw/packages/react/src/hooks/useCounterScaledPosition.tsx delete mode 100644 packages/tldraw/packages/react/src/hooks/useCursor.ts delete mode 100644 packages/tldraw/packages/react/src/hooks/useDebounced.ts delete mode 100644 packages/tldraw/packages/react/src/hooks/useGestureEvents.ts delete mode 100644 packages/tldraw/packages/react/src/hooks/useHandleEvents.ts delete mode 100644 packages/tldraw/packages/react/src/hooks/useKeyboardEvents.ts delete mode 100644 packages/tldraw/packages/react/src/hooks/useMinimapEvents.ts delete mode 100644 packages/tldraw/packages/react/src/hooks/usePreventNavigation.ts delete mode 100644 packages/tldraw/packages/react/src/hooks/usePropControl.ts delete mode 100644 packages/tldraw/packages/react/src/hooks/useRendererContext.ts delete mode 100644 packages/tldraw/packages/react/src/hooks/useResizeObserver.ts delete mode 100644 packages/tldraw/packages/react/src/hooks/useRestoreCamera.ts delete mode 100644 packages/tldraw/packages/react/src/hooks/useSetup.ts delete mode 100644 packages/tldraw/packages/react/src/hooks/useShapeEvents.ts delete mode 100644 packages/tldraw/packages/react/src/hooks/useStylesheet.ts delete mode 100644 packages/tldraw/packages/react/src/hooks/useZoom.ts delete mode 100644 packages/tldraw/packages/react/src/index.ts delete mode 100644 packages/tldraw/packages/react/src/lib/TLReactApp.ts delete mode 100644 packages/tldraw/packages/react/src/lib/TLReactShape.tsx delete mode 100644 packages/tldraw/packages/react/src/lib/index.ts delete mode 100644 packages/tldraw/packages/react/src/lib/shapes.ts delete mode 100644 packages/tldraw/packages/react/src/types/TLReactCustomEvents.ts delete mode 100644 packages/tldraw/packages/react/src/types/TLReactEventHandlers.ts delete mode 100644 packages/tldraw/packages/react/src/types/TLReactEventMap.ts delete mode 100644 packages/tldraw/packages/react/src/types/TLReactEvents.ts delete mode 100644 packages/tldraw/packages/react/src/types/TLReactStateEvents.ts delete mode 100644 packages/tldraw/packages/react/src/types/TLReactSubscriptions.tsx delete mode 100644 packages/tldraw/packages/react/src/types/TLReactToolConstructor.tsx delete mode 100644 packages/tldraw/packages/react/src/types/component-props.ts delete mode 100644 packages/tldraw/packages/react/src/types/index.ts delete mode 100644 packages/tldraw/packages/react/tsconfig.build.json delete mode 100644 packages/tldraw/packages/react/tsconfig.json delete mode 100644 packages/tldraw/packages/utils/curve/CHANGELOG.md delete mode 100644 packages/tldraw/packages/utils/curve/LICENSE.md delete mode 100644 packages/tldraw/packages/utils/curve/README.md delete mode 100644 packages/tldraw/packages/utils/curve/package.json delete mode 100644 packages/tldraw/packages/utils/curve/scripts/build.js delete mode 100644 packages/tldraw/packages/utils/curve/scripts/dev.js delete mode 100644 packages/tldraw/packages/utils/curve/src/index.ts delete mode 100644 packages/tldraw/packages/utils/curve/tsconfig.build.json delete mode 100644 packages/tldraw/packages/utils/curve/tsconfig.json delete mode 100644 packages/tldraw/packages/utils/intersect/CHANGELOG.md delete mode 100644 packages/tldraw/packages/utils/intersect/LICENSE.md delete mode 100644 packages/tldraw/packages/utils/intersect/README.md delete mode 100644 packages/tldraw/packages/utils/intersect/package.json delete mode 100644 packages/tldraw/packages/utils/intersect/scripts/build.js delete mode 100644 packages/tldraw/packages/utils/intersect/scripts/dev.js delete mode 100644 packages/tldraw/packages/utils/intersect/src/index.ts delete mode 100644 packages/tldraw/packages/utils/intersect/tsconfig.build.json delete mode 100644 packages/tldraw/packages/utils/intersect/tsconfig.json delete mode 100644 packages/tldraw/packages/utils/vec/CHANGELOG.md delete mode 100644 packages/tldraw/packages/utils/vec/LICENSE.md delete mode 100644 packages/tldraw/packages/utils/vec/README.md delete mode 100644 packages/tldraw/packages/utils/vec/package.json delete mode 100644 packages/tldraw/packages/utils/vec/scripts/build.js delete mode 100644 packages/tldraw/packages/utils/vec/scripts/dev.js delete mode 100644 packages/tldraw/packages/utils/vec/src/index.ts delete mode 100644 packages/tldraw/packages/utils/vec/tsconfig.build.json delete mode 100644 packages/tldraw/packages/utils/vec/tsconfig.json delete mode 100644 packages/tldraw/tsconfig.base.json delete mode 100644 packages/tldraw/tsconfig.json delete mode 100644 packages/tldraw/yarn.lock delete mode 100644 resources/whiteboard/onboarding.edn delete mode 100644 src/bench/frontend/benchmark_test_runner.cljs delete mode 100644 src/electron/electron/file_sync_rsapi.cljs delete mode 100644 src/electron/electron/fs_watcher.cljs delete mode 100644 src/electron/electron/git.cljs delete mode 100644 src/main/frontend/common/file_based/db.cljs create mode 100644 src/main/frontend/components/datepicker.cljs delete mode 100644 src/main/frontend/components/datepicker.css delete mode 100644 src/main/frontend/components/diff.cljs delete mode 100644 src/main/frontend/components/diff.css delete mode 100644 src/main/frontend/components/encryption.cljs delete mode 100644 src/main/frontend/components/file_based/block.cljs delete mode 100644 src/main/frontend/components/file_based/datetime.cljs delete mode 100644 src/main/frontend/components/file_based/git.cljs delete mode 100644 src/main/frontend/components/file_based/hierarchy.cljs delete mode 100644 src/main/frontend/components/file_based/query.cljs delete mode 100644 src/main/frontend/components/file_based/query_table.cljs delete mode 100644 src/main/frontend/components/file_sync.cljs delete mode 100644 src/main/frontend/components/onboarding/quick_tour.cljs delete mode 100644 src/main/frontend/components/whiteboard.cljs delete mode 100644 src/main/frontend/components/whiteboard.css delete mode 100644 src/main/frontend/db/file_based/async.cljs delete mode 100644 src/main/frontend/db/file_based/model.cljs delete mode 100644 src/main/frontend/encrypt.cljs delete mode 100644 src/main/frontend/extensions/excalidraw.cljs delete mode 100644 src/main/frontend/extensions/srs.cljs delete mode 100644 src/main/frontend/extensions/srs.css delete mode 100644 src/main/frontend/extensions/tldraw.cljs delete mode 100644 src/main/frontend/extensions/zotero.css delete mode 100644 src/main/frontend/extensions/zotero/api.cljs delete mode 100644 src/main/frontend/extensions/zotero/extractor.cljs delete mode 100644 src/main/frontend/extensions/zotero/handler.cljs delete mode 100644 src/main/frontend/extensions/zotero/schema.cljs delete mode 100644 src/main/frontend/extensions/zotero/setting.cljs delete mode 100644 src/main/frontend/external.cljs delete mode 100644 src/main/frontend/external/protocol.cljc delete mode 100644 src/main/frontend/external/roam.cljs delete mode 100644 src/main/frontend/external/roam_export.cljs delete mode 100644 src/main/frontend/fs/diff_merge.cljs delete mode 100644 src/main/frontend/fs/sync.cljs delete mode 100644 src/main/frontend/fs/watcher_handler.cljs delete mode 100644 src/main/frontend/handler/draw.cljs delete mode 100644 src/main/frontend/handler/file_based/editor.cljs delete mode 100644 src/main/frontend/handler/file_based/events.cljs delete mode 100644 src/main/frontend/handler/file_based/file.cljs delete mode 100644 src/main/frontend/handler/file_based/import.cljs delete mode 100644 src/main/frontend/handler/file_based/native_fs.cljs delete mode 100644 src/main/frontend/handler/file_based/page.cljs delete mode 100644 src/main/frontend/handler/file_based/page_property.cljs delete mode 100644 src/main/frontend/handler/file_based/property.cljs delete mode 100644 src/main/frontend/handler/file_based/property/util.cljs delete mode 100644 src/main/frontend/handler/file_based/repeated.cljs delete mode 100644 src/main/frontend/handler/file_based/repo.cljs delete mode 100644 src/main/frontend/handler/file_based/status.cljs delete mode 100644 src/main/frontend/handler/file_sync.cljs delete mode 100644 src/main/frontend/handler/property/file.cljs delete mode 100644 src/main/frontend/handler/whiteboard.cljs delete mode 100644 src/main/frontend/mobile/graph_picker.cljs delete mode 100644 src/main/frontend/pubsub.cljc create mode 100644 src/main/frontend/util/clock.cljs delete mode 100644 src/main/frontend/util/file_based/clock.cljs delete mode 100644 src/main/frontend/util/file_based/drawer.cljs delete mode 100644 src/main/frontend/util/file_based/priority.cljs delete mode 100644 src/main/frontend/util/persist_var.cljs delete mode 100644 src/main/frontend/worker/file.cljs delete mode 100644 src/main/frontend/worker/handler/page/file_based/delete.cljs delete mode 100644 src/main/frontend/worker/handler/page/file_based/page.cljs delete mode 100644 src/main/frontend/worker/handler/page/file_based/rename.cljs delete mode 100644 src/main/logseq/api/file_based.cljs delete mode 100644 src/main/logseq/sdk/git.cljs delete mode 100644 src/test/frontend/components/block/macros_test.cljs delete mode 100644 src/test/frontend/components/file_based/query_table_test.cljs delete mode 100644 src/test/frontend/db/file_based/model_test.cljs delete mode 100644 src/test/frontend/extensions/zotero/extractor_test.cljs delete mode 100644 src/test/frontend/external/roam_test.cljs delete mode 100644 src/test/frontend/fs/diff_merge_test.cljs delete mode 100644 src/test/frontend/fs/sync_test.cljs delete mode 100644 src/test/frontend/handler/file_based/page_property_test.cljs delete mode 100644 src/test/frontend/handler/repo_test.cljs create mode 100644 src/test/frontend/test/file.cljs rename src/{main/frontend/worker => test/frontend/test}/file/reset.cljs (99%) create mode 100644 src/test/frontend/test/repo.cljs rename src/test/frontend/util/{file_based => }/clock_test.cljs (73%) delete mode 100644 src/test/frontend/util/file_based/priority_test.cljs delete mode 100644 src/test/frontend/util/marker_test.cljs delete mode 100644 src/test/frontend/util/property_test.cljs delete mode 100644 src/test/frontend/worker/handler/page/file_based/rename_test.cljs delete mode 100644 ssl/ca.pem delete mode 100644 ssl/keystore.jks delete mode 100644 ssl/logseq.local-key.pem delete mode 100644 ssl/logseq.local.p12 delete mode 100644 ssl/logseq.local.pem diff --git a/.carve/ignore b/.carve/ignore index c5765c96c1..13f9fb9a25 100644 --- a/.carve/ignore +++ b/.carve/ignore @@ -11,29 +11,15 @@ frontend.debug/defn frontend.debug/print ;; Lazily loaded frontend.extensions.code/editor -;; Lazily loaded -frontend.extensions.age-encryption/keygen -frontend.extensions.age-encryption/encrypt-with-x25519 -frontend.extensions.age-encryption/decrypt-with-x25519 -frontend.extensions.age-encryption/encrypt-with-user-passphrase -frontend.extensions.age-encryption/decrypt-with-user-passphrase -;; Lazily loaded -frontend.extensions.excalidraw/draw -;; Lazily loaded -frontend.extensions.tldraw/tldraw-app -frontend.extensions.tldraw/generate-preview ;; Referenced in commented TODO frontend.extensions.pdf.utils/get-page-bounding ;; For repl -frontend.extensions.zotero.api/item -;; For repl -frontend.external.roam/reset-state! -;; For repl logseq.graph-parser.mldoc/ast-export-markdown ;; Protocol fn wrapper that could be used frontend.fs/readdir ;; Referenced in TODO frontend.handler.metadata/update-properties! +frontend.handler.user/> (common-graph/read-directories dir) (remove (fn [s] (= s common-config/unlinked-graphs-dir))) (map graph-name->path) - (map (fn [s] - (if (string/starts-with? s common-config/file-version-prefix) - s - (str common-config/db-version-prefix s))))))) + (keep (fn [s] + (when-not (string/starts-with? s common-config/file-version-prefix) + (str common-config/db-version-prefix s))))))) diff --git a/deps/common/resources/templates/config.edn b/deps/common/resources/templates/config.edn index 04b21e97b0..bcec00aa3e 100644 --- a/deps/common/resources/templates/config.edn +++ b/deps/common/resources/templates/config.edn @@ -116,11 +116,6 @@ ;; :enabled-in-timestamped-blocks false ;don't display logbook at all ;; } - ;; File sync options - ;; Ignore these files when syncing, regexp is supported. - ;; This is _only_ for file graphs. - ;; :file-sync/ignore-files [] - ;; Configure the escaping method for special characters in page titles. ;; This is _only_ for file graphs. ;; Warning: @@ -391,17 +386,4 @@ ;; :redirect-page? false ;; Default value: false ;; :default-page "quick capture"} ;; Default page: "quick capture" - ;; Configure the Enter key behavior for - ;; context-aware editing with DWIM (Do What I Mean). - ;; context-aware Enter key behavior implies that pressing Enter will - ;; have different outcomes based on the context. - ;; For instance, pressing Enter within a list generates a new list item, - ;; whereas pressing Enter in a block reference opens the referenced block. - ;; :dwim/settings - ;; {:admonition&src? true ;; Default value: true - ;; :markup? false ;; Default value: false - ;; :block-ref? true ;; Default value: true - ;; :page-ref? true ;; Default value: true - ;; :properties? true ;; Default value: true - ;; :list? false} ;; Default value: false } diff --git a/deps/common/src/logseq/common/config.cljs b/deps/common/src/logseq/common/config.cljs index c6df125b8c..bcc005a77a 100644 --- a/deps/common/src/logseq/common/config.cljs +++ b/deps/common/src/logseq/common/config.cljs @@ -91,7 +91,7 @@ (defn text-formats [] #{:json :org :md :yml :dat :asciidoc :rst :txt :markdown :adoc :html :js :ts :edn :clj :ml :rb :ex :erl :java :php :c :css - :excalidraw :tldr :sh}) + :tldr :sh}) (defn img-formats [] diff --git a/deps/common/src/logseq/common/graph.cljs b/deps/common/src/logseq/common/graph.cljs index d9220f7b7f..b255ac3b59 100644 --- a/deps/common/src/logseq/common/graph.cljs +++ b/deps/common/src/logseq/common/graph.cljs @@ -82,7 +82,7 @@ Rules: (re-find #"^\.[^.]+" rpath)))))) (def ^:private allowed-formats - #{:org :markdown :md :edn :json :js :css :excalidraw :tldr}) + #{:org :markdown :md :edn :json :js :css}) (defn- get-ext [p] diff --git a/deps/db/src/logseq/db/common/view.cljs b/deps/db/src/logseq/db/common/view.cljs index d33df0ae8c..f63b115f14 100644 --- a/deps/db/src/logseq/db/common/view.cljs +++ b/deps/db/src/logseq/db/common/view.cljs @@ -290,16 +290,12 @@ (map :e) set)) -(defn- get-entities-for-all-pages [db sorting property-ident {:keys [db-based?]}] +(defn- get-entities-for-all-pages [db sorting property-ident] (let [refs-count? (and (coll? sorting) (some (fn [m] (= (:id m) :block.temp/refs-count)) sorting)) - exclude-ids (when db-based? (get-exclude-page-ids db))] + exclude-ids (get-exclude-page-ids db)] (keep (fn [d] (let [e (entity-plus/unsafe->Entity db (:e d))] - (when-not (if db-based? - (exclude-ids (:db/id e)) - (or (ldb/hidden-or-internal-tag? e) - (entity-util/property? e) - (entity-util/built-in? e))) + (when-not (exclude-ids (:db/id e)) (cond-> e refs-count? (assoc :block.temp/refs-count (common-initial-data/get-block-refs-count db (:e d))))))) @@ -311,11 +307,10 @@ view-for-id (or (:db/id view-for) view-for-id*) non-hidden-e (fn [id] (let [e (d/entity db id)] (when-not (entity-util/hidden? e) - e))) - db-based? (entity-plus/db-based-graph? db)] + e)))] (case feat-type :all-pages - (get-entities-for-all-pages db sorting property-ident {:db-based? db-based?}) + (get-entities-for-all-pages db sorting property-ident) :class-objects (db-class/get-class-objects db view-for-id) @@ -443,10 +438,7 @@ :else (let [view (d/entity db view-id) group-by-property (:logseq.property.view/group-by-property view) - db-based? (entity-plus/db-based-graph? db) - list-view? (or (= :logseq.property.view/type.list (:db/ident (:logseq.property.view/type view))) - (and (not db-based?) - (contains? #{:linked-references :unlinked-references} view-feature-type))) + list-view? (= :logseq.property.view/type.list (:db/ident (:logseq.property.view/type view))) group-by-property-ident (or (:db/ident group-by-property) group-by-property-ident) group-by-closed-values? (some? (:property/closed-values group-by-property)) ref-property? (= (:db/valueType group-by-property) :db.type/ref) diff --git a/deps/outliner/src/logseq/outliner/core.cljs b/deps/outliner/src/logseq/outliner/core.cljs index 8df606dfad..ac072ed454 100644 --- a/deps/outliner/src/logseq/outliner/core.cljs +++ b/deps/outliner/src/logseq/outliner/core.cljs @@ -12,14 +12,12 @@ [logseq.db :as ldb] [logseq.db.common.entity-plus :as entity-plus] [logseq.db.common.order :as db-order] - [logseq.db.file-based.schema :as file-schema] [logseq.db.frontend.class :as db-class] [logseq.db.frontend.schema :as db-schema] [logseq.db.sqlite.create-graph :as sqlite-create-graph] [logseq.db.sqlite.util :as sqlite-util] [logseq.graph-parser.block :as gp-block] [logseq.graph-parser.db :as gp-db] - [logseq.graph-parser.property :as gp-property] [logseq.outliner.batch-tx :include-macros true :as batch-tx] [logseq.outliner.datascript :as ds] [logseq.outliner.pipeline :as outliner-pipeline] @@ -28,8 +26,6 @@ [malli.core :as m] [malli.util :as mu])) -;; TODO: remove `repo` usage, use db to check `entity-plus/db-based-graph?` - (def ^:private block-map (mu/optional-keys [:map @@ -299,25 +295,23 @@ (extend-type Entity otree/INode - (-save [this *txs-state db repo _date-formatter {:keys [retract-attributes? retract-attributes outliner-op] - :or {retract-attributes? true}}] + (-save [this *txs-state db {:keys [retract-attributes? retract-attributes outliner-op] + :or {retract-attributes? true}}] (assert (ds/outliner-txs-state? *txs-state) "db should be satisfied outliner-tx-state?") - (let [db-based? (sqlite-util/db-based-graph? repo) + (let [db-graph? (entity-plus/db-based-graph? db) data (if (de/entity? this) (assoc (.-kv ^js this) :db/id (:db/id this)) this) - data' (if db-based? - (->> (dissoc data :block/properties) - (remove-disallowed-inline-classes db)) - data) + data' (->> (dissoc data :block/properties) + (remove-disallowed-inline-classes db)) collapse-or-expand? (= outliner-op :collapse-expand-blocks) m* (cond-> (-> data' (dissoc :block/children :block/meta :block/unordered :block.temp/ast-title :block.temp/ast-body :block/level :block.temp/load-status :block.temp/has-children?) - (fix-tag-ids db {:db-graph? db-based?})) + (fix-tag-ids db {:db-graph? db-graph?})) (not collapse-or-expand?) block-with-updated-at) db-id (:db/id this) @@ -325,28 +319,27 @@ eid (or db-id (when block-uuid [:block/uuid block-uuid])) block-entity (d/entity db eid) page? (ldb/page? block-entity) - m* (if (and db-based? (:block/title m*) + m* (if (and (:block/title m*) (not (:logseq.property.node/display-type block-entity))) (update m* :block/title common-util/clear-markdown-heading) m*) block-title (:block/title m*) page-title-changed? (and page? block-title (not= block-title (:block/title block-entity))) - _ (when (and db-based? page? block-title) + _ (when (and page? block-title) (outliner-validate/validate-page-title-characters block-title {:node m*})) - m* (if (and db-based? page-title-changed?) + m* (if page-title-changed? (let [_ (outliner-validate/validate-page-title (:block/title m*) {:node m*}) page-name (common-util/page-name-sanity-lc (:block/title m*))] (assoc m* :block/name page-name)) m*) - _ (when (and db-based? - ;; page or object changed? - (or (ldb/page? block-entity) (ldb/object? block-entity)) - (:block/title m*) - (not= (:block/title m*) (:block/title block-entity))) + _ (when (and ;; page or object changed? + (or (ldb/page? block-entity) (ldb/object? block-entity)) + (:block/title m*) + (not= (:block/title m*) (:block/title block-entity))) (outliner-validate/validate-block-title db (:block/title m*) block-entity)) m (cond-> m* - db-based? + true (dissoc :block/format :block/pre-block? :block/priority :block/marker :block/properties-order))] ;; Ensure block UUID never changes (let [e (d/entity db db-id)] @@ -361,9 +354,7 @@ (when (or (and retract-attributes? (:block/title m)) (seq retract-attributes)) (let [retract-attributes (concat - (if db-based? - db-schema/retract-attributes - file-schema/retract-attributes) + db-schema/retract-attributes retract-attributes)] (swap! *txs-state (fn [txs] (vec @@ -377,7 +368,7 @@ (update-page-when-save-block *txs-state block-entity m)) ;; Remove orphaned refs from block (when (and (:block/title m) (not= (:block/title m) (:block/title block-entity))) - (remove-orphaned-refs-when-save db *txs-state block-entity m {:db-graph? db-based?}))) + (remove-orphaned-refs-when-save db *txs-state block-entity m {:db-graph? db-graph?}))) ;; handle others txs (let [other-tx (:db/other-tx m)] @@ -387,16 +378,15 @@ (swap! *txs-state conj (dissoc m :db/other-tx))) - (when (and db-based? (:block/tags block-entity) block-entity) + (when (and (:block/tags block-entity) block-entity) (let [;; delete tags when title changed tx-data (remove-tags-when-title-changed block-entity (:block/title m))] (when (seq tx-data) (swap! *txs-state (fn [txs] (concat txs tx-data)))))) - (when db-based? - (let [tx-data (add-missing-tag-idents db (:block/tags m))] - (when (seq tx-data) - (swap! *txs-state (fn [txs] (concat txs tx-data)))))) + (let [tx-data (add-missing-tag-idents db (:block/tags m))] + (when (seq tx-data) + (swap! *txs-state (fn [txs] (concat txs tx-data))))) this)) @@ -519,7 +509,7 @@ (defn ^:api save-block "Save the `block`." - [repo db date-formatter block opts] + [db block opts] {:pre [(map? block)]} (let [*txs-state (atom []) block' (if (de/entity? block) @@ -530,7 +520,7 @@ (let [ent (d/entity db eid)] (assert (some? ent) "save-block entity not exists") (merge ent block)))))] - (otree/-save block' *txs-state db repo date-formatter opts) + (otree/-save block' *txs-state db opts) {:tx-data @*txs-state})) (defn- get-right-siblings @@ -543,28 +533,19 @@ rest)))) (defn- blocks-with-ordered-list-props - [repo blocks target-block sibling?] + [blocks target-block sibling?] (let [target-block (if sibling? target-block (when target-block (ldb/get-down target-block))) list-type-fn (fn [block] - (if (sqlite-util/db-based-graph? repo) - ;; Get raw id since insert-blocks doesn't auto-handle raw property values - (:db/id (:logseq.property/order-list-type block)) - (get (:block/properties block) :logseq.order-list-type))) - db-based? (sqlite-util/db-based-graph? repo)] + (:db/id (:logseq.property/order-list-type block)))] (if-let [list-type (and target-block (list-type-fn target-block))] (mapv - (fn [{:block/keys [title format] :as block}] + (fn [block] (let [list?' (and (some? (:block/uuid block)) (nil? (list-type-fn block)))] (cond-> block list?' ((fn [b] - (if db-based? - (assoc b :logseq.property/order-list-type list-type) - (update b :block/properties assoc :logseq.order-list-type list-type)))) - - (not db-based?) - (assoc :block/title (gp-property/insert-property repo format title :logseq.order-list-type list-type))))) + (assoc b :logseq.property/order-list-type list-type)))))) blocks) blocks))) @@ -615,13 +596,12 @@ (defn- build-insert-blocks-tx [db target-block blocks uuids get-new-id {:keys [sibling? outliner-op replace-empty-target? insert-template? keep-block-order?]}] - (let [db-based? (entity-plus/db-based-graph? db) - block-ids (set (map :block/uuid blocks)) + (let [block-ids (set (map :block/uuid blocks)) target-page (get-target-block-page target-block sibling?) orders (get-block-orders blocks target-block sibling? keep-block-order?)] (map-indexed (fn [idx {:block/keys [parent] :as block}] (when-let [uuid' (get uuids (:block/uuid block))] - (let [block (if db-based? (remove-disallowed-inline-classes db block) block) + (let [block (remove-disallowed-inline-classes db block) top-level? (= (:block/level block) 1) parent (compute-block-parent block parent target-block top-level? sibling? get-new-id outliner-op replace-empty-target? idx) @@ -790,11 +770,11 @@ to replace it, it defaults to be `false`. `update-timestamps?`: whether to update `blocks` timestamps. ``" - [repo db blocks target-block {:keys [_sibling? keep-uuid? keep-block-order? - outliner-op outliner-real-op replace-empty-target? update-timestamps? - insert-template?] - :as opts - :or {update-timestamps? true}}] + [db blocks target-block {:keys [_sibling? keep-uuid? keep-block-order? + outliner-op outliner-real-op replace-empty-target? update-timestamps? + insert-template?] + :as opts + :or {update-timestamps? true}}] {:pre [(seq blocks) (m/validate block-map-or-entity target-block)]} (let [blocks (cond->> @@ -828,16 +808,15 @@ (and sibling? (:block/title target-block) (string/blank? (:block/title target-block)) - (> (count blocks) 1))) - db-based? (sqlite-util/db-based-graph? repo)] + (> (count blocks) 1)))] (when (seq blocks) (let [blocks' (let [blocks' (blocks-with-level blocks)] - (cond->> (blocks-with-ordered-list-props repo blocks' target-block sibling?) + (cond->> (blocks-with-ordered-list-props blocks' target-block sibling?) update-timestamps? (mapv #(dissoc % :block/created-at :block/updated-at)) true (mapv block-with-timestamps) - db-based? + true (mapv #(-> % (dissoc :block/properties))))) insert-opts {:sibling? sibling? :replace-empty-target? replace-empty-target? @@ -999,8 +978,8 @@ (defn- move-blocks "Move `blocks` to `target-block` as siblings or children." - [_repo conn blocks target-block {:keys [_sibling? _top? _bottom? _up? outliner-op _indent?] - :as opts}] + [conn blocks target-block {:keys [_sibling? _top? _bottom? _up? outliner-op _indent?] + :as opts}] {:pre [(seq blocks) (m/validate block-map-or-entity target-block)]} (let [db @conn @@ -1039,7 +1018,7 @@ (defn- move-blocks-up-down "Move blocks up/down." - [repo conn blocks up?] + [conn blocks up?] {:pre [(seq blocks) (boolean? up?)]} (let [db @conn top-level-blocks (filter-top-level-blocks db blocks) @@ -1058,8 +1037,8 @@ (:db/id left-left)) (not (and (:logseq.property/created-from-property first-block) (nil? first-block-left-sibling)))) - (move-blocks repo conn top-level-blocks left-left (merge opts {:sibling? sibling? - :up? up?})))) + (move-blocks conn top-level-blocks left-left (merge opts {:sibling? sibling? + :up? up?})))) (let [last-top-block (last top-level-blocks) last-top-block-right (ldb/get-right-sibling last-top-block) @@ -1072,12 +1051,12 @@ (when (and right (not (and (:logseq.property/created-from-property last-top-block) (nil? last-top-block-right)))) - (move-blocks repo conn blocks right (merge opts {:sibling? sibling? - :up? up?}))))))) + (move-blocks conn blocks right (merge opts {:sibling? sibling? + :up? up?}))))))) (defn- ^:large-vars/cleanup-todo indent-outdent-blocks "Indent or outdent `blocks`." - [repo conn blocks indent? & {:keys [parent-original logical-outdenting?]}] + [conn blocks indent? & {:keys [parent-original logical-outdenting?]}] {:pre [(seq blocks) (boolean? indent?)]} (let [db @conn top-level-blocks (filter-top-level-blocks db blocks) @@ -1105,30 +1084,30 @@ (when (seq blocks') (if last-direct-child-id (let [last-direct-child (d/entity db last-direct-child-id) - result (move-blocks repo conn blocks' last-direct-child (merge opts {:sibling? true - :indent? true})) + result (move-blocks conn blocks' last-direct-child (merge opts {:sibling? true + :indent? true})) ;; expand `left` if it's collapsed collapsed-tx (when (:block/collapsed? left) {:tx-data [{:db/id (:db/id left) :block/collapsed? false}]})] (concat-tx-fn result collapsed-tx)) - (move-blocks repo conn blocks' left (merge opts {:sibling? false - :indent? true})))))) + (move-blocks conn blocks' left (merge opts {:sibling? false + :indent? true})))))) (if parent-original (let [blocks' (take-while (fn [b] (not= (:db/id (:block/parent b)) (:db/id (:block/parent parent)))) top-level-blocks)] - (move-blocks repo conn blocks' parent-original (merge opts {:outliner-op :indent-outdent-blocks - :sibling? true - :indent? false}))) + (move-blocks conn blocks' parent-original (merge opts {:outliner-op :indent-outdent-blocks + :sibling? true + :indent? false}))) (when parent (let [blocks' (take-while (fn [b] (not= (:db/id (:block/parent b)) (:db/id (:block/parent parent)))) top-level-blocks) - result (move-blocks repo conn blocks' parent (merge opts {:sibling? true}))] + result (move-blocks conn blocks' parent (merge opts {:sibling? true}))] (if logical-outdenting? result ;; direct outdenting (default behavior) @@ -1136,8 +1115,8 @@ right-siblings (get-right-siblings last-top-block)] (if (seq right-siblings) (if-let [last-direct-child-id (ldb/get-block-last-direct-child-id db (:db/id last-top-block))] - (move-blocks repo conn right-siblings (d/entity db last-direct-child-id) (merge opts {:sibling? true})) - (move-blocks repo conn right-siblings last-top-block (merge opts {:sibling? false}))) + (move-blocks conn right-siblings (d/entity db last-direct-child-id) (merge opts {:sibling? true})) + (move-blocks conn right-siblings last-top-block (merge opts {:sibling? false}))) result))))))))))) ;;; ### write-operations have side-effects (do transactions) ;;;;;;;;;;;;;;;; @@ -1150,44 +1129,45 @@ (when result (let [tx-meta (assoc (:tx-meta result) :outliner-op outliner-op)] - (ldb/transact! (second args) (:tx-data result) tx-meta))) + (ldb/transact! (first args) (:tx-data result) tx-meta))) result) (catch :default e + (js/console.error e) (when-not (= "not-allowed-move-block-page" (ex-message e)) (throw e))))) -(let [f (fn [repo conn date-formatter block opts] - (save-block repo @conn date-formatter block opts))] +(let [f (fn [conn block opts] + (save-block @conn block opts))] (defn save-block! - [repo conn date-formatter block & {:as opts}] - (op-transact! :save-block f repo conn date-formatter block opts))) + [conn block & {:as opts}] + (op-transact! :save-block f conn block opts))) -(let [f (fn [repo conn blocks target-block opts] - (insert-blocks repo @conn blocks target-block opts))] +(let [f (fn [conn blocks target-block opts] + (insert-blocks @conn blocks target-block opts))] (defn insert-blocks! - [repo conn blocks target-block opts] - (op-transact! :insert-blocks f repo conn blocks target-block + [conn blocks target-block opts] + (op-transact! :insert-blocks f conn blocks target-block (if (:outliner-op opts) opts (assoc opts :outliner-op :insert-blocks))))) -(let [f (fn [_repo conn blocks _opts] +(let [f (fn [conn blocks _opts] (delete-blocks @conn blocks))] (defn delete-blocks! - [repo conn _date-formatter blocks opts] - (op-transact! :delete-blocks f repo conn blocks opts))) + [conn blocks opts] + (op-transact! :delete-blocks f conn blocks opts))) (defn move-blocks! - [repo conn blocks target-block opts] - (op-transact! :move-blocks move-blocks repo conn blocks target-block + [conn blocks target-block opts] + (op-transact! :move-blocks move-blocks conn blocks target-block (if (:outliner-op opts) opts (assoc opts :outliner-op :move-blocks)))) (defn move-blocks-up-down! - [repo conn blocks up?] - (op-transact! :move-blocks-up-down move-blocks-up-down repo conn blocks up?)) + [conn blocks up?] + (op-transact! :move-blocks-up-down move-blocks-up-down conn blocks up?)) (defn indent-outdent-blocks! - [repo conn blocks indent? & {:as opts}] - (op-transact! :indent-outdent-blocks indent-outdent-blocks repo conn blocks indent? opts)) + [conn blocks indent? & {:as opts}] + (op-transact! :indent-outdent-blocks indent-outdent-blocks conn blocks indent? opts)) diff --git a/deps/outliner/src/logseq/outliner/op.cljs b/deps/outliner/src/logseq/outliner/op.cljs index 0dd893c890..7f39ee0845 100644 --- a/deps/outliner/src/logseq/outliner/op.cljs +++ b/deps/outliner/src/logseq/outliner/op.cljs @@ -1,7 +1,6 @@ (ns logseq.outliner.op "Transact outliner ops" - (:require [clojure.string :as string] - [datascript.core :as d] + (:require [datascript.core :as d] [logseq.db :as ldb] [logseq.db.sqlite.export :as sqlite-export] [logseq.outliner.core :as outliner-core] @@ -169,53 +168,49 @@ (reset! *result {:error (str "Unexpected Import EDN error: " (pr-str (ex-message e)))})))))) (defn ^:large-vars/cleanup-todo apply-ops! - [repo conn ops date-formatter opts] + [conn ops opts] (assert (ops-validator ops) ops) (let [opts' (assoc opts :transact-opts {:conn conn} :local-tx? true) - *result (atom nil) - db-based? (ldb/db-based-graph? @conn)] + *result (atom nil)] (outliner-tx/transact! opts' (doseq [[op args] ops] - (when-not db-based? - (assert (not (or (string/includes? (name op) "property") (string/includes? (name op) "closed-value"))) - (str "Property related ops are only for db based graphs, ops: " ops))) (case op ;; blocks :save-block - (apply outliner-core/save-block! repo conn date-formatter args) + (apply outliner-core/save-block! conn args) :insert-blocks (let [[blocks target-block-id opts] args] (when-let [target-block (d/entity @conn target-block-id)] - (let [result (outliner-core/insert-blocks! repo conn blocks target-block opts)] + (let [result (outliner-core/insert-blocks! conn blocks target-block opts)] (reset! *result result)))) :delete-blocks (let [[block-ids opts] args blocks (keep #(d/entity @conn %) block-ids)] - (outliner-core/delete-blocks! repo conn date-formatter blocks (merge opts opts'))) + (outliner-core/delete-blocks! conn blocks (merge opts opts'))) :move-blocks (let [[block-ids target-block-id opts] args blocks (keep #(d/entity @conn %) block-ids) target-block (d/entity @conn target-block-id)] (when (and target-block (seq blocks)) - (outliner-core/move-blocks! repo conn blocks target-block opts))) + (outliner-core/move-blocks! conn blocks target-block opts))) :move-blocks-up-down (let [[block-ids up?] args blocks (keep #(d/entity @conn %) block-ids)] (when (seq blocks) - (outliner-core/move-blocks-up-down! repo conn blocks up?))) + (outliner-core/move-blocks-up-down! conn blocks up?))) :indent-outdent-blocks (let [[block-ids indent? opts] args blocks (keep #(d/entity @conn %) block-ids)] (when (seq blocks) - (outliner-core/indent-outdent-blocks! repo conn blocks indent? opts))) + (outliner-core/indent-outdent-blocks! conn blocks indent? opts))) ;; properties :upsert-property @@ -264,6 +259,6 @@ (apply ldb/transact! conn args) (when-let [handler (get @*op-handlers op)] - (reset! *result (handler repo conn args)))))) + (reset! *result (handler conn args)))))) @*result)) diff --git a/deps/outliner/src/logseq/outliner/page.cljs b/deps/outliner/src/logseq/outliner/page.cljs index 3202da624d..92c7f9e016 100644 --- a/deps/outliner/src/logseq/outliner/page.cljs +++ b/deps/outliner/src/logseq/outliner/page.cljs @@ -313,9 +313,9 @@ page-txs) tx-meta (cond-> {:persist-op? persist-op? :outliner-op :create-page} - today-journal? - (assoc :create-today-journal? true - :today-journal-name title))] + today-journal? + (assoc :create-today-journal? true + :today-journal-name title))] {:tx-meta tx-meta :tx-data txs :title title diff --git a/deps/outliner/src/logseq/outliner/tree.cljs b/deps/outliner/src/logseq/outliner/tree.cljs index 9de5fb3f34..a24275b6f2 100644 --- a/deps/outliner/src/logseq/outliner/tree.cljs +++ b/deps/outliner/src/logseq/outliner/tree.cljs @@ -6,7 +6,7 @@ [logseq.db.common.property-util :as db-property-util])) (defprotocol INode - (-save [this *txs-state conn repo date-formatter opts]) + (-save [this *txs-state conn opts]) (-del [this *txs-state db])) (defn- blocks->vec-tree-aux diff --git a/deps/outliner/test/logseq/outliner/core_test.cljs b/deps/outliner/test/logseq/outliner/core_test.cljs index 0353e8eee5..ef2f1d1584 100644 --- a/deps/outliner/test/logseq/outliner/core_test.cljs +++ b/deps/outliner/test/logseq/outliner/core_test.cljs @@ -13,7 +13,7 @@ property-value (:user.property/default (db-test/find-block-by-content @conn "b1")) _ (assert (:db/id property-value)) block (db-test/find-block-by-content @conn "b1")] - (outliner-core/delete-blocks! nil conn nil [block] {}) + (outliner-core/delete-blocks! conn [block] {}) (is (nil? (db-test/find-block-by-content @conn "b1"))) (is (nil? (db-test/find-block-by-content @conn "test block")))))) @@ -32,7 +32,7 @@ :block/parent (:db/id page1)}]) b3 (db-test/find-block-by-content @conn "b3") b4 (db-test/find-block-by-content @conn "b4")] - (outliner-core/delete-blocks! nil conn nil [b3 b4 page2] {}) + (outliner-core/delete-blocks! conn [b3 b4 page2] {}) (is (some? (db-test/find-block-by-content @conn "b3"))) (is (some? (db-test/find-block-by-content @conn "b4"))) (let [page2' (ldb/get-page @conn "page2")] diff --git a/deps/publishing/src/logseq/publishing/export.cljs b/deps/publishing/src/logseq/publishing/export.cljs index d764f3da14..0bff45a96c 100644 --- a/deps/publishing/src/logseq/publishing/export.cljs +++ b/deps/publishing/src/logseq/publishing/export.cljs @@ -8,7 +8,7 @@ (def ^:api js-files "js files from publishing release build" - (->> ["main.js" "code-editor.js" "excalidraw.js" "tldraw.js"] + (->> ["main.js" "code-editor.js"] ;; Add source maps for all js files as it doesn't affect initial load time (mapcat #(vector % (str % ".map"))) vec)) diff --git a/gulpfile.js b/gulpfile.js index df1345186d..bd94899714 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -65,10 +65,6 @@ const common = { // NOTE: All assets from node_modules are copied to the output directory syncAssetFiles (...params) { return gulp.series( - () => gulp.src([ - './node_modules/@excalidraw/excalidraw/dist/excalidraw-assets/**', - '!**/*/i18n-*.js', - ]).pipe(gulp.dest(path.join(outputPath, 'js', 'excalidraw-assets'))), () => gulp.src([ 'node_modules/katex/dist/katex.min.js', 'node_modules/katex/dist/contrib/mhchem.min.js', diff --git a/ios/App/App/FsWatcher.swift b/ios/App/App/FsWatcher.swift index ecebec013b..20441d51f7 100644 --- a/ios/App/App/FsWatcher.swift +++ b/ios/App/App/FsWatcher.swift @@ -98,7 +98,7 @@ extension URL { } func shouldNotifyWithContent() -> Bool { - let allowedPathExtensions: Set = ["md", "markdown", "org", "js", "edn", "css", "excalidraw"] + let allowedPathExtensions: Set = ["md", "markdown", "org", "js", "edn", "css"] if allowedPathExtensions.contains(self.pathExtension.lowercased()) { return true } diff --git a/libs/src/LSPlugin.ts b/libs/src/LSPlugin.ts index 05d7fc2e56..d7da70fd08 100644 --- a/libs/src/LSPlugin.ts +++ b/libs/src/LSPlugin.ts @@ -283,8 +283,6 @@ export type ExternalCommandType = | 'logseq.editor/up' | 'logseq.editor/expand-block-children' | 'logseq.editor/collapse-block-children' - | 'logseq.editor/open-file-in-default-app' - | 'logseq.editor/open-file-in-directory' | 'logseq.editor/select-all-blocks' | 'logseq.editor/toggle-open-blocks' | 'logseq.editor/zoom-in' diff --git a/package.json b/package.json index 0d1cf1976e..0ee4089e00 100644 --- a/package.json +++ b/package.json @@ -102,10 +102,9 @@ "cljs:lint": "clojure -M:clj-kondo --parallel --lint src --cache false", "ios:dev": "cross-env PLATFORM=ios gulp cap", "android:dev": "cross-env PLATFORM=android gulp cap", - "tldraw:build": "yarn --cwd packages/tldraw install", "amplify:build": "yarn --cwd packages/amplify install", "ui:build": "yarn --cwd packages/ui install", - "postinstall": "yarn tldraw:build && yarn ui:build" + "postinstall": "yarn ui:build" }, "dependencies": { "@aparajita/capacitor-secure-storage": "^7.1.6", @@ -131,7 +130,6 @@ "@dnd-kit/sortable": "^7.0.2", "@emoji-mart/data": "^1.1.2", "@emoji-mart/react": "^1.1.1", - "@excalidraw/excalidraw": "0.16.1", "@glidejs/glide": "^3.6.0", "@highlightjs/cdn-assets": "10.4.1", "@huggingface/transformers": "^3.6.3", @@ -139,7 +137,6 @@ "@js-joda/core": "3.2.0", "@js-joda/locale_en-us": "3.1.1", "@js-joda/timezone": "2.5.0", - "@logseq/diff-merge": "^0.2.2", "@logseq/react-tweet-embed": "1.3.1-1", "@logseq/simple-wave-record": "^0.0.3", "@radix-ui/colors": "^0.1.8", @@ -150,13 +147,11 @@ "@tabler/icons-webfont": "^2.47.0", "@tippyjs/react": "4.2.5", "bignumber.js": "^9.0.2", - "check-password-strength": "2.0.7", "chokidar": "3.5.1", "chrono-node": "2.2.4", "codemirror": "5.65.18", "comlink": "^4.4.1", "d3-force": "3.0.0", - "diff": "5.0.0", "dompurify": "2.4.0", "emoji-mart": "^5.5.2", "fs": "0.0.1-security", diff --git a/packages/tldraw/.editorconfig b/packages/tldraw/.editorconfig deleted file mode 100644 index aabed14a9c..0000000000 --- a/packages/tldraw/.editorconfig +++ /dev/null @@ -1,19 +0,0 @@ - -# https://editorconfig.org -root = true - -[*] -charset = utf-8 -end_of_line = lf -indent_size = 2 -indent_style = space -insert_final_newline = true -max_line_length = 80 -trim_trailing_whitespace = true - -[*.md] -max_line_length = 0 -trim_trailing_whitespace = false - -[COMMIT_EDITMSG] -max_line_length = 0 diff --git a/packages/tldraw/.eslintignore b/packages/tldraw/.eslintignore deleted file mode 100644 index 35e915e521..0000000000 --- a/packages/tldraw/.eslintignore +++ /dev/null @@ -1,3 +0,0 @@ -**/node_modules/* -**/out/* -**/.next/* diff --git a/packages/tldraw/.eslintrc b/packages/tldraw/.eslintrc deleted file mode 100644 index 0e6ee81969..0000000000 --- a/packages/tldraw/.eslintrc +++ /dev/null @@ -1,19 +0,0 @@ -{ - "root": true, - "parser": "@typescript-eslint/parser", - "plugins": ["@typescript-eslint"], - "extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended"], - "ignorePatterns": ["*.js", "*.jsx"], - "overrides": [ - { - // enable the rule specifically for TypeScript files - "files": ["*.ts", "*.tsx"], - "rules": { - "@typescript-eslint/explicit-module-boundary-types": "off", - "@typescript-eslint/explicit-function-return-type": "off", - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/camelcase": "off" - } - } - ] -} diff --git a/packages/tldraw/.gitattributes b/packages/tldraw/.gitattributes deleted file mode 100644 index dfe0770424..0000000000 --- a/packages/tldraw/.gitattributes +++ /dev/null @@ -1,2 +0,0 @@ -# Auto detect text files and perform LF normalization -* text=auto diff --git a/packages/tldraw/.gitignore b/packages/tldraw/.gitignore deleted file mode 100644 index 3da5ab6569..0000000000 --- a/packages/tldraw/.gitignore +++ /dev/null @@ -1,17 +0,0 @@ -node_modules/ -build/ -dist/ -docs/ -.idea/* - -.DS_Store -coverage -*.log - -.vercel -.next -apps/www/public/workbox-* -apps/www/public/worker-* -apps/www/public/sw.js -apps/www/public/sw.js.map -.env diff --git a/packages/tldraw/.npmignore b/packages/tldraw/.npmignore deleted file mode 100644 index 2da1930682..0000000000 --- a/packages/tldraw/.npmignore +++ /dev/null @@ -1,17 +0,0 @@ -/.github/ -/.vscode/ -/node_modules/ -/build/ -/tmp/ -.idea/* -/docs/ - -coverage -*.log -.gitlab-ci.yml - -package-lock.json -/*.tgz -/tmp* -/mnt/ -/package/ diff --git a/packages/tldraw/.prettierrc b/packages/tldraw/.prettierrc deleted file mode 100644 index 9538bf752c..0000000000 --- a/packages/tldraw/.prettierrc +++ /dev/null @@ -1,11 +0,0 @@ -{ - "trailingComma": "es5", - "singleQuote": true, - "semi": false, - "printWidth": 100, - "tabWidth": 2, - "useTabs": false, - "jsxSingleQuote": false, - "jsxBracketSameLine": false, - "arrowParens": "avoid" -} diff --git a/packages/tldraw/LICENSE.md b/packages/tldraw/LICENSE.md deleted file mode 100644 index bdcc8b850f..0000000000 --- a/packages/tldraw/LICENSE.md +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2021 Stephen Ruiz Ltd - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/packages/tldraw/README.md b/packages/tldraw/README.md deleted file mode 100644 index 84f73a3765..0000000000 --- a/packages/tldraw/README.md +++ /dev/null @@ -1,29 +0,0 @@ -# Developer Notes - -## Background - -This folder contains the JS codes for a custom build of Tldraw to fit the needs of Logseq, which originates from an abandoned next branch from the author of Tldraw. - -## Development - -### Prerequisites - -Modern JS eco tools like Node.js and yarn. - -### Run in dev mode - -- install dependencies with `yarn` -- run dev mode with `yarn dev`, which will start a Vite server at http://127.0.0.1:3031/ - -Note, the dev mode is a standalone web app running a demo Tldraw app in `tldraw/demo/src/App.jsx`. The Logseq component renderers and handlers are all mocked to make sure Tldraw only functions can be isolatedly developed. - -## Other useful commands - -- fixing styles: `yarn fix:style` -- build: `yarn build` - -## How it works - -### Data flow between Tldraw & Logseq - -The data flow between Tldraw & Logseq can be found here: https://whimsical.com/9sdt5j7MabK6DVrxgTZw25 diff --git a/packages/tldraw/apps/tldraw-logseq/README.md b/packages/tldraw/apps/tldraw-logseq/README.md deleted file mode 100644 index 3f6831be85..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# @tldraw/core Simple Example - -A (relatively) simple example project for `@tldraw/core`. diff --git a/packages/tldraw/apps/tldraw-logseq/build.mjs b/packages/tldraw/apps/tldraw-logseq/build.mjs deleted file mode 100644 index a95bc7d66a..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/build.mjs +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env zx -/* eslint-disable no-undef */ -import 'zx/globals' -import fs from 'fs' -import path from 'path' - -if (process.platform === 'win32') { - defaults.shell = "cmd.exe"; - defaults.prefix = ""; -} - -// Build with [tsup](https://tsup.egoist.sh) -await $`npx tsup` - - -// Prepare package.json file -const packageJson = fs.readFileSync('package.json', 'utf8') -const glob = JSON.parse(packageJson) -Object.assign(glob, { - main: './index.js', - module: './index.mjs', -}) - -fs.writeFileSync('dist/package.json', JSON.stringify(glob, null, 2)) - -const dest = path.join(__dirname, '/../../../../src/main/frontend/tldraw-logseq.js') - -if (fs.existsSync(dest)) fs.unlinkSync(dest) -fs.linkSync(path.join(__dirname, '/dist/index.js'), dest) diff --git a/packages/tldraw/apps/tldraw-logseq/package.json b/packages/tldraw/apps/tldraw-logseq/package.json deleted file mode 100644 index 630b89daab..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/package.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "version": "0.0.0-dev", - "name": "@tldraw/logseq", - "license": "MIT", - "module": "./src/index.ts", - "scripts": { - "build": "zx build.mjs", - "build:packages": "yarn build", - "dev": "tsup --watch", - "dev:vite": "tsup --watch --sourcemap inline" - }, - "devDependencies": { - "@radix-ui/react-context-menu": "^2.1.0", - "@tldraw/core": "2.0.0-alpha.1", - "@tldraw/react": "2.0.0-alpha.1", - "@tldraw/vec": "2.0.0-alpha.1", - "@types/node": "^18.13.0", - "@types/react": "^17.0.0", - "@types/react-dom": "^17.0.0", - "autoprefixer": "^10.4.13", - "concurrently": "^7.5.0", - "esbuild": "^0.15.14", - "mobx": "^6.7.0", - "mobx-react-lite": "^3.4.0", - "perfect-freehand": "^1.2.0", - "polished": "^4.0.0", - "postcss": "^8.4.19", - "lucide-react": "^0.292.0", - "react": "^17.0.0", - "react-dom": "^17.0.0", - "react-virtuoso": "^3.1.3", - "rimraf": "3.0.2", - "shadow-cljs": "^2.20.11", - "tsup": "^6.5.0", - "typescript": "^4.9.3", - "zx": "^7.2.2" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } -} \ No newline at end of file diff --git a/packages/tldraw/apps/tldraw-logseq/postcss.config.js b/packages/tldraw/apps/tldraw-logseq/postcss.config.js deleted file mode 100644 index 73536e0696..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/postcss.config.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = ctx => ({ - plugins: [require('autoprefixer')()], -}) diff --git a/packages/tldraw/apps/tldraw-logseq/src/app.tsx b/packages/tldraw/apps/tldraw-logseq/src/app.tsx deleted file mode 100644 index ce0a78b215..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/app.tsx +++ /dev/null @@ -1,148 +0,0 @@ -/* eslint-disable @typescript-eslint/no-non-null-assertion */ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import type { TLDocumentModel } from '@tldraw/core' -import { - AppCanvas, - AppProvider, - TLReactCallbacks, - TLReactToolConstructor, - useApp, -} from '@tldraw/react' -import * as React from 'react' -import { AppUI } from './components/AppUI' -import { ContextBar } from './components/ContextBar' -import { ContextMenu } from './components/ContextMenu' -import { QuickLinks } from './components/QuickLinks' -import { useDrop } from './hooks/useDrop' -import { usePaste } from './hooks/usePaste' -import { useCopy } from './hooks/useCopy' -import { useQuickAdd } from './hooks/useQuickAdd' -import { - BoxTool, - EllipseTool, - HighlighterTool, - HTMLTool, - IFrameTool, - LineTool, - LogseqPortalTool, - NuEraseTool, - PencilTool, - PolygonTool, - shapes, - TextTool, - YouTubeTool, - type Shape, -} from './lib' -import { LogseqContext, type LogseqContextValue } from './lib/logseq-context' - -const tools: TLReactToolConstructor[] = [ - BoxTool, - EllipseTool, - PolygonTool, - NuEraseTool, - HighlighterTool, - LineTool, - PencilTool, - TextTool, - YouTubeTool, - IFrameTool, - HTMLTool, - LogseqPortalTool, -] - -interface LogseqTldrawProps { - renderers: LogseqContextValue['renderers'] - handlers: LogseqContextValue['handlers'] - readOnly: boolean - model?: TLDocumentModel - onMount?: TLReactCallbacks['onMount'] - onPersist?: TLReactCallbacks['onPersist'] -} - -const BacklinksCount: LogseqContextValue['renderers']['BacklinksCount'] = props => { - const { renderers } = React.useContext(LogseqContext) - - const options = { 'portal?': false } - - return -} - -const AppImpl = () => { - const ref = React.useRef(null) - const app = useApp() - - const components = React.useMemo( - () => ({ - ContextBar, - BacklinksCount, - QuickLinks, - }), - [] - ) - return ( - -
- - - -
-
- ) -} - -const AppInner = ({ - onPersist, - readOnly, - model, - ...rest -}: Omit) => { - const onDrop = useDrop() - const onPaste = usePaste() - const onCopy = useCopy() - const onQuickAdd = readOnly ? null : useQuickAdd() - - const onPersistOnDiff: TLReactCallbacks['onPersist'] = React.useCallback( - (app, info) => { - onPersist?.(app, info) - }, - [model] - ) - - return ( - - - - ) -} - -export const App = function App({ renderers, handlers, ...rest }: LogseqTldrawProps): JSX.Element { - const memoRenders: any = React.useMemo(() => { - return Object.fromEntries( - Object.entries(renderers).map(([key, comp]) => { - return [key, React.memo(comp)] - }) - ) - }, []) - - const contextValue = { - renderers: memoRenders, - handlers: handlers, - } - - return ( - - - - ) -} diff --git a/packages/tldraw/apps/tldraw-logseq/src/components/ActionBar/ActionBar.tsx b/packages/tldraw/apps/tldraw-logseq/src/components/ActionBar/ActionBar.tsx deleted file mode 100644 index eccc182877..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/components/ActionBar/ActionBar.tsx +++ /dev/null @@ -1,113 +0,0 @@ -/* eslint-disable @typescript-eslint/no-non-null-assertion */ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import { useApp } from '@tldraw/react' -import { observer } from 'mobx-react-lite' -import * as React from 'react' -import type { Shape } from '../../lib' -import { TablerIcon } from '../icons' -import { Button } from '../Button' -import { ToggleInput } from '../inputs/ToggleInput' -import { ZoomMenu } from '../ZoomMenu' -import { LogseqContext } from '../../lib/logseq-context' - -// @ts-ignore -const LSUI = window.LSUI - -export const ActionBar = observer(function ActionBar(): JSX.Element { - const app = useApp() - const { - handlers: { t }, - } = React.useContext(LogseqContext) - - const undo = React.useCallback(() => { - app.api.undo() - }, [app]) - - const redo = React.useCallback(() => { - app.api.redo() - }, [app]) - - const zoomIn = React.useCallback(() => { - app.api.zoomIn() - }, [app]) - - const zoomOut = React.useCallback(() => { - app.api.zoomOut() - }, [app]) - - const toggleGrid = React.useCallback(() => { - app.api.toggleGrid() - }, [app]) - - const toggleSnapToGrid = React.useCallback(() => { - app.api.toggleSnapToGrid() - }, [app]) - - const togglePenMode = React.useCallback(() => { - app.api.togglePenMode() - }, [app]) - - return ( -
- {!app.readOnly && ( -
- - -
- )} - -
- - - - -
- -
- - - - - {!app.readOnly && ( - - - - )} -
- - {!app.readOnly && ( -
- - - -
- )} -
- ) -}) diff --git a/packages/tldraw/apps/tldraw-logseq/src/components/ActionBar/index.ts b/packages/tldraw/apps/tldraw-logseq/src/components/ActionBar/index.ts deleted file mode 100644 index a0c738608b..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/components/ActionBar/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './ActionBar' diff --git a/packages/tldraw/apps/tldraw-logseq/src/components/AppUI.tsx b/packages/tldraw/apps/tldraw-logseq/src/components/AppUI.tsx deleted file mode 100644 index d69bffb2d7..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/components/AppUI.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import { observer } from 'mobx-react-lite' -import { ActionBar } from './ActionBar' -import { DevTools } from './Devtools' -import { PrimaryTools } from './PrimaryTools' -import { StatusBar } from './StatusBar' -import { isDev } from '@tldraw/core' -import { useApp } from '@tldraw/react' - -export const AppUI = observer(function AppUI() { - const app = useApp() - - return ( - <> - {isDev() && } - {isDev() && } - {!app.readOnly && } - - - ) -}) diff --git a/packages/tldraw/apps/tldraw-logseq/src/components/BlockLink/BlockLink.tsx b/packages/tldraw/apps/tldraw-logseq/src/components/BlockLink/BlockLink.tsx deleted file mode 100644 index 198b839477..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/components/BlockLink/BlockLink.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import { validUUID } from '@tldraw/core' -import React from 'react' -import { LogseqContext } from '../../lib/logseq-context' -import { TablerIcon } from '../icons' - -export const BlockLink = ({ - id, - showReferenceContent = false, -}: { - id: string - showReferenceContent?: boolean -}) => { - const { - handlers: { isWhiteboardPage, redirectToPage, sidebarAddBlock, queryBlockByUUID }, - renderers: { Breadcrumb, PageName }, - } = React.useContext(LogseqContext) - - let iconName = '' - let linkType = validUUID(id) ? 'B' : 'P' - let blockContent = '' - - if (validUUID(id)) { - const block = queryBlockByUUID(id) - if (!block) { - return Invalid reference. Did you remove it? - } - - blockContent = block.title - - if (block.properties?.['ls-type'] === 'whiteboard-shape') { - iconName = 'link-to-whiteboard' - } else { - iconName = 'link-to-block' - } - } else { - if (isWhiteboardPage(id)) { - iconName = 'link-to-whiteboard' - } else { - iconName = 'link-to-page' - } - } - - const slicedContent = - blockContent && blockContent.length > 23 ? blockContent.slice(0, 20) + '...' : blockContent - - return ( - - ) -} diff --git a/packages/tldraw/apps/tldraw-logseq/src/components/BlockLink/index.ts b/packages/tldraw/apps/tldraw-logseq/src/components/BlockLink/index.ts deleted file mode 100644 index 7a42d8e6c4..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/components/BlockLink/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './BlockLink' diff --git a/packages/tldraw/apps/tldraw-logseq/src/components/Button/Button.tsx b/packages/tldraw/apps/tldraw-logseq/src/components/Button/Button.tsx deleted file mode 100644 index e6becce8c2..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/components/Button/Button.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { Tooltip } from '../Tooltip' -import type { Side } from '@radix-ui/react-popper' -export interface ButtonProps extends React.ButtonHTMLAttributes { - children: React.ReactNode - tooltip?: React.ReactNode - tooltipSide?: Side -} - -export function Button({ className, tooltip, tooltipSide, ...rest }: ButtonProps) { - return ( - - - ) -} diff --git a/packages/tldraw/apps/tldraw-logseq/src/components/Button/index.ts b/packages/tldraw/apps/tldraw-logseq/src/components/Button/index.ts deleted file mode 100644 index 9a7dca3d31..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/components/Button/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './Button' -export * from './CircleButton' diff --git a/packages/tldraw/apps/tldraw-logseq/src/components/ContextBar/ContextBar.tsx b/packages/tldraw/apps/tldraw-logseq/src/components/ContextBar/ContextBar.tsx deleted file mode 100644 index a1b0db837f..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/components/ContextBar/ContextBar.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import { - getContextBarTranslation, - HTMLContainer, - TLContextBarComponent, - useApp, -} from '@tldraw/react' -import { observer } from 'mobx-react-lite' - -import * as React from 'react' -import type { Shape } from '../../lib' -import { getContextBarActionsForShapes } from './contextBarActionFactory' - -// @ts-ignore -const LSUI = window.LSUI - -const _ContextBar: TLContextBarComponent = ({ shapes, offsets, hidden }) => { - const app = useApp() - const rSize = React.useRef<[number, number] | null>(null) - const rContextBar = React.useRef(null) - - React.useLayoutEffect(() => { - setTimeout(() => { - const elm = rContextBar.current - if (!elm) return - const { offsetWidth, offsetHeight } = elm - rSize.current = [offsetWidth, offsetHeight] - }) - }) - - React.useLayoutEffect(() => { - const elm = rContextBar.current - if (!elm) return - const size = rSize.current ?? [0, 0] - const [x, y] = getContextBarTranslation(size, offsets) - elm.style.transform = `translateX(${x}px) translateY(${y}px)` - }, [offsets]) - - if (!app) return null - - const Actions = getContextBarActionsForShapes(shapes) - - return ( - - {Actions.length > 0 && ( - - )} - - ) -} - -export const ContextBar = observer(_ContextBar) diff --git a/packages/tldraw/apps/tldraw-logseq/src/components/ContextBar/contextBarActionFactory.tsx b/packages/tldraw/apps/tldraw-logseq/src/components/ContextBar/contextBarActionFactory.tsx deleted file mode 100644 index 086caf44b8..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/components/ContextBar/contextBarActionFactory.tsx +++ /dev/null @@ -1,560 +0,0 @@ -import { Decoration, isNonNullable } from '@tldraw/core' -import { useApp } from '@tldraw/react' -import { observer } from 'mobx-react-lite' -import React from 'react' -import type { - BoxShape, - EllipseShape, - HTMLShape, - IFrameShape, - LineShape, - LogseqPortalShape, - PencilShape, - PolygonShape, - Shape, - TextShape, - YouTubeShape, - TweetShape, -} from '../../lib' -import { Button } from '../Button' -import { TablerIcon } from '../icons' -import { ColorInput } from '../inputs/ColorInput' -import { ScaleInput } from '../inputs/ScaleInput' -import { ShapeLinksInput } from '../inputs/ShapeLinksInput' -import { TextInput } from '../inputs/TextInput' -import { - ToggleGroupInput, - ToggleGroupMultipleInput, - type ToggleGroupInputOption, -} from '../inputs/ToggleGroupInput' -import { ToggleInput } from '../inputs/ToggleInput' -import { GeometryTools } from '../GeometryTools' -import { LogseqContext } from '../../lib/logseq-context' -import { KeyboardShortcut } from '../KeyboardShortcut' - -export const contextBarActionTypes = [ - // Order matters - 'EditPdf', - 'LogseqPortalViewMode', - 'Geometry', - 'AutoResizing', - 'Swatch', - 'NoFill', - 'StrokeType', - 'ScaleLevel', - 'TextStyle', - 'YoutubeLink', - 'TwitterLink', - 'IFrameSource', - 'ArrowMode', - 'Links', -] as const - -type ContextBarActionType = typeof contextBarActionTypes[number] -const singleShapeActions: ContextBarActionType[] = [ - 'YoutubeLink', - 'TwitterLink', - 'IFrameSource', - 'Links', - 'EditPdf', -] - -const contextBarActionMapping = new Map() - -type ShapeType = Shape['props']['type'] - -export const shapeMapping: Record = { - 'logseq-portal': ['Swatch', 'LogseqPortalViewMode', 'ScaleLevel', 'AutoResizing', 'Links'], - youtube: ['YoutubeLink', 'Links'], - tweet: ['TwitterLink', 'Links'], - iframe: ['IFrameSource', 'Links'], - box: ['Geometry', 'TextStyle', 'Swatch', 'ScaleLevel', 'NoFill', 'StrokeType', 'Links'], - ellipse: ['Geometry', 'TextStyle', 'Swatch', 'ScaleLevel', 'NoFill', 'StrokeType', 'Links'], - polygon: ['Geometry', 'TextStyle', 'Swatch', 'ScaleLevel', 'NoFill', 'StrokeType', 'Links'], - line: ['TextStyle', 'Swatch', 'ScaleLevel', 'ArrowMode', 'Links'], - pencil: ['Swatch', 'Links', 'ScaleLevel'], - highlighter: ['Swatch', 'Links', 'ScaleLevel'], - text: ['TextStyle', 'Swatch', 'ScaleLevel', 'AutoResizing', 'Links'], - html: ['ScaleLevel', 'AutoResizing', 'Links'], - image: ['Links'], - video: ['Links'], - pdf: ['EditPdf', 'Links'], -} - -export const withFillShapes = Object.entries(shapeMapping) - .filter(([key, types]) => { - return types.includes('NoFill') && types.includes('Swatch') - }) - .map(([key]) => key) as ShapeType[] - -function filterShapeByAction(type: ContextBarActionType) { - const app = useApp() - const unlockedSelectedShapes = app.selectedShapesArray.filter(s => !s.props.isLocked) - return unlockedSelectedShapes.filter(shape => shapeMapping[shape.props.type]?.includes(type)) -} - -const AutoResizingAction = observer(() => { - const app = useApp() - const { - handlers: { t }, - } = React.useContext(LogseqContext) - const shapes = filterShapeByAction('AutoResizing') - - const pressed = shapes.every(s => s.props.isAutoResizing) - - return ( - s.props.type === 'logseq-portal')} - className="tl-button" - pressed={pressed} - onPressedChange={v => { - shapes.forEach(s => { - if (s.props.type === 'logseq-portal') { - s.update({ - isAutoResizing: v, - }) - } else { - s.onResetBounds({ zoom: app.viewport.camera.zoom }) - } - }) - app.persist() - }} - > - - - ) -}) - -const LogseqPortalViewModeAction = observer(() => { - const app = useApp() - const { - handlers: { t }, - } = React.useContext(LogseqContext) - const shapes = filterShapeByAction('LogseqPortalViewMode') - - const collapsed = shapes.every(s => s.collapsed) - if (!collapsed && !shapes.every(s => !s.collapsed)) { - return null - } - - const tooltip = ( -
- {collapsed ? t('whiteboard/expand') : t('whiteboard/collapse')} - -
- ) - - return ( - s.props.type === 'logseq-portal')} - className="tl-button" - pressed={collapsed} - onPressedChange={() => app.api.setCollapsed(!collapsed)} - > - - - ) -}) - -const ScaleLevelAction = observer(() => { - const { - handlers: { isMobile }, - } = React.useContext(LogseqContext) - - const shapes = filterShapeByAction('ScaleLevel') - const scaleLevel = new Set(shapes.map(s => s.scaleLevel)).size > 1 ? '' : shapes[0].scaleLevel - - return -}) - -const IFrameSourceAction = observer(() => { - const app = useApp() - const { - handlers: { t }, - } = React.useContext(LogseqContext) - const shape = filterShapeByAction('IFrameSource')[0] - - const handleChange = React.useCallback((e: React.ChangeEvent) => { - shape.onIFrameSourceChange(e.target.value.trim().toLowerCase()) - app.persist() - }, []) - - const handleReload = React.useCallback(() => { - shape.reload() - }, []) - - return ( - - - - - - ) -}) - -const YoutubeLinkAction = observer(() => { - const app = useApp() - const { - handlers: { t }, - } = React.useContext(LogseqContext) - const shape = filterShapeByAction('YoutubeLink')[0] - const handleChange = React.useCallback((e: React.ChangeEvent) => { - shape.onYoutubeLinkChange(e.target.value) - app.persist() - }, []) - - return ( - - - - - ) -}) - -const TwitterLinkAction = observer(() => { - const app = useApp() - const { - handlers: { t }, - } = React.useContext(LogseqContext) - const shape = filterShapeByAction('TwitterLink')[0] - const handleChange = React.useCallback((e: React.ChangeEvent) => { - shape.onTwitterLinkChange(e.target.value) - app.persist() - }, []) - - return ( - - - - - ) -}) - -const EditPdfAction = observer(() => { - const app = useApp() - const { - handlers: { t, setCurrentPdf }, - } = React.useContext(LogseqContext) - const shape = app.selectedShapesArray[0] - - return ( - - ) -}) - -const NoFillAction = observer(() => { - const app = useApp() - const { - handlers: { t }, - } = React.useContext(LogseqContext) - const shapes = filterShapeByAction('NoFill') - const handleChange = React.useCallback((v: boolean) => { - app.selectedShapesArray.forEach(s => s.update({ noFill: v })) - app.persist() - }, []) - - const noFill = shapes.every(s => s.props.noFill) - - return ( - - - - ) -}) - -const SwatchAction = observer(() => { - const app = useApp() - // Placeholder - const shapes = filterShapeByAction< - BoxShape | PolygonShape | EllipseShape | LineShape | PencilShape | TextShape - >('Swatch') - - const handleSetColor = React.useCallback((color: string) => { - app.selectedShapesArray.forEach(s => { - s.update({ fill: color, stroke: color }) - }) - app.persist() - }, []) - - const handleSetOpacity = React.useCallback((opacity: number) => { - app.selectedShapesArray.forEach(s => { - s.update({ opacity: opacity }) - }) - app.persist() - }, []) - - const color = shapes[0].props.noFill ? shapes[0].props.stroke : shapes[0].props.fill - return ( - - ) -}) - -const GeometryAction = observer(() => { - const app = useApp() - - const handleSetGeometry = React.useCallback((e: React.MouseEvent) => { - const type = e.currentTarget.dataset.tool - app.api.convertShapes(type) - }, []) - - return -}) - -const StrokeTypeAction = observer(() => { - const app = useApp() - const { - handlers: { t }, - } = React.useContext(LogseqContext) - const shapes = filterShapeByAction< - BoxShape | PolygonShape | EllipseShape | LineShape | PencilShape - >('StrokeType') - - const StrokeTypeOptions: ToggleGroupInputOption[] = [ - { - value: 'line', - icon: 'circle', - tooltip: 'Solid', - }, - { - value: 'dashed', - icon: 'circle-dashed', - tooltip: 'Dashed', - }, - ] - - const value = shapes.every(s => s.props.strokeType === 'dashed') - ? 'dashed' - : shapes.every(s => s.props.strokeType === 'line') - ? 'line' - : 'mixed' - - return ( - { - shapes.forEach(shape => { - shape.update({ - strokeType: v, - }) - }) - app.persist() - }} - /> - ) -}) - -const ArrowModeAction = observer(() => { - const app = useApp() - const { - handlers: { t }, - } = React.useContext(LogseqContext) - const shapes = filterShapeByAction('ArrowMode') - - const StrokeTypeOptions: ToggleGroupInputOption[] = [ - { - value: 'start', - icon: 'arrow-narrow-left', - }, - { - value: 'end', - icon: 'arrow-narrow-right', - }, - ] - - const startValue = shapes.every(s => s.props.decorations?.start === Decoration.Arrow) - const endValue = shapes.every(s => s.props.decorations?.end === Decoration.Arrow) - - const value = [startValue ? 'start' : null, endValue ? 'end' : null].filter(isNonNullable) - - const valueToDecorations = (value: string[]) => { - return { - start: value.includes('start') ? Decoration.Arrow : null, - end: value.includes('end') ? Decoration.Arrow : null, - } - } - - return ( - { - shapes.forEach(shape => { - shape.update({ - decorations: valueToDecorations(v), - }) - }) - app.persist() - }} - /> - ) -}) - -const TextStyleAction = observer(() => { - const app = useApp() - const { - handlers: { t }, - } = React.useContext(LogseqContext) - const shapes = filterShapeByAction('TextStyle') - - const bold = shapes.every(s => s.props.fontWeight > 500) - const italic = shapes.every(s => s.props.italic) - - return ( - - { - shapes.forEach(shape => { - shape.update({ - fontWeight: v ? 700 : 400, - }) - shape.onResetBounds() - }) - app.persist() - }} - > - - - { - shapes.forEach(shape => { - shape.update({ - italic: v, - }) - shape.onResetBounds() - }) - app.persist() - }} - > - - - - ) -}) - -const LinksAction = observer(() => { - const app = useApp() - const shape = app.selectedShapesArray[0] - - const handleChange = (refs: string[]) => { - shape.update({ refs: refs }) - app.persist() - } - - return ( - - ) -}) - -contextBarActionMapping.set('Geometry', GeometryAction) -contextBarActionMapping.set('AutoResizing', AutoResizingAction) -contextBarActionMapping.set('LogseqPortalViewMode', LogseqPortalViewModeAction) -contextBarActionMapping.set('ScaleLevel', ScaleLevelAction) -contextBarActionMapping.set('YoutubeLink', YoutubeLinkAction) -contextBarActionMapping.set('TwitterLink', TwitterLinkAction) -contextBarActionMapping.set('IFrameSource', IFrameSourceAction) -contextBarActionMapping.set('NoFill', NoFillAction) -contextBarActionMapping.set('Swatch', SwatchAction) -contextBarActionMapping.set('StrokeType', StrokeTypeAction) -contextBarActionMapping.set('ArrowMode', ArrowModeAction) -contextBarActionMapping.set('TextStyle', TextStyleAction) -contextBarActionMapping.set('Links', LinksAction) -contextBarActionMapping.set('EditPdf', EditPdfAction) -const getContextBarActionTypes = (type: ShapeType) => { - return (shapeMapping[type] ?? []).filter(isNonNullable) -} - -export const getContextBarActionsForShapes = (shapes: Shape[]) => { - const types = shapes.map(s => s.props.type) - const actionTypes = new Set(shapes.length > 0 ? getContextBarActionTypes(types[0]) : []) - for (let i = 1; i < types.length && actionTypes.size > 0; i++) { - const otherActionTypes = getContextBarActionTypes(types[i]) - actionTypes.forEach(action => { - if (!otherActionTypes.includes(action)) { - actionTypes.delete(action) - } - }) - } - if (shapes.length > 1) { - singleShapeActions.forEach(action => { - if (actionTypes.has(action)) { - actionTypes.delete(action) - } - }) - } - - return Array.from(actionTypes) - .sort((a, b) => contextBarActionTypes.indexOf(a) - contextBarActionTypes.indexOf(b)) - .map(action => contextBarActionMapping.get(action)!) -} diff --git a/packages/tldraw/apps/tldraw-logseq/src/components/ContextBar/index.ts b/packages/tldraw/apps/tldraw-logseq/src/components/ContextBar/index.ts deleted file mode 100644 index 6fb749d2ab..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/components/ContextBar/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './ContextBar' -export * from './contextBarActionFactory' diff --git a/packages/tldraw/apps/tldraw-logseq/src/components/ContextMenu/ContextMenu.tsx b/packages/tldraw/apps/tldraw-logseq/src/components/ContextMenu/ContextMenu.tsx deleted file mode 100644 index d6f3cbc615..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/components/ContextMenu/ContextMenu.tsx +++ /dev/null @@ -1,369 +0,0 @@ -import { useApp } from '@tldraw/react' -import { LogseqContext } from '../../lib/logseq-context' -import { - MOD_KEY, - AlignType, - DistributeType, - isDev, - EXPORT_PADDING -} from '@tldraw/core' -import { observer } from 'mobx-react-lite' -import { TablerIcon } from '../icons' -import { Button } from '../Button' -import { KeyboardShortcut } from '../KeyboardShortcut' -import * as React from 'react' -import { toJS } from 'mobx' - -// @ts-ignore -const LSUI = window.LSUI - -interface ContextMenuProps { - children: React.ReactNode - collisionRef: React.RefObject -} - -export const ContextMenu = observer(function ContextMenu({ - children, - collisionRef, -}: ContextMenuProps) { - const app = useApp() - const { handlers } = React.useContext(LogseqContext) - const t = handlers.t - const rContent = React.useRef(null) - - const runAndTransition = (f: Function) => { - f() - app.transition('select') - } - - const developerMode = React.useMemo(() => { - return isDev() - }, []) - - return ( - { - if (open && !app.isIn('select.contextMenu')) { - app.transition('select').selectedTool.transition('contextMenu') - } else if (!open && app.isIn('select.contextMenu')) { - app.selectedTool.transition('idle') - } - }} - > - - {children} - - app.transition('select')} - collisionBoundary={collisionRef.current} - asChild - tabIndex={-1} - > -
- {app.selectedShapes?.size > 1 && - !app.readOnly && - app.selectedShapesArray?.some(s => !s.props.isLocked) && ( - <> - -
- - - - - -
-
- - - - - -
-
- - runAndTransition(app.packIntoRectangle)} - > - - {t('whiteboard/pack-into-rectangle')} - - - - )} - {app.selectedShapes?.size > 0 && ( - <> - runAndTransition(app.api.zoomToSelection)} - > - - {t('whiteboard/zoom-to-fit')} - - - - - )} - {(app.selectedShapesArray.some(s => s.type === 'group' || app.getParentGroup(s)) || - app.selectedShapesArray.length > 1) && - app.selectedShapesArray?.some(s => !s.props.isLocked) && - !app.readOnly && ( - <> - {app.selectedShapesArray.some(s => s.type === 'group' || app.getParentGroup(s)) && ( - runAndTransition(app.api.unGroup)} - > - - {t('whiteboard/ungroup')} - - - )} - {app.selectedShapesArray.length > 1 && - app.selectedShapesArray?.some(s => !s.props.isLocked) && ( - runAndTransition(app.api.doGroup)} - > - - {t('whiteboard/group')} - - - )} - - - )} - {app.selectedShapes?.size > 0 && app.selectedShapesArray?.some(s => !s.props.isLocked) && ( - <> - {!app.readOnly && ( - runAndTransition(app.cut)} - > - - {t('whiteboard/cut')} - - )} - runAndTransition(app.copy)} - > - - {t('whiteboard/copy')} - - - - )} - {!app.readOnly && ( - runAndTransition(app.paste)} - > - - {t('whiteboard/paste')} - - - )} - {app.selectedShapes?.size === 1 && !app.readOnly && ( - runAndTransition(() => app.paste(undefined, true))} - > - - {t('whiteboard/paste-as-link')} - - - )} - {app.selectedShapes?.size > 0 && ( - <> - - - runAndTransition(() => - handlers.exportToImage(app.currentPageId, { - x: app.selectionBounds.minX + app.viewport.camera.point[0] - EXPORT_PADDING, - y: app.selectionBounds.minY + app.viewport.camera.point[1] - EXPORT_PADDING, - width: app.selectionBounds?.width + EXPORT_PADDING * 2, - height: app.selectionBounds?.height + EXPORT_PADDING * 2, - zoom: app.viewport.camera.zoom, - }) - ) - } - > - - {t('whiteboard/export')} -
- -
-
- - )} - - runAndTransition(app.api.selectAll)} - > - - {t('whiteboard/select-all')} - - - {app.selectedShapes?.size > 1 && ( - runAndTransition(app.api.deselectAll)} - > - - {t('whiteboard/deselect-all')} - - )} - {!app.readOnly && - app.selectedShapes?.size > 0 && - app.selectedShapesArray?.some(s => !s.props.isLocked) && ( - runAndTransition(() => app.setLocked(true))} - > - - {t('whiteboard/lock')} - - - )} - {!app.readOnly && - app.selectedShapes?.size > 0 && - app.selectedShapesArray?.some(s => s.props.isLocked) && ( - runAndTransition(() => app.setLocked(false))} - > - - {t('whiteboard/unlock')} - - - )} - {app.selectedShapes?.size > 0 && - !app.readOnly && - app.selectedShapesArray?.some(s => !s.props.isLocked) && ( - <> - runAndTransition(app.api.deleteShapes)} - > - - {t('whiteboard/delete')} - - - {app.selectedShapes?.size > 1 && !app.readOnly && ( - <> - - runAndTransition(app.flipHorizontal)} - > - - {t('whiteboard/flip-horizontally')} - - runAndTransition(app.flipVertical)} - > - - {t('whiteboard/flip-vertically')} - - - )} - {!app.readOnly && ( - <> - - runAndTransition(app.bringToFront)} - > - - {t('whiteboard/move-to-front')} - - - runAndTransition(app.sendToBack)} - > - - {t('whiteboard/move-to-back')} - - - - )} - - {developerMode && ( - { - if (app.selectedShapesArray.length === 1) { - console.log(toJS(app.selectedShapesArray[0].serialized)) - } else { - console.log(app.selectedShapesArray.map(s => toJS(s.serialized))) - } - }} - > - {t('whiteboard/dev-print-shape-props')} - - )} - - )} -
-
-
- ) -}) diff --git a/packages/tldraw/apps/tldraw-logseq/src/components/ContextMenu/index.ts b/packages/tldraw/apps/tldraw-logseq/src/components/ContextMenu/index.ts deleted file mode 100644 index 47f4873934..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/components/ContextMenu/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './ContextMenu' diff --git a/packages/tldraw/apps/tldraw-logseq/src/components/Devtools/Devtools.tsx b/packages/tldraw/apps/tldraw-logseq/src/components/Devtools/Devtools.tsx deleted file mode 100644 index 08031fcd07..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/components/Devtools/Devtools.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import { useRendererContext } from '@tldraw/react' -import { observer } from 'mobx-react-lite' -import React from 'react' -import ReactDOM from 'react-dom' - -const printPoint = (point: number[]) => { - return `[${point.map(d => d?.toFixed(2) ?? '-').join(', ')}]` -} - -export const DevTools = observer(() => { - const { - viewport: { - bounds, - camera: { point, zoom }, - }, - inputs, - } = useRendererContext() - - const statusbarAnchorRef = React.useRef() - - React.useEffect(() => { - const statusbarAnchor = document.getElementById('tl-statusbar-anchor') - statusbarAnchorRef.current = statusbarAnchor - }, []) - - const rendererStatusText = [ - ['Z', zoom?.toFixed(2) ?? 'null'], - ['MP', printPoint(inputs.currentPoint)], - ['MS', printPoint(inputs.currentScreenPoint)], - ['VP', printPoint(point)], - ['VBR', printPoint([bounds.maxX, bounds.maxY])], - ] - .map(p => p.join('')) - .join('|') - - const rendererStatus = statusbarAnchorRef.current - ? ReactDOM.createPortal( -
- {rendererStatusText} -
, - statusbarAnchorRef.current - ) - : null - - return ( - <> - {rendererStatus} - - ) -}) diff --git a/packages/tldraw/apps/tldraw-logseq/src/components/Devtools/index.ts b/packages/tldraw/apps/tldraw-logseq/src/components/Devtools/index.ts deleted file mode 100644 index a37b587271..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/components/Devtools/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './Devtools' diff --git a/packages/tldraw/apps/tldraw-logseq/src/components/GeometryTools/GeometryTools.tsx b/packages/tldraw/apps/tldraw-logseq/src/components/GeometryTools/GeometryTools.tsx deleted file mode 100644 index d19184ba7e..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/components/GeometryTools/GeometryTools.tsx +++ /dev/null @@ -1,93 +0,0 @@ -import { observer } from 'mobx-react-lite' -import type { Side } from '@radix-ui/react-popper' -import { ToolButton } from '../ToolButton' -import { TablerIcon } from '../icons' -import React from 'react' -import { LogseqContext } from '../../lib/logseq-context' - -// @ts-ignore -const LSUI = window.LSUI - -interface GeometryToolsProps extends React.HTMLAttributes { - popoverSide?: Side - activeGeometry?: string - setGeometry: (e: React.MouseEvent) => void - chevron?: boolean -} - -export const GeometryTools = observer(function GeometryTools({ - popoverSide = 'left', - setGeometry, - activeGeometry, - chevron = true, - ...rest -}: GeometryToolsProps) { - const { - handlers: { t }, - } = React.useContext(LogseqContext) - - const geometries = [ - { - id: 'box', - icon: 'square', - tooltip: t('whiteboard/rectangle'), - }, - { - id: 'ellipse', - icon: 'circle', - tooltip: t('whiteboard/circle'), - }, - { - id: 'polygon', - icon: 'triangle', - tooltip: t('whiteboard/triangle'), - }, - ] - - const shapes = { - id: 'shapes', - icon: 'triangle-square-circle', - tooltip: t('whiteboard/shape'), - } - - const activeTool = activeGeometry ? geometries.find(geo => geo.id === activeGeometry) : shapes - - return ( - - -
- - {chevron && ( - - )} -
-
- - -
- {geometries.map(props => ( - - ))} -
-
-
- ) -}) diff --git a/packages/tldraw/apps/tldraw-logseq/src/components/GeometryTools/index.ts b/packages/tldraw/apps/tldraw-logseq/src/components/GeometryTools/index.ts deleted file mode 100644 index 5a77574faf..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/components/GeometryTools/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './GeometryTools' diff --git a/packages/tldraw/apps/tldraw-logseq/src/components/KeyboardShortcut/KeyboardShortcut.tsx b/packages/tldraw/apps/tldraw-logseq/src/components/KeyboardShortcut/KeyboardShortcut.tsx deleted file mode 100644 index 4fa6df7541..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/components/KeyboardShortcut/KeyboardShortcut.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { LogseqContext } from '../../lib/logseq-context' -import * as React from 'react' - -export const KeyboardShortcut = ({ - action, shortcut, opts, - ...props -}: Partial<{ action: string, shortcut: string, opts: any }> & React.HTMLAttributes) => { - const { renderers } = React.useContext(LogseqContext) - const Shortcut = renderers?.KeyboardShortcut - - return ( -
- -
- ) -} diff --git a/packages/tldraw/apps/tldraw-logseq/src/components/KeyboardShortcut/index.ts b/packages/tldraw/apps/tldraw-logseq/src/components/KeyboardShortcut/index.ts deleted file mode 100644 index 2f1dce9baf..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/components/KeyboardShortcut/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './KeyboardShortcut' diff --git a/packages/tldraw/apps/tldraw-logseq/src/components/Minimap/Minimap.tsx b/packages/tldraw/apps/tldraw-logseq/src/components/Minimap/Minimap.tsx deleted file mode 100644 index 1b4bfb18a0..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/components/Minimap/Minimap.tsx +++ /dev/null @@ -1,55 +0,0 @@ -import { deepEqual } from '@tldraw/core' -import { useApp, useMinimapEvents } from '@tldraw/react' -import { reaction } from 'mobx' -import { observer } from 'mobx-react-lite' -import React from 'react' -import { PreviewManager } from '../../lib' -import { TablerIcon } from '../icons' - -export const Minimap = observer(function Minimap() { - const app = useApp() - - const [whiteboardPreviewManager] = React.useState(() => new PreviewManager(app.serialized)) - const [preview, setPreview] = React.useState(() => - whiteboardPreviewManager.generatePreviewJsx(app.viewport) - ) - - const [active, setActive] = React.useState(false) - - const events = useMinimapEvents() - - React.useEffect(() => { - return reaction( - () => { - return { - serialized: app.serialized, - viewport: app.viewport, - cameraPoint: app.viewport.camera.point, - } - }, - ({ serialized, viewport }, prev) => { - if (!deepEqual(prev.serialized, serialized)) { - whiteboardPreviewManager.load(serialized) - } - setPreview(whiteboardPreviewManager.generatePreviewJsx(viewport)) - } - ) - }, [app]) - - return ( - <> - {active && ( -
- {preview} -
- )} - - - ) -}) diff --git a/packages/tldraw/apps/tldraw-logseq/src/components/Minimap/index.ts b/packages/tldraw/apps/tldraw-logseq/src/components/Minimap/index.ts deleted file mode 100644 index b5d490f795..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/components/Minimap/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './Minimap' diff --git a/packages/tldraw/apps/tldraw-logseq/src/components/PopoverButton/PopoverButton.tsx b/packages/tldraw/apps/tldraw-logseq/src/components/PopoverButton/PopoverButton.tsx deleted file mode 100644 index c851c6c964..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/components/PopoverButton/PopoverButton.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import type { Side, Align } from '@radix-ui/react-popper' - -// @ts-ignore -const LSUI = window.LSUI - -interface PopoverButton extends React.HTMLAttributes { - side: Side // default side - align?: Align - alignOffset?: number - label: React.ReactNode - children: React.ReactNode - border?: boolean -} - -export function PopoverButton({ side, align, alignOffset, label, children, border, ...rest }: PopoverButton) { - return ( - - - {label} - - - - {children} - - - - ) -} diff --git a/packages/tldraw/apps/tldraw-logseq/src/components/PopoverButton/index.ts b/packages/tldraw/apps/tldraw-logseq/src/components/PopoverButton/index.ts deleted file mode 100644 index da8743bee0..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/components/PopoverButton/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './PopoverButton' diff --git a/packages/tldraw/apps/tldraw-logseq/src/components/PrimaryTools/PrimaryTools.tsx b/packages/tldraw/apps/tldraw-logseq/src/components/PrimaryTools/PrimaryTools.tsx deleted file mode 100644 index 2ff47800af..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/components/PrimaryTools/PrimaryTools.tsx +++ /dev/null @@ -1,103 +0,0 @@ -import { useApp } from '@tldraw/react' -import { Geometry } from '@tldraw/core' -import { observer } from 'mobx-react-lite' -import * as React from 'react' -import { ToolButton } from '../ToolButton' -import { GeometryTools } from '../GeometryTools' -import { ColorInput } from '../inputs/ColorInput' -import { ScaleInput } from '../inputs/ScaleInput' -import { LogseqContext } from '../../lib/logseq-context' - -// @ts-ignore -const LSUI = window.LSUI - -export const PrimaryTools = observer(function PrimaryTools() { - const app = useApp() - const { - handlers: { t }, - } = React.useContext(LogseqContext) - - const handleSetColor = React.useCallback((color: string) => { - app.api.setColor(color) - }, []) - - const handleToolClick = React.useCallback((e: React.MouseEvent) => { - const tool = e.currentTarget.dataset.tool - if (tool) app.selectTool(tool) - }, []) - - const [activeGeomId, setActiveGeomId] = React.useState( - () => - Object.values(Geometry).find((geo: string) => geo === app.selectedTool.id) ?? - Object.values(Geometry)[0] - ) - - React.useEffect(() => { - setActiveGeomId((prevId: Geometry) => { - return Object.values(Geometry).find((geo: string) => geo === app.selectedTool.id) ?? prevId - }) - }, [app.selectedTool.id]) - - return ( -
-
- app.selectTool('select')} - tooltip={t('whiteboard/select')} - id="select" - icon="select-cursor" - /> - app.selectTool('move')} - tooltip={t('whiteboard/pan')} - id="move" - icon={app.isIn('move.panning') ? 'hand-grab' : 'hand-stop'} - /> - - app.selectTool('logseq-portal')} - tooltip={t('whiteboard/add-block-or-page')} - id="logseq-portal" - icon="circle-plus" - /> - app.selectTool('pencil')} - tooltip={t('whiteboard/draw')} - id="pencil" - icon="ballpen" - /> - app.selectTool('highlighter')} - tooltip={t('whiteboard/highlight')} - id="highlighter" - icon="highlight" - /> - app.selectTool('erase')} - tooltip={t('whiteboard/eraser')} - id="erase" - icon="eraser" - /> - app.selectTool('line')} - tooltip={t('whiteboard/connector')} - id="line" - icon="connector" - /> - app.selectTool('text')} - tooltip={t('whiteboard/text')} - id="text" - icon="text" - /> - - - - -
-
- ) -}) diff --git a/packages/tldraw/apps/tldraw-logseq/src/components/PrimaryTools/index.ts b/packages/tldraw/apps/tldraw-logseq/src/components/PrimaryTools/index.ts deleted file mode 100644 index 03b98c7a5b..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/components/PrimaryTools/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './PrimaryTools' diff --git a/packages/tldraw/apps/tldraw-logseq/src/components/QuickLinks/QuickLinks.tsx b/packages/tldraw/apps/tldraw-logseq/src/components/QuickLinks/QuickLinks.tsx deleted file mode 100644 index c14de56df8..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/components/QuickLinks/QuickLinks.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import { TLQuickLinksComponent, useApp } from '@tldraw/react' -import { observer } from 'mobx-react-lite' -import React from 'react' -import type { Shape } from '../../lib' -import { LogseqContext } from '../../lib/logseq-context' -import { BlockLink } from '../BlockLink' - -export const QuickLinks: TLQuickLinksComponent = observer(({ shape }) => { - const app = useApp() - const { handlers } = React.useContext(LogseqContext) - const t = handlers.t - const links = React.useMemo(() => { - const links = [...(shape.props.refs ?? [])].map<[ref: string, showReferenceContent: boolean]>( - // user added links should show the referenced block content - l => [l, true] - ) - - if (shape.props.type === 'logseq-portal' && shape.props.pageId) { - // portal reference should not show the block content - links.unshift([shape.props.pageId, false]) - } - - // do not show links for the current page - return links.filter( - link => - link[0].toLowerCase() !== app.currentPage.id && - link[0] !== shape.props.pageId - ) - }, [shape.props.id, shape.props.type, shape.props.parentId, shape.props.refs]) - - if (links.length === 0) return null - - return ( -
- {links.map(([ref, showReferenceContent]) => { - return ( -
- -
- ) - })} -
- ) -}) diff --git a/packages/tldraw/apps/tldraw-logseq/src/components/QuickLinks/index.ts b/packages/tldraw/apps/tldraw-logseq/src/components/QuickLinks/index.ts deleted file mode 100644 index 2a544a4e36..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/components/QuickLinks/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './QuickLinks' diff --git a/packages/tldraw/apps/tldraw-logseq/src/components/QuickSearch/QuickSearch.tsx b/packages/tldraw/apps/tldraw-logseq/src/components/QuickSearch/QuickSearch.tsx deleted file mode 100644 index c01b26c4ce..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/components/QuickSearch/QuickSearch.tsx +++ /dev/null @@ -1,437 +0,0 @@ -import { useDebouncedValue } from '@tldraw/react' -import { observer } from 'mobx-react-lite' -import React from 'react' -import { Virtuoso } from 'react-virtuoso' -import { LogseqPortalShape } from '../../lib' -import { LogseqContext, SearchResult } from '../../lib/logseq-context' -import { CircleButton } from '../Button' -import { TablerIcon } from '../icons' -import { TextInput } from '../inputs/TextInput' - -interface LogseqQuickSearchProps { - onChange: (id: string) => void - className?: string - placeholder?: string - style?: React.CSSProperties - onBlur?: () => void - onAddBlock?: (uuid: string) => void -} - -const LogseqTypeTag = ({ - type, - active, -}: { - type: 'B' | 'P' | 'BA' | 'PA' | 'WA' | 'WP' | 'BS' | 'PS' - active?: boolean -}) => { - const nameMapping = { - B: 'block', - P: 'page', - WP: 'whiteboard', - BA: 'new-block', - PA: 'new-page', - WA: 'new-whiteboard', - BS: 'block-search', - PS: 'page-search', - } - return ( - - - - ) -} - -function escapeRegExp(text: string) { - return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&') -} - -const highlightedJSX = (input: string, keyword: string) => { - return ( - - {input - .split(new RegExp(`(${escapeRegExp(keyword)})`, 'gi')) - .map((part, index) => { - if (index % 2 === 1) { - return {part} - } - return part - }) - .map((frag, idx) => ( - {frag} - ))} - - ) -} - -const useSearch = (q: string, searchFilter: 'B' | 'P' | null) => { - const { handlers } = React.useContext(LogseqContext) - const [results, setResults] = React.useState(null) - const dq = useDebouncedValue(q, 200) - - React.useEffect(() => { - let canceled = false - if (dq.length > 0) { - const filter = { 'pages?': true, 'blocks?': true, 'files?': false } - if (searchFilter === 'B') { - filter['pages?'] = false - } else if (searchFilter === 'P') { - filter['blocks?'] = false - } - handlers.search(dq, filter).then(_results => { - if (!canceled) { - setResults(_results) - } - }) - } else { - setResults(null) - } - return () => { - canceled = true - } - }, [dq, handlers?.search]) - - return results -} - -export const LogseqQuickSearch = observer( - ({ className, style, placeholder, onChange, onBlur, onAddBlock }: LogseqQuickSearchProps) => { - const [q, setQ] = React.useState(LogseqPortalShape.defaultSearchQuery) - const [searchFilter, setSearchFilter] = React.useState<'B' | 'P' | null>( - LogseqPortalShape.defaultSearchFilter - ) - const rInput = React.useRef(null) - const { handlers, renderers } = React.useContext(LogseqContext) - const t = handlers.t - - const finishSearching = React.useCallback((id: string, isPage: boolean) => { - console.log({id, isPage}) - setTimeout(() => onChange(id, isPage)) - rInput.current?.blur() - if (id) { - LogseqPortalShape.defaultSearchQuery = '' - LogseqPortalShape.defaultSearchFilter = null - } - }, []) - - const handleAddBlock = React.useCallback( - async (content: string) => { - const uuid = await handlers?.addNewBlock(content) - if (uuid) { - finishSearching(uuid) - onAddBlock?.(uuid) - } - return uuid - }, - [onAddBlock] - ) - - const optionsWrapperRef = React.useRef(null) - - const [focusedOptionIdx, setFocusedOptionIdx] = React.useState(0) - - const searchResult = useSearch(q, searchFilter) - - const [prefixIcon, setPrefixIcon] = React.useState('circle-plus') - - const [showPanel, setShowPanel] = React.useState(false) - - React.useEffect(() => { - // autofocus attr seems not to be working - setTimeout(() => { - rInput.current?.focus() - }) - }, [searchFilter]) - - React.useEffect(() => { - LogseqPortalShape.defaultSearchQuery = q - LogseqPortalShape.defaultSearchFilter = searchFilter - }, [q, searchFilter]) - - type Option = { - actionIcon: 'search' | 'circle-plus' - onChosen: () => boolean // return true if the action was handled - element: React.ReactNode - } - - const options: Option[] = React.useMemo(() => { - const options: Option[] = [] - - const Breadcrumb = renderers?.Breadcrumb - - if (!Breadcrumb || !handlers) { - return [] - } - - if (onAddBlock) { - // New block option - options.push({ - actionIcon: 'circle-plus', - onChosen: () => { - return !!handleAddBlock(q) - }, - element: ( -
- - {q.length > 0 ? ( - <> - {t('whiteboard/new-block')} - {q} - - ) : ( - {t('whiteboard/new-block-no-colon')} - )} -
- ), - }) - } - - // New page or whiteboard option when no exact match - if (!searchResult?.pages?.some(p => p.title.toLowerCase() === q.toLowerCase()) && q) { - options.push( - { - actionIcon: 'circle-plus', - onChosen: async () => { - let result = await handlers?.addNewPage(q) - finishSearching(result, true) - return true - }, - element: ( -
- - {t('whiteboard/new-page')} - {q} -
- ), - }, - { - actionIcon: 'circle-plus', - onChosen: async () => { - let result = await handlers?.addNewWhiteboard(q) - finishSearching(result, true) - return true - }, - element: ( -
- - {t('whiteboard/new-whiteboard')} - {q} -
- ), - } - ) - } - - // search filters - if (q.length === 0 && searchFilter === null) { - options.push( - { - actionIcon: 'search', - onChosen: () => { - setSearchFilter('B') - return true - }, - element: ( -
- - {t('whiteboard/search-only-blocks')} -
- ), - }, - { - actionIcon: 'search', - onChosen: () => { - setSearchFilter('P') - return true - }, - element: ( -
- - {t('whiteboard/search-only-pages')} -
- ), - } - ) - } - - // Page results - if ((!searchFilter || searchFilter === 'P') && searchResult && searchResult.pages) { - options.push( - ...searchResult.pages.map(page => { - return { - actionIcon: 'search' as 'search', - onChosen: () => { - finishSearching(page.id, true) - return true - }, - element: ( -
- - {highlightedJSX(page.title, q)} -
- ), - } - }) - ) - } - - // Block results - if ((!searchFilter || searchFilter === 'B') && searchResult && searchResult.blocks) { - options.push( - ...searchResult.blocks - .filter(block => block.title && block.uuid) - .map(({ title, uuid }) => { - const block = handlers.queryBlockByUUID(uuid) - return { - actionIcon: 'search' as 'search', - onChosen: () => { - if (block) { - finishSearching(uuid) - window.logseq?.api?.set_blocks_id?.([uuid]) - return true - } - return false - }, - // FIXME: breadcrumb not works here because of async loading - element: ( - <> -
- - {highlightedJSX(title, q)} -
- - ), - } - }) - ) - } - return options - }, [q, searchFilter, searchResult, renderers?.Breadcrumb, handlers]) - - React.useEffect(() => { - const keydownListener = (e: KeyboardEvent) => { - let newIndex = focusedOptionIdx - if (e.key === 'ArrowDown') { - newIndex = Math.min(options.length - 1, focusedOptionIdx + 1) - } else if (e.key === 'ArrowUp') { - newIndex = Math.max(0, focusedOptionIdx - 1) - } else if (e.key === 'Enter') { - options[focusedOptionIdx]?.onChosen() - e.stopPropagation() - e.preventDefault() - } else if (e.key === 'Backspace' && q.length === 0) { - setSearchFilter(null) - } else if (e.key === 'Escape') { - finishSearching('') - } - - if (newIndex !== focusedOptionIdx) { - const option = options[newIndex] - setFocusedOptionIdx(newIndex) - setPrefixIcon(option.actionIcon) - e.stopPropagation() - e.preventDefault() - const optionElement = optionsWrapperRef.current?.querySelector( - '.tl-quick-search-option:nth-child(' + (newIndex + 1) + ')' - ) - if (optionElement) { - // @ts-expect-error we are using scrollIntoViewIfNeeded, which is not in standards - optionElement?.scrollIntoViewIfNeeded(false) - } - } - } - document.addEventListener('keydown', keydownListener, true) - return () => { - document.removeEventListener('keydown', keydownListener, true) - } - }, [options, focusedOptionIdx, q]) - - return ( -
- { - options[focusedOptionIdx]?.onChosen() - }} - /> -
- {searchFilter && ( -
- - {searchFilter === 'B' ? 'Search blocks' : 'Search pages'} -
setSearchFilter(null)} - > - -
-
- )} - setQ(q.target.value)} - onKeyDown={e => { - if (e.key === 'Enter') { - finishSearching(q) - } - e.stopPropagation() - }} - onFocus={() => { - setShowPanel(true) - }} - onBlur={() => { - setShowPanel(false) - onBlur?.() - }} - /> -
- {/* TODO: refactor to radix-ui popover */} - {options.length > 0 && ( -
e.stopPropagation()} - className="tl-quick-search-options" - ref={optionsWrapperRef} - style={{ - // not using display: none so we can persist the scroll position - visibility: showPanel ? 'visible' : 'hidden', - pointerEvents: showPanel ? 'all' : 'none', - }} - > - { - const { actionIcon, onChosen, element } = options[index] - return ( -
{ - setPrefixIcon(actionIcon) - setFocusedOptionIdx(index) - }} - // we have to use mousedown && stop propagation EARLY, otherwise some - // default behavior of clicking the rendered elements will happen - onPointerDownCapture={e => { - if (onChosen()) { - e.stopPropagation() - e.preventDefault() - } - }} - > - {element} -
- ) - }} - /> -
- )} -
- ) - } -) diff --git a/packages/tldraw/apps/tldraw-logseq/src/components/QuickSearch/index.ts b/packages/tldraw/apps/tldraw-logseq/src/components/QuickSearch/index.ts deleted file mode 100644 index 25f4daa00f..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/components/QuickSearch/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './QuickSearch' diff --git a/packages/tldraw/apps/tldraw-logseq/src/components/StatusBar/StatusBar.tsx b/packages/tldraw/apps/tldraw-logseq/src/components/StatusBar/StatusBar.tsx deleted file mode 100644 index e5c1df5099..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/components/StatusBar/StatusBar.tsx +++ /dev/null @@ -1,16 +0,0 @@ -/* eslint-disable @typescript-eslint/no-non-null-assertion */ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import { useApp } from '@tldraw/react' -import { observer } from 'mobx-react-lite' -import type { Shape } from '../../lib' - -export const StatusBar = observer(function StatusBar() { - const app = useApp() - return ( -
- {app.selectedTool.id} | {app.selectedTool.currentState.id} -
-
-
- ) -}) diff --git a/packages/tldraw/apps/tldraw-logseq/src/components/StatusBar/index.ts b/packages/tldraw/apps/tldraw-logseq/src/components/StatusBar/index.ts deleted file mode 100644 index 5c3506e9bd..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/components/StatusBar/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './StatusBar' diff --git a/packages/tldraw/apps/tldraw-logseq/src/components/ToolButton/ToolButton.tsx b/packages/tldraw/apps/tldraw-logseq/src/components/ToolButton/ToolButton.tsx deleted file mode 100644 index f7e0377594..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/components/ToolButton/ToolButton.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import { TLMoveTool, TLSelectTool } from '@tldraw/core' -import { useApp } from '@tldraw/react' -import type { Side } from '@radix-ui/react-popper' -import { observer } from 'mobx-react-lite' -import type * as React from 'react' -import { Button } from '../Button' -import { TablerIcon } from '../icons' -import { KeyboardShortcut } from '../KeyboardShortcut' - -export interface ToolButtonProps extends React.ButtonHTMLAttributes { - id: string - icon: string | React.ReactNode - tooltip: string - tooltipSide?: Side - handleClick: (e: React.MouseEvent) => void -} - -export const ToolButton = observer( - ({ id, icon, tooltip, tooltipSide = 'left', handleClick, ...props }: ToolButtonProps) => { - const app = useApp() - - // Tool must exist - const Tool = [...app.Tools, TLSelectTool, TLMoveTool]?.find(T => T.id === id) - - const shortcut = (Tool as any)?.['shortcut'] - - const tooltipContent = - shortcut && tooltip ? ( -
- {tooltip} - -
- ) : ( - tooltip - ) - - return ( - - ) - } -) diff --git a/packages/tldraw/apps/tldraw-logseq/src/components/ToolButton/index.ts b/packages/tldraw/apps/tldraw-logseq/src/components/ToolButton/index.ts deleted file mode 100644 index 7f7d067a64..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/components/ToolButton/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './ToolButton' diff --git a/packages/tldraw/apps/tldraw-logseq/src/components/Tooltip/Tooltip.tsx b/packages/tldraw/apps/tldraw-logseq/src/components/Tooltip/Tooltip.tsx deleted file mode 100644 index 74d1005244..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/components/Tooltip/Tooltip.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import type { Side } from '@radix-ui/react-popper' - -// @ts-ignore -const LSUI = window.LSUI - -export interface TooltipProps { - children: React.ReactNode - side?: Side - sideOffset?: number - content?: React.ReactNode -} - -export function Tooltip({ side, content, sideOffset = 10, ...rest }: TooltipProps) { - return content ? ( - - - {rest.children} - - {content} - - - - - ) : ( - <>{rest.children} - ) -} diff --git a/packages/tldraw/apps/tldraw-logseq/src/components/Tooltip/index.ts b/packages/tldraw/apps/tldraw-logseq/src/components/Tooltip/index.ts deleted file mode 100644 index ba15f40737..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/components/Tooltip/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './Tooltip' diff --git a/packages/tldraw/apps/tldraw-logseq/src/components/ZoomMenu/ZoomMenu.tsx b/packages/tldraw/apps/tldraw-logseq/src/components/ZoomMenu/ZoomMenu.tsx deleted file mode 100644 index 813f39cb46..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/components/ZoomMenu/ZoomMenu.tsx +++ /dev/null @@ -1,65 +0,0 @@ -import { useApp } from '@tldraw/react' -import { KeyboardShortcut } from '../KeyboardShortcut' -import { observer } from 'mobx-react-lite' - -// @ts-ignore -const LSUI = window.LSUI - -export const ZoomMenu = observer(function ZoomMenu(): JSX.Element { - const app = useApp() - const preventEvent = (e: Event) => { - e.preventDefault() - } - - return ( - - - {(app.viewport.camera.zoom * 100).toFixed(0) + '%'} - - e.preventDefault()} - id="zoomPopup" - sideOffset={12} - > - - Zoom to drawing - - - - Zoom to fit selection - - - - Zoom in - - - - Zoom out - - - - Reset zoom - - - - - ) -}) - -export default ZoomMenu diff --git a/packages/tldraw/apps/tldraw-logseq/src/components/ZoomMenu/index.ts b/packages/tldraw/apps/tldraw-logseq/src/components/ZoomMenu/index.ts deleted file mode 100644 index aa031d0061..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/components/ZoomMenu/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './ZoomMenu' diff --git a/packages/tldraw/apps/tldraw-logseq/src/components/icons/TablerIcon.tsx b/packages/tldraw/apps/tldraw-logseq/src/components/icons/TablerIcon.tsx deleted file mode 100644 index 32574c1660..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/components/icons/TablerIcon.tsx +++ /dev/null @@ -1,35 +0,0 @@ -const extendedIcons = [ - 'add-link', - 'block-search', - 'block', - 'connector', - 'group', - 'internal-link', - 'link-to-block', - 'link-to-page', - 'link-to-whiteboard', - 'move-to-sidebar-right', - 'object-compact', - 'object-expanded', - 'open-as-page', - 'page-search', - 'page', - 'references-hide', - 'references-show', - 'select-cursor', - 'text', - 'ungroup', - 'whiteboard-element', - 'whiteboard', -] - -const cx = (...args: (string | undefined)[]) => args.join(' ') - -export const TablerIcon = ({ - name, - className, - ...props -}: { name: string } & React.HTMLAttributes) => { - const classNamePrefix = extendedIcons.includes(name) ? `tie tie-` : `ti ti-` - return -} diff --git a/packages/tldraw/apps/tldraw-logseq/src/components/icons/index.ts b/packages/tldraw/apps/tldraw-logseq/src/components/icons/index.ts deleted file mode 100644 index 6a6ddebace..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/components/icons/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './TablerIcon' diff --git a/packages/tldraw/apps/tldraw-logseq/src/components/inputs/ColorInput.tsx b/packages/tldraw/apps/tldraw-logseq/src/components/inputs/ColorInput.tsx deleted file mode 100644 index 862ef79a67..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/components/inputs/ColorInput.tsx +++ /dev/null @@ -1,122 +0,0 @@ -import type { Side } from '@radix-ui/react-popper' -import { Color, isBuiltInColor, debounce } from '@tldraw/core' -import { TablerIcon } from '../icons' -import { PopoverButton } from '../PopoverButton' -import { Tooltip } from '../Tooltip' -import React from 'react' -import { LogseqContext } from '../../lib/logseq-context' -// @ts-ignore -const LSUI = window.LSUI - -interface ColorInputProps extends React.HTMLAttributes { - color?: string - opacity?: number - popoverSide: Side - setColor: (value: string) => void - setOpacity?: (value: number) => void -} - -export function ColorInput({ - color, - opacity, - popoverSide, - setColor, - setOpacity, - ...rest -}: ColorInputProps) { - const { - handlers: { t }, - } = React.useContext(LogseqContext) - - function renderColor(color?: string) { - return color ? ( -
-
-
- ) : ( -
- -
- ) - } - - function isHexColor(color: string) { - return /^#(?:[0-9a-f]{3}){1,2}$/i.test(color) - } - - const handleChangeDebounced = React.useMemo(() => { - let latestValue = '' - - const handler: React.ChangeEventHandler = e => { - setColor(latestValue) - } - - return debounce(handler, 100, e => { - latestValue = e.target.value - }) - }, []) - - return ( - - {renderColor(color)} - - } - > -
-
- {Object.values(Color).map(value => ( - - ))} -
- -
-
-
- -
-
- -
- - {setOpacity && ( -
- setOpacity(value[0])} - max={1} - step={0.1} - aria-label={t('whiteboard/opacity')} - className="tl-slider-root" - > - - - - - -
- )} -
-
- ) -} diff --git a/packages/tldraw/apps/tldraw-logseq/src/components/inputs/NumberInput.tsx b/packages/tldraw/apps/tldraw-logseq/src/components/inputs/NumberInput.tsx deleted file mode 100644 index fc0526823b..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/components/inputs/NumberInput.tsx +++ /dev/null @@ -1,12 +0,0 @@ -interface NumberInputProps extends React.InputHTMLAttributes { - label: string -} - -export function NumberInput({ label, ...rest }: NumberInputProps) { - return ( -
- - -
- ) -} diff --git a/packages/tldraw/apps/tldraw-logseq/src/components/inputs/ScaleInput.tsx b/packages/tldraw/apps/tldraw-logseq/src/components/inputs/ScaleInput.tsx deleted file mode 100644 index fd8cd06df3..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/components/inputs/ScaleInput.tsx +++ /dev/null @@ -1,59 +0,0 @@ -import { SelectInput, type SelectOption } from '../inputs/SelectInput' -import type { Side } from '@radix-ui/react-popper' -import type { SizeLevel } from '../../lib' -import { useApp } from '@tldraw/react' -import React from 'react' -import { LogseqContext } from '../../lib/logseq-context' - -interface ScaleInputProps extends React.HTMLAttributes { - scaleLevel?: SizeLevel - compact?: boolean - popoverSide?: Side -} - -export function ScaleInput({ scaleLevel, compact, popoverSide, ...rest }: ScaleInputProps) { - const app = useApp() - const { - handlers: { t }, - } = React.useContext(LogseqContext) - - const sizeOptions: SelectOption[] = [ - { - label: compact ? 'XS' : t('whiteboard/extra-small'), - value: 'xs', - }, - { - label: compact ? 'SM' : t('whiteboard/small'), - value: 'sm', - }, - { - label: compact ? 'MD' : t('whiteboard/medium'), - value: 'md', - }, - { - label: compact ? 'LG' : t('whiteboard/large'), - value: 'lg', - }, - { - label: compact ? 'XL' : t('whiteboard/extra-large'), - value: 'xl', - }, - { - label: compact ? 'XXL' : t('whiteboard/huge'), - value: 'xxl', - }, - ] - - return ( - { - app.api.setScaleLevel(v) - }} - /> - ) -} diff --git a/packages/tldraw/apps/tldraw-logseq/src/components/inputs/SelectInput.tsx b/packages/tldraw/apps/tldraw-logseq/src/components/inputs/SelectInput.tsx deleted file mode 100644 index 470c5cb741..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/components/inputs/SelectInput.tsx +++ /dev/null @@ -1,75 +0,0 @@ -import * as React from 'react' -import { Tooltip } from '../Tooltip' -import { ChevronDown } from 'lucide-react' -import type { Side } from '@radix-ui/react-popper' - -// @ts-ignore -const LSUI = window.LSUI - -export interface SelectOption { - value: string - label: React.ReactNode -} - -interface SelectInputProps extends React.HTMLAttributes { - options: SelectOption[] - value: string - tooltip?: React.ReactNode - popoverSide?: Side - compact?: boolean - onValueChange: (value: string) => void -} - -export function SelectInput({ - options, - tooltip, - popoverSide, - compact = false, - value, - onValueChange, - ...rest -}: SelectInputProps) { - const [isOpen, setIsOpen] = React.useState(false) - return ( -
- - - - - {!compact && ( - - - - )} - - - - e.stopPropagation()} - > - {options.map(option => { - return ( - - {option.label} - - ) - })} - - -
- ) -} diff --git a/packages/tldraw/apps/tldraw-logseq/src/components/inputs/ShapeLinksInput.tsx b/packages/tldraw/apps/tldraw-logseq/src/components/inputs/ShapeLinksInput.tsx deleted file mode 100644 index 618e760d4e..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/components/inputs/ShapeLinksInput.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import type { Side } from '@radix-ui/react-popper' -import { validUUID } from '@tldraw/core' -import { useApp } from '@tldraw/react' -import React from 'react' - -import { observer } from 'mobx-react-lite' -import { LogseqContext } from '../../lib/logseq-context' -import { BlockLink } from '../BlockLink' -import { Button } from '../Button' -import { Tooltip } from '../Tooltip' -import { TablerIcon } from '../icons' -import { PopoverButton } from '../PopoverButton' -import { LogseqQuickSearch } from '../QuickSearch' - -interface ShapeLinksInputProps extends React.HTMLAttributes { - shapeType: string - side: Side - refs: string[] - pageId?: string // the portal referenced block id or page name - portalType?: 'B' | 'P' - onRefsChange: (value: string[]) => void -} - -function ShapeLinkItem({ - id, - type, - onRemove, - showContent, -}: { - id: string - type: 'B' | 'P' - onRemove?: () => void - showContent?: boolean -}) { - const app = useApp() - const { handlers } = React.useContext(LogseqContext) - const t = handlers.t - - return ( -
-
- -
-
- {handlers.getBlockPageName(id) !== app.currentPage.name && ( - - )} - - {onRemove && ( - - )} -
- ) -} - -export const ShapeLinksInput = observer(function ShapeLinksInput({ - pageId, - portalType, - shapeType, - refs, - side, - onRefsChange, - ...rest -}: ShapeLinksInputProps) { - const { - handlers: { t }, - } = React.useContext(LogseqContext) - - const noOfLinks = refs.length + (pageId ? 1 : 0) - const canAddLink = refs.length === 0 - - const addNewRef = (value?: string) => { - if (value && !refs.includes(value) && canAddLink) { - onRefsChange([...refs, value]) - } - } - - const showReferencePanel = !!(pageId && portalType) - - return ( - -
- 0 ? 'link' : 'add-link'} /> - {noOfLinks > 0 &&
{noOfLinks}
} -
- - } - > -
- {showReferencePanel && ( -
-
- - {t('whiteboard/references')} -
- -
- )} -
-
- - {t('whiteboard/link-to-any-page-or-block')} -
- - {canAddLink && ( - - )} - - {refs.length > 0 && ( -
- {refs.map((ref, i) => { - return ( - { - onRefsChange(refs.filter((_, j) => i !== j)) - }} - showContent - /> - ) - })} -
- )} -
-
-
- ) -}) diff --git a/packages/tldraw/apps/tldraw-logseq/src/components/inputs/TextInput.tsx b/packages/tldraw/apps/tldraw-logseq/src/components/inputs/TextInput.tsx deleted file mode 100644 index 67e1fd8c66..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/components/inputs/TextInput.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import * as React from 'react' - -interface TextInputProps extends React.InputHTMLAttributes { - autoResize?: boolean -} - -export const TextInput = React.forwardRef( - ({ autoResize = true, value, className, ...rest }, ref) => { - return ( -
-
-
{value}
- -
-
- ) - } -) diff --git a/packages/tldraw/apps/tldraw-logseq/src/components/inputs/ToggleGroupInput.tsx b/packages/tldraw/apps/tldraw-logseq/src/components/inputs/ToggleGroupInput.tsx deleted file mode 100644 index 01e8c1d1a1..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/components/inputs/ToggleGroupInput.tsx +++ /dev/null @@ -1,76 +0,0 @@ -import { TablerIcon } from '../icons' -import { Tooltip } from '../Tooltip' - -// @ts-ignore -const LSUI = window.LSUI - -export interface ToggleGroupInputOption { - value: string - icon: string - tooltip?: string -} - -interface ToggleGroupInputProps extends React.HTMLAttributes { - options: ToggleGroupInputOption[] - value: string - onValueChange: (value: string) => void -} - -interface ToggleGroupMultipleInputProps extends React.HTMLAttributes { - options: ToggleGroupInputOption[] - value: string[] - onValueChange: (value: string[]) => void -} - -export function ToggleGroupInput({ options, value, onValueChange }: ToggleGroupInputProps) { - return ( - - {options.map(option => { - return ( - -
- - - -
-
- ) - })} -
- ) -} - -export function ToggleGroupMultipleInput({ - options, - value, - onValueChange, -}: ToggleGroupMultipleInputProps) { - return ( - - {options.map(option => { - return ( - - - - ) - })} - - ) -} diff --git a/packages/tldraw/apps/tldraw-logseq/src/components/inputs/ToggleInput.tsx b/packages/tldraw/apps/tldraw-logseq/src/components/inputs/ToggleInput.tsx deleted file mode 100644 index d435d1f526..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/components/inputs/ToggleInput.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import { Tooltip } from '../Tooltip' - -// @ts-ignore -const LSUI = window.LSUI - -interface ToggleInputProps extends React.HTMLAttributes { - toggle?: boolean - pressed: boolean - tooltip?: React.ReactNode - onPressedChange: (value: boolean) => void -} - -export function ToggleInput({ - toggle = true, - pressed, - onPressedChange, - className, - tooltip, - ...rest -}: ToggleInputProps) { - return ( - -
- -
-
- ) -} diff --git a/packages/tldraw/apps/tldraw-logseq/src/hooks/useCameraMoving.ts b/packages/tldraw/apps/tldraw-logseq/src/hooks/useCameraMoving.ts deleted file mode 100644 index 5c13215b6f..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/hooks/useCameraMoving.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { useApp } from '@tldraw/react' - -export function useCameraMovingRef() { - const app = useApp() - return app.inputs.state === 'panning' || app.inputs.state === 'pinching' -} diff --git a/packages/tldraw/apps/tldraw-logseq/src/hooks/useCopy.ts b/packages/tldraw/apps/tldraw-logseq/src/hooks/useCopy.ts deleted file mode 100644 index cd7127f17d..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/hooks/useCopy.ts +++ /dev/null @@ -1,11 +0,0 @@ -import type { TLReactCallbacks } from '@tldraw/react' -import * as React from 'react' -import { LogseqContext } from '../lib/logseq-context' - -export function useCopy() { - const { handlers } = React.useContext(LogseqContext) - - return React.useCallback((app, { text, html }) => { - handlers.copyToClipboard(text, html) - }, []) -} diff --git a/packages/tldraw/apps/tldraw-logseq/src/hooks/useDrop.ts b/packages/tldraw/apps/tldraw-logseq/src/hooks/useDrop.ts deleted file mode 100644 index e526354c59..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/hooks/useDrop.ts +++ /dev/null @@ -1,14 +0,0 @@ -import type { TLReactCallbacks } from '@tldraw/react' -import * as React from 'react' -import type { Shape } from '../lib' -import { usePaste } from './usePaste' - -export function useDrop() { - const handlePaste = usePaste() - return React.useCallback['onDrop']>( - async (app, { dataTransfer, point }) => { - handlePaste(app, { point, shiftKey: false, dataTransfer, fromDrop: true }) - }, - [] - ) -} diff --git a/packages/tldraw/apps/tldraw-logseq/src/hooks/usePaste.ts b/packages/tldraw/apps/tldraw-logseq/src/hooks/usePaste.ts deleted file mode 100644 index 90a3d78767..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/hooks/usePaste.ts +++ /dev/null @@ -1,515 +0,0 @@ -import { - getSizeFromSrc, - isNonNullable, - TLAsset, - TLBinding, - TLCursor, - TLPasteEventInfo, - TLShapeModel, - uniqueId, - validUUID, -} from '@tldraw/core' -import type { TLReactApp, TLReactCallbacks } from '@tldraw/react' -import Vec from '@tldraw/vec' -import * as React from 'react' -import { NIL as NIL_UUID } from 'uuid' -import { - HTMLShape, - IFrameShape, - ImageShape, - PdfShape, - LogseqPortalShape, - VideoShape, - YouTubeShape, - YOUTUBE_REGEX, - TweetShape, - X_OR_TWITTER_REGEX, - type Shape, -} from '../lib' -import { LogseqContext, LogseqContextValue } from '../lib/logseq-context' - -const isValidURL = (url: string) => { - try { - const parsedUrl = new URL(url) - return parsedUrl.host && ['http:', 'https:'].includes(parsedUrl.protocol) - } catch { - return false - } -} - -interface Asset extends TLAsset { - size?: number[] -} - -const assetExtensions = { - image: ['.png', '.svg', '.jpg', '.jpeg', '.gif'], - video: ['.mp4', '.webm', '.ogg'], - pdf: ['.pdf'], -} - -function getFileType(filename: string) { - // Get extension, verify that it's an image - const extensionMatch = filename.match(/\.[0-9a-z]+$/i) - if (!extensionMatch) return 'unknown' - const extension = extensionMatch[0].toLowerCase() - - const [type, _extensions] = Object.entries(assetExtensions).find(([_type, extensions]) => - extensions.includes(extension) - ) ?? ['unknown', null] - - return type -} - -type MaybeShapes = TLShapeModel[] | null | undefined - -type CreateShapeFN = (...args: Args) => Promise | MaybeShapes - -/** - * Try create a shape from a list of create shape functions. If one of the functions returns a - * shape, return it, otherwise try again for the next one until all have been tried. - */ -function tryCreateShapeHelper(...fns: CreateShapeFN[]) { - return async (...args: Args) => { - for (const fn of fns) { - const result = await fn(...(args as any)) - if (result && result.length > 0) { - return result - } - } - return null - } -} - -// TODO: support file types -async function getDataFromType(item: DataTransfer | ClipboardItem, type: `text/${string}`) { - if (!item.types.includes(type)) { - return null - } - if (item instanceof DataTransfer) { - return item.getData(type) - } - const blob = await item.getType(type) - return await blob.text() -} - -const handleCreatingShapes = async ( - app: TLReactApp, - { point, shiftKey, dataTransfer, fromDrop }: TLPasteEventInfo, - handlers: LogseqContextValue['handlers'] -) => { - let imageAssetsToCreate: Asset[] = [] - let assetsToClone: TLAsset[] = [] - const bindingsToCreate: TLBinding[] = [] - - async function createAssetsFromURL(url: string, type: string): Promise { - // Do we already have an asset for this image? - const existingAsset = Object.values(app.assets).find(asset => asset.src === url) - if (existingAsset) { - return existingAsset as Asset - } - - // Create a new asset for this image - const asset: Asset = { - id: uniqueId(), - type: type, - src: url, - size: await getSizeFromSrc(handlers.makeAssetUrl(url), type), - } - return asset - } - - async function createAssetsFromFiles(files: File[]) { - const tasks = files - .filter(file => getFileType(file.name) !== 'unknown') - .map(async file => { - try { - const dataurl = await handlers.saveAsset(file) - return await createAssetsFromURL(dataurl, getFileType(file.name)) - } catch (err) { - console.error(err) - } - return null - }) - return (await Promise.all(tasks)).filter(isNonNullable) - } - - function createHTMLShape(text: string) { - return [ - { - ...HTMLShape.defaultProps, - html: text, - point: [point[0], point[1]], - }, - ] - } - - async function tryCreateShapesFromDataTransfer(dataTransfer: DataTransfer) { - return tryCreateShapeHelper( - tryCreateShapeFromFilePath, - tryCreateShapeFromFiles, - tryCreateShapeFromPageName, - tryCreateShapeFromBlockUUID, - tryCreateShapeFromTextPlain, - tryCreateShapeFromTextHTML, - tryCreateLogseqPortalShapesFromString - )(dataTransfer) - } - - async function tryCreateShapesFromClipboard() { - const items = await navigator.clipboard.read() - const createShapesFn = tryCreateShapeHelper( - tryCreateShapeFromTextPlain, - tryCreateShapeFromTextHTML, - tryCreateLogseqPortalShapesFromString - ) - const allShapes = (await Promise.all(items.map(item => createShapesFn(item)))) - .flat() - .filter(isNonNullable) - - return allShapes - } - - async function tryCreateShapeFromFilePath(item: DataTransfer) { - const file = item.getData('file') - if (!file) return null - - const asset = await createAssetsFromURL(file, 'pdf') - app.addAssets([asset]) - - const newShape = { - ...PdfShape.defaultProps, - id: uniqueId(), - assetId: asset.id, - url: file, - opacity: 1, - } - - if (asset.size) { - Object.assign(newShape, { - point: [point[0] - asset.size[0] / 4 + 16, point[1] - asset.size[1] / 4 + 16], - size: Vec.div(asset.size, 2), - }) - } - return [newShape] - } - - async function tryCreateShapeFromFiles(item: DataTransfer) { - const files = Array.from(item.files) - if (files.length > 0) { - const assets = await createAssetsFromFiles(files) - // ? could we get rid of this side effect? - imageAssetsToCreate = assets - - return assets.map((asset, i) => { - let defaultProps = null - - switch (asset.type) { - case 'video': - defaultProps = VideoShape.defaultProps - break - case 'image': - defaultProps = ImageShape.defaultProps - break - case 'pdf': - defaultProps = PdfShape.defaultProps - break - default: - return null - } - - const newShape = { - ...defaultProps, - id: uniqueId(), - // TODO: Should be place near the last edited shape - assetId: asset.id, - opacity: 1, - } - - if (asset.size) { - Object.assign(newShape, { - point: [point[0] - asset.size[0] / 4 + i * 16, point[1] - asset.size[1] / 4 + i * 16], - size: Vec.div(asset.size, 2), - }) - } - - return newShape - }) - } - return null - } - - async function tryCreateShapeFromTextHTML(item: DataTransfer | ClipboardItem) { - // skips if it's a drop event or using shift key - if (item.types.includes('text/plain') && (shiftKey || fromDrop)) { - return null - } - const rawText = await getDataFromType(item, 'text/html') - if (rawText) { - return tryCreateShapeHelper(tryCreateClonedShapesFromJSON, createHTMLShape)(rawText) - } - return null - } - - async function tryCreateShapeFromBlockUUID(dataTransfer: DataTransfer) { - // This is a Logseq custom data type defined in frontend.components.block - const rawText = dataTransfer.getData('block-uuid') - if (rawText) { - const text = rawText.trim() - const allSelectedBlocks = window.logseq?.api?.get_selected_blocks?.() - const blockUUIDs = - allSelectedBlocks && allSelectedBlocks?.length > 1 - ? allSelectedBlocks.map(b => b.uuid) - : [text] - // ensure all uuid in blockUUIDs is persisted - window.logseq?.api?.set_blocks_id?.(blockUUIDs) - const tasks = blockUUIDs.map(uuid => tryCreateLogseqPortalShapesFromUUID(`((${uuid}))`)) - const newShapes = (await Promise.all(tasks)).flat().filter(isNonNullable) - return newShapes.map((s, idx) => { - // if there are multiple shapes, shift them to the right - return { - ...s, - // TODO: use better alignment? - point: [point[0] + (LogseqPortalShape.defaultProps.size[0] + 16) * idx, point[1]], - } - }) - } - return null - } - - async function tryCreateShapeFromPageName(dataTransfer: DataTransfer) { - // This is a Logseq custom data type defined in frontend.components.block - const rawText = dataTransfer.getData('page-name') - if (rawText) { - const text = rawText.trim() - - return tryCreateLogseqPortalShapesFromUUID(`[[${text}]]`) - } - return null - } - - async function tryCreateShapeFromTextPlain(item: DataTransfer | ClipboardItem) { - const rawText = await getDataFromType(item, 'text/plain') - if (rawText) { - const text = rawText.trim() - return tryCreateShapeHelper(tryCreateShapeFromURL, tryCreateShapeFromIframeString)(text) - } - - return null - } - - function tryCreateClonedShapesFromJSON(rawText: string) { - const result = app.api.getClonedShapesFromTldrString(decodeURIComponent(rawText), point) - if (result) { - const { shapes, assets, bindings } = result - assetsToClone.push(...assets) - bindingsToCreate.push(...bindings) - return shapes - } - return null - } - - async function tryCreateShapeFromURL(rawText: string) { - if (isValidURL(rawText) && !shiftKey) { - if (YOUTUBE_REGEX.test(rawText)) { - return [ - { - ...YouTubeShape.defaultProps, - url: rawText, - point: [point[0], point[1]], - }, - ] - } - - if (X_OR_TWITTER_REGEX.test(rawText)) { - return [ - { - ...TweetShape.defaultProps, - url: rawText, - point: [point[0], point[1]], - }, - ] - } - - return [ - { - ...IFrameShape.defaultProps, - url: rawText, - point: [point[0], point[1]], - }, - ] - } - return null - } - - function tryCreateShapeFromIframeString(rawText: string) { - // if rawText is iframe text - if (rawText.startsWith('[] = newShapes.map(shape => { - return { - ...shape, - parentId: app.currentPageId, - isLocked: false, - id: validUUID(shape.id) ? shape.id : uniqueId(), - } - }) - - const filesOnly = dataTransfer?.types.every(t => t === 'Files') - - app.wrapUpdate(() => { - const allAssets = [...imageAssetsToCreate, ...assetsToClone] - if (allAssets.length > 0) { - app.createAssets(allAssets) - } - if (allShapesToAdd.length > 0) { - app.createShapes(allShapesToAdd) - } - app.currentPage.updateBindings(Object.fromEntries(bindingsToCreate.map(b => [b.id, b]))) - - if (app.selectedShapesArray.length === 1 && allShapesToAdd.length === 1 && fromDrop) { - const source = app.selectedShapesArray[0] - const target = app.getShapeById(allShapesToAdd[0].id!)! - app.createNewLineBinding(source, target) - } - - app.setSelectedShapes(allShapesToAdd.map(s => s.id)) - app.selectedTool.transition('idle') // clears possible editing states - app.cursors.setCursor(TLCursor.Default) - - if (fromDrop || filesOnly) { - app.packIntoRectangle() - } - }) -} - -// FIXME: for assets, we should prompt the user a loading spinner -export function usePaste() { - const { handlers } = React.useContext(LogseqContext) - - return React.useCallback['onPaste']>(async (app, info) => { - // there is a special case for SHIFT+PASTE - // it will set the link to the current selected shape - - if (info.shiftKey && app.selectedShapesArray.length === 1) { - // TODO: thinking about how to make this more generic with usePaste hook - // TODO: handle whiteboard shapes? - const items = await navigator.clipboard.read() - let newRef: string | undefined - if (items.length > 0) { - const blob = await items[0].getType('text/plain') - const rawText = (await blob.text()).trim() - - if (rawText) { - if (/^\(\(.*\)\)$/.test(rawText) && rawText.length === NIL_UUID.length + 4) { - const blockRef = rawText.slice(2, -2) - if (validUUID(blockRef)) { - newRef = blockRef - } - } else if (/^\[\[.*\]\]$/.test(rawText)) { - newRef = rawText.slice(2, -2) - } - } - } - if (newRef) { - app.selectedShapesArray[0].update({ - refs: [newRef], - }) - app.persist() - return - } - // fall through to creating shapes - } - - handleCreatingShapes(app, info, handlers) - }, []) -} diff --git a/packages/tldraw/apps/tldraw-logseq/src/hooks/useQuickAdd.ts b/packages/tldraw/apps/tldraw-logseq/src/hooks/useQuickAdd.ts deleted file mode 100644 index 5c6593d7eb..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/hooks/useQuickAdd.ts +++ /dev/null @@ -1,12 +0,0 @@ -import type { TLReactCallbacks } from '@tldraw/react' -import React from 'react' -import type { Shape } from '../lib' - -export function useQuickAdd() { - return React.useCallback['onCanvasDBClick']>(async app => { - // Give a timeout so that the quick add input will not be blurred too soon - setTimeout(() => { - app.transition('logseq-portal').selectedTool.transition('creating') - }, 100) - }, []) -} diff --git a/packages/tldraw/apps/tldraw-logseq/src/index.ts b/packages/tldraw/apps/tldraw-logseq/src/index.ts deleted file mode 100644 index 5a7ae673ea..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/index.ts +++ /dev/null @@ -1,18 +0,0 @@ -export * from './app' -export * from './lib/preview-manager' - -declare global { - interface Window { - logseq?: { - api?: { - make_asset_url?: (url: string) => string - get_page_blocks_tree?: (pageName: string) => any[] - edit_block?: (uuid: string) => void - set_blocks_id?: (uuids: string[]) => void - open_external_link?: (url: string) => void - get_selected_blocks?: () => { uuid: string }[] - get_state_from_store?: (path: string) => any - } - } - } -} diff --git a/packages/tldraw/apps/tldraw-logseq/src/lib/index.ts b/packages/tldraw/apps/tldraw-logseq/src/lib/index.ts deleted file mode 100644 index d6d828778c..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/lib/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './shapes' -export * from './tools' -export * from './preview-manager' diff --git a/packages/tldraw/apps/tldraw-logseq/src/lib/logseq-context.ts b/packages/tldraw/apps/tldraw-logseq/src/lib/logseq-context.ts deleted file mode 100644 index 8157c279d9..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/lib/logseq-context.ts +++ /dev/null @@ -1,70 +0,0 @@ -import React from 'react' - -export interface SearchResult { - pages?: string[] - blocks?: { content: string; page: number; uuid: string }[] - files?: string[] -} - -export interface LogseqContextValue { - renderers: { - Page: React.FC<{ - pageName: string - }> - Block: React.FC<{ - blockId: string - }> - Breadcrumb: React.FC<{ - blockId: string - levelLimit?: number - endSeparator?: boolean - }> - Tweet: React.FC<{ - tweetId: string - }> - PageName: React.FC<{ - pageName: string - }> - BlockReference: React.FC<{ - blockId: string - }> - BacklinksCount: React.FC<{ - id: string - className?: string - options?: { - 'portal?'?: boolean - 'hover?'?: boolean - renderFn?: (open?: boolean, count?: number) => React.ReactNode - } - }> - KeyboardShortcut: React.FC<{ - action?: string, - shortcut?: string, - opts?: any - }> - } - handlers: { - t: (key: string) => any - search: ( - query: string, - filters: { 'pages?': boolean; 'blocks?': boolean; 'files?': boolean } - ) => Promise - addNewWhiteboard: (pageName: string) => void - exportToImage: (pageName: string, options: object) => void - addNewBlock: (content: string) => string // returns the new block uuid - queryBlockByUUID: (uuid: string) => any - getBlockPageName: (uuid: string) => string - getRedirectPageName: (uuidOrPageName: string) => string - isWhiteboardPage: (pageName: string) => boolean - isMobile: () => boolean - saveAsset: (file: File) => Promise - makeAssetUrl: (relativeUrl: string | null) => string - inflateAsset: (src: string) => object - setCurrentPdf: (src: string | null) => void - sidebarAddBlock: (uuid: string, type: 'block' | 'page') => void - redirectToPage: (uuidOrPageName: string) => void - copyToClipboard: (text: string, html: string) => void - } -} - -export const LogseqContext = React.createContext({} as LogseqContextValue) diff --git a/packages/tldraw/apps/tldraw-logseq/src/lib/preview-manager.tsx b/packages/tldraw/apps/tldraw-logseq/src/lib/preview-manager.tsx deleted file mode 100644 index 184d43c039..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/lib/preview-manager.tsx +++ /dev/null @@ -1,148 +0,0 @@ -import { BoundsUtils, TLAsset, TLDocumentModel, TLShapeConstructor, TLViewport } from '@tldraw/core' -import ReactDOMServer from 'react-dom/server' -import { Shape, shapes } from './shapes' - -const SVG_EXPORT_PADDING = 16 - -const ShapesMap = new Map(shapes.map(shape => [shape.id, shape])) - -const getShapeClass = (type: string): TLShapeConstructor => { - if (!type) throw Error('No shape type provided.') - const Shape = ShapesMap.get(type) - if (!Shape) throw Error(`Could not find shape class for ${type}`) - return Shape -} - -export class PreviewManager { - shapes: Shape[] | undefined - pageId: string | undefined - assets: TLAsset[] | undefined - constructor(serializedApp?: TLDocumentModel) { - if (serializedApp) { - this.load(serializedApp) - } - } - - load(snapshot: TLDocumentModel) { - const page = snapshot?.pages?.[0] - this.pageId = page?.id - this.assets = snapshot.assets - this.shapes = page?.shapes - .map(s => { - const ShapeClass = getShapeClass(s.type) - return new ShapeClass(s) - }) - // do not need to render group shape because it is invisible in preview - .filter(s => s.type !== 'group') - } - - generatePreviewJsx(viewport?: TLViewport, ratio?: number) { - const allBounds = [...(this.shapes ?? []).map(s => s.getRotatedBounds())] - const vBounds = viewport?.currentView - if (vBounds) { - allBounds.push(vBounds) - } - let commonBounds = BoundsUtils.getCommonBounds(allBounds) - if (!commonBounds) { - return null - } - - commonBounds = BoundsUtils.expandBounds(commonBounds, SVG_EXPORT_PADDING) - - // make sure commonBounds is of ratio 4/3 (should we have another ratio setting?) - commonBounds = ratio ? BoundsUtils.ensureRatio(commonBounds, ratio) : commonBounds - - const translatePoint = (p: [number, number]): [string, string] => { - return [(p[0] - commonBounds.minX).toFixed(2), (p[1] - commonBounds.minY).toFixed(2)] - } - - const [vx, vy] = vBounds ? translatePoint([vBounds.minX, vBounds.minY]) : [0, 0] - - const svgElement = commonBounds && ( - - - {vBounds && ( - <> - - - - - - - )} - - - {this.shapes?.map(s => { - const { - bounds, - props: { rotation }, - } = s - const [tx, ty] = translatePoint([bounds.minX, bounds.minY]) - const r = +((((rotation ?? 0) + (bounds.rotation ?? 0)) * 180) / Math.PI).toFixed(2) - const [rdx, rdy] = [(bounds.width / 2).toFixed(2), (bounds.height / 2).toFixed(2)] - const transformArr = [`translate(${tx}, ${ty})`, `rotate(${r}, ${rdx}, ${rdy})`] - return ( - - {s.getShapeSVGJsx({ - assets: this.assets ?? [], - })} - - ) - })} - - - {vBounds && ( - - )} - - ) - return svgElement - } - - exportAsSVG(ratio: number) { - const svgElement = this.generatePreviewJsx(undefined, ratio) - return svgElement ? ReactDOMServer.renderToString(svgElement) : '' - } -} - -/** - * One off helper to generate tldraw preview - * - * @param serializedApp - */ -export function generateSVGFromModel(serializedApp: TLDocumentModel, ratio = 4 / 3) { - const preview = new PreviewManager(serializedApp) - return preview.exportAsSVG(ratio) -} - -export function generateJSXFromModel(serializedApp: TLDocumentModel, ratio = 4 / 3) { - const preview = new PreviewManager(serializedApp) - return preview.generatePreviewJsx(undefined, ratio) -} diff --git a/packages/tldraw/apps/tldraw-logseq/src/lib/shapes/BindingIndicator.tsx b/packages/tldraw/apps/tldraw-logseq/src/lib/shapes/BindingIndicator.tsx deleted file mode 100644 index 01b79e2cb7..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/lib/shapes/BindingIndicator.tsx +++ /dev/null @@ -1,32 +0,0 @@ -interface BindingIndicatorProps { - strokeWidth: number - size: number[] - mode: 'svg' | 'html' -} -export function BindingIndicator({ strokeWidth, size, mode }: BindingIndicatorProps) { - return mode === 'svg' ? ( - - ) : ( -
- ) -} diff --git a/packages/tldraw/apps/tldraw-logseq/src/lib/shapes/BoxShape.tsx b/packages/tldraw/apps/tldraw-logseq/src/lib/shapes/BoxShape.tsx deleted file mode 100644 index 876068ca33..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/lib/shapes/BoxShape.tsx +++ /dev/null @@ -1,195 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import { SVGContainer, TLComponentProps } from '@tldraw/react' -import { TLBoxShape, TLBoxShapeProps, getComputedColor, getTextLabelSize } from '@tldraw/core' -import Vec from '@tldraw/vec' -import * as React from 'react' -import { observer } from 'mobx-react-lite' -import { CustomStyleProps, withClampedStyles } from './style-props' -import { BindingIndicator } from './BindingIndicator' -import { TextLabel } from './text/TextLabel' -import type { SizeLevel } from '.' -import { action, computed } from 'mobx' - -export interface BoxShapeProps extends TLBoxShapeProps, CustomStyleProps { - borderRadius: number - type: 'box' - label: string - fontSize: number - fontWeight: number - italic: boolean - scaleLevel?: SizeLevel -} - -const font = '20px / 1 var(--ls-font-family)' - -const levelToScale = { - xs: 10, - sm: 16, - md: 20, - lg: 32, - xl: 48, - xxl: 60, -} - -export class BoxShape extends TLBoxShape { - static id = 'box' - - static defaultProps: BoxShapeProps = { - id: 'box', - parentId: 'page', - type: 'box', - point: [0, 0], - size: [100, 100], - borderRadius: 2, - stroke: '', - fill: '', - noFill: false, - fontWeight: 400, - fontSize: 20, - italic: false, - strokeType: 'line', - strokeWidth: 2, - opacity: 1, - label: '', - } - - canEdit = true - - ReactComponent = observer( - ({ events, isErasing, isBinding, isSelected, isEditing, onEditingEnd }: TLComponentProps) => { - const { - props: { - size: [w, h], - stroke, - fill, - noFill, - strokeWidth, - strokeType, - borderRadius, - opacity, - label, - italic, - fontWeight, - fontSize, - }, - } = this - - const labelSize = - label || isEditing - ? getTextLabelSize( - label, - { fontFamily: 'var(--ls-font-family)', fontSize, lineHeight: 1, fontWeight }, - 4 - ) - : [0, 0] - const midPoint = Vec.mul(this.props.size, 0.5) - const scale = Math.max(0.5, Math.min(1, w / labelSize[0], h / labelSize[1])) - const bounds = this.getBounds() - - const offset = React.useMemo(() => { - return Vec.sub(midPoint, Vec.toFixed([bounds.width / 2, bounds.height / 2])) - }, [bounds, scale, midPoint]) - - const handleLabelChange = React.useCallback( - (label: string) => { - this.update?.({ label }) - }, - [label] - ) - - return ( -
- - - {isBinding && } - - - -
- ) - } - ) - - @computed get scaleLevel() { - return this.props.scaleLevel ?? 'md' - } - - @action setScaleLevel = async (v?: SizeLevel) => { - this.update({ - scaleLevel: v, - fontSize: levelToScale[v ?? 'md'], - strokeWidth: levelToScale[v ?? 'md'] / 10, - }) - this.onResetBounds() - } - - ReactIndicator = observer(() => { - const { - props: { - size: [w, h], - borderRadius, - isLocked, - }, - } = this - - return ( - - - - ) - }) - - validateProps = (props: Partial) => { - if (props.size !== undefined) { - props.size[0] = Math.max(props.size[0], 1) - props.size[1] = Math.max(props.size[1], 1) - } - if (props.borderRadius !== undefined) props.borderRadius = Math.max(0, props.borderRadius) - return withClampedStyles(this, props) - } -} diff --git a/packages/tldraw/apps/tldraw-logseq/src/lib/shapes/DotShape.tsx b/packages/tldraw/apps/tldraw-logseq/src/lib/shapes/DotShape.tsx deleted file mode 100644 index 26edd9a9da..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/lib/shapes/DotShape.tsx +++ /dev/null @@ -1,62 +0,0 @@ -import { TLDotShape, TLDotShapeProps } from '@tldraw/core' -import { SVGContainer, TLComponentProps } from '@tldraw/react' -import { observer } from 'mobx-react-lite' -import { CustomStyleProps, withClampedStyles } from './style-props' - -export interface DotShapeProps extends TLDotShapeProps, CustomStyleProps { - type: 'dot' -} - -export class DotShape extends TLDotShape { - static id = 'dot' - - static defaultProps: DotShapeProps = { - id: 'dot', - parentId: 'page', - type: 'dot', - point: [0, 0], - radius: 4, - stroke: '#000000', - fill: 'var(--ls-secondary-background-color)', - noFill: false, - strokeType: 'line', - strokeWidth: 2, - opacity: 1, - } - - ReactComponent = observer(({ events, isErasing }: TLComponentProps) => { - const { radius, stroke, fill, strokeWidth, opacity } = this.props - return ( - - - - - ) - }) - - ReactIndicator = observer(() => { - const { radius, isLocked } = this.props - return ( - - ) - }) - - validateProps = (props: Partial) => { - if (props.radius !== undefined) props.radius = Math.max(props.radius, 1) - return withClampedStyles(this, props) - } -} diff --git a/packages/tldraw/apps/tldraw-logseq/src/lib/shapes/EllipseShape.tsx b/packages/tldraw/apps/tldraw-logseq/src/lib/shapes/EllipseShape.tsx deleted file mode 100644 index 9930befbf7..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/lib/shapes/EllipseShape.tsx +++ /dev/null @@ -1,223 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import { - TLEllipseShapeProps, - TLEllipseShape, - getComputedColor, - getTextLabelSize, -} from '@tldraw/core' -import { SVGContainer, TLComponentProps } from '@tldraw/react' -import Vec from '@tldraw/vec' -import * as React from 'react' -import { observer } from 'mobx-react-lite' -import { CustomStyleProps, withClampedStyles } from './style-props' -import { TextLabel } from './text/TextLabel' -import type { SizeLevel } from '.' -import { action, computed } from 'mobx' - -export interface EllipseShapeProps extends TLEllipseShapeProps, CustomStyleProps { - type: 'ellipse' - size: number[] - label: string - fontSize: number - fontWeight: number - italic: boolean - scaleLevel?: SizeLevel -} - -const font = '18px / 1 var(--ls-font-family)' - -const levelToScale = { - xs: 10, - sm: 16, - md: 20, - lg: 32, - xl: 48, - xxl: 60, -} - -export class EllipseShape extends TLEllipseShape { - static id = 'ellipse' - - static defaultProps: EllipseShapeProps = { - id: 'ellipse', - parentId: 'page', - type: 'ellipse', - point: [0, 0], - size: [100, 100], - stroke: '', - fill: '', - noFill: false, - fontWeight: 400, - fontSize: 20, - italic: false, - strokeType: 'line', - strokeWidth: 2, - opacity: 1, - label: '', - } - - canEdit = true - - ReactComponent = observer( - ({ isSelected, isErasing, events, isEditing, onEditingEnd }: TLComponentProps) => { - const { - size: [w, h], - stroke, - fill, - noFill, - strokeWidth, - strokeType, - opacity, - label, - italic, - fontWeight, - fontSize, - } = this.props - - const labelSize = - label || isEditing - ? getTextLabelSize( - label, - { fontFamily: 'var(--ls-font-family)', fontSize, lineHeight: 1, fontWeight }, - 4 - ) - : [0, 0] - const midPoint = Vec.mul(this.props.size, 0.5) - const scale = Math.max(0.5, Math.min(1, w / labelSize[0], h / labelSize[1])) - const bounds = this.getBounds() - - const offset = React.useMemo(() => { - return Vec.sub(midPoint, Vec.toFixed([bounds.width / 2, bounds.height / 2])) - }, [bounds, scale, midPoint]) - - const handleLabelChange = React.useCallback( - (label: string) => { - this.update?.({ label }) - }, - [label] - ) - - return ( -
- - - - - -
- ) - } - ) - - @computed get scaleLevel() { - return this.props.scaleLevel ?? 'md' - } - - @action setScaleLevel = async (v?: SizeLevel) => { - this.update({ - scaleLevel: v, - fontSize: levelToScale[v ?? 'md'], - strokeWidth: levelToScale[v ?? 'md'] / 10, - }) - this.onResetBounds() - } - - ReactIndicator = observer(() => { - const { - size: [w, h], - isLocked, - } = this.props - - return ( - - - - ) - }) - - validateProps = (props: Partial) => { - if (props.size !== undefined) { - props.size[0] = Math.max(props.size[0], 1) - props.size[1] = Math.max(props.size[1], 1) - } - return withClampedStyles(this, props) - } - - /** - * Get a svg group element that can be used to render the shape with only the props data. In the - * base, draw any shape as a box. Can be overridden by subclasses. - */ - getShapeSVGJsx(opts: any) { - const { - size: [w, h], - stroke, - fill, - noFill, - strokeWidth, - strokeType, - opacity, - } = this.props - return ( - - - - - ) - } -} diff --git a/packages/tldraw/apps/tldraw-logseq/src/lib/shapes/GroupShape.tsx b/packages/tldraw/apps/tldraw-logseq/src/lib/shapes/GroupShape.tsx deleted file mode 100644 index 9e93a28b98..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/lib/shapes/GroupShape.tsx +++ /dev/null @@ -1,65 +0,0 @@ -import { GROUP_PADDING, TLGroupShape, TLGroupShapeProps } from '@tldraw/core' -import { SVGContainer, TLComponentProps, useApp } from '@tldraw/react' -import { observer } from 'mobx-react-lite' - -export interface GroupShapeProps extends TLGroupShapeProps {} - -export class GroupShape extends TLGroupShape { - static id = 'group' - - static defaultProps: GroupShapeProps = { - id: 'group', - type: 'group', - parentId: 'page', - point: [0, 0], - size: [0, 0], - children: [], - } - - // TODO: add styles for arrow binding states - ReactComponent = observer(({ events }: TLComponentProps) => { - const strokeWidth = 2 - const bounds = this.getBounds() - const app = useApp() - - const childSelected = app.selectedShapesArray.some(s => { - return app.shapesInGroups([this]).includes(s) - }) - - const Indicator = this.ReactIndicator - - return ( - - - {childSelected && ( - - - - )} - - ) - }) - - ReactIndicator = observer(() => { - const bounds = this.getBounds() - return ( - - ) - }) -} diff --git a/packages/tldraw/apps/tldraw-logseq/src/lib/shapes/HTMLShape.tsx b/packages/tldraw/apps/tldraw-logseq/src/lib/shapes/HTMLShape.tsx deleted file mode 100644 index b4c2b1ed51..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/lib/shapes/HTMLShape.tsx +++ /dev/null @@ -1,159 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import { delay, TLBoxShape, TLBoxShapeProps, TLResetBoundsInfo } from '@tldraw/core' -import { HTMLContainer, TLComponentProps, useApp } from '@tldraw/react' -import Vec from '@tldraw/vec' -import { action, computed } from 'mobx' -import { observer } from 'mobx-react-lite' -import * as React from 'react' -import type { SizeLevel, Shape } from '.' -import { useCameraMovingRef } from '../../hooks/useCameraMoving' -import { withClampedStyles } from './style-props' - -export interface HTMLShapeProps extends TLBoxShapeProps { - type: 'html' - html: string - scaleLevel?: SizeLevel -} - -const levelToScale = { - xs: 0.5, - sm: 0.8, - md: 1, - lg: 1.5, - xl: 2, - xxl: 3, -} - -export class HTMLShape extends TLBoxShape { - static id = 'html' - - static defaultProps: HTMLShapeProps = { - id: 'html', - type: 'html', - parentId: 'page', - point: [0, 0], - size: [600, 0], - html: '', - } - - canChangeAspectRatio = true - canFlip = false - canEdit = true - htmlAnchorRef = React.createRef() - - @computed get scaleLevel() { - return this.props.scaleLevel ?? 'md' - } - - @action setScaleLevel = async (v?: SizeLevel) => { - const newSize = Vec.mul( - this.props.size, - levelToScale[(v as SizeLevel) ?? 'md'] / levelToScale[this.props.scaleLevel ?? 'md'] - ) - this.update({ - scaleLevel: v, - }) - await delay() - this.update({ - size: newSize, - }) - } - - onResetBounds = (info?: TLResetBoundsInfo) => { - if (this.htmlAnchorRef.current) { - const rect = this.htmlAnchorRef.current.getBoundingClientRect() - const [w, h] = Vec.div([rect.width, rect.height], info?.zoom ?? 1) - const clamp = (v: number) => Math.max(Math.min(v || 400, 1400), 10) - this.update({ - size: [clamp(w), clamp(h)], - }) - } - return this - } - - ReactComponent = observer(({ events, isErasing, isEditing }: TLComponentProps) => { - const { - props: { html, scaleLevel }, - } = this - const isMoving = useCameraMovingRef() - const app = useApp() - const isSelected = app.selectedIds.has(this.id) - - const tlEventsEnabled = - isMoving || (isSelected && !isEditing) || app.selectedTool.id !== 'select' - const stop = React.useCallback( - e => { - if (!tlEventsEnabled) { - // TODO: pinching inside Logseq Shape issue - e.stopPropagation() - } - }, - [tlEventsEnabled] - ) - - const scaleRatio = levelToScale[scaleLevel ?? 'md'] - - React.useEffect(() => { - if (this.props.size[1] === 0) { - this.onResetBounds({ zoom: app.viewport.camera.zoom }) - app.persist() - } - }, []) - - return ( - -
-
-
- - ) - }) - - ReactIndicator = observer(() => { - const { - props: { - size: [w, h], - isLocked, - }, - } = this - return ( - - ) - }) - - validateProps = (props: Partial) => { - if (props.size !== undefined) { - props.size[0] = Math.max(props.size[0], 1) - props.size[1] = Math.max(props.size[1], 1) - } - return withClampedStyles(this, props) - } -} diff --git a/packages/tldraw/apps/tldraw-logseq/src/lib/shapes/HighlighterShape.tsx b/packages/tldraw/apps/tldraw-logseq/src/lib/shapes/HighlighterShape.tsx deleted file mode 100644 index 968263fae1..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/lib/shapes/HighlighterShape.tsx +++ /dev/null @@ -1,116 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import { SvgPathUtils, TLDrawShape, TLDrawShapeProps, getComputedColor } from '@tldraw/core' -import { SVGContainer, TLComponentProps } from '@tldraw/react' -import { observer } from 'mobx-react-lite' -import { action, computed, makeObservable } from 'mobx' -import type { SizeLevel } from '.' -import { CustomStyleProps, withClampedStyles } from './style-props' - -export interface HighlighterShapeProps extends TLDrawShapeProps, CustomStyleProps { - type: 'highlighter' - scaleLevel?: SizeLevel -} - -const levelToScale = { - xs: 1, - sm: 1.6, - md: 2, - lg: 3.2, - xl: 4.8, - xxl: 6, -} - -export class HighlighterShape extends TLDrawShape { - constructor(props = {} as Partial) { - super(props) - makeObservable(this) - } - - static id = 'highlighter' - - static defaultProps: HighlighterShapeProps = { - id: 'highlighter', - parentId: 'page', - type: 'highlighter', - point: [0, 0], - points: [], - isComplete: false, - stroke: '', - fill: '', - noFill: true, - strokeType: 'line', - strokeWidth: 2, - opacity: 0.5, - } - - @computed get pointsPath() { - const { points } = this.props - return SvgPathUtils.getCurvedPathForPoints(points) - } - - ReactComponent = observer(({ events, isErasing }: TLComponentProps) => { - const { - pointsPath, - props: { stroke, strokeWidth, opacity }, - } = this - - return ( - - - - ) - }) - - @computed get scaleLevel() { - return this.props.scaleLevel ?? 'md' - } - - @action setScaleLevel = async (v?: SizeLevel) => { - this.update({ - scaleLevel: v, - strokeWidth: levelToScale[v ?? 'md'], - }) - this.onResetBounds() - } - - ReactIndicator = observer(() => { - const { pointsPath, props } = this - return ( - - ) - }) - - validateProps = (props: Partial) => { - props = withClampedStyles(this, props) - if (props.strokeWidth !== undefined) props.strokeWidth = Math.max(props.strokeWidth, 1) - return props - } - - getShapeSVGJsx() { - const { - pointsPath, - props: { stroke, strokeWidth, opacity }, - } = this - return ( - - ) - } -} diff --git a/packages/tldraw/apps/tldraw-logseq/src/lib/shapes/IFrameShape.tsx b/packages/tldraw/apps/tldraw-logseq/src/lib/shapes/IFrameShape.tsx deleted file mode 100644 index db6a5aea1c..0000000000 --- a/packages/tldraw/apps/tldraw-logseq/src/lib/shapes/IFrameShape.tsx +++ /dev/null @@ -1,100 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import * as React from 'react' -import { TLBoxShape, TLBoxShapeProps } from '@tldraw/core' -import { HTMLContainer, TLComponentProps, useApp } from '@tldraw/react' -import { action } from 'mobx' -import { observer } from 'mobx-react-lite' - -export interface IFrameShapeProps extends TLBoxShapeProps { - type: 'iframe' - url: string -} - -export class IFrameShape extends TLBoxShape { - static id = 'iframe' - frameRef = React.createRef() - - static defaultProps: IFrameShapeProps = { - id: 'iframe', - type: 'iframe', - parentId: 'page', - point: [0, 0], - size: [853, 480], - url: '', - } - - canEdit = true - - @action onIFrameSourceChange = (url: string) => { - this.update({ url }) - } - - @action reload = () => { - if (this.frameRef.current) { - this.frameRef.current.src = this.frameRef?.current?.src - } - } - - ReactComponent = observer(({ events, isErasing, isEditing }: TLComponentProps) => { - const ref = React.useRef(null) - const app = useApp() - - return ( - -
- {this.props.url && ( -
-