@lobehub/ui 4.3.2 → 4.3.3
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/es/Accordion/Accordion.mjs +2 -2
- package/es/Accordion/Accordion.mjs.map +1 -1
- package/es/Accordion/AccordionItem.mjs +11 -2
- package/es/Accordion/AccordionItem.mjs.map +1 -1
- package/es/Accordion/style.mjs +12 -9
- package/es/Accordion/style.mjs.map +1 -1
- package/es/ActionIcon/ActionIcon.d.mts +2 -2
- package/es/ActionIcon/ActionIcon.mjs +2 -57
- package/es/ActionIcon/ActionIcon.mjs.map +1 -1
- package/es/ActionIcon/style.mjs +76 -20
- package/es/ActionIcon/style.mjs.map +1 -1
- package/es/ActionIconGroup/ActionIconGroup.mjs +2 -30
- package/es/ActionIconGroup/ActionIconGroup.mjs.map +1 -1
- package/es/ActionIconGroup/style.mjs +39 -10
- package/es/ActionIconGroup/style.mjs.map +1 -1
- package/es/Alert/Alert.d.mts +2 -2
- package/es/Alert/Alert.mjs +17 -60
- package/es/Alert/Alert.mjs.map +1 -1
- package/es/Alert/style.mjs +318 -82
- package/es/Alert/style.mjs.map +1 -1
- package/es/AutoComplete/Select.d.mts +2 -2
- package/es/AutoComplete/Select.mjs +7 -21
- package/es/AutoComplete/Select.mjs.map +1 -1
- package/es/AutoComplete/style.mjs +32 -15
- package/es/AutoComplete/style.mjs.map +1 -1
- package/es/Avatar/Avatar.mjs +12 -24
- package/es/Avatar/Avatar.mjs.map +1 -1
- package/es/Avatar/AvatarGroup/index.d.mts +2 -2
- package/es/Avatar/AvatarGroup/index.mjs +3 -3
- package/es/Avatar/AvatarGroup/index.mjs.map +1 -1
- package/es/Avatar/AvatarGroup/style.mjs +9 -8
- package/es/Avatar/AvatarGroup/style.mjs.map +1 -1
- package/es/Avatar/style.mjs +30 -10
- package/es/Avatar/style.mjs.map +1 -1
- package/es/Block/Block.mjs +3 -48
- package/es/Block/Block.mjs.map +1 -1
- package/es/Block/style.mjs +58 -12
- package/es/Block/style.mjs.map +1 -1
- package/es/Burger/Burger.d.mts +2 -2
- package/es/Burger/Burger.mjs +21 -8
- package/es/Burger/Burger.mjs.map +1 -1
- package/es/Burger/style.mjs +115 -96
- package/es/Burger/style.mjs.map +1 -1
- package/es/Button/Button.mjs +6 -21
- package/es/Button/Button.mjs.map +1 -1
- package/es/Button/style.mjs +25 -7
- package/es/Button/style.mjs.map +1 -1
- package/es/Checkbox/Checkbox.mjs +2 -2
- package/es/Checkbox/Checkbox.mjs.map +1 -1
- package/es/Checkbox/style.mjs +12 -13
- package/es/Checkbox/style.mjs.map +1 -1
- package/es/CodeEditor/CodeEditor.d.mts +2 -2
- package/es/CodeEditor/CodeEditor.mjs +5 -13
- package/es/CodeEditor/CodeEditor.mjs.map +1 -1
- package/es/CodeEditor/style.mjs +21 -12
- package/es/CodeEditor/style.mjs.map +1 -1
- package/es/Collapse/Collapse.d.mts +2 -2
- package/es/Collapse/Collapse.mjs +4 -29
- package/es/Collapse/Collapse.mjs.map +1 -1
- package/es/Collapse/style.mjs +78 -18
- package/es/Collapse/style.mjs.map +1 -1
- package/es/ColorSwatches/ColorSwatches.mjs +20 -14
- package/es/ColorSwatches/ColorSwatches.mjs.map +1 -1
- package/es/ColorSwatches/style.mjs +35 -34
- package/es/ColorSwatches/style.mjs.map +1 -1
- package/es/ConfigProvider/index.d.mts +2 -2
- package/es/CopyButton/CopyButton.d.mts +2 -2
- package/es/DatePicker/DatePicker.d.mts +2 -2
- package/es/DatePicker/DatePicker.mjs +7 -21
- package/es/DatePicker/DatePicker.mjs.map +1 -1
- package/es/DatePicker/style.mjs +24 -7
- package/es/DatePicker/style.mjs.map +1 -1
- package/es/DraggablePanel/DraggablePanel.mjs +19 -62
- package/es/DraggablePanel/DraggablePanel.mjs.map +1 -1
- package/es/DraggablePanel/components/DraggablePanelBody.d.mts +2 -2
- package/es/DraggablePanel/components/DraggablePanelBody.mjs +2 -2
- package/es/DraggablePanel/components/DraggablePanelBody.mjs.map +1 -1
- package/es/DraggablePanel/components/DraggablePanelContainer.d.mts +2 -2
- package/es/DraggablePanel/components/DraggablePanelContainer.mjs +2 -2
- package/es/DraggablePanel/components/DraggablePanelContainer.mjs.map +1 -1
- package/es/DraggablePanel/components/DraggablePanelFooter.d.mts +2 -2
- package/es/DraggablePanel/components/DraggablePanelFooter.mjs +2 -2
- package/es/DraggablePanel/components/DraggablePanelFooter.mjs.map +1 -1
- package/es/DraggablePanel/components/DraggablePanelHeader.d.mts +2 -2
- package/es/DraggablePanel/components/DraggablePanelHeader.mjs +2 -2
- package/es/DraggablePanel/components/DraggablePanelHeader.mjs.map +1 -1
- package/es/DraggablePanel/components/style.mjs +6 -6
- package/es/DraggablePanel/components/style.mjs.map +1 -1
- package/es/DraggablePanel/style.mjs +336 -194
- package/es/DraggablePanel/style.mjs.map +1 -1
- package/es/DraggableSideNav/DraggableSideNav.d.mts +2 -2
- package/es/DraggableSideNav/DraggableSideNav.mjs +11 -8
- package/es/DraggableSideNav/DraggableSideNav.mjs.map +1 -1
- package/es/DraggableSideNav/style.mjs +192 -181
- package/es/DraggableSideNav/style.mjs.map +1 -1
- package/es/Drawer/Drawer.d.mts +2 -2
- package/es/Drawer/Drawer.mjs +11 -13
- package/es/Drawer/Drawer.mjs.map +1 -1
- package/es/Dropdown/Dropdown.d.mts +2 -2
- package/es/EditableText/EditableText.d.mts +2 -2
- package/es/EditableText/EditableText.mjs +1 -1
- package/es/EmojiPicker/AvatarUploader.mjs +3 -4
- package/es/EmojiPicker/AvatarUploader.mjs.map +1 -1
- package/es/EmojiPicker/EmojiPicker.d.mts +2 -2
- package/es/EmojiPicker/EmojiPicker.mjs +11 -4
- package/es/EmojiPicker/EmojiPicker.mjs.map +1 -1
- package/es/EmojiPicker/style.mjs +9 -9
- package/es/EmojiPicker/style.mjs.map +1 -1
- package/es/Empty/Empty.mjs +4 -4
- package/es/Empty/Empty.mjs.map +1 -1
- package/es/FileTypeIcon/FileTypeIcon.mjs +5 -6
- package/es/FileTypeIcon/FileTypeIcon.mjs.map +1 -1
- package/es/FileTypeIcon/components/FileIcon.mjs +5 -5
- package/es/FileTypeIcon/components/FileIcon.mjs.map +1 -1
- package/es/FileTypeIcon/components/FolderIcon.mjs +4 -4
- package/es/FileTypeIcon/components/FolderIcon.mjs.map +1 -1
- package/es/FileTypeIcon/style.mjs +3 -3
- package/es/FileTypeIcon/style.mjs.map +1 -1
- package/es/Flex/FlexBasic.d.mts +2 -2
- package/es/FluentEmoji/FluentEmoji.mjs +2 -2
- package/es/FluentEmoji/FluentEmoji.mjs.map +1 -1
- package/es/FluentEmoji/style.mjs +3 -3
- package/es/FluentEmoji/style.mjs.map +1 -1
- package/es/FontLoader/index.d.mts +2 -2
- package/es/Footer/Footer.d.mts +2 -2
- package/es/Footer/Footer.mjs +10 -8
- package/es/Footer/Footer.mjs.map +1 -1
- package/es/Footer/style.mjs +169 -133
- package/es/Footer/style.mjs.map +1 -1
- package/es/Form/Form.mjs +4 -14
- package/es/Form/Form.mjs.map +1 -1
- package/es/Form/components/FormDivider.mjs +3 -4
- package/es/Form/components/FormDivider.mjs.map +1 -1
- package/es/Form/components/FormFlatGroup.mjs +4 -14
- package/es/Form/components/FormFlatGroup.mjs.map +1 -1
- package/es/Form/components/FormGroup.d.mts +2 -2
- package/es/Form/components/FormGroup.mjs +5 -13
- package/es/Form/components/FormGroup.mjs.map +1 -1
- package/es/Form/components/FormItem.d.mts +2 -2
- package/es/Form/components/FormItem.mjs +12 -27
- package/es/Form/components/FormItem.mjs.map +1 -1
- package/es/Form/components/FormSubmitFooter.d.mts +2 -2
- package/es/Form/components/FormSubmitFooter.mjs +5 -4
- package/es/Form/components/FormSubmitFooter.mjs.map +1 -1
- package/es/Form/components/FormTitle.mjs +5 -5
- package/es/Form/components/FormTitle.mjs.map +1 -1
- package/es/Form/style.mjs +120 -72
- package/es/Form/style.mjs.map +1 -1
- package/es/FormModal/FormModal.d.mts +2 -2
- package/es/FormModal/FormModal.mjs +7 -8
- package/es/FormModal/FormModal.mjs.map +1 -1
- package/es/FormModal/style.mjs +7 -7
- package/es/FormModal/style.mjs.map +1 -1
- package/es/Grid/Grid.mjs +17 -4
- package/es/Grid/Grid.mjs.map +1 -1
- package/es/Grid/style.mjs +15 -16
- package/es/Grid/style.mjs.map +1 -1
- package/es/GroupAvatar/GroupAvatar.mjs +2 -14
- package/es/GroupAvatar/GroupAvatar.mjs.map +1 -1
- package/es/GroupAvatar/style.mjs +27 -16
- package/es/GroupAvatar/style.mjs.map +1 -1
- package/es/GuideCard/GuideCard.d.mts +2 -2
- package/es/GuideCard/GuideCard.mjs +5 -21
- package/es/GuideCard/GuideCard.mjs.map +1 -1
- package/es/GuideCard/style.mjs +57 -15
- package/es/GuideCard/style.mjs.map +1 -1
- package/es/Header/Header.d.mts +2 -2
- package/es/Header/Header.mjs +6 -7
- package/es/Header/Header.mjs.map +1 -1
- package/es/Header/style.mjs +8 -10
- package/es/Header/style.mjs.map +1 -1
- package/es/Highlighter/FullFeatured.mjs +2 -40
- package/es/Highlighter/FullFeatured.mjs.map +1 -1
- package/es/Highlighter/Highlighter.d.mts +2 -2
- package/es/Highlighter/Highlighter.mjs +2 -25
- package/es/Highlighter/Highlighter.mjs.map +1 -1
- package/es/Highlighter/SyntaxHighlighter/StaticRenderer.mjs +1 -1
- package/es/Highlighter/SyntaxHighlighter/StaticRenderer.mjs.map +1 -1
- package/es/Highlighter/SyntaxHighlighter/StreamRenderer.mjs +11 -31
- package/es/Highlighter/SyntaxHighlighter/StreamRenderer.mjs.map +1 -1
- package/es/Highlighter/SyntaxHighlighter/index.d.mts +2 -2
- package/es/Highlighter/SyntaxHighlighter/index.mjs +3 -31
- package/es/Highlighter/SyntaxHighlighter/index.mjs.map +1 -1
- package/es/Highlighter/SyntaxHighlighter/style.mjs +43 -16
- package/es/Highlighter/SyntaxHighlighter/style.mjs.map +1 -1
- package/es/Highlighter/style.mjs +64 -25
- package/es/Highlighter/style.mjs.map +1 -1
- package/es/Highlighter/theme/lobe-theme.mjs +370 -0
- package/es/Highlighter/theme/lobe-theme.mjs.map +1 -0
- package/es/Hotkey/Hotkey.d.mts +2 -2
- package/es/Hotkey/Hotkey.mjs +5 -20
- package/es/Hotkey/Hotkey.mjs.map +1 -1
- package/es/Hotkey/style.mjs +53 -17
- package/es/Hotkey/style.mjs.map +1 -1
- package/es/HotkeyInput/HotkeyInput.d.mts +2 -2
- package/es/HotkeyInput/HotkeyInput.mjs +5 -36
- package/es/HotkeyInput/HotkeyInput.mjs.map +1 -1
- package/es/HotkeyInput/style.mjs +46 -14
- package/es/HotkeyInput/style.mjs.map +1 -1
- package/es/Icon/Icon.d.mts +2 -2
- package/es/Icon/Icon.mjs +2 -10
- package/es/Icon/Icon.mjs.map +1 -1
- package/es/Icon/components/IconProvider.d.mts +3 -3
- package/es/Icon/style.mjs +15 -6
- package/es/Icon/style.mjs.map +1 -1
- package/es/Image/Image.mjs +8 -15
- package/es/Image/Image.mjs.map +1 -1
- package/es/Image/PreviewGroup.d.mts +2 -2
- package/es/Image/components/Toolbar.mjs +1 -2
- package/es/Image/components/Toolbar.mjs.map +1 -1
- package/es/Image/components/usePreview.mjs +2 -2
- package/es/Image/components/usePreview.mjs.map +1 -1
- package/es/Image/components/usePreviewGroup.mjs +4 -4
- package/es/Image/components/usePreviewGroup.mjs.map +1 -1
- package/es/Image/style.mjs +79 -54
- package/es/Image/style.mjs.map +1 -1
- package/es/ImageSelect/ImageSelect.mjs +2 -2
- package/es/ImageSelect/ImageSelect.mjs.map +1 -1
- package/es/ImageSelect/styles.mjs +11 -10
- package/es/ImageSelect/styles.mjs.map +1 -1
- package/es/Input/Input.d.mts +2 -2
- package/es/Input/Input.mjs +7 -21
- package/es/Input/Input.mjs.map +1 -1
- package/es/Input/InputNumber.d.mts +2 -2
- package/es/Input/InputNumber.mjs +7 -21
- package/es/Input/InputNumber.mjs.map +1 -1
- package/es/Input/InputOPT.d.mts +2 -2
- package/es/Input/InputOPT.mjs +7 -22
- package/es/Input/InputOPT.mjs.map +1 -1
- package/es/Input/InputPassword.d.mts +2 -2
- package/es/Input/InputPassword.mjs +6 -21
- package/es/Input/InputPassword.mjs.map +1 -1
- package/es/Input/TextArea.d.mts +2 -2
- package/es/Input/TextArea.mjs +6 -21
- package/es/Input/TextArea.mjs.map +1 -1
- package/es/Input/style.mjs +57 -25
- package/es/Input/style.mjs.map +1 -1
- package/es/Layout/Layout.mjs +36 -33
- package/es/Layout/Layout.mjs.map +1 -1
- package/es/Layout/components/LayoutFooter.d.mts +2 -2
- package/es/Layout/components/LayoutFooter.mjs +2 -2
- package/es/Layout/components/LayoutFooter.mjs.map +1 -1
- package/es/Layout/components/LayoutHeader.d.mts +2 -2
- package/es/Layout/components/LayoutHeader.mjs +2 -2
- package/es/Layout/components/LayoutHeader.mjs.map +1 -1
- package/es/Layout/components/LayoutMain.d.mts +2 -2
- package/es/Layout/components/LayoutMain.mjs +2 -2
- package/es/Layout/components/LayoutMain.mjs.map +1 -1
- package/es/Layout/components/LayoutSidebar.d.mts +2 -2
- package/es/Layout/components/LayoutSidebar.mjs +3 -3
- package/es/Layout/components/LayoutSidebar.mjs.map +1 -1
- package/es/Layout/components/LayoutSidebarInner.d.mts +2 -2
- package/es/Layout/components/LayoutSidebarInner.mjs +2 -2
- package/es/Layout/components/LayoutSidebarInner.mjs.map +1 -1
- package/es/Layout/components/LayoutToc.d.mts +2 -2
- package/es/Layout/components/LayoutToc.mjs +2 -2
- package/es/Layout/components/LayoutToc.mjs.map +1 -1
- package/es/Layout/style.mjs +6 -5
- package/es/Layout/style.mjs.map +1 -1
- package/es/List/ListItem/index.d.mts +2 -2
- package/es/List/ListItem/index.mjs +2 -2
- package/es/List/ListItem/index.mjs.map +1 -1
- package/es/List/ListItem/style.mjs +12 -11
- package/es/List/ListItem/style.mjs.map +1 -1
- package/es/Markdown/Markdown.d.mts +2 -2
- package/es/Markdown/Markdown.mjs +3 -25
- package/es/Markdown/Markdown.mjs.map +1 -1
- package/es/Markdown/SyntaxMarkdown/StreamdownRender.mjs +1 -2
- package/es/Markdown/SyntaxMarkdown/StreamdownRender.mjs.map +1 -1
- package/es/Markdown/SyntaxMarkdown/style.mjs +3 -3
- package/es/Markdown/SyntaxMarkdown/style.mjs.map +1 -1
- package/es/Markdown/Typography.d.mts +2 -2
- package/es/Markdown/Typography.mjs +2 -2
- package/es/Markdown/Typography.mjs.map +1 -1
- package/es/Markdown/components/CodeBlock.mjs +1 -0
- package/es/Markdown/components/CodeBlock.mjs.map +1 -1
- package/es/Markdown/components/SearchResultCards/SearchResultCard.mjs +1 -2
- package/es/Markdown/components/SearchResultCards/SearchResultCard.mjs.map +1 -1
- package/es/Markdown/components/SearchResultCards/index.d.mts +2 -2
- package/es/Markdown/components/SearchResultCards/style.mjs +3 -3
- package/es/Markdown/components/SearchResultCards/style.mjs.map +1 -1
- package/es/Markdown/markdown.style.mjs +23 -23
- package/es/Markdown/markdown.style.mjs.map +1 -1
- package/es/Markdown/style.mjs +48 -26
- package/es/Markdown/style.mjs.map +1 -1
- package/es/MaskShadow/MaskShadow.d.mts +2 -2
- package/es/MaskShadow/MaskShadow.mjs +8 -12
- package/es/MaskShadow/MaskShadow.mjs.map +1 -1
- package/es/MaskShadow/style.mjs +33 -8
- package/es/MaskShadow/style.mjs.map +1 -1
- package/es/Menu/Menu.d.mts +2 -2
- package/es/Menu/Menu.mjs +3 -25
- package/es/Menu/Menu.mjs.map +1 -1
- package/es/Menu/style.mjs +40 -15
- package/es/Menu/style.mjs.map +1 -1
- package/es/Mermaid/FullFeatured.mjs +2 -35
- package/es/Mermaid/FullFeatured.mjs.map +1 -1
- package/es/Mermaid/Mermaid.d.mts +2 -2
- package/es/Mermaid/Mermaid.mjs +5 -28
- package/es/Mermaid/Mermaid.mjs.map +1 -1
- package/es/Mermaid/SyntaxMermaid/StaticMermaid.mjs +82 -0
- package/es/Mermaid/SyntaxMermaid/StaticMermaid.mjs.map +1 -0
- package/es/Mermaid/SyntaxMermaid/StreamMermaid.mjs +94 -0
- package/es/Mermaid/SyntaxMermaid/StreamMermaid.mjs.map +1 -0
- package/es/Mermaid/SyntaxMermaid/index.d.mts +2 -2
- package/es/Mermaid/SyntaxMermaid/index.mjs +36 -58
- package/es/Mermaid/SyntaxMermaid/index.mjs.map +1 -1
- package/es/Mermaid/SyntaxMermaid/style.mjs +80 -0
- package/es/Mermaid/SyntaxMermaid/style.mjs.map +1 -0
- package/es/Mermaid/type.d.mts +3 -2
- package/es/Modal/Modal.d.mts +2 -2
- package/es/Modal/Modal.mjs +8 -9
- package/es/Modal/Modal.mjs.map +1 -1
- package/es/Modal/style.mjs +13 -11
- package/es/Modal/style.mjs.map +1 -1
- package/es/MotionProvider/index.d.mts +2 -2
- package/es/ScrollShadow/ScrollShadow.mjs +20 -43
- package/es/ScrollShadow/ScrollShadow.mjs.map +1 -1
- package/es/ScrollShadow/style.mjs +54 -12
- package/es/ScrollShadow/style.mjs.map +1 -1
- package/es/SearchBar/SearchBar.d.mts +2 -2
- package/es/SearchBar/SearchBar.mjs +2 -2
- package/es/SearchBar/SearchBar.mjs.map +1 -1
- package/es/SearchBar/style.mjs +7 -6
- package/es/SearchBar/style.mjs.map +1 -1
- package/es/Segmented/Segmented.d.mts +2 -2
- package/es/Segmented/Segmented.mjs +4 -26
- package/es/Segmented/Segmented.mjs.map +1 -1
- package/es/Segmented/style.mjs +33 -9
- package/es/Segmented/style.mjs.map +1 -1
- package/es/Select/Select.d.mts +2 -2
- package/es/Select/Select.mjs +7 -21
- package/es/Select/Select.mjs.map +1 -1
- package/es/Select/style.mjs +36 -19
- package/es/Select/style.mjs.map +1 -1
- package/es/SideNav/SideNav.d.mts +2 -2
- package/es/SideNav/SideNav.mjs +2 -2
- package/es/SideNav/SideNav.mjs.map +1 -1
- package/es/SideNav/style.mjs +5 -5
- package/es/SideNav/style.mjs.map +1 -1
- package/es/Skeleton/Skeleton.mjs +2 -2
- package/es/Skeleton/Skeleton.mjs.map +1 -1
- package/es/Skeleton/SkeletonAvatar.mjs +3 -3
- package/es/Skeleton/SkeletonAvatar.mjs.map +1 -1
- package/es/Skeleton/SkeletonBlock.mjs +2 -2
- package/es/Skeleton/SkeletonBlock.mjs.map +1 -1
- package/es/Skeleton/SkeletonButton.mjs +5 -6
- package/es/Skeleton/SkeletonButton.mjs.map +1 -1
- package/es/Skeleton/SkeletonTags.mjs +5 -5
- package/es/Skeleton/SkeletonTags.mjs.map +1 -1
- package/es/Skeleton/SkeletonTitle.mjs +2 -2
- package/es/Skeleton/SkeletonTitle.mjs.map +1 -1
- package/es/Skeleton/style.mjs +7 -8
- package/es/Skeleton/style.mjs.map +1 -1
- package/es/SliderWithInput/SliderWithInput.d.mts +2 -2
- package/es/Snippet/Snippet.mjs +2 -21
- package/es/Snippet/Snippet.mjs.map +1 -1
- package/es/Snippet/style.mjs +27 -9
- package/es/Snippet/style.mjs.map +1 -1
- package/es/SortableList/SortableList.mjs +1 -2
- package/es/SortableList/SortableList.mjs.map +1 -1
- package/es/SortableList/components/DragHandle.d.mts +2 -2
- package/es/SortableList/components/SortableItem.d.mts +2 -2
- package/es/SortableList/components/SortableItem.mjs +3 -22
- package/es/SortableList/components/SortableItem.mjs.map +1 -1
- package/es/SortableList/style.mjs +24 -7
- package/es/SortableList/style.mjs.map +1 -1
- package/es/Tabs/Tabs.mjs +3 -26
- package/es/Tabs/Tabs.mjs.map +1 -1
- package/es/Tabs/style.mjs +34 -10
- package/es/Tabs/style.mjs.map +1 -1
- package/es/Tag/Tag.mjs +3 -21
- package/es/Tag/Tag.mjs.map +1 -1
- package/es/Tag/styles.mjs +36 -10
- package/es/Tag/styles.mjs.map +1 -1
- package/es/Text/Text.mjs +2 -35
- package/es/Text/Text.mjs.map +1 -1
- package/es/Text/styles.mjs +49 -17
- package/es/Text/styles.mjs.map +1 -1
- package/es/ThemeProvider/ConfigProvider.mjs +11 -12
- package/es/ThemeProvider/ConfigProvider.mjs.map +1 -1
- package/es/ThemeProvider/ThemeProvider.d.mts +2 -2
- package/es/ThemeProvider/ThemeProvider.mjs +1 -1
- package/es/Toc/Toc.d.mts +2 -2
- package/es/Toc/Toc.mjs +8 -6
- package/es/Toc/Toc.mjs.map +1 -1
- package/es/Toc/TocMobile.mjs +1 -5
- package/es/Toc/TocMobile.mjs.map +1 -1
- package/es/Toc/style.mjs +52 -52
- package/es/Toc/style.mjs.map +1 -1
- package/es/Tooltip/TooltipFloating.mjs +2 -2
- package/es/Tooltip/TooltipFloating.mjs.map +1 -1
- package/es/Tooltip/TooltipPortal.mjs +3 -1
- package/es/Tooltip/TooltipPortal.mjs.map +1 -1
- package/es/Tooltip/style.mjs +7 -7
- package/es/Tooltip/style.mjs.map +1 -1
- package/es/Video/index.d.mts +2 -2
- package/es/Video/index.mjs +13 -13
- package/es/Video/index.mjs.map +1 -1
- package/es/Video/style.mjs +49 -42
- package/es/Video/style.mjs.map +1 -1
- package/es/awesome/AuroraBackground/AuroraBackground.d.mts +2 -2
- package/es/awesome/AuroraBackground/AuroraBackground.mjs +4 -3
- package/es/awesome/AuroraBackground/AuroraBackground.mjs.map +1 -1
- package/es/awesome/AuroraBackground/style.mjs +129 -90
- package/es/awesome/AuroraBackground/style.mjs.map +1 -1
- package/es/awesome/BottomGradientButton/BottomGradientButton.d.mts +2 -2
- package/es/awesome/BottomGradientButton/BottomGradientButton.mjs +2 -2
- package/es/awesome/BottomGradientButton/BottomGradientButton.mjs.map +1 -1
- package/es/awesome/BottomGradientButton/style.mjs +6 -5
- package/es/awesome/BottomGradientButton/style.mjs.map +1 -1
- package/es/awesome/Features/FeatureItem.mjs +10 -7
- package/es/awesome/Features/FeatureItem.mjs.map +1 -1
- package/es/awesome/Features/Features.d.mts +2 -2
- package/es/awesome/Features/style.mjs +141 -90
- package/es/awesome/Features/style.mjs.map +1 -1
- package/es/awesome/Giscus/Giscus.d.mts +2 -2
- package/es/awesome/GradientButton/GradientButton.d.mts +2 -2
- package/es/awesome/GradientButton/GradientButton.mjs +26 -5
- package/es/awesome/GradientButton/GradientButton.mjs.map +1 -1
- package/es/awesome/GradientButton/style.mjs +93 -63
- package/es/awesome/GradientButton/style.mjs.map +1 -1
- package/es/awesome/GridBackground/GridBackground.d.mts +2 -2
- package/es/awesome/GridBackground/GridBackground.mjs +30 -9
- package/es/awesome/GridBackground/GridBackground.mjs.map +1 -1
- package/es/awesome/GridBackground/GridShowcase.d.mts +2 -2
- package/es/awesome/GridBackground/style.mjs +70 -62
- package/es/awesome/GridBackground/style.mjs.map +1 -1
- package/es/awesome/Hero/Hero.d.mts +2 -2
- package/es/awesome/Hero/Hero.mjs +1 -2
- package/es/awesome/Hero/Hero.mjs.map +1 -1
- package/es/awesome/Hero/style.mjs +11 -10
- package/es/awesome/Hero/style.mjs.map +1 -1
- package/es/awesome/Spline/ParentSize.mjs +1 -1
- package/es/awesome/Spline/Spine.d.mts +2 -2
- package/es/awesome/Spotlight/Spotlight.d.mts +2 -2
- package/es/awesome/Spotlight/Spotlight.mjs +15 -7
- package/es/awesome/Spotlight/Spotlight.mjs.map +1 -1
- package/es/awesome/Spotlight/style.mjs +76 -23
- package/es/awesome/Spotlight/style.mjs.map +1 -1
- package/es/awesome/SpotlightCard/SpotlightCard.d.mts +2 -2
- package/es/awesome/SpotlightCard/SpotlightCard.mjs +11 -7
- package/es/awesome/SpotlightCard/SpotlightCard.mjs.map +1 -1
- package/es/awesome/SpotlightCard/SpotlightCardItem.mjs +10 -7
- package/es/awesome/SpotlightCard/SpotlightCardItem.mjs.map +1 -1
- package/es/awesome/SpotlightCard/style.mjs +121 -69
- package/es/awesome/SpotlightCard/style.mjs.map +1 -1
- package/es/awesome/TypewriterEffect/TypewriterEffect.d.mts +2 -2
- package/es/awesome/TypewriterEffect/TypewriterEffect.mjs +6 -5
- package/es/awesome/TypewriterEffect/TypewriterEffect.mjs.map +1 -1
- package/es/awesome/TypewriterEffect/style.mjs +8 -8
- package/es/awesome/TypewriterEffect/style.mjs.map +1 -1
- package/es/brand/BrandLoading/{style-Cz42xGgB.css → style-DX648z7a.css} +1 -1
- package/es/brand/BrandLoading/{style-Cz42xGgB.css.map → style-DX648z7a.css.map} +1 -1
- package/es/brand/LobeChat/index.d.mts +2 -2
- package/es/brand/LobeChat/index.mjs +5 -7
- package/es/brand/LobeChat/index.mjs.map +1 -1
- package/es/brand/LobeHub/index.d.mts +2 -2
- package/es/brand/LobeHub/index.mjs +5 -7
- package/es/brand/LobeHub/index.mjs.map +1 -1
- package/es/brand/LobeHub/style.mjs +3 -3
- package/es/brand/LobeHub/style.mjs.map +1 -1
- package/es/brand/LogoFlat/index.d.mts +3 -6
- package/es/brand/LogoFlat/index.mjs +2 -76
- package/es/brand/LogoFlat/index.mjs.map +1 -1
- package/es/brand/LogoMono/index.d.mts +2 -10
- package/es/brand/LogoMono/index.mjs +2 -84
- package/es/brand/LogoThree/LogoSpline.d.mts +2 -2
- package/es/brand/LogoThree/index.d.mts +2 -2
- package/es/brand/index.d.mts +3 -3
- package/es/brand/index.mjs +2 -2
- package/es/chat/BackBottom/BackBottom.d.mts +2 -2
- package/es/chat/BackBottom/BackBottom.mjs +3 -3
- package/es/chat/BackBottom/BackBottom.mjs.map +1 -1
- package/es/chat/BackBottom/style.mjs +27 -8
- package/es/chat/BackBottom/style.mjs.map +1 -1
- package/es/chat/ChatHeader/ChatHeader.mjs +2 -2
- package/es/chat/ChatHeader/ChatHeader.mjs.map +1 -1
- package/es/chat/ChatHeader/ChatHeaderTitle.mjs +8 -9
- package/es/chat/ChatHeader/ChatHeaderTitle.mjs.map +1 -1
- package/es/chat/ChatHeader/style.mjs +7 -7
- package/es/chat/ChatHeader/style.mjs.map +1 -1
- package/es/chat/ChatInputArea/ChatInputArea.mjs +1 -2
- package/es/chat/ChatInputArea/ChatInputArea.mjs.map +1 -1
- package/es/chat/ChatInputArea/components/ChatInputActionBar.mjs +4 -5
- package/es/chat/ChatInputArea/components/ChatInputActionBar.mjs.map +1 -1
- package/es/chat/ChatInputArea/components/ChatInputAreaInner.d.mts +2 -2
- package/es/chat/ChatInputArea/components/ChatSendButton.mjs +2 -3
- package/es/chat/ChatInputArea/components/ChatSendButton.mjs.map +1 -1
- package/es/chat/ChatInputArea/style.mjs +6 -5
- package/es/chat/ChatInputArea/style.mjs.map +1 -1
- package/es/chat/ChatItem/ChatItem.d.mts +2 -2
- package/es/chat/ChatItem/ChatItem.mjs +19 -16
- package/es/chat/ChatItem/ChatItem.mjs.map +1 -1
- package/es/chat/ChatItem/components/Actions.mjs +8 -8
- package/es/chat/ChatItem/components/Actions.mjs.map +1 -1
- package/es/chat/ChatItem/components/Avatar.mjs +7 -3
- package/es/chat/ChatItem/components/Avatar.mjs.map +1 -1
- package/es/chat/ChatItem/components/ErrorContent.mjs +2 -3
- package/es/chat/ChatItem/components/ErrorContent.mjs.map +1 -1
- package/es/chat/ChatItem/components/Loading.mjs +3 -4
- package/es/chat/ChatItem/components/Loading.mjs.map +1 -1
- package/es/chat/ChatItem/components/MessageContent.mjs +11 -10
- package/es/chat/ChatItem/components/MessageContent.mjs.map +1 -1
- package/es/chat/ChatItem/components/Title.mjs +3 -8
- package/es/chat/ChatItem/components/Title.mjs.map +1 -1
- package/es/chat/ChatItem/style.mjs +294 -142
- package/es/chat/ChatItem/style.mjs.map +1 -1
- package/es/chat/ChatList/ChatList.d.mts +2 -2
- package/es/chat/ChatList/ChatList.mjs +2 -2
- package/es/chat/ChatList/ChatList.mjs.map +1 -1
- package/es/chat/ChatList/style.mjs +3 -3
- package/es/chat/ChatList/style.mjs.map +1 -1
- package/es/chat/EditableMessage/EditableMessage.d.mts +2 -2
- package/es/chat/EditableMessage/EditableMessage.mjs +1 -1
- package/es/chat/EditableMessageList/EditableMessageList.d.mts +2 -2
- package/es/chat/LoadingDots/LoadingDots.mjs +17 -10
- package/es/chat/LoadingDots/LoadingDots.mjs.map +1 -1
- package/es/chat/LoadingDots/style.mjs +117 -116
- package/es/chat/LoadingDots/style.mjs.map +1 -1
- package/es/chat/LoadingDots/type.d.mts +6 -0
- package/es/chat/MessageInput/MessageInput.d.mts +2 -2
- package/es/chat/MessageInput/MessageInput.mjs +4 -5
- package/es/chat/MessageInput/MessageInput.mjs.map +1 -1
- package/es/chat/MessageInput/style.mjs +4 -4
- package/es/chat/MessageInput/style.mjs.map +1 -1
- package/es/chat/MessageModal/MessageModal.d.mts +2 -2
- package/es/chat/MessageModal/MessageModal.mjs +4 -5
- package/es/chat/MessageModal/MessageModal.mjs.map +1 -1
- package/es/chat/TokenTag/TokenTag.mjs +5 -6
- package/es/chat/TokenTag/TokenTag.mjs.map +1 -1
- package/es/color/ColorScales/ScaleRow.mjs +1 -2
- package/es/color/ColorScales/ScaleRow.mjs.map +1 -1
- package/es/color/ColorScales/index.d.mts +2 -2
- package/es/color/ColorScales/index.mjs +1 -2
- package/es/color/ColorScales/index.mjs.map +1 -1
- package/es/color/ColorScales/style.mjs +4 -4
- package/es/color/ColorScales/style.mjs.map +1 -1
- package/es/hooks/useHighlight.mjs +84 -227
- package/es/hooks/useHighlight.mjs.map +1 -1
- package/es/hooks/useMermaid.mjs +104 -57
- package/es/hooks/useMermaid.mjs.map +1 -1
- package/es/hooks/useStreamHighlight.mjs +221 -0
- package/es/hooks/useStreamHighlight.mjs.map +1 -0
- package/es/hooks/useStreamMermaid.mjs +87 -0
- package/es/hooks/useStreamMermaid.mjs.map +1 -0
- package/es/i18n/context.d.mts +2 -2
- package/es/icons/lucideExtra/BotPromptIcon.d.mts +2 -2
- package/es/icons/lucideExtra/CreateBotIcon.d.mts +2 -2
- package/es/icons/lucideExtra/DiscordIcon.d.mts +2 -2
- package/es/icons/lucideExtra/GlobeOffIcon.d.mts +3 -3
- package/es/icons/lucideExtra/GroupBotIcon.d.mts +3 -3
- package/es/icons/lucideExtra/GroupBotSquareIcon.d.mts +3 -3
- package/es/icons/lucideExtra/LeftClickIcon.d.mts +3 -3
- package/es/icons/lucideExtra/LeftDoubleClickIcon.d.mts +3 -3
- package/es/icons/lucideExtra/McpIcon.d.mts +3 -3
- package/es/icons/lucideExtra/ProviderIcon.d.mts +3 -3
- package/es/icons/lucideExtra/RightClickIcon.d.mts +3 -3
- package/es/icons/lucideExtra/RightDoubleClickIcon.d.mts +3 -3
- package/es/icons/lucideExtra/ShapesUploadIcon.d.mts +3 -3
- package/es/icons/lucideExtra/TreeDownRightIcon.d.mts +3 -3
- package/es/icons/lucideExtra/TreeUpDownRightIcon.d.mts +3 -3
- package/es/index.d.mts +2 -1
- package/es/index.mjs +9 -8
- package/es/mdx/Callout/index.mjs +8 -7
- package/es/mdx/Callout/index.mjs.map +1 -1
- package/es/mdx/Callout/style.mjs +3 -4
- package/es/mdx/Callout/style.mjs.map +1 -1
- package/es/mdx/Cards/Card.mjs +14 -16
- package/es/mdx/Cards/Card.mjs.map +1 -1
- package/es/mdx/Cards/index.mjs +2 -2
- package/es/mdx/Cards/index.mjs.map +1 -1
- package/es/mdx/Cards/style.mjs +3 -3
- package/es/mdx/Cards/style.mjs.map +1 -1
- package/es/mdx/FileTree/Folder.mjs +1 -16
- package/es/mdx/FileTree/Folder.mjs.map +1 -1
- package/es/mdx/FileTree/index.mjs +2 -2
- package/es/mdx/FileTree/index.mjs.map +1 -1
- package/es/mdx/FileTree/style.mjs +19 -7
- package/es/mdx/FileTree/style.mjs.map +1 -1
- package/es/mdx/Mdx/index.d.mts +2 -2
- package/es/mdx/Mdx/index.mjs +2 -2
- package/es/mdx/Mdx/index.mjs.map +1 -1
- package/es/mdx/Steps/index.mjs +2 -2
- package/es/mdx/Steps/index.mjs.map +1 -1
- package/es/mdx/Steps/style.mjs +8 -8
- package/es/mdx/Steps/style.mjs.map +1 -1
- package/es/mdx/Tabs/Tab.mjs +3 -12
- package/es/mdx/Tabs/Tab.mjs.map +1 -1
- package/es/mdx/Tabs/index.mjs +2 -2
- package/es/mdx/Tabs/index.mjs.map +1 -1
- package/es/mdx/Tabs/style.mjs +12 -14
- package/es/mdx/Tabs/style.mjs.map +1 -1
- package/es/mdx/mdxComponents/Citation/PopoverPanel.mjs +1 -22
- package/es/mdx/mdxComponents/Citation/PopoverPanel.mjs.map +1 -1
- package/es/mdx/mdxComponents/Citation/index.mjs +3 -17
- package/es/mdx/mdxComponents/Citation/index.mjs.map +1 -1
- package/es/mdx/mdxComponents/Citation/style.mjs +39 -0
- package/es/mdx/mdxComponents/Citation/style.mjs.map +1 -0
- package/es/mdx/mdxComponents/Pre.mjs +7 -9
- package/es/mdx/mdxComponents/Pre.mjs.map +1 -1
- package/es/mobile/ChatHeader/ChatHeader.mjs +2 -2
- package/es/mobile/ChatHeader/ChatHeader.mjs.map +1 -1
- package/es/mobile/ChatHeader/ChatHeaderTitle.d.mts +2 -2
- package/es/mobile/ChatHeader/ChatHeaderTitle.mjs +7 -8
- package/es/mobile/ChatHeader/ChatHeaderTitle.mjs.map +1 -1
- package/es/mobile/ChatHeader/style.mjs +6 -6
- package/es/mobile/ChatHeader/style.mjs.map +1 -1
- package/es/mobile/ChatInputArea/ChatInputArea.mjs +2 -2
- package/es/mobile/ChatInputArea/ChatInputArea.mjs.map +1 -1
- package/es/mobile/ChatInputArea/components/ChatSendButton.d.mts +2 -2
- package/es/mobile/ChatInputArea/style.mjs +5 -5
- package/es/mobile/ChatInputArea/style.mjs.map +1 -1
- package/es/mobile/SafeArea/SafeArea.mjs +2 -2
- package/es/mobile/SafeArea/SafeArea.mjs.map +1 -1
- package/es/mobile/SafeArea/style.mjs +3 -3
- package/es/mobile/SafeArea/style.mjs.map +1 -1
- package/es/mobile/TabBar/TabBar.mjs +2 -2
- package/es/mobile/TabBar/TabBar.mjs.map +1 -1
- package/es/mobile/TabBar/style.mjs +7 -7
- package/es/mobile/TabBar/style.mjs.map +1 -1
- package/es/storybook/StoryBook/index.d.mts +2 -2
- package/es/storybook/StoryBook/index.mjs +4 -5
- package/es/storybook/StoryBook/index.mjs.map +1 -1
- package/es/storybook/StoryBook/style.mjs +27 -24
- package/es/storybook/StoryBook/style.mjs.map +1 -1
- package/es/styles/index.d.mts +2 -1
- package/es/styles/index.mjs +2 -1
- package/es/styles/theme/customStylishStatic.d.mts +7 -0
- package/es/styles/theme/customStylishStatic.mjs +161 -0
- package/es/styles/theme/customStylishStatic.mjs.map +1 -0
- package/package.json +3 -2
- package/es/brand/LogoMono/index.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TokenTag.mjs","names":["TokenTag: FC<TokenTagProps>","chatMessages","type: 'normal' | 'low' | 'overload'","ActionIcon"],"sources":["../../../src/chat/TokenTag/TokenTag.tsx"],"sourcesContent":["'use client';\n\nimport { Progress } from 'antd';\nimport {
|
|
1
|
+
{"version":3,"file":"TokenTag.mjs","names":["TokenTag: FC<TokenTagProps>","chatMessages","type: 'normal' | 'low' | 'overload'","ActionIcon"],"sources":["../../../src/chat/TokenTag/TokenTag.tsx"],"sourcesContent":["'use client';\n\nimport { Progress } from 'antd';\nimport { cssVar } from 'antd-style';\nimport numeral from 'numeral';\nimport { type FC, useMemo } from 'react';\n\nimport ActionIcon from '@/ActionIcon';\nimport chatMessages from '@/i18n/resources/en/chat';\nimport { useTranslation } from '@/i18n/useTranslation';\n\nimport type { TokenTagProps } from './type';\n\nconst format = (number: number) => numeral(number).format('0,0');\n\nconst TokenTag: FC<TokenTagProps> = ({\n mode = 'remained',\n maxValue,\n value,\n text,\n showInfo,\n size = 20,\n ...rest\n}) => {\n const { t } = useTranslation(chatMessages);\n const valueLeft = maxValue - value;\n const percent = value / maxValue;\n const remainedText = text?.remained ?? t('tokenTag.remained');\n const usedText = text?.used ?? t('tokenTag.used');\n const overloadText = text?.overload ?? t('tokenTag.overload');\n\n const data = useMemo(() => {\n let type: 'normal' | 'low' | 'overload';\n let color;\n\n if (percent < 0.7) {\n type = 'normal';\n color = cssVar.colorText;\n } else if (percent < 0.9) {\n type = 'low';\n color = cssVar.colorWarning;\n } else {\n type = 'overload';\n color = cssVar.colorError;\n }\n return {\n color,\n type,\n };\n }, [percent]);\n\n const title =\n valueLeft > 0\n ? [\n mode === 'remained' ? remainedText : usedText,\n mode === 'remained' ? format(valueLeft) : format(value),\n ].join(' ')\n : overloadText;\n\n return (\n <ActionIcon\n icon={\n <Progress\n percent={percent * 100}\n showInfo={false}\n size={Number(typeof size === 'object' ? size?.size || 20 : size) || 20}\n strokeColor={data.color}\n type=\"circle\"\n />\n }\n size={size}\n title={showInfo ? title : undefined}\n {...rest}\n />\n );\n};\n\nTokenTag.displayName = 'TokenTag';\n\nexport default TokenTag;\n"],"mappings":";;;;;;;;;;;;AAaA,MAAM,UAAU,WAAmB,QAAQ,OAAO,CAAC,OAAO,MAAM;AAEhE,MAAMA,YAA+B,EACnC,OAAO,YACP,UACA,OACA,MACA,UACA,OAAO,IACP,GAAG,WACC;CACJ,MAAM,EAAE,MAAM,eAAeC,aAAa;CAC1C,MAAM,YAAY,WAAW;CAC7B,MAAM,UAAU,QAAQ;CACxB,MAAM,eAAe,MAAM,YAAY,EAAE,oBAAoB;CAC7D,MAAM,WAAW,MAAM,QAAQ,EAAE,gBAAgB;CACjD,MAAM,eAAe,MAAM,YAAY,EAAE,oBAAoB;CAE7D,MAAM,OAAO,cAAc;EACzB,IAAIC;EACJ,IAAI;AAEJ,MAAI,UAAU,IAAK;AACjB,UAAO;AACP,WAAQ,OAAO;aACN,UAAU,IAAK;AACxB,UAAO;AACP,WAAQ,OAAO;SACV;AACL,UAAO;AACP,WAAQ,OAAO;;AAEjB,SAAO;GACL;GACA;GACD;IACA,CAAC,QAAQ,CAAC;CAEb,MAAM,QACJ,YAAY,IACR,CACE,SAAS,aAAa,eAAe,UACrC,SAAS,aAAa,OAAO,UAAU,GAAG,OAAO,MAAM,CACxD,CAAC,KAAK,IAAI,GACX;AAEN,QACE,oBAACC;EACC,MACE,oBAAC;GACC,SAAS,UAAU;GACnB,UAAU;GACV,MAAM,OAAO,OAAO,SAAS,WAAW,MAAM,QAAQ,KAAK,KAAK,IAAI;GACpE,aAAa,KAAK;GAClB,MAAK;IACL;EAEE;EACN,OAAO,WAAW,QAAQ;EAC1B,GAAI;GACJ;;AAIN,SAAS,cAAc;AAEvB,uBAAe"}
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import FlexBasic_default from "../../Flex/FlexBasic.mjs";
|
|
2
2
|
import { copyToClipboard } from "../../utils/copyToClipboard.mjs";
|
|
3
|
-
import { alphaBg,
|
|
3
|
+
import { alphaBg, styles } from "./style.mjs";
|
|
4
4
|
import { memo } from "react";
|
|
5
5
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
6
|
import { Space, message } from "antd";
|
|
7
7
|
|
|
8
8
|
//#region src/color/ColorScales/ScaleRow.tsx
|
|
9
9
|
const ScaleRow = memo(({ name, title, scale }) => {
|
|
10
|
-
const { styles } = useStyles();
|
|
11
10
|
let style = {};
|
|
12
11
|
let isAlpha = false;
|
|
13
12
|
switch (title) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScaleRow.mjs","names":["Flexbox"],"sources":["../../../src/color/ColorScales/ScaleRow.tsx"],"sourcesContent":["import { Space, message } from 'antd';\nimport { memo } from 'react';\n\nimport { Flexbox } from '@/Flex';\nimport { copyToClipboard } from '@/utils/copyToClipboard';\n\nimport { alphaBg,
|
|
1
|
+
{"version":3,"file":"ScaleRow.mjs","names":["Flexbox"],"sources":["../../../src/color/ColorScales/ScaleRow.tsx"],"sourcesContent":["import { Space, message } from 'antd';\nimport { memo } from 'react';\n\nimport { Flexbox } from '@/Flex';\nimport { copyToClipboard } from '@/utils/copyToClipboard';\n\nimport { alphaBg, styles } from './style';\n\nexport interface IScaleRow {\n name: string;\n scale: string[];\n title: 'light' | 'lightA' | 'dark' | 'darkA';\n}\n\nconst ScaleRow = memo<IScaleRow>(({ name, title, scale }) => {\n let style = {};\n let isAlpha = false;\n\n switch (title) {\n case 'lightA': {\n style = { background: alphaBg.light, backgroundColor: '#fff' };\n isAlpha = true;\n break;\n }\n case 'darkA': {\n style = { background: alphaBg.dark, backgroundColor: '#000' };\n isAlpha = true;\n break;\n }\n default: {\n break;\n }\n }\n\n return (\n <Space size={2}>\n <div className={styles.scaleRowTitle} key={title}>\n <div className={styles.text}>{title}</div>\n </div>\n {scale.map((color, index) => {\n if (index === 0 || index === 12) return false;\n\n return (\n <div\n className={styles.scaleBox}\n key={index}\n onClick={async () => {\n const content = `token.${name}${index}${isAlpha ? 'A' : ''} /* ${color} */`;\n\n await copyToClipboard(content);\n message.success(content);\n }}\n style={style}\n title={color}\n >\n <Flexbox\n align={'center'}\n className={styles.scaleItem}\n horizontal\n justify={'center'}\n style={{ backgroundColor: color }}\n />\n </div>\n );\n })}\n </Space>\n );\n});\n\nexport default ScaleRow;\n"],"mappings":";;;;;;;;AAcA,MAAM,WAAW,MAAiB,EAAE,MAAM,OAAO,YAAY;CAC3D,IAAI,QAAQ,EAAE;CACd,IAAI,UAAU;AAEd,SAAQ,OAAR;EACE,KAAK;AACH,WAAQ;IAAE,YAAY,QAAQ;IAAO,iBAAiB;IAAQ;AAC9D,aAAU;AACV;EAEF,KAAK;AACH,WAAQ;IAAE,YAAY,QAAQ;IAAM,iBAAiB;IAAQ;AAC7D,aAAU;AACV;EAEF,QACE;;AAIJ,QACE,qBAAC;EAAM,MAAM;aACX,oBAAC;GAAI,WAAW,OAAO;aACrB,oBAAC;IAAI,WAAW,OAAO;cAAO;KAAY;KADD,MAErC,EACL,MAAM,KAAK,OAAO,UAAU;AAC3B,OAAI,UAAU,KAAK,UAAU,GAAI,QAAO;AAExC,UACE,oBAAC;IACC,WAAW,OAAO;IAElB,SAAS,YAAY;KACnB,MAAM,UAAU,SAAS,OAAO,QAAQ,UAAU,MAAM,GAAG,MAAM,MAAM;AAEvE,WAAM,gBAAgB,QAAQ;AAC9B,aAAQ,QAAQ,QAAQ;;IAEnB;IACP,OAAO;cAEP,oBAACA;KACC,OAAO;KACP,WAAW,OAAO;KAClB;KACA,SAAS;KACT,OAAO,EAAE,iBAAiB,OAAO;MACjC;MAhBG,MAiBD;IAER;GACI;EAEV;AAEF,uBAAe"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ColorScaleItem } from "../types.mjs";
|
|
2
|
-
import * as
|
|
2
|
+
import * as react41 from "react";
|
|
3
3
|
|
|
4
4
|
//#region src/color/ColorScales/index.d.ts
|
|
5
5
|
interface ColorScalesProps {
|
|
@@ -16,7 +16,7 @@ interface ColorScalesProps {
|
|
|
16
16
|
*/
|
|
17
17
|
scale: ColorScaleItem;
|
|
18
18
|
}
|
|
19
|
-
declare const ColorScales:
|
|
19
|
+
declare const ColorScales: react41.NamedExoticComponent<ColorScalesProps>;
|
|
20
20
|
//#endregion
|
|
21
21
|
export { ColorScales, ColorScalesProps };
|
|
22
22
|
//# sourceMappingURL=index.d.mts.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import FlexBasic_default from "../../Flex/FlexBasic.mjs";
|
|
4
|
-
import {
|
|
4
|
+
import { styles } from "./style.mjs";
|
|
5
5
|
import ScaleRow_default from "./ScaleRow.mjs";
|
|
6
6
|
import { memo } from "react";
|
|
7
7
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
@@ -9,7 +9,6 @@ import { Space } from "antd";
|
|
|
9
9
|
|
|
10
10
|
//#region src/color/ColorScales/index.tsx
|
|
11
11
|
const ColorScales = memo(({ name, scale, midHighLight }) => {
|
|
12
|
-
const { styles } = useStyles();
|
|
13
12
|
return /* @__PURE__ */ jsx(FlexBasic_default, {
|
|
14
13
|
align: "center",
|
|
15
14
|
flex: 1,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["Flexbox","ScaleRow"],"sources":["../../../src/color/ColorScales/index.tsx"],"sourcesContent":["'use client';\n\nimport { Space } from 'antd';\nimport { memo } from 'react';\n\nimport { Flexbox } from '@/Flex';\n\nimport { ColorScaleItem } from '../types';\nimport ScaleRow from './ScaleRow';\nimport {
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["Flexbox","ScaleRow"],"sources":["../../../src/color/ColorScales/index.tsx"],"sourcesContent":["'use client';\n\nimport { Space } from 'antd';\nimport { memo } from 'react';\n\nimport { Flexbox } from '@/Flex';\n\nimport { ColorScaleItem } from '../types';\nimport ScaleRow from './ScaleRow';\nimport { styles } from './style';\n\nexport interface ColorScalesProps {\n /**\n * @description Index of the mid highlight color in the scale\n */\n midHighLight: number;\n /**\n * @description Name of the color scale\n */\n name: string;\n /**\n * @description Color scale item object\n */\n scale: ColorScaleItem;\n}\n\nconst ColorScales = memo<ColorScalesProps>(({ name, scale, midHighLight }) => {\n return (\n <Flexbox align={'center'} flex={1} horizontal justify={'center'}>\n <div style={{ padding: '8px 16px 32px 0' }}>\n <Space direction={'vertical'} size={2}>\n <Space key=\"scale-title\" size={2}>\n <Flexbox align={'center'} className={styles.scaleRowTitle} horizontal key=\"scale-num\" />\n {Array.from({ length: scale.light.length })\n .fill('')\n .map((_, index) => {\n if (index === 0 || index === 12) return false;\n\n const isMidHighlight = midHighLight === index;\n\n return (\n <div className={styles.scaleBox} key={`num${index}`}>\n <div className={styles.scaleBox}>\n <Flexbox\n align={'center'}\n className={styles.scaleItem}\n horizontal\n justify={'center'}\n style={{\n fontWeight: isMidHighlight ? 700 : 400,\n opacity: 0.5,\n }}\n >\n {index}\n </Flexbox>\n </div>\n </div>\n );\n })}\n </Space>\n <ScaleRow key=\"light\" name={name} scale={scale.light} title=\"light\" />\n <ScaleRow key=\"lightA\" name={name} scale={scale.lightA} title=\"lightA\" />\n <ScaleRow key=\"dark\" name={name} scale={scale.dark} title=\"dark\" />\n <ScaleRow key=\"darkA\" name={name} scale={scale.darkA} title=\"darkA\" />\n </Space>\n </div>\n </Flexbox>\n );\n});\n\nexport default ColorScales;\n"],"mappings":";;;;;;;;;;AA0BA,MAAM,cAAc,MAAwB,EAAE,MAAM,OAAO,mBAAmB;AAC5E,QACE,oBAACA;EAAQ,OAAO;EAAU,MAAM;EAAG;EAAW,SAAS;YACrD,oBAAC;GAAI,OAAO,EAAE,SAAS,mBAAmB;aACxC,qBAAC;IAAM,WAAW;IAAY,MAAM;;KAClC,qBAAC;MAAwB,MAAM;iBAC7B,oBAACA;OAAQ,OAAO;OAAU,WAAW,OAAO;OAAe;SAAe,YAAc,EACvF,MAAM,KAAK,EAAE,QAAQ,MAAM,MAAM,QAAQ,CAAC,CACxC,KAAK,GAAG,CACR,KAAK,GAAG,UAAU;AACjB,WAAI,UAAU,KAAK,UAAU,GAAI,QAAO;OAExC,MAAM,iBAAiB,iBAAiB;AAExC,cACE,oBAAC;QAAI,WAAW,OAAO;kBACrB,oBAAC;SAAI,WAAW,OAAO;mBACrB,oBAACA;UACC,OAAO;UACP,WAAW,OAAO;UAClB;UACA,SAAS;UACT,OAAO;WACL,YAAY,iBAAiB,MAAM;WACnC,SAAS;WACV;oBAEA;WACO;UACN;UAd8B,MAAM,QAetC;QAER;QA3BK,cA4BH;KACR,oBAACC;MAA2B;MAAM,OAAO,MAAM;MAAO,OAAM;QAA9C,QAAwD;KACtE,oBAACA;MAA4B;MAAM,OAAO,MAAM;MAAQ,OAAM;QAAhD,SAA2D;KACzE,oBAACA;MAA0B;MAAM,OAAO,MAAM;MAAM,OAAM;QAA5C,OAAqD;KACnE,oBAACA;MAA2B;MAAM,OAAO,MAAM;MAAO,OAAM;QAA9C,QAAwD;;KAChE;IACJ;GACE;EAEZ;AAEF,0BAAe"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createStaticStyles } from "antd-style";
|
|
2
2
|
|
|
3
3
|
//#region src/color/ColorScales/style.ts
|
|
4
4
|
const alphaBg = {
|
|
5
5
|
dark: "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAIKADAAQAAAABAAAAIAAAAACPTkDJAAAAZUlEQVRIDe2VMQoAMAgDa9/g/1/oIzrpZBCh2dLFkkoDF0Fz99OdiOjks+2/7S8fRRmMMIVoRGSoYzvvqF8ZIMKlC1GhQBc6IkPzq32QmdAzkEGihpWOSPsAss8HegYySNSw0hE9WQ4StafZFqkAAAAASUVORK5CYII=) 0% 0% / 26px",
|
|
6
6
|
light: "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAFpJREFUWAntljEKADAIA23p6v//qQ+wfUEcCu1yriEgp0FHRJSJcnehmmWm1Dv/lO4HIg1AAAKjTqm03ea88zMCCEDgO4HV5bS757f+7wRoAAIQ4B9gByAAgQ3pfiDmXmAeEwAAAABJRU5ErkJggg==) 0% 0% / 26px"
|
|
7
7
|
};
|
|
8
|
-
const
|
|
8
|
+
const styles = createStaticStyles(({ css: css$1, cssVar: cssVar$1 }) => ({
|
|
9
9
|
scaleBox: css$1`
|
|
10
10
|
cursor: pointer;
|
|
11
11
|
|
|
@@ -21,7 +21,7 @@ const useStyles = createStyles(({ css: css$1, token }) => ({
|
|
|
21
21
|
-8px 0;
|
|
22
22
|
background-size: 16px 16px;
|
|
23
23
|
|
|
24
|
-
transition: scale 400ms ${
|
|
24
|
+
transition: scale 400ms ${cssVar$1.motionEaseOut};
|
|
25
25
|
|
|
26
26
|
&:active {
|
|
27
27
|
scale: 0.8;
|
|
@@ -41,5 +41,5 @@ const useStyles = createStyles(({ css: css$1, token }) => ({
|
|
|
41
41
|
}));
|
|
42
42
|
|
|
43
43
|
//#endregion
|
|
44
|
-
export { alphaBg,
|
|
44
|
+
export { alphaBg, styles };
|
|
45
45
|
//# sourceMappingURL=style.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"style.mjs","names":[],"sources":["../../../src/color/ColorScales/style.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"style.mjs","names":["cssVar"],"sources":["../../../src/color/ColorScales/style.ts"],"sourcesContent":["import { createStaticStyles } from 'antd-style';\n\nexport const alphaBg = {\n dark: 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAIKADAAQAAAABAAAAIAAAAACPTkDJAAAAZUlEQVRIDe2VMQoAMAgDa9/g/1/oIzrpZBCh2dLFkkoDF0Fz99OdiOjks+2/7S8fRRmMMIVoRGSoYzvvqF8ZIMKlC1GhQBc6IkPzq32QmdAzkEGihpWOSPsAss8HegYySNSw0hE9WQ4StafZFqkAAAAASUVORK5CYII=) 0% 0% / 26px',\n light:\n 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAFpJREFUWAntljEKADAIA23p6v//qQ+wfUEcCu1yriEgp0FHRJSJcnehmmWm1Dv/lO4HIg1AAAKjTqm03ea88zMCCEDgO4HV5bS757f+7wRoAAIQ4B9gByAAgQ3pfiDmXmAeEwAAAABJRU5ErkJggg==) 0% 0% / 26px',\n};\n\nexport const styles = createStaticStyles(({ css, cssVar }) => ({\n scaleBox: css`\n cursor: pointer;\n\n position: relative;\n\n width: 48px;\n height: 32px;\n\n background-position:\n 0 0,\n 0 8px,\n 8px -8px,\n -8px 0;\n background-size: 16px 16px;\n\n transition: scale 400ms ${cssVar.motionEaseOut};\n\n &:active {\n scale: 0.8;\n }\n `,\n scaleItem: css`\n width: 100%;\n height: 100%;\n `,\n scaleRowTitle: css`\n width: 64px;\n height: 32px;\n `,\n text: css`\n opacity: 0.5;\n `,\n}));\n"],"mappings":";;;AAEA,MAAa,UAAU;CACrB,MAAM;CACN,OACE;CACH;AAED,MAAa,SAAS,oBAAoB,EAAE,YAAK,wBAAc;CAC7D,UAAU,KAAG;;;;;;;;;;;;;;;8BAeeA,SAAO,cAAc;;;;;;CAMjD,WAAW,KAAG;;;;CAId,eAAe,KAAG;;;;CAIlB,MAAM,KAAG;;;CAGV,EAAE"}
|
|
@@ -1,181 +1,38 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import { getCodeLanguageByInput } from "../Highlighter/const.mjs";
|
|
4
|
-
import
|
|
5
|
-
import {
|
|
4
|
+
import lobe_theme_default from "../Highlighter/theme/lobe-theme.mjs";
|
|
5
|
+
import { useEffect, useMemo, useState } from "react";
|
|
6
6
|
import { transformerNotationDiff, transformerNotationErrorLevel, transformerNotationFocus, transformerNotationHighlight, transformerNotationWordHighlight } from "@shikijs/transformers";
|
|
7
|
-
import { ShikiStreamTokenizer } from "shiki-stream";
|
|
8
|
-
import useSWR from "swr";
|
|
9
7
|
import { Md5 } from "ts-md5";
|
|
10
8
|
|
|
11
9
|
//#region src/hooks/useHighlight.ts
|
|
12
10
|
const MD5_LENGTH_THRESHOLD = 1e4;
|
|
11
|
+
const highlightCache = /* @__PURE__ */ new Map();
|
|
12
|
+
const MAX_CACHE_SIZE = 1e3;
|
|
13
|
+
const cleanupCache = () => {
|
|
14
|
+
if (highlightCache.size > MAX_CACHE_SIZE) {
|
|
15
|
+
const entriesToRemove = Math.floor(MAX_CACHE_SIZE * .2);
|
|
16
|
+
const keysToRemove = Array.from(highlightCache.keys()).slice(0, entriesToRemove);
|
|
17
|
+
for (const key of keysToRemove) highlightCache.delete(key);
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
let codeToHtmlPromise = null;
|
|
21
|
+
const loadCodeToHtml = () => {
|
|
22
|
+
if (typeof window === "undefined") return Promise.resolve(null);
|
|
23
|
+
if (!codeToHtmlPromise) codeToHtmlPromise = import("shiki").then((mod) => mod.codeToHtml ?? null);
|
|
24
|
+
return codeToHtmlPromise;
|
|
25
|
+
};
|
|
13
26
|
const loadShikiModule = () => {
|
|
14
27
|
if (typeof window === "undefined") return Promise.resolve(null);
|
|
15
28
|
return import("shiki");
|
|
16
29
|
};
|
|
17
30
|
const shikiModulePromise = loadShikiModule();
|
|
18
|
-
const loadShiki = () => {
|
|
19
|
-
return shikiModulePromise.then((mod) => mod?.codeToHtml ?? null);
|
|
20
|
-
};
|
|
21
|
-
const shikiPromise = loadShiki();
|
|
22
31
|
const escapeHtml = (str) => {
|
|
23
32
|
return str.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll("\"", """).replaceAll("'", "'");
|
|
24
33
|
};
|
|
25
|
-
const
|
|
26
|
-
if (!tokens.length) return [[]];
|
|
27
|
-
const lines = [[]];
|
|
28
|
-
let currentLine = lines[0];
|
|
29
|
-
const startNewLine = () => {
|
|
30
|
-
currentLine = [];
|
|
31
|
-
lines.push(currentLine);
|
|
32
|
-
};
|
|
33
|
-
tokens.forEach((token) => {
|
|
34
|
-
const content = token.content ?? "";
|
|
35
|
-
if (content === "\n") {
|
|
36
|
-
startNewLine();
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
|
-
if (!content.includes("\n")) {
|
|
40
|
-
currentLine.push(token);
|
|
41
|
-
return;
|
|
42
|
-
}
|
|
43
|
-
const segments = content.split("\n");
|
|
44
|
-
segments.forEach((segment, index) => {
|
|
45
|
-
if (segment) currentLine.push({
|
|
46
|
-
...token,
|
|
47
|
-
content: segment
|
|
48
|
-
});
|
|
49
|
-
if (index < segments.length - 1) startNewLine();
|
|
50
|
-
});
|
|
51
|
-
});
|
|
52
|
-
if (lines.length === 0) return [[]];
|
|
53
|
-
return lines;
|
|
54
|
-
};
|
|
55
|
-
const createPreStyle = (bg, fg) => {
|
|
56
|
-
if (!bg && !fg) return void 0;
|
|
57
|
-
return {
|
|
58
|
-
backgroundColor: bg,
|
|
59
|
-
color: fg
|
|
60
|
-
};
|
|
61
|
-
};
|
|
62
|
-
const useStreamingHighlighter = (text, options) => {
|
|
63
|
-
const { colorReplacements, enabled, language, theme } = options;
|
|
64
|
-
const [result, setResult] = useState();
|
|
65
|
-
const tokenizerRef = useRef(null);
|
|
66
|
-
const previousTextRef = useRef("");
|
|
67
|
-
const safeText = text ?? "";
|
|
68
|
-
const latestTextRef = useRef(safeText);
|
|
69
|
-
const preStyleRef = useRef(void 0);
|
|
70
|
-
const colorReplacementsRef = useRef(colorReplacements);
|
|
71
|
-
const linesRef = useRef([[]]);
|
|
72
|
-
useEffect(() => {
|
|
73
|
-
latestTextRef.current = safeText;
|
|
74
|
-
}, [safeText]);
|
|
75
|
-
useEffect(() => {
|
|
76
|
-
colorReplacementsRef.current = colorReplacements;
|
|
77
|
-
}, [colorReplacements]);
|
|
78
|
-
const setStreamingResult = useCallback((rawLines) => {
|
|
79
|
-
const previousLines = linesRef.current;
|
|
80
|
-
const mergedLines = rawLines.map((line, index) => {
|
|
81
|
-
const previousLine = previousLines[index];
|
|
82
|
-
if (previousLine && previousLine.length === line.length && previousLine.every((token, tokenIndex) => token === line[tokenIndex])) return previousLine;
|
|
83
|
-
return line;
|
|
84
|
-
});
|
|
85
|
-
linesRef.current = mergedLines;
|
|
86
|
-
setResult({
|
|
87
|
-
colorReplacements: colorReplacementsRef.current,
|
|
88
|
-
lines: mergedLines,
|
|
89
|
-
preStyle: preStyleRef.current
|
|
90
|
-
});
|
|
91
|
-
}, []);
|
|
92
|
-
const updateTokens = useCallback(async (nextText, forceReset = false) => {
|
|
93
|
-
const tokenizer = tokenizerRef.current;
|
|
94
|
-
if (!tokenizer) return;
|
|
95
|
-
if (forceReset) {
|
|
96
|
-
tokenizer.clear();
|
|
97
|
-
previousTextRef.current = "";
|
|
98
|
-
}
|
|
99
|
-
const previousText = previousTextRef.current;
|
|
100
|
-
let chunk = nextText;
|
|
101
|
-
if (!forceReset && nextText.startsWith(previousText)) chunk = nextText.slice(previousText.length);
|
|
102
|
-
else if (!forceReset) tokenizer.clear();
|
|
103
|
-
previousTextRef.current = nextText;
|
|
104
|
-
if (!chunk) {
|
|
105
|
-
const mergedTokens = [...tokenizer.tokensStable, ...tokenizer.tokensUnstable];
|
|
106
|
-
setStreamingResult(mergedTokens.length ? tokensToLineTokens(mergedTokens) : [[]]);
|
|
107
|
-
return;
|
|
108
|
-
}
|
|
109
|
-
try {
|
|
110
|
-
await tokenizer.enqueue(chunk);
|
|
111
|
-
setStreamingResult(tokensToLineTokens([...tokenizer.tokensStable, ...tokenizer.tokensUnstable]));
|
|
112
|
-
} catch (error) {
|
|
113
|
-
console.error("Streaming highlighting failed:", error);
|
|
114
|
-
}
|
|
115
|
-
}, [setStreamingResult]);
|
|
116
|
-
useEffect(() => {
|
|
117
|
-
if (!enabled) {
|
|
118
|
-
tokenizerRef.current?.clear();
|
|
119
|
-
tokenizerRef.current = null;
|
|
120
|
-
previousTextRef.current = "";
|
|
121
|
-
preStyleRef.current = void 0;
|
|
122
|
-
linesRef.current = [[]];
|
|
123
|
-
setResult(void 0);
|
|
124
|
-
return;
|
|
125
|
-
}
|
|
126
|
-
let cancelled = false;
|
|
127
|
-
(async () => {
|
|
128
|
-
const mod = await shikiModulePromise;
|
|
129
|
-
if (!mod || cancelled) return;
|
|
130
|
-
try {
|
|
131
|
-
const highlighter = await mod.getSingletonHighlighter({
|
|
132
|
-
langs: language ? [language] : [],
|
|
133
|
-
themes: [theme]
|
|
134
|
-
});
|
|
135
|
-
if (!highlighter || cancelled) return;
|
|
136
|
-
tokenizerRef.current = new ShikiStreamTokenizer({
|
|
137
|
-
highlighter,
|
|
138
|
-
lang: language,
|
|
139
|
-
theme
|
|
140
|
-
});
|
|
141
|
-
previousTextRef.current = "";
|
|
142
|
-
linesRef.current = [[]];
|
|
143
|
-
const themeInfo = highlighter.getTheme(theme);
|
|
144
|
-
preStyleRef.current = createPreStyle(themeInfo?.bg, themeInfo?.fg);
|
|
145
|
-
const currentText = latestTextRef.current;
|
|
146
|
-
if (currentText) await updateTokens(currentText, true);
|
|
147
|
-
else setStreamingResult([[]]);
|
|
148
|
-
} catch (error) {
|
|
149
|
-
console.error("Streaming highlighter initialization failed:", error);
|
|
150
|
-
}
|
|
151
|
-
})();
|
|
152
|
-
return () => {
|
|
153
|
-
cancelled = true;
|
|
154
|
-
tokenizerRef.current?.clear();
|
|
155
|
-
tokenizerRef.current = null;
|
|
156
|
-
previousTextRef.current = "";
|
|
157
|
-
};
|
|
158
|
-
}, [
|
|
159
|
-
enabled,
|
|
160
|
-
language,
|
|
161
|
-
setStreamingResult,
|
|
162
|
-
theme,
|
|
163
|
-
updateTokens
|
|
164
|
-
]);
|
|
165
|
-
useEffect(() => {
|
|
166
|
-
if (!enabled) return;
|
|
167
|
-
if (!tokenizerRef.current) return;
|
|
168
|
-
updateTokens(safeText);
|
|
169
|
-
}, [
|
|
170
|
-
enabled,
|
|
171
|
-
safeText,
|
|
172
|
-
updateTokens
|
|
173
|
-
]);
|
|
174
|
-
return result;
|
|
175
|
-
};
|
|
34
|
+
const customThemes = { "lobe-theme": lobe_theme_default };
|
|
176
35
|
const useHighlight = (text, { language, enableTransformer, theme: builtinTheme, streaming }) => {
|
|
177
|
-
const { isDarkMode } = useThemeMode();
|
|
178
|
-
const theme = useTheme();
|
|
179
36
|
const safeText = text ?? "";
|
|
180
37
|
const lang = (language ?? "plaintext").toLowerCase();
|
|
181
38
|
const matchedLanguage = useMemo(() => getCodeLanguageByInput(lang), [lang]);
|
|
@@ -189,87 +46,87 @@ const useHighlight = (text, { language, enableTransformer, theme: builtinTheme,
|
|
|
189
46
|
transformerNotationErrorLevel()
|
|
190
47
|
];
|
|
191
48
|
}, [enableTransformer]);
|
|
192
|
-
const colorReplacements = useMemo(() => ({
|
|
193
|
-
"slack-dark": {
|
|
194
|
-
"#4ec9b0": theme.yellow,
|
|
195
|
-
"#569cd6": theme.colorError,
|
|
196
|
-
"#6a9955": theme.gray,
|
|
197
|
-
"#9cdcfe": theme.colorText,
|
|
198
|
-
"#b5cea8": theme.purple10,
|
|
199
|
-
"#c586c0": theme.colorInfo,
|
|
200
|
-
"#ce9178": theme.colorSuccess,
|
|
201
|
-
"#dcdcaa": theme.colorWarning,
|
|
202
|
-
"#e6e6e6": theme.colorText
|
|
203
|
-
},
|
|
204
|
-
"slack-ochin": {
|
|
205
|
-
"#002339": theme.colorText,
|
|
206
|
-
"#0444ac": theme.geekblue,
|
|
207
|
-
"#0991b6": theme.colorError,
|
|
208
|
-
"#174781": theme.purple10,
|
|
209
|
-
"#2f86d2": theme.colorText,
|
|
210
|
-
"#357b42": theme.gray,
|
|
211
|
-
"#7b30d0": theme.colorInfo,
|
|
212
|
-
"#7eb233": theme.colorWarningTextActive,
|
|
213
|
-
"#a44185": theme.colorSuccess,
|
|
214
|
-
"#dc3eb7": theme.yellow11
|
|
215
|
-
}
|
|
216
|
-
}), [theme]);
|
|
217
49
|
const cacheKey = useMemo(() => {
|
|
218
|
-
|
|
50
|
+
if (streaming) return null;
|
|
219
51
|
return [
|
|
220
52
|
matchedLanguage,
|
|
221
|
-
builtinTheme
|
|
222
|
-
|
|
53
|
+
builtinTheme,
|
|
54
|
+
safeText.length < MD5_LENGTH_THRESHOLD ? safeText : Md5.hashStr(safeText)
|
|
223
55
|
].filter(Boolean).join("-");
|
|
224
56
|
}, [
|
|
225
57
|
safeText,
|
|
226
58
|
matchedLanguage,
|
|
227
|
-
|
|
228
|
-
|
|
59
|
+
builtinTheme,
|
|
60
|
+
streaming
|
|
229
61
|
]);
|
|
230
|
-
const
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
return
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
62
|
+
const [data, setData] = useState();
|
|
63
|
+
useEffect(() => {
|
|
64
|
+
if (!cacheKey) {
|
|
65
|
+
setData(void 0);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
const cachedPromise = highlightCache.get(cacheKey);
|
|
69
|
+
if (cachedPromise) {
|
|
70
|
+
cachedPromise.then((html) => {
|
|
71
|
+
setData(html);
|
|
72
|
+
}).catch(() => {});
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
const highlightPromise = (async () => {
|
|
242
76
|
try {
|
|
243
|
-
const
|
|
77
|
+
const shikiModule = await shikiModulePromise;
|
|
78
|
+
if (!shikiModule) return safeText;
|
|
79
|
+
const effectiveTheme = builtinTheme || "lobe-theme";
|
|
80
|
+
if (!builtinTheme && effectiveTheme === "lobe-theme") {
|
|
81
|
+
const customTheme = customThemes[effectiveTheme];
|
|
82
|
+
if (customTheme) return await (await shikiModule.getSingletonHighlighter({
|
|
83
|
+
langs: [matchedLanguage],
|
|
84
|
+
themes: [customTheme]
|
|
85
|
+
})).codeToHtml(safeText, {
|
|
86
|
+
lang: matchedLanguage,
|
|
87
|
+
theme: effectiveTheme,
|
|
88
|
+
transformers
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
const codeToHtml = await loadCodeToHtml();
|
|
244
92
|
if (!codeToHtml) return safeText;
|
|
245
93
|
return await codeToHtml(safeText, {
|
|
246
94
|
lang: matchedLanguage,
|
|
247
|
-
theme:
|
|
95
|
+
theme: effectiveTheme,
|
|
96
|
+
transformers
|
|
248
97
|
});
|
|
249
|
-
} catch {
|
|
250
|
-
|
|
98
|
+
} catch (error_) {
|
|
99
|
+
console.error("Advanced rendering failed:", error_);
|
|
100
|
+
try {
|
|
101
|
+
const codeToHtml = await loadCodeToHtml();
|
|
102
|
+
if (!codeToHtml) return safeText;
|
|
103
|
+
return await codeToHtml(safeText, {
|
|
104
|
+
lang: matchedLanguage,
|
|
105
|
+
theme: "lobe-theme"
|
|
106
|
+
});
|
|
107
|
+
} catch {
|
|
108
|
+
return `<pre class="fallback"><code>${escapeHtml(safeText)}</code></pre>`;
|
|
109
|
+
}
|
|
251
110
|
}
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
streaming: streamingResult
|
|
270
|
-
};
|
|
111
|
+
})();
|
|
112
|
+
highlightCache.set(cacheKey, highlightPromise);
|
|
113
|
+
cleanupCache();
|
|
114
|
+
highlightPromise.then((html) => {
|
|
115
|
+
if (highlightCache.get(cacheKey) === highlightPromise) setData(html);
|
|
116
|
+
}).catch(() => {
|
|
117
|
+
if (highlightCache.get(cacheKey) === highlightPromise) highlightCache.delete(cacheKey);
|
|
118
|
+
});
|
|
119
|
+
}, [
|
|
120
|
+
cacheKey,
|
|
121
|
+
safeText,
|
|
122
|
+
matchedLanguage,
|
|
123
|
+
builtinTheme,
|
|
124
|
+
transformers,
|
|
125
|
+
customThemes
|
|
126
|
+
]);
|
|
127
|
+
return data || "";
|
|
271
128
|
};
|
|
272
129
|
|
|
273
130
|
//#endregion
|
|
274
|
-
export { useHighlight };
|
|
131
|
+
export { shikiModulePromise, useHighlight };
|
|
275
132
|
//# sourceMappingURL=useHighlight.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useHighlight.mjs","names":["lines: ThemedToken[][]"],"sources":["../../src/hooks/useHighlight.ts"],"sourcesContent":["'use client';\n\nimport {\n transformerNotationDiff,\n transformerNotationErrorLevel,\n transformerNotationFocus,\n transformerNotationHighlight,\n transformerNotationWordHighlight,\n} from '@shikijs/transformers';\nimport { useTheme, useThemeMode } from 'antd-style';\nimport { CSSProperties, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { BuiltinTheme, CodeToHastOptions, ThemedToken } from 'shiki';\nimport { ShikiStreamTokenizer } from 'shiki-stream';\nimport useSWR, { SWRResponse } from 'swr';\nimport { Md5 } from 'ts-md5';\n\nimport { getCodeLanguageByInput } from '@/Highlighter/const';\n\n// Application-level cache to avoid repeated calculations\nconst MD5_LENGTH_THRESHOLD = 10_000; // Use async MD5 for text exceeding this length\n\n// Color replacement mapping type\ntype ColorReplacements = {\n [themeName: string]: {\n [color: string]: string;\n };\n};\n\ntype StreamingHighlightResult = {\n colorReplacements?: Record<string, string>;\n lines: ThemedToken[][];\n preStyle?: CSSProperties;\n};\n\ntype StreamingOptions = {\n colorReplacements?: Record<string, string>;\n enabled?: boolean;\n language: string;\n theme: string;\n};\n\ntype UseHighlightResponse = SWRResponse<string, Error> & {\n colorReplacements?: ColorReplacements;\n streaming?: StreamingHighlightResult;\n};\n\ntype ICodeToHtml = (code: string, options: CodeToHastOptions) => Promise<string>;\ntype ShikiModule = typeof import('shiki');\n\n// Lazy load shiki\nconst loadShikiModule = (): Promise<ShikiModule | null> => {\n if (typeof window === 'undefined') return Promise.resolve(null);\n return import('shiki');\n};\nconst shikiModulePromise = loadShikiModule();\n\nconst loadShiki = (): Promise<ICodeToHtml | null> => {\n return shikiModulePromise.then((mod) => mod?.codeToHtml ?? null);\n};\nconst shikiPromise = loadShiki();\n\n// Helper function: Safe HTML escaping\nconst escapeHtml = (str: string): string => {\n return str\n .replaceAll('&', '&')\n .replaceAll('<', '<')\n .replaceAll('>', '>')\n .replaceAll('\"', '"')\n .replaceAll(\"'\", ''');\n};\n\nconst tokensToLineTokens = (tokens: ThemedToken[]): ThemedToken[][] => {\n if (!tokens.length) return [[]];\n\n const lines: ThemedToken[][] = [[]];\n let currentLine = lines[0];\n\n const startNewLine = () => {\n currentLine = [];\n lines.push(currentLine);\n };\n\n tokens.forEach((token) => {\n const content = token.content ?? '';\n\n if (content === '\\n') {\n startNewLine();\n return;\n }\n\n if (!content.includes('\\n')) {\n currentLine.push(token);\n return;\n }\n\n const segments = content.split('\\n');\n segments.forEach((segment, index) => {\n if (segment) {\n currentLine.push({\n ...token,\n content: segment,\n });\n }\n\n if (index < segments.length - 1) {\n startNewLine();\n }\n });\n });\n\n if (lines.length === 0) return [[]];\n\n return lines;\n};\n\nconst createPreStyle = (bg?: string, fg?: string): CSSProperties | undefined => {\n if (!bg && !fg) return undefined;\n return {\n backgroundColor: bg,\n color: fg,\n };\n};\n\nconst useStreamingHighlighter = (\n text: string,\n options: StreamingOptions,\n): StreamingHighlightResult | undefined => {\n const { colorReplacements, enabled, language, theme } = options;\n const [result, setResult] = useState<StreamingHighlightResult>();\n const tokenizerRef = useRef<ShikiStreamTokenizer | null>(null);\n const previousTextRef = useRef('');\n const safeText = text ?? '';\n const latestTextRef = useRef(safeText);\n const preStyleRef = useRef<CSSProperties | undefined>(undefined);\n const colorReplacementsRef = useRef(colorReplacements);\n const linesRef = useRef<ThemedToken[][]>([[]]);\n\n useEffect(() => {\n latestTextRef.current = safeText;\n }, [safeText]);\n\n useEffect(() => {\n colorReplacementsRef.current = colorReplacements;\n }, [colorReplacements]);\n\n const setStreamingResult = useCallback((rawLines: ThemedToken[][]) => {\n const previousLines = linesRef.current;\n\n const mergedLines = rawLines.map((line, index) => {\n const previousLine = previousLines[index];\n if (\n previousLine &&\n previousLine.length === line.length &&\n previousLine.every((token, tokenIndex) => token === line[tokenIndex])\n ) {\n return previousLine;\n }\n return line;\n });\n\n linesRef.current = mergedLines;\n\n setResult({\n colorReplacements: colorReplacementsRef.current,\n lines: mergedLines,\n preStyle: preStyleRef.current,\n });\n }, []);\n\n const updateTokens = useCallback(\n async (nextText: string, forceReset = false) => {\n const tokenizer = tokenizerRef.current;\n if (!tokenizer) return;\n\n if (forceReset) {\n tokenizer.clear();\n previousTextRef.current = '';\n }\n\n const previousText = previousTextRef.current;\n let chunk = nextText;\n const canAppend = !forceReset && nextText.startsWith(previousText);\n\n if (canAppend) {\n chunk = nextText.slice(previousText.length);\n } else if (!forceReset) {\n tokenizer.clear();\n }\n\n previousTextRef.current = nextText;\n\n if (!chunk) {\n const mergedTokens = [...tokenizer.tokensStable, ...tokenizer.tokensUnstable];\n setStreamingResult(mergedTokens.length ? tokensToLineTokens(mergedTokens) : [[]]);\n return;\n }\n\n try {\n await tokenizer.enqueue(chunk);\n const mergedTokens = [...tokenizer.tokensStable, ...tokenizer.tokensUnstable];\n setStreamingResult(tokensToLineTokens(mergedTokens));\n } catch (error) {\n console.error('Streaming highlighting failed:', error);\n }\n },\n [setStreamingResult],\n );\n\n useEffect(() => {\n if (!enabled) {\n tokenizerRef.current?.clear();\n tokenizerRef.current = null;\n previousTextRef.current = '';\n preStyleRef.current = undefined;\n linesRef.current = [[]];\n setResult(undefined);\n return;\n }\n\n let cancelled = false;\n\n (async () => {\n const mod = await shikiModulePromise;\n if (!mod || cancelled) return;\n\n try {\n const highlighter = await mod.getSingletonHighlighter({\n langs: language ? [language] : [],\n themes: [theme],\n });\n\n if (!highlighter || cancelled) return;\n\n const tokenizer = new ShikiStreamTokenizer({\n highlighter,\n lang: language,\n theme,\n });\n\n tokenizerRef.current = tokenizer;\n previousTextRef.current = '';\n linesRef.current = [[]];\n\n const themeInfo = highlighter.getTheme(theme);\n preStyleRef.current = createPreStyle(themeInfo?.bg, themeInfo?.fg);\n\n const currentText = latestTextRef.current;\n if (currentText) {\n await updateTokens(currentText, true);\n } else {\n setStreamingResult([[]]);\n }\n } catch (error) {\n console.error('Streaming highlighter initialization failed:', error);\n }\n })();\n\n return () => {\n cancelled = true;\n tokenizerRef.current?.clear();\n tokenizerRef.current = null;\n previousTextRef.current = '';\n };\n }, [enabled, language, setStreamingResult, theme, updateTokens]);\n\n useEffect(() => {\n if (!enabled) return;\n if (!tokenizerRef.current) return;\n updateTokens(safeText);\n }, [enabled, safeText, updateTokens]);\n\n return result;\n};\n\n// Main highlight component\nexport const useHighlight = (\n text: string,\n {\n language,\n enableTransformer,\n theme: builtinTheme,\n streaming,\n }: { enableTransformer?: boolean; language: string; streaming?: boolean; theme?: BuiltinTheme },\n): UseHighlightResponse => {\n const { isDarkMode } = useThemeMode();\n const theme = useTheme();\n\n // Safely handle language and text with boundary checks\n const safeText = text ?? '';\n const lang = (language ?? 'plaintext').toLowerCase();\n\n // Match supported languages\n const matchedLanguage = useMemo(() => getCodeLanguageByInput(lang), [lang]);\n\n // Optimize transformer creation\n const transformers = useMemo(() => {\n if (!enableTransformer) return;\n return [\n transformerNotationDiff(),\n transformerNotationHighlight(),\n transformerNotationWordHighlight(),\n transformerNotationFocus(),\n transformerNotationErrorLevel(),\n ];\n }, [enableTransformer]);\n\n // Optimize color replacement configuration\n const colorReplacements = useMemo(\n (): ColorReplacements => ({\n 'slack-dark': {\n '#4ec9b0': theme.yellow,\n '#569cd6': theme.colorError,\n '#6a9955': theme.gray,\n '#9cdcfe': theme.colorText,\n '#b5cea8': theme.purple10,\n '#c586c0': theme.colorInfo,\n '#ce9178': theme.colorSuccess,\n '#dcdcaa': theme.colorWarning,\n '#e6e6e6': theme.colorText,\n },\n 'slack-ochin': {\n '#002339': theme.colorText,\n '#0444ac': theme.geekblue,\n '#0991b6': theme.colorError,\n '#174781': theme.purple10,\n '#2f86d2': theme.colorText,\n '#357b42': theme.gray,\n '#7b30d0': theme.colorInfo,\n '#7eb233': theme.colorWarningTextActive,\n '#a44185': theme.colorSuccess,\n '#dc3eb7': theme.yellow11,\n },\n }),\n [theme],\n );\n\n // Build cache key\n const cacheKey = useMemo((): string | null => {\n // Use hash for long text\n const hash = safeText.length < MD5_LENGTH_THRESHOLD ? safeText : Md5.hashStr(safeText);\n return [matchedLanguage, builtinTheme || (isDarkMode ? 'd' : 'l'), hash]\n .filter(Boolean)\n .join('-');\n }, [safeText, matchedLanguage, isDarkMode, builtinTheme]);\n\n // Use SWR to get highlighted HTML\n const response = useSWR(\n streaming ? null : cacheKey,\n async (): Promise<string> => {\n try {\n // Try full rendering\n const codeToHtml = await shikiPromise;\n if (!codeToHtml) return safeText;\n const html = await codeToHtml(safeText, {\n colorReplacements: builtinTheme ? undefined : colorReplacements,\n lang: matchedLanguage,\n theme: builtinTheme || (isDarkMode ? 'slack-dark' : 'slack-ochin'),\n transformers,\n });\n\n return html;\n } catch (error) {\n console.error('Advanced rendering failed:', error);\n\n try {\n // Try simple rendering (without transformers)\n const codeToHtml = await shikiPromise;\n if (!codeToHtml) return safeText;\n const html = await codeToHtml(safeText, {\n lang: matchedLanguage,\n theme: isDarkMode ? 'dark-plus' : 'light-plus',\n });\n return html;\n } catch {\n // Fallback to plain text\n const fallbackHtml = `<pre class=\"fallback\"><code>${escapeHtml(safeText)}</code></pre>`;\n return fallbackHtml;\n }\n }\n },\n {\n dedupingInterval: 3000, // Only execute once for the same request within 3 seconds\n errorRetryCount: 2, // Retry at most 2 times\n revalidateOnFocus: false,\n revalidateOnReconnect: false,\n },\n );\n\n const effectiveTheme = builtinTheme || (isDarkMode ? 'slack-dark' : 'slack-ochin');\n const streamingResult = useStreamingHighlighter(safeText, {\n colorReplacements: builtinTheme ? undefined : colorReplacements[effectiveTheme],\n enabled: streaming,\n language: matchedLanguage,\n theme: effectiveTheme,\n });\n\n return {\n ...response,\n colorReplacements,\n streaming: streamingResult,\n };\n};\n\nexport { escapeHtml, loadShiki, MD5_LENGTH_THRESHOLD, shikiPromise };\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useHighlight.mjs","names":["codeToHtmlPromise: Promise<ICodeToHtml | null> | null","lobeTheme"],"sources":["../../src/hooks/useHighlight.ts"],"sourcesContent":["'use client';\n\nimport {\n transformerNotationDiff,\n transformerNotationErrorLevel,\n transformerNotationFocus,\n transformerNotationHighlight,\n transformerNotationWordHighlight,\n} from '@shikijs/transformers';\nimport { CSSProperties, useEffect, useMemo, useState } from 'react';\nimport type { BuiltinTheme, CodeToHastOptions, ThemedToken } from 'shiki';\nimport { Md5 } from 'ts-md5';\n\nimport { getCodeLanguageByInput } from '@/Highlighter/const';\nimport lobeTheme from '@/Highlighter/theme/lobe-theme';\n\n// Application-level cache to avoid repeated calculations\nexport const MD5_LENGTH_THRESHOLD = 10_000; // Use async MD5 for text exceeding this length\n\nexport type StreamingHighlightResult = {\n lines: ThemedToken[][];\n preStyle?: CSSProperties;\n};\n\n// Application-level cache for highlighted HTML\n// Key: cacheKey string, Value: Promise<string>\nconst highlightCache = new Map<string, Promise<string>>();\n\n// Maximum cache size to prevent memory leaks\nconst MAX_CACHE_SIZE = 1000;\n\n// Clean up old cache entries when limit is reached\nconst cleanupCache = () => {\n if (highlightCache.size > MAX_CACHE_SIZE) {\n // Remove oldest 20% of entries\n const entriesToRemove = Math.floor(MAX_CACHE_SIZE * 0.2);\n const keysToRemove = Array.from(highlightCache.keys()).slice(0, entriesToRemove);\n for (const key of keysToRemove) {\n highlightCache.delete(key);\n }\n }\n};\n\nexport type ICodeToHtml = (code: string, options: CodeToHastOptions) => Promise<string>;\nexport type ShikiModule = typeof import('shiki');\n\n// Use codeToHtml shorthand for better performance\n// It automatically manages highlighter instances and loads themes/languages on-demand\nlet codeToHtmlPromise: Promise<ICodeToHtml | null> | null = null;\n\nconst loadCodeToHtml = (): Promise<ICodeToHtml | null> => {\n if (typeof window === 'undefined') return Promise.resolve(null);\n\n if (!codeToHtmlPromise) {\n codeToHtmlPromise = import('shiki').then((mod) => mod.codeToHtml ?? null);\n }\n\n return codeToHtmlPromise;\n};\n\n// Export shikiModulePromise for useStreamHighlight compatibility\nconst loadShikiModule = (): Promise<ShikiModule | null> => {\n if (typeof window === 'undefined') return Promise.resolve(null);\n return import('shiki');\n};\nexport const shikiModulePromise = loadShikiModule();\n\n// Helper function: Safe HTML escaping\nexport const escapeHtml = (str: string): string => {\n return str\n .replaceAll('&', '&')\n .replaceAll('<', '<')\n .replaceAll('>', '>')\n .replaceAll('\"', '"')\n .replaceAll(\"'\", ''');\n};\n\n// Main highlight component - optimized version without SWR\nconst customThemes = {\n 'lobe-theme': lobeTheme,\n};\n\nexport const useHighlight = (\n text: string,\n {\n language,\n enableTransformer,\n theme: builtinTheme,\n streaming,\n }: { enableTransformer?: boolean; language: string; streaming?: boolean; theme?: BuiltinTheme },\n): string => {\n // Safely handle language and text with boundary checks\n const safeText = text ?? '';\n const lang = (language ?? 'plaintext').toLowerCase();\n\n // Match supported languages\n const matchedLanguage = useMemo(() => getCodeLanguageByInput(lang), [lang]);\n\n // Optimize transformer creation\n const transformers = useMemo(() => {\n if (!enableTransformer) return;\n return [\n transformerNotationDiff(),\n transformerNotationHighlight(),\n transformerNotationWordHighlight(),\n transformerNotationFocus(),\n transformerNotationErrorLevel(),\n ];\n }, [enableTransformer]);\n\n // Build cache key\n const cacheKey = useMemo((): string | null => {\n if (streaming) return null;\n // Use hash for long text\n const hash = safeText.length < MD5_LENGTH_THRESHOLD ? safeText : Md5.hashStr(safeText);\n return [matchedLanguage, builtinTheme, hash].filter(Boolean).join('-');\n }, [safeText, matchedLanguage, builtinTheme, streaming]);\n\n const [data, setData] = useState<string | undefined>();\n\n useEffect(() => {\n if (!cacheKey) {\n setData(undefined);\n return;\n }\n\n // Check cache first\n const cachedPromise = highlightCache.get(cacheKey);\n if (cachedPromise) {\n cachedPromise\n .then((html) => {\n setData(html);\n })\n .catch(() => {\n // Silently handle errors, fallback will be handled in the promise\n });\n return;\n }\n\n // Create new promise for highlighting\n // Using codeToHtml shorthand: automatically loads themes/languages on-demand\n const highlightPromise = (async (): Promise<string> => {\n try {\n // Try full rendering with transformers\n const shikiModule = await shikiModulePromise;\n if (!shikiModule) return safeText;\n\n const effectiveTheme = builtinTheme || 'lobe-theme';\n\n // Load custom theme if using slack-dark or slack-ochin\n if (!builtinTheme && effectiveTheme === 'lobe-theme') {\n const customTheme = customThemes[effectiveTheme];\n if (customTheme) {\n // Use getSingletonHighlighter to load custom theme\n const highlighter = await shikiModule.getSingletonHighlighter({\n langs: [matchedLanguage],\n themes: [customTheme as any],\n });\n\n const html = await highlighter.codeToHtml(safeText, {\n lang: matchedLanguage,\n theme: effectiveTheme,\n transformers,\n });\n\n return html;\n }\n }\n\n // Fallback to codeToHtml for builtin themes\n const codeToHtml = await loadCodeToHtml();\n if (!codeToHtml) return safeText;\n\n const html = await codeToHtml(safeText, {\n lang: matchedLanguage,\n theme: effectiveTheme,\n transformers,\n });\n\n return html;\n } catch (error_) {\n console.error('Advanced rendering failed:', error_);\n\n try {\n // Try simple rendering (without transformers)\n const codeToHtml = await loadCodeToHtml();\n if (!codeToHtml) return safeText;\n const html = await codeToHtml(safeText, {\n lang: matchedLanguage,\n theme: 'lobe-theme',\n });\n return html;\n } catch {\n // Fallback to plain text\n const fallbackHtml = `<pre class=\"fallback\"><code>${escapeHtml(safeText)}</code></pre>`;\n return fallbackHtml;\n }\n }\n })();\n\n // Cache the promise\n highlightCache.set(cacheKey, highlightPromise);\n cleanupCache();\n\n // Handle promise result\n highlightPromise\n .then((html) => {\n // Only update if this is still the current cache key\n if (highlightCache.get(cacheKey) === highlightPromise) {\n setData(html);\n }\n })\n .catch(() => {\n // Remove failed promise from cache\n if (highlightCache.get(cacheKey) === highlightPromise) {\n highlightCache.delete(cacheKey);\n }\n });\n }, [cacheKey, safeText, matchedLanguage, builtinTheme, transformers, customThemes]);\n\n return data || '';\n};\n"],"mappings":"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"}
|