@tldraw/commenting 0.0.0-bootstrap → 5.3.0-canary.04044ed9e96d
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -2
- package/commenting.css +1152 -350
- package/dist-cjs/canvas/anchor-lifecycle.js +148 -0
- package/dist-cjs/canvas/anchor-lifecycle.js.map +7 -0
- package/dist-cjs/{ui/avatar.js → canvas/canvas-events.js} +14 -22
- package/dist-cjs/canvas/canvas-events.js.map +7 -0
- package/dist-cjs/canvas/cluster-badge.js +121 -0
- package/dist-cjs/canvas/cluster-badge.js.map +7 -0
- package/dist-cjs/canvas/cluster-fade.js +85 -0
- package/dist-cjs/canvas/cluster-fade.js.map +7 -0
- package/dist-cjs/canvas/cluster-input.js +53 -3
- package/dist-cjs/canvas/cluster-input.js.map +2 -2
- package/dist-cjs/canvas/cluster-model.js +252 -0
- package/dist-cjs/canvas/cluster-model.js.map +7 -0
- package/dist-cjs/canvas/comment-body.js +1 -1
- package/dist-cjs/canvas/comment-body.js.map +2 -2
- package/dist-cjs/canvas/comment-drafts.js +54 -0
- package/dist-cjs/canvas/comment-drafts.js.map +7 -0
- package/dist-cjs/canvas/comment-mutations.js +152 -0
- package/dist-cjs/canvas/comment-mutations.js.map +7 -0
- package/dist-cjs/canvas/comment-reactions.js +160 -0
- package/dist-cjs/canvas/comment-reactions.js.map +7 -0
- package/dist-cjs/canvas/comment-render.js +9 -6
- package/dist-cjs/canvas/comment-render.js.map +2 -2
- package/dist-cjs/canvas/comment-store.js +19 -9
- package/dist-cjs/canvas/comment-store.js.map +2 -2
- package/dist-cjs/canvas/comment-tool.js +63 -14
- package/dist-cjs/canvas/comment-tool.js.map +2 -2
- package/dist-cjs/canvas/comments-filter-menu.js +17 -37
- package/dist-cjs/canvas/comments-filter-menu.js.map +2 -2
- package/dist-cjs/canvas/comments-overflow-menu.js +25 -22
- package/dist-cjs/canvas/comments-overflow-menu.js.map +2 -2
- package/dist-cjs/canvas/comments-overlay.js +151 -989
- package/dist-cjs/canvas/comments-overlay.js.map +3 -3
- package/dist-cjs/canvas/comments-sidebar.js +49 -41
- package/dist-cjs/canvas/comments-sidebar.js.map +2 -2
- package/dist-cjs/canvas/comments-visibility-toggle.js +45 -0
- package/dist-cjs/canvas/comments-visibility-toggle.js.map +7 -0
- package/dist-cjs/canvas/context.js +17 -0
- package/dist-cjs/canvas/context.js.map +7 -0
- package/dist-cjs/canvas/hooks.js +28 -3
- package/dist-cjs/canvas/hooks.js.map +2 -2
- package/dist-cjs/canvas/license.js.map +1 -1
- package/dist-cjs/canvas/mobile-placement.js +91 -0
- package/dist-cjs/canvas/mobile-placement.js.map +7 -0
- package/dist-cjs/canvas/options.js +57 -2
- package/dist-cjs/canvas/options.js.map +2 -2
- package/dist-cjs/canvas/pending-composer.js +134 -0
- package/dist-cjs/canvas/pending-composer.js.map +7 -0
- package/dist-cjs/canvas/pin-stacking.js +81 -0
- package/dist-cjs/canvas/pin-stacking.js.map +7 -0
- package/dist-cjs/canvas/region-box.js +113 -0
- package/dist-cjs/canvas/region-box.js.map +7 -0
- package/dist-cjs/canvas/sidebar-filters.js +2 -2
- package/dist-cjs/canvas/sidebar-filters.js.map +2 -2
- package/dist-cjs/canvas/state.js +28 -14
- package/dist-cjs/canvas/state.js.map +2 -2
- package/dist-cjs/canvas/thread-pin.js +304 -0
- package/dist-cjs/canvas/thread-pin.js.map +7 -0
- package/dist-cjs/canvas/thread-preview.js +177 -0
- package/dist-cjs/canvas/thread-preview.js.map +7 -0
- package/dist-cjs/canvas/thread-stack.js +199 -0
- package/dist-cjs/canvas/thread-stack.js.map +7 -0
- package/dist-cjs/canvas/thread-state.js +82 -21
- package/dist-cjs/canvas/thread-state.js.map +2 -2
- package/dist-cjs/canvas/thread-view.js +450 -0
- package/dist-cjs/canvas/thread-view.js.map +7 -0
- package/dist-cjs/clustering/computeClusterTable.js +6 -6
- package/dist-cjs/clustering/computeClusterTable.js.map +2 -2
- package/dist-cjs/clustering/replay.js +89 -22
- package/dist-cjs/clustering/replay.js.map +3 -3
- package/dist-cjs/clustering/runtime.js +126 -7
- package/dist-cjs/clustering/runtime.js.map +2 -2
- package/dist-cjs/clustering/types.js.map +1 -1
- package/dist-cjs/index.d.ts +904 -353
- package/dist-cjs/index.js +52 -28
- package/dist-cjs/index.js.map +2 -2
- package/dist-cjs/ui/byline.js +10 -6
- package/dist-cjs/ui/byline.js.map +2 -2
- package/dist-cjs/ui/comment-card.js +15 -8
- package/dist-cjs/ui/comment-card.js.map +2 -2
- package/dist-cjs/ui/comment-composer.js +124 -39
- package/dist-cjs/ui/comment-composer.js.map +2 -2
- package/dist-cjs/ui/comment-pin.js +11 -2
- package/dist-cjs/ui/comment-pin.js.map +2 -2
- package/dist-cjs/ui/comment-thread.js +9 -7
- package/dist-cjs/ui/comment-thread.js.map +2 -2
- package/dist-cjs/ui/comments-list.js +39 -40
- package/dist-cjs/ui/comments-list.js.map +2 -2
- package/dist-cjs/ui/count-badge.js +3 -2
- package/dist-cjs/ui/count-badge.js.map +2 -2
- package/dist-cjs/ui/emoji-picker.js +54 -0
- package/dist-cjs/ui/emoji-picker.js.map +7 -0
- package/dist-cjs/ui/empty-state.js +3 -3
- package/dist-cjs/ui/empty-state.js.map +2 -2
- package/dist-cjs/ui/format-time.js +16 -1
- package/dist-cjs/ui/format-time.js.map +2 -2
- package/dist-cjs/ui/icons.js +115 -0
- package/dist-cjs/ui/icons.js.map +7 -0
- package/dist-cjs/ui/reaction-picker.js +71 -0
- package/dist-cjs/ui/reaction-picker.js.map +7 -0
- package/dist-cjs/ui/reaction.js +58 -6
- package/dist-cjs/ui/reaction.js.map +2 -2
- package/dist-cjs/ui/reactions.js +20 -7
- package/dist-cjs/ui/reactions.js.map +2 -2
- package/dist-cjs/ui/{mention.js → reply-count.js} +9 -11
- package/dist-cjs/ui/reply-count.js.map +7 -0
- package/dist-cjs/ui/send-button.js +13 -1
- package/dist-cjs/ui/send-button.js.map +2 -2
- package/dist-cjs/ui/{comment-text.js → visual-viewport.js} +12 -9
- package/dist-cjs/ui/visual-viewport.js.map +7 -0
- package/dist-esm/canvas/anchor-lifecycle.mjs +128 -0
- package/dist-esm/canvas/anchor-lifecycle.mjs.map +7 -0
- package/dist-esm/canvas/canvas-events.mjs +15 -0
- package/dist-esm/canvas/canvas-events.mjs.map +7 -0
- package/dist-esm/canvas/cluster-badge.mjs +106 -0
- package/dist-esm/canvas/cluster-badge.mjs.map +7 -0
- package/dist-esm/canvas/cluster-fade.mjs +65 -0
- package/dist-esm/canvas/cluster-fade.mjs.map +7 -0
- package/dist-esm/canvas/cluster-input.mjs +54 -4
- package/dist-esm/canvas/cluster-input.mjs.map +2 -2
- package/dist-esm/canvas/cluster-model.mjs +236 -0
- package/dist-esm/canvas/cluster-model.mjs.map +7 -0
- package/dist-esm/canvas/comment-body.mjs +1 -1
- package/dist-esm/canvas/comment-body.mjs.map +2 -2
- package/dist-esm/canvas/comment-drafts.mjs +34 -0
- package/dist-esm/canvas/comment-drafts.mjs.map +7 -0
- package/dist-esm/canvas/comment-mutations.mjs +132 -0
- package/dist-esm/canvas/comment-mutations.mjs.map +7 -0
- package/dist-esm/canvas/comment-reactions.mjs +145 -0
- package/dist-esm/canvas/comment-reactions.mjs.map +7 -0
- package/dist-esm/canvas/comment-render.mjs +10 -7
- package/dist-esm/canvas/comment-render.mjs.map +2 -2
- package/dist-esm/canvas/comment-store.mjs +19 -9
- package/dist-esm/canvas/comment-store.mjs.map +2 -2
- package/dist-esm/canvas/comment-tool.mjs +66 -17
- package/dist-esm/canvas/comment-tool.mjs.map +2 -2
- package/dist-esm/canvas/comments-filter-menu.mjs +17 -36
- package/dist-esm/canvas/comments-filter-menu.mjs.map +2 -2
- package/dist-esm/canvas/comments-overflow-menu.mjs +27 -22
- package/dist-esm/canvas/comments-overflow-menu.mjs.map +2 -2
- package/dist-esm/canvas/comments-overlay.mjs +157 -1010
- package/dist-esm/canvas/comments-overlay.mjs.map +3 -3
- package/dist-esm/canvas/comments-sidebar.mjs +53 -46
- package/dist-esm/canvas/comments-sidebar.mjs.map +2 -2
- package/dist-esm/canvas/comments-visibility-toggle.mjs +25 -0
- package/dist-esm/canvas/comments-visibility-toggle.mjs.map +7 -0
- package/dist-esm/canvas/context.mjs +1 -0
- package/dist-esm/canvas/context.mjs.map +7 -0
- package/dist-esm/canvas/hooks.mjs +35 -5
- package/dist-esm/canvas/hooks.mjs.map +2 -2
- package/dist-esm/canvas/license.mjs.map +1 -1
- package/dist-esm/canvas/mobile-placement.mjs +71 -0
- package/dist-esm/canvas/mobile-placement.mjs.map +7 -0
- package/dist-esm/canvas/options.mjs +59 -3
- package/dist-esm/canvas/options.mjs.map +2 -2
- package/dist-esm/canvas/pending-composer.mjs +126 -0
- package/dist-esm/canvas/pending-composer.mjs.map +7 -0
- package/dist-esm/canvas/pin-stacking.mjs +61 -0
- package/dist-esm/canvas/pin-stacking.mjs.map +7 -0
- package/dist-esm/canvas/region-box.mjs +93 -0
- package/dist-esm/canvas/region-box.mjs.map +7 -0
- package/dist-esm/canvas/sidebar-filters.mjs +2 -2
- package/dist-esm/canvas/sidebar-filters.mjs.map +2 -2
- package/dist-esm/canvas/state.mjs +29 -19
- package/dist-esm/canvas/state.mjs.map +2 -2
- package/dist-esm/canvas/thread-pin.mjs +310 -0
- package/dist-esm/canvas/thread-pin.mjs.map +7 -0
- package/dist-esm/canvas/thread-preview.mjs +163 -0
- package/dist-esm/canvas/thread-preview.mjs.map +7 -0
- package/dist-esm/canvas/thread-stack.mjs +189 -0
- package/dist-esm/canvas/thread-stack.mjs.map +7 -0
- package/dist-esm/canvas/thread-state.mjs +86 -22
- package/dist-esm/canvas/thread-state.mjs.map +2 -2
- package/dist-esm/canvas/thread-view.mjs +461 -0
- package/dist-esm/canvas/thread-view.mjs.map +7 -0
- package/dist-esm/clustering/computeClusterTable.mjs +6 -6
- package/dist-esm/clustering/computeClusterTable.mjs.map +2 -2
- package/dist-esm/clustering/replay.mjs +89 -22
- package/dist-esm/clustering/replay.mjs.map +3 -3
- package/dist-esm/clustering/runtime.mjs +126 -7
- package/dist-esm/clustering/runtime.mjs.map +2 -2
- package/dist-esm/index.d.mts +904 -353
- package/dist-esm/index.mjs +102 -43
- package/dist-esm/index.mjs.map +2 -2
- package/dist-esm/ui/byline.mjs +11 -7
- package/dist-esm/ui/byline.mjs.map +2 -2
- package/dist-esm/ui/comment-card.mjs +15 -8
- package/dist-esm/ui/comment-card.mjs.map +2 -2
- package/dist-esm/ui/comment-composer.mjs +135 -39
- package/dist-esm/ui/comment-composer.mjs.map +2 -2
- package/dist-esm/ui/comment-pin.mjs +11 -2
- package/dist-esm/ui/comment-pin.mjs.map +2 -2
- package/dist-esm/ui/comment-thread.mjs +9 -7
- package/dist-esm/ui/comment-thread.mjs.map +2 -2
- package/dist-esm/ui/comments-list.mjs +51 -50
- package/dist-esm/ui/comments-list.mjs.map +2 -2
- package/dist-esm/ui/count-badge.mjs +3 -2
- package/dist-esm/ui/count-badge.mjs.map +2 -2
- package/dist-esm/ui/emoji-picker.mjs +34 -0
- package/dist-esm/ui/emoji-picker.mjs.map +7 -0
- package/dist-esm/ui/empty-state.mjs +3 -3
- package/dist-esm/ui/empty-state.mjs.map +2 -2
- package/dist-esm/ui/format-time.mjs +16 -1
- package/dist-esm/ui/format-time.mjs.map +2 -2
- package/dist-esm/ui/icons.mjs +95 -0
- package/dist-esm/ui/icons.mjs.map +7 -0
- package/dist-esm/ui/reaction-picker.mjs +59 -0
- package/dist-esm/ui/reaction-picker.mjs.map +7 -0
- package/dist-esm/ui/reaction.mjs +59 -7
- package/dist-esm/ui/reaction.mjs.map +2 -2
- package/dist-esm/ui/reactions.mjs +21 -8
- package/dist-esm/ui/reactions.mjs.map +2 -2
- package/dist-esm/ui/reply-count.mjs +9 -0
- package/dist-esm/ui/reply-count.mjs.map +7 -0
- package/dist-esm/ui/send-button.mjs +13 -1
- package/dist-esm/ui/send-button.mjs.map +2 -2
- package/dist-esm/ui/visual-viewport.mjs +12 -0
- package/dist-esm/ui/visual-viewport.mjs.map +7 -0
- package/package.json +6 -6
- package/src/canvas/anchor-lifecycle.test.ts +290 -0
- package/src/canvas/anchor-lifecycle.ts +191 -0
- package/src/canvas/canvas-events.ts +18 -0
- package/src/canvas/canvas.css +464 -55
- package/src/canvas/cluster-badge.tsx +133 -0
- package/src/canvas/cluster-fade.ts +102 -0
- package/src/canvas/cluster-input.test.ts +178 -36
- package/src/canvas/cluster-input.ts +95 -9
- package/src/canvas/cluster-model.ts +378 -0
- package/src/canvas/comment-body.tsx +1 -1
- package/src/canvas/comment-drafts.test.ts +55 -0
- package/src/canvas/comment-drafts.ts +46 -0
- package/src/canvas/comment-mutations.test.ts +452 -0
- package/src/canvas/comment-mutations.ts +299 -0
- package/src/canvas/comment-reactions.test.ts +154 -0
- package/src/canvas/comment-reactions.tsx +246 -0
- package/src/canvas/comment-render.test.ts +1 -1
- package/src/canvas/comment-render.ts +17 -13
- package/src/canvas/comment-store.ts +68 -33
- package/src/canvas/comment-tool.test.ts +162 -0
- package/src/canvas/comment-tool.tsx +103 -25
- package/src/canvas/comments-filter-menu.tsx +20 -36
- package/src/canvas/comments-overflow-menu.tsx +17 -19
- package/src/canvas/comments-overlay.tsx +252 -1369
- package/src/canvas/comments-sidebar.test.ts +45 -0
- package/src/canvas/comments-sidebar.tsx +112 -73
- package/src/canvas/comments-visibility-toggle.tsx +25 -0
- package/src/canvas/context.ts +48 -0
- package/src/canvas/hooks.test.ts +94 -0
- package/src/canvas/hooks.ts +66 -11
- package/src/canvas/license.ts +1 -1
- package/src/canvas/mobile-placement.ts +115 -0
- package/src/canvas/options.test.ts +176 -4
- package/src/canvas/options.ts +276 -18
- package/src/canvas/pending-composer.tsx +157 -0
- package/src/canvas/pin-stacking.test.ts +224 -0
- package/src/canvas/pin-stacking.ts +103 -0
- package/src/canvas/region-box.tsx +124 -0
- package/src/canvas/sidebar-filters.ts +4 -3
- package/src/canvas/state.ts +88 -39
- package/src/canvas/thread-pin.tsx +418 -0
- package/src/canvas/thread-preview.test.ts +91 -0
- package/src/canvas/thread-preview.tsx +294 -0
- package/src/canvas/thread-stack.tsx +242 -0
- package/src/canvas/thread-state.test.ts +260 -0
- package/src/canvas/thread-state.ts +171 -37
- package/src/canvas/thread-view.test.ts +72 -0
- package/src/canvas/thread-view.tsx +614 -0
- package/src/clustering/computeClusterTable.test.ts +24 -23
- package/src/clustering/computeClusterTable.ts +17 -8
- package/src/clustering/replay.test.ts +0 -7
- package/src/clustering/replay.ts +131 -32
- package/src/clustering/runtime.test.ts +267 -13
- package/src/clustering/runtime.ts +176 -19
- package/src/clustering/schedule.test.ts +0 -6
- package/src/clustering/screen-offsets.test.ts +171 -0
- package/src/clustering/types.ts +19 -9
- package/src/index.ts +91 -42
- package/src/ui/byline.tsx +21 -9
- package/src/ui/comment-card.tsx +20 -10
- package/src/ui/comment-composer.tsx +178 -56
- package/src/ui/comment-pin.tsx +13 -2
- package/src/ui/comment-thread.tsx +13 -6
- package/src/ui/comments-list.test.ts +31 -0
- package/src/ui/comments-list.tsx +82 -47
- package/src/ui/comments.css +577 -294
- package/src/ui/count-badge.tsx +9 -2
- package/src/ui/emoji-picker.test.ts +25 -0
- package/src/ui/emoji-picker.tsx +76 -0
- package/src/ui/empty-state.tsx +3 -3
- package/src/ui/format-time.test.ts +69 -0
- package/src/ui/format-time.ts +27 -2
- package/src/ui/icons.tsx +116 -0
- package/src/ui/reaction-picker.tsx +102 -0
- package/src/ui/reaction.tsx +125 -6
- package/src/ui/reactions.tsx +69 -10
- package/src/ui/reply-count.ts +16 -0
- package/src/ui/send-button.tsx +13 -3
- package/src/ui/visual-viewport.test.ts +36 -0
- package/src/ui/visual-viewport.ts +27 -0
- package/dist-cjs/canvas/region-options.js +0 -49
- package/dist-cjs/canvas/region-options.js.map +0 -7
- package/dist-cjs/ui/avatar.js.map +0 -7
- package/dist-cjs/ui/comment-mention.js +0 -42
- package/dist-cjs/ui/comment-mention.js.map +0 -7
- package/dist-cjs/ui/comment-text.js.map +0 -7
- package/dist-cjs/ui/mention-list.js +0 -70
- package/dist-cjs/ui/mention-list.js.map +0 -7
- package/dist-cjs/ui/mention-suggestion.js +0 -206
- package/dist-cjs/ui/mention-suggestion.js.map +0 -7
- package/dist-cjs/ui/mention.js.map +0 -7
- package/dist-cjs/ui/render-markdown.js +0 -63
- package/dist-cjs/ui/render-markdown.js.map +0 -7
- package/dist-esm/canvas/region-options.mjs +0 -29
- package/dist-esm/canvas/region-options.mjs.map +0 -7
- package/dist-esm/ui/avatar.mjs +0 -23
- package/dist-esm/ui/avatar.mjs.map +0 -7
- package/dist-esm/ui/comment-mention.mjs +0 -22
- package/dist-esm/ui/comment-mention.mjs.map +0 -7
- package/dist-esm/ui/comment-text.mjs +0 -9
- package/dist-esm/ui/comment-text.mjs.map +0 -7
- package/dist-esm/ui/mention-list.mjs +0 -50
- package/dist-esm/ui/mention-list.mjs.map +0 -7
- package/dist-esm/ui/mention-suggestion.mjs +0 -186
- package/dist-esm/ui/mention-suggestion.mjs.map +0 -7
- package/dist-esm/ui/mention.mjs +0 -11
- package/dist-esm/ui/mention.mjs.map +0 -7
- package/dist-esm/ui/render-markdown.mjs +0 -45
- package/dist-esm/ui/render-markdown.mjs.map +0 -7
- package/src/canvas/region-options.ts +0 -57
- package/src/ui/avatar.tsx +0 -31
- package/src/ui/comment-mention.ts +0 -47
- package/src/ui/comment-text.tsx +0 -12
- package/src/ui/mention-list.tsx +0 -106
- package/src/ui/mention-suggestion.test.ts +0 -18
- package/src/ui/mention-suggestion.tsx +0 -285
- package/src/ui/mention.tsx +0 -9
- package/src/ui/render-markdown.tsx +0 -72
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var region_box_exports = {};
|
|
20
|
+
__export(region_box_exports, {
|
|
21
|
+
REGION_CORNERS: () => REGION_CORNERS,
|
|
22
|
+
REGION_HANDLE_MARGIN_PX: () => REGION_HANDLE_MARGIN_PX,
|
|
23
|
+
RegionBox: () => RegionBox,
|
|
24
|
+
RegionDraftBox: () => RegionDraftBox,
|
|
25
|
+
RegionResizeHandles: () => RegionResizeHandles
|
|
26
|
+
});
|
|
27
|
+
module.exports = __toCommonJS(region_box_exports);
|
|
28
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
29
|
+
var import_react = require("react");
|
|
30
|
+
var import_tldraw = require("tldraw");
|
|
31
|
+
var import_state = require("./state");
|
|
32
|
+
function RegionBox({ editor, box }) {
|
|
33
|
+
const rect = (0, import_tldraw.useValue)(
|
|
34
|
+
"region rect",
|
|
35
|
+
() => {
|
|
36
|
+
const topLeft = editor.pageToViewport({ x: box.x, y: box.y });
|
|
37
|
+
const zoom = editor.getZoomLevel();
|
|
38
|
+
return { left: topLeft.x, top: topLeft.y, width: box.w * zoom, height: box.h * zoom };
|
|
39
|
+
},
|
|
40
|
+
[editor, box.x, box.y, box.w, box.h]
|
|
41
|
+
);
|
|
42
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "tlui-cmt-canvas-region", style: rect });
|
|
43
|
+
}
|
|
44
|
+
function RegionDraftBox({ editor }) {
|
|
45
|
+
const box = (0, import_tldraw.useValue)("region draft", () => import_state.regionDraft.get(editor), [editor]);
|
|
46
|
+
if (!box) return null;
|
|
47
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(RegionBox, { editor, box });
|
|
48
|
+
}
|
|
49
|
+
const REGION_CORNERS = [
|
|
50
|
+
{ x: 0, y: 0, cursor: "nwse-resize" },
|
|
51
|
+
{ x: 1, y: 0, cursor: "nesw-resize" },
|
|
52
|
+
{ x: 0, y: 1, cursor: "nesw-resize" },
|
|
53
|
+
{ x: 1, y: 1, cursor: "nwse-resize" }
|
|
54
|
+
];
|
|
55
|
+
const REGION_HANDLE_MARGIN_PX = 12;
|
|
56
|
+
function resizeRegion(box, handle, cursor) {
|
|
57
|
+
const controlsX = handle.x !== 0.5;
|
|
58
|
+
const controlsY = handle.y !== 0.5;
|
|
59
|
+
const fixedX = box.x + (1 - handle.x) * box.w;
|
|
60
|
+
const fixedY = box.y + (1 - handle.y) * box.h;
|
|
61
|
+
return {
|
|
62
|
+
x: controlsX ? Math.min(fixedX, cursor.x) : box.x,
|
|
63
|
+
y: controlsY ? Math.min(fixedY, cursor.y) : box.y,
|
|
64
|
+
w: controlsX ? Math.abs(cursor.x - fixedX) : box.w,
|
|
65
|
+
h: controlsY ? Math.abs(cursor.y - fixedY) : box.h
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
function RegionResizeHandles({
|
|
69
|
+
editor,
|
|
70
|
+
box,
|
|
71
|
+
handles,
|
|
72
|
+
onPreview,
|
|
73
|
+
onCommit
|
|
74
|
+
}) {
|
|
75
|
+
const boxRef = (0, import_react.useRef)(null);
|
|
76
|
+
const points = (0, import_tldraw.useValue)(
|
|
77
|
+
"region handle points",
|
|
78
|
+
() => handles.map((h) => {
|
|
79
|
+
const p = editor.pageToViewport({ x: box.x + h.x * box.w, y: box.y + h.y * box.h });
|
|
80
|
+
return { ...h, key: `${h.x}-${h.y}`, left: p.x, top: p.y };
|
|
81
|
+
}),
|
|
82
|
+
[editor, box.x, box.y, box.w, box.h, handles]
|
|
83
|
+
);
|
|
84
|
+
const startResize = (e) => {
|
|
85
|
+
e.stopPropagation();
|
|
86
|
+
boxRef.current = box;
|
|
87
|
+
e.currentTarget.setPointerCapture(e.pointerId);
|
|
88
|
+
};
|
|
89
|
+
const resizedTo = (h, e) => resizeRegion(boxRef.current, h, editor.screenToPage({ x: e.clientX, y: e.clientY }));
|
|
90
|
+
const onResize = (h) => (e) => {
|
|
91
|
+
if (boxRef.current) onPreview(resizedTo(h, e));
|
|
92
|
+
};
|
|
93
|
+
const endResize = (h) => (e) => {
|
|
94
|
+
if (!boxRef.current) return;
|
|
95
|
+
const bounds = resizedTo(h, e);
|
|
96
|
+
boxRef.current = null;
|
|
97
|
+
if (e.currentTarget.hasPointerCapture(e.pointerId))
|
|
98
|
+
e.currentTarget.releasePointerCapture(e.pointerId);
|
|
99
|
+
onCommit(bounds);
|
|
100
|
+
};
|
|
101
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: points.map((h) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
102
|
+
"div",
|
|
103
|
+
{
|
|
104
|
+
className: "tlui-cmt-canvas-region-handle",
|
|
105
|
+
style: { left: h.left, top: h.top, cursor: h.cursor },
|
|
106
|
+
onPointerDown: startResize,
|
|
107
|
+
onPointerMove: onResize(h),
|
|
108
|
+
onPointerUp: endResize(h)
|
|
109
|
+
},
|
|
110
|
+
h.key
|
|
111
|
+
)) });
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=region-box.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/canvas/region-box.tsx"],
|
|
4
|
+
"sourcesContent": ["import { type PointerEvent as ReactPointerEvent, useRef } from 'react'\nimport { type BoxModel, Editor, useValue, VecLike } from 'tldraw'\nimport { regionDraft } from './state'\n\n/** A region's dashed box. Purely visual \u2014 a region moves by its pin and resizes from its corner\n * handles, so the box itself takes no pointer events. Positioned in viewport space, as a sibling\n * of the pins in the canvas layer. */\nexport function RegionBox({ editor, box }: { editor: Editor; box: BoxModel }) {\n\tconst rect = useValue(\n\t\t'region rect',\n\t\t() => {\n\t\t\t// Position from the page\u2192viewport top-left; screen size scales with zoom, page size doesn't.\n\t\t\tconst topLeft = editor.pageToViewport({ x: box.x, y: box.y })\n\t\t\tconst zoom = editor.getZoomLevel()\n\t\t\treturn { left: topLeft.x, top: topLeft.y, width: box.w * zoom, height: box.h * zoom }\n\t\t},\n\t\t[editor, box.x, box.y, box.w, box.h]\n\t)\n\treturn <div className=\"tlui-cmt-canvas-region\" style={rect} />\n}\n\n/** The live region being dragged out by the comment tool, or nothing when not dragging. */\nexport function RegionDraftBox({ editor }: { editor: Editor }) {\n\tconst box = useValue('region draft', () => regionDraft.get(editor), [editor])\n\tif (!box) return null\n\treturn <RegionBox editor={editor} box={box} />\n}\n\n// A resize handle's normalized 0\u20131 spot on the box, and its cursor. An axis at 0.5 is *not*\n// controlled by that handle \u2014 the resize math reads the spot rather than special-casing corners.\nexport interface RegionHandle {\n\tx: number\n\ty: number\n\tcursor: string\n}\n\n// The four corners, each resizing both axes.\nexport const REGION_CORNERS: readonly RegionHandle[] = [\n\t{ x: 0, y: 0, cursor: 'nwse-resize' },\n\t{ x: 1, y: 0, cursor: 'nesw-resize' },\n\t{ x: 0, y: 1, cursor: 'nesw-resize' },\n\t{ x: 1, y: 1, cursor: 'nwse-resize' },\n]\n\n// Screen-space slack around a region's bounds within which its box and handles stay revealed, so\n// the handles (which sit on the edge) are comfortably reachable.\nexport const REGION_HANDLE_MARGIN_PX = 12\n\n/** Resize `box` by dragging `handle` to `cursor` (page coords). Each controlled axis spans from the\n * handle's fixed opposite edge to the cursor (normalized, so dragging past it flips); an axis the\n * handle doesn't control (a midpoint, at 0.5) keeps its original position and size. */\nfunction resizeRegion(box: BoxModel, handle: RegionHandle, cursor: VecLike): BoxModel {\n\tconst controlsX = handle.x !== 0.5\n\tconst controlsY = handle.y !== 0.5\n\tconst fixedX = box.x + (1 - handle.x) * box.w\n\tconst fixedY = box.y + (1 - handle.y) * box.h\n\treturn {\n\t\tx: controlsX ? Math.min(fixedX, cursor.x) : box.x,\n\t\ty: controlsY ? Math.min(fixedY, cursor.y) : box.y,\n\t\tw: controlsX ? Math.abs(cursor.x - fixedX) : box.w,\n\t\th: controlsY ? Math.abs(cursor.y - fixedY) : box.h,\n\t}\n}\n\n/** Draggable handles that resize a region \u2014 corners (both axes) or edges (one axis), per the resize\n * option. Previews live, commits on release. */\nexport function RegionResizeHandles({\n\teditor,\n\tbox,\n\thandles,\n\tonPreview,\n\tonCommit,\n}: {\n\teditor: Editor\n\tbox: BoxModel\n\thandles: readonly RegionHandle[]\n\tonPreview(bounds: BoxModel | null): void\n\tonCommit(bounds: BoxModel): void\n}) {\n\t// The box at pointer-down, captured so the box prop reflowing under the live preview doesn't move\n\t// the fixed edges mid-drag.\n\tconst boxRef = useRef<BoxModel | null>(null)\n\tconst points = useValue(\n\t\t'region handle points',\n\t\t() =>\n\t\t\thandles.map((h) => {\n\t\t\t\tconst p = editor.pageToViewport({ x: box.x + h.x * box.w, y: box.y + h.y * box.h })\n\t\t\t\treturn { ...h, key: `${h.x}-${h.y}`, left: p.x, top: p.y }\n\t\t\t}),\n\t\t[editor, box.x, box.y, box.w, box.h, handles]\n\t)\n\tconst startResize = (e: ReactPointerEvent<HTMLDivElement>) => {\n\t\te.stopPropagation()\n\t\tboxRef.current = box\n\t\te.currentTarget.setPointerCapture(e.pointerId)\n\t}\n\tconst resizedTo = (h: RegionHandle, e: ReactPointerEvent<HTMLDivElement>): BoxModel =>\n\t\tresizeRegion(boxRef.current!, h, editor.screenToPage({ x: e.clientX, y: e.clientY }))\n\tconst onResize = (h: RegionHandle) => (e: ReactPointerEvent<HTMLDivElement>) => {\n\t\tif (boxRef.current) onPreview(resizedTo(h, e))\n\t}\n\tconst endResize = (h: RegionHandle) => (e: ReactPointerEvent<HTMLDivElement>) => {\n\t\tif (!boxRef.current) return\n\t\tconst bounds = resizedTo(h, e)\n\t\tboxRef.current = null\n\t\tif (e.currentTarget.hasPointerCapture(e.pointerId))\n\t\t\te.currentTarget.releasePointerCapture(e.pointerId)\n\t\tonCommit(bounds)\n\t}\n\treturn (\n\t\t<>\n\t\t\t{points.map((h) => (\n\t\t\t\t<div\n\t\t\t\t\tkey={h.key}\n\t\t\t\t\tclassName=\"tlui-cmt-canvas-region-handle\"\n\t\t\t\t\tstyle={{ left: h.left, top: h.top, cursor: h.cursor }}\n\t\t\t\t\tonPointerDown={startResize}\n\t\t\t\t\tonPointerMove={onResize(h)}\n\t\t\t\t\tonPointerUp={endResize(h)}\n\t\t\t\t/>\n\t\t\t))}\n\t\t</>\n\t)\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -22,9 +22,9 @@ __export(sidebar_filters_exports, {
|
|
|
22
22
|
});
|
|
23
23
|
module.exports = __toCommonJS(sidebar_filters_exports);
|
|
24
24
|
const DEFAULT_SIDEBAR_FILTERS = {
|
|
25
|
-
showResolved:
|
|
25
|
+
showResolved: false,
|
|
26
26
|
onlyMine: false,
|
|
27
27
|
onlyUnread: false,
|
|
28
|
-
onlyCurrentPage:
|
|
28
|
+
onlyCurrentPage: false
|
|
29
29
|
};
|
|
30
30
|
//# sourceMappingURL=sidebar-filters.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/canvas/sidebar-filters.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Which threads the comments sidebar shows. Held as an editor-scoped signal (the `sidebarFilters`\n * `EditorAtom` in `./state`) rather than component state so it survives the sidebar\n * unmounting when the comment tool deactivates \u2014 a user's \"hide resolved\" choice shouldn't reset\n * every time they leave the tool.\n * @public\n */\nexport interface SidebarFilters {\n\t/** Include resolved threads. */\n\tshowResolved: boolean\n\t/** Only threads the current user started. Ignored when there's no current user. */\n\tonlyMine: boolean\n\t/** Only threads with unread comments. Ignored when the host provides no read status. */\n\tonlyUnread: boolean\n\t/** Only threads on the current page. Off = every page's threads, each labelled. */\n\tonlyCurrentPage: boolean\n}\n\n/** @public */\nexport const DEFAULT_SIDEBAR_FILTERS: SidebarFilters = {\n\tshowResolved:
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
4
|
+
"sourcesContent": ["/**\n * Which threads the comments sidebar shows. Held as an editor-scoped signal (the `sidebarFilters`\n * `EditorAtom` in `./state`) rather than component state so it survives the sidebar\n * unmounting when the comment tool deactivates \u2014 a user's \"hide resolved\" choice shouldn't reset\n * every time they leave the tool.\n * @public\n */\nexport interface SidebarFilters {\n\t/** Include resolved threads. */\n\tshowResolved: boolean\n\t/** Only threads the current user started. Ignored when there's no current user. */\n\tonlyMine: boolean\n\t/** Only threads with unread comments. Ignored when the host provides no read status. */\n\tonlyUnread: boolean\n\t/** Only threads on the current page. Off = every page's threads, each labelled. */\n\tonlyCurrentPage: boolean\n}\n\n/** The out-of-the-box view: every page's threads, resolved ones hidden until asked for.\n * @public */\nexport const DEFAULT_SIDEBAR_FILTERS: SidebarFilters = {\n\tshowResolved: false,\n\tonlyMine: false,\n\tonlyUnread: false,\n\tonlyCurrentPage: false,\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBO,MAAM,0BAA0C;AAAA,EACtD,cAAc;AAAA,EACd,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,iBAAiB;AAClB;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist-cjs/canvas/state.js
CHANGED
|
@@ -19,25 +19,44 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
19
19
|
var state_exports = {};
|
|
20
20
|
__export(state_exports, {
|
|
21
21
|
commentsHidden: () => commentsHidden,
|
|
22
|
-
|
|
22
|
+
commentsSidebarOpen: () => commentsSidebarOpen,
|
|
23
|
+
getRevealThreadPending: () => getRevealThreadPending,
|
|
24
|
+
openStackId: () => openStackId,
|
|
23
25
|
openThreadId: () => openThreadId,
|
|
24
26
|
pendingComment: () => pendingComment,
|
|
25
27
|
regionDraft: () => regionDraft,
|
|
28
|
+
revealThread: () => revealThread,
|
|
29
|
+
revealThreadRequest: () => revealThreadRequest,
|
|
26
30
|
sidebarFilters: () => sidebarFilters,
|
|
27
31
|
toggleCommentsHidden: () => toggleCommentsHidden,
|
|
32
|
+
toggleCommentsSidebar: () => toggleCommentsSidebar,
|
|
28
33
|
useCommentsHidden: () => useCommentsHidden,
|
|
34
|
+
useCommentsSidebarOpen: () => useCommentsSidebarOpen,
|
|
29
35
|
useOpenThreadId: () => useOpenThreadId,
|
|
30
36
|
usePendingComment: () => usePendingComment,
|
|
37
|
+
useRevealThreadPending: () => useRevealThreadPending,
|
|
31
38
|
useSidebarFilters: () => useSidebarFilters
|
|
32
39
|
});
|
|
33
40
|
module.exports = __toCommonJS(state_exports);
|
|
34
41
|
var import_tldraw = require("tldraw");
|
|
35
|
-
var import_options = require("./options");
|
|
36
42
|
var import_sidebar_filters = require("./sidebar-filters");
|
|
37
43
|
const openThreadId = new import_tldraw.EditorAtom("openThreadId", () => null);
|
|
44
|
+
const openStackId = new import_tldraw.EditorAtom("openStackId", () => null);
|
|
38
45
|
const pendingComment = new import_tldraw.EditorAtom("pendingComment", () => null);
|
|
46
|
+
const revealThreadRequest = new import_tldraw.EditorAtom("revealThreadRequest", () => null);
|
|
47
|
+
function revealThread(editor, threadOrCommentId) {
|
|
48
|
+
revealThreadRequest.set(editor, threadOrCommentId);
|
|
49
|
+
}
|
|
50
|
+
function getRevealThreadPending(editor) {
|
|
51
|
+
return revealThreadRequest.get(editor);
|
|
52
|
+
}
|
|
53
|
+
function useRevealThreadPending() {
|
|
54
|
+
const editor = (0, import_tldraw.useEditor)();
|
|
55
|
+
return (0, import_tldraw.useValue)("pending reveal thread", () => getRevealThreadPending(editor), [editor]);
|
|
56
|
+
}
|
|
39
57
|
const regionDraft = new import_tldraw.EditorAtom("regionDraft", () => null);
|
|
40
58
|
const commentsHidden = new import_tldraw.EditorAtom("commentsHidden", () => false);
|
|
59
|
+
const commentsSidebarOpen = new import_tldraw.EditorAtom("commentsSidebarOpen", () => false);
|
|
41
60
|
const sidebarFilters = new import_tldraw.EditorAtom(
|
|
42
61
|
"sidebarFilters",
|
|
43
62
|
() => import_sidebar_filters.DEFAULT_SIDEBAR_FILTERS
|
|
@@ -45,6 +64,9 @@ const sidebarFilters = new import_tldraw.EditorAtom(
|
|
|
45
64
|
function toggleCommentsHidden(editor) {
|
|
46
65
|
commentsHidden.update(editor, (hidden) => !hidden);
|
|
47
66
|
}
|
|
67
|
+
function toggleCommentsSidebar(editor) {
|
|
68
|
+
commentsSidebarOpen.update(editor, (open) => !open);
|
|
69
|
+
}
|
|
48
70
|
function useOpenThreadId() {
|
|
49
71
|
const editor = (0, import_tldraw.useEditor)();
|
|
50
72
|
return (0, import_tldraw.useValue)("open thread id", () => openThreadId.get(editor), [editor]);
|
|
@@ -57,20 +79,12 @@ function useCommentsHidden() {
|
|
|
57
79
|
const editor = (0, import_tldraw.useEditor)();
|
|
58
80
|
return (0, import_tldraw.useValue)("comments hidden", () => commentsHidden.get(editor), [editor]);
|
|
59
81
|
}
|
|
82
|
+
function useCommentsSidebarOpen() {
|
|
83
|
+
const editor = (0, import_tldraw.useEditor)();
|
|
84
|
+
return (0, import_tldraw.useValue)("comments sidebar open", () => commentsSidebarOpen.get(editor), [editor]);
|
|
85
|
+
}
|
|
60
86
|
function useSidebarFilters() {
|
|
61
87
|
const editor = (0, import_tldraw.useEditor)();
|
|
62
88
|
return (0, import_tldraw.useValue)("sidebar filters", () => sidebarFilters.get(editor), [editor]);
|
|
63
89
|
}
|
|
64
|
-
function commitCommentMutation(editor, fn, kind = "mutation") {
|
|
65
|
-
const options = (0, import_options.getCommentingOptions)(editor);
|
|
66
|
-
const history = kind === "drag" ? options.dragHistory ?? options.history : options.history;
|
|
67
|
-
let result;
|
|
68
|
-
editor.run(
|
|
69
|
-
() => {
|
|
70
|
-
result = fn();
|
|
71
|
-
},
|
|
72
|
-
{ history }
|
|
73
|
-
);
|
|
74
|
-
return result;
|
|
75
|
-
}
|
|
76
90
|
//# sourceMappingURL=state.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/canvas/state.ts"],
|
|
4
|
-
"sourcesContent": ["import {
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA
|
|
4
|
+
"sourcesContent": ["import { EditorAtom, type BoxModel, type Editor, useEditor, useValue } from 'tldraw'\nimport type { PendingComment } from './comment-tool'\nimport { DEFAULT_SIDEBAR_FILTERS, type SidebarFilters } from './sidebar-filters'\n\n/**\n * Transient commenting UI state, scoped per editor via {@link EditorAtom} so two editors on one\n * page don't share open-thread, visibility, and filter state. Reachable from both React\n * (`useEditor()`) and the comment tool (`this.editor`).\n */\n\n/** The id of the one open thread (only one popover is open at a time), or null when all closed.\n * @public */\nexport const openThreadId = new EditorAtom<string | null>('openThreadId', () => null)\n\n/** The coincident-pin stack whose thread list is showing (keyed by its oldest member's thread id),\n * or null. Editor state rather than component state: the stack pin remounts when its owning render\n * path changes, and the open list must survive that.\n * @internal */\nexport const openStackId = new EditorAtom<string | null>('openStackId', () => null)\n\n/** The comment currently being placed (composer open, not yet posted), or null.\n * @internal */\nexport const pendingComment = new EditorAtom<PendingComment | null>('pendingComment', () => null)\n\n/**\n * A pending request to reveal a thread: a thread or comment id to open and bring into view, or\n * null when none is pending. Written by {@link revealThread}; served and cleared by\n * `CanvasComments`, which owns the wait for the records to sync in and the cluster-aware reveal.\n * @internal\n */\nexport const revealThreadRequest = new EditorAtom<string | null>('revealThreadRequest', () => null)\n\n/**\n * Open a thread and bring it into view, given a thread id or the id of any comment in it. Use it to\n * jump to a thread from outside the canvas \u2014 a notification, a deep link, your own list.\n *\n * The request is served by `CanvasComments`, so it works before the records have arrived: the layer\n * waits for them, switches pages, unhides pins, and zooms far enough to split the thread out of any\n * cluster. That also means nothing happens if `CanvasComments` isn't mounted.\n *\n * To open a thread you already hold and skip the wait, see {@link focusThread}.\n *\n * @example\n * ```ts\n * revealThread(editor, new URLSearchParams(location.search).get('comment')!)\n * ```\n *\n * @public\n */\nexport function revealThread(editor: Editor, threadOrCommentId: string): void {\n\trevealThreadRequest.set(editor, threadOrCommentId)\n}\n\n/**\n * The id passed to the most recent {@link revealThread} call that `CanvasComments` hasn't served\n * yet, or null. A request also clears when `CanvasComments` unmounts.\n *\n * This is a plain, untracked read \u2014 in React, use {@link useRevealThreadPending}, unless you need\n * the value as of *now* rather than as of the render you closed over.\n *\n * @public\n */\nexport function getRevealThreadPending(editor: Editor): string | null {\n\treturn revealThreadRequest.get(editor)\n}\n\n/**\n * Reactive React hook for {@link getRevealThreadPending}.\n *\n * Use it to notice a reveal that never lands \u2014 usually a deep link to a deleted comment. Give it a\n * grace period first, since a request also sits here while its records sync in, and re-check with\n * {@link getRevealThreadPending} when it elapses.\n *\n * @public\n */\nexport function useRevealThreadPending(): string | null {\n\tconst editor = useEditor()\n\treturn useValue('pending reveal thread', () => getRevealThreadPending(editor), [editor])\n}\n\n/** The region rectangle being dragged out right now (page coords), or null when not dragging. The\n * comment tool writes it on each move; the overlay reads it to draw the live dashed box. */\nexport const regionDraft = new EditorAtom<BoxModel | null>('regionDraft', () => null)\n\n/**\n * Whether comment pins are hidden on the canvas. Governs the on-canvas layer (pins + open popover)\n * only \u2014 the sidebar is unaffected.\n * @public\n */\nexport const commentsHidden = new EditorAtom<boolean>('commentsHidden', () => false)\n\n/**\n * Whether the comments sidebar (the thread list) is open. Driven by an explicit control rather than\n * by which tool is active, so browsing threads is separate from placing them.\n * @public\n */\nexport const commentsSidebarOpen = new EditorAtom<boolean>('commentsSidebarOpen', () => false)\n\n/** Which threads the comments sidebar shows.\n * @public */\nexport const sidebarFilters = new EditorAtom<SidebarFilters>(\n\t'sidebarFilters',\n\t() => DEFAULT_SIDEBAR_FILTERS\n)\n\n/** Toggle comment-pin visibility for an editor.\n * @public */\nexport function toggleCommentsHidden(editor: Editor): void {\n\tcommentsHidden.update(editor, (hidden) => !hidden)\n}\n\n/** Open or close the comments sidebar for an editor.\n * @public */\nexport function toggleCommentsSidebar(editor: Editor): void {\n\tcommentsSidebarOpen.update(editor, (open) => !open)\n}\n\n/** React hook for the open thread id.\n * @public */\nexport function useOpenThreadId(): string | null {\n\tconst editor = useEditor()\n\treturn useValue('open thread id', () => openThreadId.get(editor), [editor])\n}\n\n/** React hook for the pending (being-placed) comment.\n * @internal */\nexport function usePendingComment(): PendingComment | null {\n\tconst editor = useEditor()\n\treturn useValue('pending comment', () => pendingComment.get(editor), [editor])\n}\n\n/** React hook for whether comment pins are hidden.\n * @public */\nexport function useCommentsHidden(): boolean {\n\tconst editor = useEditor()\n\treturn useValue('comments hidden', () => commentsHidden.get(editor), [editor])\n}\n\n/** React hook for whether the comments sidebar is open.\n * @public */\nexport function useCommentsSidebarOpen(): boolean {\n\tconst editor = useEditor()\n\treturn useValue('comments sidebar open', () => commentsSidebarOpen.get(editor), [editor])\n}\n\n/** React hook for the current sidebar filters.\n * @public */\nexport function useSidebarFilters(): SidebarFilters {\n\tconst editor = useEditor()\n\treturn useValue('sidebar filters', () => sidebarFilters.get(editor), [editor])\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA4E;AAE5E,6BAA6D;AAUtD,MAAM,eAAe,IAAI,yBAA0B,gBAAgB,MAAM,IAAI;AAM7E,MAAM,cAAc,IAAI,yBAA0B,eAAe,MAAM,IAAI;AAI3E,MAAM,iBAAiB,IAAI,yBAAkC,kBAAkB,MAAM,IAAI;AAQzF,MAAM,sBAAsB,IAAI,yBAA0B,uBAAuB,MAAM,IAAI;AAmB3F,SAAS,aAAa,QAAgB,mBAAiC;AAC7E,sBAAoB,IAAI,QAAQ,iBAAiB;AAClD;AAWO,SAAS,uBAAuB,QAA+B;AACrE,SAAO,oBAAoB,IAAI,MAAM;AACtC;AAWO,SAAS,yBAAwC;AACvD,QAAM,aAAS,yBAAU;AACzB,aAAO,wBAAS,yBAAyB,MAAM,uBAAuB,MAAM,GAAG,CAAC,MAAM,CAAC;AACxF;AAIO,MAAM,cAAc,IAAI,yBAA4B,eAAe,MAAM,IAAI;AAO7E,MAAM,iBAAiB,IAAI,yBAAoB,kBAAkB,MAAM,KAAK;AAO5E,MAAM,sBAAsB,IAAI,yBAAoB,uBAAuB,MAAM,KAAK;AAItF,MAAM,iBAAiB,IAAI;AAAA,EACjC;AAAA,EACA,MAAM;AACP;AAIO,SAAS,qBAAqB,QAAsB;AAC1D,iBAAe,OAAO,QAAQ,CAAC,WAAW,CAAC,MAAM;AAClD;AAIO,SAAS,sBAAsB,QAAsB;AAC3D,sBAAoB,OAAO,QAAQ,CAAC,SAAS,CAAC,IAAI;AACnD;AAIO,SAAS,kBAAiC;AAChD,QAAM,aAAS,yBAAU;AACzB,aAAO,wBAAS,kBAAkB,MAAM,aAAa,IAAI,MAAM,GAAG,CAAC,MAAM,CAAC;AAC3E;AAIO,SAAS,oBAA2C;AAC1D,QAAM,aAAS,yBAAU;AACzB,aAAO,wBAAS,mBAAmB,MAAM,eAAe,IAAI,MAAM,GAAG,CAAC,MAAM,CAAC;AAC9E;AAIO,SAAS,oBAA6B;AAC5C,QAAM,aAAS,yBAAU;AACzB,aAAO,wBAAS,mBAAmB,MAAM,eAAe,IAAI,MAAM,GAAG,CAAC,MAAM,CAAC;AAC9E;AAIO,SAAS,yBAAkC;AACjD,QAAM,aAAS,yBAAU;AACzB,aAAO,wBAAS,yBAAyB,MAAM,oBAAoB,IAAI,MAAM,GAAG,CAAC,MAAM,CAAC;AACzF;AAIO,SAAS,oBAAoC;AACnD,QAAM,aAAS,yBAAU;AACzB,aAAO,wBAAS,mBAAmB,MAAM,eAAe,IAAI,MAAM,GAAG,CAAC,MAAM,CAAC;AAC9E;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var thread_pin_exports = {};
|
|
20
|
+
__export(thread_pin_exports, {
|
|
21
|
+
ThreadPin: () => ThreadPin
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(thread_pin_exports);
|
|
24
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
25
|
+
var import_mentions = require("@tldraw/mentions");
|
|
26
|
+
var import_react = require("react");
|
|
27
|
+
var import_tldraw = require("tldraw");
|
|
28
|
+
var import_comment_pin = require("../ui/comment-pin");
|
|
29
|
+
var import_canvas_events = require("./canvas-events");
|
|
30
|
+
var import_comment_mutations = require("./comment-mutations");
|
|
31
|
+
var import_comment_render = require("./comment-render");
|
|
32
|
+
var import_hooks = require("./hooks");
|
|
33
|
+
var import_options = require("./options");
|
|
34
|
+
var import_region_box = require("./region-box");
|
|
35
|
+
var import_state = require("./state");
|
|
36
|
+
var import_thread_preview = require("./thread-preview");
|
|
37
|
+
var import_thread_state = require("./thread-state");
|
|
38
|
+
var import_thread_view = require("./thread-view");
|
|
39
|
+
const THREAD_HEADER_BLOCK = 36;
|
|
40
|
+
const ThreadPin = (0, import_react.memo)(function ThreadPin2({
|
|
41
|
+
editor,
|
|
42
|
+
thread,
|
|
43
|
+
...props
|
|
44
|
+
}) {
|
|
45
|
+
const { resolveAuthor } = props;
|
|
46
|
+
const options = (0, import_options.useCommentingOptions)();
|
|
47
|
+
const canComment = (0, import_options.useCanComment)(props.currentUserId);
|
|
48
|
+
const container = (0, import_tldraw.useContainer)();
|
|
49
|
+
const msg = (0, import_tldraw.useTranslation)();
|
|
50
|
+
const comments = (0, import_hooks.useThreadComments)(editor, thread.id);
|
|
51
|
+
const open = (0, import_tldraw.useValue)("thread open", () => import_state.openThreadId.get(editor) === thread.id, [
|
|
52
|
+
editor,
|
|
53
|
+
thread.id
|
|
54
|
+
]);
|
|
55
|
+
const [dragPagePoint, setDragPagePoint] = (0, import_react.useState)(null);
|
|
56
|
+
const [resizeBounds, setResizeBounds] = (0, import_react.useState)(null);
|
|
57
|
+
const { previewShown, previewHandlers } = (0, import_thread_preview.useMarkerPreview)(editor, `pin:${thread.id}`);
|
|
58
|
+
const previewThreads = (0, import_react.useMemo)(() => [thread], [thread]);
|
|
59
|
+
const pointerInRegion = (0, import_tldraw.useValue)(
|
|
60
|
+
"pointer in region",
|
|
61
|
+
() => {
|
|
62
|
+
if (thread.anchor.type !== "region" || thread.pageId !== editor.getCurrentPageId())
|
|
63
|
+
return false;
|
|
64
|
+
const m = import_region_box.REGION_HANDLE_MARGIN_PX / editor.getZoomLevel();
|
|
65
|
+
const p = editor.inputs.getCurrentPagePoint();
|
|
66
|
+
const a = thread.anchor;
|
|
67
|
+
return p.x >= a.x - m && p.x <= a.x + a.w + m && p.y >= a.y - m && p.y <= a.y + a.h + m;
|
|
68
|
+
},
|
|
69
|
+
[editor, thread.anchor, thread.pageId]
|
|
70
|
+
);
|
|
71
|
+
const revealed = open || resizeBounds != null || pointerInRegion;
|
|
72
|
+
const pinCorner = thread.anchor.type === "region" ? (0, import_thread_state.regionAnchorPinCorner)(thread.anchor) : import_thread_state.REGION_PIN_CORNER;
|
|
73
|
+
const resizeHandles = (0, import_react.useMemo)(
|
|
74
|
+
() => import_region_box.REGION_CORNERS.filter((c) => c.x !== pinCorner.x || c.y !== pinCorner.y),
|
|
75
|
+
[pinCorner]
|
|
76
|
+
);
|
|
77
|
+
const dragRef = (0, import_react.useRef)(null);
|
|
78
|
+
const markerRef = (0, import_react.useRef)(null);
|
|
79
|
+
(0, import_tldraw.usePassThroughWheelEvents)(markerRef);
|
|
80
|
+
(0, import_react.useEffect)(() => {
|
|
81
|
+
return () => {
|
|
82
|
+
if (dragRef.current) editor.setHintingShapes([]);
|
|
83
|
+
};
|
|
84
|
+
}, [editor]);
|
|
85
|
+
(0, import_react.useEffect)(() => {
|
|
86
|
+
if (!open) return;
|
|
87
|
+
const onPointerDown = (e) => {
|
|
88
|
+
const target = e.target;
|
|
89
|
+
if (!target) return;
|
|
90
|
+
if (target.closest(".tlui-cmt-canvas-popover")) return;
|
|
91
|
+
const marker = markerRef.current;
|
|
92
|
+
if (marker && marker.contains(target)) return;
|
|
93
|
+
if (target.closest(".tlui-cmt-canvas-region-handle")) return;
|
|
94
|
+
if (target.closest(".tlui-menu, [data-radix-popper-content-wrapper], .tlui-cmt-mention-popup"))
|
|
95
|
+
return;
|
|
96
|
+
import_state.openThreadId.set(editor, null);
|
|
97
|
+
};
|
|
98
|
+
document.addEventListener("pointerdown", onPointerDown, true);
|
|
99
|
+
return () => document.removeEventListener("pointerdown", onPointerDown, true);
|
|
100
|
+
}, [open, editor]);
|
|
101
|
+
const exemptFromCull = open || dragPagePoint != null || resizeBounds != null;
|
|
102
|
+
const point = (0, import_tldraw.useValue)(
|
|
103
|
+
"pin point",
|
|
104
|
+
() => {
|
|
105
|
+
if (thread.pageId !== editor.getCurrentPageId()) return null;
|
|
106
|
+
const pagePoint = (0, import_thread_state.anchorPagePoint)(editor, thread.anchor);
|
|
107
|
+
if (!pagePoint) return null;
|
|
108
|
+
const viewportPoint = editor.pageToViewport(pagePoint);
|
|
109
|
+
const inset = (0, import_thread_state.impreciseShapePinInset)(editor, thread.anchor);
|
|
110
|
+
const point2 = inset ? { x: viewportPoint.x + inset.x, y: viewportPoint.y + inset.y } : viewportPoint;
|
|
111
|
+
if (!exemptFromCull) {
|
|
112
|
+
const visible = thread.anchor.type === "region" ? (0, import_thread_state.isBoxInInflatedViewport)(editor, thread.anchor) : (0, import_thread_state.isInInflatedViewport)(editor, point2);
|
|
113
|
+
if (!visible) return null;
|
|
114
|
+
}
|
|
115
|
+
return point2;
|
|
116
|
+
},
|
|
117
|
+
[editor, thread.anchor, thread.pageId, exemptFromCull]
|
|
118
|
+
);
|
|
119
|
+
if (!point) return null;
|
|
120
|
+
const PinContent = options.components.PinContent;
|
|
121
|
+
const threadAuthor = resolveAuthor(thread.createdBy);
|
|
122
|
+
const pinContent = PinContent ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(PinContent, { thread, comments }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_mentions.Avatar, { author: threadAuthor ?? import_comment_render.UNKNOWN_COMMENT_AUTHOR });
|
|
123
|
+
const pinLabel = msg(
|
|
124
|
+
thread.resolved ? "comments.pin-label-resolved" : "comments.pin-label"
|
|
125
|
+
).replace("{name}", threadAuthor?.name ?? import_comment_render.UNKNOWN_AUTHOR);
|
|
126
|
+
const isRegion = thread.anchor.type === "region";
|
|
127
|
+
const startDrag = (e) => {
|
|
128
|
+
if ((0, import_canvas_events.isCanvasPanGesture)(editor, e)) {
|
|
129
|
+
(0, import_canvas_events.forwardPointerEventToCanvas)(container, e);
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
e.stopPropagation();
|
|
133
|
+
const grabPage = editor.screenToPage({ x: e.clientX, y: e.clientY });
|
|
134
|
+
const anchorPage = (0, import_thread_state.anchorPagePoint)(editor, thread.anchor);
|
|
135
|
+
const inset = (0, import_thread_state.impreciseShapePinInset)(editor, thread.anchor);
|
|
136
|
+
if (anchorPage && inset) {
|
|
137
|
+
const zoom = editor.getZoomLevel();
|
|
138
|
+
anchorPage.x += inset.x / zoom;
|
|
139
|
+
anchorPage.y += inset.y / zoom;
|
|
140
|
+
}
|
|
141
|
+
dragRef.current = {
|
|
142
|
+
startX: e.clientX,
|
|
143
|
+
startY: e.clientY,
|
|
144
|
+
moved: false,
|
|
145
|
+
offsetX: anchorPage ? anchorPage.x - grabPage.x : 0,
|
|
146
|
+
offsetY: anchorPage ? anchorPage.y - grabPage.y : 0
|
|
147
|
+
};
|
|
148
|
+
e.currentTarget.setPointerCapture(e.pointerId);
|
|
149
|
+
};
|
|
150
|
+
const onDrag = (e) => {
|
|
151
|
+
const drag = dragRef.current;
|
|
152
|
+
if (!drag) return;
|
|
153
|
+
if (!canComment) return;
|
|
154
|
+
if (!drag.moved && Math.hypot(e.clientX - drag.startX, e.clientY - drag.startY) < 4) return;
|
|
155
|
+
drag.moved = true;
|
|
156
|
+
const cursorPage = editor.screenToPage({ x: e.clientX, y: e.clientY });
|
|
157
|
+
const pagePoint = { x: cursorPage.x + drag.offsetX, y: cursorPage.y + drag.offsetY };
|
|
158
|
+
setDragPagePoint(pagePoint);
|
|
159
|
+
if (!isRegion) {
|
|
160
|
+
const hit = (0, import_thread_state.commentTargetShapeAt)(editor, pagePoint);
|
|
161
|
+
editor.setHintingShapes(hit ? [hit.id] : []);
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
const cancelDrag = (e) => {
|
|
165
|
+
const drag = dragRef.current;
|
|
166
|
+
dragRef.current = null;
|
|
167
|
+
if (e.currentTarget.hasPointerCapture(e.pointerId)) {
|
|
168
|
+
e.currentTarget.releasePointerCapture(e.pointerId);
|
|
169
|
+
}
|
|
170
|
+
if (!drag) return;
|
|
171
|
+
setDragPagePoint(null);
|
|
172
|
+
editor.setHintingShapes([]);
|
|
173
|
+
};
|
|
174
|
+
const endDrag = (e) => {
|
|
175
|
+
const drag = dragRef.current;
|
|
176
|
+
dragRef.current = null;
|
|
177
|
+
if (e.currentTarget.hasPointerCapture(e.pointerId)) {
|
|
178
|
+
e.currentTarget.releasePointerCapture(e.pointerId);
|
|
179
|
+
}
|
|
180
|
+
if (!drag) return;
|
|
181
|
+
editor.setHintingShapes([]);
|
|
182
|
+
if (!drag.moved) {
|
|
183
|
+
import_state.openThreadId.set(editor, import_state.openThreadId.get(editor) === thread.id ? null : thread.id);
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
const cursorPage = editor.screenToPage({ x: e.clientX, y: e.clientY });
|
|
187
|
+
const pagePoint = { x: cursorPage.x + drag.offsetX, y: cursorPage.y + drag.offsetY };
|
|
188
|
+
setDragPagePoint(null);
|
|
189
|
+
let anchor;
|
|
190
|
+
if (thread.anchor.type === "region") {
|
|
191
|
+
anchor = {
|
|
192
|
+
...thread.anchor,
|
|
193
|
+
x: pagePoint.x - pinCorner.x * thread.anchor.w,
|
|
194
|
+
y: pagePoint.y - pinCorner.y * thread.anchor.h
|
|
195
|
+
};
|
|
196
|
+
} else {
|
|
197
|
+
const hit = (0, import_thread_state.commentTargetShapeAt)(editor, pagePoint);
|
|
198
|
+
anchor = hit ? (0, import_thread_state.shapeAnchorAt)(
|
|
199
|
+
editor,
|
|
200
|
+
hit.id,
|
|
201
|
+
pagePoint,
|
|
202
|
+
(0, import_options.getCommentingOptions)(editor).shouldBePrecise(editor, {
|
|
203
|
+
shapeId: hit.id,
|
|
204
|
+
point: pagePoint,
|
|
205
|
+
altKey: e.altKey
|
|
206
|
+
})
|
|
207
|
+
) : { type: "point", x: pagePoint.x, y: pagePoint.y };
|
|
208
|
+
}
|
|
209
|
+
(0, import_comment_mutations.commitCommentMutation)(editor, ({ put }) => put([{ ...thread, anchor }]), "drag");
|
|
210
|
+
};
|
|
211
|
+
const livePinPage = resizeBounds ? (0, import_thread_state.regionPinPoint)(resizeBounds, pinCorner) : dragPagePoint;
|
|
212
|
+
const renderPointBase = livePinPage ? editor.pageToViewport(livePinPage) : point;
|
|
213
|
+
const renderPoint = isRegion ? { x: renderPointBase.x - 17, y: renderPointBase.y + 17 } : renderPointBase;
|
|
214
|
+
const regionAnchor = thread.anchor.type === "region" ? thread.anchor : void 0;
|
|
215
|
+
const movedRegion = regionAnchor && dragPagePoint ? {
|
|
216
|
+
...regionAnchor,
|
|
217
|
+
x: dragPagePoint.x - pinCorner.x * regionAnchor.w,
|
|
218
|
+
y: dragPagePoint.y - pinCorner.y * regionAnchor.h
|
|
219
|
+
} : regionAnchor;
|
|
220
|
+
const regionBoxBounds = resizeBounds ?? movedRegion;
|
|
221
|
+
const commitResize = (bounds) => {
|
|
222
|
+
setResizeBounds(null);
|
|
223
|
+
if (!canComment) return;
|
|
224
|
+
(0, import_comment_mutations.commitCommentMutation)(
|
|
225
|
+
editor,
|
|
226
|
+
// Spread the existing anchor first so the region's pin corner survives a resize.
|
|
227
|
+
({ put }) => put([{ ...thread, anchor: { ...regionAnchor, ...bounds } }]),
|
|
228
|
+
"drag"
|
|
229
|
+
);
|
|
230
|
+
};
|
|
231
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
|
232
|
+
regionBoxBounds && (dragPagePoint || revealed) && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_region_box.RegionBox, { editor, box: regionBoxBounds }),
|
|
233
|
+
regionBoxBounds && revealed && !dragPagePoint && canComment && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
234
|
+
import_region_box.RegionResizeHandles,
|
|
235
|
+
{
|
|
236
|
+
editor,
|
|
237
|
+
box: regionBoxBounds,
|
|
238
|
+
handles: resizeHandles,
|
|
239
|
+
onPreview: setResizeBounds,
|
|
240
|
+
onCommit: commitResize
|
|
241
|
+
}
|
|
242
|
+
),
|
|
243
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
244
|
+
"div",
|
|
245
|
+
{
|
|
246
|
+
className: [
|
|
247
|
+
"tlui-cmt-canvas-pin",
|
|
248
|
+
open && "tlui-cmt-canvas-pin--open",
|
|
249
|
+
dragPagePoint && "tlui-cmt-canvas-pin--dragging"
|
|
250
|
+
].filter(Boolean).join(" "),
|
|
251
|
+
style: { left: renderPoint.x, top: renderPoint.y },
|
|
252
|
+
children: [
|
|
253
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
254
|
+
"button",
|
|
255
|
+
{
|
|
256
|
+
ref: markerRef,
|
|
257
|
+
type: "button",
|
|
258
|
+
className: "tlui-cmt-button tlui-cmt-canvas-pin__marker",
|
|
259
|
+
"aria-label": pinLabel,
|
|
260
|
+
"aria-expanded": open,
|
|
261
|
+
onPointerDown: startDrag,
|
|
262
|
+
onPointerMove: onDrag,
|
|
263
|
+
onPointerUp: endDrag,
|
|
264
|
+
onPointerCancel: cancelDrag,
|
|
265
|
+
onClick: (e) => {
|
|
266
|
+
if (e.detail !== 0) return;
|
|
267
|
+
import_state.openThreadId.set(editor, import_state.openThreadId.get(editor) === thread.id ? null : thread.id);
|
|
268
|
+
},
|
|
269
|
+
onPointerEnter: previewHandlers.onPointerEnter,
|
|
270
|
+
onPointerLeave: previewHandlers.onPointerLeave,
|
|
271
|
+
onFocus: previewHandlers.onPointerEnter,
|
|
272
|
+
onBlur: previewHandlers.onPointerLeave,
|
|
273
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_comment_pin.CommentPin, { resolved: thread.resolved != null, open, children: pinContent })
|
|
274
|
+
}
|
|
275
|
+
),
|
|
276
|
+
open && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
277
|
+
import_thread_view.ThreadPopover,
|
|
278
|
+
{
|
|
279
|
+
base: {
|
|
280
|
+
x: renderPoint.x + import_thread_view.POPOVER_OFFSET.thread.x,
|
|
281
|
+
y: renderPoint.y + import_thread_view.POPOVER_OFFSET.thread.y - THREAD_HEADER_BLOCK
|
|
282
|
+
},
|
|
283
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_thread_view.ThreadView, { editor, thread, ...props })
|
|
284
|
+
}
|
|
285
|
+
),
|
|
286
|
+
previewShown && !dragPagePoint && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
287
|
+
import_thread_preview.ThreadPreview,
|
|
288
|
+
{
|
|
289
|
+
editor,
|
|
290
|
+
threads: previewThreads,
|
|
291
|
+
variant: "thread",
|
|
292
|
+
point: renderPoint,
|
|
293
|
+
onSelectThread: () => import_state.openThreadId.set(editor, thread.id),
|
|
294
|
+
...previewHandlers,
|
|
295
|
+
currentUserId: props.currentUserId,
|
|
296
|
+
resolveAuthor
|
|
297
|
+
}
|
|
298
|
+
)
|
|
299
|
+
]
|
|
300
|
+
}
|
|
301
|
+
)
|
|
302
|
+
] });
|
|
303
|
+
});
|
|
304
|
+
//# sourceMappingURL=thread-pin.js.map
|