@cratis/components 3.4.0 → 3.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +148 -98
- package/dist/esm/Canvas/Canvas.d.ts +64 -0
- package/dist/esm/Canvas/Canvas.d.ts.map +1 -0
- package/dist/esm/Canvas/Canvas.js +767 -0
- package/dist/esm/Canvas/Canvas.js.map +1 -0
- package/dist/esm/Canvas/CanvasControls.d.ts +32 -0
- package/dist/esm/Canvas/CanvasControls.d.ts.map +1 -0
- package/dist/esm/Canvas/CanvasControls.js +34 -0
- package/dist/esm/Canvas/CanvasControls.js.map +1 -0
- package/dist/esm/Canvas/CanvasItem.d.ts +10 -0
- package/dist/esm/Canvas/CanvasItem.d.ts.map +1 -0
- package/dist/esm/Canvas/CanvasItem.js +51 -0
- package/dist/esm/Canvas/CanvasItem.js.map +1 -0
- package/dist/esm/Canvas/CanvasMinimap.d.ts +25 -0
- package/dist/esm/Canvas/CanvasMinimap.d.ts.map +1 -0
- package/dist/esm/Canvas/CanvasMinimap.js +102 -0
- package/dist/esm/Canvas/CanvasMinimap.js.map +1 -0
- package/dist/esm/Canvas/CanvasOverlay.d.ts +6 -0
- package/dist/esm/Canvas/CanvasOverlay.d.ts.map +1 -0
- package/dist/esm/Canvas/CanvasOverlay.js +8 -0
- package/dist/esm/Canvas/CanvasOverlay.js.map +1 -0
- package/dist/esm/Canvas/canvasGesture.d.ts +8 -0
- package/dist/esm/Canvas/canvasGesture.d.ts.map +1 -0
- package/dist/esm/Canvas/canvasGesture.js +32 -0
- package/dist/esm/Canvas/canvasGesture.js.map +1 -0
- package/dist/esm/Canvas/canvasTransformActivity.d.ts +7 -0
- package/dist/esm/Canvas/canvasTransformActivity.d.ts.map +1 -0
- package/dist/esm/Canvas/canvasTransformActivity.js +22 -0
- package/dist/esm/Canvas/canvasTransformActivity.js.map +1 -0
- package/dist/esm/Canvas/glassAttributes.d.ts +4 -0
- package/dist/esm/Canvas/glassAttributes.d.ts.map +1 -0
- package/dist/esm/Canvas/glassAttributes.js +25 -0
- package/dist/esm/Canvas/glassAttributes.js.map +1 -0
- package/dist/esm/Canvas/index.d.ts +18 -0
- package/dist/esm/Canvas/index.d.ts.map +1 -0
- package/dist/esm/Canvas/index.js +38 -0
- package/dist/esm/Canvas/index.js.map +1 -0
- package/dist/esm/Canvas/isBackgroundPointerTarget.d.ts +2 -0
- package/dist/esm/Canvas/isBackgroundPointerTarget.d.ts.map +1 -0
- package/dist/esm/Canvas/isBackgroundPointerTarget.js +17 -0
- package/dist/esm/Canvas/isBackgroundPointerTarget.js.map +1 -0
- package/dist/esm/Canvas/isWithinScrollableContent.d.ts +11 -0
- package/dist/esm/Canvas/isWithinScrollableContent.d.ts.map +1 -0
- package/dist/esm/Canvas/isWithinScrollableContent.js +38 -0
- package/dist/esm/Canvas/isWithinScrollableContent.js.map +1 -0
- package/dist/esm/Canvas/panMomentum.d.ts +13 -0
- package/dist/esm/Canvas/panMomentum.d.ts.map +1 -0
- package/dist/esm/Canvas/panMomentum.js +41 -0
- package/dist/esm/Canvas/panMomentum.js.map +1 -0
- package/dist/esm/Canvas/pinchGesture.d.ts +16 -0
- package/dist/esm/Canvas/pinchGesture.d.ts.map +1 -0
- package/dist/esm/Canvas/pinchGesture.js +30 -0
- package/dist/esm/Canvas/pinchGesture.js.map +1 -0
- package/dist/esm/Canvas/selfSuspendingFrameLoop.d.ts +10 -0
- package/dist/esm/Canvas/selfSuspendingFrameLoop.d.ts.map +1 -0
- package/dist/esm/Canvas/selfSuspendingFrameLoop.js +33 -0
- package/dist/esm/Canvas/selfSuspendingFrameLoop.js.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/AnchoredOverlay.d.ts +13 -0
- package/dist/esm/Canvas/shapes/ChatBubble/AnchoredOverlay.d.ts.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/AnchoredOverlay.js +61 -0
- package/dist/esm/Canvas/shapes/ChatBubble/AnchoredOverlay.js.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Avatar/PersonAvatarCircle.d.ts +20 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Avatar/PersonAvatarCircle.d.ts.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Avatar/PersonAvatarCircle.js +27 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Avatar/PersonAvatarCircle.js.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Avatar/getAvatarColor.d.ts +2 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Avatar/getAvatarColor.d.ts.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Avatar/getAvatarColor.js +20 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Avatar/getAvatarColor.js.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Avatar/getInitials.d.ts +2 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Avatar/getInitials.d.ts.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Avatar/getInitials.js +11 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Avatar/getInitials.js.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Avatar/index.d.ts +5 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Avatar/index.d.ts.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Avatar/index.js +4 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Avatar/index.js.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Chat.d.ts +41 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Chat.d.ts.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Chat.js +76 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Chat.js.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/ChatAuthorKind.d.ts +5 -0
- package/dist/esm/Canvas/shapes/ChatBubble/ChatAuthorKind.d.ts.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/ChatAuthorKind.js +14 -0
- package/dist/esm/Canvas/shapes/ChatBubble/ChatAuthorKind.js.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/ChatBubble.d.ts +18 -0
- package/dist/esm/Canvas/shapes/ChatBubble/ChatBubble.d.ts.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/ChatBubble.js +89 -0
- package/dist/esm/Canvas/shapes/ChatBubble/ChatBubble.js.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/ChatComposer.d.ts +23 -0
- package/dist/esm/Canvas/shapes/ChatBubble/ChatComposer.d.ts.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/ChatComposer.js +107 -0
- package/dist/esm/Canvas/shapes/ChatBubble/ChatComposer.js.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/ChatMessage.d.ts +17 -0
- package/dist/esm/Canvas/shapes/ChatBubble/ChatMessage.d.ts.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/ChatMessage.js +2 -0
- package/dist/esm/Canvas/shapes/ChatBubble/ChatMessage.js.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/ChatMessageBubble.d.ts +25 -0
- package/dist/esm/Canvas/shapes/ChatBubble/ChatMessageBubble.d.ts.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/ChatMessageBubble.js +31 -0
- package/dist/esm/Canvas/shapes/ChatBubble/ChatMessageBubble.js.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/ChatMessageReaction.d.ts +6 -0
- package/dist/esm/Canvas/shapes/ChatBubble/ChatMessageReaction.d.ts.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/ChatMessageReaction.js +2 -0
- package/dist/esm/Canvas/shapes/ChatBubble/ChatMessageReaction.js.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/ChatMessageReactionUser.d.ts +7 -0
- package/dist/esm/Canvas/shapes/ChatBubble/ChatMessageReactionUser.d.ts.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/ChatMessageReactionUser.js +2 -0
- package/dist/esm/Canvas/shapes/ChatBubble/ChatMessageReactionUser.js.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/ChatOwnReaction.d.ts +6 -0
- package/dist/esm/Canvas/shapes/ChatBubble/ChatOwnReaction.d.ts.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/ChatOwnReaction.js +2 -0
- package/dist/esm/Canvas/shapes/ChatBubble/ChatOwnReaction.js.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/ChatTypingAuthor.d.ts +8 -0
- package/dist/esm/Canvas/shapes/ChatBubble/ChatTypingAuthor.d.ts.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/ChatTypingAuthor.js +2 -0
- package/dist/esm/Canvas/shapes/ChatBubble/ChatTypingAuthor.js.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/ChatVariant.d.ts +5 -0
- package/dist/esm/Canvas/shapes/ChatBubble/ChatVariant.d.ts.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/ChatVariant.js +15 -0
- package/dist/esm/Canvas/shapes/ChatBubble/ChatVariant.js.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Emoji/EmojiCategory.d.ts +6 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Emoji/EmojiCategory.d.ts.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Emoji/EmojiCategory.js +2 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Emoji/EmojiCategory.js.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Emoji/EmojiCategoryKey.d.ts +12 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Emoji/EmojiCategoryKey.d.ts.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Emoji/EmojiCategoryKey.js +18 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Emoji/EmojiCategoryKey.js.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Emoji/EmojiMemory.d.ts +5 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Emoji/EmojiMemory.d.ts.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Emoji/EmojiMemory.js +2 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Emoji/EmojiMemory.js.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Emoji/EmojiPicker.d.ts +14 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Emoji/EmojiPicker.d.ts.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Emoji/EmojiPicker.js +51 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Emoji/EmojiPicker.js.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Emoji/emojiCatalog.d.ts +3 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Emoji/emojiCatalog.d.ts.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Emoji/emojiCatalog.js +155 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Emoji/emojiCatalog.js.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Emoji/index.d.ts +7 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Emoji/index.d.ts.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Emoji/index.js +7 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Emoji/index.js.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Emoji/recentEmojis.d.ts +6 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Emoji/recentEmojis.d.ts.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Emoji/recentEmojis.js +59 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Emoji/recentEmojis.js.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/FailedReply.d.ts +23 -0
- package/dist/esm/Canvas/shapes/ChatBubble/FailedReply.d.ts.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/FailedReply.js +28 -0
- package/dist/esm/Canvas/shapes/ChatBubble/FailedReply.js.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Mentions/MentionCandidate.d.ts +9 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Mentions/MentionCandidate.d.ts.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Mentions/MentionCandidate.js +2 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Mentions/MentionCandidate.js.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Mentions/MentionQuery.d.ts +5 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Mentions/MentionQuery.d.ts.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Mentions/MentionQuery.js +2 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Mentions/MentionQuery.js.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Mentions/MentionSuggestions.d.ts +11 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Mentions/MentionSuggestions.d.ts.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Mentions/MentionSuggestions.js +14 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Mentions/MentionSuggestions.js.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Mentions/activeMentionQuery.d.ts +3 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Mentions/activeMentionQuery.d.ts.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Mentions/activeMentionQuery.js +34 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Mentions/activeMentionQuery.js.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Mentions/applyMention.d.ts +7 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Mentions/applyMention.d.ts.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Mentions/applyMention.js +23 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Mentions/applyMention.js.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Mentions/index.d.ts +7 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Mentions/index.d.ts.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Mentions/index.js +7 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Mentions/index.js.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Mentions/matchCandidates.d.ts +3 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Mentions/matchCandidates.d.ts.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Mentions/matchCandidates.js +24 -0
- package/dist/esm/Canvas/shapes/ChatBubble/Mentions/matchCandidates.js.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/MessageReactions.d.ts +6 -0
- package/dist/esm/Canvas/shapes/ChatBubble/MessageReactions.d.ts.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/MessageReactions.js +28 -0
- package/dist/esm/Canvas/shapes/ChatBubble/MessageReactions.js.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/ReactionPicker.d.ts +20 -0
- package/dist/esm/Canvas/shapes/ChatBubble/ReactionPicker.d.ts.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/ReactionPicker.js +50 -0
- package/dist/esm/Canvas/shapes/ChatBubble/ReactionPicker.js.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/TypingIndicator.d.ts +9 -0
- package/dist/esm/Canvas/shapes/ChatBubble/TypingIndicator.d.ts.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/TypingIndicator.js +18 -0
- package/dist/esm/Canvas/shapes/ChatBubble/TypingIndicator.js.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/findOwnReaction.d.ts +5 -0
- package/dist/esm/Canvas/shapes/ChatBubble/findOwnReaction.d.ts.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/findOwnReaction.js +19 -0
- package/dist/esm/Canvas/shapes/ChatBubble/findOwnReaction.js.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/index.d.ts +31 -0
- package/dist/esm/Canvas/shapes/ChatBubble/index.d.ts.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/index.js +17 -0
- package/dist/esm/Canvas/shapes/ChatBubble/index.js.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/reactionsExcludingUser.d.ts +4 -0
- package/dist/esm/Canvas/shapes/ChatBubble/reactionsExcludingUser.d.ts.map +1 -0
- package/dist/esm/Canvas/shapes/ChatBubble/reactionsExcludingUser.js +16 -0
- package/dist/esm/Canvas/shapes/ChatBubble/reactionsExcludingUser.js.map +1 -0
- package/dist/esm/Canvas/shapes/Note/Note.d.ts +22 -0
- package/dist/esm/Canvas/shapes/Note/Note.d.ts.map +1 -0
- package/dist/esm/Canvas/shapes/Note/Note.js +237 -0
- package/dist/esm/Canvas/shapes/Note/Note.js.map +1 -0
- package/dist/esm/Canvas/shapes/Note/index.d.ts +3 -0
- package/dist/esm/Canvas/shapes/Note/index.d.ts.map +1 -0
- package/dist/esm/Canvas/shapes/Note/index.js +2 -0
- package/dist/esm/Canvas/shapes/Note/index.js.map +1 -0
- package/dist/esm/Canvas/shapes/Note/noteFont.d.ts +2 -0
- package/dist/esm/Canvas/shapes/Note/noteFont.d.ts.map +1 -0
- package/dist/esm/Canvas/shapes/Note/noteFont.js +26 -0
- package/dist/esm/Canvas/shapes/Note/noteFont.js.map +1 -0
- package/dist/esm/Canvas/shapes/Region/Region.d.ts +22 -0
- package/dist/esm/Canvas/shapes/Region/Region.d.ts.map +1 -0
- package/dist/esm/Canvas/shapes/Region/Region.js +150 -0
- package/dist/esm/Canvas/shapes/Region/Region.js.map +1 -0
- package/dist/esm/Canvas/shapes/Region/index.d.ts +3 -0
- package/dist/esm/Canvas/shapes/Region/index.d.ts.map +1 -0
- package/dist/esm/Canvas/shapes/Region/index.js +2 -0
- package/dist/esm/Canvas/shapes/Region/index.js.map +1 -0
- package/dist/esm/Canvas/useDragSelectionGuard.d.ts +2 -0
- package/dist/esm/Canvas/useDragSelectionGuard.d.ts.map +1 -0
- package/dist/esm/Canvas/useDragSelectionGuard.js +59 -0
- package/dist/esm/Canvas/useDragSelectionGuard.js.map +1 -0
- package/dist/esm/Canvas/zoomMechanism.d.ts +4 -0
- package/dist/esm/Canvas/zoomMechanism.d.ts.map +1 -0
- package/dist/esm/Canvas/zoomMechanism.js +58 -0
- package/dist/esm/Canvas/zoomMechanism.js.map +1 -0
- package/dist/esm/CommandDialog/CommandDialog.d.ts +3 -6
- package/dist/esm/CommandDialog/CommandDialog.d.ts.map +1 -1
- package/dist/esm/CommandDialog/CommandDialog.js +3 -2
- package/dist/esm/CommandDialog/CommandDialog.js.map +1 -1
- package/dist/esm/CommandDialog/CommandStepper.d.ts.map +1 -1
- package/dist/esm/CommandDialog/CommandStepper.js +3 -2
- package/dist/esm/CommandDialog/CommandStepper.js.map +1 -1
- package/dist/esm/CommandForm/commandFormMarkers.d.ts +12 -0
- package/dist/esm/CommandForm/commandFormMarkers.d.ts.map +1 -0
- package/dist/esm/CommandForm/commandFormMarkers.js +69 -0
- package/dist/esm/CommandForm/commandFormMarkers.js.map +1 -0
- package/dist/esm/CommandForm/fields/CalendarField.d.ts +1 -1
- package/dist/esm/CommandForm/fields/CalendarField.d.ts.map +1 -1
- package/dist/esm/CommandForm/fields/CheckboxField.d.ts +1 -1
- package/dist/esm/CommandForm/fields/CheckboxField.d.ts.map +1 -1
- package/dist/esm/CommandForm/fields/ChipsField.d.ts +1 -1
- package/dist/esm/CommandForm/fields/ChipsField.d.ts.map +1 -1
- package/dist/esm/CommandForm/fields/ColorPickerField.d.ts +1 -1
- package/dist/esm/CommandForm/fields/ColorPickerField.d.ts.map +1 -1
- package/dist/esm/CommandForm/fields/DropdownField.d.ts +1 -1
- package/dist/esm/CommandForm/fields/DropdownField.d.ts.map +1 -1
- package/dist/esm/CommandForm/fields/InputTextField.d.ts +1 -1
- package/dist/esm/CommandForm/fields/InputTextField.d.ts.map +1 -1
- package/dist/esm/CommandForm/fields/MultiSelectField.d.ts +1 -1
- package/dist/esm/CommandForm/fields/MultiSelectField.d.ts.map +1 -1
- package/dist/esm/CommandForm/fields/NumberField.d.ts +1 -1
- package/dist/esm/CommandForm/fields/NumberField.d.ts.map +1 -1
- package/dist/esm/CommandForm/fields/PasswordField.d.ts +1 -1
- package/dist/esm/CommandForm/fields/PasswordField.d.ts.map +1 -1
- package/dist/esm/CommandForm/fields/RadioButtonField.d.ts +1 -1
- package/dist/esm/CommandForm/fields/RadioButtonField.d.ts.map +1 -1
- package/dist/esm/CommandForm/fields/RadioGroupField.d.ts +1 -1
- package/dist/esm/CommandForm/fields/RadioGroupField.d.ts.map +1 -1
- package/dist/esm/CommandForm/fields/RatingField.d.ts +1 -1
- package/dist/esm/CommandForm/fields/RatingField.d.ts.map +1 -1
- package/dist/esm/CommandForm/fields/SliderField.d.ts +1 -1
- package/dist/esm/CommandForm/fields/SliderField.d.ts.map +1 -1
- package/dist/esm/CommandForm/fields/TextAreaField.d.ts +1 -1
- package/dist/esm/CommandForm/fields/TextAreaField.d.ts.map +1 -1
- package/dist/esm/CommandForm/fields/ToggleSwitchField.d.ts +1 -1
- package/dist/esm/CommandForm/fields/ToggleSwitchField.d.ts.map +1 -1
- package/dist/esm/CommandForm/index.d.ts +1 -0
- package/dist/esm/CommandForm/index.d.ts.map +1 -1
- package/dist/esm/CommandForm/index.js +1 -0
- package/dist/esm/CommandForm/index.js.map +1 -1
- package/dist/esm/Common/CratisComponentsProvider.js +1 -1
- package/dist/esm/Common/DatePickerInput.d.ts +11 -4
- package/dist/esm/Common/DatePickerInput.d.ts.map +1 -1
- package/dist/esm/Common/DatePickerInput.js +18 -2
- package/dist/esm/Common/DatePickerInput.js.map +1 -1
- package/dist/esm/Common/ErrorBoundary.d.ts +1 -1
- package/dist/esm/Compatibility/PrimeReact11PassThroughComponent.d.ts +3 -0
- package/dist/esm/Compatibility/PrimeReact11PassThroughComponent.d.ts.map +1 -0
- package/dist/esm/Compatibility/PrimeReact11PassThroughComponent.js +2 -0
- package/dist/esm/Compatibility/PrimeReact11PassThroughComponent.js.map +1 -0
- package/dist/esm/Compatibility/assertPrimeReact11PassThroughCompatibility.d.ts +3 -0
- package/dist/esm/Compatibility/assertPrimeReact11PassThroughCompatibility.d.ts.map +1 -0
- package/dist/esm/Compatibility/assertPrimeReact11PassThroughCompatibility.js +49 -0
- package/dist/esm/Compatibility/assertPrimeReact11PassThroughCompatibility.js.map +1 -0
- package/dist/esm/Compatibility/components3PrimeReact11PassThroughContract.d.ts +369 -0
- package/dist/esm/Compatibility/components3PrimeReact11PassThroughContract.d.ts.map +1 -0
- package/dist/esm/Compatibility/components3PrimeReact11PassThroughContract.js +271 -0
- package/dist/esm/Compatibility/components3PrimeReact11PassThroughContract.js.map +1 -0
- package/dist/esm/Compatibility/index.d.ts +5 -0
- package/dist/esm/Compatibility/index.d.ts.map +1 -0
- package/dist/esm/Compatibility/index.js +7 -0
- package/dist/esm/Compatibility/index.js.map +1 -0
- package/dist/esm/Compatibility/primeReact11PassThroughSentinelPreset.d.ts +8 -0
- package/dist/esm/Compatibility/primeReact11PassThroughSentinelPreset.d.ts.map +1 -0
- package/dist/esm/Compatibility/primeReact11PassThroughSentinelPreset.js +48 -0
- package/dist/esm/Compatibility/primeReact11PassThroughSentinelPreset.js.map +1 -0
- package/dist/esm/DataPage/DataPage.d.ts +4 -4
- package/dist/esm/DataPage/DataPage.d.ts.map +1 -1
- package/dist/esm/DataPage/DataPage.js +6 -10
- package/dist/esm/DataPage/DataPage.js.map +1 -1
- package/dist/esm/DataTables/Column.d.ts +3 -1
- package/dist/esm/DataTables/Column.d.ts.map +1 -1
- package/dist/esm/DataTables/Column.js.map +1 -1
- package/dist/esm/DataTables/ColumnFilterMenu.d.ts +22 -2
- package/dist/esm/DataTables/ColumnFilterMenu.d.ts.map +1 -1
- package/dist/esm/DataTables/ColumnFilterMenu.js +50 -13
- package/dist/esm/DataTables/ColumnFilterMenu.js.map +1 -1
- package/dist/esm/DataTables/DataTableCore.d.ts.map +1 -1
- package/dist/esm/DataTables/DataTableCore.js +22 -3
- package/dist/esm/DataTables/DataTableCore.js.map +1 -1
- package/dist/esm/DataTables/DataTableFilterMatcherRegistry.d.ts +14 -0
- package/dist/esm/DataTables/DataTableFilterMatcherRegistry.d.ts.map +1 -0
- package/dist/esm/DataTables/DataTableFilterMatcherRegistry.js +67 -0
- package/dist/esm/DataTables/DataTableFilterMatcherRegistry.js.map +1 -0
- package/dist/esm/DataTables/DataTableFilterMeta.d.ts +26 -1
- package/dist/esm/DataTables/DataTableFilterMeta.d.ts.map +1 -1
- package/dist/esm/DataTables/DataTableFilterMeta.js +24 -2
- package/dist/esm/DataTables/DataTableFilterMeta.js.map +1 -1
- package/dist/esm/DataTables/DataTableForObservableQuery.d.ts +3 -3
- package/dist/esm/DataTables/DataTableForObservableQuery.d.ts.map +1 -1
- package/dist/esm/DataTables/DataTableForObservableQuery.js +9 -3
- package/dist/esm/DataTables/DataTableForObservableQuery.js.map +1 -1
- package/dist/esm/DataTables/DataTableForQuery.d.ts +3 -3
- package/dist/esm/DataTables/DataTableForQuery.d.ts.map +1 -1
- package/dist/esm/DataTables/DataTableForQuery.js +8 -2
- package/dist/esm/DataTables/DataTableForQuery.js.map +1 -1
- package/dist/esm/DataTables/TablePaginator.d.ts +1 -1
- package/dist/esm/DataTables/TablePaginator.d.ts.map +1 -1
- package/dist/esm/DataTables/TablePaginator.js +13 -4
- package/dist/esm/DataTables/TablePaginator.js.map +1 -1
- package/dist/esm/DataTables/index.d.ts +1 -0
- package/dist/esm/DataTables/index.d.ts.map +1 -1
- package/dist/esm/DataTables/index.js +3 -1
- package/dist/esm/DataTables/index.js.map +1 -1
- package/dist/esm/Dialogs/Dialog.d.ts +2 -2
- package/dist/esm/Dialogs/Dialog.d.ts.map +1 -1
- package/dist/esm/Dialogs/Dialog.js +16 -18
- package/dist/esm/Dialogs/Dialog.js.map +1 -1
- package/dist/esm/Dropdown/Dropdown.d.ts +4 -2
- package/dist/esm/Dropdown/Dropdown.d.ts.map +1 -1
- package/dist/esm/Dropdown/Dropdown.js +8 -3
- package/dist/esm/Dropdown/Dropdown.js.map +1 -1
- package/dist/esm/Filter/FilterPanel.d.ts.map +1 -1
- package/dist/esm/Filter/FilterPanel.js +1 -1
- package/dist/esm/Filter/FilterPanel.js.map +1 -1
- package/dist/esm/Filter/RangeHistogramFilter.d.ts +4 -3
- package/dist/esm/Filter/RangeHistogramFilter.d.ts.map +1 -1
- package/dist/esm/Filter/RangeHistogramFilter.js +4 -23
- package/dist/esm/Filter/RangeHistogramFilter.js.map +1 -1
- package/dist/esm/Filter/index.d.ts +3 -2
- package/dist/esm/Filter/index.d.ts.map +1 -1
- package/dist/esm/Filter/index.js +1 -1
- package/dist/esm/Filter/types.d.ts +7 -1
- package/dist/esm/Filter/types.d.ts.map +1 -1
- package/dist/esm/Filter/utils.d.ts +5 -1
- package/dist/esm/Filter/utils.d.ts.map +1 -1
- package/dist/esm/Filter/utils.js +33 -1
- package/dist/esm/Filter/utils.js.map +1 -1
- package/dist/esm/Notifications/Toaster.d.ts +8 -1
- package/dist/esm/Notifications/Toaster.d.ts.map +1 -1
- package/dist/esm/Notifications/Toaster.js +16 -10
- package/dist/esm/Notifications/Toaster.js.map +1 -1
- package/dist/esm/Notifications/index.js +1 -1
- package/dist/esm/Notifications/toast.d.ts +52 -2
- package/dist/esm/Notifications/toast.d.ts.map +1 -1
- package/dist/esm/Notifications/toast.js +100 -2
- package/dist/esm/Notifications/toast.js.map +1 -1
- package/dist/esm/Notifications/toastCommandResult.js +2 -2
- package/dist/esm/Notifications/toastCommandResult.js.map +1 -1
- package/dist/esm/PatrickHand-latin-ext.woff2 +0 -0
- package/dist/esm/PatrickHand-latin.woff2 +0 -0
- package/dist/esm/PatrickHand-vietnamese.woff2 +0 -0
- package/dist/esm/index.d.ts +4 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +42 -35
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/styles.css +1285 -3
- package/package.json +16 -6
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
// A real drag handle (module/feature/slice headers, row labels, sticky notes, link connectors, ...)
|
|
4
|
+
// always claims its own gesture with stopPropagation before it can bubble up to the canvas — so by
|
|
5
|
+
// the time a touch pointerdown reaches the canvas, it is never one of those, and a single finger
|
|
6
|
+
// anywhere else should pan rather than be silently swallowed by whatever content sits under it.
|
|
7
|
+
// Mouse/pen keep the strict check: only the bare container or its rendering canvas count as background.
|
|
8
|
+
function isBackgroundPointerTarget(pointerType, readOnly, target, container) {
|
|
9
|
+
if (readOnly || pointerType === 'touch')
|
|
10
|
+
return true;
|
|
11
|
+
if (target === container)
|
|
12
|
+
return true;
|
|
13
|
+
return target?.tagName === 'CANVAS';
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export { isBackgroundPointerTarget };
|
|
17
|
+
//# sourceMappingURL=isBackgroundPointerTarget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isBackgroundPointerTarget.js","sources":["../../../Canvas/isBackgroundPointerTarget.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAA;AACA;AAEA;AACA;AACA;AACA;AACA;AACM,SAAU,yBAAyB,CACrC,WAAmB,EACnB,QAAiB,EACjB,MAA0B,EAC1B,SAA6B,EAAA;AAE7B,IAAA,IAAI,QAAQ,IAAI,WAAW,KAAK,OAAO;AAAE,QAAA,OAAO,IAAI;IACpD,IAAI,MAAM,KAAK,SAAS;AAAE,QAAA,OAAO,IAAI;AACrC,IAAA,OAAQ,MAA6B,EAAE,OAAO,KAAK,QAAQ;AAC/D;;;;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface ScrollableMetrics {
|
|
2
|
+
overflowX: string;
|
|
3
|
+
overflowY: string;
|
|
4
|
+
scrollWidth: number;
|
|
5
|
+
clientWidth: number;
|
|
6
|
+
scrollHeight: number;
|
|
7
|
+
clientHeight: number;
|
|
8
|
+
}
|
|
9
|
+
export declare function hasScrollableOverflow(metrics: ScrollableMetrics): boolean;
|
|
10
|
+
export declare function isWithinScrollableContent(target: EventTarget | null, container: HTMLElement | null): boolean;
|
|
11
|
+
//# sourceMappingURL=isWithinScrollableContent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isWithinScrollableContent.d.ts","sourceRoot":"","sources":["../../../Canvas/isWithinScrollableContent.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,iBAAiB;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACxB;AAQD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAIzE;AAOD,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,EAAE,SAAS,EAAE,WAAW,GAAG,IAAI,GAAG,OAAO,CAiB5G"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
/**
|
|
4
|
+
* Whether an element's own content actually overflows its box in a direction its CSS lets it scroll —
|
|
5
|
+
* the two conditions both have to hold: the CSS opts into scrolling, and there is more content than the
|
|
6
|
+
* box shows. Pulled out of {@link isWithinScrollableContent} so this decision is testable on plain data,
|
|
7
|
+
* without a real DOM (the surrounding walk needs one; this predicate does not).
|
|
8
|
+
*/
|
|
9
|
+
function hasScrollableOverflow(metrics) {
|
|
10
|
+
const canScrollY = (metrics.overflowY === 'auto' || metrics.overflowY === 'scroll') && metrics.scrollHeight > metrics.clientHeight;
|
|
11
|
+
const canScrollX = (metrics.overflowX === 'auto' || metrics.overflowX === 'scroll') && metrics.scrollWidth > metrics.clientWidth;
|
|
12
|
+
return canScrollY || canScrollX;
|
|
13
|
+
}
|
|
14
|
+
// A wheel/trackpad gesture that lands inside a scrollable overlay — a chat's message list, a properties
|
|
15
|
+
// panel, anything with its own `overflow-y: auto` — must scroll that content natively instead of being
|
|
16
|
+
// captured as a canvas pan (StudioIssues#229). Walking up from the event target toward the canvas
|
|
17
|
+
// container, the first ancestor whose own content actually overflows its box claims the gesture; the
|
|
18
|
+
// search stops at the container itself, so gestures over the bare board are never affected.
|
|
19
|
+
function isWithinScrollableContent(target, container) {
|
|
20
|
+
let element = target instanceof Node ? (target instanceof HTMLElement ? target : target.parentElement) : null;
|
|
21
|
+
while (element && element !== container) {
|
|
22
|
+
const style = getComputedStyle(element);
|
|
23
|
+
if (hasScrollableOverflow({
|
|
24
|
+
overflowX: style.overflowX,
|
|
25
|
+
overflowY: style.overflowY,
|
|
26
|
+
scrollWidth: element.scrollWidth,
|
|
27
|
+
clientWidth: element.clientWidth,
|
|
28
|
+
scrollHeight: element.scrollHeight,
|
|
29
|
+
clientHeight: element.clientHeight,
|
|
30
|
+
}))
|
|
31
|
+
return true;
|
|
32
|
+
element = element.parentElement;
|
|
33
|
+
}
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export { hasScrollableOverflow, isWithinScrollableContent };
|
|
38
|
+
//# sourceMappingURL=isWithinScrollableContent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isWithinScrollableContent.js","sources":["../../../Canvas/isWithinScrollableContent.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAA;AACA;AAYA;;;;;AAKG;AACG,SAAU,qBAAqB,CAAC,OAA0B,EAAA;IAC5D,MAAM,UAAU,GAAG,CAAC,OAAO,CAAC,SAAS,KAAK,MAAM,IAAI,OAAO,CAAC,SAAS,KAAK,QAAQ,KAAK,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY;IAClI,MAAM,UAAU,GAAG,CAAC,OAAO,CAAC,SAAS,KAAK,MAAM,IAAI,OAAO,CAAC,SAAS,KAAK,QAAQ,KAAK,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW;IAChI,OAAO,UAAU,IAAI,UAAU;AACnC;AAEA;AACA;AACA;AACA;AACA;AACM,SAAU,yBAAyB,CAAC,MAA0B,EAAE,SAA6B,EAAA;IAC/F,IAAI,OAAO,GAAG,MAAM,YAAY,IAAI,IAAI,MAAM,YAAY,WAAW,GAAG,MAAM,GAAG,MAAM,CAAC,aAAa,IAAI,IAAI;AAE7G,IAAA,OAAO,OAAO,IAAI,OAAO,KAAK,SAAS,EAAE;AACrC,QAAA,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC;AACvC,QAAA,IAAI,qBAAqB,CAAC;YACtB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,YAAY,EAAE,OAAO,CAAC,YAAY;SACrC,CAAC;AAAE,YAAA,OAAO,IAAI;AACf,QAAA,OAAO,GAAG,OAAO,CAAC,aAAa;IACnC;AAEA,IAAA,OAAO,KAAK;AAChB;;;;"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface PanSample {
|
|
2
|
+
x: number;
|
|
3
|
+
y: number;
|
|
4
|
+
time: number;
|
|
5
|
+
}
|
|
6
|
+
export interface PanVelocity {
|
|
7
|
+
x: number;
|
|
8
|
+
y: number;
|
|
9
|
+
}
|
|
10
|
+
export declare function trimSamples(samples: PanSample[], windowMs: number): PanSample[];
|
|
11
|
+
export declare function velocityFromSamples(samples: PanSample[], minVelocity: number): PanVelocity | null;
|
|
12
|
+
export declare function decayVelocity(velocity: PanVelocity, elapsedMs: number, friction: number): PanVelocity;
|
|
13
|
+
//# sourceMappingURL=panMomentum.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"panMomentum.d.ts","sourceRoot":"","sources":["../../../Canvas/panMomentum.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,SAAS;IAEtB,CAAC,EAAE,MAAM,CAAC;IAEV,CAAC,EAAE,MAAM,CAAC;IAGV,IAAI,EAAE,MAAM,CAAC;CAChB;AAGD,MAAM,WAAW,WAAW;IAExB,CAAC,EAAE,MAAM,CAAC;IAEV,CAAC,EAAE,MAAM,CAAC;CACb;AAOD,wBAAgB,WAAW,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,CAU/E;AAOD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAUjG;AAGD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,CAGrG"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
/**
|
|
4
|
+
* Drops samples older than windowMs, measured from the newest one — the trailing window a touch pan's
|
|
5
|
+
* release velocity is read from, so a drag that was moving fast earlier but came to rest before the
|
|
6
|
+
* finger actually lifted correctly produces no momentum. Always keeps at least one sample.
|
|
7
|
+
*/
|
|
8
|
+
function trimSamples(samples, windowMs) {
|
|
9
|
+
const trimmed = [...samples];
|
|
10
|
+
const newest = trimmed[trimmed.length - 1];
|
|
11
|
+
if (!newest)
|
|
12
|
+
return trimmed;
|
|
13
|
+
while (trimmed.length > 1 && newest.time - trimmed[0].time > windowMs) {
|
|
14
|
+
trimmed.shift();
|
|
15
|
+
}
|
|
16
|
+
return trimmed;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* The release velocity implied by the oldest and newest sample in the window, or null when there are
|
|
20
|
+
* too few samples, they carry no time delta, or the release was slower than minVelocity — too slow for
|
|
21
|
+
* momentum to be worth animating.
|
|
22
|
+
*/
|
|
23
|
+
function velocityFromSamples(samples, minVelocity) {
|
|
24
|
+
if (samples.length < 2)
|
|
25
|
+
return null;
|
|
26
|
+
const first = samples[0];
|
|
27
|
+
const last = samples[samples.length - 1];
|
|
28
|
+
const elapsedMs = last.time - first.time;
|
|
29
|
+
if (elapsedMs <= 0)
|
|
30
|
+
return null;
|
|
31
|
+
const velocity = { x: (last.x - first.x) / elapsedMs, y: (last.y - first.y) / elapsedMs };
|
|
32
|
+
return Math.hypot(velocity.x, velocity.y) >= minVelocity ? velocity : null;
|
|
33
|
+
}
|
|
34
|
+
/** Decays a velocity exponentially over elapsedMs at the given friction rate. */
|
|
35
|
+
function decayVelocity(velocity, elapsedMs, friction) {
|
|
36
|
+
const decay = Math.exp(-35e-4 * elapsedMs);
|
|
37
|
+
return { x: velocity.x * decay, y: velocity.y * decay };
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export { decayVelocity, trimSamples, velocityFromSamples };
|
|
41
|
+
//# sourceMappingURL=panMomentum.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"panMomentum.js","sources":["../../../Canvas/panMomentum.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAA;AACA;AAqBA;;;;AAIG;AACG,SAAU,WAAW,CAAC,OAAoB,EAAE,QAAgB,EAAA;AAC9D,IAAA,MAAM,OAAO,GAAG,CAAC,GAAG,OAAO,CAAC;IAC5B,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;AAC1C,IAAA,IAAI,CAAC,MAAM;AAAE,QAAA,OAAO,OAAO;AAE3B,IAAA,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,QAAQ,EAAE;QACnE,OAAO,CAAC,KAAK,EAAE;IACnB;AAEA,IAAA,OAAO,OAAO;AAClB;AAEA;;;;AAIG;AACG,SAAU,mBAAmB,CAAC,OAAoB,EAAE,WAAmB,EAAA;AACzE,IAAA,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;AAAE,QAAA,OAAO,IAAI;AAEnC,IAAA,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC;IACxB,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI;IACxC,IAAI,SAAS,IAAI,CAAC;AAAE,QAAA,OAAO,IAAI;AAE/B,IAAA,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,SAAS,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,SAAS,EAAE;IACzF,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,WAAW,GAAG,QAAQ,GAAG,IAAI;AAC9E;AAEA;SACgB,aAAa,CAAC,QAAqB,EAAE,SAAiB,EAAE,QAAgB,EAAA;IACpF,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAS,GAAG,SAAS,CAAC;AAC7C,IAAA,OAAO,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,KAAK,EAAE;AAC3D;;;;"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface PointerPosition {
|
|
2
|
+
x: number;
|
|
3
|
+
y: number;
|
|
4
|
+
}
|
|
5
|
+
export interface PinchSnapshot {
|
|
6
|
+
center: PointerPosition;
|
|
7
|
+
distance: number;
|
|
8
|
+
}
|
|
9
|
+
export interface PinchChange {
|
|
10
|
+
panX: number;
|
|
11
|
+
panY: number;
|
|
12
|
+
scale: number;
|
|
13
|
+
}
|
|
14
|
+
export declare function pinchSnapshotOf(pointers: Iterable<PointerPosition>): PinchSnapshot | null;
|
|
15
|
+
export declare function pinchChangeBetween(previous: PinchSnapshot, current: PinchSnapshot): PinchChange;
|
|
16
|
+
//# sourceMappingURL=pinchGesture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pinchGesture.d.ts","sourceRoot":"","sources":["../../../Canvas/pinchGesture.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,eAAe;IAE5B,CAAC,EAAE,MAAM,CAAC;IAEV,CAAC,EAAE,MAAM,CAAC;CACb;AAGD,MAAM,WAAW,aAAa;IAG1B,MAAM,EAAE,eAAe,CAAC;IAGxB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAGD,MAAM,WAAW,WAAW;IAGxB,IAAI,EAAE,MAAM,CAAC;IAEb,IAAI,EAAE,MAAM,CAAC;IAGb,KAAK,EAAE,MAAM,CAAC;CACjB;AAOD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,eAAe,CAAC,GAAG,aAAa,GAAG,IAAI,CAQzF;AAMD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,GAAG,WAAW,CAM/F"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
/**
|
|
4
|
+
* Builds the pinch geometry from the currently active pointers. The first two are used, so a third
|
|
5
|
+
* finger landing mid-gesture never re-defines the pinch under the user's hands. Returns null with
|
|
6
|
+
* fewer than two pointers — there is no pinch to describe.
|
|
7
|
+
*/
|
|
8
|
+
function pinchSnapshotOf(pointers) {
|
|
9
|
+
const [first, second] = [...pointers];
|
|
10
|
+
if (!first || !second)
|
|
11
|
+
return null;
|
|
12
|
+
return {
|
|
13
|
+
center: { x: (first.x + second.x) / 2, y: (first.y + second.y) / 2 },
|
|
14
|
+
distance: Math.hypot(second.x - first.x, second.y - first.y),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* The pan and zoom deltas between two snapshots of the same gesture. A degenerate previous distance
|
|
19
|
+
* (both fingers on the same spot) yields no zoom rather than an infinite one.
|
|
20
|
+
*/
|
|
21
|
+
function pinchChangeBetween(previous, current) {
|
|
22
|
+
return {
|
|
23
|
+
panX: current.center.x - previous.center.x,
|
|
24
|
+
panY: current.center.y - previous.center.y,
|
|
25
|
+
scale: previous.distance > 0 ? current.distance / previous.distance : 1,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export { pinchChangeBetween, pinchSnapshotOf };
|
|
30
|
+
//# sourceMappingURL=pinchGesture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pinchGesture.js","sources":["../../../Canvas/pinchGesture.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAA;AACA;AAgCA;;;;AAIG;AACG,SAAU,eAAe,CAAC,QAAmC,EAAA;IAC/D,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;AACrC,IAAA,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM;AAAE,QAAA,OAAO,IAAI;IAElC,OAAO;AACH,QAAA,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE;QACpE,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;KAC/D;AACL;AAEA;;;AAGG;AACG,SAAU,kBAAkB,CAAC,QAAuB,EAAE,OAAsB,EAAA;IAC9E,OAAO;QACH,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;AAC1C,QAAA,KAAK,EAAE,QAAQ,CAAC,QAAQ,GAAG,CAAC,GAAG,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,GAAG,CAAC;KAC1E;AACL;;;;"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
type FrameScheduler = (callback: (now: number) => void) => number;
|
|
2
|
+
type FrameCanceler = (handle: number) => void;
|
|
3
|
+
export interface SelfSuspendingFrameLoop {
|
|
4
|
+
readonly isRunning: boolean;
|
|
5
|
+
wake(): void;
|
|
6
|
+
stop(): void;
|
|
7
|
+
}
|
|
8
|
+
export declare const createSelfSuspendingFrameLoop: (step: (now: number) => boolean, schedule?: FrameScheduler, cancel?: FrameCanceler) => SelfSuspendingFrameLoop;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=selfSuspendingFrameLoop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selfSuspendingFrameLoop.d.ts","sourceRoot":"","sources":["../../../Canvas/selfSuspendingFrameLoop.ts"],"names":[],"mappings":"AAGA,KAAK,cAAc,GAAG,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,KAAK,MAAM,CAAC;AAClE,KAAK,aAAa,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;AAE9C,MAAM,WAAW,uBAAuB;IAEpC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAI5B,IAAI,IAAI,IAAI,CAAC;IAGb,IAAI,IAAI,IAAI,CAAC;CAChB;AAOD,eAAO,MAAM,6BAA6B,GACtC,MAAM,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,EAC9B,WAAU,cAA4D,EACtE,SAAQ,aAAsD,KAC/D,uBA0BF,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
// An animation-frame loop that runs only while its step reports motion left to follow, instead of
|
|
4
|
+
// burning a callback every frame forever (the board-page idle drain of StudioIssues#200). The step
|
|
5
|
+
// runs once per frame and returns whether another frame is needed; when it returns false the loop
|
|
6
|
+
// suspends until the next wake(). The scheduler is injectable so the suspension logic can be
|
|
7
|
+
// specified without a browser.
|
|
8
|
+
const createSelfSuspendingFrameLoop = (step, schedule = callback => requestAnimationFrame(callback), cancel = handle => cancelAnimationFrame(handle)) => {
|
|
9
|
+
let handle;
|
|
10
|
+
const frame = (now) => {
|
|
11
|
+
handle = undefined;
|
|
12
|
+
if (step(now)) {
|
|
13
|
+
handle = schedule(frame);
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
return {
|
|
17
|
+
get isRunning() {
|
|
18
|
+
return handle !== undefined;
|
|
19
|
+
},
|
|
20
|
+
wake() {
|
|
21
|
+
handle ??= schedule(frame);
|
|
22
|
+
},
|
|
23
|
+
stop() {
|
|
24
|
+
if (handle !== undefined) {
|
|
25
|
+
cancel(handle);
|
|
26
|
+
handle = undefined;
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export { createSelfSuspendingFrameLoop };
|
|
33
|
+
//# sourceMappingURL=selfSuspendingFrameLoop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selfSuspendingFrameLoop.js","sources":["../../../Canvas/selfSuspendingFrameLoop.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAA;AACA;AAiBA;AACA;AACA;AACA;AACA;AACO,MAAM,6BAA6B,GAAG,CACzC,IAA8B,EAC9B,QAAA,GAA2B,QAAQ,IAAI,qBAAqB,CAAC,QAAQ,CAAC,EACtE,MAAA,GAAwB,MAAM,IAAI,oBAAoB,CAAC,MAAM,CAAC,KACrC;AACzB,IAAA,IAAI,MAA0B;AAE9B,IAAA,MAAM,KAAK,GAAG,CAAC,GAAW,KAAI;QAC1B,MAAM,GAAG,SAAS;AAClB,QAAA,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE;AACX,YAAA,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC;QAC5B;AACJ,IAAA,CAAC;IAED,OAAO;AACH,QAAA,IAAI,SAAS,GAAA;YACT,OAAO,MAAM,KAAK,SAAS;QAC/B,CAAC;QAED,IAAI,GAAA;AACA,YAAA,MAAM,KAAK,QAAQ,CAAC,KAAK,CAAC;QAC9B,CAAC;QAED,IAAI,GAAA;AACA,YAAA,IAAI,MAAM,KAAK,SAAS,EAAE;gBACtB,MAAM,CAAC,MAAM,CAAC;gBACd,MAAM,GAAG,SAAS;YACtB;QACJ,CAAC;KACJ;AACL;;;;"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React, { ReactNode, RefObject } from 'react';
|
|
2
|
+
export type AnchoredOverlaySide = 'above' | 'below' | 'left' | 'right';
|
|
3
|
+
export type AnchoredOverlayAlign = 'left' | 'right' | 'center';
|
|
4
|
+
export interface AnchoredOverlayProps {
|
|
5
|
+
anchorRef: RefObject<HTMLElement | null>;
|
|
6
|
+
open: boolean;
|
|
7
|
+
side?: AnchoredOverlaySide;
|
|
8
|
+
align?: AnchoredOverlayAlign;
|
|
9
|
+
gap?: number;
|
|
10
|
+
children: ReactNode;
|
|
11
|
+
}
|
|
12
|
+
export declare const AnchoredOverlay: React.FC<AnchoredOverlayProps>;
|
|
13
|
+
//# sourceMappingURL=AnchoredOverlay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AnchoredOverlay.d.ts","sourceRoot":"","sources":["../../../../../Canvas/shapes/ChatBubble/AnchoredOverlay.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,SAAS,EAA6B,MAAM,OAAO,CAAC;AAI/E,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;AAGvE,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE/D,MAAM,WAAW,oBAAoB;IAGjC,SAAS,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAGzC,IAAI,EAAE,OAAO,CAAC;IAGd,IAAI,CAAC,EAAE,mBAAmB,CAAC;IAG3B,KAAK,CAAC,EAAE,oBAAoB,CAAC;IAG7B,GAAG,CAAC,EAAE,MAAM,CAAC;IAGb,QAAQ,EAAE,SAAS,CAAC;CACvB;AA6CD,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CA6B1D,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useState, useLayoutEffect } from 'react';
|
|
3
|
+
import { createPortal } from 'react-dom';
|
|
4
|
+
|
|
5
|
+
/** Space on the preferred side under which an above/below overlay flips to the other side. */
|
|
6
|
+
const FLIP_THRESHOLD = 260;
|
|
7
|
+
function computePlacement(anchor, side, align, gap) {
|
|
8
|
+
if (side === 'left' || side === 'right') {
|
|
9
|
+
return {
|
|
10
|
+
top: anchor.top + (anchor.height / 2),
|
|
11
|
+
left: side === 'right' ? anchor.right + gap : anchor.left - gap,
|
|
12
|
+
transform: side === 'right' ? 'translateY(-50%)' : 'translate(-100%, -50%)',
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
const spaceBelow = window.innerHeight - anchor.bottom - gap;
|
|
16
|
+
const spaceAbove = anchor.top - gap;
|
|
17
|
+
const resolved = side === 'below'
|
|
18
|
+
? (spaceBelow < FLIP_THRESHOLD && spaceAbove > spaceBelow ? 'above' : 'below')
|
|
19
|
+
: (spaceAbove < FLIP_THRESHOLD && spaceBelow > spaceAbove ? 'below' : 'above');
|
|
20
|
+
const horizontal = align === 'center'
|
|
21
|
+
? { left: anchor.left + (anchor.width / 2), transform: 'translateX(-50%)' }
|
|
22
|
+
: align === 'right'
|
|
23
|
+
? { left: anchor.right, transform: 'translateX(-100%)' }
|
|
24
|
+
: { left: anchor.left, transform: undefined };
|
|
25
|
+
return resolved === 'below'
|
|
26
|
+
? { top: anchor.bottom + gap, ...horizontal }
|
|
27
|
+
: { bottom: window.innerHeight - anchor.top + gap, ...horizontal };
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Renders its children into a fixed-position portal on <body>, anchored to an element on the board.
|
|
31
|
+
* Board overlays (menus, pickers, tooltips) must float above everything: the slice columns use
|
|
32
|
+
* content-visibility paint containment for virtualization, which clips any absolutely-positioned
|
|
33
|
+
* descendant to the column box — portaling is what lets an overlay escape (the same approach the
|
|
34
|
+
* Cratis Dropdown takes with appendTo=document.body).
|
|
35
|
+
*/
|
|
36
|
+
const AnchoredOverlay = ({ anchorRef, open, side = 'below', align = 'left', gap = 8, children }) => {
|
|
37
|
+
const [placement, setPlacement] = useState();
|
|
38
|
+
useLayoutEffect(() => {
|
|
39
|
+
if (!open) {
|
|
40
|
+
setPlacement(undefined);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const anchor = anchorRef.current?.getBoundingClientRect();
|
|
44
|
+
if (!anchor)
|
|
45
|
+
return;
|
|
46
|
+
setPlacement(computePlacement(anchor, side, align, gap));
|
|
47
|
+
}, [open, side, align, gap, anchorRef]);
|
|
48
|
+
if (!open || !placement)
|
|
49
|
+
return null;
|
|
50
|
+
return createPortal(jsx("div", { style: {
|
|
51
|
+
position: 'fixed',
|
|
52
|
+
zIndex: 1300,
|
|
53
|
+
top: placement.top,
|
|
54
|
+
bottom: placement.bottom,
|
|
55
|
+
left: placement.left,
|
|
56
|
+
transform: placement.transform,
|
|
57
|
+
}, children: children }), document.body);
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
export { AnchoredOverlay };
|
|
61
|
+
//# sourceMappingURL=AnchoredOverlay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AnchoredOverlay.js","sources":["../../../../../Canvas/shapes/ChatBubble/AnchoredOverlay.tsx"],"sourcesContent":[null],"names":["_jsx"],"mappings":";;;;AAiCA;AACA,MAAM,cAAc,GAAG,GAAG;AAS1B,SAAS,gBAAgB,CAAC,MAAe,EAAE,IAAyB,EAAE,KAA2B,EAAE,GAAW,EAAA;IAC1G,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,OAAO,EAAE;QACrC,OAAO;YACH,GAAG,EAAE,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;AACrC,YAAA,IAAI,EAAE,IAAI,KAAK,OAAO,GAAG,MAAM,CAAC,KAAK,GAAG,GAAG,GAAG,MAAM,CAAC,IAAI,GAAG,GAAG;YAC/D,SAAS,EAAE,IAAI,KAAK,OAAO,GAAG,kBAAkB,GAAG,wBAAwB;SAC9E;IACL;IAEA,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,MAAM,GAAG,GAAG;AAC3D,IAAA,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,GAAG,GAAG;AACnC,IAAA,MAAM,QAAQ,GAAG,IAAI,KAAK;AACtB,WAAG,UAAU,GAAG,cAAc,IAAI,UAAU,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO;AAC7E,WAAG,UAAU,GAAG,cAAc,IAAI,UAAU,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC;AAElF,IAAA,MAAM,UAAU,GAAG,KAAK,KAAK;AACzB,UAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,kBAAkB;UACvE,KAAK,KAAK;cACN,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,mBAAmB;AACtD,cAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE;IAErD,OAAO,QAAQ,KAAK;AAChB,UAAE,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,GAAG,GAAG,EAAE,GAAG,UAAU;AAC3C,UAAE,EAAE,MAAM,EAAE,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,UAAU,EAAE;AAC1E;AAEA;;;;;;AAMG;AACI,MAAM,eAAe,GAAmC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,EAAE,KAAK,GAAG,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,QAAQ,EAAE,KAAI;IACtI,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,EAAyB;IAEnE,eAAe,CAAC,MAAK;QACjB,IAAI,CAAC,IAAI,EAAE;YACP,YAAY,CAAC,SAAS,CAAC;YACvB;QACJ;QACA,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,qBAAqB,EAAE;AACzD,QAAA,IAAI,CAAC,MAAM;YAAE;AACb,QAAA,YAAY,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;AAC5D,IAAA,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;AAEvC,IAAA,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS;AAAE,QAAA,OAAO,IAAI;AAEpC,IAAA,OAAO,YAAY,CACfA,GAAA,CAAA,KAAA,EAAA,EACI,KAAK,EAAE;AACH,YAAA,QAAQ,EAAE,OAAO;AACjB,YAAA,MAAM,EAAE,IAAI;YACZ,GAAG,EAAE,SAAS,CAAC,GAAG;YAClB,MAAM,EAAE,SAAS,CAAC,MAAM;YACxB,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,SAAS,EAAE,SAAS,CAAC,SAAS;AACjC,SAAA,EAAA,QAAA,EAEA,QAAQ,EAAA,CACP,EACN,QAAQ,CAAC,IAAI,CAAC;AACtB;;;;"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Guid } from '@cratis/fundamentals';
|
|
2
|
+
export interface BuildAvatarUrlParams {
|
|
3
|
+
userId: string;
|
|
4
|
+
ownerType: 'Users' | 'Personas' | 'Agents';
|
|
5
|
+
avatarSize: 'Small' | 'Medium';
|
|
6
|
+
version?: number | string;
|
|
7
|
+
}
|
|
8
|
+
export interface PersonAvatarCircleProps {
|
|
9
|
+
userId: Guid | string;
|
|
10
|
+
name: string;
|
|
11
|
+
hasAvatar: boolean;
|
|
12
|
+
size: number;
|
|
13
|
+
ownerType?: 'Users' | 'Personas' | 'Agents';
|
|
14
|
+
avatarSize?: 'Small' | 'Medium';
|
|
15
|
+
version?: number | string;
|
|
16
|
+
buildAvatarUrl?: (params: BuildAvatarUrlParams) => string;
|
|
17
|
+
className?: string;
|
|
18
|
+
}
|
|
19
|
+
export declare const PersonAvatarCircle: ({ userId, name, hasAvatar, size, ownerType, avatarSize, version, buildAvatarUrl, className }: PersonAvatarCircleProps) => import("react").JSX.Element;
|
|
20
|
+
//# sourceMappingURL=PersonAvatarCircle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PersonAvatarCircle.d.ts","sourceRoot":"","sources":["../../../../../../Canvas/shapes/ChatBubble/Avatar/PersonAvatarCircle.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAKjD,MAAM,WAAW,oBAAoB;IAGjC,MAAM,EAAE,MAAM,CAAC;IAGf,SAAS,EAAE,OAAO,GAAG,UAAU,GAAG,QAAQ,CAAC;IAG3C,UAAU,EAAE,OAAO,GAAG,QAAQ,CAAC;IAG/B,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,uBAAuB;IAGpC,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC;IAGtB,IAAI,EAAE,MAAM,CAAC;IAGb,SAAS,EAAE,OAAO,CAAC;IAGnB,IAAI,EAAE,MAAM,CAAC;IAGb,SAAS,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,QAAQ,CAAC;IAG5C,UAAU,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IAMhC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAO1B,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,oBAAoB,KAAK,MAAM,CAAC;IAG1D,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAOD,eAAO,MAAM,kBAAkB,GAAI,8FAAkH,uBAAuB,gCAwB3K,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { getInitials } from './getInitials.js';
|
|
4
|
+
import { getAvatarColor } from './getAvatarColor.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Renders a person's avatar image when one has been uploaded and a URL can be built for it, falling
|
|
8
|
+
* back to their initials on a color derived from their identifier so the same person always shows the
|
|
9
|
+
* same fallback color.
|
|
10
|
+
*/
|
|
11
|
+
const PersonAvatarCircle = ({ userId, name, hasAvatar, size, ownerType = 'Users', avatarSize = 'Small', version, buildAvatarUrl, className }) => {
|
|
12
|
+
const initials = getInitials(name);
|
|
13
|
+
const dimension = `${size}px`;
|
|
14
|
+
const src = buildAvatarUrl?.({ userId: userId.toString(), ownerType, avatarSize, version });
|
|
15
|
+
// The "has avatar" signal can outlive the stored image (e.g. a persona flag that stays set
|
|
16
|
+
// after the blob is gone), which otherwise leaves a broken image and a stream of 404s.
|
|
17
|
+
// Track the src that failed and fall back to initials for it — a new src (re-upload bumps the
|
|
18
|
+
// version) is retried.
|
|
19
|
+
const [failedSrc, setFailedSrc] = useState(null);
|
|
20
|
+
const showImage = hasAvatar && !!src && src !== failedSrc;
|
|
21
|
+
return (jsx("span", { className: className ? `person-avatar-circle ${className}` : 'person-avatar-circle', style: { width: dimension, height: dimension, background: showImage ? undefined : getAvatarColor(userId.toString()) }, "aria-label": name, title: name, children: showImage
|
|
22
|
+
? jsx("img", { className: 'person-avatar-circle-image', src: src, alt: name, draggable: false, onError: () => setFailedSrc(src) })
|
|
23
|
+
: jsx("span", { className: 'person-avatar-circle-initials', style: { fontSize: `${Math.max(8, Math.round(size * 0.4))}px` }, children: initials }) }));
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export { PersonAvatarCircle };
|
|
27
|
+
//# sourceMappingURL=PersonAvatarCircle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PersonAvatarCircle.js","sources":["../../../../../../Canvas/shapes/ChatBubble/Avatar/PersonAvatarCircle.tsx"],"sourcesContent":[null],"names":["_jsx"],"mappings":";;;;;AA6DA;;;;AAIG;AACI,MAAM,kBAAkB,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,EAAE,UAAU,GAAG,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,SAAS,EAA2B,KAAI;AAC5K,IAAA,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC;AAClC,IAAA,MAAM,SAAS,GAAG,CAAA,EAAG,IAAI,IAAI;IAC7B,MAAM,GAAG,GAAG,cAAc,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;;;;;IAM3F,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC;IAC/D,MAAM,SAAS,GAAG,SAAS,IAAI,CAAC,CAAC,GAAG,IAAI,GAAG,KAAK,SAAS;IAEzD,QACIA,GAAA,CAAA,MAAA,EAAA,EACI,SAAS,EAAE,SAAS,GAAG,CAAA,qBAAA,EAAwB,SAAS,CAAA,CAAE,GAAG,sBAAsB,EACnF,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,GAAG,SAAS,GAAG,cAAc,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAA,YAAA,EACzG,IAAI,EAChB,KAAK,EAAE,IAAI,EAAA,QAAA,EAEV;cACKA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,4BAA4B,EAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC,GAAG,CAAC,EAAA;AACrH,cAAEA,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,+BAA+B,EAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAA,EAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAA,EAAA,CAAI,EAAE,EAAA,QAAA,EAAG,QAAQ,EAAA,CAAQ,EAAA,CACrI;AAEf;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getAvatarColor.d.ts","sourceRoot":"","sources":["../../../../../../Canvas/shapes/ChatBubble/Avatar/getAvatarColor.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,cAAc,GAAI,MAAM,MAAM,KAAG,MAM7C,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
const AVATAR_COLORS = ['#6366f1', '#8b5cf6', '#ec4899', '#f43f5e', '#f97316', '#0ea5e9', '#10b981', '#14b8a6'];
|
|
4
|
+
/**
|
|
5
|
+
* Computes a deterministic avatar background color from a stable seed - the person's identifier -
|
|
6
|
+
* so the same person always shows the same fallback color everywhere their avatar appears,
|
|
7
|
+
* regardless of how their name is rendered in that context.
|
|
8
|
+
* @param seed A stable identifier for the person (e.g. their user id as a string).
|
|
9
|
+
* @returns A hex color from the predefined avatar palette.
|
|
10
|
+
*/
|
|
11
|
+
const getAvatarColor = (seed) => {
|
|
12
|
+
let hash = 0;
|
|
13
|
+
for (let charIndex = 0; charIndex < seed.length; charIndex++) {
|
|
14
|
+
hash = (hash * 31 + seed.charCodeAt(charIndex)) | 0;
|
|
15
|
+
}
|
|
16
|
+
return AVATAR_COLORS[Math.abs(hash) % AVATAR_COLORS.length];
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export { getAvatarColor };
|
|
20
|
+
//# sourceMappingURL=getAvatarColor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getAvatarColor.js","sources":["../../../../../../Canvas/shapes/ChatBubble/Avatar/getAvatarColor.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAA;AACA;AAEA,MAAM,aAAa,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;AAE9G;;;;;;AAMG;AACI,MAAM,cAAc,GAAG,CAAC,IAAY,KAAY;IACnD,IAAI,IAAI,GAAG,CAAC;AACZ,IAAA,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE;AAC1D,QAAA,IAAI,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC;IACvD;AACA,IAAA,OAAO,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC;AAC/D;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getInitials.d.ts","sourceRoot":"","sources":["../../../../../../Canvas/shapes/ChatBubble/Avatar/getInitials.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,KAAG,MACgE,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
/**
|
|
4
|
+
* Computes up to two uppercase initials from a display name.
|
|
5
|
+
* @param name The display name.
|
|
6
|
+
* @returns One or two initials, or '?' when none can be derived.
|
|
7
|
+
*/
|
|
8
|
+
const getInitials = (name) => name.trim().split(/\s+/).filter(Boolean).map(word => word[0]).join('').slice(0, 2).toUpperCase() || '?';
|
|
9
|
+
|
|
10
|
+
export { getInitials };
|
|
11
|
+
//# sourceMappingURL=getInitials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getInitials.js","sources":["../../../../../../Canvas/shapes/ChatBubble/Avatar/getInitials.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAA;AACA;AAEA;;;;AAIG;AACI,MAAM,WAAW,GAAG,CAAC,IAAY,KACpC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI;;;;"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { PersonAvatarCircle } from './PersonAvatarCircle';
|
|
2
|
+
export type { PersonAvatarCircleProps, BuildAvatarUrlParams } from './PersonAvatarCircle';
|
|
3
|
+
export { getAvatarColor } from './getAvatarColor';
|
|
4
|
+
export { getInitials } from './getInitials';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../Canvas/shapes/ChatBubble/Avatar/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,YAAY,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC1F,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../Canvas/shapes/ChatBubble/Avatar/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { Guid } from '@cratis/fundamentals';
|
|
3
|
+
import type { BuildAvatarUrlParams } from './Avatar';
|
|
4
|
+
import { type ChatComposerLabels } from './ChatComposer';
|
|
5
|
+
import { type ChatMessageBubbleLabels } from './ChatMessageBubble';
|
|
6
|
+
import type { ChatMessage } from './ChatMessage';
|
|
7
|
+
import type { ChatTypingAuthor } from './ChatTypingAuthor';
|
|
8
|
+
import { ChatVariant } from './ChatVariant';
|
|
9
|
+
import { type FailedReplyLabels, type FailedReplyReportDetails } from './FailedReply';
|
|
10
|
+
import type { MentionCandidate } from './Mentions';
|
|
11
|
+
export interface ChatLabels {
|
|
12
|
+
title?: string;
|
|
13
|
+
close?: string;
|
|
14
|
+
closePanel?: string;
|
|
15
|
+
noComments?: string;
|
|
16
|
+
typing?: string;
|
|
17
|
+
typingTwo?: string;
|
|
18
|
+
typingSeveral?: string;
|
|
19
|
+
composer?: ChatComposerLabels;
|
|
20
|
+
messageBubble?: ChatMessageBubbleLabels;
|
|
21
|
+
failedReply?: FailedReplyLabels;
|
|
22
|
+
}
|
|
23
|
+
export interface ChatProps {
|
|
24
|
+
messages: ChatMessage[];
|
|
25
|
+
onSend: (text: string) => void;
|
|
26
|
+
onClose: () => void;
|
|
27
|
+
title?: string;
|
|
28
|
+
autoFocus?: boolean;
|
|
29
|
+
variant?: ChatVariant;
|
|
30
|
+
mentionCandidates?: MentionCandidate[];
|
|
31
|
+
typingAuthors?: ChatTypingAuthor[];
|
|
32
|
+
currentUserId?: Guid;
|
|
33
|
+
onReact?: (messageId: Guid, emoji: string) => void;
|
|
34
|
+
onAct?: (messageId: Guid) => void;
|
|
35
|
+
canAct?: (message: ChatMessage) => boolean;
|
|
36
|
+
buildAvatarUrl?: (params: BuildAvatarUrlParams) => string;
|
|
37
|
+
buildReportUrl?: (details: FailedReplyReportDetails) => string;
|
|
38
|
+
labels?: ChatLabels;
|
|
39
|
+
}
|
|
40
|
+
export declare const Chat: React.FC<ChatProps>;
|
|
41
|
+
//# sourceMappingURL=Chat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Chat.d.ts","sourceRoot":"","sources":["../../../../../Canvas/shapes/ChatBubble/Chat.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAqC,MAAM,OAAO,CAAC;AAC1D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAyC,KAAK,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAChG,OAAO,EAAqB,KAAK,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AACtF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAe,KAAK,iBAAiB,EAAE,KAAK,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACnG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAMnD,MAAM,WAAW,UAAU;IAEvB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAE9B,aAAa,CAAC,EAAE,uBAAuB,CAAC;IAExC,WAAW,CAAC,EAAE,iBAAiB,CAAC;CACnC;AAED,MAAM,WAAW,SAAS;IAEtB,QAAQ,EAAE,WAAW,EAAE,CAAC;IAExB,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAE/B,OAAO,EAAE,MAAM,IAAI,CAAC;IAEpB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,SAAS,CAAC,EAAE,OAAO,CAAC;IAMpB,OAAO,CAAC,EAAE,WAAW,CAAC;IAGtB,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAGvC,aAAa,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAOnC,aAAa,CAAC,EAAE,IAAI,CAAC;IAGrB,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAMnD,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,KAAK,IAAI,CAAC;IAKlC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC;IAG3C,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,oBAAoB,KAAK,MAAM,CAAC;IAM1D,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,wBAAwB,KAAK,MAAM,CAAC;IAI/D,MAAM,CAAC,EAAE,UAAU,CAAC;CACvB;AA0DD,eAAO,MAAM,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,SAAS,CAuFpC,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useRef, useMemo, useEffect } from 'react';
|
|
3
|
+
import { ChatComposer } from './ChatComposer.js';
|
|
4
|
+
import { ChatMessageBubble } from './ChatMessageBubble.js';
|
|
5
|
+
import { ChatVariant } from './ChatVariant.js';
|
|
6
|
+
import { FailedReply } from './FailedReply.js';
|
|
7
|
+
import { TypingIndicator } from './TypingIndicator.js';
|
|
8
|
+
|
|
9
|
+
function formatTimestamp(date) {
|
|
10
|
+
const diffMs = Date.now() - date.getTime();
|
|
11
|
+
const diffMinutes = Math.floor(diffMs / 60_000);
|
|
12
|
+
if (diffMinutes < 1)
|
|
13
|
+
return 'just now';
|
|
14
|
+
if (diffMinutes < 60)
|
|
15
|
+
return `${diffMinutes}m ago`;
|
|
16
|
+
const diffHours = Math.floor(diffMinutes / 60);
|
|
17
|
+
if (diffHours < 24)
|
|
18
|
+
return `${diffHours}h ago`;
|
|
19
|
+
return date.toLocaleDateString(undefined, { month: 'short', day: 'numeric' });
|
|
20
|
+
}
|
|
21
|
+
function sameMinute(a, b) {
|
|
22
|
+
return (a.getFullYear() === b.getFullYear() &&
|
|
23
|
+
a.getMonth() === b.getMonth() &&
|
|
24
|
+
a.getDate() === b.getDate() &&
|
|
25
|
+
a.getHours() === b.getHours() &&
|
|
26
|
+
a.getMinutes() === b.getMinutes());
|
|
27
|
+
}
|
|
28
|
+
function computeRenderInfo(messages) {
|
|
29
|
+
return messages.map((message, index) => {
|
|
30
|
+
const previous = index > 0 ? messages[index - 1] : null;
|
|
31
|
+
const next = index < messages.length - 1 ? messages[index + 1] : null;
|
|
32
|
+
const showAuthor = !previous || previous.authorName !== message.authorName;
|
|
33
|
+
const showTimestamp = !next ||
|
|
34
|
+
next.authorName !== message.authorName ||
|
|
35
|
+
!sameMinute(message.timestamp, next.timestamp);
|
|
36
|
+
return { showAuthor, showTimestamp };
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Composes the "X is typing" line from whoever the conversation is waiting on.
|
|
41
|
+
* @param authors The authors currently typing or working.
|
|
42
|
+
* @param labels Label overrides, as passed to {@link Chat}.
|
|
43
|
+
* @returns The label to show, empty when nobody is.
|
|
44
|
+
*/
|
|
45
|
+
function typingLabel(authors, labels) {
|
|
46
|
+
if (authors.length === 0)
|
|
47
|
+
return '';
|
|
48
|
+
if (authors.length === 1)
|
|
49
|
+
return (labels?.typing ?? '{name} is typing').replace('{name}', authors[0].name);
|
|
50
|
+
if (authors.length === 2)
|
|
51
|
+
return (labels?.typingTwo ?? '{first} and {second} are typing').replace('{first}', authors[0].name).replace('{second}', authors[1].name);
|
|
52
|
+
return labels?.typingSeveral ?? 'Several people are typing';
|
|
53
|
+
}
|
|
54
|
+
const Chat = ({ messages, onSend, onClose, title, autoFocus = false, variant = ChatVariant.Floating, mentionCandidates, typingAuthors = [], currentUserId, onReact, onAct, canAct, buildAvatarUrl, buildReportUrl, labels, }) => {
|
|
55
|
+
const messagesEndRef = useRef(null);
|
|
56
|
+
const composerRef = useRef(null);
|
|
57
|
+
const renderInfo = useMemo(() => computeRenderInfo(messages), [messages]);
|
|
58
|
+
const isDocked = variant === ChatVariant.Docked;
|
|
59
|
+
const resolvedTitle = title ?? labels?.title ?? 'Comments';
|
|
60
|
+
useEffect(() => {
|
|
61
|
+
messagesEndRef.current?.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
|
|
62
|
+
}, [messages, typingAuthors.length]);
|
|
63
|
+
const quickReply = (authorName) => composerRef.current?.prefill(`@${authorName} `);
|
|
64
|
+
return (jsxs("div", { className: `chat-panel${isDocked ? ' chat-panel--docked' : ''}`, onClick: event => event.stopPropagation(), children: [!isDocked && (jsxs("div", { className: 'chat-panel-header', children: [jsx("span", { className: 'chat-panel-title', children: resolvedTitle }), jsx("button", { className: 'chat-panel-close', onClick: onClose, title: labels?.close ?? 'Close', "aria-label": labels?.closePanel ?? 'Close panel', children: "\u00D7" })] })), jsxs("div", { className: 'chat-panel-messages', children: [messages.length === 0 && (jsx("p", { className: 'chat-panel-empty', children: labels?.noComments ?? 'No comments yet. Be the first!' })), messages.map((message, index) => {
|
|
65
|
+
// A turn that ended in failure is not something its author said, so it never becomes
|
|
66
|
+
// a bubble — it stands where the answer would have been and says so.
|
|
67
|
+
if (message.failureDetail !== undefined) {
|
|
68
|
+
return jsx(FailedReply, { message: message, buildReportUrl: buildReportUrl, labels: labels?.failedReply }, message.id.toString());
|
|
69
|
+
}
|
|
70
|
+
const { showAuthor, showTimestamp } = renderInfo[index];
|
|
71
|
+
return (jsx(ChatMessageBubble, { message: message, showAuthor: showAuthor, showTimestamp: showTimestamp, formattedTimestamp: formatTimestamp(message.timestamp), currentUserId: currentUserId, onReact: onReact, onQuickReply: quickReply, onAct: onAct && (canAct?.(message) ?? true) ? onAct : undefined, buildAvatarUrl: buildAvatarUrl, labels: labels?.messageBubble }, message.id.toString()));
|
|
72
|
+
}), jsx(TypingIndicator, { authors: typingAuthors, label: typingLabel(typingAuthors, labels), buildAvatarUrl: buildAvatarUrl }), jsx("div", { ref: messagesEndRef })] }), jsx(ChatComposer, { ref: composerRef, mentionCandidates: mentionCandidates, onSend: onSend, autoFocus: autoFocus, buildAvatarUrl: buildAvatarUrl, labels: labels?.composer })] }));
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
export { Chat };
|
|
76
|
+
//# sourceMappingURL=Chat.js.map
|