@liveblocks/react-ui 2.18.3 → 2.18.4-uns2
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/dist/_private/index.cjs +118 -0
- package/dist/_private/index.cjs.map +1 -0
- package/dist/_private/index.js +54 -117
- package/dist/_private/index.js.map +1 -1
- package/dist/components/{Comment.mjs → Comment.cjs} +196 -169
- package/dist/components/{Comment.mjs.map → Comment.cjs.map} +1 -1
- package/dist/components/Comment.js +168 -195
- package/dist/components/Comment.js.map +1 -1
- package/dist/components/{Composer.mjs → Composer.cjs} +151 -148
- package/dist/components/{Composer.mjs.map → Composer.cjs.map} +1 -1
- package/dist/components/Composer.js +147 -150
- package/dist/components/Composer.js.map +1 -1
- package/dist/components/HistoryVersionSummary.cjs +45 -0
- package/dist/components/{HistoryVersionSummary.mjs.map → HistoryVersionSummary.cjs.map} +1 -1
- package/dist/components/HistoryVersionSummary.js +17 -19
- package/dist/components/HistoryVersionSummary.js.map +1 -1
- package/dist/components/HistoryVersionSummaryList.cjs +25 -0
- package/dist/components/{HistoryVersionSummaryList.mjs.map → HistoryVersionSummaryList.cjs.map} +1 -1
- package/dist/components/HistoryVersionSummaryList.js +8 -10
- package/dist/components/HistoryVersionSummaryList.js.map +1 -1
- package/dist/components/{InboxNotification.mjs → InboxNotification.cjs} +124 -122
- package/dist/components/{InboxNotification.mjs.map → InboxNotification.cjs.map} +1 -1
- package/dist/components/InboxNotification.js +121 -123
- package/dist/components/InboxNotification.js.map +1 -1
- package/dist/components/InboxNotificationList.cjs +42 -0
- package/dist/components/{InboxNotificationList.mjs.map → InboxNotificationList.cjs.map} +1 -1
- package/dist/components/InboxNotificationList.js +14 -16
- package/dist/components/InboxNotificationList.js.map +1 -1
- package/dist/components/{Thread.mjs → Thread.cjs} +70 -49
- package/dist/components/{Thread.mjs.map → Thread.cjs.map} +1 -1
- package/dist/components/Thread.js +48 -69
- package/dist/components/Thread.js.map +1 -1
- package/dist/components/internal/{Attachment.mjs → Attachment.cjs} +82 -78
- package/dist/components/internal/{Attachment.mjs.map → Attachment.cjs.map} +1 -1
- package/dist/components/internal/Attachment.js +77 -81
- package/dist/components/internal/Attachment.js.map +1 -1
- package/dist/components/internal/{Attribution.mjs → Attribution.cjs} +10 -8
- package/dist/components/internal/{Attribution.mjs.map → Attribution.cjs.map} +1 -1
- package/dist/components/internal/Attribution.js +7 -9
- package/dist/components/internal/Attribution.js.map +1 -1
- package/dist/components/internal/Avatar.cjs +48 -0
- package/dist/components/internal/{Avatar.mjs.map → Avatar.cjs.map} +1 -1
- package/dist/components/internal/Avatar.js +18 -20
- package/dist/components/internal/Avatar.js.map +1 -1
- package/dist/components/internal/Button.cjs +80 -0
- package/dist/components/internal/{Button.mjs.map → Button.cjs.map} +1 -1
- package/dist/components/internal/Button.js +19 -23
- package/dist/components/internal/Button.js.map +1 -1
- package/dist/components/internal/Dropdown.cjs +92 -0
- package/dist/components/internal/{Dropdown.mjs.map → Dropdown.cjs.map} +1 -1
- package/dist/components/internal/Dropdown.js +22 -47
- package/dist/components/internal/Dropdown.js.map +1 -1
- package/dist/components/internal/Emoji.cjs +19 -0
- package/dist/components/internal/{Emoji.mjs.map → Emoji.cjs.map} +1 -1
- package/dist/components/internal/Emoji.js +8 -10
- package/dist/components/internal/Emoji.js.map +1 -1
- package/dist/components/internal/EmojiPicker.cjs +208 -0
- package/dist/components/internal/{EmojiPicker.mjs.map → EmojiPicker.cjs.map} +1 -1
- package/dist/components/internal/EmojiPicker.js +52 -76
- package/dist/components/internal/EmojiPicker.js.map +1 -1
- package/dist/components/internal/{Icon.mjs → Icon.cjs} +10 -6
- package/dist/components/internal/{Icon.mjs.map → Icon.cjs.map} +1 -1
- package/dist/components/internal/Icon.js +5 -9
- package/dist/components/internal/Icon.js.map +1 -1
- package/dist/components/internal/{InboxNotificationThread.mjs → InboxNotificationThread.cjs} +34 -30
- package/dist/components/internal/{InboxNotificationThread.mjs.map → InboxNotificationThread.cjs.map} +1 -1
- package/dist/components/internal/InboxNotificationThread.js +29 -33
- package/dist/components/internal/InboxNotificationThread.js.map +1 -1
- package/dist/components/internal/List.cjs +36 -0
- package/dist/components/internal/{List.mjs.map → List.cjs.map} +1 -1
- package/dist/components/internal/List.js +14 -16
- package/dist/components/internal/List.js.map +1 -1
- package/dist/components/internal/Room.cjs +24 -0
- package/dist/components/internal/{Room.mjs.map → Room.cjs.map} +1 -1
- package/dist/components/internal/Room.js +9 -11
- package/dist/components/internal/Room.js.map +1 -1
- package/dist/components/internal/Tooltip.cjs +134 -0
- package/dist/components/internal/{Tooltip.mjs.map → Tooltip.cjs.map} +1 -1
- package/dist/components/internal/Tooltip.js +29 -54
- package/dist/components/internal/Tooltip.js.map +1 -1
- package/dist/components/internal/User.cjs +28 -0
- package/dist/components/internal/{User.mjs.map → User.cjs.map} +1 -1
- package/dist/components/internal/User.js +13 -15
- package/dist/components/internal/User.js.map +1 -1
- package/dist/components.cjs +48 -0
- package/dist/{components.mjs.map → components.cjs.map} +1 -1
- package/dist/components.js +9 -14
- package/dist/components.js.map +1 -1
- package/dist/config.cjs +39 -0
- package/dist/{config.mjs.map → config.cjs.map} +1 -1
- package/dist/config.js +15 -18
- package/dist/config.js.map +1 -1
- package/dist/{constants.mjs → constants.cjs} +6 -2
- package/dist/{constants.mjs.map → constants.cjs.map} +1 -1
- package/dist/constants.js +1 -5
- package/dist/constants.js.map +1 -1
- package/dist/icon.cjs +69 -0
- package/dist/icon.cjs.map +1 -0
- package/dist/icon.js +32 -68
- package/dist/icon.js.map +1 -1
- package/dist/icons/ArrowCornerDownRight.cjs +16 -0
- package/dist/icons/{ArrowCornerDownRight.mjs.map → ArrowCornerDownRight.cjs.map} +1 -1
- package/dist/icons/ArrowCornerDownRight.js +5 -7
- package/dist/icons/ArrowCornerDownRight.js.map +1 -1
- package/dist/icons/ArrowCornerUpRight.cjs +16 -0
- package/dist/icons/ArrowCornerUpRight.cjs.map +1 -0
- package/dist/icons/ArrowCornerUpRight.js +5 -7
- package/dist/icons/ArrowCornerUpRight.js.map +1 -1
- package/dist/icons/ArrowDown.cjs +16 -0
- package/dist/icons/ArrowDown.cjs.map +1 -0
- package/dist/icons/ArrowDown.js +5 -7
- package/dist/icons/ArrowDown.js.map +1 -1
- package/dist/icons/ArrowUp.cjs +16 -0
- package/dist/icons/ArrowUp.cjs.map +1 -0
- package/dist/icons/ArrowUp.js +5 -7
- package/dist/icons/ArrowUp.js.map +1 -1
- package/dist/icons/{Attachment.mjs → Attachment.cjs} +8 -6
- package/dist/icons/{Attachment.mjs.map → Attachment.cjs.map} +1 -1
- package/dist/icons/Attachment.js +5 -7
- package/dist/icons/Attachment.js.map +1 -1
- package/dist/icons/Blockquote.cjs +16 -0
- package/dist/icons/Blockquote.cjs.map +1 -0
- package/dist/icons/Blockquote.js +5 -7
- package/dist/icons/Blockquote.js.map +1 -1
- package/dist/icons/Bold.cjs +16 -0
- package/dist/icons/{Bold.mjs.map → Bold.cjs.map} +1 -1
- package/dist/icons/Bold.js +5 -7
- package/dist/icons/Bold.js.map +1 -1
- package/dist/icons/Check.cjs +16 -0
- package/dist/icons/Check.cjs.map +1 -0
- package/dist/icons/Check.js +5 -7
- package/dist/icons/Check.js.map +1 -1
- package/dist/icons/ChevronDown.cjs +16 -0
- package/dist/icons/{ChevronDown.mjs.map → ChevronDown.cjs.map} +1 -1
- package/dist/icons/ChevronDown.js +5 -7
- package/dist/icons/ChevronDown.js.map +1 -1
- package/dist/icons/ChevronLeft.cjs +16 -0
- package/dist/icons/{ChevronLeft.mjs.map → ChevronLeft.cjs.map} +1 -1
- package/dist/icons/ChevronLeft.js +5 -7
- package/dist/icons/ChevronLeft.js.map +1 -1
- package/dist/icons/ChevronRight.cjs +16 -0
- package/dist/icons/{ChevronRight.mjs.map → ChevronRight.cjs.map} +1 -1
- package/dist/icons/ChevronRight.js +5 -7
- package/dist/icons/ChevronRight.js.map +1 -1
- package/dist/icons/ChevronUp.cjs +16 -0
- package/dist/icons/{ChevronUp.mjs.map → ChevronUp.cjs.map} +1 -1
- package/dist/icons/ChevronUp.js +5 -7
- package/dist/icons/ChevronUp.js.map +1 -1
- package/dist/icons/Code.cjs +16 -0
- package/dist/icons/Code.cjs.map +1 -0
- package/dist/icons/Code.js +5 -7
- package/dist/icons/Code.js.map +1 -1
- package/dist/icons/Comment.cjs +16 -0
- package/dist/icons/{Comment.mjs.map → Comment.cjs.map} +1 -1
- package/dist/icons/Comment.js +5 -7
- package/dist/icons/Comment.js.map +1 -1
- package/dist/icons/Cross.cjs +21 -0
- package/dist/icons/Cross.cjs.map +1 -0
- package/dist/icons/Cross.js +6 -8
- package/dist/icons/Cross.js.map +1 -1
- package/dist/icons/Delete.cjs +16 -0
- package/dist/icons/{Delete.mjs.map → Delete.cjs.map} +1 -1
- package/dist/icons/Delete.js +5 -7
- package/dist/icons/Delete.js.map +1 -1
- package/dist/icons/Edit.cjs +16 -0
- package/dist/icons/{Edit.mjs.map → Edit.cjs.map} +1 -1
- package/dist/icons/Edit.js +5 -7
- package/dist/icons/Edit.js.map +1 -1
- package/dist/icons/Ellipsis.cjs +31 -0
- package/dist/icons/Ellipsis.cjs.map +1 -0
- package/dist/icons/Ellipsis.js +7 -9
- package/dist/icons/Ellipsis.js.map +1 -1
- package/dist/icons/Emoji.cjs +34 -0
- package/dist/icons/Emoji.cjs.map +1 -0
- package/dist/icons/Emoji.js +9 -11
- package/dist/icons/Emoji.js.map +1 -1
- package/dist/icons/EmojiAdd.cjs +37 -0
- package/dist/icons/EmojiAdd.cjs.map +1 -0
- package/dist/icons/EmojiAdd.js +10 -12
- package/dist/icons/EmojiAdd.js.map +1 -1
- package/dist/icons/H1.cjs +16 -0
- package/dist/icons/{H1.mjs.map → H1.cjs.map} +1 -1
- package/dist/icons/H1.js +5 -7
- package/dist/icons/H1.js.map +1 -1
- package/dist/icons/H2.cjs +16 -0
- package/dist/icons/H2.cjs.map +1 -0
- package/dist/icons/H2.js +5 -7
- package/dist/icons/H2.js.map +1 -1
- package/dist/icons/H3.cjs +16 -0
- package/dist/icons/{H3.mjs.map → H3.cjs.map} +1 -1
- package/dist/icons/H3.js +5 -7
- package/dist/icons/H3.js.map +1 -1
- package/dist/icons/Italic.cjs +16 -0
- package/dist/icons/{Italic.mjs.map → Italic.cjs.map} +1 -1
- package/dist/icons/Italic.js +5 -7
- package/dist/icons/Italic.js.map +1 -1
- package/dist/icons/Lengthen.cjs +16 -0
- package/dist/icons/Lengthen.cjs.map +1 -0
- package/dist/icons/Lengthen.js +5 -7
- package/dist/icons/Lengthen.js.map +1 -1
- package/dist/icons/ListOrdered.cjs +16 -0
- package/dist/icons/{ListOrdered.mjs.map → ListOrdered.cjs.map} +1 -1
- package/dist/icons/ListOrdered.js +5 -7
- package/dist/icons/ListOrdered.js.map +1 -1
- package/dist/icons/ListUnordered.cjs +39 -0
- package/dist/icons/ListUnordered.cjs.map +1 -0
- package/dist/icons/ListUnordered.js +10 -12
- package/dist/icons/ListUnordered.js.map +1 -1
- package/dist/icons/Mention.cjs +21 -0
- package/dist/icons/Mention.cjs.map +1 -0
- package/dist/icons/Mention.js +6 -8
- package/dist/icons/Mention.js.map +1 -1
- package/dist/icons/QuestionMark.cjs +26 -0
- package/dist/icons/QuestionMark.cjs.map +1 -0
- package/dist/icons/QuestionMark.js +7 -9
- package/dist/icons/QuestionMark.js.map +1 -1
- package/dist/icons/Redo.cjs +21 -0
- package/dist/icons/Redo.cjs.map +1 -0
- package/dist/icons/Redo.js +6 -8
- package/dist/icons/Redo.js.map +1 -1
- package/dist/icons/Resolve.cjs +23 -0
- package/dist/icons/Resolve.cjs.map +1 -0
- package/dist/icons/Resolve.js +6 -8
- package/dist/icons/Resolve.js.map +1 -1
- package/dist/icons/Resolved.cjs +25 -0
- package/dist/icons/Resolved.cjs.map +1 -0
- package/dist/icons/Resolved.js +6 -8
- package/dist/icons/Resolved.js.map +1 -1
- package/dist/icons/Restore.cjs +21 -0
- package/dist/icons/Restore.cjs.map +1 -0
- package/dist/icons/Restore.js +6 -8
- package/dist/icons/Restore.js.map +1 -1
- package/dist/icons/Search.cjs +16 -0
- package/dist/icons/{Search.mjs.map → Search.cjs.map} +1 -1
- package/dist/icons/Search.js +5 -7
- package/dist/icons/Search.js.map +1 -1
- package/dist/icons/Send.cjs +16 -0
- package/dist/icons/Send.cjs.map +1 -0
- package/dist/icons/Send.js +5 -7
- package/dist/icons/Send.js.map +1 -1
- package/dist/icons/Shorten.cjs +16 -0
- package/dist/icons/{Shorten.mjs.map → Shorten.cjs.map} +1 -1
- package/dist/icons/Shorten.js +5 -7
- package/dist/icons/Shorten.js.map +1 -1
- package/dist/icons/{Sparkles.mjs → Sparkles.cjs} +8 -6
- package/dist/icons/{Sparkles.mjs.map → Sparkles.cjs.map} +1 -1
- package/dist/icons/Sparkles.js +5 -7
- package/dist/icons/Sparkles.js.map +1 -1
- package/dist/icons/SparklesText.cjs +21 -0
- package/dist/icons/{SparklesText.mjs.map → SparklesText.cjs.map} +1 -1
- package/dist/icons/SparklesText.js +6 -8
- package/dist/icons/SparklesText.js.map +1 -1
- package/dist/icons/Spinner.cjs +17 -0
- package/dist/icons/Spinner.cjs.map +1 -0
- package/dist/icons/Spinner.js +5 -7
- package/dist/icons/Spinner.js.map +1 -1
- package/dist/icons/Strikethrough.cjs +16 -0
- package/dist/icons/{Strikethrough.mjs.map → Strikethrough.cjs.map} +1 -1
- package/dist/icons/Strikethrough.js +5 -7
- package/dist/icons/Strikethrough.js.map +1 -1
- package/dist/icons/Text.cjs +16 -0
- package/dist/icons/{Text.mjs.map → Text.cjs.map} +1 -1
- package/dist/icons/Text.js +5 -7
- package/dist/icons/Text.js.map +1 -1
- package/dist/icons/Translate.cjs +21 -0
- package/dist/icons/{Translate.mjs.map → Translate.cjs.map} +1 -1
- package/dist/icons/Translate.js +6 -8
- package/dist/icons/Translate.js.map +1 -1
- package/dist/icons/Underline.cjs +16 -0
- package/dist/icons/Underline.cjs.map +1 -0
- package/dist/icons/Underline.js +5 -7
- package/dist/icons/Underline.js.map +1 -1
- package/dist/icons/Undo.cjs +21 -0
- package/dist/icons/Undo.cjs.map +1 -0
- package/dist/icons/Undo.js +6 -8
- package/dist/icons/Undo.js.map +1 -1
- package/dist/icons/Warning.cjs +23 -0
- package/dist/icons/Warning.cjs.map +1 -0
- package/dist/icons/Warning.js +6 -8
- package/dist/icons/Warning.js.map +1 -1
- package/dist/icons/index.cjs +96 -0
- package/dist/icons/index.cjs.map +1 -0
- package/dist/icons/index.js +45 -95
- package/dist/icons/index.js.map +1 -1
- package/dist/index.cjs +28 -0
- package/dist/{index.mjs.map → index.cjs.map} +1 -1
- package/dist/index.js +14 -26
- package/dist/index.js.map +1 -1
- package/dist/{overrides.mjs → overrides.cjs} +32 -27
- package/dist/{overrides.mjs.map → overrides.cjs.map} +1 -1
- package/dist/overrides.js +26 -31
- package/dist/overrides.js.map +1 -1
- package/dist/primitives/Comment/{index.mjs → index.cjs} +35 -31
- package/dist/primitives/Comment/{index.mjs.map → index.cjs.map} +1 -1
- package/dist/primitives/Comment/index.js +30 -34
- package/dist/primitives/Comment/index.js.map +1 -1
- package/dist/primitives/Comment/{utils.mjs → utils.cjs} +7 -2
- package/dist/primitives/Comment/{utils.mjs.map → utils.cjs.map} +1 -1
- package/dist/primitives/Comment/utils.js +1 -6
- package/dist/primitives/Comment/utils.js.map +1 -1
- package/dist/primitives/Composer/contexts.cjs +60 -0
- package/dist/primitives/Composer/{contexts.mjs.map → contexts.cjs.map} +1 -1
- package/dist/primitives/Composer/contexts.js +18 -30
- package/dist/primitives/Composer/contexts.js.map +1 -1
- package/dist/primitives/Composer/{index.mjs → index.cjs} +305 -273
- package/dist/primitives/Composer/{index.mjs.map → index.cjs.map} +1 -1
- package/dist/primitives/Composer/index.js +272 -304
- package/dist/primitives/Composer/index.js.map +1 -1
- package/dist/primitives/Composer/{utils.mjs → utils.cjs} +79 -64
- package/dist/primitives/Composer/{utils.mjs.map → utils.cjs.map} +1 -1
- package/dist/primitives/Composer/utils.js +63 -78
- package/dist/primitives/Composer/utils.js.map +1 -1
- package/dist/primitives/EmojiPicker/contexts.cjs +19 -0
- package/dist/primitives/EmojiPicker/{contexts.mjs.map → contexts.cjs.map} +1 -1
- package/dist/primitives/EmojiPicker/contexts.js +6 -9
- package/dist/primitives/EmojiPicker/contexts.js.map +1 -1
- package/dist/primitives/EmojiPicker/{index.mjs → index.cjs} +96 -92
- package/dist/primitives/EmojiPicker/{index.mjs.map → index.cjs.map} +1 -1
- package/dist/primitives/EmojiPicker/index.js +91 -95
- package/dist/primitives/EmojiPicker/index.js.map +1 -1
- package/dist/primitives/EmojiPicker/{utils.mjs → utils.cjs} +14 -10
- package/dist/primitives/EmojiPicker/{utils.mjs.map → utils.cjs.map} +1 -1
- package/dist/primitives/EmojiPicker/utils.js +9 -13
- package/dist/primitives/EmojiPicker/utils.js.map +1 -1
- package/dist/primitives/FileSize.cjs +36 -0
- package/dist/primitives/{FileSize.mjs.map → FileSize.cjs.map} +1 -1
- package/dist/primitives/FileSize.js +10 -12
- package/dist/primitives/FileSize.js.map +1 -1
- package/dist/primitives/{Timestamp.mjs → Timestamp.cjs} +27 -25
- package/dist/primitives/{Timestamp.mjs.map → Timestamp.cjs.map} +1 -1
- package/dist/primitives/Timestamp.js +24 -26
- package/dist/primitives/Timestamp.js.map +1 -1
- package/dist/primitives/index.cjs +20 -0
- package/dist/primitives/index.cjs.map +1 -0
- package/dist/primitives/index.js +10 -19
- package/dist/primitives/index.js.map +1 -1
- package/dist/primitives/internal/Emoji.cjs +32 -0
- package/dist/primitives/internal/{Emoji.mjs.map → Emoji.cjs.map} +1 -1
- package/dist/primitives/internal/Emoji.js +9 -11
- package/dist/primitives/internal/Emoji.js.map +1 -1
- package/dist/shared.cjs +13 -0
- package/dist/{shared.mjs.map → shared.cjs.map} +1 -1
- package/dist/shared.js +6 -8
- package/dist/shared.js.map +1 -1
- package/dist/slate/plugins/{auto-formatting.mjs → auto-formatting.cjs} +18 -16
- package/dist/slate/plugins/{auto-formatting.mjs.map → auto-formatting.cjs.map} +1 -1
- package/dist/slate/plugins/auto-formatting.js +15 -17
- package/dist/slate/plugins/auto-formatting.js.map +1 -1
- package/dist/slate/plugins/{auto-links.mjs → auto-links.cjs} +43 -40
- package/dist/slate/plugins/{auto-links.mjs.map → auto-links.cjs.map} +1 -1
- package/dist/slate/plugins/auto-links.js +39 -42
- package/dist/slate/plugins/auto-links.js.map +1 -1
- package/dist/slate/plugins/{custom-links.mjs → custom-links.cjs} +19 -16
- package/dist/slate/plugins/{custom-links.mjs.map → custom-links.cjs.map} +1 -1
- package/dist/slate/plugins/custom-links.js +15 -18
- package/dist/slate/plugins/custom-links.js.map +1 -1
- package/dist/slate/plugins/empty-clear-formatting.cjs +18 -0
- package/dist/slate/plugins/{empty-clear-formatting.mjs.map → empty-clear-formatting.cjs.map} +1 -1
- package/dist/slate/plugins/empty-clear-formatting.js +5 -7
- package/dist/slate/plugins/empty-clear-formatting.js.map +1 -1
- package/dist/slate/plugins/mentions.cjs +129 -0
- package/dist/slate/plugins/{mentions.mjs.map → mentions.cjs.map} +1 -1
- package/dist/slate/plugins/mentions.js +35 -42
- package/dist/slate/plugins/mentions.js.map +1 -1
- package/dist/slate/plugins/normalize.cjs +28 -0
- package/dist/slate/plugins/normalize.cjs.map +1 -0
- package/dist/slate/plugins/normalize.js +8 -10
- package/dist/slate/plugins/normalize.js.map +1 -1
- package/dist/slate/plugins/{paste.mjs → paste.cjs} +14 -12
- package/dist/slate/plugins/{paste.mjs.map → paste.cjs.map} +1 -1
- package/dist/slate/plugins/paste.js +11 -13
- package/dist/slate/plugins/paste.js.map +1 -1
- package/dist/slate/utils/get-character.cjs +50 -0
- package/dist/slate/utils/{get-character.mjs.map → get-character.cjs.map} +1 -1
- package/dist/slate/utils/get-character.js +10 -13
- package/dist/slate/utils/get-character.js.map +1 -1
- package/dist/slate/utils/get-dom-range.cjs +17 -0
- package/dist/slate/utils/{get-dom-range.mjs.map → get-dom-range.cjs.map} +1 -1
- package/dist/slate/utils/get-dom-range.js +3 -5
- package/dist/slate/utils/get-dom-range.js.map +1 -1
- package/dist/slate/utils/{get-match-range.mjs → get-match-range.cjs} +14 -12
- package/dist/slate/utils/{get-match-range.mjs.map → get-match-range.cjs.map} +1 -1
- package/dist/slate/utils/get-match-range.js +11 -13
- package/dist/slate/utils/get-match-range.js.map +1 -1
- package/dist/slate/utils/is-empty-string.cjs +8 -0
- package/dist/slate/utils/is-empty-string.cjs.map +1 -0
- package/dist/slate/utils/is-empty-string.js +1 -3
- package/dist/slate/utils/is-empty-string.js.map +1 -1
- package/dist/slate/utils/is-empty.cjs +27 -0
- package/dist/slate/utils/{is-empty.mjs.map → is-empty.cjs.map} +1 -1
- package/dist/slate/utils/is-empty.js +8 -10
- package/dist/slate/utils/is-empty.js.map +1 -1
- package/dist/slate/utils/{is-text.mjs → is-text.cjs} +5 -2
- package/dist/slate/utils/{is-text.mjs.map → is-text.cjs.map} +1 -1
- package/dist/slate/utils/is-text.js +1 -4
- package/dist/slate/utils/is-text.js.map +1 -1
- package/dist/slate/utils/{is-whitespace-character.mjs → is-whitespace-character.cjs} +4 -2
- package/dist/slate/utils/{is-whitespace-character.mjs.map → is-whitespace-character.cjs.map} +1 -1
- package/dist/slate/utils/is-whitespace-character.js +1 -3
- package/dist/slate/utils/is-whitespace-character.js.map +1 -1
- package/dist/slate/utils/marks.cjs +62 -0
- package/dist/slate/utils/{marks.mjs.map → marks.cjs.map} +1 -1
- package/dist/slate/utils/marks.js +12 -19
- package/dist/slate/utils/marks.js.map +1 -1
- package/dist/slate/utils/selection-contains-inlines.cjs +36 -0
- package/dist/slate/utils/selection-contains-inlines.cjs.map +1 -0
- package/dist/slate/utils/selection-contains-inlines.js +7 -9
- package/dist/slate/utils/selection-contains-inlines.js.map +1 -1
- package/dist/utils/{Persist.mjs → Persist.cjs} +26 -22
- package/dist/utils/{Persist.mjs.map → Persist.cjs.map} +1 -1
- package/dist/utils/Persist.js +21 -25
- package/dist/utils/Persist.js.map +1 -1
- package/dist/utils/Portal.cjs +29 -0
- package/dist/utils/{Portal.mjs.map → Portal.cjs.map} +1 -1
- package/dist/utils/Portal.js +9 -11
- package/dist/utils/Portal.js.map +1 -1
- package/dist/utils/{capitalize.mjs → capitalize.cjs} +4 -2
- package/dist/utils/capitalize.cjs.map +1 -0
- package/dist/utils/capitalize.js +1 -3
- package/dist/utils/capitalize.js.map +1 -1
- package/dist/utils/{clamp.mjs → clamp.cjs} +4 -2
- package/dist/utils/clamp.cjs.map +1 -0
- package/dist/utils/clamp.js +1 -3
- package/dist/utils/clamp.js.map +1 -1
- package/dist/utils/{class-names.mjs → class-names.cjs} +4 -2
- package/dist/utils/{class-names.mjs.map → class-names.cjs.map} +1 -1
- package/dist/utils/class-names.js +1 -3
- package/dist/utils/class-names.js.map +1 -1
- package/dist/utils/{data-transfer.mjs → data-transfer.cjs} +6 -4
- package/dist/utils/{data-transfer.mjs.map → data-transfer.cjs.map} +1 -1
- package/dist/utils/data-transfer.js +3 -5
- package/dist/utils/data-transfer.js.map +1 -1
- package/dist/utils/{download.mjs → download.cjs} +4 -2
- package/dist/utils/download.cjs.map +1 -0
- package/dist/utils/download.js +1 -3
- package/dist/utils/download.js.map +1 -1
- package/dist/utils/exists.cjs +8 -0
- package/dist/utils/exists.cjs.map +1 -0
- package/dist/utils/exists.js +1 -3
- package/dist/utils/exists.js.map +1 -1
- package/dist/utils/{find-last-index.mjs → find-last-index.cjs} +4 -2
- package/dist/utils/find-last-index.cjs.map +1 -0
- package/dist/utils/find-last-index.js +1 -3
- package/dist/utils/find-last-index.js.map +1 -1
- package/dist/utils/{format-file-size.mjs → format-file-size.cjs} +6 -4
- package/dist/utils/format-file-size.cjs.map +1 -0
- package/dist/utils/format-file-size.js +3 -5
- package/dist/utils/format-file-size.js.map +1 -1
- package/dist/utils/{get-initials.mjs → get-initials.cjs} +4 -2
- package/dist/utils/get-initials.cjs.map +1 -0
- package/dist/utils/get-initials.js +1 -3
- package/dist/utils/get-initials.js.map +1 -1
- package/dist/utils/intl.cjs +30 -0
- package/dist/utils/{intl.mjs.map → intl.cjs.map} +1 -1
- package/dist/utils/intl.js +6 -11
- package/dist/utils/intl.js.map +1 -1
- package/dist/utils/{is-apple.mjs → is-apple.cjs} +4 -2
- package/dist/utils/is-apple.cjs.map +1 -0
- package/dist/utils/is-apple.js +1 -3
- package/dist/utils/is-apple.js.map +1 -1
- package/dist/utils/{is-key.mjs → is-key.cjs} +6 -4
- package/dist/utils/{is-key.mjs.map → is-key.cjs.map} +1 -1
- package/dist/utils/is-key.js +3 -5
- package/dist/utils/is-key.js.map +1 -1
- package/dist/utils/{memoize.mjs → memoize.cjs} +6 -4
- package/dist/utils/memoize.cjs.map +1 -0
- package/dist/utils/memoize.js +3 -5
- package/dist/utils/memoize.js.map +1 -1
- package/dist/utils/{pluralize.mjs → pluralize.cjs} +4 -2
- package/dist/utils/pluralize.cjs.map +1 -0
- package/dist/utils/pluralize.js +1 -3
- package/dist/utils/pluralize.js.map +1 -1
- package/dist/utils/{request-idle-callback.mjs → request-idle-callback.cjs} +5 -2
- package/dist/utils/{request-idle-callback.mjs.map → request-idle-callback.cjs.map} +1 -1
- package/dist/utils/request-idle-callback.js +1 -4
- package/dist/utils/request-idle-callback.js.map +1 -1
- package/dist/utils/{request-submit.mjs → request-submit.cjs} +4 -2
- package/dist/utils/request-submit.cjs.map +1 -0
- package/dist/utils/request-submit.js +1 -3
- package/dist/utils/request-submit.js.map +1 -1
- package/dist/utils/{url.mjs → url.cjs} +4 -2
- package/dist/utils/url.cjs.map +1 -0
- package/dist/utils/url.js +1 -3
- package/dist/utils/url.js.map +1 -1
- package/dist/utils/{use-controllable-state.mjs → use-controllable-state.cjs} +11 -9
- package/dist/utils/{use-controllable-state.mjs.map → use-controllable-state.cjs.map} +1 -1
- package/dist/utils/use-controllable-state.js +8 -10
- package/dist/utils/use-controllable-state.js.map +1 -1
- package/dist/utils/use-index.cjs +32 -0
- package/dist/utils/{use-index.mjs.map → use-index.cjs.map} +1 -1
- package/dist/utils/use-index.js +11 -13
- package/dist/utils/use-index.js.map +1 -1
- package/dist/utils/use-initial.cjs +11 -0
- package/dist/utils/{use-initial.mjs.map → use-initial.cjs.map} +1 -1
- package/dist/utils/use-initial.js +3 -5
- package/dist/utils/use-initial.js.map +1 -1
- package/dist/utils/{use-interval.mjs → use-interval.cjs} +8 -6
- package/dist/utils/use-interval.cjs.map +1 -0
- package/dist/utils/use-interval.js +5 -7
- package/dist/utils/use-interval.js.map +1 -1
- package/dist/utils/use-latest.cjs +14 -0
- package/dist/utils/{use-latest.mjs.map → use-latest.cjs.map} +1 -1
- package/dist/utils/use-latest.js +4 -6
- package/dist/utils/use-latest.js.map +1 -1
- package/dist/utils/use-observable.cjs +15 -0
- package/dist/utils/{use-observable.mjs.map → use-observable.cjs.map} +1 -1
- package/dist/utils/use-observable.js +5 -7
- package/dist/utils/use-observable.js.map +1 -1
- package/dist/utils/{use-refs.mjs → use-refs.cjs} +6 -4
- package/dist/utils/{use-refs.mjs.map → use-refs.cjs.map} +1 -1
- package/dist/utils/use-refs.js +3 -5
- package/dist/utils/use-refs.js.map +1 -1
- package/dist/utils/use-rerender.cjs +14 -0
- package/dist/utils/{use-rerender.mjs.map → use-rerender.cjs.map} +1 -1
- package/dist/utils/use-rerender.js +3 -5
- package/dist/utils/use-rerender.js.map +1 -1
- package/dist/utils/{use-visible.mjs → use-visible.cjs} +11 -8
- package/dist/utils/{use-visible.mjs.map → use-visible.cjs.map} +1 -1
- package/dist/utils/use-visible.js +7 -10
- package/dist/utils/use-visible.js.map +1 -1
- package/dist/utils/{use-window-focus.mjs → use-window-focus.cjs} +6 -4
- package/dist/utils/use-window-focus.cjs.map +1 -0
- package/dist/utils/use-window-focus.js +3 -5
- package/dist/utils/use-window-focus.js.map +1 -1
- package/dist/utils/{visually-hidden.mjs → visually-hidden.cjs} +4 -2
- package/dist/utils/visually-hidden.cjs.map +1 -0
- package/dist/utils/visually-hidden.js +1 -3
- package/dist/utils/visually-hidden.js.map +1 -1
- package/dist/utils/{wrap.mjs → wrap.cjs} +4 -2
- package/dist/utils/wrap.cjs.map +1 -0
- package/dist/utils/wrap.js +1 -3
- package/dist/utils/wrap.js.map +1 -1
- package/dist/version.cjs +10 -0
- package/dist/{version.mjs.map → version.cjs.map} +1 -1
- package/dist/version.js +3 -7
- package/dist/version.js.map +1 -1
- package/package.json +28 -27
- package/styles/dark/attributes.css.d.cts +1 -0
- package/styles/dark/media-query.css.d.cts +1 -0
- package/styles.css.d.cts +1 -0
- package/dist/_private/index.mjs +0 -55
- package/dist/_private/index.mjs.map +0 -1
- package/dist/components/HistoryVersionSummary.mjs +0 -43
- package/dist/components/HistoryVersionSummaryList.mjs +0 -23
- package/dist/components/InboxNotificationList.mjs +0 -40
- package/dist/components/internal/Avatar.mjs +0 -46
- package/dist/components/internal/Button.mjs +0 -76
- package/dist/components/internal/Dropdown.mjs +0 -67
- package/dist/components/internal/Emoji.mjs +0 -17
- package/dist/components/internal/EmojiPicker.mjs +0 -184
- package/dist/components/internal/List.mjs +0 -34
- package/dist/components/internal/Room.mjs +0 -22
- package/dist/components/internal/Tooltip.mjs +0 -109
- package/dist/components/internal/User.mjs +0 -26
- package/dist/components.mjs +0 -43
- package/dist/config.mjs +0 -36
- package/dist/icon.mjs +0 -33
- package/dist/icon.mjs.map +0 -1
- package/dist/icons/ArrowCornerDownRight.mjs +0 -14
- package/dist/icons/ArrowCornerUpRight.mjs +0 -14
- package/dist/icons/ArrowCornerUpRight.mjs.map +0 -1
- package/dist/icons/ArrowDown.mjs +0 -14
- package/dist/icons/ArrowDown.mjs.map +0 -1
- package/dist/icons/ArrowUp.mjs +0 -14
- package/dist/icons/ArrowUp.mjs.map +0 -1
- package/dist/icons/Blockquote.mjs +0 -14
- package/dist/icons/Blockquote.mjs.map +0 -1
- package/dist/icons/Bold.mjs +0 -14
- package/dist/icons/Check.mjs +0 -14
- package/dist/icons/Check.mjs.map +0 -1
- package/dist/icons/ChevronDown.mjs +0 -14
- package/dist/icons/ChevronLeft.mjs +0 -14
- package/dist/icons/ChevronRight.mjs +0 -14
- package/dist/icons/ChevronUp.mjs +0 -14
- package/dist/icons/Code.mjs +0 -14
- package/dist/icons/Code.mjs.map +0 -1
- package/dist/icons/Comment.mjs +0 -14
- package/dist/icons/Cross.mjs +0 -19
- package/dist/icons/Cross.mjs.map +0 -1
- package/dist/icons/Delete.mjs +0 -14
- package/dist/icons/Edit.mjs +0 -14
- package/dist/icons/Ellipsis.mjs +0 -29
- package/dist/icons/Ellipsis.mjs.map +0 -1
- package/dist/icons/Emoji.mjs +0 -32
- package/dist/icons/Emoji.mjs.map +0 -1
- package/dist/icons/EmojiAdd.mjs +0 -35
- package/dist/icons/EmojiAdd.mjs.map +0 -1
- package/dist/icons/H1.mjs +0 -14
- package/dist/icons/H2.mjs +0 -14
- package/dist/icons/H2.mjs.map +0 -1
- package/dist/icons/H3.mjs +0 -14
- package/dist/icons/Italic.mjs +0 -14
- package/dist/icons/Lengthen.mjs +0 -14
- package/dist/icons/Lengthen.mjs.map +0 -1
- package/dist/icons/ListOrdered.mjs +0 -14
- package/dist/icons/ListUnordered.mjs +0 -37
- package/dist/icons/ListUnordered.mjs.map +0 -1
- package/dist/icons/Mention.mjs +0 -19
- package/dist/icons/Mention.mjs.map +0 -1
- package/dist/icons/QuestionMark.mjs +0 -24
- package/dist/icons/QuestionMark.mjs.map +0 -1
- package/dist/icons/Redo.mjs +0 -19
- package/dist/icons/Redo.mjs.map +0 -1
- package/dist/icons/Resolve.mjs +0 -21
- package/dist/icons/Resolve.mjs.map +0 -1
- package/dist/icons/Resolved.mjs +0 -23
- package/dist/icons/Resolved.mjs.map +0 -1
- package/dist/icons/Restore.mjs +0 -19
- package/dist/icons/Restore.mjs.map +0 -1
- package/dist/icons/Search.mjs +0 -14
- package/dist/icons/Send.mjs +0 -14
- package/dist/icons/Send.mjs.map +0 -1
- package/dist/icons/Shorten.mjs +0 -14
- package/dist/icons/SparklesText.mjs +0 -19
- package/dist/icons/Spinner.mjs +0 -15
- package/dist/icons/Spinner.mjs.map +0 -1
- package/dist/icons/Strikethrough.mjs +0 -14
- package/dist/icons/Text.mjs +0 -14
- package/dist/icons/Translate.mjs +0 -19
- package/dist/icons/Underline.mjs +0 -14
- package/dist/icons/Underline.mjs.map +0 -1
- package/dist/icons/Undo.mjs +0 -19
- package/dist/icons/Undo.mjs.map +0 -1
- package/dist/icons/Warning.mjs +0 -21
- package/dist/icons/Warning.mjs.map +0 -1
- package/dist/icons/index.mjs +0 -46
- package/dist/icons/index.mjs.map +0 -1
- package/dist/index.mjs +0 -16
- package/dist/primitives/Composer/contexts.mjs +0 -48
- package/dist/primitives/EmojiPicker/contexts.mjs +0 -16
- package/dist/primitives/FileSize.mjs +0 -34
- package/dist/primitives/index.mjs +0 -11
- package/dist/primitives/index.mjs.map +0 -1
- package/dist/primitives/internal/Emoji.mjs +0 -30
- package/dist/shared.mjs +0 -11
- package/dist/slate/plugins/empty-clear-formatting.mjs +0 -16
- package/dist/slate/plugins/mentions.mjs +0 -122
- package/dist/slate/plugins/normalize.mjs +0 -26
- package/dist/slate/plugins/normalize.mjs.map +0 -1
- package/dist/slate/utils/get-character.mjs +0 -47
- package/dist/slate/utils/get-dom-range.mjs +0 -15
- package/dist/slate/utils/is-empty-string.mjs +0 -6
- package/dist/slate/utils/is-empty-string.mjs.map +0 -1
- package/dist/slate/utils/is-empty.mjs +0 -25
- package/dist/slate/utils/marks.mjs +0 -55
- package/dist/slate/utils/selection-contains-inlines.mjs +0 -34
- package/dist/slate/utils/selection-contains-inlines.mjs.map +0 -1
- package/dist/utils/Portal.mjs +0 -27
- package/dist/utils/capitalize.mjs.map +0 -1
- package/dist/utils/clamp.mjs.map +0 -1
- package/dist/utils/download.mjs.map +0 -1
- package/dist/utils/exists.mjs +0 -6
- package/dist/utils/exists.mjs.map +0 -1
- package/dist/utils/find-last-index.mjs.map +0 -1
- package/dist/utils/format-file-size.mjs.map +0 -1
- package/dist/utils/get-initials.mjs.map +0 -1
- package/dist/utils/intl.mjs +0 -25
- package/dist/utils/is-apple.mjs.map +0 -1
- package/dist/utils/memoize.mjs.map +0 -1
- package/dist/utils/pluralize.mjs.map +0 -1
- package/dist/utils/request-submit.mjs.map +0 -1
- package/dist/utils/url.mjs.map +0 -1
- package/dist/utils/use-index.mjs +0 -30
- package/dist/utils/use-initial.mjs +0 -9
- package/dist/utils/use-interval.mjs.map +0 -1
- package/dist/utils/use-latest.mjs +0 -12
- package/dist/utils/use-observable.mjs +0 -13
- package/dist/utils/use-rerender.mjs +0 -12
- package/dist/utils/use-window-focus.mjs.map +0 -1
- package/dist/utils/visually-hidden.mjs.map +0 -1
- package/dist/utils/wrap.mjs.map +0 -1
- package/dist/version.mjs +0 -6
- /package/dist/_private/{index.d.mts → index.d.cts} +0 -0
- /package/dist/{index.d.mts → index.d.cts} +0 -0
- /package/dist/primitives/{index.d.mts → index.d.cts} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Composer.js","sources":["../../src/components/Composer.tsx"],"sourcesContent":["\"use client\";\n\nimport type {\n BaseMetadata,\n CommentAttachment,\n CommentMixedAttachment,\n DM,\n} from \"@liveblocks/core\";\nimport { Permission } from \"@liveblocks/core\";\nimport {\n useCreateRoomComment,\n useCreateRoomThread,\n useEditRoomComment,\n useLayoutEffect,\n useResolveMentionSuggestions,\n useRoomOrNull,\n useRoomPermissions,\n} from \"@liveblocks/react/_private\";\nimport type {\n ComponentPropsWithoutRef,\n ComponentType,\n FocusEvent,\n FormEvent,\n ForwardedRef,\n MouseEvent,\n PropsWithChildren,\n ReactNode,\n RefAttributes,\n SyntheticEvent,\n} from \"react\";\nimport {\n createContext,\n forwardRef,\n useCallback,\n useMemo,\n useRef,\n useSyncExternalStore,\n} from \"react\";\n\nimport { useLiveblocksUIConfig } from \"../config\";\nimport { FLOATING_ELEMENT_SIDE_OFFSET } from \"../constants\";\nimport { AttachmentIcon } from \"../icons/Attachment\";\nimport { BoldIcon } from \"../icons/Bold\";\nimport { CodeIcon } from \"../icons/Code\";\nimport { EmojiIcon } from \"../icons/Emoji\";\nimport { ItalicIcon } from \"../icons/Italic\";\nimport { MentionIcon } from \"../icons/Mention\";\nimport { SendIcon } from \"../icons/Send\";\nimport { StrikethroughIcon } from \"../icons/Strikethrough\";\nimport type { ComposerOverrides, GlobalOverrides } from \"../overrides\";\nimport { useOverrides } from \"../overrides\";\nimport * as ComposerPrimitive from \"../primitives/Composer\";\nimport {\n useComposer,\n useComposerAttachmentsContext,\n useComposerEditorContext,\n} from \"../primitives/Composer/contexts\";\nimport type {\n ComposerEditorComponents,\n ComposerEditorLinkProps,\n ComposerEditorMentionProps,\n ComposerEditorMentionSuggestionsProps,\n ComposerEditorProps,\n ComposerFormProps,\n ComposerMarkToggleProps,\n ComposerSubmitComment,\n} from \"../primitives/Composer/types\";\nimport { useComposerAttachmentsDropArea } from \"../primitives/Composer/utils\";\nimport { MENTION_CHARACTER } from \"../slate/plugins/mentions\";\nimport type { ComposerBodyMark } from \"../types\";\nimport { classNames } from \"../utils/class-names\";\nimport { useControllableState } from \"../utils/use-controllable-state\";\nimport { FileAttachment } from \"./internal/Attachment\";\nimport { Attribution } from \"./internal/Attribution\";\nimport { Avatar } from \"./internal/Avatar\";\nimport { Button } from \"./internal/Button\";\nimport type { EmojiPickerProps } from \"./internal/EmojiPicker\";\nimport { EmojiPicker, EmojiPickerTrigger } from \"./internal/EmojiPicker\";\nimport { ShortcutTooltip, Tooltip, TooltipProvider } from \"./internal/Tooltip\";\nimport { User } from \"./internal/User\";\n\ninterface EditorActionProps extends ComponentPropsWithoutRef<\"button\"> {\n label: string;\n tooltipLabel?: string;\n}\n\ninterface EmojiEditorActionProps extends EditorActionProps {\n onPickerOpenChange?: EmojiPickerProps[\"onOpenChange\"];\n}\n\ninterface MarkToggleProps extends ComposerMarkToggleProps {\n icon?: ReactNode;\n shortcut?: string;\n}\n\ntype ComposerCreateThreadProps<M extends BaseMetadata> = {\n threadId?: never;\n commentId?: never;\n\n /**\n * The metadata of the thread to create.\n */\n metadata?: M;\n};\n\ntype ComposerCreateCommentProps = {\n /**\n * The ID of the thread to reply to.\n */\n threadId: string;\n commentId?: never;\n metadata?: never;\n};\n\ntype ComposerEditCommentProps = {\n /**\n * The ID of the thread to edit a comment in.\n */\n threadId: string;\n\n /**\n * The ID of the comment to edit.\n */\n commentId: string;\n metadata?: never;\n};\n\nexport type ComposerProps<M extends BaseMetadata = DM> = Omit<\n ComponentPropsWithoutRef<\"form\">,\n \"defaultValue\"\n> &\n (\n | ComposerCreateThreadProps<M>\n | ComposerCreateCommentProps\n | ComposerEditCommentProps\n ) & {\n /**\n * The event handler called when the composer is submitted.\n */\n onComposerSubmit?: (\n comment: ComposerSubmitComment,\n event: FormEvent<HTMLFormElement>\n ) => Promise<void> | void;\n\n /**\n * The composer's initial value.\n */\n defaultValue?: ComposerEditorProps[\"defaultValue\"];\n\n /**\n * The composer's initial attachments.\n */\n defaultAttachments?: CommentAttachment[];\n\n /**\n * Whether the composer is collapsed. Setting a value will make the composer controlled.\n */\n collapsed?: boolean;\n\n /**\n * The event handler called when the collapsed state of the composer changes.\n */\n onCollapsedChange?: (collapsed: boolean) => void;\n\n /**\n * Whether the composer is initially collapsed. Setting a value will make the composer uncontrolled.\n */\n defaultCollapsed?: boolean;\n\n /**\n * Whether to show and allow adding attachments.\n */\n showAttachments?: boolean;\n\n /**\n * Whether to show formatting controls (e.g. a floating toolbar with formatting toggles when selecting text)\n */\n showFormattingControls?: boolean;\n\n /**\n * Whether the composer is disabled.\n */\n disabled?: ComposerFormProps[\"disabled\"];\n\n /**\n * Whether to focus the composer on mount.\n */\n autoFocus?: ComposerEditorProps[\"autoFocus\"];\n\n /**\n * Override the component's strings.\n */\n overrides?: Partial<GlobalOverrides & ComposerOverrides>;\n\n /**\n * @internal\n */\n actions?: ReactNode;\n\n /**\n * @internal\n */\n showAttribution?: boolean;\n\n /**\n * @internal\n */\n roomId?: string;\n };\n\ninterface ComposerEditorContainerProps\n extends Pick<\n ComposerProps,\n | \"defaultValue\"\n | \"showAttachments\"\n | \"showFormattingControls\"\n | \"showAttribution\"\n | \"overrides\"\n | \"actions\"\n | \"autoFocus\"\n | \"disabled\"\n > {\n isCollapsed: boolean | undefined;\n onEmptyChange: (isEmpty: boolean) => void;\n hasResolveMentionSuggestions: boolean;\n onEmojiPickerOpenChange: (isOpen: boolean) => void;\n onEditorClick: (event: MouseEvent<HTMLDivElement>) => void;\n}\n\nfunction ComposerInsertMentionEditorAction({\n label,\n tooltipLabel,\n className,\n onClick,\n ...props\n}: EditorActionProps) {\n const { createMention } = useComposer();\n\n const preventDefault = useCallback((event: SyntheticEvent) => {\n event.preventDefault();\n }, []);\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n\n if (!event.isDefaultPrevented()) {\n event.stopPropagation();\n createMention();\n }\n },\n [createMention, onClick]\n );\n\n return (\n <Tooltip content={tooltipLabel ?? label}>\n <Button\n className={classNames(\"lb-composer-editor-action\", className)}\n onPointerDown={preventDefault}\n onClick={handleClick}\n aria-label={label}\n icon={<MentionIcon />}\n {...props}\n />\n </Tooltip>\n );\n}\n\nfunction ComposerInsertEmojiEditorAction({\n label,\n tooltipLabel,\n onPickerOpenChange,\n className,\n ...props\n}: EmojiEditorActionProps) {\n const { insertText } = useComposer();\n\n const preventDefault = useCallback((event: SyntheticEvent) => {\n event.preventDefault();\n }, []);\n\n const stopPropagation = useCallback((event: SyntheticEvent) => {\n event.stopPropagation();\n }, []);\n\n return (\n <EmojiPicker onEmojiSelect={insertText} onOpenChange={onPickerOpenChange}>\n <Tooltip content={tooltipLabel ?? label}>\n <EmojiPickerTrigger asChild>\n <Button\n className={classNames(\"lb-composer-editor-action\", className)}\n onPointerDown={preventDefault}\n onClick={stopPropagation}\n aria-label={label}\n icon={<EmojiIcon />}\n {...props}\n />\n </EmojiPickerTrigger>\n </Tooltip>\n </EmojiPicker>\n );\n}\n\nfunction ComposerAttachFilesEditorAction({\n label,\n tooltipLabel,\n className,\n ...props\n}: EditorActionProps) {\n const preventDefault = useCallback((event: SyntheticEvent) => {\n event.preventDefault();\n }, []);\n\n const stopPropagation = useCallback((event: SyntheticEvent) => {\n event.stopPropagation();\n }, []);\n\n return (\n <Tooltip content={tooltipLabel ?? label}>\n <ComposerPrimitive.AttachFiles asChild>\n <Button\n className={classNames(\"lb-composer-editor-action\", className)}\n onPointerDown={preventDefault}\n onClick={stopPropagation}\n aria-label={label}\n icon={<AttachmentIcon />}\n {...props}\n />\n </ComposerPrimitive.AttachFiles>\n </Tooltip>\n );\n}\n\nfunction ComposerMention({ userId }: ComposerEditorMentionProps) {\n return (\n <ComposerPrimitive.Mention className=\"lb-composer-mention\">\n {MENTION_CHARACTER}\n <User userId={userId} />\n </ComposerPrimitive.Mention>\n );\n}\n\nfunction ComposerMentionSuggestions({\n userIds,\n}: ComposerEditorMentionSuggestionsProps) {\n return userIds.length > 0 ? (\n <ComposerPrimitive.Suggestions className=\"lb-root lb-portal lb-elevation lb-composer-suggestions lb-composer-mention-suggestions\">\n <ComposerPrimitive.SuggestionsList className=\"lb-composer-suggestions-list lb-composer-mention-suggestions-list\">\n {userIds.map((userId) => (\n <ComposerPrimitive.SuggestionsListItem\n key={userId}\n className=\"lb-composer-suggestions-list-item lb-composer-mention-suggestion\"\n value={userId}\n >\n <Avatar\n userId={userId}\n className=\"lb-composer-mention-suggestion-avatar\"\n />\n <User\n userId={userId}\n className=\"lb-composer-mention-suggestion-user\"\n />\n </ComposerPrimitive.SuggestionsListItem>\n ))}\n </ComposerPrimitive.SuggestionsList>\n </ComposerPrimitive.Suggestions>\n ) : null;\n}\n\nfunction MarkToggle({\n mark,\n icon,\n shortcut,\n children,\n ...props\n}: MarkToggleProps) {\n const $ = useOverrides();\n const label = useMemo(() => {\n return $.COMPOSER_TOGGLE_MARK(mark);\n }, [$, mark]);\n\n return (\n <ShortcutTooltip\n content={label}\n shortcut={shortcut}\n sideOffset={FLOATING_ELEMENT_SIDE_OFFSET + 2}\n >\n <ComposerPrimitive.MarkToggle mark={mark} asChild {...props}>\n <Button aria-label={label} variant=\"toolbar\" icon={icon}>\n {children}\n </Button>\n </ComposerPrimitive.MarkToggle>\n </ShortcutTooltip>\n );\n}\n\ntype MarkToggles = {\n [K in ComposerBodyMark]: ComponentType<PropsWithChildren>;\n};\n\nconst markToggles: MarkToggles = {\n bold: () => <MarkToggle mark=\"bold\" shortcut=\"Mod-B\" icon={<BoldIcon />} />,\n italic: () => (\n <MarkToggle mark=\"italic\" shortcut=\"Mod-I\" icon={<ItalicIcon />} />\n ),\n strikethrough: () => (\n <MarkToggle\n mark=\"strikethrough\"\n shortcut=\"Mod-Shift-S\"\n icon={<StrikethroughIcon />}\n />\n ),\n code: () => <MarkToggle mark=\"code\" shortcut=\"Mod-E\" icon={<CodeIcon />} />,\n};\n\nconst markTogglesList = Object.entries(markToggles).map(([mark, Toggle]) => (\n <Toggle key={mark} />\n));\n\nfunction ComposerFloatingToolbar() {\n return (\n <ComposerPrimitive.FloatingToolbar className=\"lb-root lb-portal lb-elevation lb-composer-floating-toolbar\">\n {markTogglesList}\n </ComposerPrimitive.FloatingToolbar>\n );\n}\n\nfunction ComposerLink({ href, children }: ComposerEditorLinkProps) {\n return (\n <ComposerPrimitive.Link href={href} className=\"lb-composer-link\">\n {children}\n </ComposerPrimitive.Link>\n );\n}\n\ninterface ComposerAttachmentsProps extends ComponentPropsWithoutRef<\"div\"> {\n overrides?: Partial<GlobalOverrides & ComposerOverrides>;\n}\n\ninterface ComposerFileAttachmentProps extends ComponentPropsWithoutRef<\"div\"> {\n attachment: CommentMixedAttachment;\n overrides?: Partial<GlobalOverrides & ComposerOverrides>;\n}\n\nfunction ComposerFileAttachment({\n attachment,\n className,\n overrides,\n ...props\n}: ComposerFileAttachmentProps) {\n const { removeAttachment } = useComposer();\n const { roomId } = useComposerEditorContext();\n\n const handleDeleteClick = useCallback(() => {\n removeAttachment(attachment.id);\n }, [attachment.id, removeAttachment]);\n\n return (\n <FileAttachment\n className={classNames(\"lb-composer-attachment\", className)}\n {...props}\n attachment={attachment}\n onDeleteClick={handleDeleteClick}\n preventFocusOnDelete\n overrides={overrides}\n roomId={roomId}\n />\n );\n}\n\nfunction ComposerAttachments({\n overrides,\n className,\n ...props\n}: ComposerAttachmentsProps) {\n const { attachments } = useComposer();\n\n if (attachments.length === 0) {\n return null;\n }\n\n return (\n <div\n className={classNames(\"lb-composer-attachments\", className)}\n {...props}\n >\n <div className=\"lb-attachments\">\n {attachments.map((attachment) => {\n return (\n <ComposerFileAttachment\n key={attachment.id}\n attachment={attachment}\n overrides={overrides}\n />\n );\n })}\n </div>\n </div>\n );\n}\n\nconst editorRequiredComponents: ComposerEditorComponents = {\n Mention: ComposerMention,\n MentionSuggestions: ComposerMentionSuggestions,\n Link: ComposerLink,\n};\n\nfunction ComposerEditorContainer({\n showAttachments = true,\n showFormattingControls = true,\n showAttribution,\n defaultValue,\n isCollapsed,\n overrides,\n actions,\n autoFocus,\n disabled,\n hasResolveMentionSuggestions,\n onEmojiPickerOpenChange,\n onEmptyChange,\n onEditorClick,\n}: ComposerEditorContainerProps) {\n const { isEmpty } = useComposer();\n const { hasMaxAttachments } = useComposerAttachmentsContext();\n const $ = useOverrides(overrides);\n const components = useMemo(() => {\n return {\n ...editorRequiredComponents,\n FloatingToolbar: showFormattingControls\n ? ComposerFloatingToolbar\n : undefined,\n };\n }, [showFormattingControls]);\n\n const [isDraggingOver, dropAreaProps] = useComposerAttachmentsDropArea({\n disabled: disabled || hasMaxAttachments,\n });\n\n useLayoutEffect(() => {\n onEmptyChange(isEmpty);\n }, [isEmpty, onEmptyChange]);\n\n const preventDefault = useCallback((event: SyntheticEvent) => {\n event.preventDefault();\n }, []);\n\n const stopPropagation = useCallback((event: SyntheticEvent) => {\n event.stopPropagation();\n }, []);\n\n return (\n <div className=\"lb-composer-editor-container\" {...dropAreaProps}>\n <ComposerPrimitive.Editor\n className=\"lb-composer-editor\"\n onClick={onEditorClick}\n placeholder={$.COMPOSER_PLACEHOLDER}\n defaultValue={defaultValue}\n autoFocus={autoFocus}\n components={components}\n disabled={disabled}\n dir={$.dir}\n />\n {showAttachments && <ComposerAttachments overrides={overrides} />}\n {(!isCollapsed || isDraggingOver) && (\n <div className=\"lb-composer-footer\">\n <div className=\"lb-composer-editor-actions\">\n {hasResolveMentionSuggestions && (\n <ComposerInsertMentionEditorAction\n label={$.COMPOSER_INSERT_MENTION}\n disabled={disabled}\n />\n )}\n <ComposerInsertEmojiEditorAction\n label={$.COMPOSER_INSERT_EMOJI}\n onPickerOpenChange={onEmojiPickerOpenChange}\n disabled={disabled}\n />\n {showAttachments && (\n <ComposerAttachFilesEditorAction\n label={$.COMPOSER_ATTACH_FILES}\n disabled={disabled}\n />\n )}\n </div>\n {showAttribution && <Attribution />}\n <div className=\"lb-composer-actions\">\n {actions ?? (\n <>\n <ShortcutTooltip content={$.COMPOSER_SEND} shortcut=\"Enter\">\n <ComposerPrimitive.Submit asChild>\n <Button\n onPointerDown={preventDefault}\n onClick={stopPropagation}\n className=\"lb-composer-action\"\n variant=\"primary\"\n aria-label={$.COMPOSER_SEND}\n icon={<SendIcon />}\n />\n </ComposerPrimitive.Submit>\n </ShortcutTooltip>\n </>\n )}\n </div>\n </div>\n )}\n {showAttachments && isDraggingOver && (\n <div className=\"lb-composer-attachments-drop-area\">\n <div className=\"lb-composer-attachments-drop-area-label\">\n <AttachmentIcon />\n {$.COMPOSER_ATTACH_FILES}\n </div>\n </div>\n )}\n </div>\n );\n}\n\nexport const ComposerRoomIdContext = createContext<string | null>(null);\n\n/**\n * Displays a composer to create comments.\n *\n * @example\n * <Composer />\n */\nexport const Composer = forwardRef(\n <M extends BaseMetadata = DM>(\n {\n threadId,\n commentId,\n metadata,\n defaultValue,\n defaultAttachments,\n onComposerSubmit,\n collapsed: controlledCollapsed,\n defaultCollapsed,\n onCollapsedChange: controlledOnCollapsedChange,\n overrides,\n actions,\n onBlur,\n className,\n onFocus,\n autoFocus,\n disabled,\n showAttachments = true,\n showFormattingControls = true,\n showAttribution,\n roomId: _roomId,\n ...props\n }: ComposerProps<M>,\n forwardedRef: ForwardedRef<HTMLFormElement>\n ) => {\n const room = useRoomOrNull();\n\n const roomId = _roomId !== undefined ? _roomId : room?.id;\n if (roomId === undefined) {\n throw new Error(\n \"Composer must be a descendant of RoomProvider component\"\n );\n }\n\n const createThread = useCreateRoomThread(roomId);\n const createComment = useCreateRoomComment(roomId);\n const editComment = useEditRoomComment(roomId);\n const { preventUnsavedComposerChanges } = useLiveblocksUIConfig();\n const hasResolveMentionSuggestions =\n useResolveMentionSuggestions() !== undefined;\n const isEmptyRef = useRef(true);\n const isEmojiPickerOpenRef = useRef(false);\n const $ = useOverrides(overrides);\n const [isCollapsed, onCollapsedChange] = useControllableState(\n // If the composer is neither controlled nor uncontrolled, it defaults to controlled as uncollapsed.\n controlledCollapsed === undefined && defaultCollapsed === undefined\n ? false\n : controlledCollapsed,\n controlledOnCollapsedChange,\n defaultCollapsed\n );\n\n const canCommentFallback = useSyncExternalStore(\n useCallback(\n (callback) => {\n if (room === null) return () => {};\n return room.events.self.subscribeOnce(callback);\n },\n [room]\n ),\n useCallback(() => {\n return room?.getSelf()?.canComment ?? true;\n }, [room]),\n useCallback(() => true, [])\n );\n\n const permissions = useRoomPermissions(roomId);\n const canComment =\n permissions.size > 0\n ? permissions.has(Permission.CommentsWrite) ||\n permissions.has(Permission.Write)\n : canCommentFallback;\n\n const setEmptyRef = useCallback((isEmpty: boolean) => {\n isEmptyRef.current = isEmpty;\n }, []);\n\n const setEmojiPickerOpenRef = useCallback((isEmojiPickerOpen: boolean) => {\n isEmojiPickerOpenRef.current = isEmojiPickerOpen;\n }, []);\n\n const handleFocus = useCallback(\n (event: FocusEvent<HTMLFormElement>) => {\n onFocus?.(event);\n\n if (event.isDefaultPrevented()) {\n return;\n }\n\n if (isEmptyRef.current && canComment) {\n onCollapsedChange?.(false);\n }\n },\n [onCollapsedChange, onFocus, canComment]\n );\n\n const handleBlur = useCallback(\n (event: FocusEvent<HTMLFormElement>) => {\n onBlur?.(event);\n\n if (event.isDefaultPrevented()) {\n return;\n }\n\n const isOutside = !event.currentTarget.contains(\n event.relatedTarget ?? document.activeElement\n );\n\n if (isOutside && isEmptyRef.current && !isEmojiPickerOpenRef.current) {\n onCollapsedChange?.(true);\n }\n },\n [onBlur, onCollapsedChange]\n );\n\n const handleEditorClick = useCallback(\n (event: MouseEvent<HTMLDivElement>) => {\n event.stopPropagation();\n\n if (isEmptyRef.current && canComment) {\n onCollapsedChange?.(false);\n }\n },\n [onCollapsedChange, canComment]\n );\n\n const handleCommentSubmit = useCallback(\n (comment: ComposerSubmitComment, event: FormEvent<HTMLFormElement>) => {\n onComposerSubmit?.(comment, event);\n\n if (event.isDefaultPrevented()) {\n return;\n }\n\n if (commentId && threadId) {\n editComment({\n commentId,\n threadId,\n body: comment.body,\n attachments: comment.attachments,\n });\n } else if (threadId) {\n createComment({\n threadId,\n body: comment.body,\n attachments: comment.attachments,\n });\n } else {\n createThread({\n body: comment.body,\n metadata: metadata ?? {},\n attachments: comment.attachments,\n });\n }\n },\n [\n commentId,\n createComment,\n createThread,\n editComment,\n metadata,\n onComposerSubmit,\n threadId,\n ]\n );\n\n return (\n <TooltipProvider>\n <ComposerPrimitive.Form\n onComposerSubmit={handleCommentSubmit}\n className={classNames(\n \"lb-root lb-composer lb-composer-form\",\n className\n )}\n dir={$.dir}\n {...props}\n ref={forwardedRef}\n data-collapsed={isCollapsed ? \"\" : undefined}\n onFocus={handleFocus}\n onBlur={handleBlur}\n disabled={disabled || !canComment}\n defaultAttachments={defaultAttachments}\n pasteFilesAsAttachments={showAttachments}\n preventUnsavedChanges={preventUnsavedComposerChanges}\n roomId={roomId}\n >\n <ComposerEditorContainer\n defaultValue={defaultValue}\n actions={actions}\n overrides={overrides}\n isCollapsed={isCollapsed}\n showAttachments={showAttachments}\n showAttribution={showAttribution}\n showFormattingControls={showFormattingControls}\n hasResolveMentionSuggestions={hasResolveMentionSuggestions}\n onEmptyChange={setEmptyRef}\n onEmojiPickerOpenChange={setEmojiPickerOpenRef}\n onEditorClick={handleEditorClick}\n autoFocus={autoFocus}\n disabled={disabled}\n />\n </ComposerPrimitive.Form>\n </TooltipProvider>\n );\n }\n) as <M extends BaseMetadata = DM>(\n props: ComposerProps<M> & RefAttributes<HTMLFormElement>\n) => JSX.Element;\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAqOA;AAA2C;AACzC;AACA;AACA;AACA;AAEF;AACE;AAEA;AACE;AAAqB;AAGvB;AAAoB;AAEhB;AAEA;AACE;AACA;AAAc;AAChB;AACF;AACuB;AAGzB;AACG;AAAiC;AAC/B;AAC6D;AAC7C;AACN;AACG;AACO;AACf;AACN;AAGN;AAEA;AAAyC;AACvC;AACA;AACA;AACA;AAEF;AACE;AAEA;AACE;AAAqB;AAGvB;AACE;AAAsB;AAGxB;AACG;AAA2B;AAA0B;AACnD;AAAiC;AAC/B;AAA0B;AACxB;AAC6D;AAC7C;AACN;AACG;AACK;AACb;AACN;AACF;AACF;AAGN;AAEA;AAAyC;AACvC;AACA;AACA;AAEF;AACE;AACE;AAAqB;AAGvB;AACE;AAAsB;AAGxB;AACG;AAAiC;AAC/B;AAAqC;AACnC;AAC6D;AAC7C;AACN;AACG;AACU;AAClB;AACN;AACF;AAGN;AAEA;AACE;AACG;AAAoC;AAClC;AAAA;AACA;AAAK;AAAgB;AAAA;AAG5B;AAEA;AAAoC;AAEpC;AACE;AACG;AAAwC;AACtC;AAA4C;AAExC;AAEW;AACH;AAEP;AAAC;AACC;AACU;AACZ;AACC;AACC;AACU;AACZ;AAAA;AAEH;AACH;AAGN;AAEA;AAAoB;AAClB;AACA;AACA;AACA;AAEF;AACE;AACA;AACE;AAAkC;AAGpC;AACG;AACU;AACT;AAC2C;AAE1C;AAA6B;AAAmB;AAAK;AACnD;AAAmB;AAAe;AAAU;AAC1C;AACH;AACF;AAGN;AAMA;AAAiC;AAClB;AAAgB;AAAgB;AAAwB;AAAI;AAEtE;AAAgB;AAAkB;AAA0B;AAAI;AAGhE;AACM;AACI;AACgB;AAC3B;AAEW;AAAgB;AAAgB;AAAwB;AACvE;AAEA;AAIA;AACE;AACG;AAA4C;AAC1C;AAGP;AAEA;AACE;AACG;AAAuB;AAAsB;AAC3C;AAGP;AAWA;AAAgC;AAC9B;AACA;AACA;AAEF;AACE;AACA;AAEA;AACE;AAA8B;AAGhC;AACG;AAC0D;AACrD;AACJ;AACe;AACK;AACpB;AACA;AAGN;AAEA;AAA6B;AAC3B;AACA;AAEF;AACE;AAEA;AACE;AAAO;AAGT;AACG;AAC2D;AACtD;AAEH;AAAc;AAEX;AACG;AAEC;AACA;AACF;AAEH;AACH;AAGN;AAEA;AAA2D;AAChD;AACW;AAEtB;AAEA;AAAiC;AACb;AACO;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEF;AACE;AACA;AACA;AACA;AACE;AAAO;AACF;AAGC;AACN;AAGF;AAAuE;AAC/C;AAGxB;AACE;AAAqB;AAGvB;AACE;AAAqB;AAGvB;AACE;AAAsB;AAGxB;AACG;AAAc;AAAmC;AAChD;AAAC;AACW;AACD;AACM;AACf;AACA;AACA;AACA;AACO;AACT;AACqB;AAAoB;AAAsB;AAE5D;AAAc;AACb;AAAC;AAAc;AACZ;AACE;AACU;AACT;AACF;AAED;AACU;AACW;AACpB;AACF;AAEG;AACU;AACT;AACF;AAAA;AAEJ;AACiC;AAChC;AAAc;AAEX;AACG;AAA2B;AAAwB;AACjD;AAAgC;AAC9B;AACgB;AACN;AACC;AACF;AACM;AACE;AAClB;AACF;AACF;AACF;AAEJ;AAAA;AACF;AAGC;AAAc;AACZ;AAAc;AACb;AAAgB;AACb;AAAA;AACL;AACF;AAAA;AAIR;AAEa;AAQN;AAAiB;AAEpB;AACE;AACA;AACA;AACA;AACA;AACA;AACW;AACX;AACmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACkB;AACO;AACzB;AACQ;AACL;AAIL;AAEA;AACA;AACE;AAAU;AACR;AACF;AAGF;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAyC;AAInC;AACJ;AACA;AAGF;AAA2B;AACzB;AAEI;AAAmB;AAAa;AAChC;AAA8C;AAChD;AACK;AACP;AAEE;AAAsC;AAC/B;AACiB;AAG5B;AACA;AAMA;AACE;AAAqB;AAGvB;AACE;AAA+B;AAGjC;AAAoB;AAEhB;AAEA;AACE;AAAA;AAGF;AACE;AAAyB;AAC3B;AACF;AACuC;AAGzC;AAAmB;AAEf;AAEA;AACE;AAAA;AAGF;AAAuC;AACL;AAGlC;AACE;AAAwB;AAC1B;AACF;AAC0B;AAG5B;AAA0B;AAEtB;AAEA;AACE;AAAyB;AAC3B;AACF;AAC8B;AAGhC;AAA4B;AAExB;AAEA;AACE;AAAA;AAGF;AACE;AAAY;AACV;AACA;AACc;AACO;AACtB;AAED;AAAc;AACZ;AACc;AACO;AACtB;AAED;AAAa;AACG;AACS;AACF;AACtB;AACH;AACF;AACA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACF;AAGF;AACG;AACE;AACmB;AACP;AACT;AACA;AACF;AACO;AACH;AACC;AAC8B;AAC1B;AACD;AACe;AACvB;AACyB;AACF;AACvB;AAEC;AACC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACe;AACU;AACV;AACf;AACA;AACF;AACF;AACF;AAGN;;;"}
|
|
1
|
+
{"version":3,"file":"Composer.js","sources":["../../src/components/Composer.tsx"],"sourcesContent":["\"use client\";\n\nimport type {\n BaseMetadata,\n CommentAttachment,\n CommentMixedAttachment,\n DM,\n} from \"@liveblocks/core\";\nimport { Permission } from \"@liveblocks/core\";\nimport {\n useCreateRoomComment,\n useCreateRoomThread,\n useEditRoomComment,\n useLayoutEffect,\n useResolveMentionSuggestions,\n useRoomOrNull,\n useRoomPermissions,\n} from \"@liveblocks/react/_private\";\nimport type {\n ComponentPropsWithoutRef,\n ComponentType,\n FocusEvent,\n FormEvent,\n ForwardedRef,\n MouseEvent,\n PropsWithChildren,\n ReactNode,\n RefAttributes,\n SyntheticEvent,\n} from \"react\";\nimport {\n createContext,\n forwardRef,\n useCallback,\n useMemo,\n useRef,\n useSyncExternalStore,\n} from \"react\";\n\nimport { useLiveblocksUIConfig } from \"../config\";\nimport { FLOATING_ELEMENT_SIDE_OFFSET } from \"../constants\";\nimport { AttachmentIcon } from \"../icons/Attachment\";\nimport { BoldIcon } from \"../icons/Bold\";\nimport { CodeIcon } from \"../icons/Code\";\nimport { EmojiIcon } from \"../icons/Emoji\";\nimport { ItalicIcon } from \"../icons/Italic\";\nimport { MentionIcon } from \"../icons/Mention\";\nimport { SendIcon } from \"../icons/Send\";\nimport { StrikethroughIcon } from \"../icons/Strikethrough\";\nimport type { ComposerOverrides, GlobalOverrides } from \"../overrides\";\nimport { useOverrides } from \"../overrides\";\nimport * as ComposerPrimitive from \"../primitives/Composer\";\nimport {\n useComposer,\n useComposerAttachmentsContext,\n useComposerEditorContext,\n} from \"../primitives/Composer/contexts\";\nimport type {\n ComposerEditorComponents,\n ComposerEditorLinkProps,\n ComposerEditorMentionProps,\n ComposerEditorMentionSuggestionsProps,\n ComposerEditorProps,\n ComposerFormProps,\n ComposerMarkToggleProps,\n ComposerSubmitComment,\n} from \"../primitives/Composer/types\";\nimport { useComposerAttachmentsDropArea } from \"../primitives/Composer/utils\";\nimport { MENTION_CHARACTER } from \"../slate/plugins/mentions\";\nimport type { ComposerBodyMark } from \"../types\";\nimport { classNames } from \"../utils/class-names\";\nimport { useControllableState } from \"../utils/use-controllable-state\";\nimport { FileAttachment } from \"./internal/Attachment\";\nimport { Attribution } from \"./internal/Attribution\";\nimport { Avatar } from \"./internal/Avatar\";\nimport { Button } from \"./internal/Button\";\nimport type { EmojiPickerProps } from \"./internal/EmojiPicker\";\nimport { EmojiPicker, EmojiPickerTrigger } from \"./internal/EmojiPicker\";\nimport { ShortcutTooltip, Tooltip, TooltipProvider } from \"./internal/Tooltip\";\nimport { User } from \"./internal/User\";\n\ninterface EditorActionProps extends ComponentPropsWithoutRef<\"button\"> {\n label: string;\n tooltipLabel?: string;\n}\n\ninterface EmojiEditorActionProps extends EditorActionProps {\n onPickerOpenChange?: EmojiPickerProps[\"onOpenChange\"];\n}\n\ninterface MarkToggleProps extends ComposerMarkToggleProps {\n icon?: ReactNode;\n shortcut?: string;\n}\n\ntype ComposerCreateThreadProps<M extends BaseMetadata> = {\n threadId?: never;\n commentId?: never;\n\n /**\n * The metadata of the thread to create.\n */\n metadata?: M;\n};\n\ntype ComposerCreateCommentProps = {\n /**\n * The ID of the thread to reply to.\n */\n threadId: string;\n commentId?: never;\n metadata?: never;\n};\n\ntype ComposerEditCommentProps = {\n /**\n * The ID of the thread to edit a comment in.\n */\n threadId: string;\n\n /**\n * The ID of the comment to edit.\n */\n commentId: string;\n metadata?: never;\n};\n\nexport type ComposerProps<M extends BaseMetadata = DM> = Omit<\n ComponentPropsWithoutRef<\"form\">,\n \"defaultValue\"\n> &\n (\n | ComposerCreateThreadProps<M>\n | ComposerCreateCommentProps\n | ComposerEditCommentProps\n ) & {\n /**\n * The event handler called when the composer is submitted.\n */\n onComposerSubmit?: (\n comment: ComposerSubmitComment,\n event: FormEvent<HTMLFormElement>\n ) => Promise<void> | void;\n\n /**\n * The composer's initial value.\n */\n defaultValue?: ComposerEditorProps[\"defaultValue\"];\n\n /**\n * The composer's initial attachments.\n */\n defaultAttachments?: CommentAttachment[];\n\n /**\n * Whether the composer is collapsed. Setting a value will make the composer controlled.\n */\n collapsed?: boolean;\n\n /**\n * The event handler called when the collapsed state of the composer changes.\n */\n onCollapsedChange?: (collapsed: boolean) => void;\n\n /**\n * Whether the composer is initially collapsed. Setting a value will make the composer uncontrolled.\n */\n defaultCollapsed?: boolean;\n\n /**\n * Whether to show and allow adding attachments.\n */\n showAttachments?: boolean;\n\n /**\n * Whether to show formatting controls (e.g. a floating toolbar with formatting toggles when selecting text)\n */\n showFormattingControls?: boolean;\n\n /**\n * Whether the composer is disabled.\n */\n disabled?: ComposerFormProps[\"disabled\"];\n\n /**\n * Whether to focus the composer on mount.\n */\n autoFocus?: ComposerEditorProps[\"autoFocus\"];\n\n /**\n * Override the component's strings.\n */\n overrides?: Partial<GlobalOverrides & ComposerOverrides>;\n\n /**\n * @internal\n */\n actions?: ReactNode;\n\n /**\n * @internal\n */\n showAttribution?: boolean;\n\n /**\n * @internal\n */\n roomId?: string;\n };\n\ninterface ComposerEditorContainerProps\n extends Pick<\n ComposerProps,\n | \"defaultValue\"\n | \"showAttachments\"\n | \"showFormattingControls\"\n | \"showAttribution\"\n | \"overrides\"\n | \"actions\"\n | \"autoFocus\"\n | \"disabled\"\n > {\n isCollapsed: boolean | undefined;\n onEmptyChange: (isEmpty: boolean) => void;\n hasResolveMentionSuggestions: boolean;\n onEmojiPickerOpenChange: (isOpen: boolean) => void;\n onEditorClick: (event: MouseEvent<HTMLDivElement>) => void;\n}\n\nfunction ComposerInsertMentionEditorAction({\n label,\n tooltipLabel,\n className,\n onClick,\n ...props\n}: EditorActionProps) {\n const { createMention } = useComposer();\n\n const preventDefault = useCallback((event: SyntheticEvent) => {\n event.preventDefault();\n }, []);\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n\n if (!event.isDefaultPrevented()) {\n event.stopPropagation();\n createMention();\n }\n },\n [createMention, onClick]\n );\n\n return (\n <Tooltip content={tooltipLabel ?? label}>\n <Button\n className={classNames(\"lb-composer-editor-action\", className)}\n onPointerDown={preventDefault}\n onClick={handleClick}\n aria-label={label}\n icon={<MentionIcon />}\n {...props}\n />\n </Tooltip>\n );\n}\n\nfunction ComposerInsertEmojiEditorAction({\n label,\n tooltipLabel,\n onPickerOpenChange,\n className,\n ...props\n}: EmojiEditorActionProps) {\n const { insertText } = useComposer();\n\n const preventDefault = useCallback((event: SyntheticEvent) => {\n event.preventDefault();\n }, []);\n\n const stopPropagation = useCallback((event: SyntheticEvent) => {\n event.stopPropagation();\n }, []);\n\n return (\n <EmojiPicker onEmojiSelect={insertText} onOpenChange={onPickerOpenChange}>\n <Tooltip content={tooltipLabel ?? label}>\n <EmojiPickerTrigger asChild>\n <Button\n className={classNames(\"lb-composer-editor-action\", className)}\n onPointerDown={preventDefault}\n onClick={stopPropagation}\n aria-label={label}\n icon={<EmojiIcon />}\n {...props}\n />\n </EmojiPickerTrigger>\n </Tooltip>\n </EmojiPicker>\n );\n}\n\nfunction ComposerAttachFilesEditorAction({\n label,\n tooltipLabel,\n className,\n ...props\n}: EditorActionProps) {\n const preventDefault = useCallback((event: SyntheticEvent) => {\n event.preventDefault();\n }, []);\n\n const stopPropagation = useCallback((event: SyntheticEvent) => {\n event.stopPropagation();\n }, []);\n\n return (\n <Tooltip content={tooltipLabel ?? label}>\n <ComposerPrimitive.AttachFiles asChild>\n <Button\n className={classNames(\"lb-composer-editor-action\", className)}\n onPointerDown={preventDefault}\n onClick={stopPropagation}\n aria-label={label}\n icon={<AttachmentIcon />}\n {...props}\n />\n </ComposerPrimitive.AttachFiles>\n </Tooltip>\n );\n}\n\nfunction ComposerMention({ userId }: ComposerEditorMentionProps) {\n return (\n <ComposerPrimitive.Mention className=\"lb-composer-mention\">\n {MENTION_CHARACTER}\n <User userId={userId} />\n </ComposerPrimitive.Mention>\n );\n}\n\nfunction ComposerMentionSuggestions({\n userIds,\n}: ComposerEditorMentionSuggestionsProps) {\n return userIds.length > 0 ? (\n <ComposerPrimitive.Suggestions className=\"lb-root lb-portal lb-elevation lb-composer-suggestions lb-composer-mention-suggestions\">\n <ComposerPrimitive.SuggestionsList className=\"lb-composer-suggestions-list lb-composer-mention-suggestions-list\">\n {userIds.map((userId) => (\n <ComposerPrimitive.SuggestionsListItem\n key={userId}\n className=\"lb-composer-suggestions-list-item lb-composer-mention-suggestion\"\n value={userId}\n >\n <Avatar\n userId={userId}\n className=\"lb-composer-mention-suggestion-avatar\"\n />\n <User\n userId={userId}\n className=\"lb-composer-mention-suggestion-user\"\n />\n </ComposerPrimitive.SuggestionsListItem>\n ))}\n </ComposerPrimitive.SuggestionsList>\n </ComposerPrimitive.Suggestions>\n ) : null;\n}\n\nfunction MarkToggle({\n mark,\n icon,\n shortcut,\n children,\n ...props\n}: MarkToggleProps) {\n const $ = useOverrides();\n const label = useMemo(() => {\n return $.COMPOSER_TOGGLE_MARK(mark);\n }, [$, mark]);\n\n return (\n <ShortcutTooltip\n content={label}\n shortcut={shortcut}\n sideOffset={FLOATING_ELEMENT_SIDE_OFFSET + 2}\n >\n <ComposerPrimitive.MarkToggle mark={mark} asChild {...props}>\n <Button aria-label={label} variant=\"toolbar\" icon={icon}>\n {children}\n </Button>\n </ComposerPrimitive.MarkToggle>\n </ShortcutTooltip>\n );\n}\n\ntype MarkToggles = {\n [K in ComposerBodyMark]: ComponentType<PropsWithChildren>;\n};\n\nconst markToggles: MarkToggles = {\n bold: () => <MarkToggle mark=\"bold\" shortcut=\"Mod-B\" icon={<BoldIcon />} />,\n italic: () => (\n <MarkToggle mark=\"italic\" shortcut=\"Mod-I\" icon={<ItalicIcon />} />\n ),\n strikethrough: () => (\n <MarkToggle\n mark=\"strikethrough\"\n shortcut=\"Mod-Shift-S\"\n icon={<StrikethroughIcon />}\n />\n ),\n code: () => <MarkToggle mark=\"code\" shortcut=\"Mod-E\" icon={<CodeIcon />} />,\n};\n\nconst markTogglesList = Object.entries(markToggles).map(([mark, Toggle]) => (\n <Toggle key={mark} />\n));\n\nfunction ComposerFloatingToolbar() {\n return (\n <ComposerPrimitive.FloatingToolbar className=\"lb-root lb-portal lb-elevation lb-composer-floating-toolbar\">\n {markTogglesList}\n </ComposerPrimitive.FloatingToolbar>\n );\n}\n\nfunction ComposerLink({ href, children }: ComposerEditorLinkProps) {\n return (\n <ComposerPrimitive.Link href={href} className=\"lb-composer-link\">\n {children}\n </ComposerPrimitive.Link>\n );\n}\n\ninterface ComposerAttachmentsProps extends ComponentPropsWithoutRef<\"div\"> {\n overrides?: Partial<GlobalOverrides & ComposerOverrides>;\n}\n\ninterface ComposerFileAttachmentProps extends ComponentPropsWithoutRef<\"div\"> {\n attachment: CommentMixedAttachment;\n overrides?: Partial<GlobalOverrides & ComposerOverrides>;\n}\n\nfunction ComposerFileAttachment({\n attachment,\n className,\n overrides,\n ...props\n}: ComposerFileAttachmentProps) {\n const { removeAttachment } = useComposer();\n const { roomId } = useComposerEditorContext();\n\n const handleDeleteClick = useCallback(() => {\n removeAttachment(attachment.id);\n }, [attachment.id, removeAttachment]);\n\n return (\n <FileAttachment\n className={classNames(\"lb-composer-attachment\", className)}\n {...props}\n attachment={attachment}\n onDeleteClick={handleDeleteClick}\n preventFocusOnDelete\n overrides={overrides}\n roomId={roomId}\n />\n );\n}\n\nfunction ComposerAttachments({\n overrides,\n className,\n ...props\n}: ComposerAttachmentsProps) {\n const { attachments } = useComposer();\n\n if (attachments.length === 0) {\n return null;\n }\n\n return (\n <div\n className={classNames(\"lb-composer-attachments\", className)}\n {...props}\n >\n <div className=\"lb-attachments\">\n {attachments.map((attachment) => {\n return (\n <ComposerFileAttachment\n key={attachment.id}\n attachment={attachment}\n overrides={overrides}\n />\n );\n })}\n </div>\n </div>\n );\n}\n\nconst editorRequiredComponents: ComposerEditorComponents = {\n Mention: ComposerMention,\n MentionSuggestions: ComposerMentionSuggestions,\n Link: ComposerLink,\n};\n\nfunction ComposerEditorContainer({\n showAttachments = true,\n showFormattingControls = true,\n showAttribution,\n defaultValue,\n isCollapsed,\n overrides,\n actions,\n autoFocus,\n disabled,\n hasResolveMentionSuggestions,\n onEmojiPickerOpenChange,\n onEmptyChange,\n onEditorClick,\n}: ComposerEditorContainerProps) {\n const { isEmpty } = useComposer();\n const { hasMaxAttachments } = useComposerAttachmentsContext();\n const $ = useOverrides(overrides);\n const components = useMemo(() => {\n return {\n ...editorRequiredComponents,\n FloatingToolbar: showFormattingControls\n ? ComposerFloatingToolbar\n : undefined,\n };\n }, [showFormattingControls]);\n\n const [isDraggingOver, dropAreaProps] = useComposerAttachmentsDropArea({\n disabled: disabled || hasMaxAttachments,\n });\n\n useLayoutEffect(() => {\n onEmptyChange(isEmpty);\n }, [isEmpty, onEmptyChange]);\n\n const preventDefault = useCallback((event: SyntheticEvent) => {\n event.preventDefault();\n }, []);\n\n const stopPropagation = useCallback((event: SyntheticEvent) => {\n event.stopPropagation();\n }, []);\n\n return (\n <div className=\"lb-composer-editor-container\" {...dropAreaProps}>\n <ComposerPrimitive.Editor\n className=\"lb-composer-editor\"\n onClick={onEditorClick}\n placeholder={$.COMPOSER_PLACEHOLDER}\n defaultValue={defaultValue}\n autoFocus={autoFocus}\n components={components}\n disabled={disabled}\n dir={$.dir}\n />\n {showAttachments && <ComposerAttachments overrides={overrides} />}\n {(!isCollapsed || isDraggingOver) && (\n <div className=\"lb-composer-footer\">\n <div className=\"lb-composer-editor-actions\">\n {hasResolveMentionSuggestions && (\n <ComposerInsertMentionEditorAction\n label={$.COMPOSER_INSERT_MENTION}\n disabled={disabled}\n />\n )}\n <ComposerInsertEmojiEditorAction\n label={$.COMPOSER_INSERT_EMOJI}\n onPickerOpenChange={onEmojiPickerOpenChange}\n disabled={disabled}\n />\n {showAttachments && (\n <ComposerAttachFilesEditorAction\n label={$.COMPOSER_ATTACH_FILES}\n disabled={disabled}\n />\n )}\n </div>\n {showAttribution && <Attribution />}\n <div className=\"lb-composer-actions\">\n {actions ?? (\n <>\n <ShortcutTooltip content={$.COMPOSER_SEND} shortcut=\"Enter\">\n <ComposerPrimitive.Submit asChild>\n <Button\n onPointerDown={preventDefault}\n onClick={stopPropagation}\n className=\"lb-composer-action\"\n variant=\"primary\"\n aria-label={$.COMPOSER_SEND}\n icon={<SendIcon />}\n />\n </ComposerPrimitive.Submit>\n </ShortcutTooltip>\n </>\n )}\n </div>\n </div>\n )}\n {showAttachments && isDraggingOver && (\n <div className=\"lb-composer-attachments-drop-area\">\n <div className=\"lb-composer-attachments-drop-area-label\">\n <AttachmentIcon />\n {$.COMPOSER_ATTACH_FILES}\n </div>\n </div>\n )}\n </div>\n );\n}\n\nexport const ComposerRoomIdContext = createContext<string | null>(null);\n\n/**\n * Displays a composer to create comments.\n *\n * @example\n * <Composer />\n */\nexport const Composer = forwardRef(\n <M extends BaseMetadata = DM>(\n {\n threadId,\n commentId,\n metadata,\n defaultValue,\n defaultAttachments,\n onComposerSubmit,\n collapsed: controlledCollapsed,\n defaultCollapsed,\n onCollapsedChange: controlledOnCollapsedChange,\n overrides,\n actions,\n onBlur,\n className,\n onFocus,\n autoFocus,\n disabled,\n showAttachments = true,\n showFormattingControls = true,\n showAttribution,\n roomId: _roomId,\n ...props\n }: ComposerProps<M>,\n forwardedRef: ForwardedRef<HTMLFormElement>\n ) => {\n const room = useRoomOrNull();\n\n const roomId = _roomId !== undefined ? _roomId : room?.id;\n if (roomId === undefined) {\n throw new Error(\n \"Composer must be a descendant of RoomProvider component\"\n );\n }\n\n const createThread = useCreateRoomThread(roomId);\n const createComment = useCreateRoomComment(roomId);\n const editComment = useEditRoomComment(roomId);\n const { preventUnsavedComposerChanges } = useLiveblocksUIConfig();\n const hasResolveMentionSuggestions =\n useResolveMentionSuggestions() !== undefined;\n const isEmptyRef = useRef(true);\n const isEmojiPickerOpenRef = useRef(false);\n const $ = useOverrides(overrides);\n const [isCollapsed, onCollapsedChange] = useControllableState(\n // If the composer is neither controlled nor uncontrolled, it defaults to controlled as uncollapsed.\n controlledCollapsed === undefined && defaultCollapsed === undefined\n ? false\n : controlledCollapsed,\n controlledOnCollapsedChange,\n defaultCollapsed\n );\n\n const canCommentFallback = useSyncExternalStore(\n useCallback(\n (callback) => {\n if (room === null) return () => {};\n return room.events.self.subscribeOnce(callback);\n },\n [room]\n ),\n useCallback(() => {\n return room?.getSelf()?.canComment ?? true;\n }, [room]),\n useCallback(() => true, [])\n );\n\n const permissions = useRoomPermissions(roomId);\n const canComment =\n permissions.size > 0\n ? permissions.has(Permission.CommentsWrite) ||\n permissions.has(Permission.Write)\n : canCommentFallback;\n\n const setEmptyRef = useCallback((isEmpty: boolean) => {\n isEmptyRef.current = isEmpty;\n }, []);\n\n const setEmojiPickerOpenRef = useCallback((isEmojiPickerOpen: boolean) => {\n isEmojiPickerOpenRef.current = isEmojiPickerOpen;\n }, []);\n\n const handleFocus = useCallback(\n (event: FocusEvent<HTMLFormElement>) => {\n onFocus?.(event);\n\n if (event.isDefaultPrevented()) {\n return;\n }\n\n if (isEmptyRef.current && canComment) {\n onCollapsedChange?.(false);\n }\n },\n [onCollapsedChange, onFocus, canComment]\n );\n\n const handleBlur = useCallback(\n (event: FocusEvent<HTMLFormElement>) => {\n onBlur?.(event);\n\n if (event.isDefaultPrevented()) {\n return;\n }\n\n const isOutside = !event.currentTarget.contains(\n event.relatedTarget ?? document.activeElement\n );\n\n if (isOutside && isEmptyRef.current && !isEmojiPickerOpenRef.current) {\n onCollapsedChange?.(true);\n }\n },\n [onBlur, onCollapsedChange]\n );\n\n const handleEditorClick = useCallback(\n (event: MouseEvent<HTMLDivElement>) => {\n event.stopPropagation();\n\n if (isEmptyRef.current && canComment) {\n onCollapsedChange?.(false);\n }\n },\n [onCollapsedChange, canComment]\n );\n\n const handleCommentSubmit = useCallback(\n (comment: ComposerSubmitComment, event: FormEvent<HTMLFormElement>) => {\n onComposerSubmit?.(comment, event);\n\n if (event.isDefaultPrevented()) {\n return;\n }\n\n if (commentId && threadId) {\n editComment({\n commentId,\n threadId,\n body: comment.body,\n attachments: comment.attachments,\n });\n } else if (threadId) {\n createComment({\n threadId,\n body: comment.body,\n attachments: comment.attachments,\n });\n } else {\n createThread({\n body: comment.body,\n metadata: metadata ?? {},\n attachments: comment.attachments,\n });\n }\n },\n [\n commentId,\n createComment,\n createThread,\n editComment,\n metadata,\n onComposerSubmit,\n threadId,\n ]\n );\n\n return (\n <TooltipProvider>\n <ComposerPrimitive.Form\n onComposerSubmit={handleCommentSubmit}\n className={classNames(\n \"lb-root lb-composer lb-composer-form\",\n className\n )}\n dir={$.dir}\n {...props}\n ref={forwardedRef}\n data-collapsed={isCollapsed ? \"\" : undefined}\n onFocus={handleFocus}\n onBlur={handleBlur}\n disabled={disabled || !canComment}\n defaultAttachments={defaultAttachments}\n pasteFilesAsAttachments={showAttachments}\n preventUnsavedChanges={preventUnsavedComposerChanges}\n roomId={roomId}\n >\n <ComposerEditorContainer\n defaultValue={defaultValue}\n actions={actions}\n overrides={overrides}\n isCollapsed={isCollapsed}\n showAttachments={showAttachments}\n showAttribution={showAttribution}\n showFormattingControls={showFormattingControls}\n hasResolveMentionSuggestions={hasResolveMentionSuggestions}\n onEmptyChange={setEmptyRef}\n onEmojiPickerOpenChange={setEmojiPickerOpenRef}\n onEditorClick={handleEditorClick}\n autoFocus={autoFocus}\n disabled={disabled}\n />\n </ComposerPrimitive.Form>\n </TooltipProvider>\n );\n }\n) as <M extends BaseMetadata = DM>(\n props: ComposerProps<M> & RefAttributes<HTMLFormElement>\n) => JSX.Element;\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAqOA;AAA2C;AACzC;AACA;AACA;AACA;AAEF;AACE;AAEA;AACE;AAAqB;AAGvB;AAAoB;AAEhB;AAEA;AACE;AACA;AAAc;AAChB;AACF;AACuB;AAGzB;AACG;AAAiC;AAC/B;AAC6D;AAC7C;AACN;AACG;AACO;AACf;AACN;AAGN;AAEA;AAAyC;AACvC;AACA;AACA;AACA;AAEF;AACE;AAEA;AACE;AAAqB;AAGvB;AACE;AAAsB;AAGxB;AACG;AAA2B;AAA0B;AACnD;AAAiC;AAC/B;AAA0B;AACxB;AAC6D;AAC7C;AACN;AACG;AACK;AACb;AACN;AACF;AACF;AAGN;AAEA;AAAyC;AACvC;AACA;AACA;AAEF;AACE;AACE;AAAqB;AAGvB;AACE;AAAsB;AAGxB;AACG;AAAiC;AAC/B;AAAqC;AACnC;AAC6D;AAC7C;AACN;AACG;AACU;AAClB;AACN;AACF;AAGN;AAEA;AACE;AACG;AAAoC;AAClC;AAAA;AACA;AAAK;AAAgB;AAAA;AAG5B;AAEA;AAAoC;AAEpC;AACE;AACG;AAAwC;AACtC;AAA4C;AAExC;AAEW;AACH;AAEP;AAAC;AACC;AACU;AACZ;AACC;AACC;AACU;AACZ;AAAA;AAEH;AACH;AAGN;AAEA;AAAoB;AAClB;AACA;AACA;AACA;AAEF;AACE;AACA;AACE;AAAkC;AAGpC;AACG;AACU;AACT;AAC2C;AAE1C;AAA6B;AAAmB;AAAK;AACnD;AAAmB;AAAe;AAAU;AAC1C;AACH;AACF;AAGN;AAMA;AAAiC;AAClB;AAAgB;AAAgB;AAAwB;AAAI;AAEtE;AAAgB;AAAkB;AAA0B;AAAI;AAGhE;AACM;AACI;AACgB;AAC3B;AAEW;AAAgB;AAAgB;AAAwB;AACvE;AAEA;AAIA;AACE;AACG;AAA4C;AAC1C;AAGP;AAEA;AACE;AACG;AAAuB;AAAsB;AAC3C;AAGP;AAWA;AAAgC;AAC9B;AACA;AACA;AAEF;AACE;AACA;AAEA;AACE;AAA8B;AAGhC;AACG;AAC0D;AACrD;AACJ;AACe;AACK;AACpB;AACA;AAGN;AAEA;AAA6B;AAC3B;AACA;AAEF;AACE;AAEA;AACE;AAAO;AAGT;AACG;AAC2D;AACtD;AAEH;AAAc;AAEX;AACG;AAEC;AACA;AACF;AAEH;AACH;AAGN;AAEA;AAA2D;AAChD;AACW;AAEtB;AAEA;AAAiC;AACb;AACO;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEF;AACE;AACA;AACA;AACA;AACE;AAAO;AACF;AAGC;AACN;AAGF;AAAuE;AAC/C;AAGxB;AACE;AAAqB;AAGvB;AACE;AAAqB;AAGvB;AACE;AAAsB;AAGxB;AACG;AAAc;AAAmC;AAChD;AAAC;AACW;AACD;AACM;AACf;AACA;AACA;AACA;AACO;AACT;AACqB;AAAoB;AAAsB;AAE5D;AAAc;AACb;AAAC;AAAc;AACZ;AACE;AACU;AACT;AACF;AAED;AACU;AACW;AACpB;AACF;AAEG;AACU;AACT;AACF;AAAA;AAEJ;AACiC;AAChC;AAAc;AAEX;AACG;AAA2B;AAAwB;AACjD;AAAgC;AAC9B;AACgB;AACN;AACC;AACF;AACM;AACE;AAClB;AACF;AACF;AACF;AAEJ;AAAA;AACF;AAGC;AAAc;AACZ;AAAc;AACb;AAAgB;AACb;AAAA;AACL;AACF;AAAA;AAIR;AAEa;AAQN;AAAiB;AAEpB;AACE;AACA;AACA;AACA;AACA;AACA;AACW;AACX;AACmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACkB;AACO;AACzB;AACQ;AACL;AAIL;AAEA;AACA;AACE;AAAU;AACR;AACF;AAGF;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAyC;AAInC;AACJ;AACA;AAGF;AAA2B;AACzB;AAEI;AAAmB;AAAa;AAChC;AAA8C;AAChD;AACK;AACP;AAEE;AAAsC;AAC/B;AACiB;AAG5B;AACA;AAMA;AACE;AAAqB;AAGvB;AACE;AAA+B;AAGjC;AAAoB;AAEhB;AAEA;AACE;AAAA;AAGF;AACE;AAAyB;AAC3B;AACF;AACuC;AAGzC;AAAmB;AAEf;AAEA;AACE;AAAA;AAGF;AAAuC;AACL;AAGlC;AACE;AAAwB;AAC1B;AACF;AAC0B;AAG5B;AAA0B;AAEtB;AAEA;AACE;AAAyB;AAC3B;AACF;AAC8B;AAGhC;AAA4B;AAExB;AAEA;AACE;AAAA;AAGF;AACE;AAAY;AACV;AACA;AACc;AACO;AACtB;AAED;AAAc;AACZ;AACc;AACO;AACtB;AAED;AAAa;AACG;AACS;AACF;AACtB;AACH;AACF;AACA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACF;AAGF;AACG;AACE;AACmB;AACP;AACT;AACA;AACF;AACO;AACH;AACC;AAC8B;AAC1B;AACD;AACe;AACvB;AACyB;AACF;AACvB;AAEC;AACC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACe;AACU;AACV;AACf;AACA;AACF;AACF;AACF;AAGN;;"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
5
|
+
var react = require('react');
|
|
6
|
+
var overrides = require('../overrides.cjs');
|
|
7
|
+
require('../primitives/index.cjs');
|
|
8
|
+
var classNames = require('../utils/class-names.cjs');
|
|
9
|
+
var List = require('./internal/List.cjs');
|
|
10
|
+
var User = require('./internal/User.cjs');
|
|
11
|
+
var Timestamp = require('../primitives/Timestamp.cjs');
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
const AUTHORS_TRUNCATE = 3;
|
|
15
|
+
const HistoryVersionSummary = react.forwardRef(({ version, selected, className, ...props }, forwardedRef) => {
|
|
16
|
+
const $ = overrides.useOverrides();
|
|
17
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("button", {
|
|
18
|
+
...props,
|
|
19
|
+
className: classNames.classNames("lb-root lb-history-version-summary", className),
|
|
20
|
+
ref: forwardedRef,
|
|
21
|
+
"data-selected": selected ? "" : void 0,
|
|
22
|
+
children: [
|
|
23
|
+
/* @__PURE__ */ jsxRuntime.jsx(Timestamp.Timestamp, {
|
|
24
|
+
locale: $.locale,
|
|
25
|
+
date: version.createdAt,
|
|
26
|
+
className: "lb-date lb-history-version-summary-date"
|
|
27
|
+
}),
|
|
28
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", {
|
|
29
|
+
className: "lb-history-version-summary-authors",
|
|
30
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(List.List, {
|
|
31
|
+
values: version.authors.map((author) => /* @__PURE__ */ jsxRuntime.jsx(User.User, {
|
|
32
|
+
userId: author.id,
|
|
33
|
+
replaceSelf: true
|
|
34
|
+
}, author.id)),
|
|
35
|
+
formatRemaining: $.LIST_REMAINING_USERS,
|
|
36
|
+
truncate: AUTHORS_TRUNCATE,
|
|
37
|
+
locale: $.locale
|
|
38
|
+
})
|
|
39
|
+
})
|
|
40
|
+
]
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
exports.HistoryVersionSummary = HistoryVersionSummary;
|
|
45
|
+
//# sourceMappingURL=HistoryVersionSummary.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HistoryVersionSummary.
|
|
1
|
+
{"version":3,"file":"HistoryVersionSummary.cjs","sources":["../../src/components/HistoryVersionSummary.tsx"],"sourcesContent":["\"use client\";\n\nimport type { HistoryVersion } from \"@liveblocks/core\";\nimport type { ComponentPropsWithoutRef } from \"react\";\nimport { forwardRef } from \"react\";\n\nimport { useOverrides } from \"../overrides\";\nimport { Timestamp } from \"../primitives\";\nimport { classNames } from \"../utils/class-names\";\nimport { List } from \"./internal/List\";\nimport { User } from \"./internal/User\";\n\nconst AUTHORS_TRUNCATE = 3;\n\nexport interface HistoryVersionSummaryProps\n extends ComponentPropsWithoutRef<\"button\"> {\n version: HistoryVersion;\n selected?: boolean;\n}\n\n/**\n * Displays some information about a version.\n *\n * @example\n * <HistoryVersionSummary version={version} />\n */\nexport const HistoryVersionSummary = forwardRef<\n HTMLButtonElement,\n HistoryVersionSummaryProps\n>(({ version, selected, className, ...props }, forwardedRef) => {\n const $ = useOverrides();\n\n return (\n <button\n {...props}\n className={classNames(\"lb-root lb-history-version-summary\", className)}\n ref={forwardedRef}\n data-selected={selected ? \"\" : undefined}\n >\n <Timestamp\n locale={$.locale}\n date={version.createdAt}\n className=\"lb-date lb-history-version-summary-date\"\n />\n <span className=\"lb-history-version-summary-authors\">\n <List\n values={version.authors.map((author) => (\n <User key={author.id} userId={author.id} replaceSelf />\n ))}\n formatRemaining={$.LIST_REMAINING_USERS}\n truncate={AUTHORS_TRUNCATE}\n locale={$.locale}\n />\n </span>\n </button>\n );\n});\n"],"names":[],"mappings":";;;;;;;;;;;;AAAA;AAYA;AAca;AAIX;AAEA;AACG;AACK;AACiE;AAChE;AAC0B;AAE/B;AAAC;AACW;AACI;AACJ;AACZ;AACC;AAAe;AACb;AAEI;AAAoC;AAAe;AACrD;AACkB;AACT;AACA;AACZ;AACF;AAAA;AAGN;;"}
|
|
@@ -1,34 +1,32 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
var User = require('./internal/User.js');
|
|
11
|
-
var Timestamp = require('../primitives/Timestamp.js');
|
|
2
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
3
|
+
import { forwardRef } from 'react';
|
|
4
|
+
import { useOverrides } from '../overrides.js';
|
|
5
|
+
import '../primitives/index.js';
|
|
6
|
+
import { classNames } from '../utils/class-names.js';
|
|
7
|
+
import { List } from './internal/List.js';
|
|
8
|
+
import { User } from './internal/User.js';
|
|
9
|
+
import { Timestamp } from '../primitives/Timestamp.js';
|
|
12
10
|
|
|
13
11
|
|
|
14
12
|
const AUTHORS_TRUNCATE = 3;
|
|
15
|
-
const HistoryVersionSummary =
|
|
16
|
-
const $ =
|
|
17
|
-
return /* @__PURE__ */
|
|
13
|
+
const HistoryVersionSummary = forwardRef(({ version, selected, className, ...props }, forwardedRef) => {
|
|
14
|
+
const $ = useOverrides();
|
|
15
|
+
return /* @__PURE__ */ jsxs("button", {
|
|
18
16
|
...props,
|
|
19
|
-
className: classNames
|
|
17
|
+
className: classNames("lb-root lb-history-version-summary", className),
|
|
20
18
|
ref: forwardedRef,
|
|
21
19
|
"data-selected": selected ? "" : void 0,
|
|
22
20
|
children: [
|
|
23
|
-
/* @__PURE__ */
|
|
21
|
+
/* @__PURE__ */ jsx(Timestamp, {
|
|
24
22
|
locale: $.locale,
|
|
25
23
|
date: version.createdAt,
|
|
26
24
|
className: "lb-date lb-history-version-summary-date"
|
|
27
25
|
}),
|
|
28
|
-
/* @__PURE__ */
|
|
26
|
+
/* @__PURE__ */ jsx("span", {
|
|
29
27
|
className: "lb-history-version-summary-authors",
|
|
30
|
-
children: /* @__PURE__ */
|
|
31
|
-
values: version.authors.map((author) => /* @__PURE__ */
|
|
28
|
+
children: /* @__PURE__ */ jsx(List, {
|
|
29
|
+
values: version.authors.map((author) => /* @__PURE__ */ jsx(User, {
|
|
32
30
|
userId: author.id,
|
|
33
31
|
replaceSelf: true
|
|
34
32
|
}, author.id)),
|
|
@@ -41,5 +39,5 @@ const HistoryVersionSummary = react.forwardRef(({ version, selected, className,
|
|
|
41
39
|
});
|
|
42
40
|
});
|
|
43
41
|
|
|
44
|
-
|
|
42
|
+
export { HistoryVersionSummary };
|
|
45
43
|
//# sourceMappingURL=HistoryVersionSummary.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HistoryVersionSummary.js","sources":["../../src/components/HistoryVersionSummary.tsx"],"sourcesContent":["\"use client\";\n\nimport type { HistoryVersion } from \"@liveblocks/core\";\nimport type { ComponentPropsWithoutRef } from \"react\";\nimport { forwardRef } from \"react\";\n\nimport { useOverrides } from \"../overrides\";\nimport { Timestamp } from \"../primitives\";\nimport { classNames } from \"../utils/class-names\";\nimport { List } from \"./internal/List\";\nimport { User } from \"./internal/User\";\n\nconst AUTHORS_TRUNCATE = 3;\n\nexport interface HistoryVersionSummaryProps\n extends ComponentPropsWithoutRef<\"button\"> {\n version: HistoryVersion;\n selected?: boolean;\n}\n\n/**\n * Displays some information about a version.\n *\n * @example\n * <HistoryVersionSummary version={version} />\n */\nexport const HistoryVersionSummary = forwardRef<\n HTMLButtonElement,\n HistoryVersionSummaryProps\n>(({ version, selected, className, ...props }, forwardedRef) => {\n const $ = useOverrides();\n\n return (\n <button\n {...props}\n className={classNames(\"lb-root lb-history-version-summary\", className)}\n ref={forwardedRef}\n data-selected={selected ? \"\" : undefined}\n >\n <Timestamp\n locale={$.locale}\n date={version.createdAt}\n className=\"lb-date lb-history-version-summary-date\"\n />\n <span className=\"lb-history-version-summary-authors\">\n <List\n values={version.authors.map((author) => (\n <User key={author.id} userId={author.id} replaceSelf />\n ))}\n formatRemaining={$.LIST_REMAINING_USERS}\n truncate={AUTHORS_TRUNCATE}\n locale={$.locale}\n />\n </span>\n </button>\n );\n});\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"HistoryVersionSummary.js","sources":["../../src/components/HistoryVersionSummary.tsx"],"sourcesContent":["\"use client\";\n\nimport type { HistoryVersion } from \"@liveblocks/core\";\nimport type { ComponentPropsWithoutRef } from \"react\";\nimport { forwardRef } from \"react\";\n\nimport { useOverrides } from \"../overrides\";\nimport { Timestamp } from \"../primitives\";\nimport { classNames } from \"../utils/class-names\";\nimport { List } from \"./internal/List\";\nimport { User } from \"./internal/User\";\n\nconst AUTHORS_TRUNCATE = 3;\n\nexport interface HistoryVersionSummaryProps\n extends ComponentPropsWithoutRef<\"button\"> {\n version: HistoryVersion;\n selected?: boolean;\n}\n\n/**\n * Displays some information about a version.\n *\n * @example\n * <HistoryVersionSummary version={version} />\n */\nexport const HistoryVersionSummary = forwardRef<\n HTMLButtonElement,\n HistoryVersionSummaryProps\n>(({ version, selected, className, ...props }, forwardedRef) => {\n const $ = useOverrides();\n\n return (\n <button\n {...props}\n className={classNames(\"lb-root lb-history-version-summary\", className)}\n ref={forwardedRef}\n data-selected={selected ? \"\" : undefined}\n >\n <Timestamp\n locale={$.locale}\n date={version.createdAt}\n className=\"lb-date lb-history-version-summary-date\"\n />\n <span className=\"lb-history-version-summary-authors\">\n <List\n values={version.authors.map((author) => (\n <User key={author.id} userId={author.id} replaceSelf />\n ))}\n formatRemaining={$.LIST_REMAINING_USERS}\n truncate={AUTHORS_TRUNCATE}\n locale={$.locale}\n />\n </span>\n </button>\n );\n});\n"],"names":[],"mappings":";;;;;;;;;;AAAA;AAYA;AAca;AAIX;AAEA;AACG;AACK;AACiE;AAChE;AAC0B;AAE/B;AAAC;AACW;AACI;AACJ;AACZ;AACC;AAAe;AACb;AAEI;AAAoC;AAAe;AACrD;AACkB;AACT;AACA;AACZ;AACF;AAAA;AAGN;;"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
5
|
+
var react = require('react');
|
|
6
|
+
var classNames = require('../utils/class-names.cjs');
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
const HistoryVersionSummaryList = react.forwardRef(({ children, className, ...props }, forwardedRef) => {
|
|
10
|
+
return /* @__PURE__ */ jsxRuntime.jsx("ol", {
|
|
11
|
+
className: classNames.classNames(
|
|
12
|
+
"lb-root lb-history-version-summary-list",
|
|
13
|
+
className
|
|
14
|
+
),
|
|
15
|
+
...props,
|
|
16
|
+
ref: forwardedRef,
|
|
17
|
+
children: react.Children.map(children, (child, index) => /* @__PURE__ */ jsxRuntime.jsx("li", {
|
|
18
|
+
className: "lb-history-version-summary-list-item",
|
|
19
|
+
children: child
|
|
20
|
+
}, index))
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
exports.HistoryVersionSummaryList = HistoryVersionSummaryList;
|
|
25
|
+
//# sourceMappingURL=HistoryVersionSummaryList.cjs.map
|
package/dist/components/{HistoryVersionSummaryList.mjs.map → HistoryVersionSummaryList.cjs.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HistoryVersionSummaryList.
|
|
1
|
+
{"version":3,"file":"HistoryVersionSummaryList.cjs","sources":["../../src/components/HistoryVersionSummaryList.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ComponentPropsWithoutRef } from \"react\";\nimport { Children, forwardRef } from \"react\";\n\nimport { classNames } from \"../utils/class-names\";\n\nexport type HistoryVersionSummaryListProps = ComponentPropsWithoutRef<\"ol\">;\n\n/**\n * Displays versions summaries as a list.\n *\n * @example\n * <HistoryVersionSummaryList>\n * {versions.map((version) => (\n * <HistoryVersionSummary key={version.id} version={version} />\n * ))}\n * </HistoryVersionSummaryList>\n */\nexport const HistoryVersionSummaryList = forwardRef<\n HTMLOListElement,\n HistoryVersionSummaryListProps\n>(({ children, className, ...props }, forwardedRef) => {\n return (\n <ol\n className={classNames(\n \"lb-root lb-history-version-summary-list\",\n className\n )}\n {...props}\n ref={forwardedRef}\n >\n {Children.map(children, (child, index) => (\n <li key={index} className=\"lb-history-version-summary-list-item\">\n {child}\n </li>\n ))}\n </ol>\n );\n});\n"],"names":[],"mappings":";;;;;;;AAAA;AAmBa;AAIX;AACG;AACY;AACT;AACA;AACF;AACI;AACC;AAGF;AAAyB;AACvB;AAEJ;AAGP;;"}
|
|
@@ -1,25 +1,23 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
|
|
2
|
+
import { jsx } from 'react/jsx-runtime';
|
|
3
|
+
import { forwardRef, Children } from 'react';
|
|
4
|
+
import { classNames } from '../utils/class-names.js';
|
|
3
5
|
|
|
4
|
-
var jsxRuntime = require('react/jsx-runtime');
|
|
5
|
-
var react = require('react');
|
|
6
|
-
var classNames = require('../utils/class-names.js');
|
|
7
6
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
className: classNames.classNames(
|
|
7
|
+
const HistoryVersionSummaryList = forwardRef(({ children, className, ...props }, forwardedRef) => {
|
|
8
|
+
return /* @__PURE__ */ jsx("ol", {
|
|
9
|
+
className: classNames(
|
|
12
10
|
"lb-root lb-history-version-summary-list",
|
|
13
11
|
className
|
|
14
12
|
),
|
|
15
13
|
...props,
|
|
16
14
|
ref: forwardedRef,
|
|
17
|
-
children:
|
|
15
|
+
children: Children.map(children, (child, index) => /* @__PURE__ */ jsx("li", {
|
|
18
16
|
className: "lb-history-version-summary-list-item",
|
|
19
17
|
children: child
|
|
20
18
|
}, index))
|
|
21
19
|
});
|
|
22
20
|
});
|
|
23
21
|
|
|
24
|
-
|
|
22
|
+
export { HistoryVersionSummaryList };
|
|
25
23
|
//# sourceMappingURL=HistoryVersionSummaryList.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HistoryVersionSummaryList.js","sources":["../../src/components/HistoryVersionSummaryList.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ComponentPropsWithoutRef } from \"react\";\nimport { Children, forwardRef } from \"react\";\n\nimport { classNames } from \"../utils/class-names\";\n\nexport type HistoryVersionSummaryListProps = ComponentPropsWithoutRef<\"ol\">;\n\n/**\n * Displays versions summaries as a list.\n *\n * @example\n * <HistoryVersionSummaryList>\n * {versions.map((version) => (\n * <HistoryVersionSummary key={version.id} version={version} />\n * ))}\n * </HistoryVersionSummaryList>\n */\nexport const HistoryVersionSummaryList = forwardRef<\n HTMLOListElement,\n HistoryVersionSummaryListProps\n>(({ children, className, ...props }, forwardedRef) => {\n return (\n <ol\n className={classNames(\n \"lb-root lb-history-version-summary-list\",\n className\n )}\n {...props}\n ref={forwardedRef}\n >\n {Children.map(children, (child, index) => (\n <li key={index} className=\"lb-history-version-summary-list-item\">\n {child}\n </li>\n ))}\n </ol>\n );\n});\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"HistoryVersionSummaryList.js","sources":["../../src/components/HistoryVersionSummaryList.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ComponentPropsWithoutRef } from \"react\";\nimport { Children, forwardRef } from \"react\";\n\nimport { classNames } from \"../utils/class-names\";\n\nexport type HistoryVersionSummaryListProps = ComponentPropsWithoutRef<\"ol\">;\n\n/**\n * Displays versions summaries as a list.\n *\n * @example\n * <HistoryVersionSummaryList>\n * {versions.map((version) => (\n * <HistoryVersionSummary key={version.id} version={version} />\n * ))}\n * </HistoryVersionSummaryList>\n */\nexport const HistoryVersionSummaryList = forwardRef<\n HTMLOListElement,\n HistoryVersionSummaryListProps\n>(({ children, className, ...props }, forwardedRef) => {\n return (\n <ol\n className={classNames(\n \"lb-root lb-history-version-summary-list\",\n className\n )}\n {...props}\n ref={forwardedRef}\n >\n {Children.map(children, (child, index) => (\n <li key={index} className=\"lb-history-version-summary-list-item\">\n {child}\n </li>\n ))}\n </ol>\n );\n});\n"],"names":[],"mappings":";;;;;AAAA;AAmBa;AAIX;AACG;AACY;AACT;AACA;AACF;AACI;AACC;AAGF;AAAyB;AACvB;AAEJ;AAGP;;"}
|