@liveblocks/react-ui 3.15.0-thread2 → 3.15.1-rc1
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 +6 -16
- package/dist/_private/index.cjs +3 -5
- package/dist/_private/index.cjs.map +1 -1
- package/dist/_private/index.d.cts +6 -4
- package/dist/_private/index.d.ts +6 -4
- package/dist/_private/index.js +2 -2
- package/dist/components/AvatarStack.cjs +122 -0
- package/dist/components/AvatarStack.cjs.map +1 -0
- package/dist/components/AvatarStack.js +120 -0
- package/dist/components/AvatarStack.js.map +1 -0
- package/dist/components/Comment.cjs +10 -28
- package/dist/components/Comment.cjs.map +1 -1
- package/dist/components/Comment.js +12 -11
- package/dist/components/Comment.js.map +1 -1
- package/dist/components/CommentPin.cjs +38 -0
- package/dist/components/CommentPin.cjs.map +1 -0
- package/dist/components/CommentPin.js +36 -0
- package/dist/components/CommentPin.js.map +1 -0
- package/dist/components/Composer.cjs +2 -4
- package/dist/components/Composer.cjs.map +1 -1
- package/dist/components/Composer.js +3 -5
- package/dist/components/Composer.js.map +1 -1
- package/dist/components/Cursor.cjs +40 -0
- package/dist/components/Cursor.cjs.map +1 -0
- package/dist/components/Cursor.js +38 -0
- package/dist/components/Cursor.js.map +1 -0
- package/dist/components/Cursors.cjs +256 -0
- package/dist/components/Cursors.cjs.map +1 -0
- package/dist/components/Cursors.js +254 -0
- package/dist/components/Cursors.js.map +1 -0
- package/dist/components/FloatingComposer.cjs +97 -0
- package/dist/components/FloatingComposer.cjs.map +1 -0
- package/dist/components/FloatingComposer.js +95 -0
- package/dist/components/FloatingComposer.js.map +1 -0
- package/dist/components/FloatingThread.cjs +83 -0
- package/dist/components/FloatingThread.cjs.map +1 -0
- package/dist/components/FloatingThread.js +81 -0
- package/dist/components/FloatingThread.js.map +1 -0
- package/dist/components/InboxNotification.cjs +4 -6
- package/dist/components/InboxNotification.cjs.map +1 -1
- package/dist/components/InboxNotification.js +5 -7
- package/dist/components/InboxNotification.js.map +1 -1
- package/dist/components/Thread.cjs +19 -28
- package/dist/components/Thread.cjs.map +1 -1
- package/dist/components/Thread.js +19 -9
- package/dist/components/Thread.js.map +1 -1
- package/dist/components/internal/AiComposer.cjs +1 -2
- package/dist/components/internal/AiComposer.cjs.map +1 -1
- package/dist/components/internal/AiComposer.js +1 -2
- package/dist/components/internal/AiComposer.js.map +1 -1
- package/dist/components/internal/Avatar.cjs +10 -13
- package/dist/components/internal/Avatar.cjs.map +1 -1
- package/dist/components/internal/Avatar.js +11 -14
- package/dist/components/internal/Avatar.js.map +1 -1
- package/dist/components/internal/CodeBlock.cjs +1 -2
- package/dist/components/internal/CodeBlock.cjs.map +1 -1
- package/dist/components/internal/CodeBlock.js +1 -2
- package/dist/components/internal/CodeBlock.js.map +1 -1
- package/dist/components/internal/Dropdown.cjs +8 -28
- package/dist/components/internal/Dropdown.cjs.map +1 -1
- package/dist/components/internal/Dropdown.js +8 -7
- package/dist/components/internal/Dropdown.js.map +1 -1
- package/dist/components/internal/EmojiPicker.cjs +7 -27
- package/dist/components/internal/EmojiPicker.cjs.map +1 -1
- package/dist/components/internal/EmojiPicker.js +7 -6
- package/dist/components/internal/EmojiPicker.js.map +1 -1
- package/dist/components/internal/List.cjs +2 -2
- package/dist/components/internal/List.cjs.map +1 -1
- package/dist/components/internal/List.js +2 -2
- package/dist/components/internal/List.js.map +1 -1
- package/dist/components/internal/Tooltip.cjs +8 -28
- package/dist/components/internal/Tooltip.cjs.map +1 -1
- package/dist/components/internal/Tooltip.js +8 -7
- package/dist/components/internal/Tooltip.js.map +1 -1
- package/dist/icon.cjs +2 -0
- package/dist/icon.cjs.map +1 -1
- package/dist/icon.js +1 -0
- package/dist/icon.js.map +1 -1
- package/dist/icons/Plus.cjs +11 -0
- package/dist/icons/Plus.cjs.map +1 -0
- package/dist/icons/Plus.js +9 -0
- package/dist/icons/Plus.js.map +1 -0
- package/dist/icons/index.cjs +2 -0
- package/dist/icons/index.cjs.map +1 -1
- package/dist/icons/index.js +1 -0
- package/dist/icons/index.js.map +1 -1
- package/dist/index.cjs +12 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +240 -137
- package/dist/index.d.ts +240 -137
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/primitives/AiComposer/index.cjs +5 -4
- package/dist/primitives/AiComposer/index.cjs.map +1 -1
- package/dist/primitives/AiComposer/index.js +5 -4
- package/dist/primitives/AiComposer/index.js.map +1 -1
- package/dist/primitives/AiMessage/index.cjs +2 -2
- package/dist/primitives/AiMessage/index.cjs.map +1 -1
- package/dist/primitives/AiMessage/index.js +2 -2
- package/dist/primitives/AiMessage/index.js.map +1 -1
- package/dist/primitives/Collapsible/index.cjs +4 -4
- package/dist/primitives/Collapsible/index.cjs.map +1 -1
- package/dist/primitives/Collapsible/index.js +4 -4
- package/dist/primitives/Collapsible/index.js.map +1 -1
- package/dist/primitives/Comment/index.cjs +4 -4
- package/dist/primitives/Comment/index.cjs.map +1 -1
- package/dist/primitives/Comment/index.js +4 -4
- package/dist/primitives/Comment/index.js.map +1 -1
- package/dist/primitives/Composer/index.cjs +23 -35
- package/dist/primitives/Composer/index.cjs.map +1 -1
- package/dist/primitives/Composer/index.js +23 -16
- package/dist/primitives/Composer/index.js.map +1 -1
- package/dist/primitives/Duration.cjs +2 -2
- package/dist/primitives/Duration.cjs.map +1 -1
- package/dist/primitives/Duration.js +2 -2
- package/dist/primitives/Duration.js.map +1 -1
- package/dist/primitives/FileSize.cjs +2 -2
- package/dist/primitives/FileSize.cjs.map +1 -1
- package/dist/primitives/FileSize.js +2 -2
- package/dist/primitives/FileSize.js.map +1 -1
- package/dist/primitives/Markdown.cjs +2 -2
- package/dist/primitives/Markdown.cjs.map +1 -1
- package/dist/primitives/Markdown.js +2 -2
- package/dist/primitives/Markdown.js.map +1 -1
- package/dist/primitives/Timestamp.cjs +2 -2
- package/dist/primitives/Timestamp.cjs.map +1 -1
- package/dist/primitives/Timestamp.js +2 -2
- package/dist/primitives/Timestamp.js.map +1 -1
- package/dist/utils/Portal.cjs +2 -2
- package/dist/utils/Portal.cjs.map +1 -1
- package/dist/utils/Portal.js +2 -2
- package/dist/utils/Portal.js.map +1 -1
- package/dist/utils/animation-loop.cjs +44 -0
- package/dist/utils/animation-loop.cjs.map +1 -0
- package/dist/utils/animation-loop.js +42 -0
- package/dist/utils/animation-loop.js.map +1 -0
- package/dist/utils/px.cjs +14 -0
- package/dist/utils/px.cjs.map +1 -0
- package/dist/utils/px.js +12 -0
- package/dist/utils/px.js.map +1 -0
- package/dist/utils/use-pre-resolve-user.cjs +18 -0
- package/dist/utils/use-pre-resolve-user.cjs.map +1 -0
- package/dist/utils/use-pre-resolve-user.js +16 -0
- package/dist/utils/use-pre-resolve-user.js.map +1 -0
- package/dist/version.cjs +1 -1
- package/dist/version.cjs.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +7 -10
- package/src/styles/dark/index.css +1 -1
- package/src/styles/index.css +259 -4
- package/styles/dark/attributes.css +1 -1
- package/styles/dark/attributes.css.map +1 -1
- package/styles/dark/media-query.css +1 -1
- package/styles/dark/media-query.css.map +1 -1
- package/styles.css +1 -1
- package/styles.css.map +1 -1
package/README.md
CHANGED
|
@@ -1,24 +1,14 @@
|
|
|
1
|
-
<p
|
|
2
|
-
<a href="https://liveblocks.io#gh-light-mode-only">
|
|
3
|
-
|
|
4
|
-
</a>
|
|
5
|
-
<a href="https://liveblocks.io#gh-dark-mode-only">
|
|
6
|
-
<img src="https://raw.githubusercontent.com/liveblocks/liveblocks/main/.github/assets/header-dark.svg" alt="Liveblocks" />
|
|
7
|
-
</a>
|
|
1
|
+
<p>
|
|
2
|
+
<a href="https://liveblocks.io#gh-light-mode-only"><img src="https://raw.githubusercontent.com/liveblocks/liveblocks/main/.github/assets/header-light.svg" alt="Liveblocks" /></a>
|
|
3
|
+
<a href="https://liveblocks.io#gh-dark-mode-only"><img src="https://raw.githubusercontent.com/liveblocks/liveblocks/main/.github/assets/header-dark.svg" alt="Liveblocks" /></a>
|
|
8
4
|
</p>
|
|
9
5
|
|
|
10
6
|
# `@liveblocks/react-ui`
|
|
11
7
|
|
|
12
8
|
<p>
|
|
13
|
-
<a href="https://npmjs.org/package/@liveblocks/react-ui">
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
<a href="https://bundlephobia.com/package/@liveblocks/react-ui">
|
|
17
|
-
<img src="https://img.shields.io/bundlephobia/minzip/@liveblocks/react-ui?style=flat&label=size&color=09f" alt="Size" />
|
|
18
|
-
</a>
|
|
19
|
-
<a href="https://github.com/liveblocks/liveblocks/blob/main/LICENSE">
|
|
20
|
-
<img src="https://img.shields.io/github/license/liveblocks/liveblocks?style=flat&label=license&color=f80" alt="License" />
|
|
21
|
-
</a>
|
|
9
|
+
<a href="https://npmjs.org/package/@liveblocks/react-ui"><img src="https://img.shields.io/npm/v/@liveblocks/react-ui?style=flat&label=npm&color=c33" alt="NPM" /></a>
|
|
10
|
+
<a href="https://bundlephobia.com/package/@liveblocks/react-ui"><img src="https://img.shields.io/bundlephobia/minzip/@liveblocks/react-ui?style=flat&label=size&color=09f" alt="Size" /></a>
|
|
11
|
+
<a href="https://github.com/liveblocks/liveblocks/blob/main/licenses/LICENSE-APACHE-2.0"><img src="https://img.shields.io/badge/license-Apache--2.0-green" alt="License" /></a>
|
|
22
12
|
</p>
|
|
23
13
|
|
|
24
14
|
`@liveblocks/react-ui` provides [React](https://reactjs.org/) pre-built
|
package/dist/_private/index.cjs
CHANGED
|
@@ -21,7 +21,6 @@ var contexts = require('../primitives/AiComposer/contexts.cjs');
|
|
|
21
21
|
var index$1 = require('../primitives/AiMessage/index.cjs');
|
|
22
22
|
var index$2 = require('../primitives/Collapsible/index.cjs');
|
|
23
23
|
var Markdown = require('../primitives/Markdown.cjs');
|
|
24
|
-
var TooltipPrimitive = require('@radix-ui/react-tooltip');
|
|
25
24
|
var ArrowCornerDownRight = require('../icons/ArrowCornerDownRight.cjs');
|
|
26
25
|
var ArrowCornerUpRight = require('../icons/ArrowCornerUpRight.cjs');
|
|
27
26
|
var ArrowDown = require('../icons/ArrowDown.cjs');
|
|
@@ -58,6 +57,7 @@ var ListOrdered = require('../icons/ListOrdered.cjs');
|
|
|
58
57
|
var ListUnordered = require('../icons/ListUnordered.cjs');
|
|
59
58
|
var Mention = require('../icons/Mention.cjs');
|
|
60
59
|
var MinusCircle = require('../icons/MinusCircle.cjs');
|
|
60
|
+
var Plus = require('../icons/Plus.cjs');
|
|
61
61
|
var QuestionMark = require('../icons/QuestionMark.cjs');
|
|
62
62
|
var Redo = require('../icons/Redo.cjs');
|
|
63
63
|
var Restore = require('../icons/Restore.cjs');
|
|
@@ -89,6 +89,7 @@ exports.List = List.List;
|
|
|
89
89
|
exports.Prose = Prose.Prose;
|
|
90
90
|
exports.ShortcutTooltip = Tooltip.ShortcutTooltip;
|
|
91
91
|
exports.Tooltip = Tooltip.Tooltip;
|
|
92
|
+
exports.TooltipProvider = Tooltip.TooltipProvider;
|
|
92
93
|
exports.User = User.User;
|
|
93
94
|
exports.useLiveblocksUiConfig = config.useLiveblocksUiConfig;
|
|
94
95
|
exports.capitalize = capitalize.capitalize;
|
|
@@ -102,10 +103,6 @@ exports.useAiComposer = contexts.useAiComposer;
|
|
|
102
103
|
exports.AiMessage = index$1;
|
|
103
104
|
exports.Collapsible = index$2;
|
|
104
105
|
exports.Markdown = Markdown.Markdown;
|
|
105
|
-
Object.defineProperty(exports, 'TooltipProvider', {
|
|
106
|
-
enumerable: true,
|
|
107
|
-
get: function () { return TooltipPrimitive.TooltipProvider; }
|
|
108
|
-
});
|
|
109
106
|
exports.ArrowCornerDownRightIcon = ArrowCornerDownRight.ArrowCornerDownRightIcon;
|
|
110
107
|
exports.ArrowCornerUpRightIcon = ArrowCornerUpRight.ArrowCornerUpRightIcon;
|
|
111
108
|
exports.ArrowDownIcon = ArrowDown.ArrowDownIcon;
|
|
@@ -142,6 +139,7 @@ exports.ListOrderedIcon = ListOrdered.ListOrderedIcon;
|
|
|
142
139
|
exports.ListUnorderedIcon = ListUnordered.ListUnorderedIcon;
|
|
143
140
|
exports.MentionIcon = Mention.MentionIcon;
|
|
144
141
|
exports.MinusCircleIcon = MinusCircle.MinusCircleIcon;
|
|
142
|
+
exports.PlusIcon = Plus.PlusIcon;
|
|
145
143
|
exports.QuestionMarkIcon = QuestionMark.QuestionMarkIcon;
|
|
146
144
|
exports.RedoIcon = Redo.RedoIcon;
|
|
147
145
|
exports.RestoreIcon = Restore.RestoreIcon;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -2,8 +2,7 @@ import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
|
2
2
|
import { Relax, AiTextPart, AiReasoningPart, AiChatMessage } from '@liveblocks/core';
|
|
3
3
|
import * as react from 'react';
|
|
4
4
|
import { ComponentProps, ReactNode, ComponentPropsWithoutRef, ElementType, ComponentType, Ref, RefCallback, FormEvent } from 'react';
|
|
5
|
-
import
|
|
6
|
-
export { TooltipProvider } from '@radix-ui/react-tooltip';
|
|
5
|
+
import { Tooltip as Tooltip$1 } from 'radix-ui';
|
|
7
6
|
|
|
8
7
|
type AvatarProps = ComponentProps<"div"> & {
|
|
9
8
|
icon?: ReactNode;
|
|
@@ -345,7 +344,7 @@ interface ProseProps extends ComponentProps<"div"> {
|
|
|
345
344
|
*/
|
|
346
345
|
declare function Prose({ content, partial, components, className, ...props }: ProseProps): react_jsx_runtime.JSX.Element;
|
|
347
346
|
|
|
348
|
-
interface TooltipProps extends Pick<
|
|
347
|
+
interface TooltipProps extends Pick<Tooltip$1.TooltipTriggerProps, "children">, Omit<Tooltip$1.TooltipContentProps, "content"> {
|
|
349
348
|
content: ReactNode;
|
|
350
349
|
multiline?: boolean;
|
|
351
350
|
}
|
|
@@ -354,6 +353,7 @@ interface ShortcutTooltipProps extends TooltipProps {
|
|
|
354
353
|
}
|
|
355
354
|
declare const Tooltip: react.ForwardRefExoticComponent<TooltipProps & react.RefAttributes<HTMLButtonElement>>;
|
|
356
355
|
declare const ShortcutTooltip: react.ForwardRefExoticComponent<ShortcutTooltipProps & react.RefAttributes<HTMLButtonElement>>;
|
|
356
|
+
declare const TooltipProvider: react.FC<Tooltip$1.TooltipProviderProps>;
|
|
357
357
|
|
|
358
358
|
interface UserProps extends ComponentProps<"span"> {
|
|
359
359
|
/**
|
|
@@ -447,6 +447,8 @@ declare function MentionIcon(props: ComponentProps<"svg">): react_jsx_runtime.JS
|
|
|
447
447
|
|
|
448
448
|
declare function MinusCircleIcon(props: ComponentProps<"svg">): react_jsx_runtime.JSX.Element;
|
|
449
449
|
|
|
450
|
+
declare function PlusIcon(props: ComponentProps<"svg">): react_jsx_runtime.JSX.Element;
|
|
451
|
+
|
|
450
452
|
declare function QuestionMarkIcon(props: ComponentProps<"svg">): react_jsx_runtime.JSX.Element;
|
|
451
453
|
|
|
452
454
|
declare function RedoIcon(props: ComponentProps<"svg">): react_jsx_runtime.JSX.Element;
|
|
@@ -724,4 +726,4 @@ declare namespace index {
|
|
|
724
726
|
};
|
|
725
727
|
}
|
|
726
728
|
|
|
727
|
-
export { index$2 as AiComposer, AiComposerEditorProps, AiComposerFormProps, AiComposerSubmitProps, index$1 as AiMessage, AiMessageContentComponents, AiMessageContentProps, AiMessageContentReasoningPartProps, AiMessageContentTextPartProps, ArrowCornerDownRightIcon, ArrowCornerUpRightIcon, ArrowDownIcon, ArrowUpIcon, AttachmentIcon, Avatar, BellCrossedIcon, BellIcon, BlockquoteIcon, BoldIcon, Button, CheckCircleFillIcon, CheckCircleIcon, CheckIcon, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon, CodeIcon, index as Collapsible, CommentIcon, CopyIcon, CrossCircleFillIcon, CrossIcon, DeleteIcon, EditIcon, EllipsisIcon, EmojiIcon, EmojiPlusIcon, GlobeIcon, Group, GroupDescription, H1Icon, H2Icon, H3Icon, ItalicIcon, LengthenIcon, List, ListOrderedIcon, ListUnorderedIcon, Markdown, MarkdownComponents, MarkdownComponentsBlockquoteProps, MarkdownComponentsCodeBlockProps, MarkdownComponentsHeadingProps, MarkdownComponentsImageProps, MarkdownComponentsInlineProps, MarkdownComponentsLinkProps, MarkdownComponentsListProps, MarkdownComponentsParagraphProps, MarkdownComponentsTableProps, MarkdownProps, MentionIcon, MinusCircleIcon, Portal, Prose, QuestionMarkIcon, RedoIcon, RestoreIcon, RetryIcon, SearchIcon, SelectButton, SendIcon, ShortcutTooltip, ShortenIcon, SparklesIcon, SparklesTextIcon, SpinnerIcon, StopIcon, StrikethroughIcon, TextIcon, Tooltip, TranslateIcon, UnderlineIcon, UndoIcon, User, UserIcon, UsersIcon, WarningIcon, capitalize, cn, useAiComposer, useInitial, useLiveblocksUiConfig, useRefs, useStableComponent };
|
|
729
|
+
export { index$2 as AiComposer, AiComposerEditorProps, AiComposerFormProps, AiComposerSubmitProps, index$1 as AiMessage, AiMessageContentComponents, AiMessageContentProps, AiMessageContentReasoningPartProps, AiMessageContentTextPartProps, ArrowCornerDownRightIcon, ArrowCornerUpRightIcon, ArrowDownIcon, ArrowUpIcon, AttachmentIcon, Avatar, BellCrossedIcon, BellIcon, BlockquoteIcon, BoldIcon, Button, CheckCircleFillIcon, CheckCircleIcon, CheckIcon, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon, CodeIcon, index as Collapsible, CommentIcon, CopyIcon, CrossCircleFillIcon, CrossIcon, DeleteIcon, EditIcon, EllipsisIcon, EmojiIcon, EmojiPlusIcon, GlobeIcon, Group, GroupDescription, H1Icon, H2Icon, H3Icon, ItalicIcon, LengthenIcon, List, ListOrderedIcon, ListUnorderedIcon, Markdown, MarkdownComponents, MarkdownComponentsBlockquoteProps, MarkdownComponentsCodeBlockProps, MarkdownComponentsHeadingProps, MarkdownComponentsImageProps, MarkdownComponentsInlineProps, MarkdownComponentsLinkProps, MarkdownComponentsListProps, MarkdownComponentsParagraphProps, MarkdownComponentsTableProps, MarkdownProps, MentionIcon, MinusCircleIcon, PlusIcon, Portal, Prose, QuestionMarkIcon, RedoIcon, RestoreIcon, RetryIcon, SearchIcon, SelectButton, SendIcon, ShortcutTooltip, ShortenIcon, SparklesIcon, SparklesTextIcon, SpinnerIcon, StopIcon, StrikethroughIcon, TextIcon, Tooltip, TooltipProvider, TranslateIcon, UnderlineIcon, UndoIcon, User, UserIcon, UsersIcon, WarningIcon, capitalize, cn, useAiComposer, useInitial, useLiveblocksUiConfig, useRefs, useStableComponent };
|
package/dist/_private/index.d.ts
CHANGED
|
@@ -2,8 +2,7 @@ import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
|
2
2
|
import { Relax, AiTextPart, AiReasoningPart, AiChatMessage } from '@liveblocks/core';
|
|
3
3
|
import * as react from 'react';
|
|
4
4
|
import { ComponentProps, ReactNode, ComponentPropsWithoutRef, ElementType, ComponentType, Ref, RefCallback, FormEvent } from 'react';
|
|
5
|
-
import
|
|
6
|
-
export { TooltipProvider } from '@radix-ui/react-tooltip';
|
|
5
|
+
import { Tooltip as Tooltip$1 } from 'radix-ui';
|
|
7
6
|
|
|
8
7
|
type AvatarProps = ComponentProps<"div"> & {
|
|
9
8
|
icon?: ReactNode;
|
|
@@ -345,7 +344,7 @@ interface ProseProps extends ComponentProps<"div"> {
|
|
|
345
344
|
*/
|
|
346
345
|
declare function Prose({ content, partial, components, className, ...props }: ProseProps): react_jsx_runtime.JSX.Element;
|
|
347
346
|
|
|
348
|
-
interface TooltipProps extends Pick<
|
|
347
|
+
interface TooltipProps extends Pick<Tooltip$1.TooltipTriggerProps, "children">, Omit<Tooltip$1.TooltipContentProps, "content"> {
|
|
349
348
|
content: ReactNode;
|
|
350
349
|
multiline?: boolean;
|
|
351
350
|
}
|
|
@@ -354,6 +353,7 @@ interface ShortcutTooltipProps extends TooltipProps {
|
|
|
354
353
|
}
|
|
355
354
|
declare const Tooltip: react.ForwardRefExoticComponent<TooltipProps & react.RefAttributes<HTMLButtonElement>>;
|
|
356
355
|
declare const ShortcutTooltip: react.ForwardRefExoticComponent<ShortcutTooltipProps & react.RefAttributes<HTMLButtonElement>>;
|
|
356
|
+
declare const TooltipProvider: react.FC<Tooltip$1.TooltipProviderProps>;
|
|
357
357
|
|
|
358
358
|
interface UserProps extends ComponentProps<"span"> {
|
|
359
359
|
/**
|
|
@@ -447,6 +447,8 @@ declare function MentionIcon(props: ComponentProps<"svg">): react_jsx_runtime.JS
|
|
|
447
447
|
|
|
448
448
|
declare function MinusCircleIcon(props: ComponentProps<"svg">): react_jsx_runtime.JSX.Element;
|
|
449
449
|
|
|
450
|
+
declare function PlusIcon(props: ComponentProps<"svg">): react_jsx_runtime.JSX.Element;
|
|
451
|
+
|
|
450
452
|
declare function QuestionMarkIcon(props: ComponentProps<"svg">): react_jsx_runtime.JSX.Element;
|
|
451
453
|
|
|
452
454
|
declare function RedoIcon(props: ComponentProps<"svg">): react_jsx_runtime.JSX.Element;
|
|
@@ -724,4 +726,4 @@ declare namespace index {
|
|
|
724
726
|
};
|
|
725
727
|
}
|
|
726
728
|
|
|
727
|
-
export { index$2 as AiComposer, AiComposerEditorProps, AiComposerFormProps, AiComposerSubmitProps, index$1 as AiMessage, AiMessageContentComponents, AiMessageContentProps, AiMessageContentReasoningPartProps, AiMessageContentTextPartProps, ArrowCornerDownRightIcon, ArrowCornerUpRightIcon, ArrowDownIcon, ArrowUpIcon, AttachmentIcon, Avatar, BellCrossedIcon, BellIcon, BlockquoteIcon, BoldIcon, Button, CheckCircleFillIcon, CheckCircleIcon, CheckIcon, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon, CodeIcon, index as Collapsible, CommentIcon, CopyIcon, CrossCircleFillIcon, CrossIcon, DeleteIcon, EditIcon, EllipsisIcon, EmojiIcon, EmojiPlusIcon, GlobeIcon, Group, GroupDescription, H1Icon, H2Icon, H3Icon, ItalicIcon, LengthenIcon, List, ListOrderedIcon, ListUnorderedIcon, Markdown, MarkdownComponents, MarkdownComponentsBlockquoteProps, MarkdownComponentsCodeBlockProps, MarkdownComponentsHeadingProps, MarkdownComponentsImageProps, MarkdownComponentsInlineProps, MarkdownComponentsLinkProps, MarkdownComponentsListProps, MarkdownComponentsParagraphProps, MarkdownComponentsTableProps, MarkdownProps, MentionIcon, MinusCircleIcon, Portal, Prose, QuestionMarkIcon, RedoIcon, RestoreIcon, RetryIcon, SearchIcon, SelectButton, SendIcon, ShortcutTooltip, ShortenIcon, SparklesIcon, SparklesTextIcon, SpinnerIcon, StopIcon, StrikethroughIcon, TextIcon, Tooltip, TranslateIcon, UnderlineIcon, UndoIcon, User, UserIcon, UsersIcon, WarningIcon, capitalize, cn, useAiComposer, useInitial, useLiveblocksUiConfig, useRefs, useStableComponent };
|
|
729
|
+
export { index$2 as AiComposer, AiComposerEditorProps, AiComposerFormProps, AiComposerSubmitProps, index$1 as AiMessage, AiMessageContentComponents, AiMessageContentProps, AiMessageContentReasoningPartProps, AiMessageContentTextPartProps, ArrowCornerDownRightIcon, ArrowCornerUpRightIcon, ArrowDownIcon, ArrowUpIcon, AttachmentIcon, Avatar, BellCrossedIcon, BellIcon, BlockquoteIcon, BoldIcon, Button, CheckCircleFillIcon, CheckCircleIcon, CheckIcon, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon, CodeIcon, index as Collapsible, CommentIcon, CopyIcon, CrossCircleFillIcon, CrossIcon, DeleteIcon, EditIcon, EllipsisIcon, EmojiIcon, EmojiPlusIcon, GlobeIcon, Group, GroupDescription, H1Icon, H2Icon, H3Icon, ItalicIcon, LengthenIcon, List, ListOrderedIcon, ListUnorderedIcon, Markdown, MarkdownComponents, MarkdownComponentsBlockquoteProps, MarkdownComponentsCodeBlockProps, MarkdownComponentsHeadingProps, MarkdownComponentsImageProps, MarkdownComponentsInlineProps, MarkdownComponentsLinkProps, MarkdownComponentsListProps, MarkdownComponentsParagraphProps, MarkdownComponentsTableProps, MarkdownProps, MentionIcon, MinusCircleIcon, PlusIcon, Portal, Prose, QuestionMarkIcon, RedoIcon, RestoreIcon, RetryIcon, SearchIcon, SelectButton, SendIcon, ShortcutTooltip, ShortenIcon, SparklesIcon, SparklesTextIcon, SpinnerIcon, StopIcon, StrikethroughIcon, TextIcon, Tooltip, TooltipProvider, TranslateIcon, UnderlineIcon, UndoIcon, User, UserIcon, UsersIcon, WarningIcon, capitalize, cn, useAiComposer, useInitial, useLiveblocksUiConfig, useRefs, useStableComponent };
|
package/dist/_private/index.js
CHANGED
|
@@ -4,7 +4,7 @@ export { Group } from '../components/internal/Group.js';
|
|
|
4
4
|
export { GroupDescription } from '../components/internal/GroupDescription.js';
|
|
5
5
|
export { List } from '../components/internal/List.js';
|
|
6
6
|
export { Prose } from '../components/internal/Prose.js';
|
|
7
|
-
export { ShortcutTooltip, Tooltip } from '../components/internal/Tooltip.js';
|
|
7
|
+
export { ShortcutTooltip, Tooltip, TooltipProvider } from '../components/internal/Tooltip.js';
|
|
8
8
|
export { User } from '../components/internal/User.js';
|
|
9
9
|
export { useLiveblocksUiConfig } from '../config.js';
|
|
10
10
|
import '../icons/index.js';
|
|
@@ -22,7 +22,6 @@ export { index$1 as AiMessage };
|
|
|
22
22
|
import * as index$2 from '../primitives/Collapsible/index.js';
|
|
23
23
|
export { index$2 as Collapsible };
|
|
24
24
|
export { Markdown } from '../primitives/Markdown.js';
|
|
25
|
-
export { TooltipProvider } from '@radix-ui/react-tooltip';
|
|
26
25
|
export { ArrowCornerDownRightIcon } from '../icons/ArrowCornerDownRight.js';
|
|
27
26
|
export { ArrowCornerUpRightIcon } from '../icons/ArrowCornerUpRight.js';
|
|
28
27
|
export { ArrowDownIcon } from '../icons/ArrowDown.js';
|
|
@@ -59,6 +58,7 @@ export { ListOrderedIcon } from '../icons/ListOrdered.js';
|
|
|
59
58
|
export { ListUnorderedIcon } from '../icons/ListUnordered.js';
|
|
60
59
|
export { MentionIcon } from '../icons/Mention.js';
|
|
61
60
|
export { MinusCircleIcon } from '../icons/MinusCircle.js';
|
|
61
|
+
export { PlusIcon } from '../icons/Plus.js';
|
|
62
62
|
export { QuestionMarkIcon } from '../icons/QuestionMark.js';
|
|
63
63
|
export { RedoIcon } from '../icons/Redo.js';
|
|
64
64
|
export { RestoreIcon } from '../icons/Restore.js';
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
5
|
+
var react$1 = require('@liveblocks/react');
|
|
6
|
+
var react = require('react');
|
|
7
|
+
var constants = require('../constants.cjs');
|
|
8
|
+
var overrides = require('../overrides.cjs');
|
|
9
|
+
var cn = require('../utils/cn.cjs');
|
|
10
|
+
var px = require('../utils/px.cjs');
|
|
11
|
+
var Avatar = require('./internal/Avatar.cjs');
|
|
12
|
+
var Tooltip = require('./internal/Tooltip.cjs');
|
|
13
|
+
var User = require('./internal/User.cjs');
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
const AvatarStack = react.forwardRef(
|
|
17
|
+
({
|
|
18
|
+
userIds: additionalUserIds = [],
|
|
19
|
+
max = 3,
|
|
20
|
+
size,
|
|
21
|
+
overrides: overrides$1,
|
|
22
|
+
className,
|
|
23
|
+
style,
|
|
24
|
+
...props
|
|
25
|
+
}, forwardedRef) => {
|
|
26
|
+
const $ = overrides.useOverrides(overrides$1);
|
|
27
|
+
const otherIds = react$1.useOthers(
|
|
28
|
+
(others) => [...others].sort((a, b) => b.connectionId - a.connectionId).map((user) => user.id).filter((userId) => userId !== void 0)
|
|
29
|
+
);
|
|
30
|
+
const selfId = react$1.useSelf((self) => self.id);
|
|
31
|
+
const userIds = react.useMemo(() => {
|
|
32
|
+
const uniqueUserIds = /* @__PURE__ */ new Set([
|
|
33
|
+
selfId,
|
|
34
|
+
...otherIds,
|
|
35
|
+
...additionalUserIds
|
|
36
|
+
]);
|
|
37
|
+
return [...uniqueUserIds];
|
|
38
|
+
}, [selfId, otherIds, additionalUserIds]);
|
|
39
|
+
const maxItems = Math.max(2, Math.floor(max));
|
|
40
|
+
const shouldShowMore = userIds.length > maxItems;
|
|
41
|
+
const visibleAvatarsCount = shouldShowMore ? maxItems - 1 : maxItems;
|
|
42
|
+
const visibleUserIds = userIds.slice(0, visibleAvatarsCount);
|
|
43
|
+
const hiddenUserIds = userIds.slice(visibleUserIds.length);
|
|
44
|
+
const remainingUsersCount = hiddenUserIds.length;
|
|
45
|
+
const visibleItemsCount = visibleUserIds.length + Number(remainingUsersCount > 0);
|
|
46
|
+
if (userIds.length === 0) {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Tooltip.TooltipProvider, { children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
50
|
+
"div",
|
|
51
|
+
{
|
|
52
|
+
className: cn.cn("lb-root lb-avatar-stack", className),
|
|
53
|
+
dir: $.dir,
|
|
54
|
+
style: {
|
|
55
|
+
"--lb-avatar-stack-count": visibleItemsCount,
|
|
56
|
+
"--lb-avatar-stack-size": px.px(size),
|
|
57
|
+
...style
|
|
58
|
+
},
|
|
59
|
+
...props,
|
|
60
|
+
ref: forwardedRef,
|
|
61
|
+
children: [
|
|
62
|
+
visibleUserIds.map((userId, index) => {
|
|
63
|
+
if (!userId) {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
67
|
+
Tooltip.Tooltip,
|
|
68
|
+
{
|
|
69
|
+
content: /* @__PURE__ */ jsxRuntime.jsx(User.User, { userId }),
|
|
70
|
+
sideOffset: constants.FLOATING_ELEMENT_SIDE_OFFSET,
|
|
71
|
+
collisionPadding: constants.FLOATING_ELEMENT_COLLISION_PADDING,
|
|
72
|
+
side: "top",
|
|
73
|
+
align: "center",
|
|
74
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
75
|
+
Avatar.Avatar,
|
|
76
|
+
{
|
|
77
|
+
userId,
|
|
78
|
+
className: "lb-avatar-stack-avatar",
|
|
79
|
+
style: { "--lb-avatar-stack-index": index }
|
|
80
|
+
}
|
|
81
|
+
)
|
|
82
|
+
},
|
|
83
|
+
userId
|
|
84
|
+
);
|
|
85
|
+
}),
|
|
86
|
+
remainingUsersCount > 0 ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
87
|
+
Tooltip.Tooltip,
|
|
88
|
+
{
|
|
89
|
+
content: /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "lb-users-tooltip-list", children: hiddenUserIds.map(
|
|
90
|
+
(userId) => userId ? /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "lb-users-tooltip-list-item", children: [
|
|
91
|
+
/* @__PURE__ */ jsxRuntime.jsx(Avatar.Avatar, { userId }),
|
|
92
|
+
/* @__PURE__ */ jsxRuntime.jsx(User.User, { userId })
|
|
93
|
+
] }, userId) : null
|
|
94
|
+
) }),
|
|
95
|
+
sideOffset: constants.FLOATING_ELEMENT_SIDE_OFFSET,
|
|
96
|
+
collisionPadding: constants.FLOATING_ELEMENT_COLLISION_PADDING,
|
|
97
|
+
side: "top",
|
|
98
|
+
align: "center",
|
|
99
|
+
className: "lb-users-tooltip",
|
|
100
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
101
|
+
"div",
|
|
102
|
+
{
|
|
103
|
+
className: "lb-avatar lb-avatar-stack-avatar lb-avatar-stack-more",
|
|
104
|
+
style: {
|
|
105
|
+
"--lb-avatar-stack-index": visibleUserIds.length
|
|
106
|
+
},
|
|
107
|
+
children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "lb-avatar-fallback", children: [
|
|
108
|
+
"+",
|
|
109
|
+
remainingUsersCount
|
|
110
|
+
] })
|
|
111
|
+
}
|
|
112
|
+
)
|
|
113
|
+
}
|
|
114
|
+
) : null
|
|
115
|
+
]
|
|
116
|
+
}
|
|
117
|
+
) });
|
|
118
|
+
}
|
|
119
|
+
);
|
|
120
|
+
|
|
121
|
+
exports.AvatarStack = AvatarStack;
|
|
122
|
+
//# sourceMappingURL=AvatarStack.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AvatarStack.cjs","sources":["../../src/components/AvatarStack.tsx"],"sourcesContent":["\"use client\";\n\nimport { useOthers, useSelf } from \"@liveblocks/react\";\nimport type { ComponentPropsWithoutRef, CSSProperties } from \"react\";\nimport { forwardRef, useMemo } from \"react\";\n\nimport {\n FLOATING_ELEMENT_COLLISION_PADDING,\n FLOATING_ELEMENT_SIDE_OFFSET,\n} from \"../constants\";\nimport type { GlobalOverrides } from \"../overrides\";\nimport { useOverrides } from \"../overrides\";\nimport { cn } from \"../utils/cn\";\nimport { px } from \"../utils/px\";\nimport { Avatar } from \"./internal/Avatar\";\nimport { Tooltip, TooltipProvider } from \"./internal/Tooltip\";\nimport { User } from \"./internal/User\";\n\nexport interface AvatarStackProps extends ComponentPropsWithoutRef<\"div\"> {\n /**\n * Optional additional user IDs to include in the stack.\n */\n userIds?: string[];\n\n /**\n * The maximum number of items in the stack (at least 2).\n * Defaults to 3, set to `undefined` to show all avatars.\n */\n max?: number;\n\n /**\n * The size of the avatars.\n */\n size?: string | number;\n\n /**\n * Override the component's strings.\n */\n overrides?: Partial<GlobalOverrides>;\n}\n\n/**\n * Displays a stack of avatars for the users currently present in the room.\n */\nexport const AvatarStack = forwardRef<HTMLDivElement, AvatarStackProps>(\n (\n {\n userIds: additionalUserIds = [],\n max = 3,\n size,\n overrides,\n className,\n style,\n ...props\n },\n forwardedRef\n ) => {\n const $ = useOverrides(overrides);\n const otherIds = useOthers((others) =>\n [...others]\n .sort((a, b) => b.connectionId - a.connectionId)\n .map((user) => user.id)\n .filter((userId): userId is string => userId !== undefined)\n );\n const selfId = useSelf((self) => self.id);\n const userIds = useMemo(() => {\n const uniqueUserIds = new Set([\n selfId,\n ...otherIds,\n ...additionalUserIds,\n ]);\n\n return [...uniqueUserIds];\n }, [selfId, otherIds, additionalUserIds]);\n const maxItems = Math.max(2, Math.floor(max));\n const shouldShowMore = userIds.length > maxItems;\n const visibleAvatarsCount = shouldShowMore ? maxItems - 1 : maxItems;\n const visibleUserIds = userIds.slice(0, visibleAvatarsCount);\n const hiddenUserIds = userIds.slice(visibleUserIds.length);\n const remainingUsersCount = hiddenUserIds.length;\n const visibleItemsCount =\n visibleUserIds.length + Number(remainingUsersCount > 0);\n\n if (userIds.length === 0) {\n return null;\n }\n\n return (\n <TooltipProvider>\n <div\n className={cn(\"lb-root lb-avatar-stack\", className)}\n dir={$.dir}\n style={\n {\n \"--lb-avatar-stack-count\": visibleItemsCount,\n \"--lb-avatar-stack-size\": px(size),\n ...style,\n } as CSSProperties\n }\n {...props}\n ref={forwardedRef}\n >\n {visibleUserIds.map((userId, index) => {\n if (!userId) {\n return null;\n }\n\n return (\n <Tooltip\n key={userId}\n content={<User userId={userId} />}\n sideOffset={FLOATING_ELEMENT_SIDE_OFFSET}\n collisionPadding={FLOATING_ELEMENT_COLLISION_PADDING}\n side=\"top\"\n align=\"center\"\n >\n <Avatar\n userId={userId}\n className=\"lb-avatar-stack-avatar\"\n style={{ \"--lb-avatar-stack-index\": index } as CSSProperties}\n />\n </Tooltip>\n );\n })}\n {remainingUsersCount > 0 ? (\n <Tooltip\n content={\n <ul className=\"lb-users-tooltip-list\">\n {hiddenUserIds.map((userId) =>\n userId ? (\n <li key={userId} className=\"lb-users-tooltip-list-item\">\n <Avatar userId={userId} />\n <User userId={userId} />\n </li>\n ) : null\n )}\n </ul>\n }\n sideOffset={FLOATING_ELEMENT_SIDE_OFFSET}\n collisionPadding={FLOATING_ELEMENT_COLLISION_PADDING}\n side=\"top\"\n align=\"center\"\n className=\"lb-users-tooltip\"\n >\n <div\n className=\"lb-avatar lb-avatar-stack-avatar lb-avatar-stack-more\"\n style={\n {\n \"--lb-avatar-stack-index\": visibleUserIds.length,\n } as CSSProperties\n }\n >\n <span className=\"lb-avatar-fallback\">\n +{remainingUsersCount}\n </span>\n </div>\n </Tooltip>\n ) : null}\n </div>\n </TooltipProvider>\n );\n }\n);\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AA4CO;AAAoB;AAEvB;AACgC;AACxB;AACN;AACA;AACA;AACA;AACG;AAIL;AACA;AAAiB;AAI6C;AAE9D;AACA;AACE;AAA8B;AAC5B;AACG;AACA;AAGL;AAAwB;AAE1B;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACE;AAAO;AAGT;AAEI;AAAC;AAAA;AACmD;AAC3C;AAEL;AAC6B;AACM;AAC9B;AACL;AAEE;AACC;AAEJ;AACC;AACE;AAAO;AAGT;AACE;AAAC;AAAA;AAEgC;AACnB;AACM;AACb;AACC;AAEN;AAAC;AAAA;AACC;AACU;AACgC;AAAA;AAC5C;AAAA;AAXK;AAYP;AAEH;AAEC;AAAC;AAAA;AAGoB;AAGT;AAAwB;AACF;AAEtB;AAER;AAEU;AACM;AACb;AACC;AACI;AAEV;AAAC;AAAA;AACW;AAER;AAC4C;AAC5C;AAGmC;AAAA;AACjC;AACJ;AAAA;AACF;AAAA;AAEA;AAAA;AAAA;AAER;AAGN;;"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
3
|
+
import { useOthers, useSelf } from '@liveblocks/react';
|
|
4
|
+
import { forwardRef, useMemo } from 'react';
|
|
5
|
+
import { FLOATING_ELEMENT_SIDE_OFFSET, FLOATING_ELEMENT_COLLISION_PADDING } from '../constants.js';
|
|
6
|
+
import { useOverrides } from '../overrides.js';
|
|
7
|
+
import { cn } from '../utils/cn.js';
|
|
8
|
+
import { px } from '../utils/px.js';
|
|
9
|
+
import { Avatar } from './internal/Avatar.js';
|
|
10
|
+
import { TooltipProvider, Tooltip } from './internal/Tooltip.js';
|
|
11
|
+
import { User } from './internal/User.js';
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
const AvatarStack = forwardRef(
|
|
15
|
+
({
|
|
16
|
+
userIds: additionalUserIds = [],
|
|
17
|
+
max = 3,
|
|
18
|
+
size,
|
|
19
|
+
overrides,
|
|
20
|
+
className,
|
|
21
|
+
style,
|
|
22
|
+
...props
|
|
23
|
+
}, forwardedRef) => {
|
|
24
|
+
const $ = useOverrides(overrides);
|
|
25
|
+
const otherIds = useOthers(
|
|
26
|
+
(others) => [...others].sort((a, b) => b.connectionId - a.connectionId).map((user) => user.id).filter((userId) => userId !== void 0)
|
|
27
|
+
);
|
|
28
|
+
const selfId = useSelf((self) => self.id);
|
|
29
|
+
const userIds = useMemo(() => {
|
|
30
|
+
const uniqueUserIds = /* @__PURE__ */ new Set([
|
|
31
|
+
selfId,
|
|
32
|
+
...otherIds,
|
|
33
|
+
...additionalUserIds
|
|
34
|
+
]);
|
|
35
|
+
return [...uniqueUserIds];
|
|
36
|
+
}, [selfId, otherIds, additionalUserIds]);
|
|
37
|
+
const maxItems = Math.max(2, Math.floor(max));
|
|
38
|
+
const shouldShowMore = userIds.length > maxItems;
|
|
39
|
+
const visibleAvatarsCount = shouldShowMore ? maxItems - 1 : maxItems;
|
|
40
|
+
const visibleUserIds = userIds.slice(0, visibleAvatarsCount);
|
|
41
|
+
const hiddenUserIds = userIds.slice(visibleUserIds.length);
|
|
42
|
+
const remainingUsersCount = hiddenUserIds.length;
|
|
43
|
+
const visibleItemsCount = visibleUserIds.length + Number(remainingUsersCount > 0);
|
|
44
|
+
if (userIds.length === 0) {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
return /* @__PURE__ */ jsx(TooltipProvider, { children: /* @__PURE__ */ jsxs(
|
|
48
|
+
"div",
|
|
49
|
+
{
|
|
50
|
+
className: cn("lb-root lb-avatar-stack", className),
|
|
51
|
+
dir: $.dir,
|
|
52
|
+
style: {
|
|
53
|
+
"--lb-avatar-stack-count": visibleItemsCount,
|
|
54
|
+
"--lb-avatar-stack-size": px(size),
|
|
55
|
+
...style
|
|
56
|
+
},
|
|
57
|
+
...props,
|
|
58
|
+
ref: forwardedRef,
|
|
59
|
+
children: [
|
|
60
|
+
visibleUserIds.map((userId, index) => {
|
|
61
|
+
if (!userId) {
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
return /* @__PURE__ */ jsx(
|
|
65
|
+
Tooltip,
|
|
66
|
+
{
|
|
67
|
+
content: /* @__PURE__ */ jsx(User, { userId }),
|
|
68
|
+
sideOffset: FLOATING_ELEMENT_SIDE_OFFSET,
|
|
69
|
+
collisionPadding: FLOATING_ELEMENT_COLLISION_PADDING,
|
|
70
|
+
side: "top",
|
|
71
|
+
align: "center",
|
|
72
|
+
children: /* @__PURE__ */ jsx(
|
|
73
|
+
Avatar,
|
|
74
|
+
{
|
|
75
|
+
userId,
|
|
76
|
+
className: "lb-avatar-stack-avatar",
|
|
77
|
+
style: { "--lb-avatar-stack-index": index }
|
|
78
|
+
}
|
|
79
|
+
)
|
|
80
|
+
},
|
|
81
|
+
userId
|
|
82
|
+
);
|
|
83
|
+
}),
|
|
84
|
+
remainingUsersCount > 0 ? /* @__PURE__ */ jsx(
|
|
85
|
+
Tooltip,
|
|
86
|
+
{
|
|
87
|
+
content: /* @__PURE__ */ jsx("ul", { className: "lb-users-tooltip-list", children: hiddenUserIds.map(
|
|
88
|
+
(userId) => userId ? /* @__PURE__ */ jsxs("li", { className: "lb-users-tooltip-list-item", children: [
|
|
89
|
+
/* @__PURE__ */ jsx(Avatar, { userId }),
|
|
90
|
+
/* @__PURE__ */ jsx(User, { userId })
|
|
91
|
+
] }, userId) : null
|
|
92
|
+
) }),
|
|
93
|
+
sideOffset: FLOATING_ELEMENT_SIDE_OFFSET,
|
|
94
|
+
collisionPadding: FLOATING_ELEMENT_COLLISION_PADDING,
|
|
95
|
+
side: "top",
|
|
96
|
+
align: "center",
|
|
97
|
+
className: "lb-users-tooltip",
|
|
98
|
+
children: /* @__PURE__ */ jsx(
|
|
99
|
+
"div",
|
|
100
|
+
{
|
|
101
|
+
className: "lb-avatar lb-avatar-stack-avatar lb-avatar-stack-more",
|
|
102
|
+
style: {
|
|
103
|
+
"--lb-avatar-stack-index": visibleUserIds.length
|
|
104
|
+
},
|
|
105
|
+
children: /* @__PURE__ */ jsxs("span", { className: "lb-avatar-fallback", children: [
|
|
106
|
+
"+",
|
|
107
|
+
remainingUsersCount
|
|
108
|
+
] })
|
|
109
|
+
}
|
|
110
|
+
)
|
|
111
|
+
}
|
|
112
|
+
) : null
|
|
113
|
+
]
|
|
114
|
+
}
|
|
115
|
+
) });
|
|
116
|
+
}
|
|
117
|
+
);
|
|
118
|
+
|
|
119
|
+
export { AvatarStack };
|
|
120
|
+
//# sourceMappingURL=AvatarStack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AvatarStack.js","sources":["../../src/components/AvatarStack.tsx"],"sourcesContent":["\"use client\";\n\nimport { useOthers, useSelf } from \"@liveblocks/react\";\nimport type { ComponentPropsWithoutRef, CSSProperties } from \"react\";\nimport { forwardRef, useMemo } from \"react\";\n\nimport {\n FLOATING_ELEMENT_COLLISION_PADDING,\n FLOATING_ELEMENT_SIDE_OFFSET,\n} from \"../constants\";\nimport type { GlobalOverrides } from \"../overrides\";\nimport { useOverrides } from \"../overrides\";\nimport { cn } from \"../utils/cn\";\nimport { px } from \"../utils/px\";\nimport { Avatar } from \"./internal/Avatar\";\nimport { Tooltip, TooltipProvider } from \"./internal/Tooltip\";\nimport { User } from \"./internal/User\";\n\nexport interface AvatarStackProps extends ComponentPropsWithoutRef<\"div\"> {\n /**\n * Optional additional user IDs to include in the stack.\n */\n userIds?: string[];\n\n /**\n * The maximum number of items in the stack (at least 2).\n * Defaults to 3, set to `undefined` to show all avatars.\n */\n max?: number;\n\n /**\n * The size of the avatars.\n */\n size?: string | number;\n\n /**\n * Override the component's strings.\n */\n overrides?: Partial<GlobalOverrides>;\n}\n\n/**\n * Displays a stack of avatars for the users currently present in the room.\n */\nexport const AvatarStack = forwardRef<HTMLDivElement, AvatarStackProps>(\n (\n {\n userIds: additionalUserIds = [],\n max = 3,\n size,\n overrides,\n className,\n style,\n ...props\n },\n forwardedRef\n ) => {\n const $ = useOverrides(overrides);\n const otherIds = useOthers((others) =>\n [...others]\n .sort((a, b) => b.connectionId - a.connectionId)\n .map((user) => user.id)\n .filter((userId): userId is string => userId !== undefined)\n );\n const selfId = useSelf((self) => self.id);\n const userIds = useMemo(() => {\n const uniqueUserIds = new Set([\n selfId,\n ...otherIds,\n ...additionalUserIds,\n ]);\n\n return [...uniqueUserIds];\n }, [selfId, otherIds, additionalUserIds]);\n const maxItems = Math.max(2, Math.floor(max));\n const shouldShowMore = userIds.length > maxItems;\n const visibleAvatarsCount = shouldShowMore ? maxItems - 1 : maxItems;\n const visibleUserIds = userIds.slice(0, visibleAvatarsCount);\n const hiddenUserIds = userIds.slice(visibleUserIds.length);\n const remainingUsersCount = hiddenUserIds.length;\n const visibleItemsCount =\n visibleUserIds.length + Number(remainingUsersCount > 0);\n\n if (userIds.length === 0) {\n return null;\n }\n\n return (\n <TooltipProvider>\n <div\n className={cn(\"lb-root lb-avatar-stack\", className)}\n dir={$.dir}\n style={\n {\n \"--lb-avatar-stack-count\": visibleItemsCount,\n \"--lb-avatar-stack-size\": px(size),\n ...style,\n } as CSSProperties\n }\n {...props}\n ref={forwardedRef}\n >\n {visibleUserIds.map((userId, index) => {\n if (!userId) {\n return null;\n }\n\n return (\n <Tooltip\n key={userId}\n content={<User userId={userId} />}\n sideOffset={FLOATING_ELEMENT_SIDE_OFFSET}\n collisionPadding={FLOATING_ELEMENT_COLLISION_PADDING}\n side=\"top\"\n align=\"center\"\n >\n <Avatar\n userId={userId}\n className=\"lb-avatar-stack-avatar\"\n style={{ \"--lb-avatar-stack-index\": index } as CSSProperties}\n />\n </Tooltip>\n );\n })}\n {remainingUsersCount > 0 ? (\n <Tooltip\n content={\n <ul className=\"lb-users-tooltip-list\">\n {hiddenUserIds.map((userId) =>\n userId ? (\n <li key={userId} className=\"lb-users-tooltip-list-item\">\n <Avatar userId={userId} />\n <User userId={userId} />\n </li>\n ) : null\n )}\n </ul>\n }\n sideOffset={FLOATING_ELEMENT_SIDE_OFFSET}\n collisionPadding={FLOATING_ELEMENT_COLLISION_PADDING}\n side=\"top\"\n align=\"center\"\n className=\"lb-users-tooltip\"\n >\n <div\n className=\"lb-avatar lb-avatar-stack-avatar lb-avatar-stack-more\"\n style={\n {\n \"--lb-avatar-stack-index\": visibleUserIds.length,\n } as CSSProperties\n }\n >\n <span className=\"lb-avatar-fallback\">\n +{remainingUsersCount}\n </span>\n </div>\n </Tooltip>\n ) : null}\n </div>\n </TooltipProvider>\n );\n }\n);\n"],"names":[],"mappings":";;;;;;;;;;;;;AA4CO;AAAoB;AAEvB;AACgC;AACxB;AACN;AACA;AACA;AACA;AACG;AAIL;AACA;AAAiB;AAI6C;AAE9D;AACA;AACE;AAA8B;AAC5B;AACG;AACA;AAGL;AAAwB;AAE1B;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACE;AAAO;AAGT;AAEI;AAAC;AAAA;AACmD;AAC3C;AAEL;AAC6B;AACM;AAC9B;AACL;AAEE;AACC;AAEJ;AACC;AACE;AAAO;AAGT;AACE;AAAC;AAAA;AAEgC;AACnB;AACM;AACb;AACC;AAEN;AAAC;AAAA;AACC;AACU;AACgC;AAAA;AAC5C;AAAA;AAXK;AAYP;AAEH;AAEC;AAAC;AAAA;AAGoB;AAGT;AAAwB;AACF;AAEtB;AAER;AAEU;AACM;AACb;AACC;AACI;AAEV;AAAC;AAAA;AACW;AAER;AAC4C;AAC5C;AAGmC;AAAA;AACjC;AACJ;AAAA;AACF;AAAA;AAEA;AAAA;AAAA;AAER;AAGN;;"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
var jsxRuntime = require('react/jsx-runtime');
|
|
5
5
|
var core = require('@liveblocks/core');
|
|
6
6
|
var _private = require('@liveblocks/react/_private');
|
|
7
|
-
var
|
|
7
|
+
var radixUi = require('radix-ui');
|
|
8
8
|
var react = require('react');
|
|
9
9
|
var components = require('../components.cjs');
|
|
10
10
|
var Check = require('../icons/Check.cjs');
|
|
@@ -33,28 +33,6 @@ var Group = require('./internal/Group.cjs');
|
|
|
33
33
|
var List = require('./internal/List.cjs');
|
|
34
34
|
var Tooltip = require('./internal/Tooltip.cjs');
|
|
35
35
|
var User = require('./internal/User.cjs');
|
|
36
|
-
var PopoverPrimitive = require('@radix-ui/react-popover');
|
|
37
|
-
var TooltipPrimitive = require('@radix-ui/react-tooltip');
|
|
38
|
-
var DropdownMenuPrimitive = require('@radix-ui/react-dropdown-menu');
|
|
39
|
-
|
|
40
|
-
function _interopNamespaceDefault(e) {
|
|
41
|
-
var n = Object.create(null);
|
|
42
|
-
if (e) {
|
|
43
|
-
Object.keys(e).forEach(function (k) {
|
|
44
|
-
if (k !== 'default') {
|
|
45
|
-
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
46
|
-
Object.defineProperty(n, k, d.get ? d : {
|
|
47
|
-
enumerable: true,
|
|
48
|
-
get: function () { return e[k]; }
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
n.default = e;
|
|
54
|
-
return Object.freeze(n);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
var TogglePrimitive__namespace = /*#__PURE__*/_interopNamespaceDefault(TogglePrimitive);
|
|
58
36
|
|
|
59
37
|
|
|
60
38
|
const REACTIONS_TRUNCATE = 5;
|
|
@@ -221,7 +199,7 @@ const CommentReaction = react.forwardRef(({ comment, reaction, overrides: overri
|
|
|
221
199
|
multiline: true,
|
|
222
200
|
className: "lb-comment-reaction-tooltip",
|
|
223
201
|
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
224
|
-
|
|
202
|
+
radixUi.Toggle.Root,
|
|
225
203
|
{
|
|
226
204
|
asChild: true,
|
|
227
205
|
pressed: isActive,
|
|
@@ -401,6 +379,7 @@ const Comment = Object.assign(
|
|
|
401
379
|
children,
|
|
402
380
|
...props
|
|
403
381
|
}, forwardedRef) => {
|
|
382
|
+
const bodyId = `${comment.id}:body`;
|
|
404
383
|
const ref = react.useRef(null);
|
|
405
384
|
const mergedRefs = useRefs.useRefs(forwardedRef, ref);
|
|
406
385
|
const currentUserId = shared.useCurrentUserId();
|
|
@@ -576,6 +555,7 @@ const Comment = Object.assign(
|
|
|
576
555
|
index.Body,
|
|
577
556
|
{
|
|
578
557
|
className: "lb-comment-body",
|
|
558
|
+
id: bodyId,
|
|
579
559
|
body: comment.body,
|
|
580
560
|
components: {
|
|
581
561
|
Mention: ({ mention }) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -624,7 +604,7 @@ const Comment = Object.assign(
|
|
|
624
604
|
},
|
|
625
605
|
reaction.emoji
|
|
626
606
|
)),
|
|
627
|
-
canComment ? /* @__PURE__ */ jsxRuntime.jsx(EmojiPicker.EmojiPicker, { onEmojiSelect: handleReactionSelect, children: /* @__PURE__ */ jsxRuntime.jsx(Tooltip.Tooltip, { content: $.COMMENT_ADD_REACTION, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
607
|
+
canComment ? /* @__PURE__ */ jsxRuntime.jsx(EmojiPicker.EmojiPicker, { onEmojiSelect: handleReactionSelect, children: /* @__PURE__ */ jsxRuntime.jsx(Tooltip.Tooltip, { content: $.COMMENT_ADD_REACTION, children: /* @__PURE__ */ jsxRuntime.jsx(EmojiPicker.EmojiPickerTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
628
608
|
Button.Button,
|
|
629
609
|
{
|
|
630
610
|
className: "lb-comment-reaction lb-comment-reaction-add",
|
|
@@ -638,9 +618,10 @@ const Comment = Object.assign(
|
|
|
638
618
|
] }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "lb-comment-body", children: /* @__PURE__ */ jsxRuntime.jsx("p", { className: "lb-comment-deleted", children: $.COMMENT_DELETED }) });
|
|
639
619
|
content = typeof children === "function" ? children({ comment, children: content }) : children ?? content;
|
|
640
620
|
}
|
|
641
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
621
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Tooltip.TooltipProvider, { children: /* @__PURE__ */ jsxRuntime.jsx(components.ComponentsProvider, { components: components$1, children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
642
622
|
"div",
|
|
643
623
|
{
|
|
624
|
+
role: "article",
|
|
644
625
|
id: comment.id,
|
|
645
626
|
className: cn.cn(
|
|
646
627
|
"lb-root lb-comment",
|
|
@@ -652,6 +633,7 @@ const Comment = Object.assign(
|
|
|
652
633
|
"data-deleted": !comment.body ? "" : void 0,
|
|
653
634
|
"data-editing": isEditing ? "" : void 0,
|
|
654
635
|
"data-target": isTarget ? "" : void 0,
|
|
636
|
+
"aria-labelledby": bodyId,
|
|
655
637
|
dir: $.dir,
|
|
656
638
|
...props,
|
|
657
639
|
ref: mergedRefs,
|
|
@@ -712,7 +694,7 @@ const Comment = Object.assign(
|
|
|
712
694
|
{
|
|
713
695
|
onEmojiSelect: handleReactionSelect,
|
|
714
696
|
onOpenChange: setReactionActionOpen,
|
|
715
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(Tooltip.Tooltip, { content: $.COMMENT_ADD_REACTION, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
697
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(Tooltip.Tooltip, { content: $.COMMENT_ADD_REACTION, children: /* @__PURE__ */ jsxRuntime.jsx(EmojiPicker.EmojiPickerTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
716
698
|
Button.Button,
|
|
717
699
|
{
|
|
718
700
|
className: "lb-comment-action",
|
|
@@ -730,7 +712,7 @@ const Comment = Object.assign(
|
|
|
730
712
|
onOpenChange: setMoreActionOpen,
|
|
731
713
|
align: "end",
|
|
732
714
|
content: dropdownContent,
|
|
733
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(Tooltip.Tooltip, { content: $.COMMENT_MORE, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
715
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(Tooltip.Tooltip, { content: $.COMMENT_MORE, children: /* @__PURE__ */ jsxRuntime.jsx(Dropdown.DropdownTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
734
716
|
Button.Button,
|
|
735
717
|
{
|
|
736
718
|
className: "lb-comment-action",
|