@weavy/uikit-react 11.0.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/.github/workflows/publish.yml +16 -0
- package/LICENSE.md +21 -0
- package/README.md +110 -0
- package/changelog.md +50 -0
- package/dist/cjs/index.js +39 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/types/client/WeavyClient.d.ts +16 -0
- package/dist/cjs/types/components/Attachment.d.ts +13 -0
- package/dist/cjs/types/components/Avatar.d.ts +11 -0
- package/dist/cjs/types/components/Chat.d.ts +4 -0
- package/dist/cjs/types/components/Conversation.d.ts +4 -0
- package/dist/cjs/types/components/ConversationBadge.d.ts +3 -0
- package/dist/cjs/types/components/ConversationForm.d.ts +7 -0
- package/dist/cjs/types/components/ConversationList.d.ts +3 -0
- package/dist/cjs/types/components/ConversationListItem.d.ts +4 -0
- package/dist/cjs/types/components/File.d.ts +9 -0
- package/dist/cjs/types/components/FileBrowser.d.ts +6 -0
- package/dist/cjs/types/components/Image.d.ts +16 -0
- package/dist/cjs/types/components/Meeting.d.ts +8 -0
- package/dist/cjs/types/components/MeetingCard.d.ts +6 -0
- package/dist/cjs/types/components/Meetings.d.ts +6 -0
- package/dist/cjs/types/components/Message.d.ts +4 -0
- package/dist/cjs/types/components/Messages.d.ts +9 -0
- package/dist/cjs/types/components/Messenger.d.ts +4 -0
- package/dist/cjs/types/components/NewConversation.d.ts +3 -0
- package/dist/cjs/types/components/Presence.d.ts +7 -0
- package/dist/cjs/types/components/Reactions.d.ts +13 -0
- package/dist/cjs/types/components/SearchUsers.d.ts +7 -0
- package/dist/cjs/types/components/SeenBy.d.ts +9 -0
- package/dist/cjs/types/components/Typing.d.ts +8 -0
- package/dist/cjs/types/contexts/MessengerContext.d.ts +8 -0
- package/dist/cjs/types/contexts/PreviewContext.d.ts +7 -0
- package/dist/cjs/types/contexts/UserContext.d.ts +8 -0
- package/dist/cjs/types/contexts/WeavyContext.d.ts +10 -0
- package/dist/cjs/types/hooks/useBadge.d.ts +1 -0
- package/dist/cjs/types/hooks/useChat.d.ts +1 -0
- package/dist/cjs/types/hooks/useConversation.d.ts +1 -0
- package/dist/cjs/types/hooks/useConversations.d.ts +1 -0
- package/dist/cjs/types/hooks/useDebounce.d.ts +2 -0
- package/dist/cjs/types/hooks/useEvents.d.ts +6 -0
- package/dist/cjs/types/hooks/useFileUploader.d.ts +1 -0
- package/dist/cjs/types/hooks/useMembers.d.ts +1 -0
- package/dist/cjs/types/hooks/useMessages.d.ts +1 -0
- package/dist/cjs/types/hooks/useMutateChat.d.ts +4 -0
- package/dist/cjs/types/hooks/useMutateConversation.d.ts +3 -0
- package/dist/cjs/types/hooks/useMutateConversationName.d.ts +4 -0
- package/dist/cjs/types/hooks/useMutateDeleteReaction.d.ts +4 -0
- package/dist/cjs/types/hooks/useMutateExternalBlobs.d.ts +3 -0
- package/dist/cjs/types/hooks/useMutateMeeting.d.ts +3 -0
- package/dist/cjs/types/hooks/useMutateMembers.d.ts +4 -0
- package/dist/cjs/types/hooks/useMutateMessage.d.ts +9 -0
- package/dist/cjs/types/hooks/useMutatePinned.d.ts +4 -0
- package/dist/cjs/types/hooks/useMutateReaction.d.ts +4 -0
- package/dist/cjs/types/hooks/useMutateRead.d.ts +4 -0
- package/dist/cjs/types/hooks/useMutateRemoveMembers.d.ts +4 -0
- package/dist/cjs/types/hooks/useMutateTyping.d.ts +3 -0
- package/dist/cjs/types/hooks/usePresence.d.ts +1 -0
- package/dist/cjs/types/hooks/usePreview.d.ts +4 -0
- package/dist/cjs/types/hooks/useReactions.d.ts +3 -0
- package/dist/cjs/types/hooks/useSearchUsers.d.ts +1 -0
- package/dist/cjs/types/hooks/useThrottle.d.ts +2 -0
- package/dist/cjs/types/hooks/useUser.d.ts +1 -0
- package/dist/cjs/types/index.d.ts +15 -0
- package/dist/cjs/types/types/Chat.d.ts +3 -0
- package/dist/cjs/types/types/Conversation.d.ts +4 -0
- package/dist/cjs/types/types/ConversationListItem.d.ts +4 -0
- package/dist/cjs/types/types/Message.d.ts +15 -0
- package/dist/cjs/types/types/Messenger.d.ts +3 -0
- package/dist/cjs/types/types/types.d.ts +150 -0
- package/dist/cjs/types/ui/Button.d.ts +4 -0
- package/dist/cjs/types/ui/Dropdown.d.ts +19 -0
- package/dist/cjs/types/ui/Icon.d.ts +10 -0
- package/dist/cjs/types/ui/Overlay.d.ts +12 -0
- package/dist/cjs/types/utils/fileUtilities.d.ts +5 -0
- package/dist/cjs/types/utils/styles.d.ts +17 -0
- package/dist/esm/index.js +39 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/types/client/WeavyClient.d.ts +16 -0
- package/dist/esm/types/components/Attachment.d.ts +13 -0
- package/dist/esm/types/components/Avatar.d.ts +11 -0
- package/dist/esm/types/components/Chat.d.ts +4 -0
- package/dist/esm/types/components/Conversation.d.ts +4 -0
- package/dist/esm/types/components/ConversationBadge.d.ts +3 -0
- package/dist/esm/types/components/ConversationForm.d.ts +7 -0
- package/dist/esm/types/components/ConversationList.d.ts +3 -0
- package/dist/esm/types/components/ConversationListItem.d.ts +4 -0
- package/dist/esm/types/components/File.d.ts +9 -0
- package/dist/esm/types/components/FileBrowser.d.ts +6 -0
- package/dist/esm/types/components/Image.d.ts +16 -0
- package/dist/esm/types/components/Meeting.d.ts +8 -0
- package/dist/esm/types/components/MeetingCard.d.ts +6 -0
- package/dist/esm/types/components/Meetings.d.ts +6 -0
- package/dist/esm/types/components/Message.d.ts +4 -0
- package/dist/esm/types/components/Messages.d.ts +9 -0
- package/dist/esm/types/components/Messenger.d.ts +4 -0
- package/dist/esm/types/components/NewConversation.d.ts +3 -0
- package/dist/esm/types/components/Presence.d.ts +7 -0
- package/dist/esm/types/components/Reactions.d.ts +13 -0
- package/dist/esm/types/components/SearchUsers.d.ts +7 -0
- package/dist/esm/types/components/SeenBy.d.ts +9 -0
- package/dist/esm/types/components/Typing.d.ts +8 -0
- package/dist/esm/types/contexts/MessengerContext.d.ts +8 -0
- package/dist/esm/types/contexts/PreviewContext.d.ts +7 -0
- package/dist/esm/types/contexts/UserContext.d.ts +8 -0
- package/dist/esm/types/contexts/WeavyContext.d.ts +10 -0
- package/dist/esm/types/hooks/useBadge.d.ts +1 -0
- package/dist/esm/types/hooks/useChat.d.ts +1 -0
- package/dist/esm/types/hooks/useConversation.d.ts +1 -0
- package/dist/esm/types/hooks/useConversations.d.ts +1 -0
- package/dist/esm/types/hooks/useDebounce.d.ts +2 -0
- package/dist/esm/types/hooks/useEvents.d.ts +6 -0
- package/dist/esm/types/hooks/useFileUploader.d.ts +1 -0
- package/dist/esm/types/hooks/useMembers.d.ts +1 -0
- package/dist/esm/types/hooks/useMessages.d.ts +1 -0
- package/dist/esm/types/hooks/useMutateChat.d.ts +4 -0
- package/dist/esm/types/hooks/useMutateConversation.d.ts +3 -0
- package/dist/esm/types/hooks/useMutateConversationName.d.ts +4 -0
- package/dist/esm/types/hooks/useMutateDeleteReaction.d.ts +4 -0
- package/dist/esm/types/hooks/useMutateExternalBlobs.d.ts +3 -0
- package/dist/esm/types/hooks/useMutateMeeting.d.ts +3 -0
- package/dist/esm/types/hooks/useMutateMembers.d.ts +4 -0
- package/dist/esm/types/hooks/useMutateMessage.d.ts +9 -0
- package/dist/esm/types/hooks/useMutatePinned.d.ts +4 -0
- package/dist/esm/types/hooks/useMutateReaction.d.ts +4 -0
- package/dist/esm/types/hooks/useMutateRead.d.ts +4 -0
- package/dist/esm/types/hooks/useMutateRemoveMembers.d.ts +4 -0
- package/dist/esm/types/hooks/useMutateTyping.d.ts +3 -0
- package/dist/esm/types/hooks/usePresence.d.ts +1 -0
- package/dist/esm/types/hooks/usePreview.d.ts +4 -0
- package/dist/esm/types/hooks/useReactions.d.ts +3 -0
- package/dist/esm/types/hooks/useSearchUsers.d.ts +1 -0
- package/dist/esm/types/hooks/useThrottle.d.ts +2 -0
- package/dist/esm/types/hooks/useUser.d.ts +1 -0
- package/dist/esm/types/index.d.ts +15 -0
- package/dist/esm/types/types/Chat.d.ts +3 -0
- package/dist/esm/types/types/Conversation.d.ts +4 -0
- package/dist/esm/types/types/ConversationListItem.d.ts +4 -0
- package/dist/esm/types/types/Message.d.ts +15 -0
- package/dist/esm/types/types/Messenger.d.ts +3 -0
- package/dist/esm/types/types/types.d.ts +150 -0
- package/dist/esm/types/ui/Button.d.ts +4 -0
- package/dist/esm/types/ui/Dropdown.d.ts +19 -0
- package/dist/esm/types/ui/Icon.d.ts +10 -0
- package/dist/esm/types/ui/Overlay.d.ts +12 -0
- package/dist/esm/types/utils/fileUtilities.d.ts +5 -0
- package/dist/esm/types/utils/styles.d.ts +17 -0
- package/dist/index.d.ts +98 -0
- package/package.json +47 -0
- package/rollup.config.js +41 -0
- package/src/client/WeavyClient.ts +95 -0
- package/src/components/Attachment.tsx +33 -0
- package/src/components/Avatar.tsx +26 -0
- package/src/components/Chat.tsx +68 -0
- package/src/components/Conversation.tsx +220 -0
- package/src/components/ConversationBadge.tsx +44 -0
- package/src/components/ConversationForm.tsx +217 -0
- package/src/components/ConversationList.tsx +61 -0
- package/src/components/ConversationListItem.tsx +155 -0
- package/src/components/File.tsx +21 -0
- package/src/components/FileBrowser.tsx +86 -0
- package/src/components/Image.tsx +66 -0
- package/src/components/Meeting.tsx +21 -0
- package/src/components/MeetingCard.tsx +31 -0
- package/src/components/Meetings.tsx +58 -0
- package/src/components/Message.tsx +90 -0
- package/src/components/Messages.tsx +271 -0
- package/src/components/Messenger.tsx +34 -0
- package/src/components/NewConversation.tsx +50 -0
- package/src/components/Presence.tsx +15 -0
- package/src/components/Reactions.tsx +95 -0
- package/src/components/SearchUsers.tsx +90 -0
- package/src/components/SeenBy.tsx +26 -0
- package/src/components/Typing.tsx +131 -0
- package/src/contexts/MessengerContext.tsx +44 -0
- package/src/contexts/PreviewContext.tsx +105 -0
- package/src/contexts/UserContext.tsx +31 -0
- package/src/contexts/WeavyContext.tsx +66 -0
- package/src/hooks/useBadge.ts +32 -0
- package/src/hooks/useChat.ts +32 -0
- package/src/hooks/useConversation.ts +28 -0
- package/src/hooks/useConversations.ts +27 -0
- package/src/hooks/useDebounce.ts +22 -0
- package/src/hooks/useEvents.ts +43 -0
- package/src/hooks/useFileUploader.ts +35 -0
- package/src/hooks/useMembers.ts +27 -0
- package/src/hooks/useMessages.ts +42 -0
- package/src/hooks/useMessenger.ts +51 -0
- package/src/hooks/useMutateChat.ts +44 -0
- package/src/hooks/useMutateConversation.ts +40 -0
- package/src/hooks/useMutateConversationName.ts +41 -0
- package/src/hooks/useMutateDeleteReaction.ts +38 -0
- package/src/hooks/useMutateExternalBlobs.ts +39 -0
- package/src/hooks/useMutateMeeting.ts +39 -0
- package/src/hooks/useMutateMembers.ts +43 -0
- package/src/hooks/useMutateMessage.ts +116 -0
- package/src/hooks/useMutatePinned.ts +40 -0
- package/src/hooks/useMutateReaction.ts +38 -0
- package/src/hooks/useMutateRead.ts +40 -0
- package/src/hooks/useMutateRemoveMembers.ts +43 -0
- package/src/hooks/useMutateTyping.ts +34 -0
- package/src/hooks/usePresence.ts +32 -0
- package/src/hooks/usePreview.ts +21 -0
- package/src/hooks/useReactions.ts +53 -0
- package/src/hooks/useSearchUsers.ts +26 -0
- package/src/hooks/useThrottle.ts +13 -0
- package/src/hooks/useUser.ts +38 -0
- package/src/index.ts +33 -0
- package/src/types/Chat.ts +3 -0
- package/src/types/Conversation.ts +4 -0
- package/src/types/ConversationListItem.ts +4 -0
- package/src/types/Message.ts +16 -0
- package/src/types/Messenger.ts +3 -0
- package/src/types/emoji-toolkit.d.ts +1 -0
- package/src/types/types.ts +175 -0
- package/src/ui/Button.tsx +32 -0
- package/src/ui/Dropdown.tsx +58 -0
- package/src/ui/Icon.tsx +79 -0
- package/src/ui/Overlay.tsx +41 -0
- package/src/utils/fileUtilities.ts +230 -0
- package/src/utils/infiniteScroll.js +175 -0
- package/src/utils/scrollToBottom.js +75 -0
- package/src/utils/styles.ts +42 -0
- package/tsconfig.json +108 -0
package/src/ui/Icon.tsx
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
const MdiIcon = require('@mdi/react/Icon')
|
|
3
|
+
import { prefix as wy } from "../utils/styles";
|
|
4
|
+
|
|
5
|
+
type Props = {
|
|
6
|
+
name: string,
|
|
7
|
+
color?: string,
|
|
8
|
+
size?: number,
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
// Custom mapping to MDI instead of symbols
|
|
12
|
+
const iconMapping: { [index: string]: string } = {
|
|
13
|
+
"attachment": "M7.5,18A5.5,5.5 0 0,1 2,12.5A5.5,5.5 0 0,1 7.5,7H18A4,4 0 0,1 22,11A4,4 0 0,1 18,15H9.5A2.5,2.5 0 0,1 7,12.5A2.5,2.5 0 0,1 9.5,10H17V11.5H9.5A1,1 0 0,0 8.5,12.5A1,1 0 0,0 9.5,13.5H18A2.5,2.5 0 0,0 20.5,11A2.5,2.5 0 0,0 18,8.5H7.5A4,4 0 0,0 3.5,12.5A4,4 0 0,0 7.5,16.5H17V18H7.5Z",
|
|
14
|
+
"back": "M20,11V13H8L13.5,18.5L12.08,19.92L4.16,12L12.08,4.08L13.5,5.5L8,11H20Z",
|
|
15
|
+
"close": "M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z",
|
|
16
|
+
"close-circle": "M12,2C17.53,2 22,6.47 22,12C22,17.53 17.53,22 12,22C6.47,22 2,17.53 2,12C2,6.47 6.47,2 12,2M15.59,7L12,10.59L8.41,7L7,8.41L10.59,12L7,15.59L8.41,17L12,13.41L15.59,17L17,15.59L13.41,12L17,8.41L15.59,7Z",
|
|
17
|
+
"dots-vertical": "M12,16A2,2 0 0,1 14,18A2,2 0 0,1 12,20A2,2 0 0,1 10,18A2,2 0 0,1 12,16M12,10A2,2 0 0,1 14,12A2,2 0 0,1 12,14A2,2 0 0,1 10,12A2,2 0 0,1 12,10M12,4A2,2 0 0,1 14,6A2,2 0 0,1 12,8A2,2 0 0,1 10,6A2,2 0 0,1 12,4Z",
|
|
18
|
+
"download": "M5,20H19V18H5M19,9H15V3H9V9H5L12,16L19,9Z",
|
|
19
|
+
"emoticon-outline": "M12,17.5C14.33,17.5 16.3,16.04 17.11,14H6.89C7.69,16.04 9.67,17.5 12,17.5M8.5,11A1.5,1.5 0 0,0 10,9.5A1.5,1.5 0 0,0 8.5,8A1.5,1.5 0 0,0 7,9.5A1.5,1.5 0 0,0 8.5,11M15.5,11A1.5,1.5 0 0,0 17,9.5A1.5,1.5 0 0,0 15.5,8A1.5,1.5 0 0,0 14,9.5A1.5,1.5 0 0,0 15.5,11M12,20A8,8 0 0,1 4,12A8,8 0 0,1 12,4A8,8 0 0,1 20,12A8,8 0 0,1 12,20M12,2C6.47,2 2,6.5 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z",
|
|
20
|
+
"magnify": "M9.5,3A6.5,6.5 0 0,1 16,9.5C16,11.11 15.41,12.59 14.44,13.73L14.71,14H15.5L20.5,19L19,20.5L14,15.5V14.71L13.73,14.44C12.59,15.41 11.11,16 9.5,16A6.5,6.5 0 0,1 3,9.5A6.5,6.5 0 0,1 9.5,3M9.5,5C7,5 5,7 5,9.5C5,12 7,14 9.5,14C12,14 14,12 14,9.5C14,7 12,5 9.5,5Z",
|
|
21
|
+
"next": "M4,11V13H16L10.5,18.5L11.92,19.92L19.84,12L11.92,4.08L10.5,5.5L16,11H4Z",
|
|
22
|
+
"pin": "M16,12V4H17V2H7V4H8V12L6,14V16H11.2V22H12.8V16H18V14L16,12Z",
|
|
23
|
+
"plus": "M19,13H13V19H11V13H5V11H11V5H13V11H19V13Z",
|
|
24
|
+
"plus-circle-outline": "M12,20C7.59,20 4,16.41 4,12C4,7.59 7.59,4 12,4C16.41,4 20,7.59 20,12C20,16.41 16.41,20 12,20M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M13,7H11V11H7V13H11V17H13V13H17V11H13V7Z",
|
|
25
|
+
"previous": "M20,11V13H8L13.5,18.5L12.08,19.92L4.16,12L12.08,4.08L13.5,5.5L8,11H20Z",
|
|
26
|
+
"send": "M2,21L23,12L2,3V10L17,12L2,14V21Z",
|
|
27
|
+
"video": "M17,10.5V7A1,1 0 0,0 16,6H4A1,1 0 0,0 3,7V17A1,1 0 0,0 4,18H16A1,1 0 0,0 17,17V13.5L21,17.5V6.5L17,10.5Z",
|
|
28
|
+
// Files
|
|
29
|
+
"email": "M20,8L12,13L4,8V6L12,11L20,6M20,4H4C2.89,4 2,4.89 2,6V18A2,2 0 0,0 4,20H20A2,2 0 0,0 22,18V6C22,4.89 21.1,4 20,4Z",
|
|
30
|
+
"file": "M13,9V3.5L18.5,9M6,2C4.89,2 4,2.89 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2H6Z",
|
|
31
|
+
"file-music": "M14,2H6A2,2 0 0,0 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2M13,13H11V18A2,2 0 0,1 9,20A2,2 0 0,1 7,18A2,2 0 0,1 9,16C9.4,16 9.7,16.1 10,16.3V11H13V13M13,9V3.5L18.5,9H13Z",
|
|
32
|
+
"file-image": "M13,9H18.5L13,3.5V9M6,2H14L20,8V20A2,2 0 0,1 18,22H6C4.89,22 4,21.1 4,20V4C4,2.89 4.89,2 6,2M6,20H15L18,20V12L14,16L12,14L6,20M8,9A2,2 0 0,0 6,11A2,2 0 0,0 8,13A2,2 0 0,0 10,11A2,2 0 0,0 8,9Z",
|
|
33
|
+
"file-video": "M13,9H18.5L13,3.5V9M6,2H14L20,8V20A2,2 0 0,1 18,22H6C4.89,22 4,21.1 4,20V4C4,2.89 4.89,2 6,2M17,19V13L14,15.2V13H7V19H14V16.8L17,19Z",
|
|
34
|
+
"file-xml": "M13,9H18.5L13,3.5V9M6,2H14L20,8V20A2,2 0 0,1 18,22H6C4.89,22 4,21.1 4,20V4C4,2.89 4.89,2 6,2M6.12,15.5L9.86,19.24L11.28,17.83L8.95,15.5L11.28,13.17L9.86,11.76L6.12,15.5M17.28,15.5L13.54,11.76L12.12,13.17L14.45,15.5L12.12,17.83L13.54,19.24L17.28,15.5Z",
|
|
35
|
+
"file-document": "M13,9H18.5L13,3.5V9M6,2H14L20,8V20A2,2 0 0,1 18,22H6C4.89,22 4,21.1 4,20V4C4,2.89 4.89,2 6,2M15,18V16H6V18H15M18,14V12H6V14H18Z",
|
|
36
|
+
"file-word": "M14,2H6A2,2 0 0,0 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2M15.2,20H13.8L12,13.2L10.2,20H8.8L6.6,11H8.1L9.5,17.8L11.3,11H12.6L14.4,17.8L15.8,11H17.3L15.2,20M13,9V3.5L18.5,9H13Z",
|
|
37
|
+
"file-excel": "M14,2H6A2,2 0 0,0 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2M15.8,20H14L12,16.6L10,20H8.2L11.1,15.5L8.2,11H10L12,14.4L14,11H15.8L12.9,15.5L15.8,20M13,9V3.5L18.5,9H13Z",
|
|
38
|
+
"file-pdf": "M12,10.5H13V13.5H12V10.5M7,11.5H8V10.5H7V11.5M20,6V18A2,2 0 0,1 18,20H6A2,2 0 0,1 4,18V6A2,2 0 0,1 6,4H18A2,2 0 0,1 20,6M9.5,10.5A1.5,1.5 0 0,0 8,9H5.5V15H7V13H8A1.5,1.5 0 0,0 9.5,11.5V10.5M14.5,10.5A1.5,1.5 0 0,0 13,9H10.5V15H13A1.5,1.5 0 0,0 14.5,13.5V10.5M18.5,9H15.5V15H17V13H18.5V11.5H17V10.5H18.5V9Z",
|
|
39
|
+
"file-powerpoint": "M12.6,12.3H10.6V15.5H12.7C13.3,15.5 13.6,15.3 13.9,15C14.2,14.7 14.3,14.4 14.3,13.9C14.3,13.4 14.2,13.1 13.9,12.8C13.6,12.5 13.2,12.3 12.6,12.3M14,2H6A2,2 0 0,0 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2M15.2,16C14.6,16.5 14.1,16.7 12.8,16.7H10.6V20H9V11H12.8C14.1,11 14.7,11.3 15.2,11.8C15.8,12.4 16,13 16,13.9C16,14.8 15.8,15.5 15.2,16M13,9V3.5L18.5,9H13Z",
|
|
40
|
+
"file-document-box": "M14,17H7V15H14M17,13H7V11H17M17,9H7V7H17M19,3H5C3.89,3 3,3.89 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V5C21,3.89 20.1,3 19,3Z",
|
|
41
|
+
"file-slide-box": "M19,16H5V8H19M19,3H5C3.89,3 3,3.89 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V5C21,3.89 20.1,3 19,3Z",
|
|
42
|
+
"file-sheet-box": "M19 3H5C3.89 3 3 3.89 3 5V19C3 20.1 3.9 21 5 21H19C20.1 21 21 20.1 21 19V5C21 3.89 20.1 3 19 3M9 18H6V16H9V18M9 15H6V13H9V15M9 12H6V10H9V12M13 18H10V16H13V18M13 15H10V13H13V15M13 12H10V10H13V12Z",
|
|
43
|
+
"file-compressed": "M14,17H12V15H10V13H12V15H14M14,9H12V11H14V13H12V11H10V9H12V7H10V5H12V7H14M19,3H5C3.89,3 3,3.89 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V5C21,3.89 20.1,3 19,3Z",
|
|
44
|
+
// Providers
|
|
45
|
+
"dropbox": "M3 6.2L8 9.39L13 6.2L8 3L3 6.2M13 6.2L18 9.39L23 6.2L18 3L13 6.2M3 12.55L8 15.74L13 12.55L8 9.35L3 12.55M18 9.35L13 12.55L18 15.74L23 12.55L18 9.35M8.03 16.8L13.04 20L18.04 16.8L13.04 13.61L8.03 16.8Z",
|
|
46
|
+
"ondedrive": "M18.21 10.29Q19 10.34 19.7 10.68 20.39 11 20.9 11.57 21.41 12.12 21.71 12.83 22 13.54 22 14.34 22 15.18 21.68 15.92 21.36 16.66 20.8 17.21 20.25 17.76 19.5 18.08 18.78 18.41 17.94 18.41H7Q5.97 18.41 5.06 18 4.15 17.61 3.47 16.94 2.79 16.26 2.4 15.35 2 14.44 2 13.41 2 12.59 2.26 11.83 2.5 11.08 3 10.45 3.44 9.82 4.08 9.35 4.72 8.88 5.5 8.63 5.87 8.5 6.21 8.5 6.56 8.43 6.93 8.41H6.94Q7.37 7.75 7.95 7.23 8.5 6.71 9.2 6.34 9.87 6 10.62 5.78 11.37 5.59 12.16 5.59 13.22 5.59 14.2 5.94 15.18 6.29 16 6.91 16.8 7.53 17.37 8.39 17.95 9.26 18.21 10.29M12.16 6.84Q11.05 6.84 10.06 7.3 9.06 7.75 8.36 8.6 8.73 8.7 9.07 8.85 9.4 9 9.73 9.2L13.71 11.58L16 10.62Q16.21 10.53 16.44 10.45 16.67 10.38 16.92 10.33 16.68 9.55 16.21 8.91 15.74 8.27 15.11 7.81 14.5 7.35 13.73 7.1 13 6.84 12.16 6.84M4 15.66L12.27 12.18L9.08 10.26Q8.59 9.97 8.06 9.81 7.5 9.66 6.95 9.66 6.19 9.66 5.5 9.96 4.84 10.26 4.34 10.77 3.84 11.29 3.54 11.97 3.25 12.65 3.25 13.41 3.25 14 3.45 14.59 3.64 15.19 4 15.66M17.94 17.16Q18.41 17.16 18.84 17 19.27 16.86 19.64 16.58L13.61 13L5.03 16.59Q5.47 16.86 5.97 17 6.47 17.16 7 17.16M20.45 15.61Q20.75 15 20.75 14.34 20.75 13.7 20.5 13.17 20.26 12.65 19.85 12.28 19.43 11.91 18.88 11.71 18.32 11.5 17.7 11.5 17.35 11.5 17 11.6 16.66 11.68 16.33 11.81 16 11.93 15.67 12.08 15.35 12.23 15.04 12.37Z",
|
|
47
|
+
"box": "M15.39,14.04V14.04C15.39,12.62 14.24,11.47 12.82,11.47C11.41,11.47 10.26,12.62 10.26,14.04V14.04C10.26,15.45 11.41,16.6 12.82,16.6C14.24,16.6 15.39,15.45 15.39,14.04M17.1,14.04C17.1,16.4 15.18,18.31 12.82,18.31C11.19,18.31 9.77,17.39 9.05,16.04C8.33,17.39 6.91,18.31 5.28,18.31C2.94,18.31 1.04,16.43 1,14.11V14.11H1V7H1V7C1,6.56 1.39,6.18 1.86,6.18C2.33,6.18 2.7,6.56 2.71,7V7H2.71V10.62C3.43,10.08 4.32,9.76 5.28,9.76C6.91,9.76 8.33,10.68 9.05,12.03C9.77,10.68 11.19,9.76 12.82,9.76C15.18,9.76 17.1,11.68 17.1,14.04V14.04M7.84,14.04V14.04C7.84,12.62 6.69,11.47 5.28,11.47C3.86,11.47 2.71,12.62 2.71,14.04V14.04C2.71,15.45 3.86,16.6 5.28,16.6C6.69,16.6 7.84,15.45 7.84,14.04M22.84,16.96V16.96C22.95,17.12 23,17.3 23,17.47C23,17.73 22.88,18 22.66,18.15C22.5,18.26 22.33,18.32 22.15,18.32C21.9,18.32 21.65,18.21 21.5,18L19.59,15.47L17.7,18V18C17.53,18.21 17.28,18.32 17.03,18.32C16.85,18.32 16.67,18.26 16.5,18.15C16.29,18 16.17,17.72 16.17,17.46C16.17,17.29 16.23,17.11 16.33,16.96V16.96H16.33V16.96L18.5,14.04L16.33,11.11V11.11H16.33V11.11C16.22,10.96 16.17,10.79 16.17,10.61C16.17,10.35 16.29,10.1 16.5,9.93C16.89,9.65 17.41,9.72 17.7,10.09V10.09L19.59,12.61L21.5,10.09C21.76,9.72 22.29,9.65 22.66,9.93C22.89,10.1 23,10.36 23,10.63C23,10.8 22.95,10.97 22.84,11.11V11.11H22.84V11.11L20.66,14.04L22.84,16.96V16.96H22.84Z",
|
|
48
|
+
"google-drive": "M7.71,3.5L1.15,15L4.58,21L11.13,9.5M9.73,15L6.3,21H19.42L22.85,15M22.28,14L15.42,2H8.58L8.57,2L15.43,14H22.28Z",
|
|
49
|
+
"zoom": "m12 2c-5.6 0-10 4.5-10 10 0 5.6 4.5 10 10 10 5.5 0 9.9-4.5 9.9-10 .1-5.6-4.4-10-9.9-10zm2.6 13.1c0 .2-.1.3-.3.3h-6.9c-1.1 0-1.9-.8-1.9-1.9v-4.6c0-.2.1-.3.3-.3h6.9c1 0 1.9.8 1.9 1.9zm3.8.1c0 .4-.2.4-.5.2l-2.8-2.1v-2.6l2.8-2.1c.2-.2.5-.1.5.2z",
|
|
50
|
+
"cloud": "M19.35,10.03C18.67,6.59 15.64,4 12,4C9.11,4 6.6,5.64 5.35,8.03C2.34,8.36 0,10.9 0,14A6,6 0 0,0 6,20H19A5,5 0 0,0 24,15C24,12.36 21.95,10.22 19.35,10.03Z"
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
function getIconMapping(name: string) {
|
|
55
|
+
let [iconName] = name.split("+");
|
|
56
|
+
return iconName in iconMapping ? iconMapping[iconName] : "";
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
function getIconOverlay(name: string) {
|
|
61
|
+
let [, overlay] = name.split("+");
|
|
62
|
+
return overlay in iconMapping ? iconMapping[overlay] : "";
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const Icon = ({ name, color = "", size, ...props }: Props) => {
|
|
66
|
+
let iconPath = getIconMapping(name);
|
|
67
|
+
let overlayPath = getIconOverlay(name);
|
|
68
|
+
|
|
69
|
+
return (
|
|
70
|
+
<span className={wy('icon ' + color)} style={{width: size && (size * 1.5 + "rem"), height: size && (size * 1.5 + "rem")}} { ...props }>
|
|
71
|
+
{iconPath ? <MdiIcon.Icon color={color} path={iconPath} size={size} /> : name }
|
|
72
|
+
{overlayPath && <MdiIcon.Icon color={color} path={overlayPath} className={wy('icon-overlay')} size={(size || 1) / 2} /> }
|
|
73
|
+
</span>
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Export as replacable UI component
|
|
78
|
+
const UIIcon = { UI: Icon };
|
|
79
|
+
export default UIIcon;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import React, { useState } from 'react';
|
|
2
|
+
import Modal, { Styles } from 'react-modal';
|
|
3
|
+
import classNames from 'classnames';
|
|
4
|
+
import { prefix as wy } from "../utils/styles";
|
|
5
|
+
|
|
6
|
+
type OverlayProps = {
|
|
7
|
+
children: React.ReactNode,
|
|
8
|
+
className?: string,
|
|
9
|
+
isOpen: boolean,
|
|
10
|
+
style?: Styles
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const customStyles = {
|
|
14
|
+
content: {
|
|
15
|
+
padding: 0
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
const OverlayImpl = ({ children, className = "", isOpen, style }: OverlayProps) => {
|
|
21
|
+
const [modalShowing, setModalShowing] = useState(false);
|
|
22
|
+
|
|
23
|
+
return (
|
|
24
|
+
<Modal
|
|
25
|
+
isOpen={isOpen}
|
|
26
|
+
ariaHideApp={false}
|
|
27
|
+
onAfterOpen={() => { setModalShowing(true)} }
|
|
28
|
+
onRequestClose={() => { setModalShowing(false)}}
|
|
29
|
+
className={classNames(wy("panel overlay transition"), className, {[wy("open")]: modalShowing})}
|
|
30
|
+
overlayClassName={wy('overlays viewport')}
|
|
31
|
+
contentLabel="Example Modal"
|
|
32
|
+
style={style}
|
|
33
|
+
>
|
|
34
|
+
{children}
|
|
35
|
+
</Modal>
|
|
36
|
+
)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Export as replacable UI component
|
|
40
|
+
const UIOverlay = { UI: OverlayImpl };
|
|
41
|
+
export default UIOverlay;
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
export const fileSizeAsString = (size: number) => {
|
|
2
|
+
var s = size;
|
|
3
|
+
var format = [" B", " KB", " MB", " GB", " TB", " PB", " EB", " ZB", " YB"];
|
|
4
|
+
var i = 0;
|
|
5
|
+
while (i < format.length - 1 && s >= 1024) {
|
|
6
|
+
s = (100 * s / 1024) / 100.0;
|
|
7
|
+
i++;
|
|
8
|
+
}
|
|
9
|
+
return s.toLocaleString() + format[i];
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const isAudio = (ext: string) => {
|
|
13
|
+
switch (ext) {
|
|
14
|
+
case ".aac":
|
|
15
|
+
case ".aif":
|
|
16
|
+
case ".aiff":
|
|
17
|
+
case ".au":
|
|
18
|
+
case ".gsm":
|
|
19
|
+
case ".m4a":
|
|
20
|
+
case ".mid":
|
|
21
|
+
case ".midi":
|
|
22
|
+
case ".mka":
|
|
23
|
+
case ".mp3":
|
|
24
|
+
case ".oga":
|
|
25
|
+
case ".ogg":
|
|
26
|
+
case ".ra":
|
|
27
|
+
case ".ram":
|
|
28
|
+
case ".snd":
|
|
29
|
+
case ".spx":
|
|
30
|
+
case ".wav":
|
|
31
|
+
case ".wma":
|
|
32
|
+
return true;
|
|
33
|
+
default:
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const isImage = (ext: string) => {
|
|
39
|
+
switch (ext) {
|
|
40
|
+
case ".ai":
|
|
41
|
+
case ".apng":
|
|
42
|
+
case ".bmp":
|
|
43
|
+
case ".emf":
|
|
44
|
+
case ".eps":
|
|
45
|
+
case ".gif":
|
|
46
|
+
case ".heic":
|
|
47
|
+
case ".ico":
|
|
48
|
+
case ".jpg":
|
|
49
|
+
case ".jpeg":
|
|
50
|
+
case ".png":
|
|
51
|
+
case ".psd":
|
|
52
|
+
case ".svg":
|
|
53
|
+
case ".tif":
|
|
54
|
+
case ".tiff":
|
|
55
|
+
case ".webp":
|
|
56
|
+
case ".wmf":
|
|
57
|
+
return true;
|
|
58
|
+
default:
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const isVideo = (ext: string) => {
|
|
64
|
+
switch (ext) {
|
|
65
|
+
case ".3g2":
|
|
66
|
+
case ".asx":
|
|
67
|
+
case ".asf":
|
|
68
|
+
case ".avi":
|
|
69
|
+
case ".flv":
|
|
70
|
+
case ".mk3d":
|
|
71
|
+
case ".mkv":
|
|
72
|
+
case ".mov":
|
|
73
|
+
case ".mp4":
|
|
74
|
+
case ".mpeg":
|
|
75
|
+
case ".mpg":
|
|
76
|
+
case ".ogm":
|
|
77
|
+
case ".ogv":
|
|
78
|
+
case ".ogx":
|
|
79
|
+
case ".qt":
|
|
80
|
+
case ".rm":
|
|
81
|
+
case ".rv":
|
|
82
|
+
case ".smi":
|
|
83
|
+
case ".smil":
|
|
84
|
+
case ".swf":
|
|
85
|
+
case ".webm":
|
|
86
|
+
case ".wmv":
|
|
87
|
+
case ".xaml":
|
|
88
|
+
return true;
|
|
89
|
+
default:
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const isMarkup = (ext: string) => {
|
|
95
|
+
switch (ext) {
|
|
96
|
+
case ".htm":
|
|
97
|
+
case ".html":
|
|
98
|
+
case ".xhtml":
|
|
99
|
+
case ".xml":
|
|
100
|
+
return true;
|
|
101
|
+
default:
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const isText = (ext: string) => {
|
|
107
|
+
switch (ext) {
|
|
108
|
+
case ".as":
|
|
109
|
+
case ".as3":
|
|
110
|
+
case ".asm":
|
|
111
|
+
case ".aspx":
|
|
112
|
+
case ".bat":
|
|
113
|
+
case ".c":
|
|
114
|
+
case ".cc":
|
|
115
|
+
case ".cmake":
|
|
116
|
+
case ".coffee":
|
|
117
|
+
case ".cpp":
|
|
118
|
+
case ".cs":
|
|
119
|
+
case ".css":
|
|
120
|
+
case ".cxx":
|
|
121
|
+
case ".diff":
|
|
122
|
+
case ".erb":
|
|
123
|
+
case ".erl":
|
|
124
|
+
case ".groovy":
|
|
125
|
+
case ".gvy":
|
|
126
|
+
case ".h":
|
|
127
|
+
case ".haml":
|
|
128
|
+
case ".hh":
|
|
129
|
+
case ".hpp":
|
|
130
|
+
case ".html":
|
|
131
|
+
case ".hxx":
|
|
132
|
+
case ".java":
|
|
133
|
+
case ".js":
|
|
134
|
+
case ".json":
|
|
135
|
+
case ".jsx":
|
|
136
|
+
case ".less":
|
|
137
|
+
case ".lst":
|
|
138
|
+
case ".m":
|
|
139
|
+
case ".make":
|
|
140
|
+
case ".markdown":
|
|
141
|
+
case ".md":
|
|
142
|
+
case ".mdown":
|
|
143
|
+
case ".mkdn":
|
|
144
|
+
case ".ml":
|
|
145
|
+
case ".mm":
|
|
146
|
+
case ".out":
|
|
147
|
+
case ".patch":
|
|
148
|
+
case ".php":
|
|
149
|
+
case ".pl":
|
|
150
|
+
case ".plist":
|
|
151
|
+
case ".properties":
|
|
152
|
+
case ".py":
|
|
153
|
+
case ".rb":
|
|
154
|
+
case ".sass":
|
|
155
|
+
case ".scala":
|
|
156
|
+
case ".scm":
|
|
157
|
+
case ".script":
|
|
158
|
+
case ".scss":
|
|
159
|
+
case ".sh":
|
|
160
|
+
case ".sml":
|
|
161
|
+
case ".sql":
|
|
162
|
+
case ".txt":
|
|
163
|
+
case ".vb":
|
|
164
|
+
case ".vi":
|
|
165
|
+
case ".vim":
|
|
166
|
+
case ".xhtml":
|
|
167
|
+
case ".xml":
|
|
168
|
+
case ".xsd":
|
|
169
|
+
case ".xsl":
|
|
170
|
+
case ".yaml":
|
|
171
|
+
case ".yml":
|
|
172
|
+
return true;
|
|
173
|
+
default:
|
|
174
|
+
return false;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
export const getIcon = (name: string, mediaType?: string): { icon: string, color?: string } => {
|
|
179
|
+
var ext = name.substring(name.lastIndexOf('.') , name.length) || name;
|
|
180
|
+
|
|
181
|
+
if (ext === "") return { icon: "file" };
|
|
182
|
+
|
|
183
|
+
if (isAudio(ext)) {
|
|
184
|
+
return { icon: "file", color: "indigo" };
|
|
185
|
+
} else if (isImage(ext)) {
|
|
186
|
+
return { icon: "file-image", color: "cyan" };
|
|
187
|
+
} else if (isVideo(ext)) {
|
|
188
|
+
return { icon: "file-image", color: "pink" };
|
|
189
|
+
} else if (isMarkup(ext)) {
|
|
190
|
+
return { icon: "file-xml", color: "purple" };
|
|
191
|
+
} else if (isText(ext)) {
|
|
192
|
+
return { icon: "file-document" };
|
|
193
|
+
} else{
|
|
194
|
+
switch (ext) {
|
|
195
|
+
case ".7z":
|
|
196
|
+
case ".zip":
|
|
197
|
+
return { icon: "file-compressed", color: "orange"};
|
|
198
|
+
case ".doc":
|
|
199
|
+
case ".docm":
|
|
200
|
+
case ".docx":
|
|
201
|
+
case ".dotm":
|
|
202
|
+
case ".dotx":
|
|
203
|
+
return { icon: "file-word", color: "native"};
|
|
204
|
+
case ".eml":
|
|
205
|
+
case ".msg":
|
|
206
|
+
return { icon: "email", color: ""};
|
|
207
|
+
case ".xls":
|
|
208
|
+
case ".xlsm":
|
|
209
|
+
case ".xlsx":
|
|
210
|
+
case ".xltx":
|
|
211
|
+
return { icon: "file-excel", color: "native"};
|
|
212
|
+
case ".pdf":
|
|
213
|
+
return { icon: "file-pdf", color: "native"};
|
|
214
|
+
case ".ppt":
|
|
215
|
+
case ".pptm":
|
|
216
|
+
case ".pptx":
|
|
217
|
+
case ".potx":
|
|
218
|
+
return { icon: "file-powerpoint", color: "native"};
|
|
219
|
+
case ".pages":
|
|
220
|
+
return { icon: "file", color: "orange"};
|
|
221
|
+
case ".numbers":
|
|
222
|
+
return { icon: "file", color: "green"};
|
|
223
|
+
case ".keynote":
|
|
224
|
+
return { icon: "file", color: "blue"};
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
// fallback
|
|
229
|
+
return { icon: "file" };
|
|
230
|
+
}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Creates a new regular scroll listener
|
|
3
|
+
*
|
|
4
|
+
* @param {Element} observeElement
|
|
5
|
+
* @param {Function} whenNext
|
|
6
|
+
* @returns IntersectionObserver
|
|
7
|
+
*/
|
|
8
|
+
export function createScroller(observeElement, whenNext) {
|
|
9
|
+
console.log("creating regular scroller");
|
|
10
|
+
var parent = getScrollParent(observeElement);
|
|
11
|
+
|
|
12
|
+
whenNext ??= () => Promise.reject(new Error("No scroller handler function defined")); // default
|
|
13
|
+
|
|
14
|
+
const nextObserver = new IntersectionObserver((entries, observer) => {
|
|
15
|
+
entries.forEach(function (entry) {
|
|
16
|
+
if (entry.isIntersecting) {
|
|
17
|
+
whenNext();
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
}, { root: parent, threshold: 0 });
|
|
21
|
+
|
|
22
|
+
nextObserver.observe(observeElement);
|
|
23
|
+
|
|
24
|
+
return nextObserver;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Creates a new reverse scroll listener
|
|
29
|
+
*
|
|
30
|
+
* @param {Element} observeElement
|
|
31
|
+
* @param {Function} whenNext
|
|
32
|
+
* @returns IntersectionObserver
|
|
33
|
+
*/
|
|
34
|
+
export function createReverseScroller(observeElement, whenNext) {
|
|
35
|
+
// inverted infinite scroll (e.g. for messages)
|
|
36
|
+
let prevSleep = false;
|
|
37
|
+
|
|
38
|
+
//console.log("creating reverse scroller");
|
|
39
|
+
var parent = getScrollParent(observeElement);
|
|
40
|
+
|
|
41
|
+
// Disable scroll anchoring https://developer.mozilla.org/en-US/docs/Web/CSS/overflow-anchor/Guide_to_scroll_anchoring
|
|
42
|
+
parent.style.overflowAnchor = "none";
|
|
43
|
+
|
|
44
|
+
whenNext ??= () => Promise.reject(new Error("No reverse scroller handler function defined")); // default
|
|
45
|
+
|
|
46
|
+
const prevObserver = new IntersectionObserver((entries, observer) => {
|
|
47
|
+
entries.forEach(function (entry) {
|
|
48
|
+
if (entry.isIntersecting && !prevSleep) {
|
|
49
|
+
prevSleep = true;
|
|
50
|
+
|
|
51
|
+
// find first child (that is regularly positioned)
|
|
52
|
+
var nextPositionedChild = getNextPositionedChild(entry.target);
|
|
53
|
+
|
|
54
|
+
var prevScrollHeight = parent.scrollHeight;
|
|
55
|
+
var childOffsetBefore = nextPositionedChild.offsetTop;
|
|
56
|
+
|
|
57
|
+
//console.log("intersecting", childOffsetBefore);
|
|
58
|
+
|
|
59
|
+
let afterNext = () => {
|
|
60
|
+
queueMicrotask(() => { // Place last in microtask queue
|
|
61
|
+
// scroll parent so that first child remains in the same position as before
|
|
62
|
+
// NOTE: when this is called via observer we need to requestAnimationFrame, otherwise scrolling happens to fast (before the DOM has been updated)
|
|
63
|
+
if (prevScrollHeight !== parent.scrollHeight) {
|
|
64
|
+
// layout already rendered
|
|
65
|
+
let diff = nextPositionedChild.offsetTop - childOffsetBefore;
|
|
66
|
+
//console.log("infinite scroll updated instantly", diff);
|
|
67
|
+
parent.scrollTop += diff;
|
|
68
|
+
requestAnimationFrame(() => prevSleep = false);
|
|
69
|
+
} else {
|
|
70
|
+
queueMicrotask(() => {
|
|
71
|
+
if (prevScrollHeight !== parent.scrollHeight) {
|
|
72
|
+
// layout rendered after
|
|
73
|
+
let diff = nextPositionedChild.offsetTop - childOffsetBefore;
|
|
74
|
+
//console.log("infinite scroll updated by microtask", diff);
|
|
75
|
+
parent.scrollTop += diff;
|
|
76
|
+
requestAnimationFrame(() => prevSleep = false);
|
|
77
|
+
} else {
|
|
78
|
+
// layout not rendered yet
|
|
79
|
+
requestAnimationFrame(() => {
|
|
80
|
+
let diff = nextPositionedChild.offsetTop - childOffsetBefore;
|
|
81
|
+
//console.log("infinite scroll updated by animationframe", diff);
|
|
82
|
+
parent.scrollTop += diff;
|
|
83
|
+
requestAnimationFrame(() => prevSleep = false);
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
let whenNextResult = whenNext();
|
|
92
|
+
|
|
93
|
+
if (whenNextResult) {
|
|
94
|
+
whenNextResult.then(afterNext);
|
|
95
|
+
} else {
|
|
96
|
+
afterNext();
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
})
|
|
100
|
+
}, { root: parent, threshold: 0, rootMargin: "500px 0px 0px 0px" });
|
|
101
|
+
|
|
102
|
+
prevObserver.observe(observeElement);
|
|
103
|
+
|
|
104
|
+
return prevObserver;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
*
|
|
109
|
+
* @param {Element} el
|
|
110
|
+
* @returns Element
|
|
111
|
+
*/
|
|
112
|
+
export function getNextPositionedChild(el) {
|
|
113
|
+
while(el = el?.nextElementSibling) {
|
|
114
|
+
if(/absolute|sticky|fixed/.test(getComputedStyle(el).position) === false) {
|
|
115
|
+
return el;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// get the closest ancestor element that is scrollable (adapted from https://stackoverflow.com/a/42543908/891843)
|
|
121
|
+
/**
|
|
122
|
+
*
|
|
123
|
+
* @param {Element} element
|
|
124
|
+
* @returns Element
|
|
125
|
+
*/
|
|
126
|
+
export function getScrollParent(element) {
|
|
127
|
+
var includeHidden = false;
|
|
128
|
+
|
|
129
|
+
if (element) {
|
|
130
|
+
var style = getComputedStyle(element);
|
|
131
|
+
var excludeStaticParent = style.position === "absolute";
|
|
132
|
+
var overflowRegex = includeHidden ? /(auto|scroll|overlay|hidden)/ : /(auto|overlay|scroll)/;
|
|
133
|
+
|
|
134
|
+
if (style.position === "fixed") {
|
|
135
|
+
return document.scrollingElement;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
for (var parent = element; (parent = parent.parentElement);) {
|
|
139
|
+
style = getComputedStyle(parent);
|
|
140
|
+
|
|
141
|
+
if (excludeStaticParent && style.position === "static") {
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
if (overflowRegex.test(style.overflow + style.overflowY + style.overflowX)) {
|
|
145
|
+
return parent;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
return document.scrollingElement;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
*
|
|
155
|
+
* @param {Element} ref
|
|
156
|
+
* @param {boolean} smooth
|
|
157
|
+
*/
|
|
158
|
+
export function scrollToBottom(ref, smooth) {
|
|
159
|
+
var parent = getScrollParent(ref);
|
|
160
|
+
//console.log("scrolling #messages", origin, el.scrollHeight, el);
|
|
161
|
+
|
|
162
|
+
if (parent && parent.scrollTop + parent.clientHeight !== parent.scrollHeight) {
|
|
163
|
+
if (smooth) {
|
|
164
|
+
parent.scrollTo({
|
|
165
|
+
top: parent.scrollHeight,
|
|
166
|
+
left: 0,
|
|
167
|
+
behavior: 'smooth'
|
|
168
|
+
});
|
|
169
|
+
} else {
|
|
170
|
+
parent.scrollTop = parent.scrollHeight;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
}
|
|
175
|
+
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Finds the nearest scrollable area. Defaults to document.scrollingElement.
|
|
3
|
+
*
|
|
4
|
+
* @param {Element?} element - Reference element in the scrollable area
|
|
5
|
+
* @param {boolean} [includeHidden=false] - Treat elements with `overflow: hidden` as scrollable areas.
|
|
6
|
+
* @returns Element
|
|
7
|
+
*/
|
|
8
|
+
export function getScrollParent(element, includeHidden) {
|
|
9
|
+
if (element) {
|
|
10
|
+
var style = getComputedStyle(element);
|
|
11
|
+
var excludeStaticParent = style.position === "absolute";
|
|
12
|
+
var overflowRegex = includeHidden ? /(auto|scroll|overlay|hidden)/ : /(auto|overlay|scroll)/;
|
|
13
|
+
|
|
14
|
+
if (style.position === "fixed") {
|
|
15
|
+
return document.scrollingElement;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
for (var parent = element; (parent = parent.parentElement);) {
|
|
19
|
+
style = getComputedStyle(parent);
|
|
20
|
+
|
|
21
|
+
if (excludeStaticParent && style.position === "static") {
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
if (overflowRegex.test(style.overflow + style.overflowY + style.overflowX)) {
|
|
25
|
+
return parent;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return document.scrollingElement;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Checks if a parent scroll container is scrolled to bottom
|
|
35
|
+
* @param {Element?} element
|
|
36
|
+
* @param {number} [bottomThreshold=32] - Nearby limit for the bottom. Needs to be at least 1 to catch float calculation errors.
|
|
37
|
+
* @returns boolean
|
|
38
|
+
*/
|
|
39
|
+
export function isParentAtBottom(element, bottomThreshold) {
|
|
40
|
+
if (element) {
|
|
41
|
+
bottomThreshold ??= 32; // Minimum 1 to catch float errors
|
|
42
|
+
|
|
43
|
+
let area = getScrollParent(element);
|
|
44
|
+
//console.log("isParentAtBottom", area.scrollTop, area.clientHeight, area.scrollHeight, Math.abs((area.scrollTop + area.clientHeight) - area.scrollHeight) <= bottomThreshold)
|
|
45
|
+
// We need to account for scrollTop being a float
|
|
46
|
+
return Math.abs((area.scrollTop + area.clientHeight) - area.scrollHeight) <= bottomThreshold;
|
|
47
|
+
}
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Scrolls a parent scroll container to the bottom using a reference element in the scrollable area.
|
|
53
|
+
*
|
|
54
|
+
* @param {Element?} element - Element in the scroll area
|
|
55
|
+
* @param {boolean} [smooth] - Use smooth scrolling instead of instant scrolling
|
|
56
|
+
*/
|
|
57
|
+
export function scrollParentToBottom(element, smooth) {
|
|
58
|
+
if (element) {
|
|
59
|
+
let area = getScrollParent(element);
|
|
60
|
+
//console.log("scrolling to bottom", area.scrollHeight);
|
|
61
|
+
|
|
62
|
+
// Don't bother if the scroll already is correct
|
|
63
|
+
if (area.scrollTop + area.clientHeight !== area.scrollHeight) {
|
|
64
|
+
if (smooth) {
|
|
65
|
+
area.scrollTo({
|
|
66
|
+
top: area.scrollHeight,
|
|
67
|
+
left: 0,
|
|
68
|
+
behavior: 'smooth'
|
|
69
|
+
});
|
|
70
|
+
} else {
|
|
71
|
+
area.scrollTop = area.scrollHeight;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
|
|
2
|
+
var themePrefix = "wy";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Sets the prefix for CSS classes on the HTML element for usage in javascript.
|
|
6
|
+
* @param {string} prefix
|
|
7
|
+
*/
|
|
8
|
+
export function setPrefix(prefix:string) {
|
|
9
|
+
if (typeof prefix === "string") {
|
|
10
|
+
themePrefix = prefix;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Prefixes one or more classnames (with or without dot) using the themePrefix
|
|
17
|
+
* @param {...string} strs
|
|
18
|
+
* @returns string[]
|
|
19
|
+
*/
|
|
20
|
+
export function prefixes(...strs:string[]) {
|
|
21
|
+
const _prefix = themePrefix || '';
|
|
22
|
+
if (_prefix) {
|
|
23
|
+
strs = strs.map((str) => {
|
|
24
|
+
str ??= '';
|
|
25
|
+
if (str[0] === '.') {
|
|
26
|
+
return `.${_prefix}-${str.substring(1)}`;
|
|
27
|
+
} else {
|
|
28
|
+
return `${_prefix}-${str}`;
|
|
29
|
+
}
|
|
30
|
+
})
|
|
31
|
+
}
|
|
32
|
+
return strs;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Prefixes one classname (with or without dot) using the themePrefix
|
|
37
|
+
* @param {string} str
|
|
38
|
+
* @returns string
|
|
39
|
+
*/
|
|
40
|
+
export function prefix(str:string) {
|
|
41
|
+
return prefixes(...(str.split(" "))).join(" ");
|
|
42
|
+
}
|