@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
package/src/ui/reactions.tsx
CHANGED
|
@@ -1,15 +1,74 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ComponentType } from 'react'
|
|
2
|
+
import { Reaction, ReactionTooltipProps, RenderReaction } from './reaction'
|
|
2
3
|
|
|
3
|
-
/**
|
|
4
|
-
export
|
|
4
|
+
/** One person who reacted with a given emoji, for the hover list. @public */
|
|
5
|
+
export interface ReactionReactor {
|
|
6
|
+
/** Display name of the person who reacted. */
|
|
7
|
+
name: string
|
|
8
|
+
/** True for the current user. */
|
|
9
|
+
you: boolean
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/** One emoji's reactions on a comment, already tallied. @public */
|
|
13
|
+
export interface ReactionSummary {
|
|
14
|
+
emoji: string
|
|
15
|
+
/** How many people reacted with this emoji. */
|
|
16
|
+
count: number
|
|
17
|
+
/** True when the current user is one of them — renders the pill highlighted. */
|
|
18
|
+
active: boolean
|
|
19
|
+
/** Who reacted with this emoji, in reaction order — shown in the hover list. */
|
|
20
|
+
reactors: ReactionReactor[]
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** @public */
|
|
24
|
+
export interface ReactionsProps {
|
|
25
|
+
/** The comment's reactions, grouped by emoji. Empty renders nothing. */
|
|
26
|
+
reactions: ReactionSummary[]
|
|
27
|
+
/** Toggles the current user's reaction for an emoji. */
|
|
28
|
+
onToggle?(emoji: string): void
|
|
29
|
+
/** Whether the current user may react. False makes the pills inert (e.g. a signed-out
|
|
30
|
+
* viewer, or a read-only thread) while still showing counts. */
|
|
31
|
+
canReact?: boolean
|
|
32
|
+
/** Whether hovering a pill shows its reactor list. Pass false to suppress it — e.g. while
|
|
33
|
+
* another popup menu on the comment is open. Defaults to true. */
|
|
34
|
+
enableHoverList?: boolean
|
|
35
|
+
/** How to draw each emoji token. Defaults to the token string (OS emoji font). */
|
|
36
|
+
renderReaction?: RenderReaction
|
|
37
|
+
/** The tooltip naming who reacted, shown when a pill is hovered. Defaults to an inline sentence
|
|
38
|
+
* (`DefaultReactionTooltip`). Swap it to render the reactor list however you like. */
|
|
39
|
+
ReactionTooltip?: ComponentType<ReactionTooltipProps>
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* The row of tallied reactions under a comment. Presentational — the host supplies the summaries
|
|
44
|
+
* and owns what toggling does. Hovering a pill lists who reacted (see `Reaction`).
|
|
45
|
+
*
|
|
46
|
+
* The add-reaction affordance is a separate component (`ReactionPicker`) so it can live outside
|
|
47
|
+
* this row — on a comment card it sits with the card's hover actions, which keeps its position
|
|
48
|
+
* fixed as reactions are added here.
|
|
49
|
+
* @public @react
|
|
50
|
+
*/
|
|
51
|
+
export function Reactions({
|
|
52
|
+
reactions,
|
|
53
|
+
onToggle,
|
|
54
|
+
canReact = true,
|
|
55
|
+
enableHoverList = true,
|
|
56
|
+
renderReaction,
|
|
57
|
+
ReactionTooltip,
|
|
58
|
+
}: ReactionsProps) {
|
|
59
|
+
if (reactions.length === 0) return null
|
|
5
60
|
return (
|
|
6
|
-
<div className="cmt-reactions">
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
61
|
+
<div className="tlui-cmt-reactions">
|
|
62
|
+
{reactions.map((reaction) => (
|
|
63
|
+
<Reaction
|
|
64
|
+
key={reaction.emoji}
|
|
65
|
+
{...reaction}
|
|
66
|
+
enableHoverList={enableHoverList}
|
|
67
|
+
renderReaction={renderReaction}
|
|
68
|
+
ReactionTooltip={ReactionTooltip}
|
|
69
|
+
onClick={canReact ? () => onToggle?.(reaction.emoji) : undefined}
|
|
70
|
+
/>
|
|
71
|
+
))}
|
|
13
72
|
</div>
|
|
14
73
|
)
|
|
15
74
|
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { useTranslation } from 'tldraw'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The localized "N replies" label (e.g. "1 reply", "3 replies") for a thread with `replyCount`
|
|
5
|
+
* replies — the comments after the opening one. Returns null when there are none, so callers render
|
|
6
|
+
* nothing rather than "0 replies". Shared by the sidebar row and the hover preview so both read the
|
|
7
|
+
* same, with each site owning where it puts the text.
|
|
8
|
+
*/
|
|
9
|
+
export function replyCountLabel(
|
|
10
|
+
msg: ReturnType<typeof useTranslation>,
|
|
11
|
+
replyCount: number
|
|
12
|
+
): string | null {
|
|
13
|
+
if (replyCount <= 0) return null
|
|
14
|
+
const key = replyCount === 1 ? 'comments.replies-one' : 'comments.replies'
|
|
15
|
+
return msg(key).replace('{count}', String(replyCount))
|
|
16
|
+
}
|
package/src/ui/send-button.tsx
CHANGED
|
@@ -1,15 +1,25 @@
|
|
|
1
|
+
import { SendIcon } from './icons'
|
|
2
|
+
|
|
1
3
|
/** @public */
|
|
2
4
|
export interface SendButtonProps {
|
|
5
|
+
/** The button's accessible name (e.g. "Send"). Shown as an up-arrow icon, so this is its label. */
|
|
3
6
|
label: string
|
|
4
7
|
disabled?: boolean
|
|
5
8
|
onClick?(): void
|
|
6
9
|
}
|
|
7
10
|
|
|
8
|
-
/** The button that posts a comment. @public @react */
|
|
11
|
+
/** The button that posts a comment — an up arrow. @public @react */
|
|
9
12
|
export function SendButton({ label, disabled, onClick }: SendButtonProps) {
|
|
10
13
|
return (
|
|
11
|
-
<button
|
|
12
|
-
|
|
14
|
+
<button
|
|
15
|
+
className="tlui-cmt-send"
|
|
16
|
+
type="button"
|
|
17
|
+
disabled={disabled}
|
|
18
|
+
onClick={onClick}
|
|
19
|
+
aria-label={label}
|
|
20
|
+
title={label}
|
|
21
|
+
>
|
|
22
|
+
<SendIcon />
|
|
13
23
|
</button>
|
|
14
24
|
)
|
|
15
25
|
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest'
|
|
2
|
+
import { getVisibleViewport } from './visual-viewport'
|
|
3
|
+
|
|
4
|
+
function makeWindow(
|
|
5
|
+
innerWidth: number,
|
|
6
|
+
innerHeight: number,
|
|
7
|
+
vv?: { offsetTop: number; offsetLeft: number; width: number; height: number }
|
|
8
|
+
): Window {
|
|
9
|
+
return { innerWidth, innerHeight, visualViewport: vv ?? null } as unknown as Window
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
describe('getVisibleViewport', () => {
|
|
13
|
+
it('reads the visual viewport, carrying its offset into the derived edges', () => {
|
|
14
|
+
const win = makeWindow(1024, 768, { offsetTop: 40, offsetLeft: 10, width: 900, height: 500 })
|
|
15
|
+
expect(getVisibleViewport(win)).toEqual({
|
|
16
|
+
top: 40,
|
|
17
|
+
left: 10,
|
|
18
|
+
width: 900,
|
|
19
|
+
height: 500,
|
|
20
|
+
bottom: 540,
|
|
21
|
+
right: 910,
|
|
22
|
+
})
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
it('falls back to the layout viewport when visualViewport is absent', () => {
|
|
26
|
+
const win = makeWindow(1024, 768)
|
|
27
|
+
expect(getVisibleViewport(win)).toEqual({
|
|
28
|
+
top: 0,
|
|
29
|
+
left: 0,
|
|
30
|
+
width: 1024,
|
|
31
|
+
height: 768,
|
|
32
|
+
bottom: 768,
|
|
33
|
+
right: 1024,
|
|
34
|
+
})
|
|
35
|
+
})
|
|
36
|
+
})
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// The visual viewport is the region actually on screen. The software keyboard (and pinch-zoom)
|
|
2
|
+
// shrink it while leaving the layout viewport — and CSS `dvh` — unchanged, most notably on iOS.
|
|
3
|
+
// So placing a panel above the keyboard means measuring against `window.visualViewport`, not CSS.
|
|
4
|
+
// These helpers are the single place the commenting layer reads it.
|
|
5
|
+
|
|
6
|
+
/** The on-screen viewport region in window coordinates, falling back to the layout viewport where
|
|
7
|
+
* `visualViewport` is unavailable. `top`/`left` carry the viewport's own offset — on iOS this is
|
|
8
|
+
* non-zero while the keyboard is open, and dropping it misplaces anything measured against it. */
|
|
9
|
+
export interface VisibleViewport {
|
|
10
|
+
top: number
|
|
11
|
+
left: number
|
|
12
|
+
width: number
|
|
13
|
+
height: number
|
|
14
|
+
bottom: number
|
|
15
|
+
right: number
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/** Read the visible viewport once. Call it inside a `visualViewport` resize/scroll handler to keep
|
|
19
|
+
* a measurement current as the keyboard opens and closes. */
|
|
20
|
+
export function getVisibleViewport(win: Window): VisibleViewport {
|
|
21
|
+
const vv = win.visualViewport
|
|
22
|
+
const top = vv ? vv.offsetTop : 0
|
|
23
|
+
const left = vv ? vv.offsetLeft : 0
|
|
24
|
+
const width = vv ? vv.width : win.innerWidth
|
|
25
|
+
const height = vv ? vv.height : win.innerHeight
|
|
26
|
+
return { top, left, width, height, bottom: top + height, right: left + width }
|
|
27
|
+
}
|
|
@@ -1,49 +0,0 @@
|
|
|
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_options_exports = {};
|
|
20
|
-
__export(region_options_exports, {
|
|
21
|
-
DEFAULT_REGION_COMMENT_OPTIONS: () => DEFAULT_REGION_COMMENT_OPTIONS,
|
|
22
|
-
getRegionCommentOptions: () => getRegionCommentOptions,
|
|
23
|
-
setRegionCommentOptions: () => setRegionCommentOptions
|
|
24
|
-
});
|
|
25
|
-
module.exports = __toCommonJS(region_options_exports);
|
|
26
|
-
var import_tldraw = require("tldraw");
|
|
27
|
-
const DEFAULT_REGION_COMMENT_OPTIONS = {
|
|
28
|
-
enabled: false,
|
|
29
|
-
pinCorner: { x: 1, y: 1 },
|
|
30
|
-
reveal: "pointer",
|
|
31
|
-
move: "pin",
|
|
32
|
-
resize: "corners"
|
|
33
|
-
};
|
|
34
|
-
const byEditor = /* @__PURE__ */ new WeakMap();
|
|
35
|
-
function getEditorAtom(editor) {
|
|
36
|
-
let a = byEditor.get(editor);
|
|
37
|
-
if (!a) {
|
|
38
|
-
a = (0, import_tldraw.atom)("regionCommentOptions", DEFAULT_REGION_COMMENT_OPTIONS);
|
|
39
|
-
byEditor.set(editor, a);
|
|
40
|
-
}
|
|
41
|
-
return a;
|
|
42
|
-
}
|
|
43
|
-
function setRegionCommentOptions(editor, options) {
|
|
44
|
-
getEditorAtom(editor).set(options);
|
|
45
|
-
}
|
|
46
|
-
function getRegionCommentOptions(editor) {
|
|
47
|
-
return getEditorAtom(editor).get();
|
|
48
|
-
}
|
|
49
|
-
//# sourceMappingURL=region-options.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/canvas/region-options.ts"],
|
|
4
|
-
"sourcesContent": ["import { atom, Atom, Editor, VecLike } from 'tldraw'\n\n/**\n * The configurable dimensions of region comments \u2014 a design surface for prototyping the interaction\n * before settling it. Region is **off by default**, so a consumer that leaves it unset keeps plain\n * click-only point/shape commenting. Set it per editor through `<CanvasComments regionOptions>`.\n * @public\n */\nexport interface RegionCommentOptions {\n\t/** Whether dragging the comment tool out creates a region anchor. Off \u2192 click-only. */\n\tenabled: boolean\n\t/** Which corner the pin and composer sit on, as a normalized 0\u20131 offset. Default bottom-right. */\n\tpinCorner: VecLike\n\t/** When the dashed box and its handles reveal: while the pointer is within the region, while the\n\t * pin is hovered, or only while the thread is open. */\n\treveal: 'pointer' | 'pin-hover' | 'open'\n\t/** How a region is moved: dragging its pin, dragging its body, or either. */\n\tmove: 'pin' | 'body' | 'both'\n\t/** The resize affordance: corner handles, edge handles, or none. */\n\tresize: 'corners' | 'edges' | 'none'\n}\n\n/** The out-of-the-box region config: disabled, and \u2014 when a consumer enables it \u2014 the current\n * bottom-right / pointer-reveal / pin-move / corner-resize behaviour.\n * @public */\nexport const DEFAULT_REGION_COMMENT_OPTIONS: RegionCommentOptions = {\n\tenabled: false,\n\tpinCorner: { x: 1, y: 1 },\n\treveal: 'pointer',\n\tmove: 'pin',\n\tresize: 'corners',\n}\n\n// Per-editor region config. The overlay publishes its merged `regionOptions` here so the comment\n// tool \u2014 which has no props of its own \u2014 can read the same per-instance config at interaction time.\n// Held in an atom so reactive readers (e.g. `anchorPagePoint`, called inside `useValue`) recompute\n// when the config changes; a plain map read wouldn't, leaving the pin at the stale default corner.\nconst byEditor = new WeakMap<Editor, Atom<RegionCommentOptions>>()\n\nfunction getEditorAtom(editor: Editor): Atom<RegionCommentOptions> {\n\tlet a = byEditor.get(editor)\n\tif (!a) {\n\t\ta = atom('regionCommentOptions', DEFAULT_REGION_COMMENT_OPTIONS)\n\t\tbyEditor.set(editor, a)\n\t}\n\treturn a\n}\n\n/** Publish an editor's region config (called by the overlay from its `regionOptions` prop). */\nexport function setRegionCommentOptions(editor: Editor, options: RegionCommentOptions): void {\n\tgetEditorAtom(editor).set(options)\n}\n\n/** The editor's region config, or the disabled default when none was set. */\nexport function getRegionCommentOptions(editor: Editor): RegionCommentOptions {\n\treturn getEditorAtom(editor).get()\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA4C;AAyBrC,MAAM,iCAAuD;AAAA,EACnE,SAAS;AAAA,EACT,WAAW,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,EACxB,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,QAAQ;AACT;AAMA,MAAM,WAAW,oBAAI,QAA4C;AAEjE,SAAS,cAAc,QAA4C;AAClE,MAAI,IAAI,SAAS,IAAI,MAAM;AAC3B,MAAI,CAAC,GAAG;AACP,YAAI,oBAAK,wBAAwB,8BAA8B;AAC/D,aAAS,IAAI,QAAQ,CAAC;AAAA,EACvB;AACA,SAAO;AACR;AAGO,SAAS,wBAAwB,QAAgB,SAAqC;AAC5F,gBAAc,MAAM,EAAE,IAAI,OAAO;AAClC;AAGO,SAAS,wBAAwB,QAAsC;AAC7E,SAAO,cAAc,MAAM,EAAE,IAAI;AAClC;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/ui/avatar.tsx"],
|
|
4
|
-
"sourcesContent": ["import { getFirstCharacter } from 'tldraw'\n\n/** @public */\nexport interface AvatarProps {\n\tname: string\n\t/** Background colour, used when there's no `image`. Falls back to the default avatar tint. */\n\tcolor?: string\n\t/** Avatar image URL. When set, shows the image instead of the coloured initial. */\n\timage?: string\n}\n\nfunction initial(name: string) {\n\treturn (getFirstCharacter(name.trim()) || '?').toUpperCase()\n}\n\n/** A commenter's avatar \u2014 their image if provided, otherwise a single-initial coloured circle.\n * @public @react */\nexport function Avatar({ name, color, image }: AvatarProps) {\n\tif (image) {\n\t\treturn <img className=\"cmt-avatar cmt-avatar--image\" src={image} alt=\"\" aria-hidden=\"true\" />\n\t}\n\treturn (\n\t\t<div\n\t\t\tclassName=\"cmt-avatar\"\n\t\t\taria-hidden=\"true\"\n\t\t\tstyle={color ? { backgroundColor: color } : undefined}\n\t\t>\n\t\t\t{initial(name)}\n\t\t</div>\n\t)\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBS;AAnBT,oBAAkC;AAWlC,SAAS,QAAQ,MAAc;AAC9B,cAAQ,iCAAkB,KAAK,KAAK,CAAC,KAAK,KAAK,YAAY;AAC5D;AAIO,SAAS,OAAO,EAAE,MAAM,OAAO,MAAM,GAAgB;AAC3D,MAAI,OAAO;AACV,WAAO,4CAAC,SAAI,WAAU,gCAA+B,KAAK,OAAO,KAAI,IAAG,eAAY,QAAO;AAAA,EAC5F;AACA,SACC;AAAA,IAAC;AAAA;AAAA,MACA,WAAU;AAAA,MACV,eAAY;AAAA,MACZ,OAAO,QAAQ,EAAE,iBAAiB,MAAM,IAAI;AAAA,MAE3C,kBAAQ,IAAI;AAAA;AAAA,EACd;AAEF;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,42 +0,0 @@
|
|
|
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 comment_mention_exports = {};
|
|
20
|
-
__export(comment_mention_exports, {
|
|
21
|
-
commentMention: () => commentMention
|
|
22
|
-
});
|
|
23
|
-
module.exports = __toCommonJS(comment_mention_exports);
|
|
24
|
-
var import_core = require("@tiptap/core");
|
|
25
|
-
var import_extension_mention = require("@tiptap/extension-mention");
|
|
26
|
-
function mentionName(attrs, resolveName) {
|
|
27
|
-
const resolved = attrs.id && resolveName ? resolveName(attrs.id) : void 0;
|
|
28
|
-
return resolved ?? attrs.label ?? attrs.id ?? "";
|
|
29
|
-
}
|
|
30
|
-
function commentMention({ resolveName, suggestion } = {}) {
|
|
31
|
-
return import_extension_mention.Mention.configure({
|
|
32
|
-
HTMLAttributes: { class: "cmt-mention" },
|
|
33
|
-
renderText: ({ node }) => `@${mentionName(node.attrs, resolveName)}`,
|
|
34
|
-
renderHTML: ({ node, options }) => [
|
|
35
|
-
"span",
|
|
36
|
-
(0, import_core.mergeAttributes)(options.HTMLAttributes, { "data-mention-id": node.attrs.id }),
|
|
37
|
-
`@${mentionName(node.attrs, resolveName)}`
|
|
38
|
-
],
|
|
39
|
-
...suggestion ? { suggestion } : {}
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
//# sourceMappingURL=comment-mention.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/ui/comment-mention.ts"],
|
|
4
|
-
"sourcesContent": ["import { mergeAttributes } from '@tiptap/core'\nimport { Mention, type MentionNodeAttrs, type MentionOptions } from '@tiptap/extension-mention'\n\n/**\n * A mention node's display name: the member's current name, resolved live from its id when a\n * resolver is given (so a rename shows through), falling back to the label captured at insert time\n * when no source can name the id \u2014 e.g. a deleted account. The stored id is always the source of\n * truth; live resolution only freshens the displayed name over that captured label.\n */\nfunction mentionName(\n\tattrs: MentionNodeAttrs,\n\tresolveName?: (id: string) => string | undefined\n): string {\n\tconst resolved = attrs.id && resolveName ? resolveName(attrs.id) : undefined\n\treturn resolved ?? attrs.label ?? attrs.id ?? ''\n}\n\nexport interface CommentMentionOptions {\n\t/**\n\t * Resolve a member id to its current display name \u2014 for the read-only render paths. Returns\n\t * `undefined` when the id can't be resolved, so the render falls back to the mention's stored label.\n\t */\n\tresolveName?(id: string): string | undefined\n\t/** The `@`-picker suggestion config \u2014 for the composer (omit on the render paths). */\n\tsuggestion?: MentionOptions['suggestion']\n}\n\n/**\n * The comment @-mention node \u2014 TipTap's `Mention` configured to render as a `.cmt-mention` pill.\n *\n * A factory rather than a shared constant because it's configured differently per context: the\n * read-only render paths pass `resolveName` (so the stored `{ id }` node always shows the member's\n * current name, not a copy frozen at insert time), while the composer passes a `suggestion` (the\n * `@` picker). The node schema is identical either way \u2014 only these two levers differ.\n */\nexport function commentMention({ resolveName, suggestion }: CommentMentionOptions = {}) {\n\treturn Mention.configure({\n\t\tHTMLAttributes: { class: 'cmt-mention' },\n\t\trenderText: ({ node }) => `@${mentionName(node.attrs as MentionNodeAttrs, resolveName)}`,\n\t\trenderHTML: ({ node, options }) => [\n\t\t\t'span',\n\t\t\tmergeAttributes(options.HTMLAttributes, { 'data-mention-id': node.attrs.id }),\n\t\t\t`@${mentionName(node.attrs as MentionNodeAttrs, resolveName)}`,\n\t\t],\n\t\t...(suggestion ? { suggestion } : {}),\n\t})\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAgC;AAChC,+BAAoE;AAQpE,SAAS,YACR,OACA,aACS;AACT,QAAM,WAAW,MAAM,MAAM,cAAc,YAAY,MAAM,EAAE,IAAI;AACnE,SAAO,YAAY,MAAM,SAAS,MAAM,MAAM;AAC/C;AAoBO,SAAS,eAAe,EAAE,aAAa,WAAW,IAA2B,CAAC,GAAG;AACvF,SAAO,iCAAQ,UAAU;AAAA,IACxB,gBAAgB,EAAE,OAAO,cAAc;AAAA,IACvC,YAAY,CAAC,EAAE,KAAK,MAAM,IAAI,YAAY,KAAK,OAA2B,WAAW,CAAC;AAAA,IACtF,YAAY,CAAC,EAAE,MAAM,QAAQ,MAAM;AAAA,MAClC;AAAA,UACA,6BAAgB,QAAQ,gBAAgB,EAAE,mBAAmB,KAAK,MAAM,GAAG,CAAC;AAAA,MAC5E,IAAI,YAAY,KAAK,OAA2B,WAAW,CAAC;AAAA,IAC7D;AAAA,IACA,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;AAAA,EACpC,CAAC;AACF;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/ui/comment-text.tsx"],
|
|
4
|
-
"sourcesContent": ["import { renderMarkdown } from './render-markdown'\n\n/** @public */\nexport interface CommentTextProps {\n\t/** Rich text body, authored as markdown. */\n\ttext: string\n}\n\n/** A comment's body, rendered as markdown (bold, italic, code, links, lists). @public @react */\nexport function CommentText({ text }: CommentTextProps) {\n\treturn <div className=\"cmt-text\">{renderMarkdown(text)}</div>\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAUQ;AAVR,6BAA+B;AASxB,SAAS,YAAY,EAAE,KAAK,GAAqB;AACvD,SAAO,4CAAC,SAAI,WAAU,YAAY,qDAAe,IAAI,GAAE;AACxD;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,70 +0,0 @@
|
|
|
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 mention_list_exports = {};
|
|
20
|
-
__export(mention_list_exports, {
|
|
21
|
-
MentionList: () => MentionList
|
|
22
|
-
});
|
|
23
|
-
module.exports = __toCommonJS(mention_list_exports);
|
|
24
|
-
var import_jsx_runtime = require("react/jsx-runtime");
|
|
25
|
-
var import_tldraw = require("tldraw");
|
|
26
|
-
var import_avatar = require("./avatar");
|
|
27
|
-
function DefaultMemberRow({ member }) {
|
|
28
|
-
const msg = (0, import_tldraw.useTranslation)();
|
|
29
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
|
30
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_avatar.Avatar, { name: member.name, color: member.color, image: member.avatar }),
|
|
31
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "cmt-mention-list__text", children: [
|
|
32
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "cmt-mention-list__name", children: [
|
|
33
|
-
member.name,
|
|
34
|
-
member.you && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "cmt-mention-list__you", children: `(${msg("comments.mention-you")})` })
|
|
35
|
-
] }),
|
|
36
|
-
member.secondary && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "cmt-mention-list__secondary", children: member.secondary })
|
|
37
|
-
] })
|
|
38
|
-
] });
|
|
39
|
-
}
|
|
40
|
-
function MentionList({
|
|
41
|
-
members,
|
|
42
|
-
activeIndex = 0,
|
|
43
|
-
onSelect,
|
|
44
|
-
emptyLabel,
|
|
45
|
-
renderMember
|
|
46
|
-
}) {
|
|
47
|
-
const msg = (0, import_tldraw.useTranslation)();
|
|
48
|
-
if (members.length === 0) {
|
|
49
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "cmt-mention-list cmt-mention-list--empty", children: emptyLabel ?? msg("comments.mention-no-matches") });
|
|
50
|
-
}
|
|
51
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "cmt-mention-list", role: "listbox", children: members.map((member, i) => {
|
|
52
|
-
const active = i === activeIndex;
|
|
53
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
54
|
-
"button",
|
|
55
|
-
{
|
|
56
|
-
type: "button",
|
|
57
|
-
role: "option",
|
|
58
|
-
"aria-selected": active,
|
|
59
|
-
className: active ? "cmt-mention-list__item cmt-mention-list__item--active" : "cmt-mention-list__item",
|
|
60
|
-
onMouseDown: (e) => e.preventDefault(),
|
|
61
|
-
onClick: () => {
|
|
62
|
-
if (onSelect) onSelect(member);
|
|
63
|
-
},
|
|
64
|
-
children: renderMember ? renderMember(member) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(DefaultMemberRow, { member })
|
|
65
|
-
},
|
|
66
|
-
member.id
|
|
67
|
-
);
|
|
68
|
-
}) });
|
|
69
|
-
}
|
|
70
|
-
//# sourceMappingURL=mention-list.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/ui/mention-list.tsx"],
|
|
4
|
-
"sourcesContent": ["import { ReactNode } from 'react'\nimport { useTranslation } from 'tldraw'\nimport { Avatar } from './avatar'\n\n/** A person the composer's \\@-mention picker can offer. @public */\nexport interface MentionMember {\n\tid: string\n\tname: string\n\t/** Avatar image URL. Falls back to a coloured initial when omitted. */\n\tavatar?: string\n\t/** Avatar background colour, used when there's no `avatar` image. */\n\tcolor?: string\n\t/** A secondary line under the name \u2014 e.g. an email or handle. Omit for a single-line row. */\n\tsecondary?: string\n\t/** Marks the current user; shown as a \"(You)\" suffix after the name. */\n\tyou?: boolean\n\t/** Hosts may carry extra fields; a custom `renderMember` can read them. */\n\t[key: string]: unknown\n}\n\n/** @public */\nexport interface MentionListProps {\n\t/** Members to choose from \u2014 already resolved for the current query by the host. */\n\tmembers: MentionMember[]\n\t/** Index of the highlighted row, driven by the composer's keyboard navigation. */\n\tactiveIndex?: number\n\t/** Called when a member is chosen (click, or Enter on the active row). */\n\tonSelect?(member: MentionMember): void\n\t/** Shown when no member matches the query. Defaults to a translated \"No matches\". */\n\temptyLabel?: string\n\t/** Override a row's content (inside the selectable button). Defaults to avatar + name (+ secondary). */\n\trenderMember?(member: MentionMember): ReactNode\n}\n\n/** The default row content: avatar, name (with a \"(You)\" marker), and an optional secondary line. */\nfunction DefaultMemberRow({ member }: { member: MentionMember }) {\n\tconst msg = useTranslation()\n\treturn (\n\t\t<>\n\t\t\t<Avatar name={member.name} color={member.color} image={member.avatar} />\n\t\t\t<span className=\"cmt-mention-list__text\">\n\t\t\t\t<span className=\"cmt-mention-list__name\">\n\t\t\t\t\t{member.name}\n\t\t\t\t\t{member.you && (\n\t\t\t\t\t\t<span className=\"cmt-mention-list__you\">{`(${msg('comments.mention-you')})`}</span>\n\t\t\t\t\t)}\n\t\t\t\t</span>\n\t\t\t\t{member.secondary && (\n\t\t\t\t\t<span className=\"cmt-mention-list__secondary\">{member.secondary}</span>\n\t\t\t\t)}\n\t\t\t</span>\n\t\t</>\n\t)\n}\n\n/**\n * The \\@-mention member picker: a popover list of people to mention, shown as the user types after\n * `@`. Presentational \u2014 the composer's suggestion plugin owns resolution, keyboard navigation, and\n * placement, and drives this with the host-resolved `members` and the highlighted `activeIndex`.\n * @public @react\n */\nexport function MentionList({\n\tmembers,\n\tactiveIndex = 0,\n\tonSelect,\n\temptyLabel,\n\trenderMember,\n}: MentionListProps) {\n\tconst msg = useTranslation()\n\tif (members.length === 0) {\n\t\treturn (\n\t\t\t<div className=\"cmt-mention-list cmt-mention-list--empty\">\n\t\t\t\t{emptyLabel ?? msg('comments.mention-no-matches')}\n\t\t\t</div>\n\t\t)\n\t}\n\treturn (\n\t\t<div className=\"cmt-mention-list\" role=\"listbox\">\n\t\t\t{members.map((member, i) => {\n\t\t\t\tconst active = i === activeIndex\n\t\t\t\treturn (\n\t\t\t\t\t<button\n\t\t\t\t\t\tkey={member.id}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\trole=\"option\"\n\t\t\t\t\t\taria-selected={active}\n\t\t\t\t\t\tclassName={\n\t\t\t\t\t\t\tactive\n\t\t\t\t\t\t\t\t? 'cmt-mention-list__item cmt-mention-list__item--active'\n\t\t\t\t\t\t\t\t: 'cmt-mention-list__item'\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Keep the composer focused on a row press: it's portaled outside the editor, so a\n\t\t\t\t\t\t// bare mousedown would blur the composer \u2014 which now dismisses the picker \u2014 before\n\t\t\t\t\t\t// the click could select. Selection runs on click; focus stays put.\n\t\t\t\t\t\tonMouseDown={(e) => e.preventDefault()}\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tif (onSelect) onSelect(member)\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{renderMember ? renderMember(member) : <DefaultMemberRow member={member} />}\n\t\t\t\t\t</button>\n\t\t\t\t)\n\t\t\t})}\n\t\t</div>\n\t)\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAsCE;AArCF,oBAA+B;AAC/B,oBAAuB;AAiCvB,SAAS,iBAAiB,EAAE,OAAO,GAA8B;AAChE,QAAM,UAAM,8BAAe;AAC3B,SACC,4EACC;AAAA,gDAAC,wBAAO,MAAM,OAAO,MAAM,OAAO,OAAO,OAAO,OAAO,OAAO,QAAQ;AAAA,IACtE,6CAAC,UAAK,WAAU,0BACf;AAAA,mDAAC,UAAK,WAAU,0BACd;AAAA,eAAO;AAAA,QACP,OAAO,OACP,4CAAC,UAAK,WAAU,yBAAyB,cAAI,IAAI,sBAAsB,CAAC,KAAI;AAAA,SAE9E;AAAA,MACC,OAAO,aACP,4CAAC,UAAK,WAAU,+BAA+B,iBAAO,WAAU;AAAA,OAElE;AAAA,KACD;AAEF;AAQO,SAAS,YAAY;AAAA,EAC3B;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AACD,GAAqB;AACpB,QAAM,UAAM,8BAAe;AAC3B,MAAI,QAAQ,WAAW,GAAG;AACzB,WACC,4CAAC,SAAI,WAAU,4CACb,wBAAc,IAAI,6BAA6B,GACjD;AAAA,EAEF;AACA,SACC,4CAAC,SAAI,WAAU,oBAAmB,MAAK,WACrC,kBAAQ,IAAI,CAAC,QAAQ,MAAM;AAC3B,UAAM,SAAS,MAAM;AACrB,WACC;AAAA,MAAC;AAAA;AAAA,QAEA,MAAK;AAAA,QACL,MAAK;AAAA,QACL,iBAAe;AAAA,QACf,WACC,SACG,0DACA;AAAA,QAKJ,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,QACrC,SAAS,MAAM;AACd,cAAI,SAAU,UAAS,MAAM;AAAA,QAC9B;AAAA,QAEC,yBAAe,aAAa,MAAM,IAAI,4CAAC,oBAAiB,QAAgB;AAAA;AAAA,MAjBpE,OAAO;AAAA,IAkBb;AAAA,EAEF,CAAC,GACF;AAEF;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,206 +0,0 @@
|
|
|
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 mention_suggestion_exports = {};
|
|
20
|
-
__export(mention_suggestion_exports, {
|
|
21
|
-
createMentionSuggestion: () => createMentionSuggestion,
|
|
22
|
-
filterMentionMembers: () => filterMentionMembers,
|
|
23
|
-
isMentionPickerOpen: () => isMentionPickerOpen
|
|
24
|
-
});
|
|
25
|
-
module.exports = __toCommonJS(mention_suggestion_exports);
|
|
26
|
-
var import_jsx_runtime = require("react/jsx-runtime");
|
|
27
|
-
var import_react = require("@tiptap/react");
|
|
28
|
-
var import_react2 = require("react");
|
|
29
|
-
var import_tldraw = require("tldraw");
|
|
30
|
-
var import_mention_list = require("./mention-list");
|
|
31
|
-
const MentionPopup = (0, import_react2.forwardRef)(function MentionPopup2({ items, command, renderMember }, ref) {
|
|
32
|
-
const [activeIndex, setActiveIndex] = (0, import_react2.useState)(0);
|
|
33
|
-
const [prevItems, setPrevItems] = (0, import_react2.useState)(items);
|
|
34
|
-
if (items !== prevItems) {
|
|
35
|
-
setPrevItems(items);
|
|
36
|
-
setActiveIndex(0);
|
|
37
|
-
}
|
|
38
|
-
const select = (member) => {
|
|
39
|
-
if (member) command({ id: member.id, label: member.name });
|
|
40
|
-
};
|
|
41
|
-
(0, import_react2.useImperativeHandle)(ref, () => ({
|
|
42
|
-
onKeyDown: ({ event }) => {
|
|
43
|
-
if (items.length === 0) return false;
|
|
44
|
-
if (event.key === "ArrowUp") {
|
|
45
|
-
setActiveIndex((i) => (i + items.length - 1) % items.length);
|
|
46
|
-
return true;
|
|
47
|
-
}
|
|
48
|
-
if (event.key === "ArrowDown") {
|
|
49
|
-
setActiveIndex((i) => (i + 1) % items.length);
|
|
50
|
-
return true;
|
|
51
|
-
}
|
|
52
|
-
if (event.key === "Enter" || event.key === "Tab") {
|
|
53
|
-
select(items[activeIndex] ?? items[0]);
|
|
54
|
-
return true;
|
|
55
|
-
}
|
|
56
|
-
return false;
|
|
57
|
-
}
|
|
58
|
-
}));
|
|
59
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
60
|
-
import_mention_list.MentionList,
|
|
61
|
-
{
|
|
62
|
-
members: items,
|
|
63
|
-
activeIndex,
|
|
64
|
-
onSelect: select,
|
|
65
|
-
renderMember
|
|
66
|
-
}
|
|
67
|
-
);
|
|
68
|
-
});
|
|
69
|
-
const MAX_SUGGESTIONS = 8;
|
|
70
|
-
function filterMentionMembers(members, query) {
|
|
71
|
-
const q = query.toLowerCase();
|
|
72
|
-
return members.filter((m) => m.name.toLowerCase().includes(q)).slice(0, MAX_SUGGESTIONS);
|
|
73
|
-
}
|
|
74
|
-
const mentionPickerOpen = (0, import_tldraw.atom)("isMentionPickerOpen", false);
|
|
75
|
-
function isMentionPickerOpen() {
|
|
76
|
-
return mentionPickerOpen.get();
|
|
77
|
-
}
|
|
78
|
-
function createMentionSuggestion(getSuggestions, options = {}) {
|
|
79
|
-
return {
|
|
80
|
-
char: "@",
|
|
81
|
-
items: ({ query }) => getSuggestions(query),
|
|
82
|
-
render: () => {
|
|
83
|
-
let renderer = null;
|
|
84
|
-
let container = null;
|
|
85
|
-
let editorEl = null;
|
|
86
|
-
let canvasEl = null;
|
|
87
|
-
let stopCameraReaction = null;
|
|
88
|
-
let anchorPage = null;
|
|
89
|
-
let popupWidth = 0;
|
|
90
|
-
const applyScreen = (left, top, width) => {
|
|
91
|
-
if (!container) return;
|
|
92
|
-
container.style.left = `${left}px`;
|
|
93
|
-
container.style.top = `${top + 4}px`;
|
|
94
|
-
container.style.width = `${width}px`;
|
|
95
|
-
};
|
|
96
|
-
const place = () => {
|
|
97
|
-
if (!container || !editorEl || container.style.display === "none") return;
|
|
98
|
-
const field = editorEl.closest(".cmt-composer__field") ?? editorEl;
|
|
99
|
-
const rect = field.getBoundingClientRect();
|
|
100
|
-
popupWidth = rect.width;
|
|
101
|
-
anchorPage = options.editor?.screenToPage({ x: rect.left, y: rect.bottom }) ?? null;
|
|
102
|
-
applyScreen(rect.left, rect.bottom, rect.width);
|
|
103
|
-
};
|
|
104
|
-
const reposition = () => {
|
|
105
|
-
if (!anchorPage || !options.editor) return;
|
|
106
|
-
const s = options.editor.pageToScreen(anchorPage);
|
|
107
|
-
applyScreen(s.x, s.y, popupWidth);
|
|
108
|
-
};
|
|
109
|
-
const startFollowing = () => {
|
|
110
|
-
window.addEventListener("scroll", place, true);
|
|
111
|
-
window.addEventListener("resize", place);
|
|
112
|
-
if (options.editor) {
|
|
113
|
-
stopCameraReaction = (0, import_tldraw.react)("anchor mention popup to camera", () => {
|
|
114
|
-
options.editor.getCamera();
|
|
115
|
-
reposition();
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
};
|
|
119
|
-
const stopFollowing = () => {
|
|
120
|
-
window.removeEventListener("scroll", place, true);
|
|
121
|
-
window.removeEventListener("resize", place);
|
|
122
|
-
stopCameraReaction?.();
|
|
123
|
-
stopCameraReaction = null;
|
|
124
|
-
anchorPage = null;
|
|
125
|
-
};
|
|
126
|
-
const hide = () => {
|
|
127
|
-
if (container) container.style.display = "none";
|
|
128
|
-
mentionPickerOpen.set(false);
|
|
129
|
-
};
|
|
130
|
-
const onWheel = (e) => {
|
|
131
|
-
if (e.isSpecialRedispatchedEvent || !canvasEl) return;
|
|
132
|
-
const list = container?.querySelector(".cmt-mention-list");
|
|
133
|
-
if (list && list.scrollHeight > list.clientHeight) return;
|
|
134
|
-
e.preventDefault();
|
|
135
|
-
const redispatched = new WheelEvent("wheel", e);
|
|
136
|
-
redispatched.isSpecialRedispatchedEvent = true;
|
|
137
|
-
canvasEl.dispatchEvent(redispatched);
|
|
138
|
-
};
|
|
139
|
-
return {
|
|
140
|
-
onStart: (props) => {
|
|
141
|
-
renderer = new import_react.ReactRenderer(MentionPopup, {
|
|
142
|
-
props: {
|
|
143
|
-
items: props.items,
|
|
144
|
-
command: props.command,
|
|
145
|
-
renderMember: options.renderMember
|
|
146
|
-
},
|
|
147
|
-
editor: props.editor
|
|
148
|
-
});
|
|
149
|
-
editorEl = props.editor.view.dom;
|
|
150
|
-
editorEl.addEventListener("blur", hide);
|
|
151
|
-
container = document.createElement("div");
|
|
152
|
-
container.className = "cmt-mention-popup";
|
|
153
|
-
container.appendChild(renderer.element);
|
|
154
|
-
const themed = editorEl.closest(".tl-container");
|
|
155
|
-
(themed ?? document.body).appendChild(container);
|
|
156
|
-
canvasEl = themed?.querySelector(".tl-canvas") ?? null;
|
|
157
|
-
container.addEventListener("wheel", onWheel, { passive: false });
|
|
158
|
-
place();
|
|
159
|
-
startFollowing();
|
|
160
|
-
mentionPickerOpen.set(true);
|
|
161
|
-
},
|
|
162
|
-
onUpdate: (props) => {
|
|
163
|
-
if (renderer)
|
|
164
|
-
renderer.updateProps({
|
|
165
|
-
items: props.items,
|
|
166
|
-
command: props.command,
|
|
167
|
-
renderMember: options.renderMember
|
|
168
|
-
});
|
|
169
|
-
if (container) container.style.display = "";
|
|
170
|
-
mentionPickerOpen.set(true);
|
|
171
|
-
place();
|
|
172
|
-
},
|
|
173
|
-
onKeyDown: (props) => {
|
|
174
|
-
if (!isMentionPickerOpen()) return false;
|
|
175
|
-
if (props.event.key === "Escape") {
|
|
176
|
-
hide();
|
|
177
|
-
props.event.stopPropagation();
|
|
178
|
-
return true;
|
|
179
|
-
}
|
|
180
|
-
if (props.event.key === "Enter" || props.event.key === "Tab") {
|
|
181
|
-
const completed = renderer?.ref?.onKeyDown(props) ?? false;
|
|
182
|
-
if (!completed) {
|
|
183
|
-
hide();
|
|
184
|
-
props.event.stopPropagation();
|
|
185
|
-
}
|
|
186
|
-
return true;
|
|
187
|
-
}
|
|
188
|
-
if (renderer && renderer.ref) return renderer.ref.onKeyDown(props);
|
|
189
|
-
return false;
|
|
190
|
-
},
|
|
191
|
-
onExit: () => {
|
|
192
|
-
stopFollowing();
|
|
193
|
-
if (editorEl) editorEl.removeEventListener("blur", hide);
|
|
194
|
-
if (container) container.removeEventListener("wheel", onWheel);
|
|
195
|
-
if (container) container.remove();
|
|
196
|
-
if (renderer) renderer.destroy();
|
|
197
|
-
renderer = null;
|
|
198
|
-
container = null;
|
|
199
|
-
canvasEl = null;
|
|
200
|
-
mentionPickerOpen.set(false);
|
|
201
|
-
}
|
|
202
|
-
};
|
|
203
|
-
}
|
|
204
|
-
};
|
|
205
|
-
}
|
|
206
|
-
//# sourceMappingURL=mention-suggestion.js.map
|