@antscorp/antsomi-ui 1.3.7-beta.7 → 1.3.7-beta.70
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 +78 -78
- package/es/__mocks__/1000_city.json +802 -802
- package/es/__mocks__/sql-query.json +56 -56
- package/es/assets/css/main.scss +8 -8
- package/es/assets/images/feedback.svg +3 -3
- package/es/assets/svg/mobile-frame.svg +3 -3
- package/es/assets/svg/warning-icon.svg +5 -5
- package/es/components/atoms/Alert/Alert.js +28 -28
- package/es/components/atoms/ContentEditable/styled.js +16 -16
- package/es/components/atoms/DividerPure/styled.js +35 -35
- package/es/components/atoms/Eyedropper/styled.js +39 -39
- package/es/components/atoms/Icon/index.js +19 -19
- package/es/components/atoms/Iframe/Iframe.js +18 -18
- package/es/components/atoms/Input/Input.js +3 -1
- package/es/components/atoms/Input/styled.js +104 -104
- package/es/components/atoms/InputDynamic/InputDynamic.js +3 -3
- package/es/components/atoms/InputDynamic/styled.js +284 -284
- package/es/components/atoms/MobileBrandingBar/styled.js +21 -21
- package/es/components/atoms/MobileFrame/styled.js +30 -30
- package/es/components/atoms/MobileFrameV2/styled.js +42 -42
- package/es/components/atoms/MobileFrameV3/styled.js +31 -31
- package/es/components/atoms/NotificationStatus/styled.js +10 -10
- package/es/components/atoms/PreviewTabs/styled.js +69 -69
- package/es/components/atoms/Radio/index.js +16 -16
- package/es/components/atoms/ReactIframe/ReactIframe.js +5 -5
- package/es/components/atoms/ReactIframe/styled.js +9 -9
- package/es/components/atoms/RequiredLabel/styled.js +3 -3
- package/es/components/atoms/ScrollBox/index.js +5 -5
- package/es/components/atoms/Scrollbars/styled.js +21 -21
- package/es/components/atoms/SelectAssociatedTag/styled.js +51 -51
- package/es/components/atoms/SlideBar/styled.js +194 -194
- package/es/components/atoms/Slider/styled.js +31 -31
- package/es/components/atoms/Space/Space.js +4 -4
- package/es/components/atoms/Spin/styled.js +11 -11
- package/es/components/atoms/Steps/styled.js +244 -244
- package/es/components/atoms/Switch/styled.js +56 -56
- package/es/components/atoms/Tag/Tag.js +10 -10
- package/es/components/atoms/Text/styled.js +34 -34
- package/es/components/icons/DomainManagementIcon.js +1 -1
- package/es/components/icons/LazyIcon/LazyIcon.d.ts +2 -0
- package/es/components/icons/LazyIcon/LazyIcon.js +2 -0
- package/es/components/icons/LoadingIcon.js +33 -33
- package/es/components/icons/QRCodeManagementIcon.d.ts +3 -0
- package/es/components/icons/QRCodeManagementIcon.js +7 -0
- package/es/components/icons/QRSetDashboardIcon.d.ts +3 -0
- package/es/components/icons/QRSetDashboardIcon.js +7 -0
- package/es/components/icons/document/styled.js +43 -43
- package/es/components/icons/index.d.ts +2 -0
- package/es/components/icons/index.js +2 -0
- package/es/components/index.scss +2 -2
- package/es/components/molecules/AccessDenied/styled.js +28 -28
- package/es/components/molecules/AccountSelection/styled.js +110 -110
- package/es/components/molecules/AddDynamicContent/AddDynamicContent.js +28 -2
- package/es/components/molecules/AddDynamicContent/components/DisplayFormat/DisplayFormat.d.ts +1 -0
- package/es/components/molecules/AddDynamicContent/constants.d.ts +2 -0
- package/es/components/molecules/AddDynamicContent/constants.js +2 -0
- package/es/components/molecules/AddDynamicContent/styled.js +23 -23
- package/es/components/molecules/AlignSetting/styled.js +4 -4
- package/es/components/molecules/ApplyPopupContent/styled.js +32 -32
- package/es/components/molecules/CalendarSelection/components/AutoUpdateTo/styled.js +8 -8
- package/es/components/molecules/CalendarSelection/components/CustomPicker/styled.js +79 -79
- package/es/components/molecules/CalendarSelection/components/Footer/styled.js +4 -4
- package/es/components/molecules/CalendarSelection/components/RangePicker/styled.js +21 -21
- package/es/components/molecules/CalendarSelection/components/RangeSelectOptions/components/Option/Option.js +26 -26
- package/es/components/molecules/CalendarSelection/components/RangeSelectOptions/styled.js +30 -30
- package/es/components/molecules/CalendarSelection/components/TimeRangeDisplay/styled.js +26 -26
- package/es/components/molecules/CalendarSelection/styled.js +8 -8
- package/es/components/molecules/CaptureScreen/components/CommentBox/styled.js +119 -119
- package/es/components/molecules/CaptureScreen/components/Cursor/styled.js +67 -67
- package/es/components/molecules/CaptureScreen/styled.js +240 -240
- package/es/components/molecules/ChartTab/components/styled.js +24 -24
- package/es/components/molecules/ChartTab/styled.js +20 -20
- package/es/components/molecules/ChatBox/AntsomiAI.js +8 -8
- package/es/components/molecules/ChatBox/ChatBoxInsight/QuestionItem.js +9 -9
- package/es/components/molecules/ChatBox/ChatBoxInsight/styled.js +365 -365
- package/es/components/molecules/ChatBox/styled.js +324 -324
- package/es/components/molecules/CodeStructure/styled.js +5 -5
- package/es/components/molecules/ColorPicker/ChromePicker/styled.js +10 -10
- package/es/components/molecules/ColorPicker/CustomPicker/styled.js +89 -89
- package/es/components/molecules/ColorPicker/SketchPicker/styled.js +5 -5
- package/es/components/molecules/ColorPicker/index.d.ts +2 -0
- package/es/components/molecules/ColorPicker/index.js +8 -3
- package/es/components/molecules/ColorPicker/styled.js +7 -7
- package/es/components/molecules/ColorSetting/styled.js +39 -39
- package/es/components/molecules/DatePicker/components/AdvancedPicker/styled.js +110 -110
- package/es/components/molecules/DatePickerV2/styled.js +6 -6
- package/es/components/molecules/DisplayFormat/styled.js +12 -12
- package/es/components/molecules/DrawerDetail/components/ToggleDrawerSizeButton.js +24 -24
- package/es/components/molecules/DrawerDetail/styled.js +109 -109
- package/es/components/molecules/Dropdown/style.scss +11 -11
- package/es/components/molecules/Dropdown/styled.js +28 -28
- package/es/components/molecules/EdgeSetting/styled.js +10 -10
- package/es/components/molecules/EditableName/styled.js +70 -70
- package/es/components/molecules/EditingList/styled.js +29 -29
- package/es/components/molecules/EditingListV2/components/List/List.js +9 -9
- package/es/components/molecules/EditorTab/styled.js +156 -156
- package/es/components/molecules/EmojiCollections/styled.js +22 -22
- package/es/components/molecules/EmojiPopover/EmojiPopover.d.ts +1 -0
- package/es/components/molecules/EmojiPopover/EmojiPopover.js +2 -2
- package/es/components/molecules/EmojiPopover/styled.d.ts +2 -2
- package/es/components/molecules/EmojiPopover/styled.js +5 -5
- package/es/components/molecules/EmptyData/styled.js +53 -53
- package/es/components/molecules/EyedropperButton/styled.js +19 -19
- package/es/components/molecules/FontSizeInput/index.scss +15 -15
- package/es/components/molecules/FontSizeInput/styled.js +31 -31
- package/es/components/molecules/GradientSetting/styled.js +57 -57
- package/es/components/molecules/HeaderV2/HeaderV2.d.ts +1 -1
- package/es/components/molecules/HeaderV2/styled.js +70 -70
- package/es/components/molecules/IconSelection/styled.js +69 -69
- package/es/components/molecules/ImageEditor/components/ModalShortcut.js +21 -21
- package/es/components/molecules/ImageEditor/styled.js +5 -5
- package/es/components/molecules/ImagePreview/styled.js +3 -3
- package/es/components/molecules/InputNumberWithUnit/styled.js +14 -14
- package/es/components/molecules/InputSearch/styled.js +41 -41
- package/es/components/molecules/InputSelectAttribute/styled.js +22 -22
- package/es/components/molecules/ItemNotFound/styled.js +26 -26
- package/es/components/molecules/MatchAnySelect/components/ExtendValuePopup.js +8 -8
- package/es/components/molecules/MatchAnySelect/styled.js +247 -247
- package/es/components/molecules/Modal/Modal.js +7 -1
- package/es/components/molecules/Modal/styled.js +63 -63
- package/es/components/molecules/ModalSelect/styled.js +152 -152
- package/es/components/molecules/ModalV2/styled.js +27 -27
- package/es/components/molecules/PopupDraggable/styled.js +57 -57
- package/es/components/molecules/PreviewModal/styled.js +26 -26
- package/es/components/molecules/ProcessLoading/styled.js +2 -2
- package/es/components/molecules/QuillEditor/CustomToolbar.js +3165 -3165
- package/es/components/molecules/QuillEditor/EditorToolbar.js +7 -7
- package/es/components/molecules/QuillEditor/styled.js +25 -25
- package/es/components/molecules/RadioGroup/styled.js +9 -9
- package/es/components/molecules/RequestAccess/styled.js +38 -38
- package/es/components/molecules/ResizeGrid/components/Cell/styled.js +77 -77
- package/es/components/molecules/ResizeGrid/styled.js +50 -50
- package/es/components/molecules/RichMenu/RichMenuBlock/RichMenuCell/styled.js +118 -118
- package/es/components/molecules/RichMenu/RichMenuBlock/styled.js +13 -13
- package/es/components/molecules/RichMenu/RichMenuChatBar/TypingChat/styled.js +40 -40
- package/es/components/molecules/RichMenu/RichMenuChatBar/styled.js +27 -27
- package/es/components/molecules/RichMenu/RichMenuMobileView/RichMenuMobileView.js +2 -2
- package/es/components/molecules/RichMenu/RichMenuMobileView/styled.js +38 -38
- package/es/components/molecules/SearchPopover/SearchPopover.js +2 -2
- package/es/components/molecules/SearchPopover/components/PopoverSelect/styled.js +36 -36
- package/es/components/molecules/SearchPopover/components/PopoverSelect/styles.scss +7 -7
- package/es/components/molecules/SearchPopover/styled.d.ts +12 -1
- package/es/components/molecules/SearchPopover/styled.js +32 -33
- package/es/components/molecules/SearchPopover/types.d.ts +4 -3
- package/es/components/molecules/Select/Select.js +3 -3
- package/es/components/molecules/Select/styled.d.ts +3 -1
- package/es/components/molecules/Select/styled.js +76 -32
- package/es/components/molecules/SelectAccount/styled.js +147 -147
- package/es/components/molecules/SelectEventAttribute/styled.js +8 -8
- package/es/components/molecules/SelectMulti/styled.js +62 -62
- package/es/components/molecules/SelectV2/styled.js +124 -124
- package/es/components/molecules/SettingWrapper/styled.js +12 -12
- package/es/components/molecules/ShareAccess/ShareAccess.d.ts +2 -1
- package/es/components/molecules/ShareAccess/ShareAccess.js +12 -9
- package/es/components/molecules/ShareAccess/components/GeneralAccess/styled.js +56 -56
- package/es/components/molecules/ShareAccess/components/LayoutContent/LayoutContent.js +5 -5
- package/es/components/molecules/ShareAccess/components/LayoutContent/styled.js +5 -5
- package/es/components/molecules/ShareAccess/components/ModalTransferOwnerShip/styled.js +15 -15
- package/es/components/molecules/ShareAccess/components/PeopleAccess/PeopleAccess.js +2 -2
- package/es/components/molecules/ShareAccess/components/PeopleAccess/styled.js +63 -63
- package/es/components/molecules/ShareAccess/components/SearchUser/styled.js +31 -31
- package/es/components/molecules/ShareAccess/hooks/useShareAccess.d.ts +2 -1
- package/es/components/molecules/ShareAccess/index.d.ts +1 -0
- package/es/components/molecules/ShareAccess/reducer.d.ts +1 -1
- package/es/components/molecules/ShareAccess/reducer.js +7 -4
- package/es/components/molecules/ShareAccess/types.d.ts +22 -0
- package/es/components/molecules/ShareAccess/utils.d.ts +3 -1
- package/es/components/molecules/ShareAccess/utils.js +35 -2
- package/es/components/molecules/SliderWithInputNumber/styled.js +2 -2
- package/es/components/molecules/Tabs/Tabs.js +11 -11
- package/es/components/molecules/TagifyInput/TagifyInput.js +98 -77
- package/es/components/molecules/TagifyInput/styled.js +37 -37
- package/es/components/molecules/TagifyInput/types.d.ts +14 -8
- package/es/components/molecules/TagifyInput/utils.d.ts +6 -1
- package/es/components/molecules/TagifyInput/utils.js +32 -13
- package/es/components/molecules/TagifyInput/utils.style.js +208 -208
- package/es/components/molecules/TemplateSaveAs/components/Category/Category.js +5 -5
- package/es/components/molecules/TemplateSaveAs/components/ImageSlider/styled.js +276 -276
- package/es/components/molecules/TemplateSaveAs/styled.js +134 -134
- package/es/components/molecules/ThumbnailCard/styled.js +92 -92
- package/es/components/molecules/Tree/styled.js +38 -38
- package/es/components/molecules/UnsubscribePreferences/styled.js +7 -7
- package/es/components/molecules/UnsubscribePreview/components/styled.js +53 -53
- package/es/components/molecules/UnsubscribePreview/styled.js +48 -48
- package/es/components/molecules/UploadImage/styled.js +114 -114
- package/es/components/molecules/VirtualizedMenu/VirtualizedMenu.d.ts +1 -0
- package/es/components/molecules/VirtualizedMenu/components/Item/Item.js +3 -7
- package/es/components/molecules/VirtualizedMenu/components/MenuInline/MenuInline.d.ts +10 -10
- package/es/components/molecules/VirtualizedMenu/components/MenuInline/MenuInline.js +46 -327
- package/es/components/molecules/VirtualizedMenu/components/MenuInline/hooks/index.d.ts +9 -0
- package/es/components/molecules/VirtualizedMenu/components/MenuInline/hooks/index.js +5 -0
- package/es/components/molecules/VirtualizedMenu/components/MenuInline/hooks/useFocusManagement.d.ts +23 -0
- package/es/components/molecules/VirtualizedMenu/components/MenuInline/hooks/useFocusManagement.js +81 -0
- package/es/components/molecules/VirtualizedMenu/components/MenuInline/hooks/useItemInteraction.d.ts +24 -0
- package/es/components/molecules/VirtualizedMenu/components/MenuInline/hooks/useItemInteraction.js +32 -0
- package/es/components/molecules/VirtualizedMenu/components/MenuInline/hooks/useKeyboardNavigation.d.ts +26 -0
- package/es/components/molecules/VirtualizedMenu/components/MenuInline/hooks/useKeyboardNavigation.js +93 -0
- package/es/components/molecules/VirtualizedMenu/components/MenuInline/hooks/useTreeState.d.ts +24 -0
- package/es/components/molecules/VirtualizedMenu/components/MenuInline/hooks/useTreeState.js +94 -0
- package/es/components/molecules/VirtualizedMenu/components/MenuInline/hooks/useVisibleItems.d.ts +7 -0
- package/es/components/molecules/VirtualizedMenu/components/MenuInline/hooks/useVisibleItems.js +132 -0
- package/es/components/molecules/VirtualizedMenu/styled.js +103 -92
- package/es/components/molecules/VirtualizedMenu/types.d.ts +1 -0
- package/es/components/molecules/VirtualizedMenu/utils.d.ts +1 -0
- package/es/components/molecules/VirtualizedMenu/utils.js +1 -0
- package/es/components/molecules/index.d.ts +1 -0
- package/es/components/molecules/index.scss +1 -1
- package/es/components/organism/AccountProfile/components/AccountSetting/components/EditableInput/styles.js +98 -98
- package/es/components/organism/AccountProfile/components/AccountSetting/components/LanguageSelector/styles.js +18 -18
- package/es/components/organism/AccountProfile/components/AccountSetting/styled.js +543 -543
- package/es/components/organism/AccountProfile/components/AccountSetting/styles.scss +39 -39
- package/es/components/organism/AccountSharing/AccountSharing.d.ts +1 -0
- package/es/components/organism/AccountSharing/AccountSharing.js +17 -33
- package/es/components/organism/AccountSharing/styled.js +346 -346
- package/es/components/organism/ActivityTimeline/ActivityTimeline.js +3 -3
- package/es/components/organism/ActivityTimeline/__mocks__/event_tracking.json +1290 -1290
- package/es/components/organism/ActivityTimeline/__mocks__/timeline.json +1896 -1896
- package/es/components/organism/ActivityTimeline/components/ActionHistory/styled.js +28 -28
- package/es/components/organism/ActivityTimeline/components/CardMember/styled.js +60 -60
- package/es/components/organism/ActivityTimeline/components/ItemGroupEvent/styled.js +4 -4
- package/es/components/organism/ActivityTimeline/components/List/styled.js +77 -77
- package/es/components/organism/ActivityTimeline/components/ListItem/styled.js +37 -37
- package/es/components/organism/ActivityTimeline/components/ProductCard/styled.js +92 -92
- package/es/components/organism/ActivityTimeline/components/Redeem/styled.js +7 -7
- package/es/components/organism/ActivityTimeline/components/Slide/styled.js +20 -20
- package/es/components/organism/ActivityTimeline/components/TimeLineTitle/styled.js +7 -7
- package/es/components/organism/ActivityTimeline/components/TimelineSection/styled.js +69 -69
- package/es/components/organism/ActivityTimeline/constants.d.ts +9 -9
- package/es/components/organism/ActivityTimeline/constants.js +3 -3
- package/es/components/organism/ActivityTimeline/index.d.ts +530 -1
- package/es/components/organism/ActivityTimeline/index.js +9 -1
- package/es/components/organism/ActivityTimeline/styled.js +43 -43
- package/es/components/organism/ActivityTimeline/utils.js +186 -15
- package/es/components/organism/AlgorithmsSetting/styled.js +35 -35
- package/es/components/organism/BasicLogin/components/ChooseMethod/styled.js +19 -19
- package/es/components/organism/BasicLogin/components/LoginWithEmail/styled.js +3 -3
- package/es/components/organism/BasicLogin/components/LoginWithGG/styled.js +3 -3
- package/es/components/organism/BasicLogin/components/SignIn/styled.js +8 -8
- package/es/components/organism/BasicLogin/components/WidgetLayout/styled.js +18 -18
- package/es/components/organism/BasicLogin/styled.js +107 -107
- package/es/components/organism/ContentSources/styled.js +50 -50
- package/es/components/organism/DataTable/components/AddButton/index.js +8 -8
- package/es/components/organism/DataTable/components/ModifyColumn/styled.js +18 -18
- package/es/components/organism/DataTable/components/Pagination/styled.js +26 -26
- package/es/components/organism/DataTable/components/Table/styled.js +135 -135
- package/es/components/organism/DataTable/components/Toolbar/SearchPopover.js +17 -17
- package/es/components/organism/DataTable/components/Toolbar/styled.js +70 -70
- package/es/components/organism/DataTable/styled/index.js +84 -84
- package/es/components/organism/Filter/components/FilterCondition/styled.js +34 -34
- package/es/components/organism/Filter/styled.js +109 -109
- package/es/components/organism/FilterSetting/components/common/InputArray/styled.js +5 -5
- package/es/components/organism/FilterSetting/components/common/InputOrSelect/index.js +63 -63
- package/es/components/organism/FilterSetting/components/common/InputSelectMulti/ColumnSuggestion/index.js +31 -31
- package/es/components/organism/FilterSetting/components/common/InputSelectMulti/Tree/index.js +22 -22
- package/es/components/organism/FilterSetting/components/common/InputSelectMulti/index.js +55 -55
- package/es/components/organism/FilterSetting/styled.js +19 -19
- package/es/components/organism/GenerativeInsights/styled.js +55 -55
- package/es/components/organism/Help/styled.js +267 -267
- package/es/components/organism/LeftMenu/LeftMenu.js +6 -6
- package/es/components/organism/LeftMenu/components/HomeMenu/styled.js +39 -39
- package/es/components/organism/LeftMenu/components/common/ChildMenu/components/MenuItemImage/styled.js +16 -16
- package/es/components/organism/LeftMenu/components/common/ChildMenu/styled.js +156 -156
- package/es/components/organism/LeftMenu/hooks/usePermission.js +1 -1
- package/es/components/organism/LeftMenu/styled.js +216 -214
- package/es/components/organism/LeftMenu/types/index.d.ts +7 -0
- package/es/components/organism/LeftMenu/utils/index.js +1 -1
- package/es/components/organism/Login/Login.js +19 -36
- package/es/components/organism/Login/components/ChooseMethod/styled.js +19 -19
- package/es/components/organism/Login/components/ForgotPassword/styled.js +8 -8
- package/es/components/organism/Login/components/LoginSelectPortal/Item/styled.js +31 -31
- package/es/components/organism/Login/components/LoginSelectPortal/styled.js +3 -3
- package/es/components/organism/Login/components/LoginWithEmail/styled.js +3 -3
- package/es/components/organism/Login/components/LoginWithGG/styled.js +3 -3
- package/es/components/organism/Login/components/SetupGGAuthenticator/styled.js +7 -7
- package/es/components/organism/Login/components/SignIn/SignIn.js +2 -2
- package/es/components/organism/Login/components/SignIn/styled.js +8 -8
- package/es/components/organism/Login/components/VerifyAccount/styled.js +13 -13
- package/es/components/organism/Login/components/WidgetLayout/styled.js +18 -18
- package/es/components/organism/Login/styled.js +115 -115
- package/es/components/organism/Login/types/index.d.ts +2 -0
- package/es/components/organism/Menu/styled.js +6 -6
- package/es/components/organism/ModifyColumnModal/styled.js +132 -132
- package/es/components/organism/Notification/styled.js +155 -155
- package/es/components/organism/PreviewCollections/Messages/SkeletonMessage/styled.js +14 -14
- package/es/components/organism/PreviewCollections/WhatsappMessage/CarouselMessage/styled.js +63 -63
- package/es/components/organism/PreviewCollections/constants.js +50 -50
- package/es/components/organism/PreviewCollections/styled.js +16 -16
- package/es/components/organism/PreviewTemplateModal/components/Banner/styled.js +78 -78
- package/es/components/organism/PreviewTemplateModal/components/Information/styled.js +52 -52
- package/es/components/organism/PreviewTemplateModal/components/SimilarTemplate/styled.js +18 -18
- package/es/components/organism/PreviewTemplateModal/components/ThumbnailSlider/styled.js +77 -77
- package/es/components/organism/PreviewTemplateModal/styled.js +21 -21
- package/es/components/organism/SQLGeneration/components/styled.js +354 -354
- package/es/components/organism/SQLGeneration/index.scss +1 -1
- package/es/components/organism/SQLGeneration/integrations/AceEditor/index.scss +4 -4
- package/es/components/organism/Table/CrossTabTable/components/CustomCell/styled.js +11 -11
- package/es/components/organism/Table/CrossTabTable/styled.js +11 -11
- package/es/components/organism/Table/ExplorePivotTable/components/CustomCell/styled.js +17 -17
- package/es/components/organism/Table/ExplorePivotTable/styled.js +11 -11
- package/es/components/organism/TextEditor/TextEditor.d.ts +9 -2
- package/es/components/organism/TextEditor/TextEditor.js +203 -42
- package/es/components/organism/TextEditor/__mocks__/text-contennt.js +44 -44
- package/es/components/organism/TextEditor/constants.d.ts +9 -0
- package/es/components/organism/TextEditor/constants.js +66 -0
- package/es/components/organism/TextEditor/extensions/BubbleMenu/bubble-menu-plugin.d.ts +6 -128
- package/es/components/organism/TextEditor/extensions/BubbleMenu/bubble-menu-plugin.js +7 -292
- package/es/components/organism/TextEditor/extensions/BubbleMenu/bubble-menu.d.ts +1 -1
- package/es/components/organism/TextEditor/extensions/BubbleMenu/bubble-menu.js +4 -0
- package/es/components/organism/TextEditor/extensions/Link.js +33 -14
- package/es/components/organism/TextEditor/extensions/ListItem.d.ts +10 -0
- package/es/components/organism/TextEditor/extensions/ListItem.js +93 -0
- package/es/components/organism/TextEditor/extensions/SmartTag.d.ts +5 -6
- package/es/components/organism/TextEditor/extensions/SmartTag.js +96 -4
- package/es/components/organism/TextEditor/hooks/useColorSet.js +7 -0
- package/es/components/organism/TextEditor/hooks/useMarkTracking.js +2 -1
- package/es/components/organism/TextEditor/index.d.ts +7 -5
- package/es/components/organism/TextEditor/index.scss +65 -68
- package/es/components/organism/TextEditor/provider.d.ts +1 -0
- package/es/components/organism/TextEditor/provider.js +6 -3
- package/es/components/organism/TextEditor/store.d.ts +11 -4
- package/es/components/organism/TextEditor/store.js +22 -2
- package/es/components/organism/TextEditor/stories/WithOldDynAndLink/froala-legacy-format.settings.json +95 -0
- package/es/components/organism/TextEditor/stories/WithOldDynAndLink/shared.d.ts +111 -0
- package/es/components/organism/TextEditor/stories/WithOldDynAndLink/shared.js +82 -0
- package/es/components/organism/TextEditor/stories/shared.d.ts +64 -0
- package/es/components/organism/TextEditor/stories/shared.js +57 -0
- package/es/components/organism/TextEditor/styled.d.ts +1 -1
- package/es/components/organism/TextEditor/styled.js +54 -53
- package/es/components/organism/TextEditor/types.d.ts +161 -11
- package/es/components/organism/TextEditor/types.js +1 -0
- package/es/components/organism/TextEditor/ui/BubbleMenu/BubbleMenu.d.ts +2 -1
- package/es/components/organism/TextEditor/ui/BubbleMenu/BubbleMenu.js +80 -51
- package/es/components/organism/TextEditor/ui/Button/Button.js +22 -22
- package/es/components/organism/TextEditor/ui/DropdownButton/DropdownButton.js +13 -13
- package/es/components/organism/TextEditor/ui/Emoji/EmojiList.js +1 -1
- package/es/components/organism/TextEditor/ui/Emoji/suggestion.d.ts +1 -1
- package/es/components/organism/TextEditor/ui/Emoji/suggestion.js +2 -2
- package/es/components/organism/TextEditor/ui/FontPopover/FontPopover.js +12 -2
- package/es/components/organism/TextEditor/ui/FontPopover/styled.js +32 -32
- package/es/components/organism/TextEditor/ui/LinkInsertForm/LinkInsertForm.d.ts +16 -0
- package/es/components/organism/TextEditor/ui/LinkInsertForm/LinkInsertForm.js +61 -0
- package/es/components/organism/TextEditor/ui/LinkInsertForm/index.d.ts +2 -0
- package/es/components/organism/TextEditor/ui/LinkInsertForm/index.js +1 -0
- package/es/components/organism/TextEditor/ui/LinkPopover/LinkPopover.d.ts +9 -0
- package/es/components/organism/TextEditor/ui/LinkPopover/LinkPopover.js +126 -0
- package/es/components/organism/TextEditor/ui/LinkPopover/index.d.ts +2 -0
- package/es/components/organism/TextEditor/ui/LinkPopover/index.js +1 -0
- package/es/components/organism/TextEditor/ui/Popover/Popover.js +1 -1
- package/es/components/organism/TextEditor/ui/SplitButtonDropdown/styled.js +54 -54
- package/es/components/organism/TextEditor/ui/TextAlignSelect/TextAlignSelect.js +10 -12
- package/es/components/organism/TextEditor/ui/Toolbar/{Toolbar.d.ts → FormattingToolbar.d.ts} +3 -4
- package/es/components/organism/TextEditor/ui/Toolbar/FormattingToolbar.js +90 -0
- package/es/components/organism/TextEditor/ui/Toolbar/LinkPreviewToolbar.d.ts +10 -0
- package/es/components/organism/TextEditor/ui/Toolbar/LinkPreviewToolbar.js +39 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/EmojiAction.js +4 -3
- package/es/components/organism/TextEditor/ui/Toolbar/actions/FontFamilyAction.d.ts +1 -0
- package/es/components/organism/TextEditor/ui/Toolbar/actions/FontFamilyAction.js +2 -2
- package/es/components/organism/TextEditor/ui/Toolbar/actions/FontSizeAction.js +17 -12
- package/es/components/organism/TextEditor/ui/Toolbar/index.d.ts +2 -1
- package/es/components/organism/TextEditor/ui/Toolbar/index.js +2 -1
- package/es/components/organism/TextEditor/utils/documentState.d.ts +14 -0
- package/es/components/organism/TextEditor/utils/documentState.js +25 -0
- package/es/components/organism/TextEditor/utils/htmlProcessing.js +60 -0
- package/es/components/organism/TextEditor/utils/link.d.ts +10 -1
- package/es/components/organism/TextEditor/utils/link.js +161 -7
- package/es/components/organism/TextEditor/utils/menu.js +2 -1
- package/es/components/organism/TextEditor/utils/selection.js +3 -2
- package/es/components/organism/TextEditor/utils/smartTag.js +2 -1
- package/es/components/organism/TicketEditor/styled.js +860 -860
- package/es/components/organism/TicketEditorV2/styled.js +839 -839
- package/es/components/organism/index.d.ts +1 -1
- package/es/components/organism/index.scss +2 -2
- package/es/components/template/Layout/Layout.js +10 -10
- package/es/components/template/Layout/components/RecommendationWorkspace/components/MenuMapping/components/OldLeftMenu/styled.js +73 -73
- package/es/components/template/Layout/components/RecommendationWorkspace/components/MenuMapping/styled.js +39 -39
- package/es/components/template/Layout/components/RecommendationWorkspace/components/RecommendationImage/styled.js +61 -61
- package/es/components/template/Layout/components/RecommendationWorkspace/styled.js +16 -16
- package/es/components/template/Layout/styled.js +84 -84
- package/es/components/template/TemplateListing/Loadable.d.ts +1 -0
- package/es/components/template/TemplateListing/components/BlankTemplate/styled.js +21 -21
- package/es/components/template/TemplateListing/components/CategoryListing/styled.js +123 -123
- package/es/components/template/TemplateListing/components/Empty/styled.js +20 -20
- package/es/components/template/TemplateListing/stories/demo/styled.js +4 -4
- package/es/components/template/TemplateListing/styled/index.js +40 -40
- package/es/hooks/index.d.ts +1 -1
- package/es/hooks/index.js +1 -1
- package/es/providers/ConfigProvider/ConfigProvider.d.ts +4 -0
- package/es/providers/ConfigProvider/ConfigProvider.js +2 -3
- package/es/providers/ConfigProvider/GlobalStyle.d.ts +2 -2
- package/es/providers/ConfigProvider/GlobalStyle.js +1252 -1249
- package/es/services/MediaTemplateDesign/UploadFile/index.js +4 -4
- package/es/styled/common.js +51 -51
- package/es/tests/styled.js +4 -4
- package/es/utils/common.d.ts +1 -1
- package/es/utils/common.js +3 -3
- package/es/utils/cookie.js +2 -1
- package/es/utils/crossSubdomainCookieOptions.d.ts +14 -0
- package/es/utils/crossSubdomainCookieOptions.js +12 -0
- package/es/utils/variables.js +7 -7
- package/package.json +282 -286
- package/es/components/organism/TextEditor/ui/BubbleToolbar/BubbleToolbar.d.ts +0 -1
- package/es/components/organism/TextEditor/ui/BubbleToolbar/BubbleToolbar.js +0 -1
- package/es/components/organism/TextEditor/ui/BubbleToolbar/index.d.ts +0 -0
- package/es/components/organism/TextEditor/ui/BubbleToolbar/index.js +0 -1
- package/es/components/organism/TextEditor/ui/Toolbar/Toolbar.js +0 -39
|
@@ -2,4 +2,5 @@ import { CUSTOM_LINK_EXTENSION_NAME, ORDERED_LIST_STYLE_TYPE, UNORDERED_LIST_STY
|
|
|
2
2
|
export const isOrderedListStyleType = (value) => typeof value === 'string' && Object.values(ORDERED_LIST_STYLE_TYPE).some(v => v === value);
|
|
3
3
|
export const isUnorderedListStyleType = (value) => typeof value === 'string' && Object.values(UNORDERED_LIST_STYLE_TYPE).some(v => v === value);
|
|
4
4
|
export const isLinkMark = (mark) => mark.type.name === CUSTOM_LINK_EXTENSION_NAME;
|
|
5
|
+
export const isSmartTagNode = (node) => node.type.name === 'smartTag';
|
|
5
6
|
export const isLinkMarkRange = (markRange) => isLinkMark(markRange.mark);
|
|
@@ -1,2 +1,3 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
|
-
|
|
2
|
+
import { BubbleMenuPluginProps } from '@tiptap/extension-bubble-menu';
|
|
3
|
+
export declare const BubbleMenu: import("react").ForwardRefExoticComponent<Pick<Partial<Omit<Pick<Partial<BubbleMenuPluginProps>, "pluginKey"> & Omit<BubbleMenuPluginProps, "pluginKey">, "element">>, "editor"> & Omit<Omit<Pick<Partial<BubbleMenuPluginProps>, "pluginKey"> & Omit<BubbleMenuPluginProps, "pluginKey">, "element">, "editor"> & import("react").HTMLAttributes<HTMLDivElement> & import("react").RefAttributes<HTMLDivElement>>;
|
|
@@ -1,17 +1,32 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { useCurrentEditor } from '@tiptap/react';
|
|
3
|
-
import { forwardRef, useEffect, useRef } from 'react';
|
|
3
|
+
import { forwardRef, useEffect, useLayoutEffect, useRef, useState } from 'react';
|
|
4
4
|
import { createPortal } from 'react-dom';
|
|
5
5
|
import { BubbleMenuPlugin } from '../../extensions/BubbleMenu';
|
|
6
|
-
import { useDeepCompareEffect
|
|
7
|
-
import { useTextEditorStore } from '../../provider';
|
|
8
|
-
import clsx from 'clsx';
|
|
6
|
+
import { useDeepCompareEffect } from '@antscorp/antsomi-ui/es/hooks';
|
|
9
7
|
import { ANTSOMI_COMPONENT_PREFIX_CLS } from '@antscorp/antsomi-ui/es/constants';
|
|
10
|
-
export const BubbleMenu = forwardRef(({ pluginKey = 'bubbleMenu', editor, updateDelay, resizeDelay, shouldShow = null,
|
|
8
|
+
export const BubbleMenu = forwardRef(({ pluginKey = 'bubbleMenu', editor, updateDelay, resizeDelay, shouldShow = null, getReferencedVirtualElement, appendTo, options, children, ...restProps }, ref) => {
|
|
11
9
|
const menuEl = useRef(document.createElement('div'));
|
|
12
|
-
|
|
13
|
-
const setIsShowBubbleMenu = useTextEditorStore(state => state.setIsShowBubbleMenu);
|
|
10
|
+
menuEl.current.classList.add(`${ANTSOMI_COMPONENT_PREFIX_CLS}-text-editor-bubble-menu`);
|
|
14
11
|
const { editor: currentEditor } = useCurrentEditor();
|
|
12
|
+
/**
|
|
13
|
+
* Tracks whether the bubble menu has been shown at least once.
|
|
14
|
+
* Used for lazy mounting optimization - children are only mounted after first show.
|
|
15
|
+
*/
|
|
16
|
+
const [hasShown, setHasShown] = useState(false);
|
|
17
|
+
/**
|
|
18
|
+
* Ref to track hasShown synchronously (since state updates are async).
|
|
19
|
+
*/
|
|
20
|
+
const hasShownRef = useRef(false);
|
|
21
|
+
/**
|
|
22
|
+
* Tracks whether we're in the first show process (to prevent empty flash).
|
|
23
|
+
* After first show completes, this flag is no longer used.
|
|
24
|
+
*/
|
|
25
|
+
const isFirstShowRef = useRef(false);
|
|
26
|
+
/**
|
|
27
|
+
* The editor instance where the bubble menu plugin will be registered.
|
|
28
|
+
*/
|
|
29
|
+
const pluginEditor = editor || currentEditor;
|
|
15
30
|
useEffect(() => {
|
|
16
31
|
if (typeof ref === 'function') {
|
|
17
32
|
ref(menuEl.current);
|
|
@@ -20,66 +35,80 @@ export const BubbleMenu = forwardRef(({ pluginKey = 'bubbleMenu', editor, update
|
|
|
20
35
|
ref.current = menuEl.current;
|
|
21
36
|
}
|
|
22
37
|
}, [ref]);
|
|
38
|
+
const bubbleMenuPluginProps = {
|
|
39
|
+
updateDelay,
|
|
40
|
+
resizeDelay,
|
|
41
|
+
pluginKey,
|
|
42
|
+
shouldShow,
|
|
43
|
+
getReferencedVirtualElement,
|
|
44
|
+
options: {
|
|
45
|
+
...options,
|
|
46
|
+
strategy: options?.strategy || 'absolute',
|
|
47
|
+
placement: options?.placement || 'bottom',
|
|
48
|
+
offset: options?.offset || 10,
|
|
49
|
+
onHide: () => {
|
|
50
|
+
options?.onHide?.();
|
|
51
|
+
},
|
|
52
|
+
onShow: () => {
|
|
53
|
+
if (!hasShownRef.current) {
|
|
54
|
+
// First show: mark as first show and force hide until children mount
|
|
55
|
+
hasShownRef.current = true;
|
|
56
|
+
isFirstShowRef.current = true;
|
|
57
|
+
menuEl.current.style.visibility = 'hidden';
|
|
58
|
+
setHasShown(true);
|
|
59
|
+
}
|
|
60
|
+
options?.onShow?.();
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
const bubbleMenuPluginPropsRef = useRef(bubbleMenuPluginProps);
|
|
65
|
+
bubbleMenuPluginPropsRef.current = bubbleMenuPluginProps;
|
|
66
|
+
useLayoutEffect(() => {
|
|
67
|
+
// After children mount in first show, make menuEl visible
|
|
68
|
+
if (isFirstShowRef.current) {
|
|
69
|
+
menuEl.current.style.visibility = 'visible';
|
|
70
|
+
isFirstShowRef.current = false;
|
|
71
|
+
}
|
|
72
|
+
});
|
|
23
73
|
useDeepCompareEffect(() => {
|
|
24
|
-
|
|
25
|
-
bubbleMenuElement.className = clsx(className, `${ANTSOMI_COMPONENT_PREFIX_CLS}-text-editor-bubble-menu`);
|
|
26
|
-
if (editor?.isDestroyed || currentEditor?.isDestroyed) {
|
|
74
|
+
if (pluginEditor?.isDestroyed) {
|
|
27
75
|
return;
|
|
28
76
|
}
|
|
29
|
-
|
|
30
|
-
if (!attachToEditor) {
|
|
77
|
+
if (!pluginEditor) {
|
|
31
78
|
// eslint-disable-next-line no-console
|
|
32
79
|
console.warn('BubbleMenu component is not rendered inside of an editor component or does not have editor prop.');
|
|
33
80
|
return;
|
|
34
81
|
}
|
|
82
|
+
const bubbleMenuElement = menuEl.current;
|
|
83
|
+
bubbleMenuElement.style.visibility = 'hidden';
|
|
84
|
+
bubbleMenuElement.style.position = 'absolute';
|
|
35
85
|
const plugin = BubbleMenuPlugin({
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
editor:
|
|
86
|
+
...bubbleMenuPluginPropsRef.current,
|
|
87
|
+
appendTo,
|
|
88
|
+
editor: pluginEditor,
|
|
39
89
|
element: bubbleMenuElement,
|
|
40
|
-
container,
|
|
41
|
-
pluginKey,
|
|
42
|
-
options: {
|
|
43
|
-
...options,
|
|
44
|
-
strategy: options?.strategy || 'absolute',
|
|
45
|
-
placement: options?.placement || 'bottom',
|
|
46
|
-
offset: options?.offset,
|
|
47
|
-
onShow: () => {
|
|
48
|
-
if (isMounted()) {
|
|
49
|
-
setIsShowBubbleMenu(true);
|
|
50
|
-
}
|
|
51
|
-
options?.onShow?.();
|
|
52
|
-
},
|
|
53
|
-
onHide: () => {
|
|
54
|
-
if (isMounted()) {
|
|
55
|
-
setIsShowBubbleMenu(false);
|
|
56
|
-
}
|
|
57
|
-
options?.onHide?.();
|
|
58
|
-
},
|
|
59
|
-
},
|
|
60
|
-
shouldShow,
|
|
61
90
|
});
|
|
62
|
-
|
|
91
|
+
pluginEditor.registerPlugin(plugin);
|
|
92
|
+
const createdPluginKey = bubbleMenuPluginPropsRef.current.pluginKey;
|
|
63
93
|
return () => {
|
|
64
|
-
|
|
94
|
+
pluginEditor.unregisterPlugin(createdPluginKey);
|
|
65
95
|
window.requestAnimationFrame(() => {
|
|
66
96
|
if (bubbleMenuElement.parentNode) {
|
|
67
97
|
bubbleMenuElement.parentNode.removeChild(bubbleMenuElement);
|
|
68
98
|
}
|
|
69
99
|
});
|
|
70
100
|
};
|
|
71
|
-
}, [
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
]);
|
|
101
|
+
}, [appendTo, pluginEditor]);
|
|
102
|
+
/**
|
|
103
|
+
* Lazy mounting optimization: only mount children after the bubble menu
|
|
104
|
+
* has been shown at least once. This significantly improves performance
|
|
105
|
+
* when many TextEditor instances exist (e.g., in lists).
|
|
106
|
+
*
|
|
107
|
+
* After first show, children remain mounted and the tiptap plugin
|
|
108
|
+
* handles visibility automatically via CSS, avoiding flash effects.
|
|
109
|
+
*/
|
|
110
|
+
if (!hasShown) {
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
84
113
|
return createPortal(_jsx("div", { ...restProps, children: children }), menuEl.current);
|
|
85
114
|
});
|
|
@@ -4,28 +4,28 @@ import clsx from 'clsx';
|
|
|
4
4
|
import styled from 'styled-components';
|
|
5
5
|
import { forwardRef } from 'react';
|
|
6
6
|
import { THEME } from '@antscorp/antsomi-ui/es/constants';
|
|
7
|
-
const StyledButton = styled(Button) `
|
|
8
|
-
&.antsomi-btn.antsomi-btn-text {
|
|
9
|
-
height: 24px;
|
|
10
|
-
width: 24px;
|
|
11
|
-
padding: 0;
|
|
12
|
-
flex-shrink: 0;
|
|
13
|
-
border-radius: 2px;
|
|
14
|
-
color: ${THEME.token?.bw8};
|
|
15
|
-
|
|
16
|
-
&.is-active {
|
|
17
|
-
color: ${THEME.token?.colorPrimary};
|
|
18
|
-
background-color: #e0ebf7;
|
|
19
|
-
|
|
20
|
-
&:hover {
|
|
21
|
-
background-color: #e0ebf7;
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
&:hover:not(:disabled, .is-active) {
|
|
26
|
-
color: ${THEME.token?.colorPrimary};
|
|
27
|
-
}
|
|
28
|
-
}
|
|
7
|
+
const StyledButton = styled(Button) `
|
|
8
|
+
&.antsomi-btn.antsomi-btn-text {
|
|
9
|
+
height: 24px;
|
|
10
|
+
width: 24px;
|
|
11
|
+
padding: 0;
|
|
12
|
+
flex-shrink: 0;
|
|
13
|
+
border-radius: 2px;
|
|
14
|
+
color: ${THEME.token?.bw8};
|
|
15
|
+
|
|
16
|
+
&.is-active {
|
|
17
|
+
color: ${THEME.token?.colorPrimary};
|
|
18
|
+
background-color: #e0ebf7;
|
|
19
|
+
|
|
20
|
+
&:hover {
|
|
21
|
+
background-color: #e0ebf7;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
&:hover:not(:disabled, .is-active) {
|
|
26
|
+
color: ${THEME.token?.colorPrimary};
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
29
|
`;
|
|
30
30
|
export const TextEditorButton = forwardRef((props, ref) => {
|
|
31
31
|
const { children, isActive, tooltipProps, className, disabled, ...restProps } = props;
|
|
@@ -5,19 +5,19 @@ import { TextEditorButton } from '../Button';
|
|
|
5
5
|
import { ArrowDropDownIcon } from '@antscorp/antsomi-ui/es/components/icons';
|
|
6
6
|
import styled from 'styled-components';
|
|
7
7
|
import clsx from 'clsx';
|
|
8
|
-
const StyledTriggerButton = styled(TextEditorButton) `
|
|
9
|
-
&.antsomi-dropdown-trigger.antsomi-btn {
|
|
10
|
-
gap: 0;
|
|
11
|
-
padding: 0;
|
|
12
|
-
width: 40px;
|
|
13
|
-
height: 24px;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
&.is-open {
|
|
17
|
-
svg.icon-dropdown {
|
|
18
|
-
transform: rotate(180deg);
|
|
19
|
-
}
|
|
20
|
-
}
|
|
8
|
+
const StyledTriggerButton = styled(TextEditorButton) `
|
|
9
|
+
&.antsomi-dropdown-trigger.antsomi-btn {
|
|
10
|
+
gap: 0;
|
|
11
|
+
padding: 0;
|
|
12
|
+
width: 40px;
|
|
13
|
+
height: 24px;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
&.is-open {
|
|
17
|
+
svg.icon-dropdown {
|
|
18
|
+
transform: rotate(180deg);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
21
|
`;
|
|
22
22
|
export const DropdownButton = (props) => {
|
|
23
23
|
const { className, children, disabled, tooltipProps, options = [], value, onClickOption } = props;
|
|
@@ -44,7 +44,7 @@ export const EmojiList = forwardRef((props, ref) => {
|
|
|
44
44
|
if (items.length <= 0) {
|
|
45
45
|
return null;
|
|
46
46
|
}
|
|
47
|
-
return (_jsx(VirtualizedMenu, { className: `${COMPONENT_CLS}-emoji-list`, itemSize: ITEM_SIZE, selected: items.at(selectedIndex) ? [items[selectedIndex].slug] : [], onClick: item => {
|
|
47
|
+
return (_jsx(VirtualizedMenu, { className: `${COMPONENT_CLS}-emoji-list`, itemSize: ITEM_SIZE, selected: items.at(selectedIndex) ? [items[selectedIndex].slug] : [], focusedKey: items[selectedIndex]?.slug, onClick: item => {
|
|
48
48
|
const idx = items.findIndex(i => i.slug === item.item.key);
|
|
49
49
|
if (idx !== -1) {
|
|
50
50
|
selectItem(idx);
|
|
@@ -10,7 +10,7 @@ const updatePosition = (editor, element, itemLength) => {
|
|
|
10
10
|
getBoundingClientRect: () => posToDOMRect(editor.view, editor.state.selection.from, editor.state.selection.to),
|
|
11
11
|
};
|
|
12
12
|
computePosition(virtualElement, element, {
|
|
13
|
-
placement: '
|
|
13
|
+
placement: 'bottom-start',
|
|
14
14
|
strategy: 'absolute',
|
|
15
15
|
middleware: [shift(), flip()],
|
|
16
16
|
}).then(({ x, y, strategy }) => {
|
|
@@ -45,7 +45,7 @@ export const suggestion = ({ container }) => ({
|
|
|
45
45
|
}
|
|
46
46
|
const rendererEl = safeGetRenndererEl();
|
|
47
47
|
rendererEl.classList.add(`${COMPONENT_CLS}-emoji-popover`);
|
|
48
|
-
(container || document.body).appendChild(rendererEl);
|
|
48
|
+
((typeof container === 'function' ? container() : container) || document.body).appendChild(rendererEl);
|
|
49
49
|
updatePosition(props.editor, rendererEl, props.items.length);
|
|
50
50
|
},
|
|
51
51
|
onUpdate(props) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { memo, useCallback, useEffect, useMemo, useState } from 'react';
|
|
2
|
+
import { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
3
3
|
import { Typography } from 'antd';
|
|
4
4
|
import { SearchPopover, VirtualizedMenu } from '@antscorp/antsomi-ui/es/components/molecules';
|
|
5
5
|
import { FontGroupTitle, PopoverTrigger } from './styled';
|
|
@@ -52,6 +52,7 @@ export const FontPopover = memo((props) => {
|
|
|
52
52
|
const itemSize = 30;
|
|
53
53
|
const itemSpacing = 4;
|
|
54
54
|
const activeFontName = fontValue?.font.fontFamily.name;
|
|
55
|
+
const inputSearchRef = useRef(null);
|
|
55
56
|
const [search, setSearch] = useState('');
|
|
56
57
|
const [open, setOpen] = useState(false);
|
|
57
58
|
const [fontItemsSize, setFontItemSize] = useDebounce(0, 200);
|
|
@@ -83,10 +84,19 @@ export const FontPopover = memo((props) => {
|
|
|
83
84
|
const listSize = calInlineListSize(Math.min(items.length, 6), itemSize, itemSpacing);
|
|
84
85
|
setFontItemSize(listSize);
|
|
85
86
|
}, [items.length, setFontItemSize]);
|
|
87
|
+
useEffect(() => {
|
|
88
|
+
if (open) {
|
|
89
|
+
// Use setTimeout to ensure the popover content is fully mounted in the DOM
|
|
90
|
+
const timeoutId = setTimeout(() => {
|
|
91
|
+
inputSearchRef.current?.focus();
|
|
92
|
+
}, 0);
|
|
93
|
+
return () => clearTimeout(timeoutId);
|
|
94
|
+
}
|
|
95
|
+
}, [open]);
|
|
86
96
|
return (_jsx(SearchPopover, { open: open, placement: "bottomLeft", onOpenChange: handleOpenChange, getPopupContainer: () => bubbleMenuContainer || document.body, inputSearchProps: {
|
|
87
97
|
value: search,
|
|
88
98
|
onAfterChange: setSearch,
|
|
89
|
-
}, overlayClassName: "font-popover-overlay", content: _jsx("div", { className: "list-font-root", style: {
|
|
99
|
+
}, inputSearchRef: inputSearchRef, overlayClassName: "font-popover-overlay", content: _jsx("div", { className: "list-font-root", style: {
|
|
90
100
|
height: `${fontItemsSize}px`,
|
|
91
101
|
}, children: _jsx(VirtualizedMenu, { itemSize: itemSize, inlinePadding: 0, itemSpacing: itemSpacing, selectable: false, items: items }) }), children: _jsx(PopoverTrigger, { className: "font-popover-trigger", children: _jsx(Typography.Text, { ellipsis: { tooltip: true }, children: activeFontName }) }) }));
|
|
92
102
|
});
|
|
@@ -1,36 +1,36 @@
|
|
|
1
1
|
import { THEME } from '@antscorp/antsomi-ui/es/constants';
|
|
2
2
|
import styled from 'styled-components';
|
|
3
|
-
export const PopoverTrigger = styled.div `
|
|
4
|
-
&.font-popover-trigger {
|
|
5
|
-
width: 100px;
|
|
6
|
-
height: 30px;
|
|
7
|
-
display: flex;
|
|
8
|
-
align-items: center;
|
|
9
|
-
padding: 0 7px;
|
|
10
|
-
cursor: pointer;
|
|
11
|
-
overflow: hidden;
|
|
12
|
-
white-space: nowrap;
|
|
13
|
-
text-overflow: ellipsis;
|
|
14
|
-
font-size: ${THEME.token?.fontSize || 12}px;
|
|
15
|
-
border-bottom: 1px solid ${THEME.token?.blue1};
|
|
16
|
-
flex-shrink: 0;
|
|
17
|
-
|
|
18
|
-
&:hover {
|
|
19
|
-
background-color: ${THEME.token?.blue};
|
|
20
|
-
}
|
|
21
|
-
}
|
|
3
|
+
export const PopoverTrigger = styled.div `
|
|
4
|
+
&.font-popover-trigger {
|
|
5
|
+
width: 100px;
|
|
6
|
+
height: 30px;
|
|
7
|
+
display: flex;
|
|
8
|
+
align-items: center;
|
|
9
|
+
padding: 0 7px;
|
|
10
|
+
cursor: pointer;
|
|
11
|
+
overflow: hidden;
|
|
12
|
+
white-space: nowrap;
|
|
13
|
+
text-overflow: ellipsis;
|
|
14
|
+
font-size: ${THEME.token?.fontSize || 12}px;
|
|
15
|
+
border-bottom: 1px solid ${THEME.token?.blue1};
|
|
16
|
+
flex-shrink: 0;
|
|
17
|
+
|
|
18
|
+
&:hover {
|
|
19
|
+
background-color: ${THEME.token?.blue};
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
22
|
`;
|
|
23
|
-
export const FontGroupTitle = styled.div `
|
|
24
|
-
color: ${THEME.token?.bw8};
|
|
25
|
-
display: flex;
|
|
26
|
-
align-items: center;
|
|
27
|
-
font-size: 11px;
|
|
28
|
-
|
|
29
|
-
&.font-popover-item {
|
|
30
|
-
cursor: default;
|
|
31
|
-
|
|
32
|
-
&:hover {
|
|
33
|
-
background-color: white;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
23
|
+
export const FontGroupTitle = styled.div `
|
|
24
|
+
color: ${THEME.token?.bw8};
|
|
25
|
+
display: flex;
|
|
26
|
+
align-items: center;
|
|
27
|
+
font-size: 11px;
|
|
28
|
+
|
|
29
|
+
&.font-popover-item {
|
|
30
|
+
cursor: default;
|
|
31
|
+
|
|
32
|
+
&:hover {
|
|
33
|
+
background-color: white;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
36
|
`;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Editor } from '@tiptap/core';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import type { LinkFormData } from '../../types';
|
|
4
|
+
export type LinkInsertFormProps = {
|
|
5
|
+
/** TipTap editor instance */
|
|
6
|
+
editor: Editor;
|
|
7
|
+
/** Form mode: insert or edit */
|
|
8
|
+
mode: 'insert' | 'edit';
|
|
9
|
+
/** Initial form data */
|
|
10
|
+
initialData: LinkFormData;
|
|
11
|
+
/** Callback when form is submitted */
|
|
12
|
+
onSubmit: () => void;
|
|
13
|
+
/** Callback when form is cancelled */
|
|
14
|
+
onCancel: () => void;
|
|
15
|
+
};
|
|
16
|
+
export declare const LinkInsertForm: React.FC<LinkInsertFormProps>;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Button, Checkbox, Flex, Input } from 'antd';
|
|
3
|
+
import { useState, useCallback, useRef, useEffect } from 'react';
|
|
4
|
+
export const LinkInsertForm = props => {
|
|
5
|
+
const { editor, mode, initialData, onSubmit, onCancel } = props;
|
|
6
|
+
const [url, setUrl] = useState(initialData.url);
|
|
7
|
+
const [text, setText] = useState(initialData.text);
|
|
8
|
+
const [openInNewTab, setOpenInNewTab] = useState(initialData.openInNewTab);
|
|
9
|
+
const urlInputRef = useRef(null);
|
|
10
|
+
// Auto-focus the URL input without scrolling
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
urlInputRef.current?.focus({
|
|
13
|
+
preventScroll: true,
|
|
14
|
+
});
|
|
15
|
+
}, []);
|
|
16
|
+
const handleSubmit = useCallback(() => {
|
|
17
|
+
if (!url.trim()) {
|
|
18
|
+
// Don't submit if URL is empty
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
// If text is different from initial, update the content
|
|
22
|
+
if (text !== initialData.text && text.trim()) {
|
|
23
|
+
editor
|
|
24
|
+
.chain()
|
|
25
|
+
.focus()
|
|
26
|
+
.setCustomLink({
|
|
27
|
+
attrs: {
|
|
28
|
+
href: url,
|
|
29
|
+
target: openInNewTab ? '_blank' : null,
|
|
30
|
+
},
|
|
31
|
+
content: text,
|
|
32
|
+
})
|
|
33
|
+
.run();
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
// Just update the link attributes
|
|
37
|
+
editor
|
|
38
|
+
.chain()
|
|
39
|
+
.focus()
|
|
40
|
+
.setCustomLink({
|
|
41
|
+
attrs: {
|
|
42
|
+
href: url,
|
|
43
|
+
target: openInNewTab ? '_blank' : null,
|
|
44
|
+
},
|
|
45
|
+
})
|
|
46
|
+
.run();
|
|
47
|
+
}
|
|
48
|
+
onSubmit();
|
|
49
|
+
}, [editor, url, text, initialData.text, openInNewTab, onSubmit]);
|
|
50
|
+
const handleKeyDown = useCallback((e) => {
|
|
51
|
+
if (e.key === 'Enter' && !e.shiftKey) {
|
|
52
|
+
e.preventDefault();
|
|
53
|
+
handleSubmit();
|
|
54
|
+
}
|
|
55
|
+
else if (e.key === 'Escape') {
|
|
56
|
+
e.preventDefault();
|
|
57
|
+
onCancel();
|
|
58
|
+
}
|
|
59
|
+
}, [handleSubmit, onCancel]);
|
|
60
|
+
return (_jsxs(Flex, { vertical: true, gap: 8, children: [_jsxs(Flex, { gap: 8, vertical: true, children: [_jsx(Input, { ref: urlInputRef, placeholder: "URL", value: url, onChange: e => setUrl(e.target.value), onKeyDown: handleKeyDown }), _jsx(Input, { placeholder: "Text", value: text, onChange: e => setText(e.target.value), onKeyDown: handleKeyDown })] }), _jsx(Checkbox, { checked: openInNewTab, onChange: e => setOpenInNewTab(e.target.checked), children: "Open in new tab" }), _jsxs(Flex, { justify: "flex-end", gap: 8, children: [_jsx(Button, { onClick: onCancel, children: "Cancel" }), _jsx(Button, { type: "primary", onClick: handleSubmit, disabled: !url.trim(), children: mode === 'insert' ? 'Insert' : 'Update' })] })] }));
|
|
61
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { LinkInsertForm } from './LinkInsertForm';
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Editor } from '@tiptap/react';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
export type LinkPopoverProps = {
|
|
4
|
+
/** TipTap editor instance */
|
|
5
|
+
editor: Editor;
|
|
6
|
+
/** Optional container to append the popover to. Defaults to document.body */
|
|
7
|
+
container?: HTMLElement | (() => HTMLElement);
|
|
8
|
+
};
|
|
9
|
+
export declare const LinkPopover: React.FC<LinkPopoverProps>;
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { posToDOMRect } from '@tiptap/react';
|
|
3
|
+
import { useEffect, useRef, useCallback, useLayoutEffect } from 'react';
|
|
4
|
+
import { createPortal } from 'react-dom';
|
|
5
|
+
import { computePosition, flip, shift, offset } from '@floating-ui/dom';
|
|
6
|
+
import { useTextEditorStore } from '../../provider';
|
|
7
|
+
import { LinkInsertForm } from '../LinkInsertForm';
|
|
8
|
+
import { COMPONENT_CLS } from '../../constants';
|
|
9
|
+
const updatePosition = (editor, element) => {
|
|
10
|
+
const virtualElement = {
|
|
11
|
+
getBoundingClientRect: () => posToDOMRect(editor.view, editor.state.selection.from, editor.state.selection.to),
|
|
12
|
+
};
|
|
13
|
+
computePosition(virtualElement, element, {
|
|
14
|
+
placement: 'bottom-start',
|
|
15
|
+
strategy: 'fixed',
|
|
16
|
+
middleware: [offset(10), shift(), flip()],
|
|
17
|
+
}).then(({ x, y, strategy }) => {
|
|
18
|
+
element.style.position = strategy;
|
|
19
|
+
element.style.left = `${x}px`;
|
|
20
|
+
element.style.top = `${y}px`;
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
export const LinkPopover = props => {
|
|
24
|
+
const { editor, container } = props;
|
|
25
|
+
const popoverRef = useRef(null);
|
|
26
|
+
const savedSelectionRef = useRef(null);
|
|
27
|
+
// Get link form state and actions from store
|
|
28
|
+
const linkFormState = useTextEditorStore(state => state.linkFormState);
|
|
29
|
+
const hideLinkForm = useTextEditorStore(state => state.hideLinkForm);
|
|
30
|
+
const isVisible = linkFormState?.isVisible ?? false;
|
|
31
|
+
// Save initial selection when form becomes visible
|
|
32
|
+
useEffect(() => {
|
|
33
|
+
if (isVisible) {
|
|
34
|
+
savedSelectionRef.current = {
|
|
35
|
+
from: editor.state.selection.from,
|
|
36
|
+
to: editor.state.selection.to,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
savedSelectionRef.current = null;
|
|
41
|
+
}
|
|
42
|
+
}, [editor, isVisible]);
|
|
43
|
+
// Update position whenever editor state changes or form becomes visible
|
|
44
|
+
useLayoutEffect(() => {
|
|
45
|
+
if (!isVisible || !popoverRef.current)
|
|
46
|
+
return;
|
|
47
|
+
updatePosition(editor, popoverRef.current);
|
|
48
|
+
}, [editor, isVisible, linkFormState]);
|
|
49
|
+
// Effect 1: Close on selection change (only if selection actually changed from saved)
|
|
50
|
+
useEffect(() => {
|
|
51
|
+
if (!isVisible || !savedSelectionRef.current)
|
|
52
|
+
return;
|
|
53
|
+
const handleSelectionUpdate = () => {
|
|
54
|
+
const currentSelection = editor.state.selection;
|
|
55
|
+
const savedSelection = savedSelectionRef.current;
|
|
56
|
+
// Only close if selection moved to a different position
|
|
57
|
+
if (savedSelection &&
|
|
58
|
+
(currentSelection.from !== savedSelection.from || currentSelection.to !== savedSelection.to)) {
|
|
59
|
+
hideLinkForm();
|
|
60
|
+
// Editor already has focus when selection changes, no need to refocus
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
editor.on('selectionUpdate', handleSelectionUpdate);
|
|
64
|
+
return () => {
|
|
65
|
+
editor.off('selectionUpdate', handleSelectionUpdate);
|
|
66
|
+
};
|
|
67
|
+
}, [editor, isVisible, hideLinkForm]);
|
|
68
|
+
// Effect 2: Close on click outside
|
|
69
|
+
useEffect(() => {
|
|
70
|
+
if (!isVisible)
|
|
71
|
+
return;
|
|
72
|
+
const handleClickOutside = (event) => {
|
|
73
|
+
if (popoverRef.current && !popoverRef.current.contains(event.target)) {
|
|
74
|
+
hideLinkForm();
|
|
75
|
+
// Check if click was on the editor
|
|
76
|
+
const editorElement = editor.view.dom;
|
|
77
|
+
const clickedOnEditor = editorElement.contains(event.target);
|
|
78
|
+
// If not clicked on editor, focus it after closing
|
|
79
|
+
if (!clickedOnEditor) {
|
|
80
|
+
setTimeout(() => {
|
|
81
|
+
editor.commands.focus();
|
|
82
|
+
}, 0);
|
|
83
|
+
}
|
|
84
|
+
// If clicked on editor, it will auto-focus naturally
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
// Use mousedown to catch the event before it propagates
|
|
88
|
+
document.addEventListener('mousedown', handleClickOutside);
|
|
89
|
+
return () => {
|
|
90
|
+
document.removeEventListener('mousedown', handleClickOutside);
|
|
91
|
+
};
|
|
92
|
+
}, [editor, isVisible, hideLinkForm]);
|
|
93
|
+
// Handle form submission
|
|
94
|
+
const handleSubmit = useCallback(() => {
|
|
95
|
+
hideLinkForm();
|
|
96
|
+
// Focus back to editor after closing form
|
|
97
|
+
setTimeout(() => {
|
|
98
|
+
editor.commands.focus();
|
|
99
|
+
}, 0);
|
|
100
|
+
}, [editor, hideLinkForm]);
|
|
101
|
+
// Handle form cancellation (also handles Escape key via LinkInsertForm)
|
|
102
|
+
const handleCancel = useCallback(() => {
|
|
103
|
+
hideLinkForm();
|
|
104
|
+
// Focus back to editor after closing form
|
|
105
|
+
setTimeout(() => {
|
|
106
|
+
editor.commands.focus();
|
|
107
|
+
}, 0);
|
|
108
|
+
}, [editor, hideLinkForm]);
|
|
109
|
+
// Don't render if not visible or no form state
|
|
110
|
+
if (!isVisible || !linkFormState) {
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
const popoverElement = (_jsx("div", { ref: popoverRef, className: `${COMPONENT_CLS}-link-popover`, style: {
|
|
114
|
+
position: 'absolute',
|
|
115
|
+
zIndex: 1000,
|
|
116
|
+
background: '#fff',
|
|
117
|
+
border: '1px solid #d9d9d9',
|
|
118
|
+
borderRadius: '8px',
|
|
119
|
+
padding: '16px',
|
|
120
|
+
boxShadow: '0 2px 8px rgba(0, 0, 0, 0.15)',
|
|
121
|
+
minWidth: '300px',
|
|
122
|
+
}, children: _jsx(LinkInsertForm, { editor: editor, mode: linkFormState.mode, initialData: linkFormState.data, onSubmit: handleSubmit, onCancel: handleCancel }) }));
|
|
123
|
+
// Use portal to render into container or document.body
|
|
124
|
+
const containerElement = (typeof container === 'function' ? container() : container) || document.body;
|
|
125
|
+
return createPortal(popoverElement, containerElement);
|
|
126
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { LinkPopover } from './LinkPopover';
|
|
@@ -5,5 +5,5 @@ import { useCallback } from 'react';
|
|
|
5
5
|
export const TextEditorPopover = ({ children, ...restProps }) => {
|
|
6
6
|
const bubbleMenuContainer = useTextEditorStore(state => state.bubbleMenuContainer);
|
|
7
7
|
const getPopupContainer = useCallback(() => bubbleMenuContainer || document.body, [bubbleMenuContainer]);
|
|
8
|
-
return (_jsx(Popover, { trigger: ['click'], ...restProps, getPopupContainer: getPopupContainer, children: children }));
|
|
8
|
+
return (_jsx(Popover, { destroyTooltipOnHide: true, trigger: ['click'], ...restProps, getPopupContainer: getPopupContainer, children: children }));
|
|
9
9
|
};
|