@tldraw/commenting 0.0.0-bootstrap → 5.3.0-canary.31036673d3f8
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 +1139 -329
- package/dist-cjs/canvas/anchor-lifecycle.js +148 -0
- package/dist-cjs/canvas/anchor-lifecycle.js.map +7 -0
- package/dist-cjs/canvas/cluster-input.js +2 -2
- package/dist-cjs/canvas/cluster-input.js.map +2 -2
- 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 +123 -0
- package/dist-cjs/canvas/comment-mutations.js.map +7 -0
- package/dist-cjs/canvas/comment-reactions.js +163 -0
- package/dist-cjs/canvas/comment-reactions.js.map +7 -0
- package/dist-cjs/canvas/comment-render.js +5 -3
- 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 +64 -14
- package/dist-cjs/canvas/comment-tool.js.map +2 -2
- package/dist-cjs/canvas/comments-filter-menu.js +20 -38
- package/dist-cjs/canvas/comments-filter-menu.js.map +2 -2
- package/dist-cjs/canvas/comments-overflow-menu.js +22 -27
- package/dist-cjs/canvas/comments-overflow-menu.js.map +2 -2
- package/dist-cjs/canvas/comments-overlay.js +429 -474
- package/dist-cjs/canvas/comments-overlay.js.map +2 -2
- package/dist-cjs/canvas/comments-sidebar.js +35 -32
- package/dist-cjs/canvas/comments-sidebar.js.map +2 -2
- package/dist-cjs/canvas/comments-visibility-toggle.js +65 -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 +22 -3
- package/dist-cjs/canvas/hooks.js.map +2 -2
- package/dist-cjs/canvas/options.js +19 -2
- package/dist-cjs/canvas/options.js.map +2 -2
- package/dist-cjs/canvas/pin-stacking.js +56 -0
- package/dist-cjs/canvas/pin-stacking.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-preview.js +185 -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 +67 -21
- package/dist-cjs/canvas/thread-state.js.map +2 -2
- package/dist-cjs/canvas/thread-view.js +397 -0
- package/dist-cjs/canvas/thread-view.js.map +7 -0
- package/dist-cjs/clustering/computeClusterTable.js +4 -4
- package/dist-cjs/clustering/computeClusterTable.js.map +2 -2
- package/dist-cjs/clustering/runtime.js +119 -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 +763 -333
- package/dist-cjs/index.js +46 -28
- package/dist-cjs/index.js.map +2 -2
- package/dist-cjs/ui/byline.js +6 -4
- 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 +137 -36
- package/dist-cjs/ui/comment-composer.js.map +2 -2
- package/dist-cjs/ui/comment-pin.js +24 -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 +30 -18
- 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 +4 -1
- package/dist-cjs/ui/format-time.js.map +2 -2
- package/dist-cjs/ui/reaction-picker.js +73 -0
- package/dist-cjs/ui/reaction-picker.js.map +7 -0
- package/dist-cjs/ui/reaction.js +59 -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 +20 -1
- package/dist-cjs/ui/send-button.js.map +2 -2
- package/dist-cjs/ui/{comment-text.js → tooltip-button.js} +12 -9
- package/dist-cjs/ui/tooltip-button.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/cluster-input.mjs +2 -2
- package/dist-esm/canvas/cluster-input.mjs.map +2 -2
- 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 +103 -0
- package/dist-esm/canvas/comment-mutations.mjs.map +7 -0
- package/dist-esm/canvas/comment-reactions.mjs +152 -0
- package/dist-esm/canvas/comment-reactions.mjs.map +7 -0
- package/dist-esm/canvas/comment-render.mjs +5 -3
- 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 +67 -17
- package/dist-esm/canvas/comment-tool.mjs.map +2 -2
- package/dist-esm/canvas/comments-filter-menu.mjs +20 -38
- package/dist-esm/canvas/comments-filter-menu.mjs.map +2 -2
- package/dist-esm/canvas/comments-overflow-menu.mjs +23 -27
- package/dist-esm/canvas/comments-overflow-menu.mjs.map +2 -2
- package/dist-esm/canvas/comments-overlay.mjs +450 -479
- package/dist-esm/canvas/comments-overlay.mjs.map +3 -3
- package/dist-esm/canvas/comments-sidebar.mjs +38 -35
- package/dist-esm/canvas/comments-sidebar.mjs.map +2 -2
- package/dist-esm/canvas/comments-visibility-toggle.mjs +45 -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 +28 -5
- package/dist-esm/canvas/hooks.mjs.map +2 -2
- package/dist-esm/canvas/options.mjs +21 -3
- package/dist-esm/canvas/options.mjs.map +2 -2
- package/dist-esm/canvas/pin-stacking.mjs +36 -0
- package/dist-esm/canvas/pin-stacking.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-preview.mjs +170 -0
- package/dist-esm/canvas/thread-preview.mjs.map +7 -0
- package/dist-esm/canvas/thread-stack.mjs +190 -0
- package/dist-esm/canvas/thread-stack.mjs.map +7 -0
- package/dist-esm/canvas/thread-state.mjs +71 -22
- package/dist-esm/canvas/thread-state.mjs.map +2 -2
- package/dist-esm/canvas/thread-view.mjs +402 -0
- package/dist-esm/canvas/thread-view.mjs.map +7 -0
- package/dist-esm/clustering/computeClusterTable.mjs +4 -4
- package/dist-esm/clustering/computeClusterTable.mjs.map +2 -2
- package/dist-esm/clustering/runtime.mjs +119 -7
- package/dist-esm/clustering/runtime.mjs.map +2 -2
- package/dist-esm/index.d.mts +763 -333
- package/dist-esm/index.mjs +87 -41
- package/dist-esm/index.mjs.map +2 -2
- package/dist-esm/ui/byline.mjs +6 -4
- 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 +148 -36
- package/dist-esm/ui/comment-composer.mjs.map +2 -2
- package/dist-esm/ui/comment-pin.mjs +24 -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 +43 -29
- 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 +4 -1
- package/dist-esm/ui/format-time.mjs.map +2 -2
- package/dist-esm/ui/reaction-picker.mjs +60 -0
- package/dist-esm/ui/reaction-picker.mjs.map +7 -0
- package/dist-esm/ui/reaction.mjs +60 -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 +20 -1
- package/dist-esm/ui/send-button.mjs.map +2 -2
- package/dist-esm/ui/tooltip-button.mjs +12 -0
- package/dist-esm/ui/tooltip-button.mjs.map +7 -0
- package/package.json +6 -6
- package/src/canvas/anchor-lifecycle.test.ts +290 -0
- package/src/canvas/anchor-lifecycle.ts +205 -0
- package/src/canvas/canvas.css +461 -46
- package/src/canvas/cluster-input.test.ts +31 -23
- package/src/canvas/cluster-input.ts +3 -4
- 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 +410 -0
- package/src/canvas/comment-mutations.ts +288 -0
- package/src/canvas/comment-reactions.test.ts +132 -0
- package/src/canvas/comment-reactions.tsx +245 -0
- package/src/canvas/comment-render.test.ts +1 -1
- package/src/canvas/comment-render.ts +9 -5
- package/src/canvas/comment-store.ts +67 -27
- package/src/canvas/comment-tool.test.ts +162 -0
- package/src/canvas/comment-tool.tsx +105 -23
- package/src/canvas/comments-filter-menu.tsx +23 -32
- package/src/canvas/comments-overflow-menu.tsx +14 -21
- package/src/canvas/comments-overlay.tsx +695 -622
- package/src/canvas/comments-sidebar.test.ts +45 -0
- package/src/canvas/comments-sidebar.tsx +76 -58
- package/src/canvas/comments-visibility-toggle.tsx +49 -0
- package/src/canvas/context.ts +47 -0
- package/src/canvas/hooks.ts +52 -11
- package/src/canvas/options.test.ts +52 -2
- package/src/canvas/options.ts +133 -9
- package/src/canvas/pin-stacking.test.ts +114 -0
- package/src/canvas/pin-stacking.ts +57 -0
- package/src/canvas/sidebar-filters.ts +4 -3
- package/src/canvas/state.ts +92 -35
- package/src/canvas/thread-preview.test.ts +91 -0
- package/src/canvas/thread-preview.tsx +304 -0
- package/src/canvas/thread-stack.tsx +252 -0
- package/src/canvas/thread-state.test.ts +209 -0
- package/src/canvas/thread-state.ts +137 -36
- package/src/canvas/thread-view.tsx +516 -0
- package/src/clustering/computeClusterTable.test.ts +24 -23
- package/src/clustering/computeClusterTable.ts +5 -5
- package/src/clustering/runtime.test.ts +217 -7
- package/src/clustering/runtime.ts +171 -17
- package/src/clustering/types.ts +9 -9
- package/src/index.ts +76 -40
- package/src/ui/byline.tsx +7 -5
- package/src/ui/comment-card.tsx +20 -10
- package/src/ui/comment-composer.tsx +206 -40
- package/src/ui/comment-pin.tsx +26 -2
- package/src/ui/comment-thread.tsx +13 -6
- package/src/ui/comments-list.test.ts +31 -0
- package/src/ui/comments-list.tsx +45 -21
- package/src/ui/comments.css +566 -281
- 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.ts +7 -2
- package/src/ui/reaction-picker.tsx +109 -0
- package/src/ui/reaction.tsx +121 -6
- package/src/ui/reactions.tsx +69 -10
- package/src/ui/reply-count.ts +16 -0
- package/src/ui/send-button.tsx +18 -3
- package/src/ui/tooltip-button.tsx +20 -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 +0 -43
- 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
|
@@ -14,6 +14,9 @@ export interface CommentThreadProps {
|
|
|
14
14
|
resolvedBanner?: ReactNode
|
|
15
15
|
/** Reply composer props. Omit for a read-only thread (no composer). */
|
|
16
16
|
composer?: CommentComposerProps
|
|
17
|
+
/** Shown at the bottom of the thread (e.g. a sign-in prompt when there's no composer). When
|
|
18
|
+
* both are set, the footer renders after the composer. */
|
|
19
|
+
footer?: ReactNode
|
|
17
20
|
/** Override how each comment renders. Defaults to `<CommentCard>`. */
|
|
18
21
|
renderComment?(comment: CommentCardProps, index: number): ReactNode
|
|
19
22
|
}
|
|
@@ -30,20 +33,23 @@ export function CommentThread({
|
|
|
30
33
|
headerActions,
|
|
31
34
|
resolvedBanner,
|
|
32
35
|
composer,
|
|
36
|
+
footer,
|
|
33
37
|
renderComment,
|
|
34
38
|
}: CommentThreadProps) {
|
|
35
39
|
return (
|
|
36
|
-
<div className="cmt-thread">
|
|
40
|
+
<div className="tlui-cmt-thread">
|
|
37
41
|
{(header !== undefined || headerActions !== undefined) && (
|
|
38
|
-
<div className="cmt-thread__header">
|
|
39
|
-
<span className="cmt-thread__title">{header}</span>
|
|
42
|
+
<div className="tlui-cmt-thread__header">
|
|
43
|
+
{header !== undefined && <span className="tlui-cmt-thread__title">{header}</span>}
|
|
40
44
|
{headerActions !== undefined && (
|
|
41
|
-
<div className="cmt-thread__actions">{headerActions}</div>
|
|
45
|
+
<div className="tlui-cmt-thread__actions">{headerActions}</div>
|
|
42
46
|
)}
|
|
43
47
|
</div>
|
|
44
48
|
)}
|
|
45
|
-
{resolvedBanner !== undefined &&
|
|
46
|
-
|
|
49
|
+
{resolvedBanner !== undefined && (
|
|
50
|
+
<div className="tlui-cmt-thread__resolved">{resolvedBanner}</div>
|
|
51
|
+
)}
|
|
52
|
+
<div className="tlui-cmt-thread__list">
|
|
47
53
|
{comments.map((comment, i) => (
|
|
48
54
|
<div key={i}>
|
|
49
55
|
{renderComment ? renderComment(comment, i) : <CommentCard {...comment} />}
|
|
@@ -51,6 +57,7 @@ export function CommentThread({
|
|
|
51
57
|
))}
|
|
52
58
|
</div>
|
|
53
59
|
{composer !== undefined && <CommentComposer {...composer} />}
|
|
60
|
+
{footer !== undefined && <div className="tlui-cmt-thread__footer">{footer}</div>}
|
|
54
61
|
</div>
|
|
55
62
|
)
|
|
56
63
|
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { MouseEvent } from 'react'
|
|
2
|
+
import { describe, expect, it } from 'vitest'
|
|
3
|
+
import { isOpenInNewTabClick } from './comments-list'
|
|
4
|
+
|
|
5
|
+
function click(overrides: Partial<MouseEvent> = {}): MouseEvent {
|
|
6
|
+
return {
|
|
7
|
+
metaKey: false,
|
|
8
|
+
ctrlKey: false,
|
|
9
|
+
shiftKey: false,
|
|
10
|
+
altKey: false,
|
|
11
|
+
button: 0,
|
|
12
|
+
...overrides,
|
|
13
|
+
} as MouseEvent
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
describe('isOpenInNewTabClick', () => {
|
|
17
|
+
it('treats a plain left click as an in-place select', () => {
|
|
18
|
+
expect(isOpenInNewTabClick(click())).toBe(false)
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
it.each(['metaKey', 'ctrlKey', 'shiftKey', 'altKey'] as const)(
|
|
22
|
+
'leaves a %s click to the browser',
|
|
23
|
+
(modifier) => {
|
|
24
|
+
expect(isOpenInNewTabClick(click({ [modifier]: true }))).toBe(true)
|
|
25
|
+
}
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
it('leaves non-primary-button clicks to the browser', () => {
|
|
29
|
+
expect(isOpenInNewTabClick(click({ button: 1 }))).toBe(true)
|
|
30
|
+
})
|
|
31
|
+
})
|
package/src/ui/comments-list.tsx
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { Avatar, type CommentAuthor } from '@tldraw/mentions'
|
|
2
|
+
import { MouseEvent, ReactNode } from 'react'
|
|
3
|
+
import { useTranslation } from 'tldraw'
|
|
3
4
|
import { Byline } from './byline'
|
|
5
|
+
import { replyCountLabel } from './reply-count'
|
|
4
6
|
|
|
5
7
|
/** @public */
|
|
6
8
|
export interface CommentListItemProps {
|
|
7
9
|
id: string
|
|
8
|
-
author:
|
|
10
|
+
author: CommentAuthor
|
|
9
11
|
/** A short preview of the thread — e.g. the first comment's body. */
|
|
10
12
|
preview: ReactNode
|
|
11
13
|
/** ISO datetime of the thread's first comment. */
|
|
@@ -17,6 +19,11 @@ export interface CommentListItemProps {
|
|
|
17
19
|
count?: number
|
|
18
20
|
/** Whether this thread is the open one. */
|
|
19
21
|
selected?: boolean
|
|
22
|
+
/**
|
|
23
|
+
* Link target for the item. When set, the row renders as an anchor so browser affordances
|
|
24
|
+
* (ctrl/cmd-click, middle-click) open it in a new tab; a plain click still calls `onSelect`.
|
|
25
|
+
*/
|
|
26
|
+
href?: string
|
|
20
27
|
}
|
|
21
28
|
|
|
22
29
|
/** @public */
|
|
@@ -52,17 +59,17 @@ export function CommentsList({
|
|
|
52
59
|
renderItem,
|
|
53
60
|
}: CommentsListProps) {
|
|
54
61
|
return (
|
|
55
|
-
<div className="cmt-list">
|
|
62
|
+
<div className="tlui-cmt-list">
|
|
56
63
|
{(header !== undefined || headerAction) && (
|
|
57
|
-
<div className="cmt-list__header">
|
|
58
|
-
{header !== undefined && <span className="cmt-list__header-title">{header}</span>}
|
|
64
|
+
<div className="tlui-cmt-list__header">
|
|
65
|
+
{header !== undefined && <span className="tlui-cmt-list__header-title">{header}</span>}
|
|
59
66
|
{headerAction}
|
|
60
67
|
</div>
|
|
61
68
|
)}
|
|
62
69
|
{items.length === 0 ? (
|
|
63
|
-
<div className="cmt-list__empty">{empty}</div>
|
|
70
|
+
<div className="tlui-cmt-list__empty">{empty}</div>
|
|
64
71
|
) : (
|
|
65
|
-
<div className="cmt-list__items">
|
|
72
|
+
<div className="tlui-cmt-list__items">
|
|
66
73
|
{items.map((item) =>
|
|
67
74
|
renderItem ? (
|
|
68
75
|
renderItem(item)
|
|
@@ -90,40 +97,57 @@ function CommentListItem({
|
|
|
90
97
|
page,
|
|
91
98
|
count,
|
|
92
99
|
selected,
|
|
100
|
+
href,
|
|
93
101
|
resolvedLabel = 'Resolved',
|
|
94
102
|
onSelect,
|
|
95
103
|
}: CommentListItemProps & { resolvedLabel?: string; onSelect?(id: string): void }) {
|
|
96
|
-
const
|
|
104
|
+
const msg = useTranslation()
|
|
105
|
+
const handleClick = (e: MouseEvent) => {
|
|
106
|
+
if (href && isOpenInNewTabClick(e)) return
|
|
107
|
+
e.preventDefault()
|
|
97
108
|
if (onSelect) onSelect(id)
|
|
98
109
|
}
|
|
110
|
+
const Tag = href ? 'a' : 'button'
|
|
111
|
+
// `count` is the thread's total comments; a reply is every comment after the opening one.
|
|
112
|
+
const replies = count !== undefined ? replyCountLabel(msg, count - 1) : null
|
|
99
113
|
return (
|
|
100
|
-
<
|
|
101
|
-
type
|
|
102
|
-
className={
|
|
114
|
+
<Tag
|
|
115
|
+
{...(href ? { href } : { type: 'button' })}
|
|
116
|
+
className={
|
|
117
|
+
selected ? 'tlui-cmt-list__item tlui-cmt-list__item--selected' : 'tlui-cmt-list__item'
|
|
118
|
+
}
|
|
103
119
|
data-resolved={resolved || undefined}
|
|
104
120
|
onClick={handleClick}
|
|
105
121
|
>
|
|
106
|
-
<Avatar
|
|
107
|
-
<div className="cmt-list__item-body">
|
|
122
|
+
<Avatar author={author} />
|
|
123
|
+
<div className="tlui-cmt-list__item-body">
|
|
108
124
|
<Byline author={author} date={date} />
|
|
109
|
-
<div className="cmt-list__item-preview">{preview}</div>
|
|
110
|
-
{(resolved || page !== undefined) && (
|
|
111
|
-
<div className="cmt-list__item-meta">
|
|
125
|
+
<div className="tlui-cmt-list__item-preview">{preview}</div>
|
|
126
|
+
{(resolved || page !== undefined || replies) && (
|
|
127
|
+
<div className="tlui-cmt-list__item-meta">
|
|
112
128
|
{resolved && (
|
|
113
|
-
<span className="cmt-list__item-resolved">
|
|
129
|
+
<span className="tlui-cmt-list__item-resolved">
|
|
114
130
|
<CheckIcon />
|
|
115
131
|
{resolvedLabel}
|
|
116
132
|
</span>
|
|
117
133
|
)}
|
|
118
|
-
{page !== undefined && <span className="cmt-list__item-page">{page}</span>}
|
|
134
|
+
{page !== undefined && <span className="tlui-cmt-list__item-page">{page}</span>}
|
|
135
|
+
{replies && <span className="tlui-cmt-list__item-replies">{replies}</span>}
|
|
119
136
|
</div>
|
|
120
137
|
)}
|
|
121
138
|
</div>
|
|
122
|
-
|
|
123
|
-
</button>
|
|
139
|
+
</Tag>
|
|
124
140
|
)
|
|
125
141
|
}
|
|
126
142
|
|
|
143
|
+
/**
|
|
144
|
+
* Whether a click should be left to the browser's link handling (new tab, new window, or download).
|
|
145
|
+
* @public
|
|
146
|
+
*/
|
|
147
|
+
export function isOpenInNewTabClick(e: MouseEvent) {
|
|
148
|
+
return e.metaKey || e.ctrlKey || e.shiftKey || e.altKey || e.button !== 0
|
|
149
|
+
}
|
|
150
|
+
|
|
127
151
|
function CheckIcon() {
|
|
128
152
|
return (
|
|
129
153
|
<svg width="12" height="12" viewBox="0 0 12 12" fill="none" aria-hidden="true">
|