@liveblocks/react-ui 3.9.1-tiptap1 → 3.9.2-tiptap1
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/components/AiChat.cjs +133 -113
- package/dist/components/AiChat.cjs.map +1 -1
- package/dist/components/AiChat.js +133 -113
- package/dist/components/AiChat.js.map +1 -1
- package/dist/components/AiTool.cjs +120 -93
- package/dist/components/AiTool.cjs.map +1 -1
- package/dist/components/AiTool.js +120 -93
- package/dist/components/AiTool.js.map +1 -1
- package/dist/components/Comment.cjs +374 -374
- package/dist/components/Comment.cjs.map +1 -1
- package/dist/components/Comment.js +374 -374
- package/dist/components/Comment.js.map +1 -1
- package/dist/components/Composer.cjs +208 -259
- package/dist/components/Composer.cjs.map +1 -1
- package/dist/components/Composer.js +208 -259
- package/dist/components/Composer.js.map +1 -1
- package/dist/components/HistoryVersionSummary.cjs +28 -25
- package/dist/components/HistoryVersionSummary.cjs.map +1 -1
- package/dist/components/HistoryVersionSummary.js +28 -25
- package/dist/components/HistoryVersionSummary.js.map +1 -1
- package/dist/components/HistoryVersionSummaryList.cjs +9 -9
- package/dist/components/HistoryVersionSummaryList.cjs.map +1 -1
- package/dist/components/HistoryVersionSummaryList.js +9 -9
- package/dist/components/HistoryVersionSummaryList.js.map +1 -1
- package/dist/components/InboxNotification.cjs +264 -239
- package/dist/components/InboxNotification.cjs.map +1 -1
- package/dist/components/InboxNotification.js +264 -239
- package/dist/components/InboxNotification.js.map +1 -1
- package/dist/components/InboxNotificationList.cjs +19 -19
- package/dist/components/InboxNotificationList.cjs.map +1 -1
- package/dist/components/InboxNotificationList.js +19 -19
- package/dist/components/InboxNotificationList.js.map +1 -1
- package/dist/components/Thread.cjs +102 -82
- package/dist/components/Thread.cjs.map +1 -1
- package/dist/components/Thread.js +102 -82
- package/dist/components/Thread.js.map +1 -1
- package/dist/components/internal/AiChatAssistantMessage.cjs +164 -210
- package/dist/components/internal/AiChatAssistantMessage.cjs.map +1 -1
- package/dist/components/internal/AiChatAssistantMessage.js +164 -210
- package/dist/components/internal/AiChatAssistantMessage.js.map +1 -1
- package/dist/components/internal/AiChatUserMessage.cjs +29 -26
- package/dist/components/internal/AiChatUserMessage.cjs.map +1 -1
- package/dist/components/internal/AiChatUserMessage.js +29 -26
- package/dist/components/internal/AiChatUserMessage.js.map +1 -1
- package/dist/components/internal/AiComposer.cjs +37 -53
- package/dist/components/internal/AiComposer.cjs.map +1 -1
- package/dist/components/internal/AiComposer.js +37 -53
- package/dist/components/internal/AiComposer.js.map +1 -1
- package/dist/components/internal/Attachment.cjs +170 -181
- package/dist/components/internal/Attachment.cjs.map +1 -1
- package/dist/components/internal/Attachment.js +170 -181
- package/dist/components/internal/Attachment.js.map +1 -1
- package/dist/components/internal/Attribution.cjs +27 -18
- package/dist/components/internal/Attribution.cjs.map +1 -1
- package/dist/components/internal/Attribution.js +27 -18
- package/dist/components/internal/Attribution.js.map +1 -1
- package/dist/components/internal/Avatar.cjs +30 -32
- package/dist/components/internal/Avatar.cjs.map +1 -1
- package/dist/components/internal/Avatar.js +30 -32
- package/dist/components/internal/Avatar.js.map +1 -1
- package/dist/components/internal/Button.cjs +34 -47
- package/dist/components/internal/Button.cjs.map +1 -1
- package/dist/components/internal/Button.js +34 -47
- package/dist/components/internal/Button.js.map +1 -1
- package/dist/components/internal/CodeBlock.cjs +15 -34
- package/dist/components/internal/CodeBlock.cjs.map +1 -1
- package/dist/components/internal/CodeBlock.js +15 -34
- package/dist/components/internal/CodeBlock.js.map +1 -1
- package/dist/components/internal/Dropdown.cjs +37 -37
- package/dist/components/internal/Dropdown.cjs.map +1 -1
- package/dist/components/internal/Dropdown.js +37 -37
- package/dist/components/internal/Dropdown.js.map +1 -1
- package/dist/components/internal/Emoji.cjs +16 -13
- package/dist/components/internal/Emoji.cjs.map +1 -1
- package/dist/components/internal/Emoji.js +16 -13
- package/dist/components/internal/Emoji.js.map +1 -1
- package/dist/components/internal/EmojiPicker.cjs +61 -102
- package/dist/components/internal/EmojiPicker.cjs.map +1 -1
- package/dist/components/internal/EmojiPicker.js +61 -102
- package/dist/components/internal/EmojiPicker.js.map +1 -1
- package/dist/components/internal/Favicon.cjs +1 -10
- package/dist/components/internal/Favicon.cjs.map +1 -1
- package/dist/components/internal/Favicon.js +1 -10
- package/dist/components/internal/Favicon.js.map +1 -1
- package/dist/components/internal/Group.cjs +12 -9
- package/dist/components/internal/Group.cjs.map +1 -1
- package/dist/components/internal/Group.js +12 -9
- package/dist/components/internal/Group.js.map +1 -1
- package/dist/components/internal/GroupDescription.cjs +1 -5
- package/dist/components/internal/GroupDescription.cjs.map +1 -1
- package/dist/components/internal/GroupDescription.js +1 -5
- package/dist/components/internal/GroupDescription.js.map +1 -1
- package/dist/components/internal/Icon.cjs +18 -15
- package/dist/components/internal/Icon.cjs.map +1 -1
- package/dist/components/internal/Icon.js +18 -15
- package/dist/components/internal/Icon.js.map +1 -1
- package/dist/components/internal/InboxNotificationThread.cjs +38 -50
- package/dist/components/internal/InboxNotificationThread.cjs.map +1 -1
- package/dist/components/internal/InboxNotificationThread.js +38 -50
- package/dist/components/internal/InboxNotificationThread.js.map +1 -1
- package/dist/components/internal/List.cjs +9 -6
- package/dist/components/internal/List.cjs.map +1 -1
- package/dist/components/internal/List.js +9 -6
- package/dist/components/internal/List.js.map +1 -1
- package/dist/components/internal/Prose.cjs +7 -14
- package/dist/components/internal/Prose.cjs.map +1 -1
- package/dist/components/internal/Prose.js +7 -14
- package/dist/components/internal/Prose.js.map +1 -1
- package/dist/components/internal/Room.cjs +9 -6
- package/dist/components/internal/Room.cjs.map +1 -1
- package/dist/components/internal/Room.js +9 -6
- package/dist/components/internal/Room.js.map +1 -1
- package/dist/components/internal/Tooltip.cjs +43 -56
- package/dist/components/internal/Tooltip.cjs.map +1 -1
- package/dist/components/internal/Tooltip.js +43 -56
- package/dist/components/internal/Tooltip.js.map +1 -1
- package/dist/components/internal/User.cjs +12 -9
- package/dist/components/internal/User.cjs.map +1 -1
- package/dist/components/internal/User.js +12 -9
- package/dist/components/internal/User.js.map +1 -1
- package/dist/components.cjs +1 -4
- package/dist/components.cjs.map +1 -1
- package/dist/components.js +1 -4
- package/dist/components.js.map +1 -1
- package/dist/config.cjs +1 -10
- package/dist/config.cjs.map +1 -1
- package/dist/config.js +1 -10
- package/dist/config.js.map +1 -1
- package/dist/icons/ArrowCornerDownRight.cjs +1 -6
- package/dist/icons/ArrowCornerDownRight.cjs.map +1 -1
- package/dist/icons/ArrowCornerDownRight.js +1 -6
- package/dist/icons/ArrowCornerDownRight.js.map +1 -1
- package/dist/icons/ArrowCornerUpRight.cjs +1 -6
- package/dist/icons/ArrowCornerUpRight.cjs.map +1 -1
- package/dist/icons/ArrowCornerUpRight.js +1 -6
- package/dist/icons/ArrowCornerUpRight.js.map +1 -1
- package/dist/icons/ArrowDown.cjs +1 -6
- package/dist/icons/ArrowDown.cjs.map +1 -1
- package/dist/icons/ArrowDown.js +1 -6
- package/dist/icons/ArrowDown.js.map +1 -1
- package/dist/icons/ArrowUp.cjs +1 -6
- package/dist/icons/ArrowUp.cjs.map +1 -1
- package/dist/icons/ArrowUp.js +1 -6
- package/dist/icons/ArrowUp.js.map +1 -1
- package/dist/icons/Attachment.cjs +1 -6
- package/dist/icons/Attachment.cjs.map +1 -1
- package/dist/icons/Attachment.js +1 -6
- package/dist/icons/Attachment.js.map +1 -1
- package/dist/icons/Bell.cjs +1 -6
- package/dist/icons/Bell.cjs.map +1 -1
- package/dist/icons/Bell.js +1 -6
- package/dist/icons/Bell.js.map +1 -1
- package/dist/icons/BellCrossed.cjs +1 -6
- package/dist/icons/BellCrossed.cjs.map +1 -1
- package/dist/icons/BellCrossed.js +1 -6
- package/dist/icons/BellCrossed.js.map +1 -1
- package/dist/icons/Blockquote.cjs +1 -6
- package/dist/icons/Blockquote.cjs.map +1 -1
- package/dist/icons/Blockquote.js +1 -6
- package/dist/icons/Blockquote.js.map +1 -1
- package/dist/icons/Bold.cjs +1 -6
- package/dist/icons/Bold.cjs.map +1 -1
- package/dist/icons/Bold.js +1 -6
- package/dist/icons/Bold.js.map +1 -1
- package/dist/icons/Check.cjs +1 -6
- package/dist/icons/Check.cjs.map +1 -1
- package/dist/icons/Check.js +1 -6
- package/dist/icons/Check.js.map +1 -1
- package/dist/icons/CheckCircle.cjs +4 -13
- package/dist/icons/CheckCircle.cjs.map +1 -1
- package/dist/icons/CheckCircle.js +4 -13
- package/dist/icons/CheckCircle.js.map +1 -1
- package/dist/icons/CheckCircleFill.cjs +4 -15
- package/dist/icons/CheckCircleFill.cjs.map +1 -1
- package/dist/icons/CheckCircleFill.js +4 -15
- package/dist/icons/CheckCircleFill.js.map +1 -1
- package/dist/icons/ChevronDown.cjs +1 -6
- package/dist/icons/ChevronDown.cjs.map +1 -1
- package/dist/icons/ChevronDown.js +1 -6
- package/dist/icons/ChevronDown.js.map +1 -1
- package/dist/icons/ChevronLeft.cjs +1 -6
- package/dist/icons/ChevronLeft.cjs.map +1 -1
- package/dist/icons/ChevronLeft.js +1 -6
- package/dist/icons/ChevronLeft.js.map +1 -1
- package/dist/icons/ChevronRight.cjs +1 -6
- package/dist/icons/ChevronRight.cjs.map +1 -1
- package/dist/icons/ChevronRight.js +1 -6
- package/dist/icons/ChevronRight.js.map +1 -1
- package/dist/icons/ChevronUp.cjs +1 -6
- package/dist/icons/ChevronUp.cjs.map +1 -1
- package/dist/icons/ChevronUp.js +1 -6
- package/dist/icons/ChevronUp.js.map +1 -1
- package/dist/icons/Code.cjs +1 -6
- package/dist/icons/Code.cjs.map +1 -1
- package/dist/icons/Code.js +1 -6
- package/dist/icons/Code.js.map +1 -1
- package/dist/icons/Comment.cjs +1 -6
- package/dist/icons/Comment.cjs.map +1 -1
- package/dist/icons/Comment.js +1 -6
- package/dist/icons/Comment.js.map +1 -1
- package/dist/icons/Copy.cjs +4 -15
- package/dist/icons/Copy.cjs.map +1 -1
- package/dist/icons/Copy.js +4 -15
- package/dist/icons/Copy.js.map +1 -1
- package/dist/icons/Cross.cjs +4 -11
- package/dist/icons/Cross.cjs.map +1 -1
- package/dist/icons/Cross.js +4 -11
- package/dist/icons/Cross.js.map +1 -1
- package/dist/icons/CrossCircleFill.cjs +4 -15
- package/dist/icons/CrossCircleFill.cjs.map +1 -1
- package/dist/icons/CrossCircleFill.js +4 -15
- package/dist/icons/CrossCircleFill.js.map +1 -1
- package/dist/icons/Delete.cjs +1 -6
- package/dist/icons/Delete.cjs.map +1 -1
- package/dist/icons/Delete.js +1 -6
- package/dist/icons/Delete.js.map +1 -1
- package/dist/icons/Edit.cjs +1 -6
- package/dist/icons/Edit.cjs.map +1 -1
- package/dist/icons/Edit.js +1 -6
- package/dist/icons/Edit.js.map +1 -1
- package/dist/icons/Ellipsis.cjs +5 -21
- package/dist/icons/Ellipsis.cjs.map +1 -1
- package/dist/icons/Ellipsis.js +5 -21
- package/dist/icons/Ellipsis.js.map +1 -1
- package/dist/icons/Emoji.cjs +7 -24
- package/dist/icons/Emoji.cjs.map +1 -1
- package/dist/icons/Emoji.js +7 -24
- package/dist/icons/Emoji.js.map +1 -1
- package/dist/icons/EmojiPlus.cjs +8 -27
- package/dist/icons/EmojiPlus.cjs.map +1 -1
- package/dist/icons/EmojiPlus.js +8 -27
- package/dist/icons/EmojiPlus.js.map +1 -1
- package/dist/icons/Globe.cjs +4 -13
- package/dist/icons/Globe.cjs.map +1 -1
- package/dist/icons/Globe.js +4 -13
- package/dist/icons/Globe.js.map +1 -1
- package/dist/icons/H1.cjs +1 -6
- package/dist/icons/H1.cjs.map +1 -1
- package/dist/icons/H1.js +1 -6
- package/dist/icons/H1.js.map +1 -1
- package/dist/icons/H2.cjs +1 -6
- package/dist/icons/H2.cjs.map +1 -1
- package/dist/icons/H2.js +1 -6
- package/dist/icons/H2.js.map +1 -1
- package/dist/icons/H3.cjs +1 -6
- package/dist/icons/H3.cjs.map +1 -1
- package/dist/icons/H3.js +1 -6
- package/dist/icons/H3.js.map +1 -1
- package/dist/icons/Italic.cjs +1 -6
- package/dist/icons/Italic.cjs.map +1 -1
- package/dist/icons/Italic.js +1 -6
- package/dist/icons/Italic.js.map +1 -1
- package/dist/icons/Lengthen.cjs +1 -6
- package/dist/icons/Lengthen.cjs.map +1 -1
- package/dist/icons/Lengthen.js +1 -6
- package/dist/icons/Lengthen.js.map +1 -1
- package/dist/icons/ListOrdered.cjs +1 -6
- package/dist/icons/ListOrdered.cjs.map +1 -1
- package/dist/icons/ListOrdered.js +1 -6
- package/dist/icons/ListOrdered.js.map +1 -1
- package/dist/icons/ListUnordered.cjs +8 -29
- package/dist/icons/ListUnordered.cjs.map +1 -1
- package/dist/icons/ListUnordered.js +8 -29
- package/dist/icons/ListUnordered.js.map +1 -1
- package/dist/icons/Mention.cjs +4 -11
- package/dist/icons/Mention.cjs.map +1 -1
- package/dist/icons/Mention.js +4 -11
- package/dist/icons/Mention.js.map +1 -1
- package/dist/icons/MinusCircle.cjs +4 -13
- package/dist/icons/MinusCircle.cjs.map +1 -1
- package/dist/icons/MinusCircle.js +4 -13
- package/dist/icons/MinusCircle.js.map +1 -1
- package/dist/icons/QuestionMark.cjs +5 -16
- package/dist/icons/QuestionMark.cjs.map +1 -1
- package/dist/icons/QuestionMark.js +5 -16
- package/dist/icons/QuestionMark.js.map +1 -1
- package/dist/icons/Redo.cjs +4 -11
- package/dist/icons/Redo.cjs.map +1 -1
- package/dist/icons/Redo.js +4 -11
- package/dist/icons/Redo.js.map +1 -1
- package/dist/icons/Restore.cjs +4 -11
- package/dist/icons/Restore.cjs.map +1 -1
- package/dist/icons/Restore.js +4 -11
- package/dist/icons/Restore.js.map +1 -1
- package/dist/icons/Retry.cjs +4 -11
- package/dist/icons/Retry.cjs.map +1 -1
- package/dist/icons/Retry.js +4 -11
- package/dist/icons/Retry.js.map +1 -1
- package/dist/icons/Search.cjs +1 -6
- package/dist/icons/Search.cjs.map +1 -1
- package/dist/icons/Search.js +1 -6
- package/dist/icons/Search.js.map +1 -1
- package/dist/icons/Send.cjs +1 -6
- package/dist/icons/Send.cjs.map +1 -1
- package/dist/icons/Send.js +1 -6
- package/dist/icons/Send.js.map +1 -1
- package/dist/icons/Shorten.cjs +1 -6
- package/dist/icons/Shorten.cjs.map +1 -1
- package/dist/icons/Shorten.js +1 -6
- package/dist/icons/Shorten.js.map +1 -1
- package/dist/icons/Sparkles.cjs +1 -6
- package/dist/icons/Sparkles.cjs.map +1 -1
- package/dist/icons/Sparkles.js +1 -6
- package/dist/icons/Sparkles.js.map +1 -1
- package/dist/icons/SparklesText.cjs +4 -11
- package/dist/icons/SparklesText.cjs.map +1 -1
- package/dist/icons/SparklesText.js +4 -11
- package/dist/icons/SparklesText.js.map +1 -1
- package/dist/icons/Spinner.cjs +1 -7
- package/dist/icons/Spinner.cjs.map +1 -1
- package/dist/icons/Spinner.js +1 -7
- package/dist/icons/Spinner.js.map +1 -1
- package/dist/icons/Stop.cjs +1 -11
- package/dist/icons/Stop.cjs.map +1 -1
- package/dist/icons/Stop.js +1 -11
- package/dist/icons/Stop.js.map +1 -1
- package/dist/icons/Strikethrough.cjs +1 -6
- package/dist/icons/Strikethrough.cjs.map +1 -1
- package/dist/icons/Strikethrough.js +1 -6
- package/dist/icons/Strikethrough.js.map +1 -1
- package/dist/icons/Text.cjs +1 -6
- package/dist/icons/Text.cjs.map +1 -1
- package/dist/icons/Text.js +1 -6
- package/dist/icons/Text.js.map +1 -1
- package/dist/icons/Translate.cjs +4 -11
- package/dist/icons/Translate.cjs.map +1 -1
- package/dist/icons/Translate.js +4 -11
- package/dist/icons/Translate.js.map +1 -1
- package/dist/icons/Underline.cjs +1 -6
- package/dist/icons/Underline.cjs.map +1 -1
- package/dist/icons/Underline.js +1 -6
- package/dist/icons/Underline.js.map +1 -1
- package/dist/icons/Undo.cjs +4 -11
- package/dist/icons/Undo.cjs.map +1 -1
- package/dist/icons/Undo.js +4 -11
- package/dist/icons/Undo.js.map +1 -1
- package/dist/icons/User.cjs +1 -6
- package/dist/icons/User.cjs.map +1 -1
- package/dist/icons/User.js +1 -6
- package/dist/icons/User.js.map +1 -1
- package/dist/icons/Users.cjs +1 -6
- package/dist/icons/Users.cjs.map +1 -1
- package/dist/icons/Users.js +1 -6
- package/dist/icons/Users.js.map +1 -1
- package/dist/icons/Warning.cjs +4 -13
- package/dist/icons/Warning.cjs.map +1 -1
- package/dist/icons/Warning.js +4 -13
- package/dist/icons/Warning.js.map +1 -1
- package/dist/overrides.cjs +102 -150
- package/dist/overrides.cjs.map +1 -1
- package/dist/overrides.js +102 -150
- package/dist/overrides.js.map +1 -1
- package/dist/primitives/AiComposer/index.cjs +77 -65
- package/dist/primitives/AiComposer/index.cjs.map +1 -1
- package/dist/primitives/AiComposer/index.js +77 -65
- package/dist/primitives/AiComposer/index.js.map +1 -1
- package/dist/primitives/AiMessage/index.cjs +28 -49
- package/dist/primitives/AiMessage/index.cjs.map +1 -1
- package/dist/primitives/AiMessage/index.js +28 -49
- package/dist/primitives/AiMessage/index.js.map +1 -1
- package/dist/primitives/AiMessage/tool-invocation.cjs +5 -5
- package/dist/primitives/AiMessage/tool-invocation.cjs.map +1 -1
- package/dist/primitives/AiMessage/tool-invocation.js +5 -5
- package/dist/primitives/AiMessage/tool-invocation.js.map +1 -1
- package/dist/primitives/Collapsible/index.cjs +46 -34
- package/dist/primitives/Collapsible/index.cjs.map +1 -1
- package/dist/primitives/Collapsible/index.js +46 -34
- package/dist/primitives/Collapsible/index.js.map +1 -1
- package/dist/primitives/Comment/index.cjs +41 -64
- package/dist/primitives/Comment/index.cjs.map +1 -1
- package/dist/primitives/Comment/index.js +41 -64
- package/dist/primitives/Comment/index.js.map +1 -1
- package/dist/primitives/Composer/contexts.cjs.map +1 -1
- package/dist/primitives/Composer/contexts.js.map +1 -1
- package/dist/primitives/Composer/index.cjs +324 -312
- package/dist/primitives/Composer/index.cjs.map +1 -1
- package/dist/primitives/Composer/index.js +324 -312
- package/dist/primitives/Composer/index.js.map +1 -1
- package/dist/primitives/Composer/slate/plugins/auto-links.cjs.map +1 -1
- package/dist/primitives/Composer/slate/plugins/auto-links.js.map +1 -1
- package/dist/primitives/Composer/slate/plugins/custom-links.cjs.map +1 -1
- package/dist/primitives/Composer/slate/plugins/custom-links.js.map +1 -1
- package/dist/primitives/Composer/slate/plugins/mentions.cjs +1 -0
- package/dist/primitives/Composer/slate/plugins/mentions.cjs.map +1 -1
- package/dist/primitives/Composer/slate/plugins/mentions.js +1 -0
- package/dist/primitives/Composer/slate/plugins/mentions.js.map +1 -1
- package/dist/primitives/Composer/slate/plugins/paste.cjs +1 -0
- package/dist/primitives/Composer/slate/plugins/paste.cjs.map +1 -1
- package/dist/primitives/Composer/slate/plugins/paste.js +1 -0
- package/dist/primitives/Composer/slate/plugins/paste.js.map +1 -1
- package/dist/primitives/Composer/utils.cjs +3 -0
- package/dist/primitives/Composer/utils.cjs.map +1 -1
- package/dist/primitives/Composer/utils.js +3 -0
- package/dist/primitives/Composer/utils.js.map +1 -1
- package/dist/primitives/Duration.cjs +11 -7
- package/dist/primitives/Duration.cjs.map +1 -1
- package/dist/primitives/Duration.js +11 -7
- package/dist/primitives/Duration.js.map +1 -1
- package/dist/primitives/FileSize.cjs +2 -5
- package/dist/primitives/FileSize.cjs.map +1 -1
- package/dist/primitives/FileSize.js +2 -5
- package/dist/primitives/FileSize.js.map +1 -1
- package/dist/primitives/Markdown.cjs +80 -188
- package/dist/primitives/Markdown.cjs.map +1 -1
- package/dist/primitives/Markdown.js +80 -188
- package/dist/primitives/Markdown.js.map +1 -1
- package/dist/primitives/Timestamp.cjs +12 -7
- package/dist/primitives/Timestamp.cjs.map +1 -1
- package/dist/primitives/Timestamp.js +12 -7
- package/dist/primitives/Timestamp.js.map +1 -1
- package/dist/primitives/slate/utils/get-dom-range.cjs.map +1 -1
- package/dist/primitives/slate/utils/get-dom-range.js.map +1 -1
- package/dist/primitives/slate/utils/get-match-range.cjs.map +1 -1
- package/dist/primitives/slate/utils/get-match-range.js.map +1 -1
- package/dist/primitives/slate/utils/is-empty.cjs.map +1 -1
- package/dist/primitives/slate/utils/is-empty.js.map +1 -1
- package/dist/primitives/slate/utils/marks.cjs.map +1 -1
- package/dist/primitives/slate/utils/marks.js.map +1 -1
- package/dist/shared.cjs.map +1 -1
- package/dist/shared.js.map +1 -1
- package/dist/utils/ErrorBoundary.cjs +1 -6
- package/dist/utils/ErrorBoundary.cjs.map +1 -1
- package/dist/utils/ErrorBoundary.js +1 -6
- package/dist/utils/ErrorBoundary.js.map +1 -1
- package/dist/utils/Persist.cjs +1 -4
- package/dist/utils/Persist.cjs.map +1 -1
- package/dist/utils/Persist.js +1 -4
- package/dist/utils/Persist.js.map +1 -1
- package/dist/utils/Portal.cjs +1 -5
- package/dist/utils/Portal.cjs.map +1 -1
- package/dist/utils/Portal.js +1 -5
- package/dist/utils/Portal.js.map +1 -1
- package/dist/utils/format-file-size.cjs.map +1 -1
- package/dist/utils/format-file-size.js.map +1 -1
- package/dist/utils/is-key.cjs.map +1 -1
- package/dist/utils/is-key.js.map +1 -1
- package/dist/utils/pluralize.cjs.map +1 -1
- package/dist/utils/pluralize.js.map +1 -1
- package/dist/utils/use-controllable-state.cjs.map +1 -1
- package/dist/utils/use-controllable-state.js.map +1 -1
- package/dist/utils/use-rerender.cjs +3 -0
- package/dist/utils/use-rerender.cjs.map +1 -1
- package/dist/utils/use-rerender.js +3 -0
- package/dist/utils/use-rerender.js.map +1 -1
- package/dist/utils/use-visible.cjs.map +1 -1
- package/dist/utils/use-visible.js.map +1 -1
- package/dist/version.cjs +1 -1
- package/dist/version.js +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sources":["../../../src/primitives/Composer/utils.ts"],"sourcesContent":["import type {\n DetectOverflowOptions,\n Placement,\n UseFloatingOptions,\n} from \"@floating-ui/react-dom\";\nimport {\n autoUpdate,\n flip,\n hide,\n inline,\n limitShift,\n offset,\n shift,\n size,\n useFloating,\n} from \"@floating-ui/react-dom\";\nimport type {\n Client,\n CommentAttachment,\n CommentBody,\n CommentBodyLink,\n CommentBodyMention,\n CommentLocalAttachment,\n CommentMixedAttachment,\n} from \"@liveblocks/core\";\nimport {\n HttpError,\n isCommentBodyLink,\n isCommentBodyMention,\n isCommentBodyText,\n kInternal,\n makeEventSource,\n} from \"@liveblocks/core\";\nimport { useClient } from \"@liveblocks/react\";\nimport { useLatest, useLayoutEffect } from \"@liveblocks/react/_private\";\nimport type { DragEvent } from \"react\";\nimport {\n useCallback,\n useEffect,\n useMemo,\n useState,\n useSyncExternalStore,\n} from \"react\";\n\nimport {\n FLOATING_ELEMENT_COLLISION_PADDING,\n FLOATING_ELEMENT_SIDE_OFFSET,\n} from \"../../constants\";\nimport type {\n ComposerBody,\n ComposerBodyAutoLink,\n ComposerBodyCustomLink,\n ComposerBodyMention,\n ComposerBodyText,\n Direction,\n} from \"../../types\";\nimport { getFiles } from \"../../utils/data-transfer\";\nimport { exists } from \"../../utils/exists\";\nimport { useInitial } from \"../../utils/use-initial\";\nimport { isText } from \"../slate/utils/is-text\";\nimport { useComposer, useComposerAttachmentsContext } from \"./contexts\";\nimport { isComposerBodyAutoLink } from \"./slate/plugins/auto-links\";\nimport { isComposerBodyCustomLink } from \"./slate/plugins/custom-links\";\nimport { isComposerBodyMention } from \"./slate/plugins/mentions\";\nimport type { FloatingAlignment, FloatingPosition } from \"./types\";\n\nexport function composerBodyMentionToCommentBodyMention(\n mention: ComposerBodyMention\n): CommentBodyMention {\n const { children: _, ...commentBodyMention } = mention;\n\n return commentBodyMention;\n}\n\nexport function composerBodyAutoLinkToCommentBodyLink(\n link: ComposerBodyAutoLink\n): CommentBodyLink {\n return {\n type: \"link\",\n url: link.url,\n };\n}\n\nexport function composerBodyCustomLinkToCommentBodyLink(\n link: ComposerBodyCustomLink\n): CommentBodyLink {\n return {\n type: \"link\",\n url: link.url,\n text: link.children.map((child) => child.text).join(\"\"),\n };\n}\n\nexport function commentBodyMentionToComposerBodyMention(\n mention: CommentBodyMention\n): ComposerBodyMention {\n return {\n ...mention,\n children: [{ text: \"\" }],\n };\n}\n\nexport function commentBodyLinkToComposerBodyLink(\n link: CommentBodyLink\n): ComposerBodyAutoLink | ComposerBodyCustomLink {\n if (link.text) {\n return {\n type: \"custom-link\",\n url: link.url,\n children: [{ text: link.text }],\n };\n } else {\n return {\n type: \"auto-link\",\n url: link.url,\n children: [{ text: link.url }],\n };\n }\n}\n\nexport function composerBodyToCommentBody(body: ComposerBody): CommentBody {\n return {\n version: 1,\n content: body\n .map((block) => {\n // All root blocks are paragraphs at the moment\n if (block.type !== \"paragraph\") {\n return null;\n }\n\n const children = block.children\n .map((inline) => {\n if (isComposerBodyMention(inline)) {\n return composerBodyMentionToCommentBodyMention(inline);\n }\n\n if (isComposerBodyAutoLink(inline)) {\n return composerBodyAutoLinkToCommentBodyLink(inline);\n }\n\n if (isComposerBodyCustomLink(inline)) {\n return composerBodyCustomLinkToCommentBodyLink(inline);\n }\n\n if (isText(inline)) {\n return inline;\n }\n\n return null;\n })\n .filter(exists);\n\n return {\n ...block,\n children,\n };\n })\n .filter(exists),\n };\n}\n\nconst emptyComposerBody: ComposerBody = [];\n\nexport function commentBodyToComposerBody(body: CommentBody): ComposerBody {\n if (!body || !body?.content) {\n return emptyComposerBody;\n }\n\n return body.content\n .map((block) => {\n // All root blocks are paragraphs at the moment\n if (block.type !== \"paragraph\") {\n return null;\n }\n\n const children = block.children\n .map((inline) => {\n if (isCommentBodyMention(inline)) {\n return commentBodyMentionToComposerBodyMention(inline);\n }\n\n if (isCommentBodyLink(inline)) {\n return commentBodyLinkToComposerBodyLink(inline);\n }\n\n if (isCommentBodyText(inline)) {\n return inline as ComposerBodyText;\n }\n\n return null;\n })\n .filter(exists);\n\n return {\n ...block,\n children,\n };\n })\n .filter(exists);\n}\n\nexport function getRtlFloatingAlignment(\n alignment: FloatingAlignment\n): FloatingAlignment {\n switch (alignment) {\n case \"start\":\n return \"end\";\n case \"end\":\n return \"start\";\n default:\n return \"center\";\n }\n}\n\nexport function getSideAndAlignFromFloatingPlacement(placement: Placement) {\n const [side, align = \"center\"] = placement.split(\"-\");\n\n return [side, align] as const;\n}\n\n// Copy `z-index` from content to wrapper.\n// Inspired by https://github.com/radix-ui/primitives/blob/main/packages/react/popper/src/Popper.tsx\nexport function useContentZIndex() {\n const [content, setContent] = useState<HTMLDivElement | null>(null);\n const contentRef = useCallback(setContent, [setContent]);\n const [contentZIndex, setContentZIndex] = useState<string>();\n\n useLayoutEffect(() => {\n if (content) {\n setContentZIndex(window.getComputedStyle(content).zIndex);\n }\n }, [content]);\n\n return [contentRef, contentZIndex] as const;\n}\n\nexport function useFloatingWithOptions({\n type = \"bounds\",\n position,\n alignment,\n dir,\n open,\n}: {\n type?: \"bounds\" | \"range\";\n position: FloatingPosition;\n alignment: FloatingAlignment;\n dir: Direction | undefined;\n open: boolean;\n}) {\n const floatingOptions: UseFloatingOptions = useMemo(() => {\n const detectOverflowOptions: DetectOverflowOptions = {\n padding: FLOATING_ELEMENT_COLLISION_PADDING,\n };\n\n const middleware = [\n type === \"range\" ? inline(detectOverflowOptions) : null,\n flip({ ...detectOverflowOptions, crossAxis: false }),\n hide(detectOverflowOptions),\n shift({\n ...detectOverflowOptions,\n limiter: limitShift(),\n }),\n type === \"range\" ? offset(FLOATING_ELEMENT_SIDE_OFFSET) : null,\n size({\n ...detectOverflowOptions,\n apply({ availableWidth, availableHeight, elements }) {\n elements.floating.style.setProperty(\n \"--lb-composer-floating-available-width\",\n `${availableWidth}px`\n );\n elements.floating.style.setProperty(\n \"--lb-composer-floating-available-height\",\n `${availableHeight}px`\n );\n },\n }),\n ];\n\n return {\n strategy: \"fixed\",\n placement:\n alignment === \"center\"\n ? position\n : (`${position}-${dir === \"rtl\" ? getRtlFloatingAlignment(alignment) : alignment}` as Placement),\n middleware,\n whileElementsMounted: (...args) => {\n return autoUpdate(...args, {\n animationFrame: true,\n });\n },\n };\n }, [alignment, position, dir, type]);\n\n return useFloating({\n ...floatingOptions,\n open,\n });\n}\n\nexport function useComposerAttachmentsDropArea<\n T extends HTMLElement = HTMLElement,\n>({\n onDragEnter,\n onDragLeave,\n onDragOver,\n onDrop,\n disabled,\n}: {\n onDragEnter?: (event: DragEvent<T>) => void;\n onDragLeave?: (event: DragEvent<T>) => void;\n onDragOver?: (event: DragEvent<T>) => void;\n onDrop?: (event: DragEvent<T>) => void;\n disabled?: boolean;\n}) {\n const { isDisabled: isComposerDisabled } = useComposer();\n const isDisabled = isComposerDisabled || disabled;\n const { createAttachments } = useComposerAttachmentsContext();\n const [isDraggingOver, setDraggingOver] = useState(false);\n const latestIsDraggingOver = useLatest(isDraggingOver);\n\n const handleDragEnter = useCallback(\n (event: DragEvent<T>) => {\n onDragEnter?.(event);\n\n if (\n latestIsDraggingOver.current ||\n isDisabled ||\n event.isDefaultPrevented()\n ) {\n return;\n }\n\n const dataTransfer = event.dataTransfer;\n\n if (!dataTransfer.types.includes(\"Files\")) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n setDraggingOver(true);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [onDragEnter, isDisabled]\n );\n\n const handleDragLeave = useCallback(\n (event: DragEvent<T>) => {\n onDragLeave?.(event);\n\n if (\n !latestIsDraggingOver.current ||\n isDisabled ||\n event.isDefaultPrevented()\n ) {\n return;\n }\n\n // Ignore drag leave events that are not actually leaving the drop area\n if (\n event.relatedTarget\n ? event.relatedTarget === event.currentTarget ||\n event.currentTarget.contains(event.relatedTarget as HTMLElement)\n : event.currentTarget !== event.target\n ) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n setDraggingOver(false);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [onDragLeave, isDisabled]\n );\n\n const handleDragOver = useCallback(\n (event: DragEvent<T>) => {\n onDragOver?.(event);\n\n if (isDisabled || event.isDefaultPrevented()) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n },\n [onDragOver, isDisabled]\n );\n\n const handleDrop = useCallback(\n (event: DragEvent<T>) => {\n onDrop?.(event);\n\n if (\n !latestIsDraggingOver.current ||\n isDisabled ||\n event.isDefaultPrevented()\n ) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n setDraggingOver(false);\n\n const files = getFiles(event.dataTransfer);\n\n createAttachments(files);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [onDrop, isDisabled, createAttachments]\n );\n\n return [\n isDraggingOver,\n {\n onDragEnter: handleDragEnter,\n onDragLeave: handleDragLeave,\n onDragOver: handleDragOver,\n onDrop: handleDrop,\n \"data-drop\": isDraggingOver ? \"\" : undefined,\n \"data-disabled\": isDisabled ? \"\" : undefined,\n } as const,\n ] as const;\n}\n\ninterface ComposerAttachmentsManagerOptions {\n maxFileSize: number;\n roomId: string;\n}\n\nexport class AttachmentTooLargeError extends Error {\n origin: \"client\" | \"server\";\n name = \"AttachmentTooLargeError\";\n\n constructor(message: string, origin: \"client\" | \"server\" = \"client\") {\n super(message);\n this.origin = origin;\n }\n}\n\nfunction createComposerAttachmentsManager(\n client: Client,\n roomId: string,\n options: ComposerAttachmentsManagerOptions\n) {\n const attachments: Map<string, CommentMixedAttachment> = new Map();\n const abortControllers: Map<string, AbortController> = new Map();\n const eventSource = makeEventSource<void>();\n let cachedSnapshot: CommentMixedAttachment[] | null = null;\n\n function notifySubscribers() {\n // Invalidate the cached snapshot\n cachedSnapshot = null;\n eventSource.notify();\n }\n\n function uploadAttachment(attachment: CommentLocalAttachment) {\n const abortController = new AbortController();\n abortControllers.set(attachment.id, abortController);\n\n client[kInternal].httpClient\n .uploadAttachment({\n roomId,\n attachment,\n signal: abortController.signal,\n })\n .then(() => {\n attachments.set(attachment.id, {\n ...attachment,\n status: \"uploaded\",\n });\n notifySubscribers();\n })\n .catch((error) => {\n if (\n error instanceof Error &&\n error.name !== \"AbortError\" &&\n error.name !== \"TimeoutError\"\n ) {\n attachments.set(attachment.id, {\n ...attachment,\n status: \"error\",\n error:\n error instanceof HttpError && error.status === 413\n ? new AttachmentTooLargeError(\"File is too large.\", \"server\")\n : error,\n });\n notifySubscribers();\n }\n });\n }\n\n function addAttachments(addedAttachments: CommentMixedAttachment[]) {\n if (addedAttachments.length === 0) {\n return;\n }\n\n // Ignore attachments that are already in the manager\n const newAttachments = addedAttachments.filter(\n (attachment) => !attachments.has(attachment.id)\n );\n\n const attachmentsToUpload: CommentLocalAttachment[] = [];\n\n // Add all the new attachments to the manager\n for (const attachment of newAttachments) {\n if (attachment.type === \"localAttachment\") {\n // The file is too large to be uploaded\n if (attachment.file.size > options.maxFileSize) {\n attachments.set(attachment.id, {\n ...attachment,\n status: \"error\",\n error: new AttachmentTooLargeError(\"File is too large.\", \"client\"),\n });\n\n continue;\n }\n\n // Otherwise, mark the attachment to be uploaded\n attachments.set(attachment.id, {\n ...attachment,\n status: \"uploading\",\n });\n attachmentsToUpload.push(attachment);\n } else {\n attachments.set(attachment.id, attachment);\n }\n }\n\n // Notify subscribers about the new attachments that were added\n if (newAttachments.length > 0) {\n notifySubscribers();\n }\n\n // Upload all the new local attachments\n for (const attachment of attachmentsToUpload) {\n uploadAttachment(attachment);\n }\n }\n\n function removeAttachment(attachmentId: string) {\n const abortController = abortControllers.get(attachmentId);\n\n abortController?.abort();\n\n attachments.delete(attachmentId);\n abortControllers.delete(attachmentId);\n\n notifySubscribers();\n }\n\n function getSnapshot() {\n if (!cachedSnapshot) {\n cachedSnapshot = Array.from(attachments.values());\n }\n\n return cachedSnapshot;\n }\n\n // Clear all attachments and abort all ongoing uploads\n function clear() {\n abortControllers.forEach((controller) => controller.abort());\n abortControllers.clear();\n attachments.clear();\n\n notifySubscribers();\n }\n\n return {\n addAttachments,\n removeAttachment,\n getSnapshot,\n subscribe: eventSource.subscribe,\n clear,\n };\n}\n\nfunction preventBeforeUnloadDefault(event: BeforeUnloadEvent) {\n event.preventDefault();\n}\n\nexport function useComposerAttachmentsManager(\n defaultAttachments: CommentAttachment[],\n options: ComposerAttachmentsManagerOptions\n) {\n const client = useClient();\n const frozenDefaultAttachments = useInitial(defaultAttachments);\n const frozenAttachmentsManager = useInitial(() =>\n createComposerAttachmentsManager(client, options.roomId, options)\n );\n\n // Initialize default attachments on mount\n useEffect(() => {\n frozenAttachmentsManager.addAttachments(frozenDefaultAttachments);\n }, [frozenDefaultAttachments, frozenAttachmentsManager]);\n\n // Clear on unmount\n useEffect(() => {\n return () => {\n frozenAttachmentsManager.clear();\n };\n }, [frozenAttachmentsManager]);\n\n const attachments = useSyncExternalStore(\n frozenAttachmentsManager.subscribe,\n frozenAttachmentsManager.getSnapshot,\n frozenAttachmentsManager.getSnapshot\n );\n\n const isUploadingAttachments = useMemo(() => {\n return attachments.some(\n (attachment) =>\n attachment.type === \"localAttachment\" &&\n attachment.status === \"uploading\"\n );\n }, [attachments]);\n\n useEffect(() => {\n if (!isUploadingAttachments) {\n return;\n }\n\n window.addEventListener(\"beforeunload\", preventBeforeUnloadDefault);\n\n return () => {\n window.removeEventListener(\"beforeunload\", preventBeforeUnloadDefault);\n };\n }, [isUploadingAttachments]);\n\n return {\n attachments,\n isUploadingAttachments,\n addAttachments: frozenAttachmentsManager.addAttachments,\n removeAttachment: frozenAttachmentsManager.removeAttachment,\n clearAttachments: frozenAttachmentsManager.clear,\n };\n}\n"],"names":["inline"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../src/primitives/Composer/utils.ts"],"sourcesContent":["import type {\n DetectOverflowOptions,\n Placement,\n UseFloatingOptions,\n} from \"@floating-ui/react-dom\";\nimport {\n autoUpdate,\n flip,\n hide,\n inline,\n limitShift,\n offset,\n shift,\n size,\n useFloating,\n} from \"@floating-ui/react-dom\";\nimport type {\n Client,\n CommentAttachment,\n CommentBody,\n CommentBodyLink,\n CommentBodyMention,\n CommentLocalAttachment,\n CommentMixedAttachment,\n} from \"@liveblocks/core\";\nimport {\n HttpError,\n isCommentBodyLink,\n isCommentBodyMention,\n isCommentBodyText,\n kInternal,\n makeEventSource,\n} from \"@liveblocks/core\";\nimport { useClient } from \"@liveblocks/react\";\nimport { useLatest, useLayoutEffect } from \"@liveblocks/react/_private\";\nimport type { DragEvent } from \"react\";\nimport {\n useCallback,\n useEffect,\n useMemo,\n useState,\n useSyncExternalStore,\n} from \"react\";\n\nimport {\n FLOATING_ELEMENT_COLLISION_PADDING,\n FLOATING_ELEMENT_SIDE_OFFSET,\n} from \"../../constants\";\nimport type {\n ComposerBody,\n ComposerBodyAutoLink,\n ComposerBodyCustomLink,\n ComposerBodyMention,\n ComposerBodyText,\n Direction,\n} from \"../../types\";\nimport { getFiles } from \"../../utils/data-transfer\";\nimport { exists } from \"../../utils/exists\";\nimport { useInitial } from \"../../utils/use-initial\";\nimport { isText } from \"../slate/utils/is-text\";\nimport { useComposer, useComposerAttachmentsContext } from \"./contexts\";\nimport { isComposerBodyAutoLink } from \"./slate/plugins/auto-links\";\nimport { isComposerBodyCustomLink } from \"./slate/plugins/custom-links\";\nimport { isComposerBodyMention } from \"./slate/plugins/mentions\";\nimport type { FloatingAlignment, FloatingPosition } from \"./types\";\n\nexport function composerBodyMentionToCommentBodyMention(\n mention: ComposerBodyMention\n): CommentBodyMention {\n const { children: _, ...commentBodyMention } = mention;\n\n return commentBodyMention;\n}\n\nexport function composerBodyAutoLinkToCommentBodyLink(\n link: ComposerBodyAutoLink\n): CommentBodyLink {\n return {\n type: \"link\",\n url: link.url,\n };\n}\n\nexport function composerBodyCustomLinkToCommentBodyLink(\n link: ComposerBodyCustomLink\n): CommentBodyLink {\n return {\n type: \"link\",\n url: link.url,\n text: link.children.map((child) => child.text).join(\"\"),\n };\n}\n\nexport function commentBodyMentionToComposerBodyMention(\n mention: CommentBodyMention\n): ComposerBodyMention {\n return {\n ...mention,\n children: [{ text: \"\" }],\n };\n}\n\nexport function commentBodyLinkToComposerBodyLink(\n link: CommentBodyLink\n): ComposerBodyAutoLink | ComposerBodyCustomLink {\n if (link.text) {\n return {\n type: \"custom-link\",\n url: link.url,\n children: [{ text: link.text }],\n };\n } else {\n return {\n type: \"auto-link\",\n url: link.url,\n children: [{ text: link.url }],\n };\n }\n}\n\nexport function composerBodyToCommentBody(body: ComposerBody): CommentBody {\n return {\n version: 1,\n content: body\n .map((block) => {\n // All root blocks are paragraphs at the moment\n if (block.type !== \"paragraph\") {\n return null;\n }\n\n const children = block.children\n .map((inline) => {\n if (isComposerBodyMention(inline)) {\n return composerBodyMentionToCommentBodyMention(inline);\n }\n\n if (isComposerBodyAutoLink(inline)) {\n return composerBodyAutoLinkToCommentBodyLink(inline);\n }\n\n if (isComposerBodyCustomLink(inline)) {\n return composerBodyCustomLinkToCommentBodyLink(inline);\n }\n\n if (isText(inline)) {\n return inline;\n }\n\n return null;\n })\n .filter(exists);\n\n return {\n ...block,\n children,\n };\n })\n .filter(exists),\n };\n}\n\nconst emptyComposerBody: ComposerBody = [];\n\nexport function commentBodyToComposerBody(body: CommentBody): ComposerBody {\n if (!body || !body?.content) {\n return emptyComposerBody;\n }\n\n return body.content\n .map((block) => {\n // All root blocks are paragraphs at the moment\n if (block.type !== \"paragraph\") {\n return null;\n }\n\n const children = block.children\n .map((inline) => {\n if (isCommentBodyMention(inline)) {\n return commentBodyMentionToComposerBodyMention(inline);\n }\n\n if (isCommentBodyLink(inline)) {\n return commentBodyLinkToComposerBodyLink(inline);\n }\n\n if (isCommentBodyText(inline)) {\n return inline as ComposerBodyText;\n }\n\n return null;\n })\n .filter(exists);\n\n return {\n ...block,\n children,\n };\n })\n .filter(exists);\n}\n\nexport function getRtlFloatingAlignment(\n alignment: FloatingAlignment\n): FloatingAlignment {\n switch (alignment) {\n case \"start\":\n return \"end\";\n case \"end\":\n return \"start\";\n default:\n return \"center\";\n }\n}\n\nexport function getSideAndAlignFromFloatingPlacement(placement: Placement) {\n const [side, align = \"center\"] = placement.split(\"-\");\n\n return [side, align] as const;\n}\n\n// Copy `z-index` from content to wrapper.\n// Inspired by https://github.com/radix-ui/primitives/blob/main/packages/react/popper/src/Popper.tsx\nexport function useContentZIndex() {\n const [content, setContent] = useState<HTMLDivElement | null>(null);\n const contentRef = useCallback(setContent, [setContent]);\n const [contentZIndex, setContentZIndex] = useState<string>();\n\n useLayoutEffect(() => {\n if (content) {\n setContentZIndex(window.getComputedStyle(content).zIndex);\n }\n }, [content]);\n\n return [contentRef, contentZIndex] as const;\n}\n\nexport function useFloatingWithOptions({\n type = \"bounds\",\n position,\n alignment,\n dir,\n open,\n}: {\n type?: \"bounds\" | \"range\";\n position: FloatingPosition;\n alignment: FloatingAlignment;\n dir: Direction | undefined;\n open: boolean;\n}) {\n const floatingOptions: UseFloatingOptions = useMemo(() => {\n const detectOverflowOptions: DetectOverflowOptions = {\n padding: FLOATING_ELEMENT_COLLISION_PADDING,\n };\n\n const middleware = [\n type === \"range\" ? inline(detectOverflowOptions) : null,\n flip({ ...detectOverflowOptions, crossAxis: false }),\n hide(detectOverflowOptions),\n shift({\n ...detectOverflowOptions,\n limiter: limitShift(),\n }),\n type === \"range\" ? offset(FLOATING_ELEMENT_SIDE_OFFSET) : null,\n size({\n ...detectOverflowOptions,\n apply({ availableWidth, availableHeight, elements }) {\n elements.floating.style.setProperty(\n \"--lb-composer-floating-available-width\",\n `${availableWidth}px`\n );\n elements.floating.style.setProperty(\n \"--lb-composer-floating-available-height\",\n `${availableHeight}px`\n );\n },\n }),\n ];\n\n return {\n strategy: \"fixed\",\n placement:\n alignment === \"center\"\n ? position\n : (`${position}-${dir === \"rtl\" ? getRtlFloatingAlignment(alignment) : alignment}` as Placement),\n middleware,\n whileElementsMounted: (...args) => {\n return autoUpdate(...args, {\n animationFrame: true,\n });\n },\n };\n }, [alignment, position, dir, type]);\n\n return useFloating({\n ...floatingOptions,\n open,\n });\n}\n\nexport function useComposerAttachmentsDropArea<\n T extends HTMLElement = HTMLElement,\n>({\n onDragEnter,\n onDragLeave,\n onDragOver,\n onDrop,\n disabled,\n}: {\n onDragEnter?: (event: DragEvent<T>) => void;\n onDragLeave?: (event: DragEvent<T>) => void;\n onDragOver?: (event: DragEvent<T>) => void;\n onDrop?: (event: DragEvent<T>) => void;\n disabled?: boolean;\n}) {\n const { isDisabled: isComposerDisabled } = useComposer();\n const isDisabled = isComposerDisabled || disabled;\n const { createAttachments } = useComposerAttachmentsContext();\n const [isDraggingOver, setDraggingOver] = useState(false);\n const latestIsDraggingOver = useLatest(isDraggingOver);\n\n const handleDragEnter = useCallback(\n (event: DragEvent<T>) => {\n onDragEnter?.(event);\n\n if (\n latestIsDraggingOver.current ||\n isDisabled ||\n event.isDefaultPrevented()\n ) {\n return;\n }\n\n const dataTransfer = event.dataTransfer;\n\n if (!dataTransfer.types.includes(\"Files\")) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n setDraggingOver(true);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [onDragEnter, isDisabled]\n );\n\n const handleDragLeave = useCallback(\n (event: DragEvent<T>) => {\n onDragLeave?.(event);\n\n if (\n !latestIsDraggingOver.current ||\n isDisabled ||\n event.isDefaultPrevented()\n ) {\n return;\n }\n\n // Ignore drag leave events that are not actually leaving the drop area\n if (\n event.relatedTarget\n ? event.relatedTarget === event.currentTarget ||\n event.currentTarget.contains(event.relatedTarget as HTMLElement)\n : event.currentTarget !== event.target\n ) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n setDraggingOver(false);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [onDragLeave, isDisabled]\n );\n\n const handleDragOver = useCallback(\n (event: DragEvent<T>) => {\n onDragOver?.(event);\n\n if (isDisabled || event.isDefaultPrevented()) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n },\n [onDragOver, isDisabled]\n );\n\n const handleDrop = useCallback(\n (event: DragEvent<T>) => {\n onDrop?.(event);\n\n if (\n !latestIsDraggingOver.current ||\n isDisabled ||\n event.isDefaultPrevented()\n ) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n setDraggingOver(false);\n\n const files = getFiles(event.dataTransfer);\n\n createAttachments(files);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [onDrop, isDisabled, createAttachments]\n );\n\n return [\n isDraggingOver,\n {\n onDragEnter: handleDragEnter,\n onDragLeave: handleDragLeave,\n onDragOver: handleDragOver,\n onDrop: handleDrop,\n \"data-drop\": isDraggingOver ? \"\" : undefined,\n \"data-disabled\": isDisabled ? \"\" : undefined,\n } as const,\n ] as const;\n}\n\ninterface ComposerAttachmentsManagerOptions {\n maxFileSize: number;\n roomId: string;\n}\n\nexport class AttachmentTooLargeError extends Error {\n origin: \"client\" | \"server\";\n name = \"AttachmentTooLargeError\";\n\n constructor(message: string, origin: \"client\" | \"server\" = \"client\") {\n super(message);\n this.origin = origin;\n }\n}\n\nfunction createComposerAttachmentsManager(\n client: Client,\n roomId: string,\n options: ComposerAttachmentsManagerOptions\n) {\n const attachments: Map<string, CommentMixedAttachment> = new Map();\n const abortControllers: Map<string, AbortController> = new Map();\n const eventSource = makeEventSource<void>();\n let cachedSnapshot: CommentMixedAttachment[] | null = null;\n\n function notifySubscribers() {\n // Invalidate the cached snapshot\n cachedSnapshot = null;\n eventSource.notify();\n }\n\n function uploadAttachment(attachment: CommentLocalAttachment) {\n const abortController = new AbortController();\n abortControllers.set(attachment.id, abortController);\n\n client[kInternal].httpClient\n .uploadAttachment({\n roomId,\n attachment,\n signal: abortController.signal,\n })\n .then(() => {\n attachments.set(attachment.id, {\n ...attachment,\n status: \"uploaded\",\n });\n notifySubscribers();\n })\n .catch((error) => {\n if (\n error instanceof Error &&\n error.name !== \"AbortError\" &&\n error.name !== \"TimeoutError\"\n ) {\n attachments.set(attachment.id, {\n ...attachment,\n status: \"error\",\n error:\n error instanceof HttpError && error.status === 413\n ? new AttachmentTooLargeError(\"File is too large.\", \"server\")\n : error,\n });\n notifySubscribers();\n }\n });\n }\n\n function addAttachments(addedAttachments: CommentMixedAttachment[]) {\n if (addedAttachments.length === 0) {\n return;\n }\n\n // Ignore attachments that are already in the manager\n const newAttachments = addedAttachments.filter(\n (attachment) => !attachments.has(attachment.id)\n );\n\n const attachmentsToUpload: CommentLocalAttachment[] = [];\n\n // Add all the new attachments to the manager\n for (const attachment of newAttachments) {\n if (attachment.type === \"localAttachment\") {\n // The file is too large to be uploaded\n if (attachment.file.size > options.maxFileSize) {\n attachments.set(attachment.id, {\n ...attachment,\n status: \"error\",\n error: new AttachmentTooLargeError(\"File is too large.\", \"client\"),\n });\n\n continue;\n }\n\n // Otherwise, mark the attachment to be uploaded\n attachments.set(attachment.id, {\n ...attachment,\n status: \"uploading\",\n });\n attachmentsToUpload.push(attachment);\n } else {\n attachments.set(attachment.id, attachment);\n }\n }\n\n // Notify subscribers about the new attachments that were added\n if (newAttachments.length > 0) {\n notifySubscribers();\n }\n\n // Upload all the new local attachments\n for (const attachment of attachmentsToUpload) {\n uploadAttachment(attachment);\n }\n }\n\n function removeAttachment(attachmentId: string) {\n const abortController = abortControllers.get(attachmentId);\n\n abortController?.abort();\n\n attachments.delete(attachmentId);\n abortControllers.delete(attachmentId);\n\n notifySubscribers();\n }\n\n function getSnapshot() {\n if (!cachedSnapshot) {\n cachedSnapshot = Array.from(attachments.values());\n }\n\n return cachedSnapshot;\n }\n\n // Clear all attachments and abort all ongoing uploads\n function clear() {\n abortControllers.forEach((controller) => controller.abort());\n abortControllers.clear();\n attachments.clear();\n\n notifySubscribers();\n }\n\n return {\n addAttachments,\n removeAttachment,\n getSnapshot,\n subscribe: eventSource.subscribe,\n clear,\n };\n}\n\nfunction preventBeforeUnloadDefault(event: BeforeUnloadEvent) {\n event.preventDefault();\n}\n\nexport function useComposerAttachmentsManager(\n defaultAttachments: CommentAttachment[],\n options: ComposerAttachmentsManagerOptions\n) {\n const client = useClient();\n const frozenDefaultAttachments = useInitial(defaultAttachments);\n const frozenAttachmentsManager = useInitial(() =>\n createComposerAttachmentsManager(client, options.roomId, options)\n );\n\n // Initialize default attachments on mount\n useEffect(() => {\n frozenAttachmentsManager.addAttachments(frozenDefaultAttachments);\n }, [frozenDefaultAttachments, frozenAttachmentsManager]);\n\n // Clear on unmount\n useEffect(() => {\n return () => {\n frozenAttachmentsManager.clear();\n };\n }, [frozenAttachmentsManager]);\n\n const attachments = useSyncExternalStore(\n frozenAttachmentsManager.subscribe,\n frozenAttachmentsManager.getSnapshot,\n frozenAttachmentsManager.getSnapshot\n );\n\n const isUploadingAttachments = useMemo(() => {\n return attachments.some(\n (attachment) =>\n attachment.type === \"localAttachment\" &&\n attachment.status === \"uploading\"\n );\n }, [attachments]);\n\n useEffect(() => {\n if (!isUploadingAttachments) {\n return;\n }\n\n window.addEventListener(\"beforeunload\", preventBeforeUnloadDefault);\n\n return () => {\n window.removeEventListener(\"beforeunload\", preventBeforeUnloadDefault);\n };\n }, [isUploadingAttachments]);\n\n return {\n attachments,\n isUploadingAttachments,\n addAttachments: frozenAttachmentsManager.addAttachments,\n removeAttachment: frozenAttachmentsManager.removeAttachment,\n clearAttachments: frozenAttachmentsManager.clear,\n };\n}\n"],"names":["inline"],"mappings":"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"}
|
|
@@ -167,6 +167,7 @@ const Duration = react.forwardRef(
|
|
|
167
167
|
);
|
|
168
168
|
const title = react.useMemo(
|
|
169
169
|
() => typeof renderTitle === "function" ? renderTitle(resolvedDuration, locale) : renderTitle,
|
|
170
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
170
171
|
[renderTitle, resolvedDuration, locale]
|
|
171
172
|
);
|
|
172
173
|
const children = react.useMemo(
|
|
@@ -177,13 +178,16 @@ const Duration = react.forwardRef(
|
|
|
177
178
|
rerender,
|
|
178
179
|
from !== void 0 && to === void 0 ? interval : false
|
|
179
180
|
);
|
|
180
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
181
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
182
|
+
Component,
|
|
183
|
+
{
|
|
184
|
+
...props,
|
|
185
|
+
ref: forwardedRef,
|
|
186
|
+
dateTime: dateTime ?? normalizedDuration,
|
|
187
|
+
title,
|
|
188
|
+
children
|
|
189
|
+
}
|
|
190
|
+
);
|
|
187
191
|
}
|
|
188
192
|
);
|
|
189
193
|
if (process.env.NODE_ENV !== "production") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Duration.cjs","sources":["../../src/primitives/Duration.tsx"],"sourcesContent":["\"use client\";\n\nimport type { Relax } from \"@liveblocks/core\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { forwardRef, type ReactNode, useMemo } from \"react\";\n\nimport type { ComponentPropsWithSlot } from \"../types\";\nimport { numberFormat } from \"../utils/intl\";\nimport { useInterval } from \"../utils/use-interval\";\nimport { useRerender } from \"../utils/use-rerender\";\n\nconst RENDER_INTERVAL = 0.5 * 1000; // 0.5 second\n\nconst DURATION_NAME = \"Duration\";\n\nexport type DurationProps = Omit<\n ComponentPropsWithSlot<\"time\">,\n \"children\" | \"title\"\n> &\n Relax<\n | {\n /**\n * The duration in milliseconds.\n * If provided, `from` and `to` will be ignored.\n */\n duration: number;\n }\n | {\n /**\n * The date at which the duration starts.\n * If provided, `duration` will be ignored.\n * If provided without `to` it means that the duration is in progress,\n * and the component will re-render at an interval, customizable with\n * the `interval` prop.\n */\n from: Date | string | number;\n\n /**\n * The date at which the duration ends.\n * If `from` is provided without `to`, `Date.now()` will be used.\n */\n to?: Date | string | number;\n }\n > & {\n /**\n * A function to format the displayed duration.\n */\n children?: (duration: number, locale?: string) => ReactNode;\n\n /**\n * The `title` attribute's value or a function to format it.\n */\n title?: string | ((duration: number, locale?: string) => string);\n\n /**\n * The interval in milliseconds at which the component will re-render if\n * `from` is provided without `to`, meaning that the duration is in progress.\n * Can be set to `false` to disable re-rendering.\n */\n interval?: number | false;\n\n /**\n * The locale used when formatting the duration.\n */\n locale?: string;\n };\n\ninterface DurationParts {\n weeks: number;\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n milliseconds: number;\n}\n\nfunction getDurationParts(duration: number): DurationParts {\n let remaining = Math.max(duration, 0);\n\n const milliseconds = remaining % 1000;\n remaining = Math.floor(remaining / 1000);\n\n const seconds = remaining % 60;\n remaining = Math.floor(remaining / 60);\n\n const minutes = remaining % 60;\n remaining = Math.floor(remaining / 60);\n\n const hours = remaining % 24;\n remaining = Math.floor(remaining / 24);\n\n const days = remaining % 7;\n const weeks = Math.floor(remaining / 7);\n\n return { weeks, days, hours, minutes, seconds, milliseconds };\n}\n\nconst durationPartsToNumberFormatOptions: Record<\n keyof DurationParts,\n Intl.NumberFormatOptions[\"unit\"]\n> = {\n weeks: \"week\",\n days: \"day\",\n hours: \"hour\",\n minutes: \"minute\",\n seconds: \"second\",\n milliseconds: \"millisecond\",\n};\n\n/**\n * Formats a duration in a short format.\n * TODO: Use `Intl.DurationFormat` when it's better supported.\n */\nfunction formatShortDuration(duration: number, locale?: string) {\n let resolvedLocale: string;\n\n if (locale) {\n resolvedLocale = locale;\n } else {\n const formatter = numberFormat();\n\n resolvedLocale = formatter.resolvedOptions().locale;\n }\n\n const parts = getDurationParts(duration);\n const formattedParts: string[] = [];\n\n for (const [unit, value] of Object.entries(parts) as [\n keyof DurationParts,\n number,\n ][]) {\n if (value === 0 || unit === \"milliseconds\") {\n continue;\n }\n\n const formatter = numberFormat(resolvedLocale, {\n style: \"unit\",\n unit: durationPartsToNumberFormatOptions[unit],\n unitDisplay: \"narrow\",\n });\n\n formattedParts.push(formatter.format(value));\n }\n\n if (!formattedParts.length) {\n formattedParts.push(\n numberFormat(resolvedLocale, {\n style: \"unit\",\n unit: \"second\",\n unitDisplay: \"narrow\",\n }).format(0)\n );\n }\n\n return formattedParts.join(\" \");\n}\n\n/**\n * Formats a duration in a longer format.\n * TODO: Use `Intl.DurationFormat` when it's better supported.\n */\nfunction formatVerboseDuration(duration: number, locale?: string) {\n let resolvedLocale: string;\n\n if (locale) {\n resolvedLocale = locale;\n } else {\n const formatter = numberFormat();\n\n resolvedLocale = formatter.resolvedOptions().locale;\n }\n\n const parts = getDurationParts(duration);\n const formattedParts: string[] = [];\n\n for (const [unit, value] of Object.entries(parts) as [\n keyof DurationParts,\n number,\n ][]) {\n if (value === 0 || unit === \"milliseconds\") {\n continue;\n }\n\n const formatter = numberFormat(resolvedLocale, {\n style: \"unit\",\n unit: durationPartsToNumberFormatOptions[unit],\n unitDisplay: \"long\",\n });\n\n formattedParts.push(formatter.format(value));\n }\n\n if (!formattedParts.length) {\n formattedParts.push(\n numberFormat(resolvedLocale, {\n style: \"unit\",\n unit: \"second\",\n unitDisplay: \"long\",\n }).format(0)\n );\n }\n\n return formattedParts.join(\" \");\n}\n\n/**\n * Formats a duration as ISO 8601.\n * TODO: Use `Temporal.Duration` when it's better supported.\n */\nexport function formatIso8601Duration(duration: number) {\n const normalizedDuration = Math.max(duration, 0);\n\n if (normalizedDuration === 0) {\n return \"PT0S\";\n }\n\n const { weeks, days, hours, minutes, seconds, milliseconds } =\n getDurationParts(normalizedDuration);\n\n let isoDuration = \"P\";\n\n // 1. Weeks\n if (weeks > 0) {\n isoDuration += `${weeks}W`;\n }\n\n // 2. Days\n if (days > 0) {\n isoDuration += `${days}D`;\n }\n\n if (hours > 0 || minutes > 0 || seconds > 0 || milliseconds > 0) {\n isoDuration += \"T\";\n\n // 3. Hours\n if (hours > 0) {\n isoDuration += `${hours}H`;\n }\n\n // 4. Minutes\n if (minutes > 0) {\n isoDuration += `${minutes}M`;\n }\n\n // 5. Seconds and milliseconds\n if (seconds > 0 || milliseconds > 0) {\n if (milliseconds > 0) {\n isoDuration += `${seconds}.${milliseconds.toString().padStart(3, \"0\").replace(/0+$/, \"\")}S`;\n } else {\n isoDuration += `${seconds}S`;\n }\n }\n }\n\n return isoDuration;\n}\n\n/**\n * Converts a Date or Date-like value to a timestamp in milliseconds.\n */\nfunction getDateTime(date: Date | string | number) {\n if (date instanceof Date) {\n return date.getTime();\n }\n\n return new Date(date).getTime();\n}\n\n/**\n * Get a duration between two Date or Date-like values.\n */\nexport function getDuration(\n from: Date | string | number,\n to: Date | string | number\n) {\n return getDateTime(to) - getDateTime(from);\n}\n\n/**\n * Displays a formatted duration, and automatically re-renders to if the\n * duration is in progress.\n *\n * @example\n * <Duration duration={3 * 60 * 1000} />\n *\n * @example\n * <Duration from={fiveHoursAgoDate} />\n *\n * @example\n * <Duration from={fiveHoursAgoDate} to={oneHourAgoDate} />\n */\nexport const Duration = forwardRef<HTMLTimeElement, DurationProps>(\n (\n {\n duration,\n from,\n to,\n locale,\n dateTime,\n title: renderTitle = formatVerboseDuration,\n children: renderChildren = formatShortDuration,\n interval = RENDER_INTERVAL,\n asChild,\n ...props\n },\n forwardedRef\n ) => {\n const Component = asChild ? Slot : \"time\";\n const [rerender, key] = useRerender();\n const resolvedDuration = useMemo(() => {\n if (duration !== undefined) {\n return duration;\n }\n\n if (from !== undefined) {\n return getDuration(from, to ?? Date.now());\n }\n\n return 0;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [duration, from, to, key]);\n const normalizedDuration = useMemo(\n () => formatIso8601Duration(resolvedDuration),\n [resolvedDuration]\n );\n const title = useMemo(\n () =>\n typeof renderTitle === \"function\"\n ? renderTitle(resolvedDuration, locale)\n : renderTitle,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [renderTitle, resolvedDuration, locale]\n );\n const children = useMemo(\n () =>\n typeof renderChildren === \"function\"\n ? renderChildren(resolvedDuration, locale)\n : renderChildren,\n\n [renderChildren, resolvedDuration, locale]\n );\n\n // Only re-render if the duration is in progress.\n useInterval(\n rerender,\n from !== undefined && to === undefined ? interval : false\n );\n\n return (\n <Component\n {...props}\n ref={forwardedRef}\n dateTime={dateTime ?? normalizedDuration}\n title={title}\n >\n {children}\n </Component>\n );\n }\n);\n\nif (process.env.NODE_ENV !== \"production\") {\n Duration.displayName = DURATION_NAME;\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAWA;AAEA;AA+DA;AACE;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACF;AAEA;AAGI;AACK;AACD;AACC;AACE;AACA;AAEX;AAMA;AACE;AAEA;AACE;AAAiB;AAEjB;AAEA;AAA6C;AAG/C;AACA;AAEA;AAIE;AACE;AAAA;AAGF;AAA+C;AACtC;AACkC;AAC5B;AAGf;AAA2C;AAG7C;AACE;AAAe;AACgB;AACpB;AACD;AACO;AACJ;AACb;AAGF;AACF;AAMA;AACE;AAEA;AACE;AAAiB;AAEjB;AAEA;AAA6C;AAG/C;AACA;AAEA;AAIE;AACE;AAAA;AAGF;AAA+C;AACtC;AACkC;AAC5B;AAGf;AAA2C;AAG7C;AACE;AAAe;AACgB;AACpB;AACD;AACO;AACJ;AACb;AAGF;AACF;AAMO;AACL;AAEA;AACE;AAAO;AAGT;AAGA;AAGA;AACE;AAAkB;AAIpB;AACE;AAAkB;AAGpB;AACE;AAGA;AACE;AAAkB;AAIpB;AACE;AAAkB;AAIpB;AACE;AACE;AAAuF;AAEvF;AAAkB;AACpB;AACF;AAGF;AACF;AAKA;AACE;AACE;AAAoB;AAGtB;AACF;AAKgB;AAId;AACF;AAeO;AAAiB;AAEpB;AACE;AACA;AACA;AACA;AACA;AACqB;AACM;AAChB;AACX;AACG;AAIL;AACA;AACA;AACE;AACE;AAAO;AAGT;AACE;AAAyC;AAG3C;AAAO;AAGT;AAA2B;AACmB;AAC3B;AAEnB;AAAc;AAIN;AAEgC;AAExC;AAAiB;AAIT;AAEmC;AAI3C;AAAA;AACE;AACoD;AAGtD;AACG;AACK;AACC;AACiB;AACtB;AAEC;AACH;AAGN;AAEA;AACE;AACF;;;;"}
|
|
1
|
+
{"version":3,"file":"Duration.cjs","sources":["../../src/primitives/Duration.tsx"],"sourcesContent":["\"use client\";\n\nimport type { Relax } from \"@liveblocks/core\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { forwardRef, type ReactNode, useMemo } from \"react\";\n\nimport type { ComponentPropsWithSlot } from \"../types\";\nimport { numberFormat } from \"../utils/intl\";\nimport { useInterval } from \"../utils/use-interval\";\nimport { useRerender } from \"../utils/use-rerender\";\n\nconst RENDER_INTERVAL = 0.5 * 1000; // 0.5 second\n\nconst DURATION_NAME = \"Duration\";\n\nexport type DurationProps = Omit<\n ComponentPropsWithSlot<\"time\">,\n \"children\" | \"title\"\n> &\n Relax<\n | {\n /**\n * The duration in milliseconds.\n * If provided, `from` and `to` will be ignored.\n */\n duration: number;\n }\n | {\n /**\n * The date at which the duration starts.\n * If provided, `duration` will be ignored.\n * If provided without `to` it means that the duration is in progress,\n * and the component will re-render at an interval, customizable with\n * the `interval` prop.\n */\n from: Date | string | number;\n\n /**\n * The date at which the duration ends.\n * If `from` is provided without `to`, `Date.now()` will be used.\n */\n to?: Date | string | number;\n }\n > & {\n /**\n * A function to format the displayed duration.\n */\n children?: (duration: number, locale?: string) => ReactNode;\n\n /**\n * The `title` attribute's value or a function to format it.\n */\n title?: string | ((duration: number, locale?: string) => string);\n\n /**\n * The interval in milliseconds at which the component will re-render if\n * `from` is provided without `to`, meaning that the duration is in progress.\n * Can be set to `false` to disable re-rendering.\n */\n interval?: number | false;\n\n /**\n * The locale used when formatting the duration.\n */\n locale?: string;\n };\n\ninterface DurationParts {\n weeks: number;\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n milliseconds: number;\n}\n\nfunction getDurationParts(duration: number): DurationParts {\n let remaining = Math.max(duration, 0);\n\n const milliseconds = remaining % 1000;\n remaining = Math.floor(remaining / 1000);\n\n const seconds = remaining % 60;\n remaining = Math.floor(remaining / 60);\n\n const minutes = remaining % 60;\n remaining = Math.floor(remaining / 60);\n\n const hours = remaining % 24;\n remaining = Math.floor(remaining / 24);\n\n const days = remaining % 7;\n const weeks = Math.floor(remaining / 7);\n\n return { weeks, days, hours, minutes, seconds, milliseconds };\n}\n\nconst durationPartsToNumberFormatOptions: Record<\n keyof DurationParts,\n Intl.NumberFormatOptions[\"unit\"]\n> = {\n weeks: \"week\",\n days: \"day\",\n hours: \"hour\",\n minutes: \"minute\",\n seconds: \"second\",\n milliseconds: \"millisecond\",\n};\n\n/**\n * Formats a duration in a short format.\n * TODO: Use `Intl.DurationFormat` when it's better supported.\n */\nfunction formatShortDuration(duration: number, locale?: string) {\n let resolvedLocale: string;\n\n if (locale) {\n resolvedLocale = locale;\n } else {\n const formatter = numberFormat();\n\n resolvedLocale = formatter.resolvedOptions().locale;\n }\n\n const parts = getDurationParts(duration);\n const formattedParts: string[] = [];\n\n for (const [unit, value] of Object.entries(parts) as [\n keyof DurationParts,\n number,\n ][]) {\n if (value === 0 || unit === \"milliseconds\") {\n continue;\n }\n\n const formatter = numberFormat(resolvedLocale, {\n style: \"unit\",\n unit: durationPartsToNumberFormatOptions[unit],\n unitDisplay: \"narrow\",\n });\n\n formattedParts.push(formatter.format(value));\n }\n\n if (!formattedParts.length) {\n formattedParts.push(\n numberFormat(resolvedLocale, {\n style: \"unit\",\n unit: \"second\",\n unitDisplay: \"narrow\",\n }).format(0)\n );\n }\n\n return formattedParts.join(\" \");\n}\n\n/**\n * Formats a duration in a longer format.\n * TODO: Use `Intl.DurationFormat` when it's better supported.\n */\nfunction formatVerboseDuration(duration: number, locale?: string) {\n let resolvedLocale: string;\n\n if (locale) {\n resolvedLocale = locale;\n } else {\n const formatter = numberFormat();\n\n resolvedLocale = formatter.resolvedOptions().locale;\n }\n\n const parts = getDurationParts(duration);\n const formattedParts: string[] = [];\n\n for (const [unit, value] of Object.entries(parts) as [\n keyof DurationParts,\n number,\n ][]) {\n if (value === 0 || unit === \"milliseconds\") {\n continue;\n }\n\n const formatter = numberFormat(resolvedLocale, {\n style: \"unit\",\n unit: durationPartsToNumberFormatOptions[unit],\n unitDisplay: \"long\",\n });\n\n formattedParts.push(formatter.format(value));\n }\n\n if (!formattedParts.length) {\n formattedParts.push(\n numberFormat(resolvedLocale, {\n style: \"unit\",\n unit: \"second\",\n unitDisplay: \"long\",\n }).format(0)\n );\n }\n\n return formattedParts.join(\" \");\n}\n\n/**\n * Formats a duration as ISO 8601.\n * TODO: Use `Temporal.Duration` when it's better supported.\n */\nexport function formatIso8601Duration(duration: number) {\n const normalizedDuration = Math.max(duration, 0);\n\n if (normalizedDuration === 0) {\n return \"PT0S\";\n }\n\n const { weeks, days, hours, minutes, seconds, milliseconds } =\n getDurationParts(normalizedDuration);\n\n let isoDuration = \"P\";\n\n // 1. Weeks\n if (weeks > 0) {\n isoDuration += `${weeks}W`;\n }\n\n // 2. Days\n if (days > 0) {\n isoDuration += `${days}D`;\n }\n\n if (hours > 0 || minutes > 0 || seconds > 0 || milliseconds > 0) {\n isoDuration += \"T\";\n\n // 3. Hours\n if (hours > 0) {\n isoDuration += `${hours}H`;\n }\n\n // 4. Minutes\n if (minutes > 0) {\n isoDuration += `${minutes}M`;\n }\n\n // 5. Seconds and milliseconds\n if (seconds > 0 || milliseconds > 0) {\n if (milliseconds > 0) {\n isoDuration += `${seconds}.${milliseconds.toString().padStart(3, \"0\").replace(/0+$/, \"\")}S`;\n } else {\n isoDuration += `${seconds}S`;\n }\n }\n }\n\n return isoDuration;\n}\n\n/**\n * Converts a Date or Date-like value to a timestamp in milliseconds.\n */\nfunction getDateTime(date: Date | string | number) {\n if (date instanceof Date) {\n return date.getTime();\n }\n\n return new Date(date).getTime();\n}\n\n/**\n * Get a duration between two Date or Date-like values.\n */\nexport function getDuration(\n from: Date | string | number,\n to: Date | string | number\n) {\n return getDateTime(to) - getDateTime(from);\n}\n\n/**\n * Displays a formatted duration, and automatically re-renders to if the\n * duration is in progress.\n *\n * @example\n * <Duration duration={3 * 60 * 1000} />\n *\n * @example\n * <Duration from={fiveHoursAgoDate} />\n *\n * @example\n * <Duration from={fiveHoursAgoDate} to={oneHourAgoDate} />\n */\nexport const Duration = forwardRef<HTMLTimeElement, DurationProps>(\n (\n {\n duration,\n from,\n to,\n locale,\n dateTime,\n title: renderTitle = formatVerboseDuration,\n children: renderChildren = formatShortDuration,\n interval = RENDER_INTERVAL,\n asChild,\n ...props\n },\n forwardedRef\n ) => {\n const Component = asChild ? Slot : \"time\";\n const [rerender, key] = useRerender();\n const resolvedDuration = useMemo(() => {\n if (duration !== undefined) {\n return duration;\n }\n\n if (from !== undefined) {\n return getDuration(from, to ?? Date.now());\n }\n\n return 0;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [duration, from, to, key]);\n const normalizedDuration = useMemo(\n () => formatIso8601Duration(resolvedDuration),\n [resolvedDuration]\n );\n const title = useMemo(\n () =>\n typeof renderTitle === \"function\"\n ? renderTitle(resolvedDuration, locale)\n : renderTitle,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [renderTitle, resolvedDuration, locale]\n );\n const children = useMemo(\n () =>\n typeof renderChildren === \"function\"\n ? renderChildren(resolvedDuration, locale)\n : renderChildren,\n\n [renderChildren, resolvedDuration, locale]\n );\n\n // Only re-render if the duration is in progress.\n useInterval(\n rerender,\n from !== undefined && to === undefined ? interval : false\n );\n\n return (\n <Component\n {...props}\n ref={forwardedRef}\n dateTime={dateTime ?? normalizedDuration}\n title={title}\n >\n {children}\n </Component>\n );\n }\n);\n\nif (process.env.NODE_ENV !== \"production\") {\n Duration.displayName = DURATION_NAME;\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAWA;AAEA;AA+DA;AACE;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACF;AAEA;AAGI;AACK;AACD;AACC;AACE;AACA;AAEX;AAMA;AACE;AAEA;AACE;AAAiB;AAEjB;AAEA;AAA6C;AAG/C;AACA;AAEA;AAIE;AACE;AAAA;AAGF;AAA+C;AACtC;AACsC;AAChC;AAGf;AAA2C;AAG7C;AACE;AAAe;AACgB;AACpB;AACD;AACO;AACJ;AACb;AAGF;AACF;AAMA;AACE;AAEA;AACE;AAAiB;AAEjB;AAEA;AAA6C;AAG/C;AACA;AAEA;AAIE;AACE;AAAA;AAGF;AAA+C;AACtC;AACsC;AAChC;AAGf;AAA2C;AAG7C;AACE;AAAe;AACgB;AACpB;AACD;AACO;AACJ;AACb;AAGF;AACF;AAMO;AACL;AAEA;AACE;AAAO;AAGT;AAGA;AAGA;AACE;AAAuB;AAIzB;AACE;AAAsB;AAGxB;AACE;AAGA;AACE;AAAuB;AAIzB;AACE;AAAyB;AAI3B;AACE;AACE;AAAwF;AAExF;AAAyB;AAC3B;AACF;AAGF;AACF;AAKA;AACE;AACE;AAAoB;AAGtB;AACF;AAKgB;AAId;AACF;AAeO;AAAiB;AAEpB;AACE;AACA;AACA;AACA;AACA;AACqB;AACM;AAChB;AACX;AACG;AAIL;AACA;AACA;AACE;AACE;AAAO;AAGT;AACE;AAAyC;AAG3C;AAAO;AAGT;AAA2B;AACmB;AAC3B;AAEnB;AAAc;AAIN;AAAA;AAEgC;AAExC;AAAiB;AAIT;AAEmC;AAI3C;AAAA;AACE;AACoD;AAGtD;AACE;AAAC;AAAA;AACK;AACC;AACiB;AACtB;AAEC;AAAA;AACH;AAGN;AAEA;AACE;AACF;;;;"}
|
|
@@ -165,6 +165,7 @@ const Duration = forwardRef(
|
|
|
165
165
|
);
|
|
166
166
|
const title = useMemo(
|
|
167
167
|
() => typeof renderTitle === "function" ? renderTitle(resolvedDuration, locale) : renderTitle,
|
|
168
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
168
169
|
[renderTitle, resolvedDuration, locale]
|
|
169
170
|
);
|
|
170
171
|
const children = useMemo(
|
|
@@ -175,13 +176,16 @@ const Duration = forwardRef(
|
|
|
175
176
|
rerender,
|
|
176
177
|
from !== void 0 && to === void 0 ? interval : false
|
|
177
178
|
);
|
|
178
|
-
return /* @__PURE__ */ jsx(
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
179
|
+
return /* @__PURE__ */ jsx(
|
|
180
|
+
Component,
|
|
181
|
+
{
|
|
182
|
+
...props,
|
|
183
|
+
ref: forwardedRef,
|
|
184
|
+
dateTime: dateTime ?? normalizedDuration,
|
|
185
|
+
title,
|
|
186
|
+
children
|
|
187
|
+
}
|
|
188
|
+
);
|
|
185
189
|
}
|
|
186
190
|
);
|
|
187
191
|
if (process.env.NODE_ENV !== "production") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Duration.js","sources":["../../src/primitives/Duration.tsx"],"sourcesContent":["\"use client\";\n\nimport type { Relax } from \"@liveblocks/core\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { forwardRef, type ReactNode, useMemo } from \"react\";\n\nimport type { ComponentPropsWithSlot } from \"../types\";\nimport { numberFormat } from \"../utils/intl\";\nimport { useInterval } from \"../utils/use-interval\";\nimport { useRerender } from \"../utils/use-rerender\";\n\nconst RENDER_INTERVAL = 0.5 * 1000; // 0.5 second\n\nconst DURATION_NAME = \"Duration\";\n\nexport type DurationProps = Omit<\n ComponentPropsWithSlot<\"time\">,\n \"children\" | \"title\"\n> &\n Relax<\n | {\n /**\n * The duration in milliseconds.\n * If provided, `from` and `to` will be ignored.\n */\n duration: number;\n }\n | {\n /**\n * The date at which the duration starts.\n * If provided, `duration` will be ignored.\n * If provided without `to` it means that the duration is in progress,\n * and the component will re-render at an interval, customizable with\n * the `interval` prop.\n */\n from: Date | string | number;\n\n /**\n * The date at which the duration ends.\n * If `from` is provided without `to`, `Date.now()` will be used.\n */\n to?: Date | string | number;\n }\n > & {\n /**\n * A function to format the displayed duration.\n */\n children?: (duration: number, locale?: string) => ReactNode;\n\n /**\n * The `title` attribute's value or a function to format it.\n */\n title?: string | ((duration: number, locale?: string) => string);\n\n /**\n * The interval in milliseconds at which the component will re-render if\n * `from` is provided without `to`, meaning that the duration is in progress.\n * Can be set to `false` to disable re-rendering.\n */\n interval?: number | false;\n\n /**\n * The locale used when formatting the duration.\n */\n locale?: string;\n };\n\ninterface DurationParts {\n weeks: number;\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n milliseconds: number;\n}\n\nfunction getDurationParts(duration: number): DurationParts {\n let remaining = Math.max(duration, 0);\n\n const milliseconds = remaining % 1000;\n remaining = Math.floor(remaining / 1000);\n\n const seconds = remaining % 60;\n remaining = Math.floor(remaining / 60);\n\n const minutes = remaining % 60;\n remaining = Math.floor(remaining / 60);\n\n const hours = remaining % 24;\n remaining = Math.floor(remaining / 24);\n\n const days = remaining % 7;\n const weeks = Math.floor(remaining / 7);\n\n return { weeks, days, hours, minutes, seconds, milliseconds };\n}\n\nconst durationPartsToNumberFormatOptions: Record<\n keyof DurationParts,\n Intl.NumberFormatOptions[\"unit\"]\n> = {\n weeks: \"week\",\n days: \"day\",\n hours: \"hour\",\n minutes: \"minute\",\n seconds: \"second\",\n milliseconds: \"millisecond\",\n};\n\n/**\n * Formats a duration in a short format.\n * TODO: Use `Intl.DurationFormat` when it's better supported.\n */\nfunction formatShortDuration(duration: number, locale?: string) {\n let resolvedLocale: string;\n\n if (locale) {\n resolvedLocale = locale;\n } else {\n const formatter = numberFormat();\n\n resolvedLocale = formatter.resolvedOptions().locale;\n }\n\n const parts = getDurationParts(duration);\n const formattedParts: string[] = [];\n\n for (const [unit, value] of Object.entries(parts) as [\n keyof DurationParts,\n number,\n ][]) {\n if (value === 0 || unit === \"milliseconds\") {\n continue;\n }\n\n const formatter = numberFormat(resolvedLocale, {\n style: \"unit\",\n unit: durationPartsToNumberFormatOptions[unit],\n unitDisplay: \"narrow\",\n });\n\n formattedParts.push(formatter.format(value));\n }\n\n if (!formattedParts.length) {\n formattedParts.push(\n numberFormat(resolvedLocale, {\n style: \"unit\",\n unit: \"second\",\n unitDisplay: \"narrow\",\n }).format(0)\n );\n }\n\n return formattedParts.join(\" \");\n}\n\n/**\n * Formats a duration in a longer format.\n * TODO: Use `Intl.DurationFormat` when it's better supported.\n */\nfunction formatVerboseDuration(duration: number, locale?: string) {\n let resolvedLocale: string;\n\n if (locale) {\n resolvedLocale = locale;\n } else {\n const formatter = numberFormat();\n\n resolvedLocale = formatter.resolvedOptions().locale;\n }\n\n const parts = getDurationParts(duration);\n const formattedParts: string[] = [];\n\n for (const [unit, value] of Object.entries(parts) as [\n keyof DurationParts,\n number,\n ][]) {\n if (value === 0 || unit === \"milliseconds\") {\n continue;\n }\n\n const formatter = numberFormat(resolvedLocale, {\n style: \"unit\",\n unit: durationPartsToNumberFormatOptions[unit],\n unitDisplay: \"long\",\n });\n\n formattedParts.push(formatter.format(value));\n }\n\n if (!formattedParts.length) {\n formattedParts.push(\n numberFormat(resolvedLocale, {\n style: \"unit\",\n unit: \"second\",\n unitDisplay: \"long\",\n }).format(0)\n );\n }\n\n return formattedParts.join(\" \");\n}\n\n/**\n * Formats a duration as ISO 8601.\n * TODO: Use `Temporal.Duration` when it's better supported.\n */\nexport function formatIso8601Duration(duration: number) {\n const normalizedDuration = Math.max(duration, 0);\n\n if (normalizedDuration === 0) {\n return \"PT0S\";\n }\n\n const { weeks, days, hours, minutes, seconds, milliseconds } =\n getDurationParts(normalizedDuration);\n\n let isoDuration = \"P\";\n\n // 1. Weeks\n if (weeks > 0) {\n isoDuration += `${weeks}W`;\n }\n\n // 2. Days\n if (days > 0) {\n isoDuration += `${days}D`;\n }\n\n if (hours > 0 || minutes > 0 || seconds > 0 || milliseconds > 0) {\n isoDuration += \"T\";\n\n // 3. Hours\n if (hours > 0) {\n isoDuration += `${hours}H`;\n }\n\n // 4. Minutes\n if (minutes > 0) {\n isoDuration += `${minutes}M`;\n }\n\n // 5. Seconds and milliseconds\n if (seconds > 0 || milliseconds > 0) {\n if (milliseconds > 0) {\n isoDuration += `${seconds}.${milliseconds.toString().padStart(3, \"0\").replace(/0+$/, \"\")}S`;\n } else {\n isoDuration += `${seconds}S`;\n }\n }\n }\n\n return isoDuration;\n}\n\n/**\n * Converts a Date or Date-like value to a timestamp in milliseconds.\n */\nfunction getDateTime(date: Date | string | number) {\n if (date instanceof Date) {\n return date.getTime();\n }\n\n return new Date(date).getTime();\n}\n\n/**\n * Get a duration between two Date or Date-like values.\n */\nexport function getDuration(\n from: Date | string | number,\n to: Date | string | number\n) {\n return getDateTime(to) - getDateTime(from);\n}\n\n/**\n * Displays a formatted duration, and automatically re-renders to if the\n * duration is in progress.\n *\n * @example\n * <Duration duration={3 * 60 * 1000} />\n *\n * @example\n * <Duration from={fiveHoursAgoDate} />\n *\n * @example\n * <Duration from={fiveHoursAgoDate} to={oneHourAgoDate} />\n */\nexport const Duration = forwardRef<HTMLTimeElement, DurationProps>(\n (\n {\n duration,\n from,\n to,\n locale,\n dateTime,\n title: renderTitle = formatVerboseDuration,\n children: renderChildren = formatShortDuration,\n interval = RENDER_INTERVAL,\n asChild,\n ...props\n },\n forwardedRef\n ) => {\n const Component = asChild ? Slot : \"time\";\n const [rerender, key] = useRerender();\n const resolvedDuration = useMemo(() => {\n if (duration !== undefined) {\n return duration;\n }\n\n if (from !== undefined) {\n return getDuration(from, to ?? Date.now());\n }\n\n return 0;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [duration, from, to, key]);\n const normalizedDuration = useMemo(\n () => formatIso8601Duration(resolvedDuration),\n [resolvedDuration]\n );\n const title = useMemo(\n () =>\n typeof renderTitle === \"function\"\n ? renderTitle(resolvedDuration, locale)\n : renderTitle,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [renderTitle, resolvedDuration, locale]\n );\n const children = useMemo(\n () =>\n typeof renderChildren === \"function\"\n ? renderChildren(resolvedDuration, locale)\n : renderChildren,\n\n [renderChildren, resolvedDuration, locale]\n );\n\n // Only re-render if the duration is in progress.\n useInterval(\n rerender,\n from !== undefined && to === undefined ? interval : false\n );\n\n return (\n <Component\n {...props}\n ref={forwardedRef}\n dateTime={dateTime ?? normalizedDuration}\n title={title}\n >\n {children}\n </Component>\n );\n }\n);\n\nif (process.env.NODE_ENV !== \"production\") {\n Duration.displayName = DURATION_NAME;\n}\n"],"names":[],"mappings":";;;;;;;;;AAWA;AAEA;AA+DA;AACE;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACF;AAEA;AAGI;AACK;AACD;AACC;AACE;AACA;AAEX;AAMA;AACE;AAEA;AACE;AAAiB;AAEjB;AAEA;AAA6C;AAG/C;AACA;AAEA;AAIE;AACE;AAAA;AAGF;AAA+C;AACtC;AACkC;AAC5B;AAGf;AAA2C;AAG7C;AACE;AAAe;AACgB;AACpB;AACD;AACO;AACJ;AACb;AAGF;AACF;AAMA;AACE;AAEA;AACE;AAAiB;AAEjB;AAEA;AAA6C;AAG/C;AACA;AAEA;AAIE;AACE;AAAA;AAGF;AAA+C;AACtC;AACkC;AAC5B;AAGf;AAA2C;AAG7C;AACE;AAAe;AACgB;AACpB;AACD;AACO;AACJ;AACb;AAGF;AACF;AAMO;AACL;AAEA;AACE;AAAO;AAGT;AAGA;AAGA;AACE;AAAkB;AAIpB;AACE;AAAkB;AAGpB;AACE;AAGA;AACE;AAAkB;AAIpB;AACE;AAAkB;AAIpB;AACE;AACE;AAAuF;AAEvF;AAAkB;AACpB;AACF;AAGF;AACF;AAKA;AACE;AACE;AAAoB;AAGtB;AACF;AAKgB;AAId;AACF;AAeO;AAAiB;AAEpB;AACE;AACA;AACA;AACA;AACA;AACqB;AACM;AAChB;AACX;AACG;AAIL;AACA;AACA;AACE;AACE;AAAO;AAGT;AACE;AAAyC;AAG3C;AAAO;AAGT;AAA2B;AACmB;AAC3B;AAEnB;AAAc;AAIN;AAEgC;AAExC;AAAiB;AAIT;AAEmC;AAI3C;AAAA;AACE;AACoD;AAGtD;AACG;AACK;AACC;AACiB;AACtB;AAEC;AACH;AAGN;AAEA;AACE;AACF;;"}
|
|
1
|
+
{"version":3,"file":"Duration.js","sources":["../../src/primitives/Duration.tsx"],"sourcesContent":["\"use client\";\n\nimport type { Relax } from \"@liveblocks/core\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { forwardRef, type ReactNode, useMemo } from \"react\";\n\nimport type { ComponentPropsWithSlot } from \"../types\";\nimport { numberFormat } from \"../utils/intl\";\nimport { useInterval } from \"../utils/use-interval\";\nimport { useRerender } from \"../utils/use-rerender\";\n\nconst RENDER_INTERVAL = 0.5 * 1000; // 0.5 second\n\nconst DURATION_NAME = \"Duration\";\n\nexport type DurationProps = Omit<\n ComponentPropsWithSlot<\"time\">,\n \"children\" | \"title\"\n> &\n Relax<\n | {\n /**\n * The duration in milliseconds.\n * If provided, `from` and `to` will be ignored.\n */\n duration: number;\n }\n | {\n /**\n * The date at which the duration starts.\n * If provided, `duration` will be ignored.\n * If provided without `to` it means that the duration is in progress,\n * and the component will re-render at an interval, customizable with\n * the `interval` prop.\n */\n from: Date | string | number;\n\n /**\n * The date at which the duration ends.\n * If `from` is provided without `to`, `Date.now()` will be used.\n */\n to?: Date | string | number;\n }\n > & {\n /**\n * A function to format the displayed duration.\n */\n children?: (duration: number, locale?: string) => ReactNode;\n\n /**\n * The `title` attribute's value or a function to format it.\n */\n title?: string | ((duration: number, locale?: string) => string);\n\n /**\n * The interval in milliseconds at which the component will re-render if\n * `from` is provided without `to`, meaning that the duration is in progress.\n * Can be set to `false` to disable re-rendering.\n */\n interval?: number | false;\n\n /**\n * The locale used when formatting the duration.\n */\n locale?: string;\n };\n\ninterface DurationParts {\n weeks: number;\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n milliseconds: number;\n}\n\nfunction getDurationParts(duration: number): DurationParts {\n let remaining = Math.max(duration, 0);\n\n const milliseconds = remaining % 1000;\n remaining = Math.floor(remaining / 1000);\n\n const seconds = remaining % 60;\n remaining = Math.floor(remaining / 60);\n\n const minutes = remaining % 60;\n remaining = Math.floor(remaining / 60);\n\n const hours = remaining % 24;\n remaining = Math.floor(remaining / 24);\n\n const days = remaining % 7;\n const weeks = Math.floor(remaining / 7);\n\n return { weeks, days, hours, minutes, seconds, milliseconds };\n}\n\nconst durationPartsToNumberFormatOptions: Record<\n keyof DurationParts,\n Intl.NumberFormatOptions[\"unit\"]\n> = {\n weeks: \"week\",\n days: \"day\",\n hours: \"hour\",\n minutes: \"minute\",\n seconds: \"second\",\n milliseconds: \"millisecond\",\n};\n\n/**\n * Formats a duration in a short format.\n * TODO: Use `Intl.DurationFormat` when it's better supported.\n */\nfunction formatShortDuration(duration: number, locale?: string) {\n let resolvedLocale: string;\n\n if (locale) {\n resolvedLocale = locale;\n } else {\n const formatter = numberFormat();\n\n resolvedLocale = formatter.resolvedOptions().locale;\n }\n\n const parts = getDurationParts(duration);\n const formattedParts: string[] = [];\n\n for (const [unit, value] of Object.entries(parts) as [\n keyof DurationParts,\n number,\n ][]) {\n if (value === 0 || unit === \"milliseconds\") {\n continue;\n }\n\n const formatter = numberFormat(resolvedLocale, {\n style: \"unit\",\n unit: durationPartsToNumberFormatOptions[unit],\n unitDisplay: \"narrow\",\n });\n\n formattedParts.push(formatter.format(value));\n }\n\n if (!formattedParts.length) {\n formattedParts.push(\n numberFormat(resolvedLocale, {\n style: \"unit\",\n unit: \"second\",\n unitDisplay: \"narrow\",\n }).format(0)\n );\n }\n\n return formattedParts.join(\" \");\n}\n\n/**\n * Formats a duration in a longer format.\n * TODO: Use `Intl.DurationFormat` when it's better supported.\n */\nfunction formatVerboseDuration(duration: number, locale?: string) {\n let resolvedLocale: string;\n\n if (locale) {\n resolvedLocale = locale;\n } else {\n const formatter = numberFormat();\n\n resolvedLocale = formatter.resolvedOptions().locale;\n }\n\n const parts = getDurationParts(duration);\n const formattedParts: string[] = [];\n\n for (const [unit, value] of Object.entries(parts) as [\n keyof DurationParts,\n number,\n ][]) {\n if (value === 0 || unit === \"milliseconds\") {\n continue;\n }\n\n const formatter = numberFormat(resolvedLocale, {\n style: \"unit\",\n unit: durationPartsToNumberFormatOptions[unit],\n unitDisplay: \"long\",\n });\n\n formattedParts.push(formatter.format(value));\n }\n\n if (!formattedParts.length) {\n formattedParts.push(\n numberFormat(resolvedLocale, {\n style: \"unit\",\n unit: \"second\",\n unitDisplay: \"long\",\n }).format(0)\n );\n }\n\n return formattedParts.join(\" \");\n}\n\n/**\n * Formats a duration as ISO 8601.\n * TODO: Use `Temporal.Duration` when it's better supported.\n */\nexport function formatIso8601Duration(duration: number) {\n const normalizedDuration = Math.max(duration, 0);\n\n if (normalizedDuration === 0) {\n return \"PT0S\";\n }\n\n const { weeks, days, hours, minutes, seconds, milliseconds } =\n getDurationParts(normalizedDuration);\n\n let isoDuration = \"P\";\n\n // 1. Weeks\n if (weeks > 0) {\n isoDuration += `${weeks}W`;\n }\n\n // 2. Days\n if (days > 0) {\n isoDuration += `${days}D`;\n }\n\n if (hours > 0 || minutes > 0 || seconds > 0 || milliseconds > 0) {\n isoDuration += \"T\";\n\n // 3. Hours\n if (hours > 0) {\n isoDuration += `${hours}H`;\n }\n\n // 4. Minutes\n if (minutes > 0) {\n isoDuration += `${minutes}M`;\n }\n\n // 5. Seconds and milliseconds\n if (seconds > 0 || milliseconds > 0) {\n if (milliseconds > 0) {\n isoDuration += `${seconds}.${milliseconds.toString().padStart(3, \"0\").replace(/0+$/, \"\")}S`;\n } else {\n isoDuration += `${seconds}S`;\n }\n }\n }\n\n return isoDuration;\n}\n\n/**\n * Converts a Date or Date-like value to a timestamp in milliseconds.\n */\nfunction getDateTime(date: Date | string | number) {\n if (date instanceof Date) {\n return date.getTime();\n }\n\n return new Date(date).getTime();\n}\n\n/**\n * Get a duration between two Date or Date-like values.\n */\nexport function getDuration(\n from: Date | string | number,\n to: Date | string | number\n) {\n return getDateTime(to) - getDateTime(from);\n}\n\n/**\n * Displays a formatted duration, and automatically re-renders to if the\n * duration is in progress.\n *\n * @example\n * <Duration duration={3 * 60 * 1000} />\n *\n * @example\n * <Duration from={fiveHoursAgoDate} />\n *\n * @example\n * <Duration from={fiveHoursAgoDate} to={oneHourAgoDate} />\n */\nexport const Duration = forwardRef<HTMLTimeElement, DurationProps>(\n (\n {\n duration,\n from,\n to,\n locale,\n dateTime,\n title: renderTitle = formatVerboseDuration,\n children: renderChildren = formatShortDuration,\n interval = RENDER_INTERVAL,\n asChild,\n ...props\n },\n forwardedRef\n ) => {\n const Component = asChild ? Slot : \"time\";\n const [rerender, key] = useRerender();\n const resolvedDuration = useMemo(() => {\n if (duration !== undefined) {\n return duration;\n }\n\n if (from !== undefined) {\n return getDuration(from, to ?? Date.now());\n }\n\n return 0;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [duration, from, to, key]);\n const normalizedDuration = useMemo(\n () => formatIso8601Duration(resolvedDuration),\n [resolvedDuration]\n );\n const title = useMemo(\n () =>\n typeof renderTitle === \"function\"\n ? renderTitle(resolvedDuration, locale)\n : renderTitle,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [renderTitle, resolvedDuration, locale]\n );\n const children = useMemo(\n () =>\n typeof renderChildren === \"function\"\n ? renderChildren(resolvedDuration, locale)\n : renderChildren,\n\n [renderChildren, resolvedDuration, locale]\n );\n\n // Only re-render if the duration is in progress.\n useInterval(\n rerender,\n from !== undefined && to === undefined ? interval : false\n );\n\n return (\n <Component\n {...props}\n ref={forwardedRef}\n dateTime={dateTime ?? normalizedDuration}\n title={title}\n >\n {children}\n </Component>\n );\n }\n);\n\nif (process.env.NODE_ENV !== \"production\") {\n Duration.displayName = DURATION_NAME;\n}\n"],"names":[],"mappings":";;;;;;;;;AAWA;AAEA;AA+DA;AACE;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACF;AAEA;AAGI;AACK;AACD;AACC;AACE;AACA;AAEX;AAMA;AACE;AAEA;AACE;AAAiB;AAEjB;AAEA;AAA6C;AAG/C;AACA;AAEA;AAIE;AACE;AAAA;AAGF;AAA+C;AACtC;AACsC;AAChC;AAGf;AAA2C;AAG7C;AACE;AAAe;AACgB;AACpB;AACD;AACO;AACJ;AACb;AAGF;AACF;AAMA;AACE;AAEA;AACE;AAAiB;AAEjB;AAEA;AAA6C;AAG/C;AACA;AAEA;AAIE;AACE;AAAA;AAGF;AAA+C;AACtC;AACsC;AAChC;AAGf;AAA2C;AAG7C;AACE;AAAe;AACgB;AACpB;AACD;AACO;AACJ;AACb;AAGF;AACF;AAMO;AACL;AAEA;AACE;AAAO;AAGT;AAGA;AAGA;AACE;AAAuB;AAIzB;AACE;AAAsB;AAGxB;AACE;AAGA;AACE;AAAuB;AAIzB;AACE;AAAyB;AAI3B;AACE;AACE;AAAwF;AAExF;AAAyB;AAC3B;AACF;AAGF;AACF;AAKA;AACE;AACE;AAAoB;AAGtB;AACF;AAKgB;AAId;AACF;AAeO;AAAiB;AAEpB;AACE;AACA;AACA;AACA;AACA;AACqB;AACM;AAChB;AACX;AACG;AAIL;AACA;AACA;AACE;AACE;AAAO;AAGT;AACE;AAAyC;AAG3C;AAAO;AAGT;AAA2B;AACmB;AAC3B;AAEnB;AAAc;AAIN;AAAA;AAEgC;AAExC;AAAiB;AAIT;AAEmC;AAI3C;AAAA;AACE;AACoD;AAGtD;AACE;AAAC;AAAA;AACK;AACC;AACiB;AACtB;AAEC;AAAA;AACH;AAGN;AAEA;AACE;AACF;;"}
|
|
@@ -19,13 +19,10 @@ const FileSize = react.forwardRef(
|
|
|
19
19
|
const Component = asChild ? reactSlot.Slot : "span";
|
|
20
20
|
const children = react.useMemo(
|
|
21
21
|
() => typeof renderChildren === "function" ? renderChildren(size, locale) : renderChildren,
|
|
22
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
22
23
|
[renderChildren, size]
|
|
23
24
|
);
|
|
24
|
-
return /* @__PURE__ */ jsxRuntime.jsx(Component, {
|
|
25
|
-
...props,
|
|
26
|
-
ref: forwardedRef,
|
|
27
|
-
children
|
|
28
|
-
});
|
|
25
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Component, { ...props, ref: forwardedRef, children });
|
|
29
26
|
}
|
|
30
27
|
);
|
|
31
28
|
if (process.env.NODE_ENV !== "production") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileSize.cjs","sources":["../../src/primitives/FileSize.tsx"],"sourcesContent":["\"use client\";\n\nimport { Slot } from \"@radix-ui/react-slot\";\nimport type { ReactNode } from \"react\";\nimport { forwardRef, useMemo } from \"react\";\n\nimport type { ComponentPropsWithSlot } from \"../types\";\nimport { formatFileSize } from \"../utils/format-file-size\";\n\nconst FILE_SIZE_NAME = \"FileSize\";\n\nexport interface FileSizeProps\n extends Omit<ComponentPropsWithSlot<\"span\">, \"children\"> {\n /**\n * The file size to display.\n */\n size: number;\n\n /**\n * A function to format the displayed file size.\n */\n children?: (size: number, locale?: string) => ReactNode;\n\n /**\n * The locale used when formatting the file size.\n */\n locale?: string;\n}\n\n/**\n * Displays a formatted file size.\n *\n * @example\n * <FileSize size={100000} />\n */\nexport const FileSize = forwardRef<HTMLSpanElement, FileSizeProps>(\n (\n {\n size,\n locale,\n children: renderChildren = formatFileSize,\n asChild,\n ...props\n },\n forwardedRef\n ) => {\n const Component = asChild ? Slot : \"span\";\n const children = useMemo(\n () =>\n typeof renderChildren === \"function\"\n ? renderChildren(size, locale)\n : renderChildren,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [renderChildren, size]\n );\n\n return (\n <Component {...props} ref={forwardedRef}>\n {children}\n </Component>\n );\n }\n);\n\nif (process.env.NODE_ENV !== \"production\") {\n FileSize.displayName = FILE_SIZE_NAME;\n}\n"],"names":[],"mappings":";;;;;;;;;AASA;AA0BO;AAAiB;AAEpB;AACE;AACA;AAC2B;AAC3B;AACG;AAIL;AACA;AAAiB;AAIT;AAEe;AAGvB;
|
|
1
|
+
{"version":3,"file":"FileSize.cjs","sources":["../../src/primitives/FileSize.tsx"],"sourcesContent":["\"use client\";\n\nimport { Slot } from \"@radix-ui/react-slot\";\nimport type { ReactNode } from \"react\";\nimport { forwardRef, useMemo } from \"react\";\n\nimport type { ComponentPropsWithSlot } from \"../types\";\nimport { formatFileSize } from \"../utils/format-file-size\";\n\nconst FILE_SIZE_NAME = \"FileSize\";\n\nexport interface FileSizeProps\n extends Omit<ComponentPropsWithSlot<\"span\">, \"children\"> {\n /**\n * The file size to display.\n */\n size: number;\n\n /**\n * A function to format the displayed file size.\n */\n children?: (size: number, locale?: string) => ReactNode;\n\n /**\n * The locale used when formatting the file size.\n */\n locale?: string;\n}\n\n/**\n * Displays a formatted file size.\n *\n * @example\n * <FileSize size={100000} />\n */\nexport const FileSize = forwardRef<HTMLSpanElement, FileSizeProps>(\n (\n {\n size,\n locale,\n children: renderChildren = formatFileSize,\n asChild,\n ...props\n },\n forwardedRef\n ) => {\n const Component = asChild ? Slot : \"span\";\n const children = useMemo(\n () =>\n typeof renderChildren === \"function\"\n ? renderChildren(size, locale)\n : renderChildren,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [renderChildren, size]\n );\n\n return (\n <Component {...props} ref={forwardedRef}>\n {children}\n </Component>\n );\n }\n);\n\nif (process.env.NODE_ENV !== \"production\") {\n FileSize.displayName = FILE_SIZE_NAME;\n}\n"],"names":[],"mappings":";;;;;;;;;AASA;AA0BO;AAAiB;AAEpB;AACE;AACA;AAC2B;AAC3B;AACG;AAIL;AACA;AAAiB;AAIT;AAAA;AAEe;AAGvB;AAGE;AAGN;AAEA;AACE;AACF;;"}
|
|
@@ -17,13 +17,10 @@ const FileSize = forwardRef(
|
|
|
17
17
|
const Component = asChild ? Slot : "span";
|
|
18
18
|
const children = useMemo(
|
|
19
19
|
() => typeof renderChildren === "function" ? renderChildren(size, locale) : renderChildren,
|
|
20
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
20
21
|
[renderChildren, size]
|
|
21
22
|
);
|
|
22
|
-
return /* @__PURE__ */ jsx(Component, {
|
|
23
|
-
...props,
|
|
24
|
-
ref: forwardedRef,
|
|
25
|
-
children
|
|
26
|
-
});
|
|
23
|
+
return /* @__PURE__ */ jsx(Component, { ...props, ref: forwardedRef, children });
|
|
27
24
|
}
|
|
28
25
|
);
|
|
29
26
|
if (process.env.NODE_ENV !== "production") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileSize.js","sources":["../../src/primitives/FileSize.tsx"],"sourcesContent":["\"use client\";\n\nimport { Slot } from \"@radix-ui/react-slot\";\nimport type { ReactNode } from \"react\";\nimport { forwardRef, useMemo } from \"react\";\n\nimport type { ComponentPropsWithSlot } from \"../types\";\nimport { formatFileSize } from \"../utils/format-file-size\";\n\nconst FILE_SIZE_NAME = \"FileSize\";\n\nexport interface FileSizeProps\n extends Omit<ComponentPropsWithSlot<\"span\">, \"children\"> {\n /**\n * The file size to display.\n */\n size: number;\n\n /**\n * A function to format the displayed file size.\n */\n children?: (size: number, locale?: string) => ReactNode;\n\n /**\n * The locale used when formatting the file size.\n */\n locale?: string;\n}\n\n/**\n * Displays a formatted file size.\n *\n * @example\n * <FileSize size={100000} />\n */\nexport const FileSize = forwardRef<HTMLSpanElement, FileSizeProps>(\n (\n {\n size,\n locale,\n children: renderChildren = formatFileSize,\n asChild,\n ...props\n },\n forwardedRef\n ) => {\n const Component = asChild ? Slot : \"span\";\n const children = useMemo(\n () =>\n typeof renderChildren === \"function\"\n ? renderChildren(size, locale)\n : renderChildren,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [renderChildren, size]\n );\n\n return (\n <Component {...props} ref={forwardedRef}>\n {children}\n </Component>\n );\n }\n);\n\nif (process.env.NODE_ENV !== \"production\") {\n FileSize.displayName = FILE_SIZE_NAME;\n}\n"],"names":[],"mappings":";;;;;;;AASA;AA0BO;AAAiB;AAEpB;AACE;AACA;AAC2B;AAC3B;AACG;AAIL;AACA;AAAiB;AAIT;AAEe;AAGvB;
|
|
1
|
+
{"version":3,"file":"FileSize.js","sources":["../../src/primitives/FileSize.tsx"],"sourcesContent":["\"use client\";\n\nimport { Slot } from \"@radix-ui/react-slot\";\nimport type { ReactNode } from \"react\";\nimport { forwardRef, useMemo } from \"react\";\n\nimport type { ComponentPropsWithSlot } from \"../types\";\nimport { formatFileSize } from \"../utils/format-file-size\";\n\nconst FILE_SIZE_NAME = \"FileSize\";\n\nexport interface FileSizeProps\n extends Omit<ComponentPropsWithSlot<\"span\">, \"children\"> {\n /**\n * The file size to display.\n */\n size: number;\n\n /**\n * A function to format the displayed file size.\n */\n children?: (size: number, locale?: string) => ReactNode;\n\n /**\n * The locale used when formatting the file size.\n */\n locale?: string;\n}\n\n/**\n * Displays a formatted file size.\n *\n * @example\n * <FileSize size={100000} />\n */\nexport const FileSize = forwardRef<HTMLSpanElement, FileSizeProps>(\n (\n {\n size,\n locale,\n children: renderChildren = formatFileSize,\n asChild,\n ...props\n },\n forwardedRef\n ) => {\n const Component = asChild ? Slot : \"span\";\n const children = useMemo(\n () =>\n typeof renderChildren === \"function\"\n ? renderChildren(size, locale)\n : renderChildren,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [renderChildren, size]\n );\n\n return (\n <Component {...props} ref={forwardedRef}>\n {children}\n </Component>\n );\n }\n);\n\nif (process.env.NODE_ENV !== \"production\") {\n FileSize.displayName = FILE_SIZE_NAME;\n}\n"],"names":[],"mappings":";;;;;;;AASA;AA0BO;AAAiB;AAEpB;AACE;AACA;AAC2B;AAC3B;AACG;AAIL;AACA;AAAiB;AAIT;AAAA;AAEe;AAGvB;AAGE;AAGN;AAEA;AACE;AACF;;"}
|